| File: xunit\EnvironmentVariableSkipConditionAttribute.cs | Web Access |
| Project: src\aspnetcore\src\Testing\src\Microsoft.AspNetCore.InternalTesting.csproj (Microsoft.AspNetCore.InternalTesting) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Linq; using Microsoft.AspNetCore.Shared; namespace Microsoft.AspNetCore.InternalTesting; /// <summary> /// Skips a test when the value of an environment variable matches any of the supplied values. /// </summary> [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true)] public class EnvironmentVariableSkipConditionAttribute : Attribute, ITestCondition { private readonly string _variableName; private readonly string[] _values; private string _currentValue; private readonly IEnvironmentVariable _environmentVariable; /// <summary> /// Creates a new instance of <see cref="EnvironmentVariableSkipConditionAttribute"/>. /// </summary> /// <param name="variableName">Name of the environment variable.</param> /// <param name="values">Value(s) of the environment variable to match for the test to be skipped</param> public EnvironmentVariableSkipConditionAttribute(string variableName, params string[] values) : this(new EnvironmentVariable(), variableName, values) { } // To enable unit testing internal EnvironmentVariableSkipConditionAttribute( IEnvironmentVariable environmentVariable, string variableName, params string[] values) { ArgumentNullThrowHelper.ThrowIfNull(environmentVariable); ArgumentNullThrowHelper.ThrowIfNull(variableName); ArgumentNullThrowHelper.ThrowIfNull(values); _variableName = variableName; _values = values; _environmentVariable = environmentVariable; } /// <summary> /// Runs the test only if the value of the variable matches any of the supplied values. Default is <c>True</c>. /// </summary> public bool RunOnMatch { get; set; } = true; public bool IsMet { get { _currentValue = _environmentVariable.Get(_variableName); var hasMatched = _values.Any(value => string.Equals(value, _currentValue, StringComparison.OrdinalIgnoreCase)); if (RunOnMatch) { return hasMatched; } else { return !hasMatched; } } } public string SkipReason { get { var value = _currentValue ?? "(null)"; return $"Test skipped on environment variable with name '{_variableName}' and value '{value}' " + $"for the '{nameof(RunOnMatch)}' value of '{RunOnMatch}'."; } } private struct EnvironmentVariable : IEnvironmentVariable { public string Get(string name) { return Environment.GetEnvironmentVariable(name); } } }