Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[release/9.0-staging] Fix IsOSVersionAtLeast when build or revision are not provided #109332

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
77721e8
Default build and revision numbers to 0 if they are -1 on MacCatalyst
kotlarmilos Oct 10, 2024
c09f70c
Update src/libraries/System.Private.CoreLib/src/System/Environment.OS…
kotlarmilos Oct 10, 2024
78536e0
Add three-parameter and two-parameter overloads for IsOSPlatformVersi…
kotlarmilos Oct 10, 2024
11e3d4f
Update IsOSVersionAtLeast to handle not provided values
kotlarmilos Oct 10, 2024
912c9d3
Check only build and revision
kotlarmilos Oct 10, 2024
487b840
Update src/libraries/System.Private.CoreLib/src/System/OperatingSyste…
kotlarmilos Oct 10, 2024
0d206e5
Update src/libraries/System.Private.CoreLib/src/System/OperatingSyste…
kotlarmilos Oct 10, 2024
fa1bcf9
New line
kotlarmilos Oct 10, 2024
c59384e
Update tests to pass when build or revision are -1
kotlarmilos Oct 10, 2024
41dedbe
Add isCurrentOS to the Assert.Equal
kotlarmilos Oct 10, 2024
069f80e
Unspecified build/revision components are to be treated as zeros
kotlarmilos Oct 14, 2024
d3cb136
Unspecified build component is to be treated as zero
kotlarmilos Oct 14, 2024
0335374
Unspecified build or revision component is to be treated as zero
kotlarmilos Oct 14, 2024
f9238ce
Update src/libraries/System.Private.CoreLib/src/System/OperatingSyste…
kotlarmilos Oct 18, 2024
aa8ba92
Update src/libraries/System.Private.CoreLib/src/System/OperatingSyste…
kotlarmilos Oct 18, 2024
da671d6
Normalize build component to 0 if undefined
kotlarmilos Oct 22, 2024
fe49d62
Add comments
kotlarmilos Oct 22, 2024
d2225e8
Revert normalizing build component to 0
kotlarmilos Oct 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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));
}
}
}
Loading