Skip to content

Commit

Permalink
Unify OS version xunit attributes (dotnet/extensions#2481)
Browse files Browse the repository at this point in the history
\n\nCommit migrated from dotnet/extensions@65e70f5
  • Loading branch information
Tratcher committed Oct 10, 2019
1 parent f823334 commit aae216a
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 145 deletions.
68 changes: 18 additions & 50 deletions src/Testing/src/xunit/MinimumOsVersionAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;

namespace Microsoft.AspNetCore.Testing
{
Expand All @@ -14,49 +13,36 @@ namespace Microsoft.AspNetCore.Testing
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true)]
public class MinimumOSVersionAttribute : Attribute, ITestCondition
{
private readonly OperatingSystems _excludedOperatingSystem;
private readonly OperatingSystems _targetOS;
private readonly Version _minVersion;
private readonly OperatingSystems _osPlatform;
private readonly Version _osVersion;
private readonly OperatingSystems _currentOS;
private readonly Version _currentVersion;
private readonly bool _skip;

public MinimumOSVersionAttribute(OperatingSystems operatingSystem, string minVersion) :
this(
operatingSystem,
GetCurrentOS(),
GetCurrentOSVersion(),
Version.Parse(minVersion))
this(operatingSystem, Version.Parse(minVersion), GetCurrentOS(), GetCurrentOSVersion())
{
}

// to enable unit testing
internal MinimumOSVersionAttribute(
OperatingSystems operatingSystem, OperatingSystems osPlatform, Version osVersion, Version minVersion)
internal MinimumOSVersionAttribute(OperatingSystems targetOS, Version minVersion, OperatingSystems currentOS, Version currentVersion)
{
if (operatingSystem != OperatingSystems.Windows)
if (targetOS != OperatingSystems.Windows)
{
throw new NotImplementedException("Min version support is only implemented for Windows.");
}
_excludedOperatingSystem = operatingSystem;
_targetOS = targetOS;
_minVersion = minVersion;
_osPlatform = osPlatform;
_osVersion = osVersion;
_currentOS = currentOS;
_currentVersion = currentVersion;

SkipReason = $"This test requires {_excludedOperatingSystem} {_minVersion} or later.";
// Do not skip other OS's, Use OSSkipConditionAttribute or a separate MinimumOSVersionAttribute for that.
_skip = _targetOS == _currentOS && _minVersion > _currentVersion;
SkipReason = $"This test requires {_targetOS} {_minVersion} or later.";
}

public bool IsMet
{
get
{
// Do not skip other OS's, Use OSSkipConditionAttribute or a separate MinimumOSVersionAttribute for that.
if (_osPlatform != _excludedOperatingSystem)
{
return true;
}

return _osVersion >= _minVersion;
}
}
// Since a test would be executed only if 'IsMet' is true, return false if we want to skip
public bool IsMet => !_skip;

public string SkipReason { get; set; }

Expand All @@ -77,34 +63,16 @@ private static OperatingSystems GetCurrentOS()
throw new PlatformNotSupportedException();
}

private static Version GetCurrentOSVersion()
static private Version GetCurrentOSVersion()
{
// currently not used on other OS's
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
// Win10+
var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
var major = key.GetValue("CurrentMajorVersionNumber") as int?;
var minor = key.GetValue("CurrentMinorVersionNumber") as int?;

if (major.HasValue && minor.HasValue)
{
return new Version(major.Value, minor.Value);
}

// CurrentVersion doesn't work past Win8.1
var current = key.GetValue("CurrentVersion") as string;
if (!string.IsNullOrEmpty(current) && Version.TryParse(current, out var currentVersion))
{
return currentVersion;
}

// Environment.OSVersion doesn't work past Win8.
return Environment.OSVersion.Version;
}
else
{
return new Version();
// Not implemented, but this will still be called before the OS check happens so don't throw.
return new Version(0, 0);
}
}
}
Expand Down
81 changes: 0 additions & 81 deletions src/Testing/src/xunit/OSMinVersionAttribute.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,30 @@

