From ee90cabbadd72f4f7385d4f5e195de65642fd322 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Thu, 10 Oct 2024 12:38:38 +0200 Subject: [PATCH 01/15] Default build and revision numbers to 0 if they are -1 on MacCatalyst --- .../src/System/Environment.OSVersion.MacCatalyst.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs b/src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs index 609dddcf5922e..7b2b238bf2569 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs @@ -7,7 +7,16 @@ public static partial class Environment { private static OperatingSystem GetOSVersion() { - Version version = new Version(Interop.Sys.iOSSupportVersion()); + Version version = Version.Parse(Interop.Sys.iOSSupportVersion()); + + // Check if build and revision are -1 and default them to 0 + int major = version.Major; + int minor = version.Minor; + int build = version.Build >= 0 ? version.Build : 0; + int revision = version.Revision >= 0 ? version.Revision : 0; + + version = new Version(major, minor, build, revision); + return new OperatingSystem(PlatformID.Unix, version); } } From 88a187ccb14d53faf83dd00b4a396530e5e9ff69 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Thu, 10 Oct 2024 13:29:01 +0200 Subject: [PATCH 02/15] Update src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com> --- .../src/System/Environment.OSVersion.MacCatalyst.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs b/src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs index 7b2b238bf2569..47c3df70b8e6a 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs @@ -12,8 +12,8 @@ private static OperatingSystem GetOSVersion() // Check if build and revision are -1 and default them to 0 int major = version.Major; int minor = version.Minor; - int build = version.Build >= 0 ? version.Build : 0; - int revision = version.Revision >= 0 ? version.Revision : 0; + int build = version.Build < 0 ? 0 : version.Build; + int revision = version.Revision < 0 ? 0 : version.Revision; version = new Version(major, minor, build, revision); From cdd364b0d395bd3c29b58939a146bbc7e75dc055 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Thu, 10 Oct 2024 13:51:14 +0200 Subject: [PATCH 03/15] Add three-parameter and two-parameter overloads for IsOSPlatformVersionAtLeast --- .../System/OperatingSystemTests.cs | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs b/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs index 3776ce04478f9..af6106001fc52 100644 --- a/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs +++ b/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs @@ -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); @@ -281,5 +288,18 @@ private static void AssertVersionChecks(bool isCurrentOS, Func 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)); + } } } From 3db8a972ae9756b150620b897cf50d1f661e0873 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Thu, 10 Oct 2024 15:00:23 +0200 Subject: [PATCH 04/15] Update IsOSVersionAtLeast to handle not provided values --- .../src/System/Environment.OSVersion.MacCatalyst.cs | 11 +---------- .../src/System/OperatingSystem.cs | 7 +++---- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs b/src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs index 47c3df70b8e6a..609dddcf5922e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Environment.OSVersion.MacCatalyst.cs @@ -7,16 +7,7 @@ public static partial class Environment { private static OperatingSystem GetOSVersion() { - Version version = Version.Parse(Interop.Sys.iOSSupportVersion()); - - // Check if build and revision are -1 and default them to 0 - int major = version.Major; - int minor = version.Minor; - int build = version.Build < 0 ? 0 : version.Build; - int revision = version.Revision < 0 ? 0 : version.Revision; - - version = new Version(major, minor, build, revision); - + Version version = new Version(Interop.Sys.iOSSupportVersion()); return new OperatingSystem(PlatformID.Unix, version); } } diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index e7da2f788fa0d..603d01913f8ab 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -331,17 +331,16 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi { return current.Major > major; } - if (current.Minor != minor) + if (current.Minor >= 0 && current.Minor != minor) { return current.Minor > minor; } - if (current.Build != build) + if (current.Build >= 0 && current.Build != build) { return current.Build > build; } - return current.Revision >= revision - || (current.Revision == -1 && revision == 0); // it is unavailable on OSX and Environment.OSVersion.Version.Revision returns -1 + return current.Revision < 0 || current.Revision >= revision; } } } From f03783df1148f6e560ae8f33089ce7ffb1b8ae0b Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Thu, 10 Oct 2024 15:12:50 +0200 Subject: [PATCH 05/15] Check only build and revision --- .../System.Private.CoreLib/src/System/OperatingSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 603d01913f8ab..7d7ae293b40d1 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -331,7 +331,7 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi { return current.Major > major; } - if (current.Minor >= 0 && current.Minor != minor) + if (current.Minor != minor) { return current.Minor > minor; } From ed1959fd296ddda24e2638e32507dfa8339fc641 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Thu, 10 Oct 2024 15:37:31 +0200 Subject: [PATCH 06/15] Update src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs Co-authored-by: Jan Kotas --- .../System.Private.CoreLib/src/System/OperatingSystem.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 7d7ae293b40d1..8311114be5768 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -335,7 +335,12 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi { return current.Minor > minor; } - if (current.Build >= 0 && current.Build != build) + if (current.Build < 0) + { + // Unspecified component satisfies any required version + return true; + } + if (current.Build != build) { return current.Build > build; } From ad063f5875c733f57adfaef48e7c2ca2f4e14316 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Thu, 10 Oct 2024 15:37:41 +0200 Subject: [PATCH 07/15] Update src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs Co-authored-by: Jan Kotas --- .../System.Private.CoreLib/src/System/OperatingSystem.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 8311114be5768..86e92523b604e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -345,7 +345,12 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi return current.Build > build; } - return current.Revision < 0 || current.Revision >= revision; + if (current.Revision < 0) + { + // Unspecified component satisfies any required version + return true; + } + return current.Revision >= revision; } } } From 4cb95361a8ea75d31e33a252ce8dc69627827af1 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Thu, 10 Oct 2024 15:38:44 +0200 Subject: [PATCH 08/15] New line --- .../System.Private.CoreLib/src/System/OperatingSystem.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 86e92523b604e..9203838a90f70 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -350,6 +350,7 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi // Unspecified component satisfies any required version return true; } + return current.Revision >= revision; } } From b463233663e89dbb00898e0ee51a787349dbd576 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Thu, 10 Oct 2024 18:05:58 +0200 Subject: [PATCH 09/15] Update tests to pass when build or revision are -1 --- .../System/OperatingSystemTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs b/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs index af6106001fc52..abefb11faef5e 100644 --- a/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs +++ b/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs @@ -263,8 +263,8 @@ private static void AssertVersionChecks(bool isCurrentOS, Func Date: Thu, 10 Oct 2024 21:02:02 +0200 Subject: [PATCH 10/15] Add isCurrentOS to the Assert.Equal --- .../System/OperatingSystemTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs b/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs index abefb11faef5e..ab6198e096c4e 100644 --- a/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs +++ b/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs @@ -263,8 +263,8 @@ private static void AssertVersionChecks(bool isCurrentOS, Func Date: Mon, 14 Oct 2024 14:29:33 +0200 Subject: [PATCH 11/15] Unspecified build/revision components are to be treated as zeros --- .../System.Private.CoreLib/src/System/OperatingSystem.cs | 8 ++++---- .../System/OperatingSystemTests.cs | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 9203838a90f70..0a4f49a6a0411 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -337,8 +337,8 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi } if (current.Build < 0) { - // Unspecified component satisfies any required version - return true; + // Unspecified build component is to be treated as zero + return build == 0; } if (current.Build != build) { @@ -347,8 +347,8 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi if (current.Revision < 0) { - // Unspecified component satisfies any required version - return true; + // Unspecified build component is to be treated as zero + return revision == 0; } return current.Revision >= revision; diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs b/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs index ab6198e096c4e..a5a8636008a3c 100644 --- a/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs +++ b/src/libraries/System.Runtime/tests/System.Runtime.Extensions.Tests/System/OperatingSystemTests.cs @@ -263,8 +263,8 @@ private static void AssertVersionChecks(bool isCurrentOS, Func Date: Mon, 14 Oct 2024 18:36:15 +0200 Subject: [PATCH 12/15] Unspecified build component is to be treated as zero --- .../src/System/OperatingSystem.cs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 0a4f49a6a0411..c53825aa1e573 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -335,12 +335,8 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi { return current.Minor > minor; } - if (current.Build < 0) - { - // Unspecified build component is to be treated as zero - return build == 0; - } - if (current.Build != build) + // Unspecified build component is to be treated as zero + if (current.Build != build && !(current.Build == -1 && build <= 0)) { return current.Build > build; } @@ -348,7 +344,7 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi if (current.Revision < 0) { // Unspecified build component is to be treated as zero - return revision == 0; + return revision <= 0; } return current.Revision >= revision; From 7ac7175682adacdb590c4ec273ecc3ff9e4275d4 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Mon, 14 Oct 2024 18:49:13 +0200 Subject: [PATCH 13/15] Unspecified build or revision component is to be treated as zero --- .../src/System/OperatingSystem.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index c53825aa1e573..8d3e0d9c59cda 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -336,18 +336,18 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi return current.Minor > minor; } // Unspecified build component is to be treated as zero - if (current.Build != build && !(current.Build == -1 && build <= 0)) + int currentBuild = current.Build == -1 ? 0 : current.Build; + build = build < 0 ? 0 : build; + if (currentBuild != build) { - return current.Build > build; + return currentBuild > build; } - if (current.Revision < 0) - { - // Unspecified build component is to be treated as zero - return revision <= 0; - } + // Unspecified revision component is to be treated as zero + int currentRevision = current.Revision == -1 ? 0 : current.Revision; + revision = revision < 0 ? 0 : revision; - return current.Revision >= revision; + return currentRevision >= revision; } } } From 3ffaae0155c4f09e5f5dc2e046262dd258fa997e Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Fri, 18 Oct 2024 13:01:20 +0200 Subject: [PATCH 14/15] Update src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com> --- .../System.Private.CoreLib/src/System/OperatingSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 8d3e0d9c59cda..6c4304ce2e6d4 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -344,7 +344,7 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi } // Unspecified revision component is to be treated as zero - int currentRevision = current.Revision == -1 ? 0 : current.Revision; + int currentRevision = current.Revision < 0 ? 0 : current.Revision; revision = revision < 0 ? 0 : revision; return currentRevision >= revision; From 3eb18ad4ded1b8613c5f1038761e284265c7202f Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Fri, 18 Oct 2024 13:01:31 +0200 Subject: [PATCH 15/15] Update src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com> --- .../System.Private.CoreLib/src/System/OperatingSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 6c4304ce2e6d4..8dca64953b18e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -336,7 +336,7 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi return current.Minor > minor; } // Unspecified build component is to be treated as zero - int currentBuild = current.Build == -1 ? 0 : current.Build; + int currentBuild = current.Build < 0 ? 0 : current.Build; build = build < 0 ? 0 : build; if (currentBuild != build) {