Skip to content

Commit 5afff13

Browse files
github-actions[bot]kotlarmilosam11jkotas
authored
[release/9.0-staging] Fix IsOSVersionAtLeast when build or revision are not provided (#109332)
* Default build and revision numbers to 0 if they are -1 on MacCatalyst * Update src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs Co-authored-by: Adeel Mujahid <[email protected]> * Add three-parameter and two-parameter overloads for IsOSPlatformVersionAtLeast * Update IsOSVersionAtLeast to handle not provided values * Check only build and revision * Update src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs Co-authored-by: Jan Kotas <[email protected]> * Update src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs Co-authored-by: Jan Kotas <[email protected]> * New line * Update tests to pass when build or revision are -1 * Add isCurrentOS to the Assert.Equal * Unspecified build/revision components are to be treated as zeros * Unspecified build component is to be treated as zero * Unspecified build or revision component is to be treated as zero * Update src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs Co-authored-by: Adeel Mujahid <[email protected]> * Update src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs Co-authored-by: Adeel Mujahid <[email protected]> * Normalize build component to 0 if undefined * Add comments * Revert normalizing build component to 0 --------- Co-authored-by: Milos Kotlar <[email protected]> Co-authored-by: Adeel Mujahid <[email protected]> Co-authored-by: Jan Kotas <[email protected]>
1 parent 56501c9 commit 5afff13

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -335,13 +335,19 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi
335335
{
336336
return current.Minor > minor;
337337
}
338-
if (current.Build != build)
338+
// Unspecified build component is to be treated as zero
339+
int currentBuild = current.Build < 0 ? 0 : current.Build;
340+
build = build < 0 ? 0 : build;
341+
if (currentBuild != build)
339342
{
340-
return current.Build > build;
343+
return currentBuild > build;
341344
}
342345

343-
return current.Revision >= revision
344-
|| (current.Revision == -1 && revision == 0); // it is unavailable on OSX and Environment.OSVersion.Version.Revision returns -1
346+
// Unspecified revision component is to be treated as zero
347+
int currentRevision = current.Revision < 0 ? 0 : current.Revision;
348+
revision = revision < 0 ? 0 : revision;
349+
350+
return currentRevision >= revision;
345351
}
346352
}
347353
}

src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,18 @@ private static void TestIsOSVersionAtLeast(string currentOSName)
236236
isCurrentOS = true;
237237
}
238238

239+
// Four-parameter overload
239240
AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName, major, minor, build, revision));
240241
AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName.ToLower(), major, minor, build, revision));
241242
AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName.ToUpper(), major, minor, build, revision));
243+
244+
// Three-parameter overload
245+
AssertVersionChecks(isCurrentOS, (major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName, major, minor, build));
246+
247+
// Two-parameter overload
248+
AssertVersionChecks(isCurrentOS, (major, minor) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName, major, minor));
242249
}
243-
250+
244251
AssertVersionChecks(currentOSName.Equals("Android", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsAndroidVersionAtLeast);
245252
AssertVersionChecks(currentOSName == "MacCatalyst" || currentOSName.Equals("iOS", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsIOSVersionAtLeast);
246253
AssertVersionChecks(currentOSName.Equals("macOS", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsMacOSVersionAtLeast);
@@ -256,8 +263,8 @@ private static void AssertVersionChecks(bool isCurrentOS, Func<int, int, int, in
256263

257264
Assert.False(isOSVersionAtLeast(current.Major + 1, current.Minor, current.Build, current.Revision));
258265
Assert.False(isOSVersionAtLeast(current.Major, current.Minor + 1, current.Build, current.Revision));
259-
Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build + 1, current.Revision));
260-
Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build, Math.Max(current.Revision + 1, 1))); // OSX Revision reports -1
266+
Assert.False(isOSVersionAtLeast(current.Major, current.Minor, Math.Max(current.Build + 1, 1), current.Revision));
267+
Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build, Math.Max(current.Revision + 1, 1)));
261268

262269
Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor, current.Build, current.Revision));
263270

@@ -273,13 +280,26 @@ private static void AssertVersionChecks(bool isCurrentOS, Func<int, int, int, bo
273280

274281
Assert.False(isOSVersionAtLeast(current.Major + 1, current.Minor, current.Build));
275282
Assert.False(isOSVersionAtLeast(current.Major, current.Minor + 1, current.Build));
276-
Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build + 1));
283+
Assert.False(isOSVersionAtLeast(current.Major, current.Minor, Math.Max(current.Build + 1, 1)));
277284

278285
Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor, current.Build));
279286

280287
Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major - 1, current.Minor, current.Build));
281288
Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor - 1, current.Build));
282289
Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor, current.Build - 1));
283290
}
291+
292+
private static void AssertVersionChecks(bool isCurrentOS, Func<int, int, bool> isOSVersionAtLeast)
293+
{
294+
Version current = Environment.OSVersion.Version;
295+
296+
Assert.False(isOSVersionAtLeast(current.Major + 1, current.Minor));
297+
Assert.False(isOSVersionAtLeast(current.Major, current.Minor + 1));
298+
299+
Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor));
300+
301+
Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major - 1, current.Minor));
302+
Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor - 1));
303+
}
284304
}
285305
}

0 commit comments

Comments
 (0)