public void ItShouldReturnListOfManifestFiles()
        {
            Initialize(nameof(ItShouldReturnListOfManifestFiles));
            NuGetPackageDownloader nuGetPackageDownloader = new NuGetPackageDownloader(new DirectoryPath(_updaterDir),
                                                                                       null,
                                                                                       new MockFirstPartyNuGetPackageSigningVerifier(),
                                                                                       new NullLogger(), restoreActionConfig: new RestoreActionConfig(NoCache: true));

            MockWorkloadResolver    mockWorkloadResolver    = new(Enumerable.Empty <WorkloadResolver.WorkloadInfo>());
            WorkloadManifestUpdater workloadManifestUpdater =
                new WorkloadManifestUpdater(new BufferedReporter(),
                                            mockWorkloadResolver, nuGetPackageDownloader,
                                            _updaterDir, _updaterDir, new MockInstallationRecordRepository());

            string package = DownloadSamplePackage(new PackageId("Microsoft.NET.Workload.Emscripten.Manifest-6.0.100"),
                                                   NuGetVersion.Parse("6.0.0-preview.7.21377.2"), nuGetPackageDownloader);

            workloadManifestUpdater.ExtractManifestPackagesToTempDirAsync(new List <string> {
                package
            },
                                                                          new DirectoryPath(_manifestDirectory)).GetAwaiter().GetResult();

            TempDirectoryWorkloadManifestProvider tempDirectoryWorkloadManifestProvider =
                new TempDirectoryWorkloadManifestProvider(_manifestDirectory, mockWorkloadResolver.GetSdkFeatureBand());
            IEnumerable <(string manifestId, string informationalPath, Func <Stream> openManifestStream, Func <Stream> openLocalizationStream)> manifest =
                tempDirectoryWorkloadManifestProvider.GetManifests();

            manifest.First().manifestId.Should()
            .NotBe("microsoft.net.workload.emscripten.manifest-6.0.100.6.0.0-preview.7.21377.2");
            manifest.First().manifestId.Should()
            .BeEquivalentTo("microsoft.net.workload.emscripten");
        }
        public void GivenWorkloadManifestUpdateItCanUpdateAdvertisingManifests()
        {
            var testDir = _testAssetsManager.CreateTestDirectory().Path;
            var featureBand = "6.0.100";
            var dotnetRoot = Path.Combine(testDir, "dotnet");
            var installedManifests = new ManifestId[] { new ManifestId("test-manifest-1"), new ManifestId("test-manifest-2"), new ManifestId("test-manifest-3") };

            // Write mock manifests
            var installedManifestDir = Path.Combine(testDir, "dotnet", "sdk-manifests", featureBand);
            var adManifestDir = Path.Combine(testDir, ".dotnet", "sdk-advertising", featureBand);
            Directory.CreateDirectory(installedManifestDir);
            Directory.CreateDirectory(adManifestDir);
            foreach (var manifest in installedManifests)
            {
                Directory.CreateDirectory(Path.Combine(installedManifestDir, manifest.ToString()));
                File.WriteAllText(Path.Combine(installedManifestDir, manifest.ToString(), _manifestFileName), GetManifestContent(new ManifestVersion("1.0.0")));
            }

            var manifestDirs = installedManifests
                .Select(manifest => Path.Combine(installedManifestDir, manifest.ToString(), _manifestFileName))
                .ToArray();
            var workloadManifestProvider = new MockManifestProvider(manifestDirs);
            var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot, manifestDownload: true);
            var manifestUpdater = new WorkloadManifestUpdater(_reporter, workloadManifestProvider, nugetDownloader, testDir, testDir);

            manifestUpdater.UpdateAdvertisingManifestsAsync(true).Wait();
            var expectedDownloadedPackages = installedManifests
                .Select(id => ((PackageId, NuGetVersion, DirectoryPath?, PackageSourceLocation))(new PackageId($"{id}.manifest-{featureBand}"), null, null, null));
            nugetDownloader.DownloadCallParams.Should().BeEquivalentTo(expectedDownloadedPackages);
        }
