public static void Initialize(TestCommandLine commandLine) { Environment.SetEnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "0"); // Reset this environment variable so that if the dotnet under test is different than the // one running the tests, it won't interfere Environment.SetEnvironmentVariable("MSBuildSdksPath", null); TestContext testContext = new TestContext(); bool runAsTool = false; if (Directory.Exists(Path.Combine(AppContext.BaseDirectory, "Assets"))) { runAsTool = true; testContext.TestAssetsDirectory = Path.Combine(AppContext.BaseDirectory, "Assets", "TestProjects"); } else if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DOTNET_SDK_TEST_AS_TOOL"))) { // Pretend to run as a tool, but use the test assets found in the repo // This allows testing most of the "tests as global tool" behavior by setting an environment // variable instead of packing the test, and installing it as a global tool. runAsTool = true; testContext.TestAssetsDirectory = FindFolderInTree(Path.Combine("src", "Assets", "TestProjects"), AppContext.BaseDirectory); } string repoRoot = null; string repoConfiguration = "Debug"; if (commandLine.SDKRepoPath != null) { repoRoot = commandLine.SDKRepoPath; } else if (!commandLine.NoRepoInference && !runAsTool) { repoRoot = GetRepoRoot(); if (repoRoot != null) { // assumes tests are always executed from the "artifacts/bin/Tests/$MSBuildProjectFile/$Configuration" directory repoConfiguration = new DirectoryInfo(AppContext.BaseDirectory).Name; } } if (!string.IsNullOrEmpty(commandLine.TestExecutionDirectory)) { testContext.TestExecutionDirectory = commandLine.TestExecutionDirectory; } else if (runAsTool) { testContext.TestExecutionDirectory = Path.Combine(Path.GetTempPath(), "dotnetSdkTests"); } else { // This is dependent on the current artifacts layout: // * $(RepoRoot)/artifacts/tmp/$Configuration) // * $(RepoRoot)/artifacts/bin/Tests/$(MSBuildProjectName)/$(Configuration) testContext.TestExecutionDirectory = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "..", "tmp", repoConfiguration)); testContext.TestAssetsDirectory = FindFolderInTree(Path.Combine("src", "Assets", "TestProjects"), AppContext.BaseDirectory); } string artifactsDir = Environment.GetEnvironmentVariable("DOTNET_SDK_ARTIFACTS_DIR"); if (string.IsNullOrEmpty(artifactsDir) && !string.IsNullOrEmpty(repoRoot)) { artifactsDir = Path.Combine(repoRoot, "artifacts"); } if (repoRoot != null) { testContext.NuGetFallbackFolder = Path.Combine(artifactsDir, ".nuget", "NuGetFallbackFolder"); testContext.NuGetExePath = Path.Combine(artifactsDir, ".nuget", $"nuget{Constants.ExeSuffix}"); testContext.NuGetCachePath = Path.Combine(artifactsDir, ".nuget", "packages"); } else { var nugetFolder = FindFolderInTree(".nuget", AppContext.BaseDirectory, false) ?? Path.Combine(testContext.TestExecutionDirectory, ".nuget"); testContext.NuGetFallbackFolder = Path.Combine(nugetFolder, "NuGetFallbackFolder"); testContext.NuGetExePath = Path.Combine(nugetFolder, $"nuget{Constants.ExeSuffix}"); testContext.NuGetCachePath = Path.Combine(nugetFolder, "packages"); } if (commandLine.SdkVersion != null) { testContext.SdkVersion = commandLine.SdkVersion; } testContext.ToolsetUnderTest = ToolsetInfo.Create(repoRoot, artifactsDir, repoConfiguration, commandLine); TestContext.Current = testContext; }