From 149aba6afe2d837ebda6ecdd0535798d678713c5 Mon Sep 17 00:00:00 2001 From: Rama Krishnan Raghupathy Date: Fri, 19 May 2017 15:53:37 -0700 Subject: [PATCH] Modifying test for multilevel FX lookup - Remove user profile testing - add test for multiple global locations for non windows Commit migrated from https://github.com/dotnet/core-setup/commit/3b00d091c9ba42a140e2b689549fc3b43e12adad --- .../GivenThatICareAboutMultilevelSharedFxLookup.cs | 291 +++++++++++++++------ src/installer/test/TestUtils/Command.cs | 36 +++ src/installer/test/TestUtils/DotNetCli.cs | 3 +- 3 files changed, 246 insertions(+), 84 deletions(-) diff --git a/src/installer/test/HostActivationTests/GivenThatICareAboutMultilevelSharedFxLookup.cs b/src/installer/test/HostActivationTests/GivenThatICareAboutMultilevelSharedFxLookup.cs index 5f9c062..0669d75 100644 --- a/src/installer/test/HostActivationTests/GivenThatICareAboutMultilevelSharedFxLookup.cs +++ b/src/installer/test/HostActivationTests/GivenThatICareAboutMultilevelSharedFxLookup.cs @@ -1,4 +1,5 @@ using Microsoft.DotNet.InternalAbstractions; +using Microsoft.DotNet.Cli.Build.Framework; using Newtonsoft.Json.Linq; using System; using System.IO; @@ -14,33 +15,40 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku private string _currentWorkingDir; private string _userDir; private string _executableDir; + private string _globalDir; private string _cwdSharedFxBaseDir; private string _userSharedFxBaseDir; private string _exeSharedFxBaseDir; + private string _globalSharedFxBaseDir; private string _builtSharedFxDir; private string _cwdSelectedMessage; private string _userSelectedMessage; private string _exeSelectedMessage; + private string _globalSelectedMessage; private string _sharedFxVersion; - + private string _multilevelDir; + private string _builtDotnet; + private string _hostPolicyDllName; + public GivenThatICareAboutMultilevelSharedFxLookup() { // From the artifacts dir, it's possible to find where the sharedFrameworkPublish folder is. We need // to locate it because we'll copy its contents into other folders string artifactsDir = Environment.GetEnvironmentVariable("TEST_ARTIFACTS"); - string builtDotnet = Path.Combine(artifactsDir, "sharedFrameworkPublish"); + _builtDotnet = Path.Combine(artifactsDir, "sharedFrameworkPublish"); // The dotnetMultilevelSharedFxLookup dir will contain some folders and files that will be // necessary to perform the tests string baseMultilevelDir = Path.Combine(artifactsDir, "dotnetMultilevelSharedFxLookup"); - string multilevelDir = CalculateMultilevelDirectory(baseMultilevelDir); + _multilevelDir = CalculateMultilevelDirectory(baseMultilevelDir); // The three tested locations will be the cwd, the user folder and the exe dir. Both cwd and exe dir // are easily overwritten, so they will be placed inside the multilevel folder. The actual user location will // be used during tests - _currentWorkingDir = Path.Combine(multilevelDir, "cwd"); - _userDir = Path.Combine(multilevelDir, "user"); - _executableDir = Path.Combine(multilevelDir, "exe"); + _currentWorkingDir = Path.Combine(_multilevelDir, "cwd"); + _userDir = Path.Combine(_multilevelDir, "user"); + _executableDir = Path.Combine(_multilevelDir, "exe"); + _globalDir = Path.Combine(_multilevelDir, "global"); RepoDirectories = new RepoDirectoriesProvider(builtDotnet: _executableDir); @@ -48,12 +56,17 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku _cwdSharedFxBaseDir = Path.Combine(_currentWorkingDir, "shared", "Microsoft.NETCore.App"); _userSharedFxBaseDir = Path.Combine(_userDir, ".dotnet", RepoDirectories.BuildArchitecture, "shared", "Microsoft.NETCore.App"); _exeSharedFxBaseDir = Path.Combine(_executableDir, "shared", "Microsoft.NETCore.App"); + _globalSharedFxBaseDir = Path.Combine(_globalDir, "shared", "Microsoft.NETCore.App"); // Create directories. It's necessary to copy the entire publish folder to the exe dir because // we'll need to build from it. The CopyDirectory method automatically creates the dest dir Directory.CreateDirectory(_cwdSharedFxBaseDir); Directory.CreateDirectory(_userSharedFxBaseDir); - CopyDirectory(builtDotnet, _executableDir); + Directory.CreateDirectory(_globalSharedFxBaseDir); + CopyDirectory(_builtDotnet, _executableDir); + + //Copy dotnet to global directory + File.Copy(Path.Combine(_builtDotnet, $"dotnet{Constants.ExeSuffix}"), Path.Combine(_globalDir, $"dotnet{Constants.ExeSuffix}"), true); // Restore and build SharedFxLookupPortableApp from exe dir PreviouslyBuiltAndRestoredPortableTestProjectFixture = new TestProjectFixture("SharedFxLookupPortableApp", RepoDirectories) @@ -65,14 +78,15 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku // locate the builtSharedFxDir from which we can get the files contained in the version folder string greatestVersionSharedFxPath = fixture.BuiltDotnet.GreatestVersionSharedFxPath; _sharedFxVersion = (new DirectoryInfo(greatestVersionSharedFxPath)).Name; - _builtSharedFxDir = Path.Combine(builtDotnet, "shared", "Microsoft.NETCore.App", _sharedFxVersion); + _builtSharedFxDir = Path.Combine(_builtDotnet, "shared", "Microsoft.NETCore.App", _sharedFxVersion); - string hostPolicyDllName = Path.GetFileName(fixture.TestProject.HostPolicyDll); + _hostPolicyDllName = Path.GetFileName(fixture.TestProject.HostPolicyDll); // Trace messages used to identify from which folder the framework was picked - _cwdSelectedMessage = $"The expected {hostPolicyDllName} directory is [{_cwdSharedFxBaseDir}"; - _userSelectedMessage = $"The expected {hostPolicyDllName} directory is [{_userSharedFxBaseDir}"; - _exeSelectedMessage = $"The expected {hostPolicyDllName} directory is [{_exeSharedFxBaseDir}"; + _cwdSelectedMessage = $"The expected {_hostPolicyDllName} directory is [{_cwdSharedFxBaseDir}"; + _userSelectedMessage = $"The expected {_hostPolicyDllName} directory is [{_userSharedFxBaseDir}"; + _exeSelectedMessage = $"The expected {_hostPolicyDllName} directory is [{_exeSharedFxBaseDir}"; + _globalSelectedMessage = $"The expected {_hostPolicyDllName} directory is [{_globalSharedFxBaseDir}"; } [Fact] @@ -111,7 +125,7 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku AddAvailableSharedFxVersions(_userSharedFxBaseDir, "9999.0.0"); // Version: 9999.0.0 - // User: 9999.0.0 + // User: 9999.0.0 --> should not be picked // Exe: 9999.0.0 // Expected: 9999.0.0 from user dir dotnet.Exec(appDll) @@ -124,7 +138,7 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku .Should() .Pass() .And - .HaveStdErrContaining(_userSelectedMessage); + .HaveStdErrContaining(_exeSelectedMessage); // Add a dummy version in the cwd AddAvailableSharedFxVersions(_cwdSharedFxBaseDir, "9999.0.0"); @@ -133,7 +147,7 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku // CWD: 9999.0.0 --> should not be picked // User: 9999.0.0 // Exe: 9999.0.0 - // Expected: 9999.0.0 from user dir + // Expected: 9999.0.0 from user Exe dotnet.Exec(appDll) .WorkingDirectory(_currentWorkingDir) .EnvironmentVariable("COREHOST_TRACE", "1") @@ -144,7 +158,7 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku .Should() .Pass() .And - .HaveStdErrContaining(_userSelectedMessage); + .HaveStdErrContaining(_exeSelectedMessage); // Remove dummy folders from user dir DeleteAvailableSharedFxVersions(_userSharedFxBaseDir, "9999.0.0"); @@ -160,70 +174,102 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku var appDll = fixture.TestProject.AppDll; // Add some dummy versions - AddAvailableSharedFxVersions(_userSharedFxBaseDir, "9999.0.2", "9999.0.0-dummy2"); - AddAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.0.0", "9999.0.0-dummy0"); + AddAvailableSharedFxVersions(_globalSharedFxBaseDir, "9999.0.2", "9999.0.0-dummy2"); + AddAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.0.0"); // Set desired version = 9999.0.0-dummy0 string runtimeConfig = Path.Combine(fixture.TestProject.OutputDirectory, "SharedFxLookupPortableApp.runtimeconfig.json"); SetRuntimeConfigJson(runtimeConfig, "9999.0.0-dummy0"); // Version: 9999.0.0-dummy0 - // User: 9999.0.2, 9999.0.0-dummy2 - // Exe: 9999.0.0, 9999.0.0-dummy0 - // Expected: 9999.0.0-dummy2 from user dir + // Exe: 9999.0.0 + // global: 9999.0.2, 9999.0.0-dummy2 + // Expected: 9999.0.0-dummy2 from global dir dotnet.Exec(appDll) .WorkingDirectory(_currentWorkingDir) .EnvironmentVariable("COREHOST_TRACE", "1") - .WithUserProfile(_userDir) + .WithGlobalLocation(_globalDir) .CaptureStdOut() .CaptureStdErr() .Execute() .Should() .Pass() .And - .HaveStdErrContaining(Path.Combine(_userSelectedMessage, "9999.0.0-dummy2")); + .HaveStdErrContaining(Path.Combine(_globalSelectedMessage, "9999.0.0-dummy2")); + + AddAvailableSharedFxVersions(_globalSharedFxBaseDir, "9999.0.0-dummy1"); - // Add a prerelease dummy version in userdir - AddAvailableSharedFxVersions(_userSharedFxBaseDir, "9999.0.0-dummy1"); + // Version: 9999.0.0-dummy0 + // Exe: 9999.0.0 + // global: 9999.0.2, 9999.0.0-dummy1, 9999.0.0-dummy2 + // Expected: 9999.0.0-dummy1 from global + dotnet.Exec(appDll) + .WorkingDirectory(_currentWorkingDir) + .EnvironmentVariable("COREHOST_TRACE", "1") + .WithGlobalLocation(_globalDir) + .CaptureStdOut() + .CaptureStdErr() + .Execute() + .Should() + .Pass() + .And + .HaveStdErrContaining(Path.Combine(_globalSelectedMessage, "9999.0.0-dummy1")); + + AddAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.0.0-dummy0"); // Version: 9999.0.0-dummy0 - // User: 9999.0.2, 9999.0.0-dummy1, 9999.0.0-dummy2 // Exe: 9999.0.0, 9999.0.0-dummy0 - // Expected: 9999.0.0-dummy1 from User + // global: 9999.0.2, 9999.0.0-dummy1, 9999.0.0-dummy2 + // Expected: 9999.0.0-dummy1 from global dotnet.Exec(appDll) .WorkingDirectory(_currentWorkingDir) .EnvironmentVariable("COREHOST_TRACE", "1") - .WithUserProfile(_userDir) + .WithGlobalLocation(_globalDir) .CaptureStdOut() .CaptureStdErr() .Execute() .Should() .Pass() .And - .HaveStdErrContaining(Path.Combine(_userSelectedMessage, "9999.0.0-dummy1")); + .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.0.0-dummy0")); - // Set desired version = 9999.0.0 SetRuntimeConfigJson(runtimeConfig, "9999.0.0"); - // Version: 9999.0.0 - // CWD: 9999.0.0-dummy1 - // User: 9999.0.2, 9999.0.0-dummy2 // Exe: 9999.0.0, 9999.0.0-dummy0 - // Expected: 9999.0.2 from user dir + // global: 9999.0.2, 9999.0.0-dummy1, 9999.0.0-dummy2 + // Expected: 9999.0.2 from global dotnet.Exec(appDll) .WorkingDirectory(_currentWorkingDir) .EnvironmentVariable("COREHOST_TRACE", "1") - .WithUserProfile(_userDir) + .WithGlobalLocation(_globalDir) .CaptureStdOut() .CaptureStdErr() .Execute() .Should() .Pass() .And - .HaveStdErrContaining(Path.Combine(_userSelectedMessage, "9999.0.2")); + .HaveStdErrContaining(Path.Combine(_globalSelectedMessage, "9999.0.2")); - // Remove dummy folders from user dir - DeleteAvailableSharedFxVersions(_userSharedFxBaseDir, "9999.0.2", "9999.0.0-dummy2"); + AddAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.0.3"); + + // Version: 9999.0.0 + // Exe: 9999.0.0, 9999.0.0-dummy0, 9999.0.3 + // global: 9999.0.2, 9999.0.0-dummy1, 9999.0.0-dummy2 + // Expected: 9999.0.0-dummy1 from global + dotnet.Exec(appDll) + .WorkingDirectory(_currentWorkingDir) + .EnvironmentVariable("COREHOST_TRACE", "1") + .WithGlobalLocation(_globalDir) + .CaptureStdOut() + .CaptureStdErr() + .Execute() + .Should() + .Pass() + .And + .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.0.3")); + + DeleteAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.0.0", "9999.0.0-dummy0","9999.0.3"); + DeleteAvailableSharedFxVersions(_globalSharedFxBaseDir, "9999.0.2", "9999.0.0-dummy1", "9999.0.0-dummy2"); } [Fact] @@ -236,17 +282,16 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku var appDll = fixture.TestProject.AppDll; // Add some dummy versions - AddAvailableSharedFxVersions(_userSharedFxBaseDir, "9999.0.2", "9999.0.0-dummy2"); - AddAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.0.0", "9999.0.3", "9999.0.0-dummy3"); + AddAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.0.2", "9999.0.0-dummy2", "9999.0.0", "9999.0.3", "9999.0.0-dummy3"); + // Version: 9999.0.0 (through --fx-version arg) - // User: 9999.0.2, 9999.0.0-dummy2 - // Exe: 9999.0.0, 9999.0.3, 9999.0.0-dummy3 + // Exe: 9999.0.2, 9999.0.0-dummy2, 9999.0.0, 9999.0.3, 9999.0.0-dummy3 + // global: empty // Expected: 9999.0.0 from exe dir dotnet.Exec("--fx-version", "9999.0.0", appDll) .WorkingDirectory(_currentWorkingDir) .EnvironmentVariable("COREHOST_TRACE", "1") - .WithUserProfile(_userDir) .CaptureStdOut() .CaptureStdErr() .Execute() @@ -256,13 +301,12 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.0.0")); // Version: 9999.0.0-dummy1 (through --fx-version arg) - // User: 9999.0.2, 9999.0.0-dummy2 - // Exe: 9999.0.0, 9999.0.3, 9999.0.0-dummy3 + // Exe: 9999.0.2, 9999.0.0-dummy2,9999.0.0, 9999.0.3, 9999.0.0-dummy3 + // global: empty // Expected: no compatible version dotnet.Exec("--fx-version", "9999.0.0-dummy1", appDll) .WorkingDirectory(_currentWorkingDir) .EnvironmentVariable("COREHOST_TRACE", "1") - .WithUserProfile(_userDir) .CaptureStdOut() .CaptureStdErr() .Execute(fExpectedToFail:true) @@ -271,8 +315,8 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku .And .HaveStdErrContaining("It was not possible to find any compatible framework version"); - // Remove dummy folders from user dir - DeleteAvailableSharedFxVersions(_userSharedFxBaseDir, "9999.0.2", "9999.0.0-dummy2"); + + DeleteAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.0.0", "9999.0.3", "9999.0.0-dummy3", "9999.0.2", "9999.0.0-dummy2"); } [Fact] @@ -297,7 +341,6 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku // Expected: 10000.1.3 from exe dotnet.Exec(appDll) .WorkingDirectory(_currentWorkingDir) - .WithUserProfile(_userDir) .EnvironmentVariable("DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX", "1") .EnvironmentVariable("COREHOST_TRACE", "1") .CaptureStdOut() @@ -317,7 +360,6 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku // Expected: 9999.1.1 from exe dotnet.Exec(appDll) .WorkingDirectory(_currentWorkingDir) - .WithUserProfile(_userDir) .EnvironmentVariable("DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX", "1") .EnvironmentVariable("COREHOST_TRACE", "1") .CaptureStdOut() @@ -351,7 +393,6 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku // Expected: no compatible version dotnet.Exec(appDll) .WorkingDirectory(_currentWorkingDir) - .WithUserProfile(_userDir) .EnvironmentVariable("DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX", "1") .EnvironmentVariable("COREHOST_TRACE", "1") .CaptureStdOut() @@ -377,16 +418,16 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku SetRuntimeConfigJson(runtimeConfig, "9999.0.0"); // Add a dummy version in the exe dir - AddAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.1.0"); + AddAvailableSharedFxVersions(_globalSharedFxBaseDir, "9999.1.0"); // Version: 9999.0.0 // 'Roll forward on no candidate fx' enabled through env var - // User: empty - // Exe: 9999.1.0 - // Expected: 9999.1.0 from exe dir + // Exe: empty + // Global: 9999.1.0 + // Expected: 9999.1.0 from global dir dotnet.Exec(appDll) .WorkingDirectory(_currentWorkingDir) - .WithUserProfile(_userDir) + .WithGlobalLocation(_globalDir) .EnvironmentVariable("DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX", "1") .EnvironmentVariable("COREHOST_TRACE", "1") .CaptureStdOut() @@ -395,19 +436,19 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku .Should() .Pass() .And - .HaveStdErrContaining(_exeSelectedMessage); + .HaveStdErrContaining(_globalSelectedMessage); // Add a dummy version in the user dir - AddAvailableSharedFxVersions(_userSharedFxBaseDir, "9999.1.1"); + AddAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.1.1"); // Version: 9999.0.0 // 'Roll forward on no candidate fx' enabled through env var - // User: 9999.1.1 - // Exe: 9999.1.0 - // Expected: 9999.1.1 from user dir + // Exe: 9999.1.1 + // Global: 9999.1.0 + // Expected: 9999.1.1 from exe dir dotnet.Exec(appDll) .WorkingDirectory(_currentWorkingDir) - .WithUserProfile(_userDir) + .WithGlobalLocation(_globalDir) .EnvironmentVariable("DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX", "1") .EnvironmentVariable("COREHOST_TRACE", "1") .CaptureStdOut() @@ -416,10 +457,11 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku .Should() .Pass() .And - .HaveStdErrContaining(_userSelectedMessage); + .HaveStdErrContaining(_exeSelectedMessage); // Remove dummy folders from user dir - DeleteAvailableSharedFxVersions(_userSharedFxBaseDir, "9999.1.1"); + DeleteAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.1.1"); + DeleteAvailableSharedFxVersions(_globalSharedFxBaseDir, "9999.1.0"); } [Fact] @@ -437,8 +479,8 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku SetRuntimeConfigJson(runtimeConfig, "9999.0.0", 1); // Add some dummy versions - AddAvailableSharedFxVersions(_userSharedFxBaseDir, "9999.1.0"); - AddAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.0.0"); + AddAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.1.0"); + AddAvailableSharedFxVersions(_globalSharedFxBaseDir, "9999.0.0"); // Set desired version = 9999.0.0 // Disable 'roll forward on no candidate fx' through runtimeconfig @@ -447,12 +489,12 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku // Version: 9999.0.0 // 'Roll forward on no candidate fx' disabled through runtimeconfig - // User: 9999.1.0 - // Exe: 9999.0.0 - // Expected: 9999.0.0 from exe dir + // Exe: 9999.1.0 + // Global: 9999.0.0 + // Expected: 9999.0.0 from global dir dotnet.Exec(appDll) .WorkingDirectory(_currentWorkingDir) - .WithUserProfile(_userDir) + .WithGlobalLocation(_globalDir) .EnvironmentVariable("DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX", "1") .EnvironmentVariable("COREHOST_TRACE", "1") .CaptureStdOut() @@ -461,7 +503,7 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku .Should() .Pass() .And - .HaveStdErrContaining(_exeSelectedMessage); + .HaveStdErrContaining(_globalSelectedMessage); } [Fact] @@ -479,17 +521,17 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku SetRuntimeConfigJson(runtimeConfig, "9999.0.0", 0); // Add some dummy versions - AddAvailableSharedFxVersions(_userSharedFxBaseDir, "9999.1.0"); - AddAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.0.0"); + AddAvailableSharedFxVersions(_exeSharedFxBaseDir, "9999.1.1"); + AddAvailableSharedFxVersions(_globalSharedFxBaseDir, "9999.1.2"); // Version: 9999.0.0 // 'Roll forward on no candidate fx' enabled through argument - // User: 9999.1.0 - // Exe: 9999.0.0 - // Expected: 9999.1.0 from User + // Exe: 9999.1.1 + // Global: 9999.1.2 + // Expected: 9999.1.2 from global dotnet.Exec("--roll-forward-on-no-candidate-fx", "1", appDll) .WorkingDirectory(_currentWorkingDir) - .WithUserProfile(_userDir) + .WithGlobalLocation(_globalDir) .EnvironmentVariable("COREHOST_TRACE", "1") .CaptureStdOut() .CaptureStdErr() @@ -497,7 +539,7 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku .Should() .Pass() .And - .HaveStdErrContaining(_userSelectedMessage); + .HaveStdErrContaining(_globalSelectedMessage); // Set desired version = 9999.0.0 // Enable 'roll forward on no candidate fx' through Runtimeconfig @@ -505,12 +547,67 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku // Version: 9999.0.0 // 'Roll forward on no candidate fx' disabled through argument - // User: 9999.1.0 - // Exe: 9999.0.0 - // Expected: 9999.0.0 from exe dir + // Exe: 9999.1.1 + // Global: 9999.1.2 + // Expected: does not resolve FX dotnet.Exec("--roll-forward-on-no-candidate-fx", "0", appDll) .WorkingDirectory(_currentWorkingDir) - .WithUserProfile(_userDir) + .WithGlobalLocation(_globalDir) + .EnvironmentVariable("DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX", "1") + .EnvironmentVariable("COREHOST_TRACE", "1") + .CaptureStdOut() + .CaptureStdErr() + .Execute(fExpectedToFail:true) + .Should() + .Fail() + .And + .HaveStdErrContaining("It was not possible to find any compatible framework version"); + + } + + [Fact] + public void Ensure_On_NonWindows_Multiple_Global_Locations_Are_Probed() + { + //This test is only applicable on non windows as it tests probing for global + //locations on path + if (RuntimeEnvironment.OperatingSystemPlatform == Platform.Windows) + { + return; + } + + var fixture = PreviouslyBuiltAndRestoredPortableTestProjectFixture + .Copy(); + + var dotnet = fixture.BuiltDotnet; + var appDll = fixture.TestProject.AppDll; + + var secondary_globalDir = Path.Combine(_multilevelDir, "secondary_global"); + var secondary_globalSharedFxBaseDir = Path.Combine(secondary_globalDir, "shared", "Microsoft.NETCore.App"); + + var secondary_globalSelectedMessage = $"The expected {_hostPolicyDllName} directory is [{secondary_globalSharedFxBaseDir}"; + + Directory.CreateDirectory(_globalSharedFxBaseDir); + Directory.CreateDirectory(secondary_globalSharedFxBaseDir); + //Copy dotnet to global directory + File.Copy(Path.Combine(_builtDotnet, $"dotnet{Constants.ExeSuffix}"), Path.Combine(secondary_globalDir, $"dotnet{Constants.ExeSuffix}"), true); + + // Set desired version = 9999.0.0 + string runtimeConfig = Path.Combine(fixture.TestProject.OutputDirectory, "SharedFxLookupPortableApp.runtimeconfig.json"); + SetRuntimeConfigJson(runtimeConfig, "9999.0.0"); + + // Add a dummy version in the exe dir + AddAvailableSharedFxVersions(_globalSharedFxBaseDir, "9999.1.0"); + + // Version: 9999.0.0 + // 'Roll forward on no candidate fx' enabled through env var + // Exe: empty + // Secondary_Global: empty + // Global: 9999.1.0 + // Expected: 9999.1.0 from global dir + dotnet.Exec(appDll) + .WorkingDirectory(_currentWorkingDir) + .WithGlobalLocation(secondary_globalDir) + .WithGlobalLocation(_globalDir) .EnvironmentVariable("DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX", "1") .EnvironmentVariable("COREHOST_TRACE", "1") .CaptureStdOut() @@ -519,9 +616,37 @@ namespace Microsoft.DotNet.CoreSetup.Test.HostActivation.MultilevelSharedFxLooku .Should() .Pass() .And - .HaveStdErrContaining(_exeSelectedMessage); + .HaveStdErrContaining(_globalSelectedMessage); + + // Add a dummy version in the user dir + AddAvailableSharedFxVersions(secondary_globalSharedFxBaseDir, "9999.1.1"); + + // Version: 9999.0.0 + // 'Roll forward on no candidate fx' enabled through env var + // Exe: empty + // Secondary_Global: 9999.1.1 + // Global: 9999.1.0 + // Expected: 9999.1.1 from Secondary_Global dir + dotnet.Exec(appDll) + .WorkingDirectory(_currentWorkingDir) + .WithGlobalLocation(secondary_globalDir) + .WithGlobalLocation(_globalDir) + .EnvironmentVariable("DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX", "1") + .EnvironmentVariable("COREHOST_TRACE", "1") + .CaptureStdOut() + .CaptureStdErr() + .Execute() + .Should() + .Pass() + .And + .HaveStdErrContaining(secondary_globalSelectedMessage); + + // Remove dummy folders from user dir + DeleteAvailableSharedFxVersions(secondary_globalSharedFxBaseDir, "9999.1.1"); + DeleteAvailableSharedFxVersions(_globalSharedFxBaseDir, "9999.1.0"); } + // This method adds a list of new framework version folders in the specified // sharedFxBaseDir. The files are copied from the _buildSharedFxDir. // Remarks: diff --git a/src/installer/test/TestUtils/Command.cs b/src/installer/test/TestUtils/Command.cs index 4ecba53..4f53635 100644 --- a/src/installer/test/TestUtils/Command.cs +++ b/src/installer/test/TestUtils/Command.cs @@ -238,6 +238,42 @@ namespace Microsoft.DotNet.Cli.Build.Framework _process.StartInfo.Environment[userDir] = userprofile; return this; } + public Command SanitizeGlobalLocation() + { + if (RuntimeEnvironment.OperatingSystemPlatform != Platform.Windows) + { + var current_path = _process.StartInfo.Environment["PATH"]; + var new_path = new System.Text.StringBuilder(); + //Remove any global dotnet that has been set + foreach (var sub_path in current_path.Split(Path.PathSeparator)) + { + var candidate = Path.Combine(sub_path, "dotnet"); + if (!File.Exists(candidate)) + { + new_path.Append(sub_path); + new_path.Append(Path.PathSeparator); + } + } + _process.StartInfo.Environment["PATH"] = new_path.ToString(); + } + return this; + } + public Command WithGlobalLocation(string global) + { + + if (RuntimeEnvironment.OperatingSystemPlatform == Platform.Windows) + { + throw new NotImplementedException("Global location override needs work "); + } + else + { + var current_path = _process.StartInfo.Environment["PATH"]; + _process.StartInfo.Environment["PATH"] = current_path + Path.PathSeparator + global; + } + + + return this; + } public Command EnvironmentVariable(string name, string value) { diff --git a/src/installer/test/TestUtils/DotNetCli.cs b/src/installer/test/TestUtils/DotNetCli.cs index bc86133..60b1828 100644 --- a/src/installer/test/TestUtils/DotNetCli.cs +++ b/src/installer/test/TestUtils/DotNetCli.cs @@ -31,7 +31,8 @@ namespace Microsoft.DotNet.Cli.Build } return Command.Create(Path.Combine(BinPath, $"dotnet{Constants.ExeSuffix}"), newArgs) - .EnvironmentVariable("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "1"); + .EnvironmentVariable("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "1") + .SanitizeGlobalLocation(); } public Command Restore(params string[] args) => Exec("restore", args); -- 2.7.4