Skip to content

Commit 92f3c77

Browse files
authored
[release/9.0.3xx] Fix forwarding DOTNET_ROOT (#50185)
1 parent 1357675 commit 92f3c77

File tree

4 files changed

+18
-16
lines changed

4 files changed

+18
-16
lines changed

src/Cli/dotnet/commands/dotnet-test/Program.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,8 @@ private static TestCommand FromParseResult(ParseResult result, string[] settings
238238
}
239239
}
240240

241-
// Set DOTNET_PATH if it isn't already set in the environment as it is required
242-
// by the testhost which uses the apphost feature (Windows only).
243-
(bool hasRootVariable, string rootVariableName, string rootValue) = VSTestForwardingApp.GetRootVariable();
244-
if (!hasRootVariable)
241+
Dictionary<string, string> variables = VSTestForwardingApp.GetVSTestRootVariables();
242+
foreach (var (rootVariableName, rootValue) in variables)
245243
{
246244
testCommand.EnvironmentVariable(rootVariableName, rootValue);
247245
VSTestTrace.SafeWriteTrace(() => $"Root variable set {rootVariableName}:{rootValue}");

src/Cli/dotnet/commands/dotnet-test/VSTestForwardingApp.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ public class VSTestForwardingApp : ForwardingApp
1313
public VSTestForwardingApp(IEnumerable<string> argsToForward)
1414
: base(GetVSTestExePath(), argsToForward)
1515
{
16-
(bool hasRootVariable, string rootVariableName, string rootValue) = GetRootVariable();
17-
if (!hasRootVariable)
16+
Dictionary<string, string> variables = GetVSTestRootVariables();
17+
foreach (var (rootVariableName, rootValue) in variables)
1818
{
1919
WithEnvironmentVariable(rootVariableName, rootValue);
2020
VSTestTrace.SafeWriteTrace(() => $"Root variable set {rootVariableName}:{rootValue}");
@@ -37,15 +37,18 @@ private static string GetVSTestExePath()
3737
return Path.Combine(AppContext.BaseDirectory, VstestAppName);
3838
}
3939

40-
internal static (bool hasRootVariable, string rootVariableName, string rootValue) GetRootVariable()
40+
internal static Dictionary<string, string> GetVSTestRootVariables()
4141
{
42-
string rootVariableName = Environment.Is64BitProcess ? "DOTNET_ROOT" : "DOTNET_ROOT(x86)";
43-
bool hasRootVariable = Environment.GetEnvironmentVariable(rootVariableName) != null;
44-
string rootValue = hasRootVariable ? null : Path.GetDirectoryName(new Muxer().MuxerPath);
45-
46-
// We rename env variable to support --arch switch that relies on DOTNET_ROOT/DOTNET_ROOT(x86)
47-
// We provide VSTEST_WINAPPHOST_ only in case of testhost*.exe removing VSTEST_WINAPPHOST_ prefix and passing as env vars.
48-
return (hasRootVariable, $"VSTEST_WINAPPHOST_{rootVariableName}", rootValue);
42+
// Gather the current .NET SDK dotnet.exe location and forward it to vstest.console.dll so it can use it
43+
// to setup DOTNET_ROOT for testhost.exe, to find the same installation of NET SDK that is running `dotnet test`.
44+
// This way if we have private installation of .NET SDK, the testhost.exe will be able to use the same private installation.
45+
// The way to set the environment is complicated and depends on the version of testhost, so we leave that implementation to vstest console,
46+
// we just tell it where the current .net SDK is located, and what is the architecture of it. We don't have more information than that here.
47+
return new()
48+
{
49+
["VSTEST_DOTNET_ROOT_PATH"] = Path.GetDirectoryName(new Muxer().MuxerPath),
50+
["VSTEST_DOTNET_ROOT_ARCHITECTURE"] = RuntimeInformation.ProcessArchitecture.ToString()
51+
};
4952
}
5053
}
5154
}

test/TestAssets/TestProjects/VSTestForwardDotnetRootEnvironmentVariables/Tests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void TestForwardDotnetRootEnvironmentVariables()
1616
// This project is compiled, and executed by the tests in "test/dotnet-test.Tests/GivenDotnetTestForwardDotnetRootEnvironmentVariables.cs"
1717
foreach (DictionaryEntry env in Environment.GetEnvironmentVariables())
1818
{
19-
if (env.Key.ToString().Contains("VSTEST_WINAPPHOST_"))
19+
if (env.Key.ToString().Contains("VSTEST_"))
2020
{
2121
Console.WriteLine($"{env.Key.ToString()}={env.Value.ToString()}");
2222
}

test/dotnet-test.Tests/GivenDotnetTestForwardDotnetRootEnvironmentVariables.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ public void ShouldForwardDotnetRootEnvironmentVariablesIfNotProvided()
3333
.Should().Contain("Total tests: 1")
3434
.And.Contain("Passed: 1")
3535
.And.Contain("Passed TestForwardDotnetRootEnvironmentVariables")
36-
.And.Contain("VSTEST_WINAPPHOST_");
36+
.And.Contain("VSTEST_DOTNET_ROOT_PATH")
37+
.And.Contain("VSTEST_DOTNET_ROOT_ARCHITECTURE");
3738
}
3839

3940
result.ExitCode.Should().Be(0);

0 commit comments

Comments
 (0)