diff --git a/src/Cli/dotnet/commands/InstallingWorkloadCommand.cs b/src/Cli/dotnet/commands/InstallingWorkloadCommand.cs index 8f8f2295333b..97af927d1055 100644 --- a/src/Cli/dotnet/commands/InstallingWorkloadCommand.cs +++ b/src/Cli/dotnet/commands/InstallingWorkloadCommand.cs @@ -176,7 +176,7 @@ static InstallStateContents GetCurrentInstallState(SdkFeatureBand sdkFeatureBand public static bool ShouldUseWorkloadSetMode(SdkFeatureBand sdkFeatureBand, string dotnetDir) { - return GetCurrentInstallState(sdkFeatureBand, dotnetDir).UseWorkloadSets ?? false; + return GetCurrentInstallState(sdkFeatureBand, dotnetDir).ShouldUseWorkloadSets(); } protected void UpdateWorkloadManifests(WorkloadHistoryRecorder recorder, ITransactionContext context, DirectoryPath? offlineCache) diff --git a/src/Cli/dotnet/commands/dotnet-workload/InstallStateContents.cs b/src/Cli/dotnet/commands/dotnet-workload/InstallStateContents.cs index b625067712d3..146545c33163 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/InstallStateContents.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/InstallStateContents.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.ComponentModel; using System.Text.Json; using System.Text.Json.Serialization; @@ -11,6 +12,7 @@ namespace Microsoft.DotNet.Workloads.Workload internal class InstallStateContents { [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + [EditorBrowsable(EditorBrowsableState.Never)] public bool? UseWorkloadSets { get; set; } [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] @@ -40,6 +42,8 @@ public override string ToString() { return JsonSerializer.Serialize(this, s_options); } + + public bool ShouldUseWorkloadSets() => UseWorkloadSets ?? true; } } diff --git a/src/Cli/dotnet/commands/dotnet-workload/WorkloadCommandParser.cs b/src/Cli/dotnet/commands/dotnet-workload/WorkloadCommandParser.cs index 3234ee07b86b..40da9af6295d 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/WorkloadCommandParser.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/WorkloadCommandParser.cs @@ -53,8 +53,8 @@ internal static void ShowWorkloadsInfo(ParseResult parseResult = null, WorkloadI void WriteUpdateModeAndAnyError(string indent = "") { - var useWorkloadSets = InstallStateContents.FromPath(Path.Combine(WorkloadInstallType.GetInstallStateFolder(workloadInfoHelper._currentSdkFeatureBand, workloadInfoHelper.UserLocalPath), "default.json")).UseWorkloadSets; - var workloadSetsString = useWorkloadSets == true ? "workload sets" : "loose manifests"; + var useWorkloadSets = InstallStateContents.FromPath(Path.Combine(WorkloadInstallType.GetInstallStateFolder(workloadInfoHelper._currentSdkFeatureBand, workloadInfoHelper.UserLocalPath), "default.json")).ShouldUseWorkloadSets(); + var workloadSetsString = useWorkloadSets ? "workload sets" : "loose manifests"; reporter.WriteLine(indent + string.Format(CommonStrings.WorkloadManifestInstallationConfiguration, workloadSetsString)); if (!versionInfo.IsInstalled) diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs index 9a2b0098c9d4..fe21f4407497 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs @@ -128,7 +128,7 @@ public static bool ShouldUseWorkloadSetMode(SdkFeatureBand sdkFeatureBand, strin { string path = Path.Combine(WorkloadInstallType.GetInstallStateFolder(sdkFeatureBand, dotnetDir), "default.json"); var installStateContents = File.Exists(path) ? InstallStateContents.FromString(File.ReadAllText(path)) : new InstallStateContents(); - return installStateContents.UseWorkloadSets ?? false; + return installStateContents.ShouldUseWorkloadSets(); } private void WriteUpdatableWorkloadsFile() diff --git a/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs index 813306288560..2a320f18ddf7 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs @@ -78,7 +78,7 @@ public override int Execute() Reporter.WriteLine(); var shouldPrintTable = versionInfo.IsInstalled; var shouldShowWorkloadSetVersion = versionInfo.GlobalJsonPath is not null || - InstallStateContents.FromPath(Path.Combine(WorkloadInstallType.GetInstallStateFolder(_workloadListHelper._currentSdkFeatureBand, _workloadListHelper.UserLocalPath), "default.json")).UseWorkloadSets == true; + InstallStateContents.FromPath(Path.Combine(WorkloadInstallType.GetInstallStateFolder(_workloadListHelper._currentSdkFeatureBand, _workloadListHelper.UserLocalPath), "default.json")).ShouldUseWorkloadSets(); if (shouldShowWorkloadSetVersion) { diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs index d0062b2b7dd1..3f912c5a3591 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs @@ -199,7 +199,7 @@ bool TryGetWorkloadSet(string workloadSetVersion, out WorkloadSet? workloadSet) _manifestsFromInstallState = installState.Manifests is null ? null : WorkloadSet.FromDictionaryForJson(installState.Manifests!, _sdkVersionBand); } - if (workloadSet == null && installState.UseWorkloadSets == true && availableWorkloadSets.Any()) + if (workloadSet == null && installState.ShouldUseWorkloadSets() && availableWorkloadSets.Any()) { var maxWorkloadSetVersion = availableWorkloadSets.Keys.Aggregate((s1, s2) => VersionCompare(s1, s2) >= 0 ? s1 : s2); workloadSet = availableWorkloadSets[maxWorkloadSetVersion.ToString()]; @@ -278,7 +278,7 @@ public WorkloadVersionInfo GetWorkloadVersion() sb.Append(bytes[b].ToString("x2")); } - return new WorkloadVersionInfo($"{_sdkVersionBand.ToStringWithoutPrerelease()}-manifests.{sb}", IsInstalled: true, WorkloadSetsEnabledWithoutWorkloadSet: installState.UseWorkloadSets == true); + return new WorkloadVersionInfo($"{_sdkVersionBand.ToStringWithoutPrerelease()}-manifests.{sb}", IsInstalled: true, WorkloadSetsEnabledWithoutWorkloadSet: installState.ShouldUseWorkloadSets()); } } diff --git a/test/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/SdkDirectoryWorkloadManifestProviderTests.cs b/test/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/SdkDirectoryWorkloadManifestProviderTests.cs index 918f02fb6a09..e3ee56ca109e 100644 --- a/test/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/SdkDirectoryWorkloadManifestProviderTests.cs +++ b/test/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/SdkDirectoryWorkloadManifestProviderTests.cs @@ -738,6 +738,7 @@ public void ItUsesWorkloadManifestFromInstallState() CreateMockInstallState("8.0.200", """ { + "useWorkloadSets": false, "manifests": { "ios": "11.0.1/8.0.100", } @@ -776,9 +777,10 @@ public void ItFailsIfManifestFromInstallStateIsNotInstalled() var installStatePath = CreateMockInstallState("8.0.200", """ { - "manifests": { + "useWorkloadSets": false, + "manifests": { "ios": "12.0.2/8.0.200", - } + }, } """); diff --git a/test/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs b/test/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs index 95ce1ec52cf0..370de9ff7ce7 100644 --- a/test/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs +++ b/test/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs @@ -9,6 +9,7 @@ using Microsoft.DotNet.Cli.NuGetPackageDownloader; using Microsoft.DotNet.Cli.Utils; using Microsoft.DotNet.Workloads.Workload; +using Microsoft.DotNet.Workloads.Workload.Config; using Microsoft.DotNet.Workloads.Workload.Install; using Microsoft.DotNet.Workloads.Workload.List; using Microsoft.Extensions.EnvironmentAbstractions; @@ -67,7 +68,7 @@ public void GivenWorkloadInstallItCanInstallPacks(bool userLocal, string sdkVers { var mockWorkloadIds = new WorkloadId[] { new WorkloadId("xamarin-android") }; var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "--skip-manifest-update" }); - (_, var installManager, var installer, _, _, _) = GetTestInstallers(parseResult, userLocal, sdkVersion, installedFeatureBand: sdkVersion); + (_, var installManager, var installer, _, _, _, _) = GetTestInstallers(parseResult, userLocal, sdkVersion, installedFeatureBand: sdkVersion); installManager.Execute() .Should().Be(0); @@ -88,7 +89,7 @@ public void GivenWorkloadInstallItCanRollBackPackInstallation(bool userLocal, st { var mockWorkloadIds = new WorkloadId[] { new WorkloadId("xamarin-android"), new WorkloadId("xamarin-android-build") }; var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "xamarin-android-build", "--skip-manifest-update" }); - (_, var installManager, var installer, var workloadResolver, _, _) = GetTestInstallers(parseResult, userLocal, sdkVersion, failingWorkload: "xamarin-android-build", installedFeatureBand: sdkVersion); + (_, var installManager, var installer, var workloadResolver, _, _, _) = GetTestInstallers(parseResult, userLocal, sdkVersion, failingWorkload: "xamarin-android-build", installedFeatureBand: sdkVersion); var exceptionThrown = Assert.Throws(() => installManager.Execute()); exceptionThrown.Message.Should().Contain("Failing workload: xamarin-android-build"); @@ -128,8 +129,9 @@ public void GivenWorkloadInstallOnFailingRollbackItDisplaysTopLevelError() public void GivenWorkloadInstallItCanUpdateAdvertisingManifests(bool userLocal, string sdkVersion) { var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android" }); - (_, var installManager, var installer, _, var manifestUpdater, _) = GetTestInstallers(parseResult, userLocal, sdkVersion, installedFeatureBand: sdkVersion); + (_, var installManager, var installer, _, var manifestUpdater, _, var resolverFactory) = GetTestInstallers(parseResult, userLocal, sdkVersion, installedFeatureBand: sdkVersion); + new WorkloadConfigCommand(Parser.Instance.Parse(["dotnet", "workload", "config", "--update-mode", "manifests"]), workloadResolverFactory: resolverFactory).Execute().Should().Be(0); installManager.Execute() .Should().Be(0); @@ -216,9 +218,10 @@ public void GivenWorkloadInstallItCanUpdateInstalledManifests(bool userLocal, st { new(new ManifestVersionUpdate(new ManifestId("mock-manifest"), new ManifestVersion("2.0.0"), featureBand.ToString()), null), }; - (_, var installManager, var installer, _, _, _) = + (_, var installManager, var installer, _, _, _, var resolverFactory) = GetTestInstallers(parseResult, userLocal, sdkVersion, manifestUpdates: manifestsToUpdate, installedFeatureBand: sdkVersion); + new WorkloadConfigCommand(Parser.Instance.Parse(["dotnet", "workload", "config", "--update-mode", "manifests"]), workloadResolverFactory: resolverFactory).Execute().Should().Be(0); installManager.Execute() .Should().Be(0); @@ -247,9 +250,10 @@ public void GivenWorkloadInstallFromCacheItInstallsCachedManifest(bool userLocal { "dotnet", "workload", "install", "xamarin-android", "--from-cache", cachePath }); - (_, var installManager, var installer, _, _, _) = GetTestInstallers(parseResult, userLocal, sdkVersion, + (_, var installManager, var installer, _, _, _, var resolverFactory) = GetTestInstallers(parseResult, userLocal, sdkVersion, tempDirManifestPath: _manifestPath, manifestUpdates: manifestsToUpdate, installedFeatureBand: sdkVersion); + new WorkloadConfigCommand(Parser.Instance.Parse(["dotnet", "workload", "config", "--update-mode", "manifests"]), workloadResolverFactory: resolverFactory).Execute().Should().Be(0); installManager.Execute(); installer.InstalledManifests[0].manifestUpdate.ManifestId.Should().Be(manifestsToUpdate[0].ManifestUpdate.ManifestId); @@ -267,7 +271,7 @@ public void GivenWorkloadInstallItCanDownloadToOfflineCache(bool userLocal, stri { var cachePath = Path.Combine(_testAssetsManager.CreateTestDirectory(identifier: AppendForUserLocal("mockCache_", userLocal) + sdkVersion).Path, "mockCachePath"); var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "--download-to-cache", cachePath }); - (_, var installManager, _, _, var manifestUpdater, var packageDownloader) = GetTestInstallers(parseResult, userLocal, sdkVersion, tempDirManifestPath: _manifestPath, installedFeatureBand: sdkVersion); + (_, var installManager, _, _, var manifestUpdater, var packageDownloader, _) = GetTestInstallers(parseResult, userLocal, sdkVersion, tempDirManifestPath: _manifestPath, installedFeatureBand: sdkVersion); installManager.Execute(); @@ -291,7 +295,7 @@ public void GivenWorkloadInstallItCanInstallFromOfflineCache(bool userLocal, str var mockWorkloadIds = new WorkloadId[] { new WorkloadId("xamarin-android") }; var cachePath = "mockCachePath"; var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "--from-cache", cachePath }); - (_, var installManager, var installer, _, _, var nugetDownloader) = GetTestInstallers(parseResult, userLocal, sdkVersion, installedFeatureBand: sdkVersion); + (_, var installManager, var installer, _, _, var nugetDownloader, _) = GetTestInstallers(parseResult, userLocal, sdkVersion, installedFeatureBand: sdkVersion); installManager.Execute(); @@ -311,7 +315,7 @@ public void GivenWorkloadInstallItCanInstallFromOfflineCache(bool userLocal, str public void GivenWorkloadInstallItPrintsDownloadUrls(bool userLocal, string sdkVersion) { var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "--print-download-link-only" }); - (_, var installManager, _, _, _, _) = GetTestInstallers(parseResult, userLocal, sdkVersion, tempDirManifestPath: _manifestPath, installedFeatureBand: sdkVersion); + (_, var installManager, _, _, _, _, _) = GetTestInstallers(parseResult, userLocal, sdkVersion, tempDirManifestPath: _manifestPath, installedFeatureBand: sdkVersion); installManager.Execute(); @@ -455,7 +459,7 @@ static void CreateFile(string path) .Should().BeEquivalentTo(new string[] { prev7FormattedFeatureVersion, rc1FormattedFeatureVersion }); } - private (string, WorkloadInstallCommand, MockPackWorkloadInstaller, IWorkloadResolver, MockWorkloadManifestUpdater, MockNuGetPackageDownloader) GetTestInstallers( + private (string, WorkloadInstallCommand, MockPackWorkloadInstaller, IWorkloadResolver, MockWorkloadManifestUpdater, MockNuGetPackageDownloader, IWorkloadResolverFactory) GetTestInstallers( ParseResult parseResult, bool userLocal, string sdkVersion, @@ -491,7 +495,7 @@ static void CreateFile(string path) nugetPackageDownloader: nugetDownloader, workloadManifestUpdater: manifestUpdater); - return (testDirectory, installManager, installer, workloadResolver, manifestUpdater, nugetDownloader); + return (testDirectory, installManager, installer, workloadResolver, manifestUpdater, nugetDownloader, workloadResolverFactory); } [Fact] @@ -627,7 +631,7 @@ public void ShowManifestUpdatesWhenVerbosityIsDetailedOrDiagnostic(string verbos { new(new ManifestVersionUpdate(new ManifestId("mock-manifest"), new ManifestVersion("2.0.0"), sdkFeatureBand), null), }; - (_, var installManager, _, _, _, _) = + (_, var installManager, _, _, _, _, _) = GetTestInstallers(parseResult, true, sdkFeatureBand, manifestUpdates: manifestsToUpdate); installManager.Execute().Should().Be(0); diff --git a/test/dotnet-workload-install.Tests/GivenWorkloadManifestUpdater.cs b/test/dotnet-workload-install.Tests/GivenWorkloadManifestUpdater.cs index af3eefbf64e7..960f79ffa474 100644 --- a/test/dotnet-workload-install.Tests/GivenWorkloadManifestUpdater.cs +++ b/test/dotnet-workload-install.Tests/GivenWorkloadManifestUpdater.cs @@ -9,6 +9,7 @@ using ManifestReaderTests; using Microsoft.DotNet.Cli.NuGetPackageDownloader; using Microsoft.DotNet.ToolPackage; +using Microsoft.DotNet.Workloads.Workload.Config; using Microsoft.DotNet.Workloads.Workload.Install; using Microsoft.Extensions.EnvironmentAbstractions; using Microsoft.NET.Sdk.WorkloadManifestReader; @@ -32,7 +33,7 @@ public GivenWorkloadManifestUpdater(ITestOutputHelper log) : base(log) [Fact] public async Task GivenWorkloadManifestUpdateItCanUpdateAdvertisingManifests() { - (var manifestUpdater, var nugetDownloader, _) = GetTestUpdater(); + (var manifestUpdater, var nugetDownloader, _, _) = GetTestUpdater(); await manifestUpdater.UpdateAdvertisingManifestsAsync(true); nugetDownloader.DownloadCallParams.Should().BeEquivalentTo(GetExpectedDownloadedPackages()); @@ -41,8 +42,9 @@ public async Task GivenWorkloadManifestUpdateItCanUpdateAdvertisingManifests() [Fact] public async Task GivenAdvertisingManifestUpdateItUpdatesWhenNoSentinelExists() { - (var manifestUpdater, var nugetDownloader, var sentinelPath) = GetTestUpdater(); + (var manifestUpdater, var nugetDownloader, var sentinelPath, var configCommand) = GetTestUpdater(); + configCommand.Execute().Should().Be(0); await manifestUpdater.BackgroundUpdateAdvertisingManifestsWhenRequiredAsync(); nugetDownloader.DownloadCallParams.Should().BeEquivalentTo(GetExpectedDownloadedPackages()); File.Exists(sentinelPath).Should().BeTrue(); @@ -52,11 +54,12 @@ public async Task GivenAdvertisingManifestUpdateItUpdatesWhenNoSentinelExists() public async Task GivenAdvertisingManifestUpdateItUpdatesWhenDue() { Func getEnvironmentVariable = (envVar) => envVar.Equals(EnvironmentVariableNames.WORKLOAD_UPDATE_NOTIFY_INTERVAL_HOURS) ? "0" : string.Empty; - (var manifestUpdater, var nugetDownloader, var sentinelPath) = GetTestUpdater(getEnvironmentVariable: getEnvironmentVariable); + (var manifestUpdater, var nugetDownloader, var sentinelPath, var configCommand) = GetTestUpdater(getEnvironmentVariable: getEnvironmentVariable); File.WriteAllText(sentinelPath, string.Empty); var createTime = DateTime.Now; + configCommand.Execute().Should().Be(0); await manifestUpdater.BackgroundUpdateAdvertisingManifestsWhenRequiredAsync(); nugetDownloader.DownloadCallParams.Should().BeEquivalentTo(GetExpectedDownloadedPackages()); @@ -67,7 +70,7 @@ public async Task GivenAdvertisingManifestUpdateItUpdatesWhenDue() [Fact] public async Task GivenAdvertisingManifestUpdateItDoesNotUpdateWhenNotDue() { - (var manifestUpdater, var nugetDownloader, var sentinelPath) = GetTestUpdater(); + (var manifestUpdater, var nugetDownloader, var sentinelPath, _) = GetTestUpdater(); File.Create(sentinelPath).Close(); var createTime = DateTime.Now; @@ -81,7 +84,7 @@ public async Task GivenAdvertisingManifestUpdateItDoesNotUpdateWhenNotDue() public async Task GivenAdvertisingManifestUpdateItHonorsDisablingEnvVar() { Func getEnvironmentVariable = (envVar) => envVar.Equals(EnvironmentVariableNames.WORKLOAD_UPDATE_NOTIFY_DISABLE) ? "true" : string.Empty; - (var manifestUpdater, var nugetDownloader, _) = GetTestUpdater(getEnvironmentVariable: getEnvironmentVariable); + (var manifestUpdater, var nugetDownloader, _, _) = GetTestUpdater(getEnvironmentVariable: getEnvironmentVariable); await manifestUpdater.BackgroundUpdateAdvertisingManifestsWhenRequiredAsync(); nugetDownloader.DownloadCallParams.Should().BeEmpty(); @@ -646,14 +649,20 @@ public async Task TestSideBySideUpdateChecks() // this test checks that different version bands don't interfere with each other's update check timers var testDir = _testAssetsManager.CreateTestDirectory().Path; - (var updater1, var downloader1, var sentinelPath1) = GetTestUpdater(testDir: testDir, featureBand: "6.0.100"); - (var updater2, var downloader2, var sentinelPath2) = GetTestUpdater(testDir: testDir, featureBand: "6.0.200"); + (var updater1, var downloader1, var sentinelPath1, var resolver1) = GetTestUpdater(testDir: testDir, featureBand: "6.0.100"); + (var updater2, var downloader2, var sentinelPath2, var resolver2) = GetTestUpdater(testDir: testDir, featureBand: "6.0.200"); + new WorkloadConfigCommand( + Parser.Instance.Parse(["dotnet", "workload", "config", "--update-mode", "manifests"]), + workloadResolverFactory: new MockWorkloadResolverFactory(testDir, "6.0.100", resolver1)).Execute().Should().Be(0); await updater1.BackgroundUpdateAdvertisingManifestsWhenRequiredAsync(); File.Exists(sentinelPath2).Should().BeFalse(); downloader1.DownloadCallParams.Should().BeEquivalentTo(GetExpectedDownloadedPackages("6.0.100")); + new WorkloadConfigCommand( + Parser.Instance.Parse(["dotnet", "workload", "config", "--update-mode", "manifests"]), + workloadResolverFactory: new MockWorkloadResolverFactory(testDir, "6.0.200", resolver2)).Execute().Should().Be(0); await updater2.BackgroundUpdateAdvertisingManifestsWhenRequiredAsync(); File.Exists(sentinelPath2).Should().BeTrue(); downloader2.DownloadCallParams.Should().BeEquivalentTo(GetExpectedDownloadedPackages("6.0.200")); @@ -678,16 +687,20 @@ public async Task TestSideBySideUpdateChecks() return expectedDownloadedPackages; } - private (WorkloadManifestUpdater, MockNuGetPackageDownloader, string) GetTestUpdater([CallerMemberName] string testName = "", Func getEnvironmentVariable = null) + private (WorkloadManifestUpdater, MockNuGetPackageDownloader, string, WorkloadConfigCommand) GetTestUpdater([CallerMemberName] string testName = "", Func getEnvironmentVariable = null) { var testDir = _testAssetsManager.CreateTestDirectory(testName: testName).Path; var featureBand = "6.0.100"; - return GetTestUpdater(testDir, featureBand, testName, getEnvironmentVariable); + (var manifestUpdater, var packageDownloader, var sentinelPath, var workloadResolver) = GetTestUpdater(testDir, featureBand, testName, getEnvironmentVariable); + var configCommand = new WorkloadConfigCommand( + Parser.Instance.Parse(["dotnet", "workload", "config", "--update-mode", "manifests"]), + workloadResolverFactory: new MockWorkloadResolverFactory(testDir, featureBand, workloadResolver)); + return (manifestUpdater, packageDownloader, sentinelPath, configCommand); } - private (WorkloadManifestUpdater, MockNuGetPackageDownloader, string) GetTestUpdater(string testDir, string featureBand, [CallerMemberName] string testName = "", Func getEnvironmentVariable = null) + private (WorkloadManifestUpdater, MockNuGetPackageDownloader, string, IWorkloadResolver) GetTestUpdater(string testDir, string featureBand, [CallerMemberName] string testName = "", Func getEnvironmentVariable = null) { var dotnetRoot = Path.Combine(testDir, "dotnet"); @@ -715,7 +728,7 @@ public async Task TestSideBySideUpdateChecks() var manifestUpdater = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, testDir, installationRepo, new MockPackWorkloadInstaller(dotnetRoot), getEnvironmentVariable: getEnvironmentVariable); var sentinelPath = Path.Combine(testDir, _manifestSentinelFileName + featureBand); - return (manifestUpdater, nugetDownloader, sentinelPath); + return (manifestUpdater, nugetDownloader, sentinelPath, workloadResolver); } internal static string GetManifestContent(ManifestVersion version) diff --git a/test/dotnet-workload-install.Tests/MockPackWorkloadInstaller.cs b/test/dotnet-workload-install.Tests/MockPackWorkloadInstaller.cs index cd7be5779eb4..70c8c04cdff1 100644 --- a/test/dotnet-workload-install.Tests/MockPackWorkloadInstaller.cs +++ b/test/dotnet-workload-install.Tests/MockPackWorkloadInstaller.cs @@ -67,9 +67,7 @@ IEnumerable GetPacksForWorkloads(IEnumerable workloadIds) } public void UpdateInstallMode(SdkFeatureBand sdkFeatureBand, bool? newMode) - { - throw new NotImplementedException(); - } + { } public void AdjustWorkloadSetInInstallState(SdkFeatureBand sdkFeatureBand, string workloadVersion) { diff --git a/test/dotnet-workload-list.Tests/GivenDotnetWorkloadList.cs b/test/dotnet-workload-list.Tests/GivenDotnetWorkloadList.cs index fd2006e13551..9f723057e908 100644 --- a/test/dotnet-workload-list.Tests/GivenDotnetWorkloadList.cs +++ b/test/dotnet-workload-list.Tests/GivenDotnetWorkloadList.cs @@ -37,7 +37,8 @@ public void GivenNoWorkloadsAreInstalledListIsEmpty() command.Execute(); // Expected number of lines for table headers - _reporter.Lines.Count.Should().Be(6); + // Expecting a workload set adds two lines + _reporter.Lines.Count.Should().Be(8); } [WindowsOnlyFact] diff --git a/test/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs b/test/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs index 92733f5c45f4..373373055359 100644 --- a/test/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs +++ b/test/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs @@ -10,6 +10,7 @@ using Microsoft.DotNet.Cli.Utils; using Microsoft.DotNet.Cli.Workload.Install.Tests; using Microsoft.DotNet.Workloads.Workload; +using Microsoft.DotNet.Workloads.Workload.Config; using Microsoft.DotNet.Workloads.Workload.Install; using Microsoft.DotNet.Workloads.Workload.Update; using Microsoft.NET.Sdk.WorkloadManifestReader; @@ -243,6 +244,7 @@ public void GivenWorkloadUpdateAcrossFeatureBandsItUpdatesPacks(bool userLocal) File.Create(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)).Close(); // Update workload (without installing any workloads to this feature band) + new WorkloadConfigCommand(Parser.Instance.Parse(["dotnet", "workload", "config", "--update-mode", "manifests"]), workloadResolverFactory: workloadResolverFactory).Execute().Should().Be(0); var updateParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--from-previous-sdk" }); var updateCommand = new WorkloadUpdateCommand(updateParseResult, reporter: _reporter, workloadResolverFactory, nugetPackageDownloader: nugetDownloader, workloadManifestUpdater: manifestUpdater, tempDirPath: testDirectory); @@ -254,6 +256,7 @@ public void GivenWorkloadUpdateAcrossFeatureBandsItUpdatesPacks(bool userLocal) }; Directory.CreateDirectory(Path.GetDirectoryName(installStatePath)); File.WriteAllText(installStatePath, oldInstallState.ToString()); + new WorkloadConfigCommand(Parser.Instance.Parse(["dotnet", "workload", "config", "--update-mode", "manifests"])).Execute().Should().Be(0); updateCommand.Execute(); var newInstallState = InstallStateContents.FromPath(installStatePath); newInstallState.Manifests.Should().BeNull(); @@ -472,6 +475,9 @@ public void ApplyRollbackAcrossFeatureBand(string existingSdkFeatureBand, string }; (var dotnetPath, var updateCommand, var packInstaller, _, _, _) = GetTestInstallers(parseResult, manifestUpdates: manifestsToUpdate, sdkVersion: "6.0.300", identifier: existingSdkFeatureBand + newSdkFeatureBand, installedFeatureBand: existingSdkFeatureBand); + parseResult = Parser.Instance.Parse(["dotnet", "workload", "config", "--update-mode", "manifests"]); + WorkloadConfigCommand configCommand = new(parseResult); + configCommand.Execute().Should().Be(0); updateCommand.Execute() .Should().Be(0);