Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
4fcf002
Expose OperatingSystem static methods
jrdodds Jun 22, 2023
f3e563e
Merge branch 'dotnet:main' into AvailableStaticMethodsSystemOperating…
jrdodds Jun 22, 2023
250df8e
make class internal
jrdodds Jun 22, 2023
5d00cb2
Update comment in src/Build/Resources/Constants.cs
jrdodds Jun 22, 2023
210dca4
Update comment in src/Framework/OperatingSystem.cs
jrdodds Jun 22, 2023
908aa4b
Update comment in src/Framework/OperatingSystem.cs
jrdodds Jun 22, 2023
296094b
flip #if test
jrdodds Jun 22, 2023
cc180fc
changes per review request; add missing unit test for IsOSPlatformVer…
jrdodds Jun 22, 2023
e4efcd4
add test case
jrdodds Jun 22, 2023
541c4ba
add IsOSPlatformVersionAtLeast* test methods
jrdodds Jun 22, 2023
b0b7786
consolidate tests
jrdodds Jun 22, 2023
6accf37
remove IsOSXLike()
jrdodds Jun 23, 2023
387ef70
unit tests
jrdodds Jun 23, 2023
558e8a6
expose only selected methods of System.OperatingSystem
jrdodds Jun 23, 2023
30dea8f
per review request expose all static methods of System.OperatingSystem
jrdodds Jun 27, 2023
16baa32
Merge branch 'dotnet:main' into AvailableStaticMethodsSystemOperating…
jrdodds Jun 27, 2023
f8dbc4a
Merge branch 'dotnet:main' into AvailableStaticMethodsSystemOperating…
jrdodds Jun 28, 2023
6dde4c3
Merge branch 'dotnet:main' into AvailableStaticMethodsSystemOperating…
jrdodds Jun 30, 2023
759ae6a
add comment to re-run build after unit test timeout
jrdodds Jun 30, 2023
ffeb0c3
Revert "add comment to re-run build after unit test timeout"
jrdodds Jul 1, 2023
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
32 changes: 32 additions & 0 deletions src/Build.UnitTests/Evaluation/Expander_Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2806,6 +2806,38 @@ public void PropertyFunctionRuntimeInformation(string propertyFunction, string e
Assert.Equal(expectedExpansion, result);
}

[WindowsFullFrameworkOnlyTheory]
[InlineData("windows")]
[InlineData("linux")]
[InlineData("macos")]
[InlineData("osx")]
public void IsOSPlatformFullFramework(string platform)
{
string propertyFunction = $"$([System.OperatingSystem]::IsOSPlatform('{platform}'))";
string expected = platform.Equals("windows", StringComparison.OrdinalIgnoreCase) ? "True" : "False";
var pg = new PropertyDictionary<ProjectPropertyInstance>();
var expander = new Expander<ProjectPropertyInstance, ProjectItemInstance>(pg, FileSystems.Default);
expander.ExpandIntoStringLeaveEscaped(propertyFunction, ExpanderOptions.ExpandProperties, MockElementLocation.Instance).ShouldBe(expected);
}

[DotNetOnlyTheory]
[InlineData("windows")]
[InlineData("linux")]
[InlineData("macos")]
[InlineData("osx")]
public void IsOSPlatformDotNet(string platform)
{
string propertyFunction = $"$([System.OperatingSystem]::IsOSPlatform('{platform}'))";
bool result = false;
#if NET5_0_OR_GREATER
result = System.OperatingSystem.IsOSPlatform(platform);
#endif
string expected = result ? "True" : "False";
var pg = new PropertyDictionary<ProjectPropertyInstance>();
var expander = new Expander<ProjectPropertyInstance, ProjectItemInstance>(pg, FileSystems.Default);
expander.ExpandIntoStringLeaveEscaped(propertyFunction, ExpanderOptions.ExpandProperties, MockElementLocation.Instance).ShouldBe(expected);
}

[Theory]
[InlineData("AString", "x12x456789x11", "$(AString.IndexOf('x', 1))", "3")]
[InlineData("AString", "x12x456789x11", "$(AString.IndexOf('x45', 1))", "3")]
Expand Down
8 changes: 8 additions & 0 deletions src/Build/Resources/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,14 @@ private static void InitializeAvailableMethods()
availableStaticMethods.TryAdd("Microsoft.Build.Utilities.ToolLocationHelper", new Tuple<string, Type>("Microsoft.Build.Utilities.ToolLocationHelper, Microsoft.Build.Utilities.Core, Version=" + MSBuildConstants.CurrentAssemblyVersion + ", Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", null));
availableStaticMethods.TryAdd("System.Runtime.InteropServices.RuntimeInformation", runtimeInformationType);
availableStaticMethods.TryAdd("System.Runtime.InteropServices.OSPlatform", osPlatformType);
#if NET5_0_OR_GREATER
availableStaticMethods.TryAdd("System.OperatingSystem", new Tuple<string, Type>(null, typeof(OperatingSystem)));
#else
// Add alternate type for System.OperatingSystem static methods which aren't available on .NET Framework.
var operatingSystemType = new Tuple<string, Type>("Microsoft.Build.Framework.OperatingSystem, Microsoft.Build.Framework, Version=" + MSBuildConstants.CurrentAssemblyVersion + ", Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", null);
availableStaticMethods.TryAdd("System.OperatingSystem", operatingSystemType);
availableStaticMethods.TryAdd("Microsoft.Build.Framework.OperatingSystem", operatingSystemType);
#endif

