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