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);
        }
Esempio n. 2
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);
        }
Esempio n. 3
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);
        }
Esempio n. 4
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));
        }
Esempio n. 5
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));
        }