Skip to content

Commit

Permalink
[release/9.0-staging] Fix IsOSVersionAtLeast when build or revision…
Browse files Browse the repository at this point in the history
… 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 <3840695+am11@users.noreply.github.com>

* 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 <jkotas@microsoft.com>

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

Co-authored-by: Jan Kotas <jkotas@microsoft.com>

* 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 <3840695+am11@users.noreply.github.com>

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

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>

* Normalize build component to 0 if undefined

* Add comments

* Revert normalizing build component to 0

---------

Co-authored-by: Milos Kotlar <kotlarmilos@gmail.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
  • Loading branch information
4 people authored Jan 10, 2025
1 parent 56501c9 commit 5afff13
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 8 deletions.
14 changes: 10 additions & 4 deletions src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -335,13 +335,19 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi
{
return current.Minor > minor;
}
if (current.Build != build)
// Unspecified build component is to be treated as zero
int currentBuild = current.Build < 0 ? 0 : current.Build;
build = build < 0 ? 0 : build;
if (currentBuild != build)
{
return current.Build > build;
return currentBuild > build;
}

return current.Revision >= revision
|| (current.Revision == -1 && revision == 0); // it is unavailable on OSX and Environment.OSVersion.Version.Revision returns -1
// Unspecified revision component is to be treated as zero
int currentRevision = current.Revision < 0 ? 0 : current.Revision;
revision = revision < 0 ? 0 : revision;

return currentRevision >= revision;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -236,11 +236,18 @@ private static void TestIsOSVersionAtLeast(string currentOSName)
isCurrentOS = true;
}

// Four-parameter overload
AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName, major, minor, build, revision));
AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName.ToLower(), major, minor, build, revision));
AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName.ToUpper(), major, minor, build, revision));

// Three-parameter overload
AssertVersionChecks(isCurrentOS, (major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName, major, minor, build));

// Two-parameter overload
AssertVersionChecks(isCurrentOS, (major, minor) => OperatingSystem.IsOSPlatformVersionAtLeast(platformName, major, minor));
}

AssertVersionChecks(currentOSName.Equals("Android", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsAndroidVersionAtLeast);
AssertVersionChecks(currentOSName == "MacCatalyst" || currentOSName.Equals("iOS", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsIOSVersionAtLeast);
AssertVersionChecks(currentOSName.Equals("macOS", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsMacOSVersionAtLeast);
Expand All @@ -256,8 +263,8 @@ private static void AssertVersionChecks(bool isCurrentOS, Func<int, int, int, in

Assert.False(isOSVersionAtLeast(current.Major + 1, current.Minor, current.Build, current.Revision));
Assert.False(isOSVersionAtLeast(current.Major, current.Minor + 1, current.Build, current.Revision));
Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build + 1, current.Revision));
Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build, Math.Max(current.Revision + 1, 1))); // OSX Revision reports -1
Assert.False(isOSVersionAtLeast(current.Major, current.Minor, Math.Max(current.Build + 1, 1), current.Revision));
Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build, Math.Max(current.Revision + 1, 1)));

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

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

Assert.False(isOSVersionAtLeast(current.Major + 1, current.Minor, current.Build));
Assert.False(isOSVersionAtLeast(current.Major, current.Minor + 1, current.Build));
Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build + 1));
Assert.False(isOSVersionAtLeast(current.Major, current.Minor, Math.Max(current.Build + 1, 1)));

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

Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major - 1, current.Minor, current.Build));
Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor - 1, current.Build));
Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor, current.Build - 1));
}

private static void AssertVersionChecks(bool isCurrentOS, Func<int, int, bool> isOSVersionAtLeast)
{
Version current = Environment.OSVersion.Version;

Assert.False(isOSVersionAtLeast(current.Major + 1, current.Minor));
Assert.False(isOSVersionAtLeast(current.Major, current.Minor + 1));

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

Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major - 1, current.Minor));
Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor - 1));
}
}
}

0 comments on commit 5afff13

Please # to comment.