Пример #3
0
 public RestoringCommand(
     IEnumerable <string> msbuildArgs,
     bool noRestore,
     string msbuildPath = null)
     : base(GetCommandArguments(msbuildArgs, noRestore), msbuildPath)
 {
     Task.Run(() => WorkloadManifestUpdater.BackgroundUpdateAdvertisingManifestsAsync());
     SeparateRestoreCommand = GetSeparateRestoreCommand(msbuildArgs, noRestore, msbuildPath);
 }
Пример #4
0
 public RestoringCommand(
     IEnumerable <string> msbuildArgs,
     bool noRestore,
     string msbuildPath            = null,
     string userProfileDir         = null,
     bool advertiseWorkloadUpdates = true)
     : base(GetCommandArguments(msbuildArgs, noRestore), msbuildPath)
 {
     userProfileDir = CliFolderPathCalculator.DotnetUserProfileFolderPath;
     Task.Run(() => WorkloadManifestUpdater.BackgroundUpdateAdvertisingManifestsAsync(userProfileDir));
     SeparateRestoreCommand   = GetSeparateRestoreCommand(msbuildArgs, noRestore, msbuildPath);
     AdvertiseWorkloadUpdates = advertiseWorkloadUpdates;
 }
Пример #5
0
        public void GivenWorkloadManifestUpdateItCanCalculateUpdates()
        {
            var testDir                 = _testAssetsManager.CreateTestDirectory().Path;
            var featureBand             = "6.0.100";
            var dotnetRoot              = Path.Combine(testDir, "dotnet");
            var expectedManifestUpdates = new ManifestVersionUpdate[] {
                new ManifestVersionUpdate(new ManifestId("test-manifest-1"), new ManifestVersion("5.0.0"), featureBand, new ManifestVersion("7.0.0"), featureBand),
                new ManifestVersionUpdate(new ManifestId("test-manifest-2"), new ManifestVersion("3.0.0"), featureBand, new ManifestVersion("4.0.0"), featureBand)
            };
            var expectedManifestNotUpdated = new ManifestId[] { new ManifestId("test-manifest-3"), new ManifestId("test-manifest-4") };

            // Write mock manifests
            var installedManifestDir = Path.Combine(testDir, "dotnet", "sdk-manifests", featureBand);
            var adManifestDir        = Path.Combine(testDir, ".dotnet", "sdk-advertising", featureBand);

            Directory.CreateDirectory(installedManifestDir);
            Directory.CreateDirectory(adManifestDir);
            foreach (ManifestVersionUpdate manifestUpdate in expectedManifestUpdates)
            {
                Directory.CreateDirectory(Path.Combine(installedManifestDir, manifestUpdate.ManifestId.ToString()));
                File.WriteAllText(Path.Combine(installedManifestDir, manifestUpdate.ManifestId.ToString(), _manifestFileName), GetManifestContent(manifestUpdate.ExistingVersion));
                Directory.CreateDirectory(Path.Combine(adManifestDir, manifestUpdate.ManifestId.ToString()));
                File.WriteAllText(Path.Combine(adManifestDir, manifestUpdate.ManifestId.ToString(), _manifestFileName), GetManifestContent(manifestUpdate.NewVersion));
            }
            foreach (var manifest in expectedManifestNotUpdated)
            {
                Directory.CreateDirectory(Path.Combine(installedManifestDir, manifest.ToString()));
                File.WriteAllText(Path.Combine(installedManifestDir, manifest.ToString(), _manifestFileName), GetManifestContent(new ManifestVersion("5.0.0")));
                Directory.CreateDirectory(Path.Combine(adManifestDir, manifest.ToString()));
                File.WriteAllText(Path.Combine(adManifestDir, manifest.ToString(), _manifestFileName), GetManifestContent(new ManifestVersion("5.0.0")));
            }

            var manifestDirs = expectedManifestUpdates.Select(manifest => manifest.ManifestId)
                               .Concat(expectedManifestNotUpdated)
                               .Select(manifest => Path.Combine(installedManifestDir, manifest.ToString(), _manifestFileName))
                               .ToArray();
            var workloadManifestProvider = new MockManifestProvider(manifestDirs);
            var nugetDownloader          = new MockNuGetPackageDownloader(dotnetRoot);
            var workloadResolver         = WorkloadResolver.CreateForTests(workloadManifestProvider, dotnetRoot);
            var installationRepo         = new MockInstallationRecordRepository();
            var manifestUpdater          = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, userProfileDir: Path.Combine(testDir, ".dotnet"), testDir, installationRepo);

            var manifestUpdates = manifestUpdater.CalculateManifestUpdates().Select(m => m.manifestUpdate);

            manifestUpdates.Should().BeEquivalentTo(expectedManifestUpdates);
        }