namespace Microsoft.AspNetCore.Testing
{
public class OSMinVersionAttributeTest
public class MinimumOSVersionAttributeTest
{
[Fact]
public void Linux_ThrowsNotImplemeneted()
{
Assert.Throws<NotImplementedException>(() => new OSMinVersionAttribute(OperatingSystems.Linux, "2.5"));
Assert.Throws<NotImplementedException>(() => new MinimumOSVersionAttribute(OperatingSystems.Linux, "2.5"));
}

[Fact]
public void Mac_ThrowsNotImplemeneted()
{
Assert.Throws<NotImplementedException>(() => new OSMinVersionAttribute(OperatingSystems.MacOSX, "2.5"));
Assert.Throws<NotImplementedException>(() => new MinimumOSVersionAttribute(OperatingSystems.MacOSX, "2.5"));
}

[Fact]
public void WindowsOrLinux_ThrowsNotImplemeneted()
{
Assert.Throws<NotImplementedException>(() => new OSMinVersionAttribute(OperatingSystems.Linux | OperatingSystems.Windows, "2.5"));
Assert.Throws<NotImplementedException>(() => new MinimumOSVersionAttribute(OperatingSystems.Linux | OperatingSystems.Windows, "2.5"));
}

[Fact]
public void DoesNotSkip_LaterVersions()
{
var osSkipAttribute = new OSMinVersionAttribute(
var osSkipAttribute = new MinimumOSVersionAttribute(
OperatingSystems.Windows,
new Version("2.0"),
OperatingSystems.Windows,
Expand All @@ -41,7 +41,7 @@ public void DoesNotSkip_LaterVersions()
[Fact]
public void DoesNotSkip_SameVersion()
{
var osSkipAttribute = new OSMinVersionAttribute(
var osSkipAttribute = new MinimumOSVersionAttribute(
OperatingSystems.Windows,
new Version("2.5"),
OperatingSystems.Windows,
Expand All @@ -53,7 +53,7 @@ public void DoesNotSkip_SameVersion()
[Fact]
public void Skip_EarlierVersion()
{
var osSkipAttribute = new OSMinVersionAttribute(
var osSkipAttribute = new MinimumOSVersionAttribute(
OperatingSystems.Windows,
new Version("3.0"),
OperatingSystems.Windows,
Expand All @@ -65,7 +65,7 @@ public void Skip_EarlierVersion()
[Fact]
public void DoesNotSkip_WhenOnlyVersionsMatch()
{
var osSkipAttribute = new OSMinVersionAttribute(
var osSkipAttribute = new MinimumOSVersionAttribute(
OperatingSystems.Windows,
new Version("2.5"),
OperatingSystems.Linux,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@

namespace Microsoft.AspNetCore.Testing
{
public class OSMinVersionTest
public class MinimumOSVersionTest
{
[ConditionalFact]
[OSMinVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
[MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
public void RunTest_Win8DoesNotRunOnWin7()
{
Assert.False(
Expand All @@ -21,7 +21,7 @@ public void RunTest_Win8DoesNotRunOnWin7()
}

[ConditionalTheory]
[OSMinVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
[MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
[InlineData(1)]
public void RunTheory_Win8DoesNotRunOnWin7(int arg)
{
Expand All @@ -32,7 +32,7 @@ public void RunTheory_Win8DoesNotRunOnWin7(int arg)
}

[ConditionalFact]
[OSMinVersion(OperatingSystems.Windows, WindowsVersions.Win10_RS4)]
[MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win10_RS4)]
[OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
public void RunTest_Win10_RS4()
{
Expand All @@ -45,7 +45,7 @@ public void RunTest_Win10_RS4()
}

[ConditionalFact]
[OSMinVersion(OperatingSystems.Windows, WindowsVersions.Win10_19H2)]
[MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win10_19H2)]
[OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
public void RunTest_Win10_19H2()
{
Expand All @@ -58,7 +58,7 @@ public void RunTest_Win10_19H2()
}
}

[OSMinVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
[MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
public class OSMinVersionClassTest
{
[ConditionalFact]
Expand Down

0 comments on commit aae216a

Please sign in to comment.