Skip to content

Commit

Permalink
[wasm] Addressing System.Runtime.Extensions failures (#38996)
Browse files Browse the repository at this point in the history
Co-authored-by: Mitchell Hwang <mitchell.hwang@microsoft.com>
Co-authored-by: Steve Pfister <steve.pfister@microsoft.com>
Co-authored-by: Alexander Köplinger <alex.koeplinger@outlook.com>
  • Loading branch information
4 people authored Jul 13, 2020
1 parent fff0ec3 commit 927ced1
Show file tree
Hide file tree
Showing 13 changed files with 170 additions and 123 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1791,7 +1791,7 @@
<Compile Include="$(MSBuildThisFileDirectory)System\Diagnostics\Stopwatch.Unix.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Diagnostics\Tracing\RuntimeEventSourceHelper.Unix.cs" Condition="'$(FeaturePerfTracing)' == 'true'" />
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.NoRegistry.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.Unix.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.UnixOrBrowser.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.OSVersion.OSX.cs" Condition="'$(IsOSXLike)' == 'true'" />
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.OSVersion.Unix.cs" Condition="'$(IsOSXLike)' != 'true' and '$(TargetsBrowser)' != 'true'" />
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.GetFolderPathCore.Unix.cs" Condition="'$(TargetsiOS)' != 'true' and '$(TargetstvOS)' != 'true'" />
Expand Down Expand Up @@ -1819,8 +1819,11 @@
<Compile Include="$(MSBuildThisFileDirectory)System\Threading\TimerQueue.Unix.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\TimeZoneInfo.Unix.cs" />
</ItemGroup>
<ItemGroup Condition="'$(TargetsUnix)' == 'true'">
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.Unix.cs" />
</ItemGroup>
<ItemGroup Condition="'$(TargetsBrowser)' == 'true'">
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.OSVersion.Browser.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.Browser.cs" />
</ItemGroup>
<ItemGroup Condition="'$(IsOSXLike)' == 'true'">
<Compile Include="$(CommonPath)Interop\OSX\Interop.libobjc.cs">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace System
{
public static partial class Environment
{
// Emscripten VFS mounts at / and is the only drive
public static string[] GetLogicalDrives() => new string[] { "/" };

// In the mono runtime, this maps to gethostname, which returns 'emscripten'.
// Returning the value here allows us to exclude more of the runtime.
public static string MachineName => "localhost";

// Matching what we returned for an earlier release. There isn't an established equivalent
// on wasm.
public static long WorkingSet => 0;

public static string UserName => "Browser";

private static OperatingSystem GetOSVersion()
{
return new OperatingSystem(PlatformID.Other, new Version(1, 0, 0, 0));
}
}
}

This file was deleted.

94 changes: 17 additions & 77 deletions src/libraries/System.Private.CoreLib/src/System/Environment.Unix.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,44 +12,8 @@ namespace System
{
public static partial class Environment
{
public static bool UserInteractive => true;

private static string CurrentDirectoryCore
{
get => Interop.Sys.GetCwd();
set => Interop.CheckIo(Interop.Sys.ChDir(value), value, isDirectory: true);
}

private static string ExpandEnvironmentVariablesCore(string name)
{
var result = new ValueStringBuilder(stackalloc char[128]);

int lastPos = 0, pos;
while (lastPos < name.Length && (pos = name.IndexOf('%', lastPos + 1)) >= 0)
{
if (name[lastPos] == '%')
{
string key = name.Substring(lastPos + 1, pos - lastPos - 1);
string? value = GetEnvironmentVariable(key);
if (value != null)
{
result.Append(value);
lastPos = pos + 1;
continue;
}
}
result.Append(name.AsSpan(lastPos, pos - lastPos));
lastPos = pos;
}
result.Append(name.AsSpan(lastPos));

return result.ToString();
}

public static string[] GetLogicalDrives() => Interop.Sys.GetAllMountPoints();

private static bool Is64BitOperatingSystemWhen32BitProcess => false;

public static string MachineName
{
get
Expand All @@ -60,13 +24,24 @@ public static string MachineName
}
}

private static int GetCurrentProcessId() => Interop.Sys.GetPid();

internal const string NewLineConst = "\n";

public static string SystemDirectory => GetFolderPathCore(SpecialFolder.System, SpecialFolderOption.None);
public static long WorkingSet
{
get
{
Type? processType = Type.GetType("System.Diagnostics.Process, System.Diagnostics.Process, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", throwOnError: false);
if (processType?.GetMethod("GetCurrentProcess")?.Invoke(null, BindingFlags.DoNotWrapExceptions, null, null, null) is IDisposable currentProcess)
{
using (currentProcess)
{
if (processType!.GetMethod("get_WorkingSet64")?.Invoke(currentProcess, BindingFlags.DoNotWrapExceptions, null, null, null) is long result)
return result;
}
}

public static int SystemPageSize => CheckedSysConf(Interop.Sys.SysConfName._SC_PAGESIZE);
// Could not get the current working set.
return 0;
}
}

public static unsafe string UserName
{
Expand Down Expand Up @@ -135,40 +110,5 @@ private static unsafe bool TryGetUserNameFromPasswd(byte* buf, int bufLen, out s
// Otherwise, fail.
throw new IOException(errorInfo.GetErrorMessage(), errorInfo.RawErrno);
}

public static string UserDomainName => MachineName;

/// <summary>Invoke <see cref="Interop.Sys.SysConf"/>, throwing if it fails.</summary>
private static int CheckedSysConf(Interop.Sys.SysConfName name)
{
long result = Interop.Sys.SysConf(name);
if (result == -1)
{
Interop.ErrorInfo errno = Interop.Sys.GetLastErrorInfo();
throw errno.Error == Interop.Error.EINVAL ?
new ArgumentOutOfRangeException(nameof(name), name, errno.GetErrorMessage()) :
Interop.GetIOException(errno);
}
return (int)result;
}

public static long WorkingSet
{
get
{
Type? processType = Type.GetType("System.Diagnostics.Process, System.Diagnostics.Process, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", throwOnError: false);
if (processType?.GetMethod("GetCurrentProcess")?.Invoke(null, BindingFlags.DoNotWrapExceptions, null, null, null) is IDisposable currentProcess)
{
using (currentProcess)
{
if (processType!.GetMethod("get_WorkingSet64")?.Invoke(currentProcess, BindingFlags.DoNotWrapExceptions, null, null, null) is long result)
return result;
}
}

// Could not get the current working set.
return 0;
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;

namespace System
{
public static partial class Environment
{
public static bool UserInteractive => true;

private static string CurrentDirectoryCore
{
get => Interop.Sys.GetCwd();
set => Interop.CheckIo(Interop.Sys.ChDir(value), value, isDirectory: true);
}

private static string ExpandEnvironmentVariablesCore(string name)
{
var result = new ValueStringBuilder(stackalloc char[128]);

int lastPos = 0, pos;
while (lastPos < name.Length && (pos = name.IndexOf('%', lastPos + 1)) >= 0)
{
if (name[lastPos] == '%')
{
string key = name.Substring(lastPos + 1, pos - lastPos - 1);
string? value = GetEnvironmentVariable(key);
if (value != null)
{
result.Append(value);
lastPos = pos + 1;
continue;
}
}
result.Append(name.AsSpan(lastPos, pos - lastPos));
lastPos = pos;
}
result.Append(name.AsSpan(lastPos));

return result.ToString();
}

private static bool Is64BitOperatingSystemWhen32BitProcess => false;

private static int GetCurrentProcessId() => Interop.Sys.GetPid();

internal const string NewLineConst = "\n";

public static string SystemDirectory => GetFolderPathCore(SpecialFolder.System, SpecialFolderOption.None);

public static int SystemPageSize => CheckedSysConf(Interop.Sys.SysConfName._SC_PAGESIZE);

public static string UserDomainName => MachineName;

/// <summary>Invoke <see cref="Interop.Sys.SysConf"/>, throwing if it fails.</summary>
private static int CheckedSysConf(Interop.Sys.SysConfName name)
{
long result = Interop.Sys.SysConf(name);
if (result == -1)
{
Interop.ErrorInfo errno = Interop.Sys.GetLastErrorInfo();
throw errno.Error == Interop.Error.EINVAL ?
new ArgumentOutOfRangeException(nameof(name), name, errno.GetErrorMessage()) :
Interop.GetIOException(errno);
}
return (int)result;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public void RelativeSearchPath_Is_Null()
}

[Fact]
[PlatformSpecific(~TestPlatforms.Browser)] // throws pNSE
public void TargetFrameworkTest()
{
const int ExpectedExitCode = 0;
Expand Down Expand Up @@ -129,7 +130,7 @@ public void FriendlyName()

// GetEntryAssembly may be null (i.e. desktop)
if (expected == null)
expected = Assembly.GetExecutingAssembly().GetName().Name;
expected = "DefaultDomain";

Assert.Equal(expected, s);
}
Expand Down Expand Up @@ -371,6 +372,7 @@ public void ReflectionOnlyGetAssemblies()
}

[Fact]
[PlatformSpecific(~TestPlatforms.Browser)] // Throws PNSE
public void MonitoringIsEnabled()
{
Assert.True(AppDomain.MonitoringIsEnabled);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public static void ExitCode_Roundtrips(int exitCode)
[InlineData(1)] // setting ExitCode and exiting Main
[InlineData(2)] // setting ExitCode both from Main and from an Unloading event handler.
[InlineData(3)] // using Exit(exitCode)
[PlatformSpecific(~TestPlatforms.Browser)] // throws PNSE
public static void ExitCode_VoidMainAppReturnsSetValue(int mode)
{
int expectedExitCode = 123;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ internal static string GetComputerName()
#if !Unix
return Environment.GetEnvironmentVariable("COMPUTERNAME");
#else
if (PlatformDetection.IsBrowser)
return "localhost";
string temp = Interop.Sys.GetNodeName();
int index = temp.IndexOf('.');
return index < 0 ? temp : temp.Substring(0, index);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ public TestClass()
}

[Fact]
[ActiveIssue("https://github.com/dotnet/runtime/issues/38995", TestPlatforms.Browser)]
public void StackTraceDoesNotStartWithInternalFrame()
{
string stackTrace = Environment.StackTrace;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,10 @@ public void Version_Valid()
[Fact]
public void WorkingSet_Valid()
{
Assert.True(Environment.WorkingSet > 0, "Expected positive WorkingSet value");
if (PlatformDetection.IsBrowser)
Assert.Equal(0, Environment.WorkingSet);
else
Assert.True(Environment.WorkingSet > 0, "Expected positive WorkingSet value");
}

[Trait(XunitConstants.Category, XunitConstants.IgnoreForCI)] // fail fast crashes the process
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,6 @@ public static TheoryData<string, string> GetFullPath_BasicExpansions
{ currentDirectory, currentDirectory },
// "." => current directory
{ ".", currentDirectory },
// ".." => up a directory
{ "..", Path.GetDirectoryName(currentDirectory) },
// "dir/./././." => "dir"
{ Path.Combine(currentDirectory, ".", ".", ".", ".", "."), currentDirectory },
// "dir///." => "dir"
Expand All @@ -234,6 +232,12 @@ public static TheoryData<string, string> GetFullPath_BasicExpansions
{ root + new string(Path.DirectorySeparatorChar, 3), root },
};

if (currentDirectory != Path.GetPathRoot(currentDirectory))
{
// ".." => up a directory
data.Add("..", Path.GetDirectoryName(currentDirectory));
}

// Path longer than MaxPath that normalizes down to less than MaxPath
const int Iters = 10000;
var longPath = new StringBuilder(currentDirectory, currentDirectory.Length + (Iters * 2));
Expand Down
Loading

0 comments on commit 927ced1

Please sign in to comment.