Пример #6
0
        public override int Execute()
        {
            int exitCode;

            if (SeparateRestoreCommand != null)
            {
                exitCode = SeparateRestoreCommand.Execute();
                if (exitCode != 0)
                {
                    return(exitCode);
                }
            }

            exitCode = base.Execute();
            WorkloadManifestUpdater.AdvertiseWorkloadUpdates();
            return(exitCode);
        }
Пример #7
0
        public void GivenWorkloadManifestRollbackItCanCalculateUpdates()
        {
            var testDir                 = _testAssetsManager.CreateTestDirectory().Path;
            var currentFeatureBand      = "6.0.100";
            var dotnetRoot              = Path.Combine(testDir, "dotnet");
            var expectedManifestUpdates = new ManifestVersionUpdate[] {
                new ManifestVersionUpdate(new ManifestId("test-manifest-1"), new ManifestVersion("5.0.0"), currentFeatureBand, new ManifestVersion("4.0.0"), currentFeatureBand),
                new ManifestVersionUpdate(new ManifestId("test-manifest-2"), new ManifestVersion("3.0.0"), currentFeatureBand, new ManifestVersion("2.0.0"), currentFeatureBand)
            };

            // Write mock manifests
            var installedManifestDir = Path.Combine(testDir, "dotnet", "sdk-manifests", currentFeatureBand);
            var adManifestDir        = Path.Combine(testDir, ".dotnet", "sdk-advertising", currentFeatureBand);

            Directory.CreateDirectory(installedManifestDir);
            Directory.CreateDirectory(adManifestDir);
            foreach (var manifestUpdate in expectedManifestUpdates)
            {
                Directory.CreateDirectory(Path.Combine(installedManifestDir, manifestUpdate.ManifestId.ToString()));
                File.WriteAllText(Path.Combine(installedManifestDir, manifestUpdate.ManifestId.ToString(), _manifestFileName), GetManifestContent(manifestUpdate.ExistingVersion));
            }

            var rollbackDefContent = JsonSerializer.Serialize(new Dictionary <string, string>()
            {
                { "test-manifest-1", "4.0.0" }, { "test-manifest-2", "2.0.0" }
            });
            var rollbackDefPath = Path.Combine(testDir, "testRollbackDef.txt");

            File.WriteAllText(rollbackDefPath, rollbackDefContent);

            var manifestDirs = expectedManifestUpdates.Select(manifest => manifest.ManifestId)
                               .Select(manifest => Path.Combine(installedManifestDir, manifest.ToString(), _manifestFileName))
                               .ToArray();
            var workloadManifestProvider = new MockManifestProvider(manifestDirs);
            var nugetDownloader          = new MockNuGetPackageDownloader(dotnetRoot);
            var workloadResolver         = WorkloadResolver.CreateForTests(workloadManifestProvider, dotnetRoot);
            var installationRepo         = new MockInstallationRecordRepository();
            var manifestUpdater          = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, testDir, testDir, installationRepo);

            var manifestUpdates = manifestUpdater.CalculateManifestRollbacks(rollbackDefPath);

            manifestUpdates.Should().BeEquivalentTo(expectedManifestUpdates);
        }
