Exemple #1
0
        public void SharedFx_With_Higher_Version_Wins_Against_Additional_Deps()
        {
            var fixture = GlobalLightupClientFixture
                          .Copy();

            var fixtureLib = sharedTestState.LightupLibFixture_Published
                             .Copy();

            CopyLightupLib(fixture, fixtureLib);

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

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

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

            // Add versions in the exe folder
            SharedFramework.AddAvailableSharedFxVersions(_builtSharedFxDir, _fxBaseDir, "9999.0.0");
            SharedFramework.AddAvailableSharedUberFxVersions(_builtSharedUberFxDir, _uberFxBaseDir, "9999.0.0", "7777.0.0");

            // Copy NetCoreApp's copy of the assembly to the app location
            string netcoreAssembly = Path.Combine(_fxBaseDir, "9999.0.0", "System.Collections.Immutable.dll");
            string appAssembly     = Path.Combine(fixture.TestProject.OutputDirectory, "System.Collections.Immutable.dll");

            File.Copy(netcoreAssembly, appAssembly);

            // Create a deps.json file in the folder "additionalDeps\shared\Microsoft.NETCore.App\9999.0.0"
            string  additionalDepsRootPath = Path.Combine(_fxBaseDir, "additionalDeps");
            JObject versionInfo            = new JObject();

            versionInfo.Add(new JProperty("assemblyVersion", "0.0.0.1"));
            versionInfo.Add(new JProperty("fileVersion", "0.0.0.2"));
            string additionalDepsPath = CreateAdditionalDeps(additionalDepsRootPath, versionInfo);

            // Version: NetCoreApp 9999.0.0
            //          UberFramework 7777.0.0
            // Existing:NetCoreApp 9999.0.0
            //          UberFramework 7777.0.0
            // Expected: 9999.0.0
            //           7777.0.0
            // Expected: the uber framework's version of System.Collections.Immutable is used instead of the additional-deps
            string uberAssembly = Path.Combine(_uberFxBaseDir, "7777.0.0", "System.Collections.Immutable.dll");

            dotnet.Exec("exec", "--additional-deps", additionalDepsPath, appDll)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should().Pass()
            .And.HaveStdErrContaining($"Using specified additional deps.json: '{additionalDepsPath}'")
            .And.HaveStdErrContaining($"Adding tpa entry: {uberAssembly}")
            .And.HaveStdErrContaining($"Adding tpa entry: {appAssembly}")
            .And.HaveStdErrContaining($"Replacing deps entry [{appAssembly}")
            .And.HaveStdErrContaining($"with [{uberAssembly}, AssemblyVersion:{SystemCollectionsImmutableAssemblyVersion}, FileVersion:{SystemCollectionsImmutableFileVersion}]")
            // Verify final selection in TRUSTED_PLATFORM_ASSEMBLIES
            .And.HaveStdErrContaining($"{uberAssembly}{Path.PathSeparator}")
            .And.NotHaveStdErrContaining($"{appAssembly}{Path.PathSeparator}");
        }
Exemple #2
0
        public void Multiple_SharedFxLookup_Uber_Wins_Over_NetCoreApp_On_PatchRollForward()
        {
            var fixture = SharedFxLookupPortableAppFixture
                          .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.1");
            SharedFramework.AddAvailableSharedUberFxVersions(_builtSharedUberFxDir, _exeSharedUberFxBaseDir, "9999.0.0", "7777.0.0");

            // The System.Collections.Immutable.dll is located in the UberFramework and NetCoreApp
            // Version: NetCoreApp 9999.0.0
            //          UberFramework 7777.0.0
            //          'Roll forward on no candidate fx' enabled through config
            // Exe: NetCoreApp 9999.0.1
            //      UberFramework 7777.0.0
            // Expected: 9999.0.1
            //           7777.0.0
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should().Pass()
            .And.HaveStdErrContaining(Path.Combine("7777.0.0", "System.Collections.Immutable.dll"))
            .And.NotHaveStdErrContaining(Path.Combine("9999.1.0", "System.Collections.Immutable.dll"));
        }
        public void SharedFx_With_Higher_Version_Wins_Against_App_On_NoRollForward()
        {
            var fixture = PreviouslyBuiltAndRestoredPortableTestProjectFixture
                          .Copy();

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

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

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

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

            // Copy NetCoreApp's copy of the assembly to the app location
            string netcoreAssembly = Path.Combine(_exeSharedFxBaseDir, "9999.0.0", "System.Collections.Immutable.dll");
            string appAssembly     = Path.Combine(fixture.TestProject.OutputDirectory, "System.Collections.Immutable.dll");

            File.Copy(netcoreAssembly, appAssembly);

            // Modify the app's deps.json to add System.Collections.Immmutable
            string appDepsJson = Path.Combine(fixture.TestProject.OutputDirectory, "SharedFxLookupPortableApp.deps.json");
            // Use lower numbers for the app
            JObject versionInfo = new JObject();

            versionInfo.Add(new JProperty("assemblyVersion", "0.0.0.1"));
            versionInfo.Add(new JProperty("fileVersion", "0.0.0.2"));
            SharedFramework.AddReferenceToDepsJson(appDepsJson, "SharedFxLookupPortableApp/1.0.0", "System.Collections.Immutable", "1.0.0", versionInfo);

            // 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
            // Expected: the framework's version of System.Collections.Immutable is used
            string uberAssembly = Path.Combine(_exeSharedUberFxBaseDir, "7777.0.0", "System.Collections.Immutable.dll");

            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining($"Adding tpa entry: {uberAssembly}, AssemblyVersion: {SystemCollectionsImmutableAssemblyVersion}, FileVersion: {SystemCollectionsImmutableFileVersion}")
            .And
            // Verify final selection in TRUSTED_PLATFORM_ASSEMBLIES
            .HaveStdErrContaining($"{uberAssembly}{Path.PathSeparator}")
            .And
            .NotHaveStdErrContaining($"{netcoreAssembly}{Path.PathSeparator}")
            .And
            .NotHaveStdErrContaining($"{appAssembly}{Path.PathSeparator}");
        }
