Skip to content

Commit aae216a

Browse files
authored
Unify OS version xunit attributes (dotnet/extensions#2481)
\n\nCommit migrated from dotnet/extensions@65e70f5
1 parent f823334 commit aae216a

File tree

4 files changed

+32
-145
lines changed

4 files changed

+32
-145
lines changed

src/Testing/src/xunit/MinimumOsVersionAttribute.cs

Lines changed: 18 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
using System;
55
using System.Runtime.InteropServices;
6-
using Microsoft.Win32;
76

87
namespace Microsoft.AspNetCore.Testing
98
{
@@ -14,49 +13,36 @@ namespace Microsoft.AspNetCore.Testing
1413
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true)]
1514
public class MinimumOSVersionAttribute : Attribute, ITestCondition
1615
{
17-
private readonly OperatingSystems _excludedOperatingSystem;
16+
private readonly OperatingSystems _targetOS;
1817
private readonly Version _minVersion;
19-
private readonly OperatingSystems _osPlatform;
20-
private readonly Version _osVersion;
18+
private readonly OperatingSystems _currentOS;
19+
private readonly Version _currentVersion;
20+
private readonly bool _skip;
2121

2222
public MinimumOSVersionAttribute(OperatingSystems operatingSystem, string minVersion) :
23-
this(
24-
operatingSystem,
25-
GetCurrentOS(),
26-
GetCurrentOSVersion(),
27-
Version.Parse(minVersion))
23+
this(operatingSystem, Version.Parse(minVersion), GetCurrentOS(), GetCurrentOSVersion())
2824
{
2925
}
3026

3127
// to enable unit testing
32-
internal MinimumOSVersionAttribute(
33-
OperatingSystems operatingSystem, OperatingSystems osPlatform, Version osVersion, Version minVersion)
28+
internal MinimumOSVersionAttribute(OperatingSystems targetOS, Version minVersion, OperatingSystems currentOS, Version currentVersion)
3429
{
35-
if (operatingSystem != OperatingSystems.Windows)
30+
if (targetOS != OperatingSystems.Windows)
3631
{
3732
throw new NotImplementedException("Min version support is only implemented for Windows.");
3833
}
39-
_excludedOperatingSystem = operatingSystem;
34+
_targetOS = targetOS;
4035
_minVersion = minVersion;
41-
_osPlatform = osPlatform;
42-
_osVersion = osVersion;
36+
_currentOS = currentOS;
37+
_currentVersion = currentVersion;
4338

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

47-
public bool IsMet
48-
{
49-
get
50-
{
51-
// Do not skip other OS's, Use OSSkipConditionAttribute or a separate MinimumOSVersionAttribute for that.
52-
if (_osPlatform != _excludedOperatingSystem)
53-
{
54-
return true;
55-
}
56-
57-
return _osVersion >= _minVersion;
58-
}
59-
}
44+
// Since a test would be executed only if 'IsMet' is true, return false if we want to skip
45+
public bool IsMet => !_skip;
6046

6147
public string SkipReason { get; set; }
6248

@@ -77,34 +63,16 @@ private static OperatingSystems GetCurrentOS()
7763
throw new PlatformNotSupportedException();
7864
}
7965

80-
private static Version GetCurrentOSVersion()
66+
static private Version GetCurrentOSVersion()
8167
{
82-
// currently not used on other OS's
8368
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
8469
{
85-
// Win10+
86-
var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
87-
var major = key.GetValue("CurrentMajorVersionNumber") as int?;
88-
var minor = key.GetValue("CurrentMinorVersionNumber") as int?;
89-
90-
if (major.HasValue && minor.HasValue)
91-
{
92-
return new Version(major.Value, minor.Value);
93-
}
94-
95-
// CurrentVersion doesn't work past Win8.1
96-
var current = key.GetValue("CurrentVersion") as string;
97-
if (!string.IsNullOrEmpty(current) && Version.TryParse(current, out var currentVersion))
98-
{
99-
return currentVersion;
100-
}
101-
102-
// Environment.OSVersion doesn't work past Win8.
10370
return Environment.OSVersion.Version;
10471
}
10572
else
10673
{
107-
return new Version();
74+
// Not implemented, but this will still be called before the OS check happens so don't throw.
75+
return new Version(0, 0);
10876
}
10977
}
11078
}

src/Testing/src/xunit/OSMinVersionAttribute.cs

Lines changed: 0 additions & 81 deletions
This file was deleted.

src/Testing/test/OSMinVersionAttributeTest.cs renamed to src/Testing/test/MinimumOSVersionAttributeTest.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,30 @@
66

