Modifying test for multilevel FX lookup
authorRama Krishnan Raghupathy <ramarag@microsoft.com>
Fri, 19 May 2017 22:53:37 +0000 (15:53 -0700)
committerRama Krishnan Raghupathy <ramarag@microsoft.com>
Tue, 23 May 2017 22:01:09 +0000 (15:01 -0700)
- Remove user profile testing
- add test for multiple global locations for non windows

Commit migrated from https://github.com/dotnet/core-setup/commit/3b00d091c9ba42a140e2b689549fc3b43e12adad

src/installer/test/HostActivationTests/GivenThatICareAboutMultilevelSharedFxLookup.cs
src/installer/test/TestUtils/Command.cs
src/installer/test/TestUtils/DotNetCli.cs

index 5f9c062..0669d75 100644 (file)
@@ -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:
index 4ecba53..4f53635 100644 (file)
@@ -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)
         {
index bc86133..60b1828 100644 (file)
@@ -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);