s_availableStaticMethods = availableStaticMethods;
}
Expand Down
57 changes: 57 additions & 0 deletions src/Framework.UnitTests/OperatingSystem_Tests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using Shouldly;

using Xunit;
using Xunit.NetCore.Extensions;

namespace Microsoft.Build.Framework.UnitTests
{
public class OperatingSystem_Tests
{
#if !NET5_0_OR_GREATER
[WindowsFullFrameworkOnlyTheory]
[InlineData("windows", true)]
[InlineData("linux", false)]
[InlineData("macOS", false)]
public void IsOSPlatform(string platform, bool expected)
{
Microsoft.Build.Framework.OperatingSystem.IsOSPlatform(platform).ShouldBe(expected);
}

[WindowsFullFrameworkOnlyTheory]
[InlineData("windows", 4, true)]
[InlineData("windows", 999, false)]
[InlineData("linux", 0, false)]
[InlineData("macOS", 0, false)]
public void IsOSPlatformVersionAtLeast(string platform, int major, bool expected)
{
Microsoft.Build.Framework.OperatingSystem.IsOSPlatformVersionAtLeast(platform, major).ShouldBe(expected);
}

[WindowsFullFrameworkOnlyFact]
public void IsWindows()
{
Microsoft.Build.Framework.OperatingSystem.IsWindows().ShouldBeTrue();
}

[WindowsFullFrameworkOnlyFact]
public void IsWindowsVersionAtLeast()
{
Microsoft.Build.Framework.OperatingSystem.IsWindowsVersionAtLeast(4).ShouldBeTrue();
}

[WindowsFullFrameworkOnlyFact]
public void IsOtherThanWindows()
{
Microsoft.Build.Framework.OperatingSystem.IsFreeBSD().ShouldBeFalse();
Microsoft.Build.Framework.OperatingSystem.IsFreeBSDVersionAtLeast(0).ShouldBeFalse();
Microsoft.Build.Framework.OperatingSystem.IsLinux().ShouldBeFalse();
Microsoft.Build.Framework.OperatingSystem.IsMacOS().ShouldBeFalse();
Microsoft.Build.Framework.OperatingSystem.IsMacOSVersionAtLeast(0).ShouldBeFalse();
Microsoft.Build.Framework.OperatingSystem.IsOSXLike().ShouldBeFalse();
}
#endif
}
}
66 changes: 66 additions & 0 deletions src/Framework/OperatingSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#if !NET5_0_OR_GREATER

using System;

namespace Microsoft.Build.Framework
{
/// <summary>
/// System.OperatingSystem static methods were added in net5.0.
/// This class creates stand-in methods for net472 builds.
/// Assumes only Windows is supported.
/// </summary>
internal static class OperatingSystem
{
public static bool IsOSPlatform(string platform)
{
return platform?.Equals("WINDOWS", StringComparison.OrdinalIgnoreCase) ?? throw new ArgumentNullException(nameof(platform));
}

public static bool IsOSPlatformVersionAtLeast(string platform, int major, int minor = 0, int build = 0, int revision = 0)
=> IsOSPlatform(platform) && IsOSVersionAtLeast(major, minor, build, revision);

public static bool IsLinux() => false;

public static bool IsFreeBSD() => false;

public static bool IsFreeBSDVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0) => false;

public static bool IsMacOS() => false;

public static bool IsOSXLike() => false;

public static bool IsMacOSVersionAtLeast(int major, int minor = 0, int build = 0) => false;

public static bool IsWindows() => true;

public static bool IsWindowsVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0)
=> IsWindows() && IsOSVersionAtLeast(major, minor, build, revision);

private static bool IsOSVersionAtLeast(int major, int minor, int build, int revision)
{
Version current = Environment.OSVersion.Version;

if (current.Major != major)
{
return current.Major > major;
}

if (current.Minor != minor)
{
return current.Minor > minor;
}

if (current.Build != build)
{
return current.Build > build;
}

return current.Revision >= revision;
}
}
}
#endif