Пример #8
0
        public void GivenNoUpdatesAreAvailableAndNoRollbackItGivesAppropriateMessage(bool useOfflineCache)
        {
            //  Currently installed - none
            //  Current SDK - 6.0.300
            //  Run update
            //  Should not find 6.0.300 manifest
            //  Should not rollback
            //  Manifest updater should give appropriate message

            //  Arrange
            string sdkFeatureBand = "6.0.300";
            var    testDir        = _testAssetsManager.CreateTestDirectory().Path;
            var    dotnetRoot     = Path.Combine(testDir, "dotnet");

            var emptyInstalledManifestsDir = Path.Combine(dotnetRoot, "sdk-manifests", "6.0.300");

            Directory.CreateDirectory(emptyInstalledManifestsDir);

            var adManifestDir = Path.Combine(testDir, ".dotnet", "sdk-advertising", sdkFeatureBand);

            Directory.CreateDirectory(adManifestDir);

            string testManifestName = "test-manifest";

            Directory.CreateDirectory(Path.Combine(emptyInstalledManifestsDir, testManifestName));
            File.WriteAllText(Path.Combine(emptyInstalledManifestsDir, testManifestName, _manifestFileName), GetManifestContent(new ManifestVersion("1.0.0")));

            var workloadManifestProvider = new MockManifestProvider(Path.Combine(emptyInstalledManifestsDir, testManifestName, _manifestFileName))
            {
                SdkFeatureBand = new SdkFeatureBand(sdkFeatureBand)
            };

            var workloadResolver = WorkloadResolver.CreateForTests(workloadManifestProvider, dotnetRoot);
            var nugetDownloader  = new MockNuGetPackageDownloader(dotnetRoot, manifestDownload: true);
            var installationRepo = new MockInstallationRecordRepository();
            var manifestUpdater  = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, Path.Combine(testDir, ".dotnet"), testDir, installationRepo);

            var offlineCacheDir = "";

            if (useOfflineCache)
            {
                offlineCacheDir = Path.Combine(testDir, "offlineCache");
                Directory.CreateDirectory(offlineCacheDir);             // empty dir because it shouldn't find any manifests to update

                manifestUpdater.UpdateAdvertisingManifestsAsync(includePreviews: true, offlineCache: new DirectoryPath(offlineCacheDir)).Wait();
            }
            else
            {
                nugetDownloader.PackageIdsToNotFind.Add($"{testManifestName}.Manifest-6.0.300");

                manifestUpdater.UpdateAdvertisingManifestsAsync(includePreviews: true).Wait();


                // only 6.0.300 manifest was requested
                // we can't assert this for the offline cache
                nugetDownloader.DownloadCallParams[0].id.ToString().Should().Be($"{testManifestName}.manifest-6.0.300");
                nugetDownloader.DownloadCallParams[0].version.ShouldBeEquivalentTo(null);
            }

            //  Assert
            //  Check nothing was written to advertising manifest folder
            Directory.GetFiles(adManifestDir).Should().BeEmpty();

            _reporter.Lines.Should().NotContain(l => l.ToLowerInvariant().Contains("fail"));
            _reporter.Lines.Should().Contain(String.Format(Workloads.Workload.Install.LocalizableStrings.AdManifestPackageDoesNotExist, testManifestName));
        }