Exemple #4
0
        public void Multiple_SharedFxLookup_Do_Not_Propagate()
        {
            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.1.0");
            SharedFramework.AddAvailableSharedUberFxVersions(_builtSharedUberFxDir, _exeSharedUberFxBaseDir, "9999.0.0", "7777.0.0");

            // Version: NetCoreApp 9999.0.0
            //          UberFramework 7777.0.0
            // 'Roll forward on no candidate fx' disabled through env var
            // Exe: NetCoreApp 9999.1.0
            //      UberFramework 7777.0.0
            // Expected: no compatible version
            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");

            // Enable rollForwardOnNoCandidateFx on app's config, which will not be used as the default for Uber's config
            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "7777.0.0", rollFwdOnNoCandidateFx: 1, useUberFramework: true);

            // Version: NetCoreApp 9999.0.0
            //          UberFramework 7777.0.0
            //          'Roll forward on no candidate fx' enabled through config
            // Exe: NetCoreApp 9999.1.0
            //      UberFramework 7777.0.0
            // Expected: no compatible version
            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");
        }
Exemple #5
0
        public void Multiple_Fx_References_Can_Roll_Forward_With_Retry()
        {
            var fixture = PreviouslyBuiltAndRestoredPortableTestProjectFixture
                          .Copy();

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

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

            var additionalfxs = new JArray();

            additionalfxs.Add(GetAdditionalFramework("Microsoft.UberFramework", "7777.0.0", null, null));
            // Specify Uber as additional fx so we find NetCoreApp 9999.1.1 and then need to do a re-try for 9999.5.5
            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "9999.1.1", null, null, frameworks: additionalfxs);

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

            // Version: NetCoreApp 9999.1.1 (in framework section)
            //          UberFramework 7777.0.0 (in frameworks section)
            //          NetCoreApp 9999.5.5 (in uber's config)
            // Exe: NetCoreApp 9999.1.1
            //      NetCoreApp 9999.5.5
            //      UberFramework 7777.0.0
            // Expected: 9999.5.5
            //           7777.0.0
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.5.5"))
            .And
            .HaveStdOutContaining("Framework Version:9999.5.5")
            .And
            .HaveStdErrContaining(Path.Combine(_exeFoundUberFxMessage, "7777.0.0"))
            .And
            .HaveStdErrContaining("Restarting all framework resolution because the previously resolved framework 'Microsoft.NETCore.App', version '9999.1.1' must be re-resolved with the new version '9999.5.5'");
        }
Exemple #6
0
        public void Multiple_Fx_References_Can_Roll_Forward_Without_Retry()
        {
            var fixture = PreviouslyBuiltAndRestoredPortableTestProjectFixture
                          .Copy();

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

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

            var additionalfxs = new JArray();

            additionalfxs.Add(GetAdditionalFramework("Microsoft.NETCore.App", "9999.1.1", applyPatches: false, rollForwardOnNoCandidateFx: 1));
            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "7777.0.0", null, useUberFramework: true, frameworks: additionalfxs);

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

            // Version: NetCoreApp 9999.5.5 (in framework section)
            //          NetCoreApp 9999.1.0 (in frameworks section)
            //          UberFramework 7777.0.0
            // Exe: NetCoreApp 9999.1.0 rollForwardOnNoCandidateFx:1 applyPatches:false
            //      NetCoreApp 9999.5.5
            //      UberFramework 7777.0.0
            // Expected: 9999.5.5
            //           7777.0.0
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.5.5"))
            .And
            .HaveStdOutContaining("Framework Version:9999.5.5")
            .And
            .HaveStdErrContaining(Path.Combine(_exeFoundUberFxMessage, "7777.0.0"))
            .And
            .NotHaveStdErrContaining("Restarting all framework resolution");
        }
