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");

            _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");

            _multilevelDir = SharedFramework.CalculateUniqueTestDirectory(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");
            _globalDir         = Path.Combine(_multilevelDir, "global");

            RepoDirectories = new RepoDirectoriesProvider(builtDotnet: _executableDir);

            // SharedFxBaseDirs contain all available version folders
            _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");

            _cwdSharedUberFxBaseDir    = Path.Combine(_currentWorkingDir, "shared", "Microsoft.UberFramework");
            _userSharedUberFxBaseDir   = Path.Combine(_userDir, ".dotnet", RepoDirectories.BuildArchitecture, "shared", "Microsoft.UberFramework");
            _exeSharedUberFxBaseDir    = Path.Combine(_executableDir, "shared", "Microsoft.UberFramework");
            _globalSharedUberFxBaseDir = Path.Combine(_globalDir, "shared", "Microsoft.UberFramework");

            // 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);
            Directory.CreateDirectory(_globalSharedFxBaseDir);
            Directory.CreateDirectory(_cwdSharedUberFxBaseDir);
            Directory.CreateDirectory(_userSharedUberFxBaseDir);
            Directory.CreateDirectory(_globalSharedUberFxBaseDir);
            SharedFramework.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)
                                                                   .EnsureRestored(RepoDirectories.CorehostPackages)
                                                                   .BuildProject();
            var fixture = PreviouslyBuiltAndRestoredPortableTestProjectFixture;

            // The actual framework version can be obtained from the built fixture. We'll use it to
            // 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);
            _builtSharedUberFxDir = Path.Combine(_builtDotnet, "shared", "Microsoft.UberFramework", _sharedFxVersion);
            SharedFramework.CreateUberFrameworkArtifacts(_builtSharedFxDir, _builtSharedUberFxDir, SystemCollectionsImmutableAssemblyVersion, SystemCollectionsImmutableFileVersion);

            _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}";
            _globalSelectedMessage = $"The expected {_hostPolicyDllName} directory is [{_globalSharedFxBaseDir}";

            _cwdFoundUberFxMessage    = $"Chose FX version [{_cwdSharedUberFxBaseDir}";
            _userFoundUberFxMessage   = $"Chose FX version [{_userSharedUberFxBaseDir}";
            _exeFoundUberFxMessage    = $"Chose FX version [{_exeSharedUberFxBaseDir}";
            _globalFoundUberFxMessage = $"Chose FX version [{_globalSharedUberFxBaseDir}";
        }
        public void Roll_Forward_On_No_Candidate_Fx_Minor_And_Disabled()
        {
            var fixture = PreviouslyBuiltAndRestoredPortableTestProjectFixture
                          .Copy();

            var dotnet = fixture.BuiltDotnet;
            var appDll = fixture.TestProject.AppDll;

            // Set desired version = 9999.0.0
            string runtimeConfig = Path.Combine(fixture.TestProject.OutputDirectory, "SharedFxLookupPortableApp.runtimeconfig.json");

            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "9999.0.0");

            // Add some dummy versions in the exe
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "10000.1.1");

            // Version: 9999.0.0
            // 'Roll forward on no candidate fx' default value of 1 (minor)
            // exe: 10000.1.1
            // Expected: fail with no framework
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute(fExpectedToFail: true)
            .Should()
            .Fail()
            .And
            .HaveStdErrContaining("It was not possible to find any compatible framework version");

            // Add a dummy version in the exe dir
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "9999.1.1");

            // Version: 9999.0.0
            // 'Roll forward on no candidate fx' default value of 1 (minor)
            // exe: 9999.1.1, 10000.1.1
            // Expected: 9999.1.1 from exe
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.1.1"))
            .And
            .HaveStdOutContaining("Framework Version:9999.1.1");

            // Version: 9999.0.0
            // 'Roll forward on no candidate fx' disabled through env var
            // exe: 9999.1.1, 10000.1.1
            // Expected: fail with no framework
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX", "0")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute(fExpectedToFail: true)
            .Should()
            .Fail()
            .And
            .HaveStdErrContaining("It was not possible to find any compatible framework version");

            // Verify we have the expected runtime versions
            dotnet.Exec("--list-runtimes")
            .WorkingDirectory(_currentWorkingDir)
            .CaptureStdOut()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdOutContaining("Microsoft.NETCore.App 9999.1.1")
            .And
            .HaveStdOutContaining("Microsoft.NETCore.App 10000.1.1");
        }
        public void Roll_Forward_On_No_Candidate_Fx_Production_To_Preview()
        {
            var fixture = PreviouslyBuiltAndRestoredPortableTestProjectFixture
                          .Copy();

            var dotnet = fixture.BuiltDotnet;
            var appDll = fixture.TestProject.AppDll;

            // Set desired version = 9999.0.0
            string runtimeConfig = Path.Combine(fixture.TestProject.OutputDirectory, "SharedFxLookupPortableApp.runtimeconfig.json");

            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "9999.0.0");

            // Add preview version in the exe
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "9999.1.1-dummy1");

            // Version: 9999.0.0
            // 'Roll forward on no candidate fx' default value of 1 (minor)
            // exe: 9999.1.1-dummy1
            // Expected: 9999.1.1-dummy1 since there is no production version
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.1.1-dummy1"));

            // Add a production version with higher value
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "9999.2.1");

            // Version: 9999.0.0
            // 'Roll forward on no candidate fx' default value of 1 (minor)
            // exe: 9999.1.1-dummy1, 9999.2.1
            // Expected: 9999.2.1 since we favor production over preview
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.2.1"));

            // Add a preview version with same major.minor as production
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "9999.2.1-dummy1");

            // Version: 9999.0.0
            // 'Roll forward on no candidate fx' default value of 1 (minor)
            // exe: 9999.1.1-dummy1, 9999.2.1, 9999.2.1-dummy1
            // Expected: 9999.2.1 since we favor production over preview
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.2.1"));

            // Add a preview version with same major.minor as production but higher patch version
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "9999.2.2-dummy1");

            // Version: 9999.0.0
            // 'Roll forward on no candidate fx' default value of 1 (minor)
            // exe: 9999.1.1-dummy1, 9999.2.1, 9999.2.1-dummy1, 9999.2.2-dummy1
            // Expected: 9999.2.1 since we favor production over preview
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.2.1"));

            // Verify we have the expected runtime versions
            dotnet.Exec("--list-runtimes")
            .WorkingDirectory(_currentWorkingDir)
            .CaptureStdOut()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdOutContaining("Microsoft.NETCore.App 9999.1.1-dummy1")
            .And
            .HaveStdOutContaining("Microsoft.NETCore.App 9999.2.1")
            .And
            .HaveStdOutContaining("Microsoft.NETCore.App 9999.2.1-dummy1")
            .And
            .HaveStdOutContaining("Microsoft.NETCore.App 9999.2.2-dummy1");
        }
        public void Multiple_SharedFxLookup_Independent_Roll_Forward()
        {
            var fixture = PreviouslyBuiltAndRestoredPortableTestProjectFixture
                          .Copy();

            var dotnet = fixture.BuiltDotnet;
            var appDll = fixture.TestProject.AppDll;

            string runtimeConfig = Path.Combine(fixture.TestProject.OutputDirectory, "SharedFxLookupPortableApp.runtimeconfig.json");

            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "7777.0.0", null, useUberFramework: true);

            // Add versions in the exe folders
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "9999.0.0");
            SharedFramework.AddAvailableSharedUberFxVersions(_builtSharedUberFxDir, _exeSharedUberFxBaseDir, "9999.0.0", "7777.0.0");

            // Version: NetCoreApp 9999.0.0
            //          UberFramework 7777.0.0
            // Exe: NetCoreApp 9999.0.0
            //      UberFramework 7777.0.0
            // Expected: 9999.0.0
            //           7777.0.0
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.0.0"))
            .And
            .HaveStdOutContaining("Framework Version:9999.0.0")
            .And
            .HaveStdErrContaining(Path.Combine(_exeFoundUberFxMessage, "7777.0.0"));

            // Add a newer version to verify roll-forward
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "9999.0.1");
            SharedFramework.AddAvailableSharedUberFxVersions(_builtSharedUberFxDir, _exeSharedUberFxBaseDir, "9999.0.0", "7777.0.1");

            // Version: NetCoreApp 9999.0.0
            //          UberFramework 7777.0.0
            // Exe: NetCoreApp 9999.0.0, 9999.0.1
            //      UberFramework 7777.0.0, 7777.0.1
            // Expected: 9999.0.1
            //           7777.0.1
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.0.1"))
            .And
            .HaveStdErrContaining(Path.Combine(_exeFoundUberFxMessage, "7777.0.1"));

            // Verify we have the expected runtime versions
            dotnet.Exec("--list-runtimes")
            .WorkingDirectory(_currentWorkingDir)
            .WithUserProfile(_userDir)
            .CaptureStdOut()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdOutContaining("Microsoft.NETCore.App 9999.0.0")
            .And
            .HaveStdOutContaining("Microsoft.NETCore.App 9999.0.1")
            .And
            .HaveStdOutContaining("Microsoft.UberFramework 7777.0.0")
            .And
            .HaveStdOutContaining("Microsoft.UberFramework 7777.0.1");
        }
        public void SharedFxLookup_Must_Verify_Folders_in_the_Correct_Order()
        {
            var fixture = PreviouslyBuiltAndRestoredPortableTestProjectFixture
                          .Copy();

            var dotnet = fixture.BuiltDotnet;
            var appDll = fixture.TestProject.AppDll;

            // Set desired version = 9999.0.0
            string runtimeConfig = Path.Combine(fixture.TestProject.OutputDirectory, "SharedFxLookupPortableApp.runtimeconfig.json");

            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "9999.0.0");

            // Add version in the exe dir
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "9999.0.0");

            // Version: 9999.0.0
            // User: empty
            // Exe: 9999.0.0
            // Expected: 9999.0.0 from exe dir
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .WithUserProfile(_userDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(_exeSelectedMessage);

            // Add a dummy version in the user dir
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _userSharedFxBaseDir, "9999.0.0");

            // Version: 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)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .WithUserProfile(_userDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(_exeSelectedMessage);

            // Add a dummy version in the cwd
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _cwdSharedFxBaseDir, "9999.0.0");

            // Version: 9999.0.0
            // CWD: 9999.0.0   --> should not be picked
            // User: 9999.0.0
            // Exe: 9999.0.0
            // Expected: 9999.0.0 from user Exe
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .WithUserProfile(_userDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(_exeSelectedMessage);

            // Verify we have the expected runtime versions
            dotnet.Exec("--list-runtimes")
            .WorkingDirectory(_currentWorkingDir)
            .WithUserProfile(_userDir)
            .CaptureStdOut()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdOutContaining("Microsoft.NETCore.App 9999.0.0");
        }
        public void Roll_Forward_On_No_Candidate_Fx_Preview_To_Production()
        {
            var fixture = PreviouslyBuiltAndRestoredPortableTestProjectFixture
                          .Copy();

            var dotnet = fixture.BuiltDotnet;
            var appDll = fixture.TestProject.AppDll;

            // Set desired version = 9999.0.0-dummy1
            string runtimeConfig = Path.Combine(fixture.TestProject.OutputDirectory, "SharedFxLookupPortableApp.runtimeconfig.json");

            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "9999.0.0-dummy1");

            // Add dummy versions in the exe
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "9999.0.0", "9999.0.1-dummy1");

            // Version: 9999.0.0-dummy1
            // exe: 9999.0.0, 9999.0.1-dummy1
            // Expected: fail since we don't roll forward unless match on major.minor.patch and never roll forward to production
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute(fExpectedToFail: true)
            .Should()
            .Fail()
            .And
            .HaveStdErrContaining("It was not possible to find any compatible framework version");

            // Add preview versions in the exe with name major.minor.patch
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "9999.0.0-dummy2", "9999.0.0-dummy3");

            // Version: 9999.0.0-dummy1
            // exe: 9999.0.0-dummy2, 9999.0.0-dummy3, 9999.0.0, 9999.0.1-dummy1
            // Expected: 9999.0.0-dummy2
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.0.0-dummy2"))
            .And
            .HaveStdOutContaining("Framework Version:9999.0.0-dummy2");

            // Verify we have the expected runtime versions
            dotnet.Exec("--list-runtimes")
            .WorkingDirectory(_currentWorkingDir)
            .CaptureStdOut()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdOutContaining("9999.0.0-dummy2")
            .And
            .HaveStdOutContaining("9999.0.0-dummy3")
            .And
            .HaveStdOutContaining("9999.0.0")
            .And
            .HaveStdOutContaining("9999.0.1-dummy1");
        }
        public void AppHost_GUI_FrameworkDependent_MissingRuntimeFramework_ErrorReportedInDialog(bool missingHostfxr)
        {
            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                // GUI app host is only supported on Windows.
                return;
            }

            var fixture = sharedTestState.PortableAppFixture_Built
                          .Copy();

            string appExe = fixture.TestProject.AppExe;

            File.Copy(sharedTestState.BuiltAppHost, appExe, overwrite: true);
            AppHostExtensions.BindAppHost(appExe);
            AppHostExtensions.SetWindowsGraphicalUserInterfaceBit(appExe);

            string invalidDotNet = SharedFramework.CalculateUniqueTestDirectory(Path.Combine(TestArtifact.TestArtifactsPath, "guiErrors"));

            using (new TestArtifact(invalidDotNet))
            {
                Directory.CreateDirectory(invalidDotNet);

                string expectedErrorCode;
                string expectedUrlQuery;
                string expectedUrlParameter = null;
                if (missingHostfxr)
                {
                    expectedErrorCode    = Constants.ErrorCode.CoreHostLibMissingFailure.ToString("x");
                    expectedUrlQuery     = "missing_runtime=true&";
                    expectedUrlParameter = $"&apphost_version={sharedTestState.RepoDirectories.MicrosoftNETCoreAppVersion}";
                }
                else
                {
                    invalidDotNet = new DotNetBuilder(invalidDotNet, sharedTestState.RepoDirectories.BuiltDotnet, "missingFramework")
                                    .Build()
                                    .BinPath;
                    expectedErrorCode = Constants.ErrorCode.FrameworkMissingFailure.ToString("x");
                    expectedUrlQuery  = $"framework={Constants.MicrosoftNETCoreApp}&framework_version={sharedTestState.RepoDirectories.MicrosoftNETCoreAppVersion}";
                }

                Command command = Command.Create(appExe)
                                  .EnableTracingAndCaptureOutputs()
                                  .DotNetRoot(invalidDotNet)
                                  .MultilevelLookup(false)
                                  .Start();

                WaitForPopupFromProcess(command.Process);
                command.Process.Kill();

                var result = command.WaitForExit(true)
                             .Should().Fail();

                result.And.HaveStdErrContaining($"Showing error dialog for application: '{Path.GetFileName(appExe)}' - error code: 0x{expectedErrorCode}")
                .And.HaveStdErrContaining($"url: 'https://aka.ms/dotnet-core-applaunch?{expectedUrlQuery}")
                .And.HaveStdErrContaining("&gui=true");

                if (expectedUrlParameter != null)
                {
                    result.And.HaveStdErrContaining(expectedUrlParameter);
                }
            }
        }