Пример #9
0
        public void ItCanFallbackAndAdvertiseCorrectUpdate(bool useOfflineCache)
        {
            //  Currently installed - 6.0.200 workload manifest
            //  Current SDK - 6.0.300
            //  Run update
            //  Should not find 6.0.300 manifest
            //  Should fall back to 6.0.200 manifest and advertise it

            //  Arrange
            string sdkFeatureBand = "6.0.300";
            var    testDir        = _testAssetsManager.CreateTestDirectory(identifier: useOfflineCache.ToString()).Path;
            var    dotnetRoot     = Path.Combine(testDir, "dotnet");
            var    installedManifestDir6_0_200 = Path.Combine(dotnetRoot, "sdk-manifests", "6.0.200");

            Directory.CreateDirectory(installedManifestDir6_0_200);
            var adManifestDir = Path.Combine(testDir, ".dotnet", "sdk-advertising", sdkFeatureBand);

            Directory.CreateDirectory(adManifestDir);

            //  Write installed test-manifest with feature band 6.0.200
            string testManifestName = "test-manifest";

            Directory.CreateDirectory(Path.Combine(installedManifestDir6_0_200, testManifestName));
            File.WriteAllText(Path.Combine(installedManifestDir6_0_200, testManifestName, _manifestFileName), GetManifestContent(new ManifestVersion("1.0.0")));

            var workloadManifestProvider = new MockManifestProvider(Path.Combine(installedManifestDir6_0_200, testManifestName, _manifestFileName))
            {
                SdkFeatureBand = new SdkFeatureBand(sdkFeatureBand)
            };

            var workloadResolver = WorkloadResolver.CreateForTests(workloadManifestProvider, dotnetRoot);
            var nugetDownloader  = new MockNuGetPackageDownloader(dotnetRoot, manifestDownload: true);

            nugetDownloader.PackageIdsToNotFind.Add($"{testManifestName}.Manifest-6.0.300");
            var installationRepo = new MockInstallationRecordRepository();
            var manifestUpdater  = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, Path.Combine(testDir, ".dotnet"), testDir, installationRepo);

            var offlineCacheDir = "";

            if (useOfflineCache)
            {
                offlineCacheDir = Path.Combine(testDir, "offlineCache");
                Directory.CreateDirectory(offlineCacheDir);
                File.Create(Path.Combine(offlineCacheDir, $"{testManifestName}.Manifest-6.0.200.nupkg"));

                manifestUpdater.UpdateAdvertisingManifestsAsync(includePreviews: true, offlineCache: new DirectoryPath(offlineCacheDir)).Wait();
            }
            else
            {
                nugetDownloader.PackageIdsToNotFind.Add($"{testManifestName}.Manifest-6.0.300");

                manifestUpdater.UpdateAdvertisingManifestsAsync(includePreviews: true).Wait();

                //  Assert
                //  6.0.300 manifest was requested and then 6.0.200 manifest was requested
                // we can't assert this for the offline cache
                nugetDownloader.DownloadCallParams[0].id.ToString().Should().Be($"{testManifestName}.manifest-6.0.300");
                nugetDownloader.DownloadCallParams[0].version.ShouldBeEquivalentTo(null);
                nugetDownloader.DownloadCallParams[1].id.ToString().Should().Be($"{testManifestName}.manifest-6.0.200");
                nugetDownloader.DownloadCallParams[1].version.ShouldBeEquivalentTo(null);
                nugetDownloader.DownloadCallParams.Count.Should().Be(2);
            }

            //  6.0.200 package was written to advertising manifest folder
            var advertisedManifestContents = File.ReadAllText(Path.Combine(adManifestDir, testManifestName, "WorkloadManifest.json"));

            advertisedManifestContents.Should().NotBeEmpty();

            //  AdvertisedManifestFeatureBand.txt file is set to 6.0.200
            var savedFeatureBand = File.ReadAllText(Path.Combine(adManifestDir, testManifestName, "AdvertisedManifestFeatureBand.txt"));

            savedFeatureBand.Should().Be("6.0.200");

            // check that update did not fail
            _reporter.Lines.Should().NotContain(l => l.ToLowerInvariant().Contains("fail"));
            _reporter.Lines.Should().NotContain(String.Format(Workloads.Workload.Install.LocalizableStrings.AdManifestPackageDoesNotExist, testManifestName));
        }