Exemple #7
0
        public void Multiple_Fx_References_Cant_Roll_Forward_Because_Disabled_Through_CommandLine()
        {
            var fixture = SharedFxLookupPortableAppFixture
                          .Copy();

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

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

            var additionalfxs = new JArray
            {
                GetAdditionalFramework("Microsoft.NETCore.App", "9999.1.1", applyPatches: false, rollForwardOnNoCandidateFx: 1)
            };

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

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

            // Version: NetCoreApp 9999.5.5 (in framework section)
            //          NetCoreApp 9999.1.0 (in frameworks section)
            //          UberFramework 7777.0.0
            // Exe: NetCoreApp 9999.1.0 rollForwardOnNoCandidateFx:1 applyPatches:false
            //      NetCoreApp 9999.5.5
            //      UberFramework 7777.0.0
            // --roll-forward-on-no-candidate-fx=0 should override config settings
            // Expected: 9999.5.5
            //           7777.0.0

            dotnet.Exec(
                "exec",
                "--roll-forward-on-no-candidate-fx", "0",
                appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute(fExpectedToFail: true)
            .Should().Fail()
            .And.HaveStdErrContaining("cannot roll-forward to the previously referenced version '9999.5.5");
        }
Exemple #8
0
        public void Multiple_SharedFxLookup_NetCoreApp_MinorRollForward_Wins_Over_UberFx()
        {
            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);

            // Modify the Uber values
            SharedFramework.CreateUberFrameworkArtifacts(_builtSharedFxDir, _builtSharedUberFxDir, "0.0.0.1", "0.0.0.2");

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

            string uberFile       = Path.Combine(_exeSharedUberFxBaseDir, "7777.0.0", "System.Collections.Immutable.dll");
            string netCoreAppFile = Path.Combine(_exeSharedFxBaseDir, "9999.1.0", "System.Collections.Immutable.dll");

            // The System.Collections.Immutable.dll is located in the UberFramework and NetCoreApp
            // Version: NetCoreApp 9999.0.0
            //          UberFramework 7777.0.0
            //          'Roll forward on no candidate fx' enabled through config
            // Exe: NetCoreApp 9999.1.0
            //      UberFramework 7777.0.0
            // Expected: 9999.1.0
            //           7777.0.0
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining($"Replacing deps entry [{uberFile}, AssemblyVersion:0.0.0.1, FileVersion:0.0.0.2] with [{netCoreAppFile}");
        }
        private TestProjectFixture ConfigureAppAndFrameworks(string appAssemblyVersion, string uberFxAssemblyVersion, string uberFxProductVersion, out string appAssembly, out string uberAssembly, out string netcoreAssembly)
        {
            const string fileVersion = "0.0.0.9";
            var          fixture     = SharedFxLookupPortableAppFixture
                                       .Copy();

            if (!string.IsNullOrEmpty(uberFxAssemblyVersion))
            {
                // Modify Uber Fx's deps.json
                SharedFramework.CreateUberFrameworkArtifacts(_builtSharedFxDir, _builtSharedUberFxDir, uberFxAssemblyVersion, fileVersion);
            }

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

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

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

            // Copy NetCoreApp's copy of the assembly to the app location
            netcoreAssembly = Path.Combine(_exeSharedFxBaseDir, "9999.0.0", "System.Collections.Immutable.dll");
            appAssembly     = Path.Combine(fixture.TestProject.OutputDirectory, "System.Collections.Immutable.dll");
            File.Copy(netcoreAssembly, appAssembly);

            // Modify the app's deps.json to add System.Collections.Immmutable
            string  appDepsJson = Path.Combine(fixture.TestProject.OutputDirectory, "SharedFxLookupPortableApp.deps.json");
            JObject versionInfo = new JObject();

            versionInfo.Add(new JProperty("assemblyVersion", appAssemblyVersion));
            versionInfo.Add(new JProperty("fileVersion", fileVersion));
            SharedFramework.AddReferenceToDepsJson(appDepsJson, "SharedFxLookupPortableApp/1.0.0", "System.Collections.Immutable", "1.0.0", versionInfo);

            uberAssembly = Path.Combine(_exeSharedUberFxBaseDir, uberFxProductVersion, "System.Collections.Immutable.dll");

            return(fixture);
        }