예제 #8
0
        public void SharedMultilevelFxLookup_Must_Not_Roll_Forward_If_Framework_Version_Is_Specified_Through_Argument()
        {
            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                // Multi-level lookup is only supported on Windows.
                return;
            }

            var fixture = SharedFxLookupPortableAppFixture
                          .Copy();

            var dotnet = fixture.BuiltDotnet;
            var appDll = fixture.TestProject.AppDll;

            // Add some dummy versions
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "9999.0.0", "9999.0.1", "9999.0.0-dummy2", "9999.0.4");
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _regSharedFxBaseDir, "9999.0.0", "9999.0.2", "9999.0.3", "9999.0.0-dummy3");

            // Version: 9999.0.0 (through --fx-version arg)
            // Cwd: empty
            // User: empty
            // Exe: 9999.0.0, 9999.0.1, 9999.0.4, 9999.0.0-dummy2
            // Reg: 9999.0.0, 9999.0.2, 9999.0.3, 9999.0.0-dummy3
            // Expected: 9999.0.1 from exe dir
            dotnet.Exec("--fx-version", "9999.0.1", appDll)
            .WorkingDirectory(_currentWorkingDir)
            .WithUserProfile(_userDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "1")
            .EnvironmentVariable(Constants.TestOnlyEnvironmentVariables.GloballyRegisteredPath, _regDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should().Pass()
            .And.HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.0.1"));

            // Version: 9999.0.0-dummy1 (through --fx-version arg)
            // Cwd: empty
            // User: empty
            // Exe: 9999.0.0, 9999.0.1, 9999.0.4, 9999.0.0-dummy2
            // Reg: 9999.0.0, 9999.0.2, 9999.0.3, 9999.0.0-dummy3
            // Expected: no compatible version
            dotnet.Exec("--fx-version", "9999.0.0-dummy1", appDll)
            .WorkingDirectory(_currentWorkingDir)
            .WithUserProfile(_userDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "1")
            .EnvironmentVariable(Constants.TestOnlyEnvironmentVariables.GloballyRegisteredPath, _regDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute(fExpectedToFail: true)
            .Should().Fail()
            .And.HaveStdErrContaining("It was not possible to find any compatible framework version");

            // Version: 9999.0.0 (through --fx-version arg)
            // Cwd: empty
            // User: empty
            // Exe: 9999.0.0, 9999.0.1, 9999.0.4, 9999.0.0-dummy2
            // Reg: 9999.0.0, 9999.0.2, 9999.0.3, 9999.0.0-dummy3
            // Expected: 9999.0.2 from reg dir
            dotnet.Exec("--fx-version", "9999.0.2", appDll)
            .WorkingDirectory(_currentWorkingDir)
            .WithUserProfile(_userDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "1")
            .EnvironmentVariable(Constants.TestOnlyEnvironmentVariables.GloballyRegisteredPath, _regDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should().Pass()
            .And.HaveStdErrContaining(Path.Combine(_regSelectedMessage, "9999.0.2"));

            // Version: 9999.0.0 (through --fx-version arg)
            // Cwd: empty
            // User: empty
            // Exe: 9999.0.0, 9999.0.1, 9999.0.4, 9999.0.0-dummy2
            // Reg: 9999.0.0, 9999.0.2, 9999.0.3, 9999.0.0-dummy3
            // Expected: 9999.0.0 from exe dir
            dotnet.Exec("--fx-version", "9999.0.0", appDll)
            .WorkingDirectory(_currentWorkingDir)
            .WithUserProfile(_userDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "1")
            .EnvironmentVariable(Constants.TestOnlyEnvironmentVariables.GloballyRegisteredPath, _regDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should().Pass()
            .And.HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.0.0"));

            // Verify we have the expected runtime versions
            dotnet.Exec("--list-runtimes")
            .WorkingDirectory(_currentWorkingDir)
            .WithUserProfile(_userDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "1")
            .EnvironmentVariable(Constants.TestOnlyEnvironmentVariables.GloballyRegisteredPath, _regDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should().Pass()
            .And.HaveStdOutContaining("Microsoft.NETCore.App 9999.0.0")
            .And.HaveStdOutContaining("Microsoft.NETCore.App 9999.0.0-dummy2")
            .And.HaveStdOutContaining("Microsoft.NETCore.App 9999.0.2")
            .And.HaveStdOutContaining("Microsoft.NETCore.App 9999.0.3")
            .And.HaveStdOutContaining("Microsoft.NETCore.App 9999.0.0-dummy3");
        }
예제 #9
0
        public void SharedMultilevelFxLookup_Must_Verify_Folders_in_the_Correct_Order()
        {
            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                // Multi-level lookup is only supported on Windows.
                return;
            }

            var fixture = SharedFxLookupPortableAppFixture
                          .Copy();

            var dotnet = fixture.BuiltDotnet;
            var appDll = fixture.TestProject.AppDll;

            // Set desired version = 9999.0.0
            string runtimeConfig = Path.Combine(fixture.TestProject.OutputDirectory, "SharedFxLookupPortableApp.runtimeconfig.json");

            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "9999.0.0");

            // Add version in the reg dir
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _regSharedFxBaseDir, "9999.0.0");

            // Version: 9999.0.0
            // Cwd: empty
            // User: empty
            // Exe: empty
            // Reg: 9999.0.0
            // Expected: 9999.0.0 from reg dir
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .WithUserProfile(_userDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "1")
            .EnvironmentVariable(Constants.TestOnlyEnvironmentVariables.GloballyRegisteredPath, _regDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should().Pass()
            .And.HaveStdErrContaining(Path.Combine(_regSelectedMessage, "9999.0.0"));

            // Add a dummy version in the user dir
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _userSharedFxBaseDir, "9999.0.0");

            // Version: 9999.0.0
            // Cwd: empty
            // User: 9999.0.0 --> should not be picked
            // Exe: empty
            // Reg: 9999.0.0
            // Expected: 9999.0.0 from reg dir
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .WithUserProfile(_userDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "1")
            .EnvironmentVariable(Constants.TestOnlyEnvironmentVariables.GloballyRegisteredPath, _regDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should().Pass()
            .And.HaveStdErrContaining(Path.Combine(_regSelectedMessage, "9999.0.0"));

            // Add a dummy version in the cwd dir
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _cwdSharedFxBaseDir, "9999.0.0");

            // Version: 9999.0.0
            // Cwd: 9999.0.0    --> should not be picked
            // User: 9999.0.0   --> should not be picked
            // Exe: empty
            // Reg: 9999.0.0
            // Expected: 9999.0.0 from reg dir
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .WithUserProfile(_userDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "1")
            .EnvironmentVariable(Constants.TestOnlyEnvironmentVariables.GloballyRegisteredPath, _regDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should().Pass()
            .And.HaveStdErrContaining(Path.Combine(_regSelectedMessage, "9999.0.0"));

            // Add version in the exe dir
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _exeSharedFxBaseDir, "9999.0.0");

            // Version: 9999.0.0
            // Cwd: 9999.0.0    --> should not be picked
            // User: 9999.0.0   --> should not be picked
            // Exe: 9999.0.0
            // Reg: 9999.0.0
            // Expected: 9999.0.0 from exe dir
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .WithUserProfile(_userDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "1")
            .EnvironmentVariable(Constants.TestOnlyEnvironmentVariables.GloballyRegisteredPath, _regDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should().Pass()
            .And.HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.0.0"));

            // Verify we have the expected runtime versions
            dotnet.Exec("--list-runtimes")
            .WorkingDirectory(_currentWorkingDir)
            .WithUserProfile(_userDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_MULTILEVEL_LOOKUP", "1")
            .EnvironmentVariable(Constants.TestOnlyEnvironmentVariables.GloballyRegisteredPath, _regDir)
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should().Pass()
            .And.HaveStdOutContaining("Microsoft.NETCore.App 9999.0.0");
        }
예제 #10
0
        public void Muxer_activation_of_LightupApp_WithLightupLib_and_Roll_Backwards_From_Release_To_Release_Succeeds()
        {
            var fixtureLib = sharedTestState.LightupLibFixture_Published
                             .Copy();

            var fixtureApp = GlobalLightupClientFixture
                             .Copy();

            var dotnet      = fixtureApp.BuiltDotnet;
            var appDll      = fixtureApp.TestProject.AppDll;
            var libDepsJson = fixtureLib.TestProject.DepsJson;

            // Set desired version = 8888.0.0
            string runtimeConfig = Path.Combine(fixtureApp.TestProject.OutputDirectory, "LightupClient.runtimeconfig.json");

            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "8888.0.0");

            // Add versions in the exe folder
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _fxBaseDir, "8888.0.5");

            CopyLightupLib(fixtureApp, fixtureLib);

            // Create the M.N.App specific folder where lightup.deps.json can be found.
            var baseDir           = fixtureApp.TestProject.ProjectDirectory;
            var customLightupPath = Path.Combine(baseDir, "shared");

            // Delete any existing artifacts
            if (Directory.Exists(customLightupPath))
            {
                Directory.Delete(customLightupPath, true);
            }

            customLightupPath = Path.Combine(customLightupPath, "Microsoft.NETCore.App");

            CreateLightupFolder(customLightupPath, $"8887.0.0", libDepsJson);
            CreateLightupFolder(customLightupPath, $"8888.0.0", libDepsJson);
            CreateLightupFolder(customLightupPath, $"8888.0.4-preview", libDepsJson);

            // Closest backwards patch version (selected)
            CreateLightupFolder(customLightupPath, $"8888.0.4", libDepsJson);
            string selectedLightupPath = Path.Combine(customLightupPath, "8888.0.4");

            CreateLightupFolder(customLightupPath, $"8888.0.9", libDepsJson);
            CreateLightupFolder(customLightupPath, $"8889.0.0", libDepsJson);

            // Version targeted: NetCoreApp 8888.0.0
            // Version existing: NetCoreApp 8888.0.5
            // Lightup folders: 8887.0.0
            //                  8888.0.0
            //                  8888.0.4-preview
            //                  8888.0.4
            //                  8888.0.9
            //                  8889.0.0
            // Expected: 8888.0.4
            dotnet.Exec("exec", "--additional-deps", baseDir, appDll)
            .EnableTracingAndCaptureOutputs()
            .Execute()
            .Should().Pass()
            .And.HaveStdOutContaining("Hello LightupClient")
            .And.HaveStdErrContaining($"Using specified additional deps.json: '{selectedLightupPath}");
        }