77
namespace Microsoft.AspNetCore.Testing
88
{
9-
public class OSMinVersionAttributeTest
9+
public class MinimumOSVersionAttributeTest
1010
{
1111
[Fact]
1212
public void Linux_ThrowsNotImplemeneted()
1313
{
14-
Assert.Throws<NotImplementedException>(() => new OSMinVersionAttribute(OperatingSystems.Linux, "2.5"));
14+
Assert.Throws<NotImplementedException>(() => new MinimumOSVersionAttribute(OperatingSystems.Linux, "2.5"));
1515
}
1616

1717
[Fact]
1818
public void Mac_ThrowsNotImplemeneted()
1919
{
20-
Assert.Throws<NotImplementedException>(() => new OSMinVersionAttribute(OperatingSystems.MacOSX, "2.5"));
20+
Assert.Throws<NotImplementedException>(() => new MinimumOSVersionAttribute(OperatingSystems.MacOSX, "2.5"));
2121
}
2222

2323
[Fact]
2424
public void WindowsOrLinux_ThrowsNotImplemeneted()
2525
{
26-
Assert.Throws<NotImplementedException>(() => new OSMinVersionAttribute(OperatingSystems.Linux | OperatingSystems.Windows, "2.5"));
26+
Assert.Throws<NotImplementedException>(() => new MinimumOSVersionAttribute(OperatingSystems.Linux | OperatingSystems.Windows, "2.5"));
2727
}
2828

2929
[Fact]
3030
public void DoesNotSkip_LaterVersions()
3131
{
32-
var osSkipAttribute = new OSMinVersionAttribute(
32+
var osSkipAttribute = new MinimumOSVersionAttribute(
3333
OperatingSystems.Windows,
3434
new Version("2.0"),
3535
OperatingSystems.Windows,
@@ -41,7 +41,7 @@ public void DoesNotSkip_LaterVersions()
4141
[Fact]
4242
public void DoesNotSkip_SameVersion()
4343
{
44-
var osSkipAttribute = new OSMinVersionAttribute(
44+
var osSkipAttribute = new MinimumOSVersionAttribute(
4545
OperatingSystems.Windows,
4646
new Version("2.5"),
4747
OperatingSystems.Windows,
@@ -53,7 +53,7 @@ public void DoesNotSkip_SameVersion()
5353
[Fact]
5454
public void Skip_EarlierVersion()
5555
{
56-
var osSkipAttribute = new OSMinVersionAttribute(
56+
var osSkipAttribute = new MinimumOSVersionAttribute(
5757
OperatingSystems.Windows,
5858
new Version("3.0"),
5959
OperatingSystems.Windows,
@@ -65,7 +65,7 @@ public void Skip_EarlierVersion()
6565
[Fact]
6666
public void DoesNotSkip_WhenOnlyVersionsMatch()
6767
{
68-
var osSkipAttribute = new OSMinVersionAttribute(
68+
var osSkipAttribute = new MinimumOSVersionAttribute(
6969
OperatingSystems.Windows,
7070
new Version("2.5"),
7171
OperatingSystems.Linux,

src/Testing/test/OSMinVersionTest.cs renamed to src/Testing/test/MinimumOSVersionTest.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88

99
namespace Microsoft.AspNetCore.Testing
1010
{
11-
public class OSMinVersionTest
11+
public class MinimumOSVersionTest
1212
{
1313
[ConditionalFact]
14-
[OSMinVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
14+
[MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
1515
public void RunTest_Win8DoesNotRunOnWin7()
1616
{
1717
Assert.False(
@@ -21,7 +21,7 @@ public void RunTest_Win8DoesNotRunOnWin7()
2121
}
2222

2323
[ConditionalTheory]
24-
[OSMinVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
24+
[MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
2525
[InlineData(1)]
2626
public void RunTheory_Win8DoesNotRunOnWin7(int arg)
2727
{
@@ -32,7 +32,7 @@ public void RunTheory_Win8DoesNotRunOnWin7(int arg)
3232
}
3333

3434
[ConditionalFact]
35-
[OSMinVersion(OperatingSystems.Windows, WindowsVersions.Win10_RS4)]
35+
[MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win10_RS4)]
3636
[OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
3737
public void RunTest_Win10_RS4()
3838
{
@@ -45,7 +45,7 @@ public void RunTest_Win10_RS4()
4545
}
4646

4747
[ConditionalFact]
48-
[OSMinVersion(OperatingSystems.Windows, WindowsVersions.Win10_19H2)]
48+
[MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win10_19H2)]
4949
[OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
5050
public void RunTest_Win10_19H2()
5151
{
@@ -58,7 +58,7 @@ public void RunTest_Win10_19H2()
5858
}
5959
}
6060

61-
[OSMinVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
61+
[MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
6262
public class OSMinVersionClassTest
6363
{
6464
[ConditionalFact]

0 commit comments

Comments
 (0)