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