<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'" />
<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">
--- /dev/null
+// 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));
+ }
+ }
+}
\ No newline at end of file
+++ /dev/null
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-namespace System
-{
- public static partial class Environment
- {
- private static OperatingSystem GetOSVersion()
- {
- return new OperatingSystem(PlatformID.Other, new Version(1, 0, 0, 0));
- }
- }
-}
{
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
}
}
- 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
{
// 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;
- }
- }
}
}
--- /dev/null
+// 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;
+ }
+ }
+}
}
[Fact]
+ [PlatformSpecific(~TestPlatforms.Browser)] // throws pNSE
public void TargetFrameworkTest()
{
const int ExpectedExitCode = 0;
// GetEntryAssembly may be null (i.e. desktop)
if (expected == null)
- expected = Assembly.GetExecutingAssembly().GetName().Name;
+ expected = "DefaultDomain";
Assert.Equal(expected, s);
}
}
[Fact]
+ [PlatformSpecific(~TestPlatforms.Browser)] // Throws PNSE
public void MonitoringIsEnabled()
{
Assert.True(AppDomain.MonitoringIsEnabled);
[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;
#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);
}
[Fact]
+ [ActiveIssue("https://github.com/dotnet/runtime/issues/38995", TestPlatforms.Browser)]
public void StackTraceDoesNotStartWithInternalFrame()
{
string stackTrace = Environment.StackTrace;
[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
{ currentDirectory, currentDirectory },
// "." => current directory
{ ".", currentDirectory },
- // ".." => up a directory
- { "..", Path.GetDirectoryName(currentDirectory) },
// "dir/./././." => "dir"
{ Path.Combine(currentDirectory, ".", ".", ".", ".", "."), currentDirectory },
// "dir///." => "dir"
{ 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));
// lower upper Culture
yield return new object[] { "abcd", "ABCD", "en-US" };
yield return new object[] { "latin i", "LATIN I", "en-US" };
- yield return new object[] { "turky \u0131", "TURKY I", "tr-TR" };
- yield return new object[] { "turky i", "TURKY \u0130", "tr-TR" };
+
+ if (PlatformDetection.IsNotInvariantGlobalization)
+ {
+ yield return new object[] { "turky \u0131", "TURKY I", "tr-TR" };
+ yield return new object[] { "turky i", "TURKY \u0130", "tr-TR" };
+ }
}
[Theory]
AssertExtensions.Throws<ArgumentException>("comparisonType", () => StringComparer.FromComparison(maxInvalid));
}
- public static TheoryData<string, string, string, CompareOptions, bool> CreateFromCultureAndOptionsData => new TheoryData<string, string, string, CompareOptions, bool>
- {
- { "abcd", "ABCD", "en-US", CompareOptions.None, false},
- { "latin i", "LATIN I", "en-US", CompareOptions.None, false},
- { "turky \u0131", "TURKY I", "tr-TR", CompareOptions.None, false},
- { "turky i", "TURKY \u0130", "tr-TR", CompareOptions.None, false},
- { "abcd", "ABCD", "en-US", CompareOptions.IgnoreCase, true},
- { "latin i", "LATIN I", "en-US", CompareOptions.IgnoreCase, true},
- { "turky \u0131", "TURKY I", "tr-TR", CompareOptions.IgnoreCase, true},
- { "turky i", "TURKY \u0130", "tr-TR", CompareOptions.IgnoreCase, true},
- { "abcd", "ab cd", "en-US", CompareOptions.IgnoreSymbols, true },
- { "abcd", "ab+cd", "en-US", CompareOptions.IgnoreSymbols, true },
- { "abcd", "ab%cd", "en-US", CompareOptions.IgnoreSymbols, true },
- { "abcd", "ab&cd", "en-US", CompareOptions.IgnoreSymbols, true },
- { "abcd", "ab$cd", "en-US", CompareOptions.IgnoreSymbols, true },
- { "abcd", "ab$cd", "en-US", CompareOptions.IgnoreSymbols, true },
- { "a-bcd", "ab$cd", "en-US", CompareOptions.IgnoreSymbols, true },
- { "abcd*", "ab$cd", "en-US", CompareOptions.IgnoreSymbols, true },
- { "ab$dd", "ab$cd", "en-US", CompareOptions.IgnoreSymbols, false },
- { "abcd", "ab$cd", "en-US", CompareOptions.IgnoreSymbols, true },
- };
+ public static TheoryData<string, string, string, CompareOptions, bool> CreateFromCultureAndOptionsData =>
+ new TheoryData<string, string, string, CompareOptions, bool>
+ {
+ { "abcd", "ABCD", "en-US", CompareOptions.None, false},
+ { "latin i", "LATIN I", "en-US", CompareOptions.None, false},
+ { "turky \u0131", "TURKY I", "tr-TR", CompareOptions.None, false},
+ { "turky i", "TURKY \u0130", "tr-TR", CompareOptions.None, false},
+ { "abcd", "ABCD", "en-US", CompareOptions.IgnoreCase, true},
+ { "latin i", "LATIN I", "en-US", CompareOptions.IgnoreCase, true},
+ { "turky \u0131", "TURKY I", "tr-TR", CompareOptions.IgnoreCase, true},
+ { "turky i", "TURKY \u0130", "tr-TR", CompareOptions.IgnoreCase, true},
+ { "abcd", "ab cd", "en-US", CompareOptions.IgnoreSymbols, true },
+ { "abcd", "ab+cd", "en-US", CompareOptions.IgnoreSymbols, true },
+ { "abcd", "ab%cd", "en-US", CompareOptions.IgnoreSymbols, true },
+ { "abcd", "ab&cd", "en-US", CompareOptions.IgnoreSymbols, true },
+ { "abcd", "ab$cd", "en-US", CompareOptions.IgnoreSymbols, true },
+ { "abcd", "ab$cd", "en-US", CompareOptions.IgnoreSymbols, true },
+ { "a-bcd", "ab$cd", "en-US", CompareOptions.IgnoreSymbols, true },
+ { "abcd*", "ab$cd", "en-US", CompareOptions.IgnoreSymbols, true },
+ { "ab$dd", "ab$cd", "en-US", CompareOptions.IgnoreSymbols, false },
+ { "abcd", "ab$cd", "en-US", CompareOptions.IgnoreSymbols, true },
+ };
public static TheoryData<string, string, string, CompareOptions, bool> CreateFromCultureAndOptionsStringSortData => new TheoryData<string, string, string, CompareOptions, bool>
{
{ "abcd", "ABcd", "en-US", CompareOptions.StringSort, false },
};
- [Theory]
+ [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotInvariantGlobalization))]
[MemberData(nameof(CreateFromCultureAndOptionsData))]
[MemberData(nameof(CreateFromCultureAndOptionsStringSortData))]
public static void CreateFromCultureAndOptions(string actualString, string expectedString, string cultureName, CompareOptions options, bool result)
Assert.Equal(result, sc.Equals((object)actualString, (object)expectedString));
}
- [Theory]
+ [ConditionalTheory(typeof(PlatformDetection), nameof(PlatformDetection.IsNotInvariantGlobalization))]
[MemberData(nameof(CreateFromCultureAndOptionsData))]
public static void CreateFromCultureAndOptionsStringSort(string actualString, string expectedString, string cultureName, CompareOptions options, bool result)
{
<ProjectExclusions Include="$(MSBuildThisFileDirectory)System.Resources.Extensions\tests\System.Resources.Extensions.Tests.csproj" />
<ProjectExclusions Include="$(MSBuildThisFileDirectory)System.Resources.Reader\tests\System.Resources.Reader.Tests.csproj" />
<ProjectExclusions Include="$(MSBuildThisFileDirectory)System.Resources.ResourceManager\tests\System.Resources.ResourceManager.Tests.csproj" />
- <ProjectExclusions Include="$(MSBuildThisFileDirectory)System.Runtime.Extensions\tests\System.Runtime.Extensions.Tests.csproj" />
<ProjectExclusions Include="$(MSBuildThisFileDirectory)System.Runtime.InteropServices\tests\System.Runtime.InteropServices.Tests.csproj" />
<ProjectExclusions Include="$(MSBuildThisFileDirectory)System.Runtime.Loader\tests\DefaultContext\System.Runtime.Loader.DefaultContext.Tests.csproj" />
<ProjectExclusions Include="$(MSBuildThisFileDirectory)System.Runtime.Loader\tests\System.Runtime.Loader.Tests.csproj" />