Exemple #10
0
        public void Multiple_Fx_References_Cant_Roll_Forward_Because_Incompatible_Config()
        {
            var fixture = PreviouslyBuiltAndRestoredPortableTestProjectFixture
                          .Copy();

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

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

            var additionalfxs = new JArray();

            additionalfxs.Add(GetAdditionalFramework("Microsoft.NETCore.App", "9999.1.0", applyPatches: false, rollForwardOnNoCandidateFx: 0));
            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "7777.0.0", null, useUberFramework: true, frameworks: additionalfxs);

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

            // Verify that both 9999.1.0 and 9999.5.5 can't be selected with roll-forward disabled
            // Version: NetCoreApp 9999.5.5 (in framework section)
            //          NetCoreApp 9999.1.0 (in frameworks section)
            //          UberFramework 7777.0.0
            // Exe: NetCoreApp 9999.1.0 rollForwardOnNoCandidateFx:0 applyPatches:false
            //      NetCoreApp 9999.5.5
            //      UberFramework 7777.0.0
            // Expected: no compatible version
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute(fExpectedToFail: true)
            .Should()
            .Fail()
            .And
            .HaveStdErrContaining("cannot roll-forward to the previously referenced version '9999.5.5");
        }
        public void Multiple_SharedFxLookup_Propagated_Additional_Framework_RuntimeConfig_Values()
        {
            var fixture = PreviouslyBuiltAndRestoredPortableTestProjectFixture
                          .Copy();

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

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

            var additionalfxs = new JArray();

            additionalfxs.Add(GetAdditionalFramework("Microsoft.NETCore.App", "9999.1.0", applyPatches: false, rollForwardOnNoCandidateFx: 0));
            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "7777.0.0", null, useUberFramework: true, additionalFrameworks: additionalfxs);

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

            // Version: NetCoreApp 9999.5.5 (in framework section)
            //          NetCoreApp 9999.1.0 (in app's additionalFrameworks section)
            //          UberFramework 7777.0.0
            // Exe: NetCoreApp 9999.1.0
            //      UberFramework 7777.0.0
            // Expected: 9999.1.0
            //           7777.0.0
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.1.0"))
            .And
            .HaveStdErrContaining(Path.Combine(_exeFoundUberFxMessage, "7777.0.0"));

            // Change the additionalFrameworks to allow roll forward, overriding Uber's global section and ignoring Uber's framework section
            additionalfxs.Clear();
            additionalfxs.Add(GetAdditionalFramework("Microsoft.NETCore.App", "9999.0.0", applyPatches: false, rollForwardOnNoCandidateFx: 1));
            additionalfxs.Add(GetAdditionalFramework("UberFx", "7777.0.0", applyPatches: false, rollForwardOnNoCandidateFx: 0));
            SharedFramework.SetRuntimeConfigJson(runtimeConfig, "7777.0.0", rollFwdOnNoCandidateFx: 0, useUberFramework: true, additionalFrameworks: additionalfxs);

            // Version: NetCoreApp 9999.5.5 (in framework section)
            //          NetCoreApp 9999.0.0 (in app's additionalFrameworks section)
            //          UberFramework 7777.0.0
            //          UberFramework 7777.0.0 (in app's additionalFrameworks section)
            // 'Roll forward on no candidate fx' disabled through env var
            // 'Roll forward on no candidate fx' disabled through Uber's global runtimeconfig
            // 'Roll forward on no candidate fx' enabled for NETCore.App enabled through additionalFrameworks section
            // Exe: NetCoreApp 9999.1.0
            //      UberFramework 7777.0.0
            // Expected: 9999.1.0
            //           7777.0.0
            dotnet.Exec(appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX", "0")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute()
            .Should()
            .Pass()
            .And
            .HaveStdErrContaining(Path.Combine(_exeSelectedMessage, "9999.1.0"))
            .And
            .HaveStdErrContaining(Path.Combine(_exeFoundUberFxMessage, "7777.0.0"));

            // Same as previous except use of '--roll-forward-on-no-candidate-fx'
            // Expected: Fail since '--roll-forward-on-no-candidate-fx' should apply to all layers
            dotnet.Exec(
                "exec",
                "--roll-forward-on-no-candidate-fx", "0",
                appDll)
            .WorkingDirectory(_currentWorkingDir)
            .EnvironmentVariable("COREHOST_TRACE", "1")
            .EnvironmentVariable("DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX", "1")
            .CaptureStdOut()
            .CaptureStdErr()
            .Execute(fExpectedToFail: true)
            .Should()
            .Fail()
            .And
            .HaveStdErrContaining("It was not possible to find any compatible framework version");
        }
        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", null, "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
            .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", null, "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");
        }