dependabot-nuget 0.289.0 → 0.291.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/lib/NuGetUpdater/Directory.Packages.props +1 -1
  3. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/AnalyzeCommand.cs +7 -3
  4. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +1 -1
  5. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +26 -1
  6. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +2 -1
  7. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Run.cs +0 -6
  8. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Update.cs +1 -1
  9. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +6 -1
  10. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +24 -9
  11. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/DependencyFinder.cs +2 -0
  12. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/NuGetContext.cs +0 -13
  13. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs +17 -0
  14. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +44 -5
  15. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscovery.cs +2 -2
  16. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/ProjectDiscoveryResult.cs +2 -0
  17. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +19 -11
  18. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ErrorType.cs +1 -0
  19. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +3 -0
  20. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Advisory.cs +13 -0
  21. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/AllowedUpdate.cs +18 -1
  22. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CommitOptions.cs +8 -0
  23. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Condition.cs +19 -0
  24. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyGroup.cs +8 -0
  25. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/GroupPullRequest.cs +9 -0
  26. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +13 -10
  27. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PullRequest.cs +11 -0
  28. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/RequirementsUpdateStrategy.cs +15 -0
  29. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +24 -4
  30. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/VersionConverter.cs +19 -0
  31. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +2 -1
  32. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +3 -2
  33. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +43 -18
  34. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +13 -12
  35. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +1 -1
  36. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/JsonHelper.cs +2 -0
  37. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +40 -14
  38. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +2 -2
  39. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProcessExtensions.cs +45 -7
  40. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProjectHelper.cs +2 -2
  41. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTestBase.cs +5 -2
  42. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.DotNetToolsJson.cs +45 -1
  43. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.GlobalJson.cs +35 -1
  44. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +0 -4
  45. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +41 -0
  46. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +1 -0
  47. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +1 -1
  48. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +2 -1
  49. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/MiscellaneousTests.cs +85 -0
  50. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +7 -31
  51. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +340 -0
  52. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +18 -7
  53. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackagesConfigUpdaterTests.cs +24 -0
  54. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +0 -12
  55. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DotNetTools.cs +84 -0
  56. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.GlobalJson.cs +66 -0
  57. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +55 -0
  58. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +0 -6
  59. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +785 -755
  60. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +2 -2
  61. data/lib/dependabot/nuget/analysis/analysis_json_reader.rb +1 -1
  62. data/lib/dependabot/nuget/analysis/dependency_analysis.rb +3 -3
  63. data/lib/dependabot/nuget/discovery/dependency_details.rb +10 -3
  64. data/lib/dependabot/nuget/discovery/dependency_file_discovery.rb +8 -12
  65. data/lib/dependabot/nuget/discovery/discovery_json_reader.rb +214 -29
  66. data/lib/dependabot/nuget/discovery/project_discovery.rb +41 -8
  67. data/lib/dependabot/nuget/discovery/workspace_discovery.rb +14 -19
  68. data/lib/dependabot/nuget/file_fetcher.rb +3 -3
  69. data/lib/dependabot/nuget/file_parser.rb +92 -3
  70. data/lib/dependabot/nuget/file_updater.rb +13 -13
  71. data/lib/dependabot/nuget/language.rb +82 -0
  72. data/lib/dependabot/nuget/native_helpers.rb +37 -5
  73. data/lib/dependabot/nuget/package_manager.rb +51 -0
  74. data/lib/dependabot/nuget/update_checker/requirements_updater.rb +23 -27
  75. data/lib/dependabot/nuget/update_checker.rb +116 -190
  76. metadata +20 -29
  77. data/lib/dependabot/nuget/discovery/directory_packages_props_discovery.rb +0 -43
  78. data/lib/dependabot/nuget/http_response_helpers.rb +0 -19
  79. data/lib/dependabot/nuget/native_discovery/native_dependency_details.rb +0 -102
  80. data/lib/dependabot/nuget/native_discovery/native_dependency_file_discovery.rb +0 -122
  81. data/lib/dependabot/nuget/native_discovery/native_discovery_json_reader.rb +0 -277
  82. data/lib/dependabot/nuget/native_discovery/native_evaluation_details.rb +0 -63
  83. data/lib/dependabot/nuget/native_discovery/native_project_discovery.rb +0 -104
  84. data/lib/dependabot/nuget/native_discovery/native_property_details.rb +0 -43
  85. data/lib/dependabot/nuget/native_discovery/native_workspace_discovery.rb +0 -61
  86. data/lib/dependabot/nuget/native_update_checker/native_requirements_updater.rb +0 -105
  87. data/lib/dependabot/nuget/native_update_checker/native_update_checker.rb +0 -214
  88. data/lib/dependabot/nuget/nuget_client.rb +0 -223
  89. data/lib/dependabot/nuget/update_checker/compatibility_checker.rb +0 -116
  90. data/lib/dependabot/nuget/update_checker/dependency_finder.rb +0 -297
  91. data/lib/dependabot/nuget/update_checker/nupkg_fetcher.rb +0 -221
  92. data/lib/dependabot/nuget/update_checker/nuspec_fetcher.rb +0 -110
  93. data/lib/dependabot/nuget/update_checker/property_updater.rb +0 -196
  94. data/lib/dependabot/nuget/update_checker/repository_finder.rb +0 -466
  95. data/lib/dependabot/nuget/update_checker/tfm_comparer.rb +0 -34
  96. data/lib/dependabot/nuget/update_checker/tfm_finder.rb +0 -30
  97. data/lib/dependabot/nuget/update_checker/version_finder.rb +0 -449
@@ -147,8 +147,10 @@ public class MSBuildHelperTests : TestBase
147
147
  AssertEx.Equal(expectedTopLevelDependencies, actualTopLevelDependencies);
148
148
  }
149
149
 
150
- [Fact]
151
- public async Task AllPackageDependenciesCanBeTraversed()
150
+ [Theory]
151
+ [InlineData(true)]
152
+ [InlineData(false)]
153
+ public async Task AllPackageDependenciesCanBeTraversed(bool useExistingSdks)
152
154
  {
153
155
  using var temp = new TemporaryDirectory();
154
156
  MockNuGetPackage[] testPackages =
@@ -173,13 +175,16 @@ public class MSBuildHelperTests : TestBase
173
175
  temp.DirectoryPath,
174
176
  "netstandard2.0",
175
177
  [new Dependency("Package.A", "1.0.0", DependencyType.Unknown)],
178
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
176
179
  new TestLogger()
177
180
  );
178
181
  AssertEx.Equal(expectedDependencies, actualDependencies);
179
182
  }
180
183
 
181
- [Fact]
182
- public async Task AllPackageDependencies_DoNotTruncateLongDependencyLists()
184
+ [Theory]
185
+ [InlineData(true)]
186
+ [InlineData(false)]
187
+ public async Task AllPackageDependencies_DoNotTruncateLongDependencyLists(bool useExistingSdks)
183
188
  {
184
189
  using var temp = new TemporaryDirectory();
185
190
  MockNuGetPackage[] testPackages =
@@ -301,7 +306,14 @@ public class MSBuildHelperTests : TestBase
301
306
  new Dependency("Package.2A", "1.0.0", DependencyType.Unknown),
302
307
  new Dependency("Package.2R", "18.0.0", DependencyType.Unknown),
303
308
  };
304
- var actualDependencies = await MSBuildHelper.GetAllPackageDependenciesAsync(temp.DirectoryPath, temp.DirectoryPath, "net8.0", packages, new TestLogger());
309
+ var actualDependencies = await MSBuildHelper.GetAllPackageDependenciesAsync(
310
+ temp.DirectoryPath,
311
+ temp.DirectoryPath,
312
+ "net8.0",
313
+ packages,
314
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
315
+ new TestLogger()
316
+ );
305
317
  for (int i = 0; i < actualDependencies.Length; i++)
306
318
  {
307
319
  var ad = actualDependencies[i];
@@ -312,8 +324,10 @@ public class MSBuildHelperTests : TestBase
312
324
  AssertEx.Equal(expectedDependencies, actualDependencies);
313
325
  }
314
326
 
315
- [Fact]
316
- public async Task AllPackageDependencies_DoNotIncludeUpdateOnlyPackages()
327
+ [Theory]
328
+ [InlineData(true)]
329
+ [InlineData(false)]
330
+ public async Task AllPackageDependencies_DoNotIncludeUpdateOnlyPackages(bool useExistingSdks)
317
331
  {
318
332
  using var temp = new TemporaryDirectory();
319
333
  MockNuGetPackage[] testPackages =
@@ -335,117 +349,96 @@ public class MSBuildHelperTests : TestBase
335
349
  new Dependency("Package.B", "2.0.0", DependencyType.Unknown, TargetFrameworks: ["net8.0"]),
336
350
  new Dependency("Package.C", "3.0.0", DependencyType.Unknown, IsUpdate: true)
337
351
  };
338
- var actualDependencies = await MSBuildHelper.GetAllPackageDependenciesAsync(temp.DirectoryPath, temp.DirectoryPath, "net8.0", packages, new TestLogger());
352
+ var actualDependencies = await MSBuildHelper.GetAllPackageDependenciesAsync(
353
+ temp.DirectoryPath,
354
+ temp.DirectoryPath,
355
+ "net8.0",
356
+ packages,
357
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
358
+ new TestLogger()
359
+ );
339
360
  AssertEx.Equal(expectedDependencies, actualDependencies);
340
361
  }
341
362
 
342
- [Fact]
343
- public async Task GetAllPackageDependencies_NugetConfigInvalid_DoesNotThrow()
363
+ [Theory]
364
+ [InlineData(true)]
365
+ [InlineData(false)]
366
+ public async Task GetAllPackageDependencies_NugetConfigInvalid_DoesNotThrow(bool useExistingSdks)
344
367
  {
345
- var nugetPackagesDirectory = Environment.GetEnvironmentVariable("NUGET_PACKAGES");
346
- var nugetHttpCacheDirectory = Environment.GetEnvironmentVariable("NUGET_HTTP_CACHE_PATH");
347
-
348
- try
349
- {
350
- using var temp = new TemporaryDirectory();
351
-
352
- // It is important to have empty NuGet caches for this test, so override them with temp directories.
353
- var tempNuGetPackagesDirectory = Path.Combine(temp.DirectoryPath, ".nuget", "packages");
354
- Environment.SetEnvironmentVariable("NUGET_PACKAGES", tempNuGetPackagesDirectory);
355
- var tempNuGetHttpCacheDirectory = Path.Combine(temp.DirectoryPath, ".nuget", "v3-cache");
356
- Environment.SetEnvironmentVariable("NUGET_HTTP_CACHE_PATH", tempNuGetHttpCacheDirectory);
357
-
358
- // Write the NuGet.config with a missing "/>"
359
- await File.WriteAllTextAsync(
360
- Path.Combine(temp.DirectoryPath, "NuGet.Config"), """
361
- <?xml version="1.0" encoding="utf-8"?>
362
- <configuration>
363
- <packageSources>
364
- <clear />
365
- <add key="contoso" value="https://contoso.com/v3/index.json"
366
- </packageSources>
367
- </configuration>
368
- """);
368
+ using var temp = new TemporaryDirectory();
369
369
 
370
- // Asserting it didn't throw
371
- var actualDependencies = await MSBuildHelper.GetAllPackageDependenciesAsync(
372
- temp.DirectoryPath,
373
- temp.DirectoryPath,
374
- "net8.0",
375
- [new Dependency("Some.Package", "4.5.11", DependencyType.Unknown)],
376
- new TestLogger()
377
- );
378
- }
379
- finally
380
- {
381
- // Restore the NuGet caches.
382
- Environment.SetEnvironmentVariable("NUGET_PACKAGES", nugetPackagesDirectory);
383
- Environment.SetEnvironmentVariable("NUGET_HTTP_CACHE_PATH", nugetHttpCacheDirectory);
384
- }
370
+ // Write the NuGet.config with a missing "/>"
371
+ await File.WriteAllTextAsync(
372
+ Path.Combine(temp.DirectoryPath, "NuGet.Config"), """
373
+ <?xml version="1.0" encoding="utf-8"?>
374
+ <configuration>
375
+ <packageSources>
376
+ <clear />
377
+ <add key="contoso" value="https://contoso.com/v3/index.json"
378
+ </packageSources>
379
+ </configuration>
380
+ """);
381
+
382
+ // Asserting it didn't throw
383
+ var actualDependencies = await MSBuildHelper.GetAllPackageDependenciesAsync(
384
+ temp.DirectoryPath,
385
+ temp.DirectoryPath,
386
+ "net8.0",
387
+ [new Dependency("Some.Package", "4.5.11", DependencyType.Unknown)],
388
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
389
+ new TestLogger()
390
+ );
385
391
  }
386
392
 
387
- [Fact]
388
- public async Task LocalPackageSourcesAreHonored()
393
+ [Theory]
394
+ [InlineData(true)]
395
+ [InlineData(false)]
396
+ public async Task LocalPackageSourcesAreHonored(bool useExistingSdks)
389
397
  {
390
- var nugetPackagesDirectory = Environment.GetEnvironmentVariable("NUGET_PACKAGES");
391
- var nugetHttpCacheDirectory = Environment.GetEnvironmentVariable("NUGET_HTTP_CACHE_PATH");
398
+ using var temp = new TemporaryDirectory();
392
399
 
393
- try
394
- {
395
- using var temp = new TemporaryDirectory();
396
-
397
- // It is important to have empty NuGet caches for this test, so override them with temp directories.
398
- var tempNuGetPackagesDirectory = Path.Combine(temp.DirectoryPath, ".nuget", "packages");
399
- Environment.SetEnvironmentVariable("NUGET_PACKAGES", tempNuGetPackagesDirectory);
400
- var tempNuGetHttpCacheDirectory = Path.Combine(temp.DirectoryPath, ".nuget", "v3-cache");
401
- Environment.SetEnvironmentVariable("NUGET_HTTP_CACHE_PATH", tempNuGetHttpCacheDirectory);
402
-
403
- // create two local package sources with different packages available in each
404
- string localSource1 = Path.Combine(temp.DirectoryPath, "local", "source1");
405
- Directory.CreateDirectory(localSource1);
406
- string localSource2 = Path.Combine(temp.DirectoryPath, "local", "source2");
407
- Directory.CreateDirectory(localSource2);
408
-
409
- // `Package.A` will only live in `local\source1` and uses Windows-style directory separators and will have
410
- // a dependency on `Package.B` which is only available in `local/source2` and uses Unix-style directory
411
- // separators.
412
- MockNuGetPackage.CreateSimplePackage("Package.A", "1.0.0", "net8.0", [(null, [("Package.B", "2.0.0")])]).WriteToDirectory(localSource1);
413
- MockNuGetPackage.CreateSimplePackage("Package.B", "2.0.0", "net8.0").WriteToDirectory(localSource2);
414
- await File.WriteAllTextAsync(Path.Join(temp.DirectoryPath, "NuGet.Config"), """
415
- <configuration>
416
- <packageSources>
417
- <add key="localSource1" value="local\source1" />
418
- <add key="localSource2" value="local/source2" />
419
- </packageSources>
420
- </configuration>
421
- """);
400
+ // create two local package sources with different packages available in each
401
+ string localSource1 = Path.Combine(temp.DirectoryPath, "local", "source1");
402
+ Directory.CreateDirectory(localSource1);
403
+ string localSource2 = Path.Combine(temp.DirectoryPath, "local", "source2");
404
+ Directory.CreateDirectory(localSource2);
405
+
406
+ // `Package.A` will only live in `local\source1` and uses Windows-style directory separators and will have
407
+ // a dependency on `Package.B` which is only available in `local/source2` and uses Unix-style directory
408
+ // separators.
409
+ MockNuGetPackage.CreateSimplePackage("Package.A", "1.0.0", "net8.0", [(null, [("Package.B", "2.0.0")])]).WriteToDirectory(localSource1);
410
+ MockNuGetPackage.CreateSimplePackage("Package.B", "2.0.0", "net8.0").WriteToDirectory(localSource2);
411
+ await File.WriteAllTextAsync(Path.Join(temp.DirectoryPath, "NuGet.Config"), """
412
+ <configuration>
413
+ <packageSources>
414
+ <add key="localSource1" value="local\source1" />
415
+ <add key="localSource2" value="local/source2" />
416
+ </packageSources>
417
+ </configuration>
418
+ """);
422
419
 
423
- Dependency[] expectedDependencies =
424
- [
425
- new("Package.A", "1.0.0", DependencyType.Unknown, TargetFrameworks: ["net8.0"]),
426
- new("Package.B", "2.0.0", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true),
427
- ];
420
+ Dependency[] expectedDependencies =
421
+ [
422
+ new("Package.A", "1.0.0", DependencyType.Unknown, TargetFrameworks: ["net8.0"]),
423
+ new("Package.B", "2.0.0", DependencyType.Unknown, TargetFrameworks: ["net8.0"], IsTransitive: true),
424
+ ];
428
425
 
429
- Dependency[] actualDependencies = await MSBuildHelper.GetAllPackageDependenciesAsync(
430
- temp.DirectoryPath,
431
- temp.DirectoryPath,
432
- "net8.0",
433
- [new Dependency("Package.A", "1.0.0", DependencyType.Unknown)],
434
- new TestLogger()
435
- );
426
+ Dependency[] actualDependencies = await MSBuildHelper.GetAllPackageDependenciesAsync(
427
+ temp.DirectoryPath,
428
+ temp.DirectoryPath,
429
+ "net8.0",
430
+ [new Dependency("Package.A", "1.0.0", DependencyType.Unknown)],
431
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
432
+ new TestLogger()
433
+ );
436
434
 
437
- AssertEx.Equal(expectedDependencies, actualDependencies);
438
- }
439
- finally
440
- {
441
- // Restore the NuGet caches.
442
- Environment.SetEnvironmentVariable("NUGET_PACKAGES", nugetPackagesDirectory);
443
- Environment.SetEnvironmentVariable("NUGET_HTTP_CACHE_PATH", nugetHttpCacheDirectory);
444
- }
435
+ AssertEx.Equal(expectedDependencies, actualDependencies);
445
436
  }
446
437
 
447
- [Fact]
448
- public async Task DependencyConflictsCanBeResolvedWithBruteForce()
438
+ [Theory]
439
+ [InlineData(true)]
440
+ [InlineData(false)]
441
+ public async Task DependencyConflictsCanBeResolvedWithBruteForce(bool useExistingSdks)
449
442
  {
450
443
  var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedWithBruteForce)}_");
451
444
  MockNuGetPackage[] testPackages =
@@ -486,7 +479,14 @@ public class MSBuildHelperTests : TestBase
486
479
  {
487
480
  new Dependency("Some.Other.Package", "1.2.0", DependencyType.PackageReference),
488
481
  };
489
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsWithBruteForce(repoRoot.FullName, projectPath, "net8.0", dependencies, new TestLogger());
482
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflictsWithBruteForce(
483
+ repoRoot.FullName,
484
+ projectPath,
485
+ "net8.0",
486
+ dependencies,
487
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
488
+ new TestLogger()
489
+ );
490
490
  Assert.NotNull(resolvedDependencies);
491
491
  Assert.Equal(2, resolvedDependencies.Length);
492
492
  Assert.Equal("Some.Package", resolvedDependencies[0].Name);
@@ -541,303 +541,315 @@ public class MSBuildHelperTests : TestBase
541
541
  #region
542
542
  // Updating root package
543
543
  // CS-Script Code to 2.0.0 requires its dependency Microsoft.CodeAnalysis.CSharp.Scripting to be 3.6.0 and its transitive dependency Microsoft.CodeAnalysis.Common to be 3.6.0
544
- [Fact]
545
- public async Task DependencyConflictsCanBeResolvedNewUpdatingTopLevelPackage()
544
+ [Theory]
545
+ [InlineData(true)]
546
+ [InlineData(false)]
547
+ public async Task DependencyConflictsCanBeResolvedNewUpdatingTopLevelPackage(bool useExistingSdks)
546
548
  {
547
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewUpdatingTopLevelPackage)}_");
549
+ using var tempDirectory = new TemporaryDirectory();
550
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
551
+ await File.WriteAllTextAsync(projectPath, """
552
+ <Project Sdk="Microsoft.NET.Sdk">
553
+ <PropertyGroup>
554
+ <TargetFramework>net8.0</TargetFramework>
555
+ </PropertyGroup>
556
+ <ItemGroup>
557
+ <PackageReference Include="CS-Script.Core" Version="1.3.1" />
558
+ <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="3.4.0" />
559
+ <PackageReference Include="Microsoft.CodeAnalysis.Scripting.Common" Version="3.4.0" />
560
+ </ItemGroup>
561
+ </Project>
562
+ """);
548
563
 
549
- try
564
+ var dependencies = new[]
550
565
  {
551
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
552
- await File.WriteAllTextAsync(projectPath, """
553
- <Project Sdk="Microsoft.NET.Sdk">
554
- <PropertyGroup>
555
- <TargetFramework>net8.0</TargetFramework>
556
- </PropertyGroup>
557
- <ItemGroup>
558
- <PackageReference Include="CS-Script.Core" Version="1.3.1" />
559
- <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="3.4.0" />
560
- <PackageReference Include="Microsoft.CodeAnalysis.Scripting.Common" Version="3.4.0" />
561
- </ItemGroup>
562
- </Project>
563
- """);
564
-
565
- var dependencies = new[]
566
- {
567
- // Add comment about root and dependencies
568
- new Dependency("CS-Script.Core", "1.3.1", DependencyType.PackageReference),
569
- new Dependency("Microsoft.CodeAnalysis.Common", "3.4.0", DependencyType.PackageReference),
570
- new Dependency("Microsoft.CodeAnalysis.Scripting.Common", "3.4.0", DependencyType.PackageReference),
571
- };
572
- var update = new[]
573
- {
574
- new Dependency("CS-Script.Core", "2.0.0", DependencyType.PackageReference),
575
- };
576
-
577
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
578
- Assert.NotNull(resolvedDependencies);
579
- Assert.Equal(3, resolvedDependencies.Length);
580
- Assert.Equal("CS-Script.Core", resolvedDependencies[0].Name);
581
- Assert.Equal("2.0.0", resolvedDependencies[0].Version);
582
- Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[1].Name);
583
- Assert.Equal("3.6.0", resolvedDependencies[1].Version);
584
- Assert.Equal("Microsoft.CodeAnalysis.Scripting.Common", resolvedDependencies[2].Name);
585
- Assert.Equal("3.6.0", resolvedDependencies[2].Version);
586
- }
587
- finally
566
+ // Add comment about root and dependencies
567
+ new Dependency("CS-Script.Core", "1.3.1", DependencyType.PackageReference),
568
+ new Dependency("Microsoft.CodeAnalysis.Common", "3.4.0", DependencyType.PackageReference),
569
+ new Dependency("Microsoft.CodeAnalysis.Scripting.Common", "3.4.0", DependencyType.PackageReference),
570
+ };
571
+ var update = new[]
588
572
  {
589
- repoRoot.Delete(recursive: true);
590
- }
573
+ new Dependency("CS-Script.Core", "2.0.0", DependencyType.PackageReference),
574
+ };
575
+
576
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
577
+ tempDirectory.DirectoryPath,
578
+ projectPath,
579
+ "net8.0",
580
+ dependencies,
581
+ update,
582
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
583
+ new TestLogger()
584
+ );
585
+ Assert.NotNull(resolvedDependencies);
586
+ Assert.Equal(3, resolvedDependencies.Length);
587
+ Assert.Equal("CS-Script.Core", resolvedDependencies[0].Name);
588
+ Assert.Equal("2.0.0", resolvedDependencies[0].Version);
589
+ Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[1].Name);
590
+ Assert.Equal("3.6.0", resolvedDependencies[1].Version);
591
+ Assert.Equal("Microsoft.CodeAnalysis.Scripting.Common", resolvedDependencies[2].Name);
592
+ Assert.Equal("3.6.0", resolvedDependencies[2].Version);
591
593
  }
592
594
 
593
595
  // Updating a dependency (Microsoft.Bcl.AsyncInterfaces) of the root package (Azure.Core) will require the root package to also update, but since the dependency is not in the existing list, we do not include it
594
- [Fact]
595
- public async Task DependencyConflictsCanBeResolvedNewUpdatingNonExistingDependency()
596
+ [Theory]
597
+ [InlineData(true)]
598
+ [InlineData(false)]
599
+ public async Task DependencyConflictsCanBeResolvedNewUpdatingNonExistingDependency(bool useExistingSdks)
596
600
  {
597
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewUpdatingNonExistingDependency)}_");
601
+ using var tempDirectory = new TemporaryDirectory();
602
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
603
+ await File.WriteAllTextAsync(projectPath, """
604
+ <Project Sdk="Microsoft.NET.Sdk">
605
+ <PropertyGroup>
606
+ <TargetFramework>net8.0</TargetFramework>
607
+ </PropertyGroup>
608
+ <ItemGroup>
609
+ <PackageReference Include="Azure.Core" Version="1.21.0" />
610
+ </ItemGroup>
611
+ </Project>
612
+ """);
598
613
 
599
- try
614
+ var dependencies = new[]
600
615
  {
601
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
602
- await File.WriteAllTextAsync(projectPath, """
603
- <Project Sdk="Microsoft.NET.Sdk">
604
- <PropertyGroup>
605
- <TargetFramework>net8.0</TargetFramework>
606
- </PropertyGroup>
607
- <ItemGroup>
608
- <PackageReference Include="Azure.Core" Version="1.21.0" />
609
- </ItemGroup>
610
- </Project>
611
- """);
612
-
613
- var dependencies = new[]
614
- {
615
- new Dependency("Azure.Core", "1.21.0", DependencyType.PackageReference)
616
- };
617
- var update = new[]
618
- {
619
- new Dependency("Microsoft.Bcl.AsyncInterfaces", "1.1.1", DependencyType.Unknown)
620
- };
621
-
622
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
623
- Assert.NotNull(resolvedDependencies);
624
- Assert.Single(resolvedDependencies);
625
- Assert.Equal("Azure.Core", resolvedDependencies[0].Name);
626
- Assert.Equal("1.22.0", resolvedDependencies[0].Version);
627
- }
628
- finally
616
+ new Dependency("Azure.Core", "1.21.0", DependencyType.PackageReference)
617
+ };
618
+ var update = new[]
629
619
  {
630
- repoRoot.Delete(recursive: true);
631
- }
620
+ new Dependency("Microsoft.Bcl.AsyncInterfaces", "1.1.1", DependencyType.Unknown)
621
+ };
622
+
623
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
624
+ tempDirectory.DirectoryPath,
625
+ projectPath,
626
+ "net8.0",
627
+ dependencies,
628
+ update,
629
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
630
+ new TestLogger()
631
+ );
632
+ Assert.NotNull(resolvedDependencies);
633
+ Assert.Single(resolvedDependencies);
634
+ Assert.Equal("Azure.Core", resolvedDependencies[0].Name);
635
+ Assert.Equal("1.22.0", resolvedDependencies[0].Version);
632
636
  }
633
637
 
634
638
  // Adding a reference
635
639
  // Newtonsoft.Json needs to update to 13.0.1. Although Newtonsoft.Json.Bson can use the original version of 12.0.1, for security vulnerabilities and
636
640
  // because there is no later version of Newtonsoft.Json.Bson 1.0.2, Newtonsoft.Json would be added to the existing list to prevent resolution
637
- [Fact]
638
- public async Task DependencyConflictsCanBeResolvedNewUpdatingNonExistentDependencyAndKeepingReference()
641
+ [Theory]
642
+ [InlineData(true)]
643
+ [InlineData(false)]
644
+ public async Task DependencyConflictsCanBeResolvedNewUpdatingNonExistentDependencyAndKeepingReference(bool useExistingSdks)
639
645
  {
640
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewUpdatingNonExistentDependencyAndKeepingReference)}_");
646
+ using var tempDirectory = new TemporaryDirectory();
647
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
648
+ await File.WriteAllTextAsync(projectPath, """
649
+ <Project Sdk="Microsoft.NET.Sdk">
650
+ <PropertyGroup>
651
+ <TargetFramework>net8.0</TargetFramework>
652
+ </PropertyGroup>
653
+ <ItemGroup>
654
+ <PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.2" />
655
+ </ItemGroup>
656
+ </Project>
657
+ """);
641
658
 
642
- try
659
+ var dependencies = new[]
643
660
  {
644
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
645
- await File.WriteAllTextAsync(projectPath, """
646
- <Project Sdk="Microsoft.NET.Sdk">
647
- <PropertyGroup>
648
- <TargetFramework>net8.0</TargetFramework>
649
- </PropertyGroup>
650
- <ItemGroup>
651
- <PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.2" />
652
- </ItemGroup>
653
- </Project>
654
- """);
655
-
656
- var dependencies = new[]
657
- {
658
- new Dependency("Newtonsoft.Json.Bson", "1.0.2", DependencyType.PackageReference)
659
- };
660
- var update = new[]
661
- {
662
- new Dependency("Newtonsoft.Json", "13.0.1", DependencyType.Unknown)
663
- };
664
-
665
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
666
- Assert.NotNull(resolvedDependencies);
667
- Assert.Equal(2, resolvedDependencies.Length);
668
- Assert.Equal("Newtonsoft.Json.Bson", resolvedDependencies[0].Name);
669
- Assert.Equal("1.0.2", resolvedDependencies[0].Version);
670
- Assert.Equal("Newtonsoft.Json", resolvedDependencies[1].Name);
671
- Assert.Equal("13.0.1", resolvedDependencies[1].Version);
672
- }
673
- finally
661
+ new Dependency("Newtonsoft.Json.Bson", "1.0.2", DependencyType.PackageReference)
662
+ };
663
+ var update = new[]
674
664
  {
675
- repoRoot.Delete(recursive: true);
676
- }
665
+ new Dependency("Newtonsoft.Json", "13.0.1", DependencyType.Unknown)
666
+ };
667
+
668
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
669
+ tempDirectory.DirectoryPath,
670
+ projectPath,
671
+ "net8.0",
672
+ dependencies,
673
+ update,
674
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
675
+ new TestLogger()
676
+ );
677
+ Assert.NotNull(resolvedDependencies);
678
+ Assert.Equal(2, resolvedDependencies.Length);
679
+ Assert.Equal("Newtonsoft.Json.Bson", resolvedDependencies[0].Name);
680
+ Assert.Equal("1.0.2", resolvedDependencies[0].Version);
681
+ Assert.Equal("Newtonsoft.Json", resolvedDependencies[1].Name);
682
+ Assert.Equal("13.0.1", resolvedDependencies[1].Version);
677
683
  }
678
684
 
679
685
  // Updating unreferenced dependency
680
686
  // Root package (Microsoft.CodeAnalysis.Compilers) and its dependencies (Microsoft.CodeAnalysis.CSharp), (Microsoft.CodeAnalysis.VisualBasic) are all 4.9.2
681
687
  // These packages all require the transitive dependency of the root package (Microsoft.CodeAnalysis.Common) to be 4.9.2, but it's not in the existing list
682
688
  // If Microsoft.CodeAnalysis.Common is updated to 4.10.0, everything else updates and Microsoft.CoseAnalysis.Common is not kept in the existing list
683
- [Fact]
684
- public async Task DependencyConflictsCanBeResolvedNewTransitiveDependencyNotExisting()
689
+ [Theory]
690
+ [InlineData(true)]
691
+ [InlineData(false)]
692
+ public async Task DependencyConflictsCanBeResolvedNewTransitiveDependencyNotExisting(bool useExistingSdks)
685
693
  {
686
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewTransitiveDependencyNotExisting)}_");
694
+ using var tempDirectory = new TemporaryDirectory();
695
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
696
+ await File.WriteAllTextAsync(projectPath, """
697
+ <Project Sdk="Microsoft.NET.Sdk">
698
+ <PropertyGroup>
699
+ <TargetFramework>net8.0</TargetFramework>
700
+ </PropertyGroup>
701
+ <ItemGroup>
702
+ <PackageReference Include="Microsoft.CodeAnalysis.Compilers" Version="4.9.2" />
703
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
704
+ <PackageReference Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.9.2" />
705
+ </ItemGroup>
706
+ </Project>
707
+ """);
687
708
 
688
- try
709
+ var dependencies = new[]
689
710
  {
690
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
691
- await File.WriteAllTextAsync(projectPath, """
692
- <Project Sdk="Microsoft.NET.Sdk">
693
- <PropertyGroup>
694
- <TargetFramework>net8.0</TargetFramework>
695
- </PropertyGroup>
696
- <ItemGroup>
697
- <PackageReference Include="Microsoft.CodeAnalysis.Compilers" Version="4.9.2" />
698
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
699
- <PackageReference Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.9.2" />
700
- </ItemGroup>
701
- </Project>
702
- """);
703
-
704
- var dependencies = new[]
705
- {
706
- new Dependency("Microsoft.CodeAnalysis.Compilers", "4.9.2", DependencyType.PackageReference),
707
- new Dependency("Microsoft.CodeAnalysis.CSharp", "4.9.2", DependencyType.PackageReference),
708
- new Dependency("Microsoft.CodeAnalysis.VisualBasic", "4.9.2", DependencyType.PackageReference)
709
- };
710
- var update = new[]
711
- {
712
- new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference)
713
- };
714
-
715
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
716
- Assert.NotNull(resolvedDependencies);
717
- Assert.Equal(3, resolvedDependencies.Length);
718
- Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
719
- Assert.Equal("4.10.0", resolvedDependencies[0].Version);
720
- Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[1].Name);
721
- Assert.Equal("4.10.0", resolvedDependencies[1].Version);
722
- Assert.Equal("Microsoft.CodeAnalysis.VisualBasic", resolvedDependencies[2].Name);
723
- Assert.Equal("4.10.0", resolvedDependencies[2].Version);
724
- }
725
- finally
711
+ new Dependency("Microsoft.CodeAnalysis.Compilers", "4.9.2", DependencyType.PackageReference),
712
+ new Dependency("Microsoft.CodeAnalysis.CSharp", "4.9.2", DependencyType.PackageReference),
713
+ new Dependency("Microsoft.CodeAnalysis.VisualBasic", "4.9.2", DependencyType.PackageReference)
714
+ };
715
+ var update = new[]
726
716
  {
727
- repoRoot.Delete(recursive: true);
728
- }
717
+ new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference)
718
+ };
719
+
720
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
721
+ tempDirectory.DirectoryPath,
722
+ projectPath,
723
+ "net8.0",
724
+ dependencies,
725
+ update,
726
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
727
+ new TestLogger()
728
+ );
729
+ Assert.NotNull(resolvedDependencies);
730
+ Assert.Equal(3, resolvedDependencies.Length);
731
+ Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
732
+ Assert.Equal("4.10.0", resolvedDependencies[0].Version);
733
+ Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[1].Name);
734
+ Assert.Equal("4.10.0", resolvedDependencies[1].Version);
735
+ Assert.Equal("Microsoft.CodeAnalysis.VisualBasic", resolvedDependencies[2].Name);
736
+ Assert.Equal("4.10.0", resolvedDependencies[2].Version);
729
737
  }
730
738
 
731
739
  // Updating referenced dependency
732
740
  // The same as previous test, but the transitive dependency (Microsoft.CodeAnalysis.Common) is in the existing list
733
- [Fact]
734
- public async Task DependencyConflictsCanBeResolvedNewSingleTransitiveDependencyExisting()
741
+ [Theory]
742
+ [InlineData(true)]
743
+ [InlineData(false)]
744
+ public async Task DependencyConflictsCanBeResolvedNewSingleTransitiveDependencyExisting(bool useExistingSdks)
735
745
  {
736
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewSingleTransitiveDependencyExisting)}_");
746
+ using var tempDirectory = new TemporaryDirectory();
747
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
748
+ await File.WriteAllTextAsync(projectPath, """
749
+ <Project Sdk="Microsoft.NET.Sdk">
750
+ <PropertyGroup>
751
+ <TargetFramework>net8.0</TargetFramework>
752
+ </PropertyGroup>
753
+ <ItemGroup>
754
+ <PackageReference Include="Microsoft.CodeAnalysis.Compilers" Version="4.9.2" />
755
+ <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.9.2" />
756
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
757
+ <PackageReference Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.9.2" />
758
+ </ItemGroup>
759
+ </Project>
760
+ """);
737
761
 
738
- try
762
+ var dependencies = new[]
739
763
  {
740
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
741
- await File.WriteAllTextAsync(projectPath, """
742
- <Project Sdk="Microsoft.NET.Sdk">
743
- <PropertyGroup>
744
- <TargetFramework>net8.0</TargetFramework>
745
- </PropertyGroup>
746
- <ItemGroup>
747
- <PackageReference Include="Microsoft.CodeAnalysis.Compilers" Version="4.9.2" />
748
- <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.9.2" />
749
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
750
- <PackageReference Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.9.2" />
751
- </ItemGroup>
752
- </Project>
753
- """);
754
-
755
- var dependencies = new[]
756
- {
757
- new Dependency("Microsoft.CodeAnalysis.Compilers", "4.9.2", DependencyType.PackageReference),
758
- new Dependency("Microsoft.CodeAnalysis.Common", "4.9.2", DependencyType.PackageReference),
759
- new Dependency("Microsoft.CodeAnalysis.CSharp", "4.9.2", DependencyType.PackageReference),
760
- new Dependency("Microsoft.CodeAnalysis.VisualBasic", "4.9.2", DependencyType.PackageReference)
761
- };
762
- var update = new[]
763
- {
764
- new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference)
765
- };
766
-
767
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
768
- Assert.NotNull(resolvedDependencies);
769
- Assert.Equal(4, resolvedDependencies.Length);
770
- Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
771
- Assert.Equal("4.10.0", resolvedDependencies[0].Version);
772
- Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[1].Name);
773
- Assert.Equal("4.10.0", resolvedDependencies[1].Version);
774
- Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[2].Name);
775
- Assert.Equal("4.10.0", resolvedDependencies[2].Version);
776
- Assert.Equal("Microsoft.CodeAnalysis.VisualBasic", resolvedDependencies[3].Name);
777
- Assert.Equal("4.10.0", resolvedDependencies[3].Version);
778
- }
779
- finally
764
+ new Dependency("Microsoft.CodeAnalysis.Compilers", "4.9.2", DependencyType.PackageReference),
765
+ new Dependency("Microsoft.CodeAnalysis.Common", "4.9.2", DependencyType.PackageReference),
766
+ new Dependency("Microsoft.CodeAnalysis.CSharp", "4.9.2", DependencyType.PackageReference),
767
+ new Dependency("Microsoft.CodeAnalysis.VisualBasic", "4.9.2", DependencyType.PackageReference)
768
+ };
769
+ var update = new[]
780
770
  {
781
- repoRoot.Delete(recursive: true);
782
- }
771
+ new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference)
772
+ };
773
+
774
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
775
+ tempDirectory.DirectoryPath,
776
+ projectPath,
777
+ "net8.0",
778
+ dependencies,
779
+ update,
780
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
781
+ new TestLogger()
782
+ );
783
+ Assert.NotNull(resolvedDependencies);
784
+ Assert.Equal(4, resolvedDependencies.Length);
785
+ Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
786
+ Assert.Equal("4.10.0", resolvedDependencies[0].Version);
787
+ Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[1].Name);
788
+ Assert.Equal("4.10.0", resolvedDependencies[1].Version);
789
+ Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[2].Name);
790
+ Assert.Equal("4.10.0", resolvedDependencies[2].Version);
791
+ Assert.Equal("Microsoft.CodeAnalysis.VisualBasic", resolvedDependencies[3].Name);
792
+ Assert.Equal("4.10.0", resolvedDependencies[3].Version);
783
793
  }
784
794
 
785
795
  // A combination of the third and fourth test, to measure efficiency of updating separate families
786
796
  // Keeping a dependency that was not included in the original list (Newtonsoft.Json)
787
797
  // Not keeping a dependency that was not included in the original list (Microsoft.CodeAnalysis.Common)
788
- [Fact]
789
- public async Task DependencyConflictsCanBeResolvedNewSelectiveAdditionPackages()
798
+ [Theory]
799
+ [InlineData(true)]
800
+ [InlineData(false)]
801
+ public async Task DependencyConflictsCanBeResolvedNewSelectiveAdditionPackages(bool useExistingSdks)
790
802
  {
791
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewSelectiveAdditionPackages)}_");
803
+ using var tempDirectory = new TemporaryDirectory();
804
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
805
+ await File.WriteAllTextAsync(projectPath, """
806
+ <Project Sdk="Microsoft.NET.Sdk">
807
+ <PropertyGroup>
808
+ <TargetFramework>net8.0</TargetFramework>
809
+ </PropertyGroup>
810
+ <ItemGroup>
811
+ <PackageReference Include="Microsoft.CodeAnalysis.Compilers" Version="4.9.2" />
812
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
813
+ <PackageReference Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.9.2" />
814
+ <PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.2" />
815
+ </ItemGroup>
816
+ </Project>
817
+ """);
792
818
 
793
- try
819
+ var dependencies = new[]
794
820
  {
795
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
796
- await File.WriteAllTextAsync(projectPath, """
797
- <Project Sdk="Microsoft.NET.Sdk">
798
- <PropertyGroup>
799
- <TargetFramework>net8.0</TargetFramework>
800
- </PropertyGroup>
801
- <ItemGroup>
802
- <PackageReference Include="Microsoft.CodeAnalysis.Compilers" Version="4.9.2" />
803
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
804
- <PackageReference Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.9.2" />
805
- <PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.2" />
806
- </ItemGroup>
807
- </Project>
808
- """);
809
-
810
- var dependencies = new[]
811
- {
812
- new Dependency("Microsoft.CodeAnalysis.Compilers", "4.9.2", DependencyType.PackageReference),
813
- new Dependency("Microsoft.CodeAnalysis.CSharp", "4.9.2", DependencyType.PackageReference),
814
- new Dependency("Microsoft.CodeAnalysis.VisualBasic", "4.9.2", DependencyType.PackageReference),
815
- new Dependency("Newtonsoft.Json.Bson", "1.0.2", DependencyType.PackageReference)
816
- };
817
- var update = new[]
818
- {
819
- new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference),
820
- new Dependency("Newtonsoft.Json", "13.0.1", DependencyType.Unknown)
821
- };
822
-
823
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
824
- Assert.NotNull(resolvedDependencies);
825
- Assert.Equal(5, resolvedDependencies.Length);
826
- Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
827
- Assert.Equal("4.10.0", resolvedDependencies[0].Version);
828
- Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[1].Name);
829
- Assert.Equal("4.10.0", resolvedDependencies[1].Version);
830
- Assert.Equal("Microsoft.CodeAnalysis.VisualBasic", resolvedDependencies[2].Name);
831
- Assert.Equal("4.10.0", resolvedDependencies[2].Version);
832
- Assert.Equal("Newtonsoft.Json.Bson", resolvedDependencies[3].Name);
833
- Assert.Equal("1.0.2", resolvedDependencies[3].Version);
834
- Assert.Equal("Newtonsoft.Json", resolvedDependencies[4].Name);
835
- Assert.Equal("13.0.1", resolvedDependencies[4].Version);
836
- }
837
- finally
821
+ new Dependency("Microsoft.CodeAnalysis.Compilers", "4.9.2", DependencyType.PackageReference),
822
+ new Dependency("Microsoft.CodeAnalysis.CSharp", "4.9.2", DependencyType.PackageReference),
823
+ new Dependency("Microsoft.CodeAnalysis.VisualBasic", "4.9.2", DependencyType.PackageReference),
824
+ new Dependency("Newtonsoft.Json.Bson", "1.0.2", DependencyType.PackageReference)
825
+ };
826
+ var update = new[]
838
827
  {
839
- repoRoot.Delete(recursive: true);
840
- }
828
+ new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference),
829
+ new Dependency("Newtonsoft.Json", "13.0.1", DependencyType.Unknown)
830
+ };
831
+
832
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
833
+ tempDirectory.DirectoryPath,
834
+ projectPath,
835
+ "net8.0",
836
+ dependencies,
837
+ update,
838
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
839
+ new TestLogger()
840
+ );
841
+ Assert.NotNull(resolvedDependencies);
842
+ Assert.Equal(5, resolvedDependencies.Length);
843
+ Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
844
+ Assert.Equal("4.10.0", resolvedDependencies[0].Version);
845
+ Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[1].Name);
846
+ Assert.Equal("4.10.0", resolvedDependencies[1].Version);
847
+ Assert.Equal("Microsoft.CodeAnalysis.VisualBasic", resolvedDependencies[2].Name);
848
+ Assert.Equal("4.10.0", resolvedDependencies[2].Version);
849
+ Assert.Equal("Newtonsoft.Json.Bson", resolvedDependencies[3].Name);
850
+ Assert.Equal("1.0.2", resolvedDependencies[3].Version);
851
+ Assert.Equal("Newtonsoft.Json", resolvedDependencies[4].Name);
852
+ Assert.Equal("13.0.1", resolvedDependencies[4].Version);
841
853
  }
842
854
 
843
855
  // Two top level packages (Buildalyzer), (Microsoft.CodeAnalysis.CSharp.Scripting) that share a dependency (Microsoft.CodeAnalysis.Csharp)
@@ -845,476 +857,494 @@ public class MSBuildHelperTests : TestBase
845
857
  // First family: Buildalyzer 7.0.1 requires Microsoft.CodeAnalysis.CSharp to be >= 4.0.0 and Microsoft.CodeAnalysis.Common to be 4.0.0 (@ 6.0.4, Microsoft.CodeAnalysis.Common isn't a dependency of buildalyzer)
846
858
  // Second family: Microsoft.CodeAnalysis.CSharp.Scripting 4.0.0 requires Microsoft.CodeAnalysis.CSharp 4.0.0 and Microsoft.CodeAnalysis.Common to be 4.0.0 (Specific version)
847
859
  // Updating Buildalyzer to 7.0.1 will update its transitive dependency (Microsoft.CodeAnalysis.Common) and then its transitive dependency's "family"
848
- [Fact]
849
- public async Task DependencyConflictsCanBeResolvedNewSharingDependency()
860
+ [Theory]
861
+ [InlineData(true)]
862
+ [InlineData(false)]
863
+ public async Task DependencyConflictsCanBeResolvedNewSharingDependency(bool useExistingSdks)
850
864
  {
851
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewSharingDependency)}_");
865
+ using var tempDirectory = new TemporaryDirectory();
866
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
867
+ await File.WriteAllTextAsync(projectPath, """
868
+ <Project Sdk="Microsoft.NET.Sdk">
869
+ <PropertyGroup>
870
+ <TargetFramework>net8.0</TargetFramework>
871
+ </PropertyGroup>
872
+ <ItemGroup>
873
+ <PackageReference Include="Buildalyzer" Version="6.0.4" />
874
+ <PackageReference Include="Microsoft.CodeAnalysis.Csharp.Scripting" Version="3.10.0" />
875
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.10.0" />
876
+ <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="3.10.0" />
877
+ </ItemGroup>
878
+ </Project>
879
+ """);
852
880
 
853
- try
881
+ var dependencies = new[]
854
882
  {
855
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
856
- await File.WriteAllTextAsync(projectPath, """
857
- <Project Sdk="Microsoft.NET.Sdk">
858
- <PropertyGroup>
859
- <TargetFramework>net8.0</TargetFramework>
860
- </PropertyGroup>
861
- <ItemGroup>
862
- <PackageReference Include="Buildalyzer" Version="6.0.4" />
863
- <PackageReference Include="Microsoft.CodeAnalysis.Csharp.Scripting" Version="3.10.0" />
864
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.10.0" />
865
- <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="3.10.0" />
866
- </ItemGroup>
867
- </Project>
868
- """);
869
-
870
- var dependencies = new[]
871
- {
872
- new Dependency("Buildalyzer", "6.0.4", DependencyType.PackageReference),
873
- new Dependency("Microsoft.CodeAnalysis.CSharp.Scripting", "3.10.0", DependencyType.PackageReference),
874
- new Dependency("Microsoft.CodeAnalysis.CSharp", "3.10.0", DependencyType.PackageReference),
875
- new Dependency("Microsoft.CodeAnalysis.Common", "3.10.0", DependencyType.PackageReference),
876
- };
877
- var update = new[]
878
- {
879
- new Dependency("Buildalyzer", "7.0.1", DependencyType.PackageReference),
880
- };
881
-
882
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
883
- Assert.NotNull(resolvedDependencies);
884
- Assert.Equal(4, resolvedDependencies.Length);
885
- Assert.Equal("Buildalyzer", resolvedDependencies[0].Name);
886
- Assert.Equal("7.0.1", resolvedDependencies[0].Version);
887
- Assert.Equal("Microsoft.CodeAnalysis.CSharp.Scripting", resolvedDependencies[1].Name);
888
- Assert.Equal("4.0.0", resolvedDependencies[1].Version);
889
- Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[2].Name);
890
- Assert.Equal("4.0.0", resolvedDependencies[2].Version);
891
- Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[3].Name);
892
- Assert.Equal("4.0.0", resolvedDependencies[3].Version);
893
- }
894
- finally
883
+ new Dependency("Buildalyzer", "6.0.4", DependencyType.PackageReference),
884
+ new Dependency("Microsoft.CodeAnalysis.CSharp.Scripting", "3.10.0", DependencyType.PackageReference),
885
+ new Dependency("Microsoft.CodeAnalysis.CSharp", "3.10.0", DependencyType.PackageReference),
886
+ new Dependency("Microsoft.CodeAnalysis.Common", "3.10.0", DependencyType.PackageReference),
887
+ };
888
+ var update = new[]
895
889
  {
896
- repoRoot.Delete(recursive: true);
897
- }
890
+ new Dependency("Buildalyzer", "7.0.1", DependencyType.PackageReference),
891
+ };
892
+
893
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
894
+ tempDirectory.DirectoryPath,
895
+ projectPath,
896
+ "net8.0",
897
+ dependencies,
898
+ update,
899
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
900
+ new TestLogger()
901
+ );
902
+ Assert.NotNull(resolvedDependencies);
903
+ Assert.Equal(4, resolvedDependencies.Length);
904
+ Assert.Equal("Buildalyzer", resolvedDependencies[0].Name);
905
+ Assert.Equal("7.0.1", resolvedDependencies[0].Version);
906
+ Assert.Equal("Microsoft.CodeAnalysis.CSharp.Scripting", resolvedDependencies[1].Name);
907
+ Assert.Equal("4.0.0", resolvedDependencies[1].Version);
908
+ Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[2].Name);
909
+ Assert.Equal("4.0.0", resolvedDependencies[2].Version);
910
+ Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[3].Name);
911
+ Assert.Equal("4.0.0", resolvedDependencies[3].Version);
898
912
  }
899
913
 
900
914
  // Updating two families at once to test efficiency
901
915
  // First family: Direct dependency (Microsoft.CodeAnalysis.Common) needs to be updated, which will then need to update in the existing list its dependency (System.Collections.Immutable) and "parent" (Microsoft.CodeAnalysis.Csharp.Scripting)
902
916
  // Second family: Updating the root package (Azure.Core) in the existing list will also need to update its dependency (Microsoft.Bcl.AsyncInterfaces)
903
- [Fact]
904
- public async Task DependencyConflictsCanBeResolvedNewUpdatingEntireFamily()
917
+ [Theory]
918
+ [InlineData(true)]
919
+ [InlineData(false)]
920
+ public async Task DependencyConflictsCanBeResolvedNewUpdatingEntireFamily(bool useExistingSdks)
905
921
  {
906
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewUpdatingEntireFamily)}_");
922
+ using var tempDirectory = new TemporaryDirectory();
923
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
924
+ await File.WriteAllTextAsync(projectPath, """
925
+ <Project Sdk="Microsoft.NET.Sdk">
926
+ <PropertyGroup>
927
+ <TargetFramework>net8.0</TargetFramework>
928
+ </PropertyGroup>
929
+ <ItemGroup>
930
+ <PackageReference Include="System.Collections.Immutable" Version="7.0.0" />
931
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.8.0" />
932
+ <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="1.0.0" />
933
+ <PackageReference Include="Azure.Core" Version="1.21.0" />
934
+ </ItemGroup>
935
+ </Project>
936
+ """);
907
937
 
908
- try
938
+ var dependencies = new[]
909
939
  {
910
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
911
- await File.WriteAllTextAsync(projectPath, """
912
- <Project Sdk="Microsoft.NET.Sdk">
913
- <PropertyGroup>
914
- <TargetFramework>net8.0</TargetFramework>
915
- </PropertyGroup>
916
- <ItemGroup>
917
- <PackageReference Include="System.Collections.Immutable" Version="7.0.0" />
918
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.8.0" />
919
- <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="1.0.0" />
920
- <PackageReference Include="Azure.Core" Version="1.21.0" />
921
- </ItemGroup>
922
- </Project>
923
- """);
940
+ new Dependency("System.Collections.Immutable", "7.0.0", DependencyType.PackageReference),
941
+ new Dependency("Microsoft.CodeAnalysis.CSharp.Scripting", "4.8.0", DependencyType.PackageReference),
942
+ new Dependency("Microsoft.Bcl.AsyncInterfaces", "1.0.0", DependencyType.Unknown),
943
+ new Dependency("Azure.Core", "1.21.0", DependencyType.PackageReference),
924
944
 
925
- var dependencies = new[]
926
- {
927
- new Dependency("System.Collections.Immutable", "7.0.0", DependencyType.PackageReference),
928
- new Dependency("Microsoft.CodeAnalysis.CSharp.Scripting", "4.8.0", DependencyType.PackageReference),
929
- new Dependency("Microsoft.Bcl.AsyncInterfaces", "1.0.0", DependencyType.Unknown),
930
- new Dependency("Azure.Core", "1.21.0", DependencyType.PackageReference),
931
-
932
- };
933
- var update = new[]
934
- {
935
- new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference),
936
- new Dependency("Azure.Core", "1.22.0", DependencyType.PackageReference)
937
- };
938
-
939
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
940
- Assert.NotNull(resolvedDependencies);
941
- Assert.Equal(4, resolvedDependencies.Length);
942
- Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
943
- Assert.Equal("8.0.0", resolvedDependencies[0].Version);
944
- Assert.Equal("Microsoft.CodeAnalysis.CSharp.Scripting", resolvedDependencies[1].Name);
945
- Assert.Equal("4.10.0", resolvedDependencies[1].Version);
946
- Assert.Equal("Microsoft.Bcl.AsyncInterfaces", resolvedDependencies[2].Name);
947
- Assert.Equal("1.1.1", resolvedDependencies[2].Version);
948
- Assert.Equal("Azure.Core", resolvedDependencies[3].Name);
949
- Assert.Equal("1.22.0", resolvedDependencies[3].Version);
950
- }
951
- finally
945
+ };
946
+ var update = new[]
952
947
  {
953
- repoRoot.Delete(recursive: true);
954
- }
948
+ new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference),
949
+ new Dependency("Azure.Core", "1.22.0", DependencyType.PackageReference)
950
+ };
951
+
952
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
953
+ tempDirectory.DirectoryPath,
954
+ projectPath,
955
+ "net8.0",
956
+ dependencies,
957
+ update,
958
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
959
+ new TestLogger()
960
+ );
961
+ Assert.NotNull(resolvedDependencies);
962
+ Assert.Equal(4, resolvedDependencies.Length);
963
+ Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
964
+ Assert.Equal("8.0.0", resolvedDependencies[0].Version);
965
+ Assert.Equal("Microsoft.CodeAnalysis.CSharp.Scripting", resolvedDependencies[1].Name);
966
+ Assert.Equal("4.10.0", resolvedDependencies[1].Version);
967
+ Assert.Equal("Microsoft.Bcl.AsyncInterfaces", resolvedDependencies[2].Name);
968
+ Assert.Equal("1.1.1", resolvedDependencies[2].Version);
969
+ Assert.Equal("Azure.Core", resolvedDependencies[3].Name);
970
+ Assert.Equal("1.22.0", resolvedDependencies[3].Version);
955
971
  }
956
972
 
957
973
  // Similar to the last test, except Microsoft.CodeAnalysis.Common is in the existing list
958
- [Fact]
959
- public async Task DependencyConflictsCanBeResolvedNewUpdatingTopLevelAndDependency()
974
+ [Theory]
975
+ [InlineData(true)]
976
+ [InlineData(false)]
977
+ public async Task DependencyConflictsCanBeResolvedNewUpdatingTopLevelAndDependency(bool useExistingSdks)
960
978
  {
961
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewUpdatingTopLevelAndDependency)}_");
979
+ using var tempDirectory = new TemporaryDirectory();
980
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
981
+ await File.WriteAllTextAsync(projectPath, """
982
+ <Project Sdk="Microsoft.NET.Sdk">
983
+ <PropertyGroup>
984
+ <TargetFramework>net8.0</TargetFramework>
985
+ </PropertyGroup>
986
+ <ItemGroup>
987
+ <PackageReference Include="System.Collections.Immutable" Version="7.0.0" />
988
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.8.0" />
989
+ <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.8.0" />
990
+ <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="1.0.0" />
991
+ <PackageReference Include="Azure.Core" Version="1.21.0" />
992
+ </ItemGroup>
993
+ </Project>
994
+ """);
962
995
 
963
- try
996
+ var dependencies = new[]
964
997
  {
965
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
966
- await File.WriteAllTextAsync(projectPath, """
967
- <Project Sdk="Microsoft.NET.Sdk">
968
- <PropertyGroup>
969
- <TargetFramework>net8.0</TargetFramework>
970
- </PropertyGroup>
971
- <ItemGroup>
972
- <PackageReference Include="System.Collections.Immutable" Version="7.0.0" />
973
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.8.0" />
974
- <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.8.0" />
975
- <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="1.0.0" />
976
- <PackageReference Include="Azure.Core" Version="1.21.0" />
977
- </ItemGroup>
978
- </Project>
979
- """);
980
-
981
- var dependencies = new[]
982
- {
983
- new Dependency("System.Collections.Immutable", "7.0.0", DependencyType.PackageReference),
984
- new Dependency("Microsoft.CodeAnalysis.CSharp.Scripting", "4.8.0", DependencyType.PackageReference),
985
- new Dependency("Microsoft.CodeAnalysis.Common", "4.8.0", DependencyType.PackageReference),
986
- new Dependency("Microsoft.Bcl.AsyncInterfaces", "1.0.0", DependencyType.Unknown),
987
- new Dependency("Azure.Core", "1.21.0", DependencyType.PackageReference),
988
-
989
- };
990
- var update = new[]
991
- {
992
- new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference),
993
- new Dependency("Azure.Core", "1.22.0", DependencyType.PackageReference)
994
- };
998
+ new Dependency("System.Collections.Immutable", "7.0.0", DependencyType.PackageReference),
999
+ new Dependency("Microsoft.CodeAnalysis.CSharp.Scripting", "4.8.0", DependencyType.PackageReference),
1000
+ new Dependency("Microsoft.CodeAnalysis.Common", "4.8.0", DependencyType.PackageReference),
1001
+ new Dependency("Microsoft.Bcl.AsyncInterfaces", "1.0.0", DependencyType.Unknown),
1002
+ new Dependency("Azure.Core", "1.21.0", DependencyType.PackageReference),
995
1003
 
996
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
997
- Assert.NotNull(resolvedDependencies);
998
- Assert.Equal(5, resolvedDependencies.Length);
999
- Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
1000
- Assert.Equal("8.0.0", resolvedDependencies[0].Version);
1001
- Assert.Equal("Microsoft.CodeAnalysis.CSharp.Scripting", resolvedDependencies[1].Name);
1002
- Assert.Equal("4.10.0", resolvedDependencies[1].Version);
1003
- Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[2].Name);
1004
- Assert.Equal("4.10.0", resolvedDependencies[2].Version);
1005
- Assert.Equal("Microsoft.Bcl.AsyncInterfaces", resolvedDependencies[3].Name);
1006
- Assert.Equal("1.1.1", resolvedDependencies[3].Version);
1007
- Assert.Equal("Azure.Core", resolvedDependencies[4].Name);
1008
- Assert.Equal("1.22.0", resolvedDependencies[4].Version);
1009
- }
1010
- finally
1004
+ };
1005
+ var update = new[]
1011
1006
  {
1012
- repoRoot.Delete(recursive: true);
1013
- }
1007
+ new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference),
1008
+ new Dependency("Azure.Core", "1.22.0", DependencyType.PackageReference)
1009
+ };
1010
+
1011
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
1012
+ tempDirectory.DirectoryPath,
1013
+ projectPath,
1014
+ "net8.0",
1015
+ dependencies,
1016
+ update,
1017
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
1018
+ new TestLogger()
1019
+ );
1020
+ Assert.NotNull(resolvedDependencies);
1021
+ Assert.Equal(5, resolvedDependencies.Length);
1022
+ Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
1023
+ Assert.Equal("8.0.0", resolvedDependencies[0].Version);
1024
+ Assert.Equal("Microsoft.CodeAnalysis.CSharp.Scripting", resolvedDependencies[1].Name);
1025
+ Assert.Equal("4.10.0", resolvedDependencies[1].Version);
1026
+ Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[2].Name);
1027
+ Assert.Equal("4.10.0", resolvedDependencies[2].Version);
1028
+ Assert.Equal("Microsoft.Bcl.AsyncInterfaces", resolvedDependencies[3].Name);
1029
+ Assert.Equal("1.1.1", resolvedDependencies[3].Version);
1030
+ Assert.Equal("Azure.Core", resolvedDependencies[4].Name);
1031
+ Assert.Equal("1.22.0", resolvedDependencies[4].Version);
1014
1032
  }
1015
1033
 
1016
1034
  // Out of scope test: AutoMapper.Extensions.Microsoft.DependencyInjection's versions are not yet compatible
1017
1035
  // To update root package (AutoMapper.Collection) to 10.0.0, its dependency (AutoMapper) needs to update to 13.0.0.
1018
1036
  // However, there is no higher version of AutoMapper's other "parent" (AutoMapper.Extensions.Microsoft.DependencyInjection) that is compatible with the new version
1019
- [Fact]
1020
- public async Task DependencyConflictsCanBeResolvedNewOutOfScope()
1037
+ [Theory]
1038
+ [InlineData(true)]
1039
+ [InlineData(false)]
1040
+ public async Task DependencyConflictsCanBeResolvedNewOutOfScope(bool useExistingSdks)
1021
1041
  {
1022
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewOutOfScope)}_");
1042
+ using var tempDirectory = new TemporaryDirectory();
1043
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
1044
+ await File.WriteAllTextAsync(projectPath, """
1045
+ <Project Sdk="Microsoft.NET.Sdk">
1046
+ <PropertyGroup>
1047
+ <TargetFramework>net8.0</TargetFramework>
1048
+ </PropertyGroup>
1049
+ <ItemGroup>
1050
+ <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
1051
+ <PackageReference Include="AutoMapper" Version="12.0.1" />
1052
+ <PackageReference Include="AutoMapper.Collection" Version="9.0.0" />
1053
+ </ItemGroup>
1054
+ </Project>
1055
+ """);
1023
1056
 
1024
- try
1057
+ var dependencies = new[]
1025
1058
  {
1026
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
1027
- await File.WriteAllTextAsync(projectPath, """
1028
- <Project Sdk="Microsoft.NET.Sdk">
1029
- <PropertyGroup>
1030
- <TargetFramework>net8.0</TargetFramework>
1031
- </PropertyGroup>
1032
- <ItemGroup>
1033
- <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
1034
- <PackageReference Include="AutoMapper" Version="12.0.1" />
1035
- <PackageReference Include="AutoMapper.Collection" Version="9.0.0" />
1036
- </ItemGroup>
1037
- </Project>
1038
- """);
1039
-
1040
- var dependencies = new[]
1041
- {
1042
- new Dependency("AutoMapper.Extensions.Microsoft.DependencyInjection", "12.0.1", DependencyType.PackageReference),
1043
- new Dependency("AutoMapper", "12.0.1", DependencyType.PackageReference),
1044
- new Dependency("AutoMapper.Collection", "9.0.0", DependencyType.PackageReference)
1045
- };
1046
- var update = new[]
1047
- {
1048
- new Dependency("AutoMapper.Collection", "10.0.0", DependencyType.PackageReference)
1049
- };
1050
-
1051
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
1052
- Assert.NotNull(resolvedDependencies);
1053
- Assert.Equal(3, resolvedDependencies.Length);
1054
- Assert.Equal("AutoMapper.Extensions.Microsoft.DependencyInjection", resolvedDependencies[0].Name);
1055
- Assert.Equal("12.0.1", resolvedDependencies[0].Version);
1056
- Assert.Equal("AutoMapper", resolvedDependencies[1].Name);
1057
- Assert.Equal("12.0.1", resolvedDependencies[1].Version);
1058
- Assert.Equal("AutoMapper.Collection", resolvedDependencies[2].Name);
1059
- Assert.Equal("9.0.0", resolvedDependencies[2].Version);
1060
- }
1061
- finally
1059
+ new Dependency("AutoMapper.Extensions.Microsoft.DependencyInjection", "12.0.1", DependencyType.PackageReference),
1060
+ new Dependency("AutoMapper", "12.0.1", DependencyType.PackageReference),
1061
+ new Dependency("AutoMapper.Collection", "9.0.0", DependencyType.PackageReference)
1062
+ };
1063
+ var update = new[]
1062
1064
  {
1063
- repoRoot.Delete(recursive: true);
1064
- }
1065
+ new Dependency("AutoMapper.Collection", "10.0.0", DependencyType.PackageReference)
1066
+ };
1067
+
1068
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
1069
+ tempDirectory.DirectoryPath,
1070
+ projectPath,
1071
+ "net8.0",
1072
+ dependencies,
1073
+ update,
1074
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
1075
+ new TestLogger()
1076
+ );
1077
+ Assert.NotNull(resolvedDependencies);
1078
+ Assert.Equal(3, resolvedDependencies.Length);
1079
+ Assert.Equal("AutoMapper.Extensions.Microsoft.DependencyInjection", resolvedDependencies[0].Name);
1080
+ Assert.Equal("12.0.1", resolvedDependencies[0].Version);
1081
+ Assert.Equal("AutoMapper", resolvedDependencies[1].Name);
1082
+ Assert.Equal("12.0.1", resolvedDependencies[1].Version);
1083
+ Assert.Equal("AutoMapper.Collection", resolvedDependencies[2].Name);
1084
+ Assert.Equal("9.0.0", resolvedDependencies[2].Version);
1065
1085
  }
1066
1086
 
1067
1087
  // Two dependencies (Microsoft.Extensions.Caching.Memory), (Microsoft.EntityFrameworkCore.Analyzers) used by the same parent (Microsoft.EntityFrameworkCore), updating one of the dependencies
1068
- [Fact]
1069
- public async Task DependencyConflictsCanBeResolvedNewTwoDependenciesShareSameParent()
1088
+ [Theory]
1089
+ [InlineData(true)]
1090
+ [InlineData(false)]
1091
+ public async Task DependencyConflictsCanBeResolvedNewTwoDependenciesShareSameParent(bool useExistingSdks)
1070
1092
  {
1071
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewTwoDependenciesShareSameParent)}_");
1093
+ using var tempDirectory = new TemporaryDirectory();
1094
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
1095
+ await File.WriteAllTextAsync(projectPath, """
1096
+ <Project Sdk="Microsoft.NET.Sdk">
1097
+ <PropertyGroup>
1098
+ <TargetFramework>net8.0</TargetFramework>
1099
+ </PropertyGroup>
1100
+ <ItemGroup>
1101
+ <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.11" />
1102
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" Version="7.0.11" />
1103
+ </ItemGroup>
1104
+ </Project>
1105
+ """);
1072
1106
 
1073
- try
1107
+ var dependencies = new[]
1074
1108
  {
1075
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
1076
- await File.WriteAllTextAsync(projectPath, """
1077
- <Project Sdk="Microsoft.NET.Sdk">
1078
- <PropertyGroup>
1079
- <TargetFramework>net8.0</TargetFramework>
1080
- </PropertyGroup>
1081
- <ItemGroup>
1082
- <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.11" />
1083
- <PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" Version="7.0.11" />
1084
- </ItemGroup>
1085
- </Project>
1086
- """);
1087
-
1088
- var dependencies = new[]
1089
- {
1090
- new Dependency("Microsoft.EntityFrameworkCore", "7.0.11", DependencyType.PackageReference),
1091
- new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "7.0.11", DependencyType.PackageReference)
1092
- };
1093
- var update = new[]
1094
- {
1095
- new Dependency("Microsoft.Extensions.Caching.Memory", "8.0.0", DependencyType.PackageReference)
1096
- };
1097
-
1098
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
1099
- Assert.NotNull(resolvedDependencies);
1100
- Assert.Equal(2, resolvedDependencies.Length);
1101
- Assert.Equal("Microsoft.EntityFrameworkCore", resolvedDependencies[0].Name);
1102
- Assert.Equal("8.0.0", resolvedDependencies[0].Version);
1103
- Assert.Equal("Microsoft.EntityFrameworkCore.Analyzers", resolvedDependencies[1].Name);
1104
- Assert.Equal("8.0.0", resolvedDependencies[1].Version);
1105
- }
1106
- finally
1109
+ new Dependency("Microsoft.EntityFrameworkCore", "7.0.11", DependencyType.PackageReference),
1110
+ new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "7.0.11", DependencyType.PackageReference)
1111
+ };
1112
+ var update = new[]
1107
1113
  {
1108
- repoRoot.Delete(recursive: true);
1109
- }
1114
+ new Dependency("Microsoft.Extensions.Caching.Memory", "8.0.0", DependencyType.PackageReference)
1115
+ };
1116
+
1117
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
1118
+ tempDirectory.DirectoryPath,
1119
+ projectPath,
1120
+ "net8.0",
1121
+ dependencies,
1122
+ update,
1123
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
1124
+ new TestLogger()
1125
+ );
1126
+ Assert.NotNull(resolvedDependencies);
1127
+ Assert.Equal(2, resolvedDependencies.Length);
1128
+ Assert.Equal("Microsoft.EntityFrameworkCore", resolvedDependencies[0].Name);
1129
+ Assert.Equal("8.0.0", resolvedDependencies[0].Version);
1130
+ Assert.Equal("Microsoft.EntityFrameworkCore.Analyzers", resolvedDependencies[1].Name);
1131
+ Assert.Equal("8.0.0", resolvedDependencies[1].Version);
1110
1132
  }
1111
1133
 
1112
1134
  // Updating referenced package
1113
1135
  // 4 dependency chain to be updated. Since the package to be updated is in the existing list, do not update its parents since we want to change as little as possible
1114
- [Fact]
1115
- public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourExisting()
1136
+ [Theory]
1137
+ [InlineData(true)]
1138
+ [InlineData(false)]
1139
+ public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourExisting(bool useExistingSdks)
1116
1140
  {
1117
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewFamilyOfFourExisting)}_");
1141
+ using var tempDirectory = new TemporaryDirectory();
1142
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
1143
+ await File.WriteAllTextAsync(projectPath, """
1144
+ <Project Sdk="Microsoft.NET.Sdk">
1145
+ <PropertyGroup>
1146
+ <TargetFramework>net8.0</TargetFramework>
1147
+ </PropertyGroup>
1148
+ <ItemGroup>
1149
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.0" />
1150
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0" />
1151
+ <PackageReference Include= "Microsoft.EntityFrameworkCore" Version="7.0.0" />
1152
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" Version="7.0.0" />
1153
+ </ItemGroup>
1154
+ </Project>
1155
+ """);
1118
1156
 
1119
- try
1157
+ var dependencies = new[]
1120
1158
  {
1121
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
1122
- await File.WriteAllTextAsync(projectPath, """
1123
- <Project Sdk="Microsoft.NET.Sdk">
1124
- <PropertyGroup>
1125
- <TargetFramework>net8.0</TargetFramework>
1126
- </PropertyGroup>
1127
- <ItemGroup>
1128
- <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.0" />
1129
- <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0" />
1130
- <PackageReference Include= "Microsoft.EntityFrameworkCore" Version="7.0.0" />
1131
- <PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" Version="7.0.0" />
1132
- </ItemGroup>
1133
- </Project>
1134
- """);
1135
-
1136
- var dependencies = new[]
1137
- {
1138
- new Dependency("Microsoft.EntityFrameworkCore.Design", "7.0.0", DependencyType.PackageReference),
1139
- new Dependency("Microsoft.EntityFrameworkCore.Relational", "7.0.0", DependencyType.PackageReference),
1140
- new Dependency("Microsoft.EntityFrameworkCore", "7.0.0", DependencyType.PackageReference),
1141
- new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "7.0.0", DependencyType.PackageReference)
1142
- };
1143
- var update = new[]
1144
- {
1145
- new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0", DependencyType.PackageReference)
1146
- };
1147
-
1148
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
1149
- Assert.NotNull(resolvedDependencies);
1150
- Assert.Equal(4, resolvedDependencies.Length);
1151
- Assert.Equal("Microsoft.EntityFrameworkCore.Design", resolvedDependencies[0].Name);
1152
- Assert.Equal("7.0.0", resolvedDependencies[0].Version);
1153
- Assert.Equal("Microsoft.EntityFrameworkCore.Relational", resolvedDependencies[1].Name);
1154
- Assert.Equal("7.0.0", resolvedDependencies[1].Version);
1155
- Assert.Equal("Microsoft.EntityFrameworkCore", resolvedDependencies[2].Name);
1156
- Assert.Equal("7.0.0", resolvedDependencies[2].Version);
1157
- Assert.Equal("Microsoft.EntityFrameworkCore.Analyzers", resolvedDependencies[3].Name);
1158
- Assert.Equal("8.0.0", resolvedDependencies[3].Version);
1159
- }
1160
- finally
1159
+ new Dependency("Microsoft.EntityFrameworkCore.Design", "7.0.0", DependencyType.PackageReference),
1160
+ new Dependency("Microsoft.EntityFrameworkCore.Relational", "7.0.0", DependencyType.PackageReference),
1161
+ new Dependency("Microsoft.EntityFrameworkCore", "7.0.0", DependencyType.PackageReference),
1162
+ new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "7.0.0", DependencyType.PackageReference)
1163
+ };
1164
+ var update = new[]
1161
1165
  {
1162
- repoRoot.Delete(recursive: true);
1163
- }
1166
+ new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0", DependencyType.PackageReference)
1167
+ };
1168
+
1169
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
1170
+ tempDirectory.DirectoryPath,
1171
+ projectPath,
1172
+ "net8.0",
1173
+ dependencies,
1174
+ update,
1175
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
1176
+ new TestLogger()
1177
+ );
1178
+ Assert.NotNull(resolvedDependencies);
1179
+ Assert.Equal(4, resolvedDependencies.Length);
1180
+ Assert.Equal("Microsoft.EntityFrameworkCore.Design", resolvedDependencies[0].Name);
1181
+ Assert.Equal("7.0.0", resolvedDependencies[0].Version);
1182
+ Assert.Equal("Microsoft.EntityFrameworkCore.Relational", resolvedDependencies[1].Name);
1183
+ Assert.Equal("7.0.0", resolvedDependencies[1].Version);
1184
+ Assert.Equal("Microsoft.EntityFrameworkCore", resolvedDependencies[2].Name);
1185
+ Assert.Equal("7.0.0", resolvedDependencies[2].Version);
1186
+ Assert.Equal("Microsoft.EntityFrameworkCore.Analyzers", resolvedDependencies[3].Name);
1187
+ Assert.Equal("8.0.0", resolvedDependencies[3].Version);
1164
1188
  }
1165
1189
 
1166
1190
  // Updating unreferenced package
1167
1191
  // 4 dependency chain to be updated, dependency to be updated is not in the existing list, so its family will all be updated
1168
- [Fact]
1169
- public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourNotInExisting()
1192
+ [Theory]
1193
+ [InlineData(true)]
1194
+ [InlineData(false)]
1195
+ public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourNotInExisting(bool useExistingSdks)
1170
1196
  {
1171
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewFamilyOfFourNotInExisting)}_");
1197
+ using var tempDirectory = new TemporaryDirectory();
1198
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
1199
+ await File.WriteAllTextAsync(projectPath, """
1200
+ <Project Sdk="Microsoft.NET.Sdk">
1201
+ <PropertyGroup>
1202
+ <TargetFramework>net8.0</TargetFramework>
1203
+ </PropertyGroup>
1204
+ <ItemGroup>
1205
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.0" />
1206
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0" />
1207
+ <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0" />
1208
+ </ItemGroup>
1209
+ </Project>
1210
+ """);
1172
1211
 
1173
- try
1212
+ var dependencies = new[]
1174
1213
  {
1175
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
1176
- await File.WriteAllTextAsync(projectPath, """
1177
- <Project Sdk="Microsoft.NET.Sdk">
1178
- <PropertyGroup>
1179
- <TargetFramework>net8.0</TargetFramework>
1180
- </PropertyGroup>
1181
- <ItemGroup>
1182
- <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.0" />
1183
- <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0" />
1184
- <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.0" />
1185
- </ItemGroup>
1186
- </Project>
1187
- """);
1188
-
1189
- var dependencies = new[]
1190
- {
1191
- new Dependency("Microsoft.EntityFrameworkCore.Design", "7.0.0", DependencyType.PackageReference),
1192
- new Dependency("Microsoft.EntityFrameworkCore.Relational", "7.0.0", DependencyType.PackageReference),
1193
- new Dependency("Microsoft.EntityFrameworkCore", "7.0.0", DependencyType.PackageReference),
1194
- };
1195
- var update = new[]
1196
- {
1197
- new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0", DependencyType.PackageReference)
1198
- };
1199
-
1200
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
1201
- Assert.NotNull(resolvedDependencies);
1202
- Assert.Equal(3, resolvedDependencies.Length);
1203
- Assert.Equal("Microsoft.EntityFrameworkCore.Design", resolvedDependencies[0].Name);
1204
- Assert.Equal("8.0.0", resolvedDependencies[0].Version);
1205
- Assert.Equal("Microsoft.EntityFrameworkCore.Relational", resolvedDependencies[1].Name);
1206
- Assert.Equal("8.0.0", resolvedDependencies[1].Version);
1207
- Assert.Equal("Microsoft.EntityFrameworkCore", resolvedDependencies[2].Name);
1208
- Assert.Equal("8.0.0", resolvedDependencies[2].Version);
1209
- }
1210
- finally
1214
+ new Dependency("Microsoft.EntityFrameworkCore.Design", "7.0.0", DependencyType.PackageReference),
1215
+ new Dependency("Microsoft.EntityFrameworkCore.Relational", "7.0.0", DependencyType.PackageReference),
1216
+ new Dependency("Microsoft.EntityFrameworkCore", "7.0.0", DependencyType.PackageReference),
1217
+ };
1218
+ var update = new[]
1211
1219
  {
1212
- repoRoot.Delete(recursive: true);
1213
- }
1220
+ new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0", DependencyType.PackageReference)
1221
+ };
1222
+
1223
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
1224
+ tempDirectory.DirectoryPath,
1225
+ projectPath,
1226
+ "net8.0",
1227
+ dependencies,
1228
+ update,
1229
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
1230
+ new TestLogger()
1231
+ );
1232
+ Assert.NotNull(resolvedDependencies);
1233
+ Assert.Equal(3, resolvedDependencies.Length);
1234
+ Assert.Equal("Microsoft.EntityFrameworkCore.Design", resolvedDependencies[0].Name);
1235
+ Assert.Equal("8.0.0", resolvedDependencies[0].Version);
1236
+ Assert.Equal("Microsoft.EntityFrameworkCore.Relational", resolvedDependencies[1].Name);
1237
+ Assert.Equal("8.0.0", resolvedDependencies[1].Version);
1238
+ Assert.Equal("Microsoft.EntityFrameworkCore", resolvedDependencies[2].Name);
1239
+ Assert.Equal("8.0.0", resolvedDependencies[2].Version);
1214
1240
  }
1215
1241
 
1216
1242
  // Updating a referenced transitive dependency
1217
1243
  // Updating a transtitive dependency (System.Collections.Immutable) to 8.0.0, which will update its "parent" (Microsoft.CodeAnalysis.CSharp) and its "grandparent" (Microsoft.CodeAnalysis.CSharp.Workspaces) to update
1218
- [Fact]
1219
- public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourSpecificExisting()
1244
+ [Theory]
1245
+ [InlineData(true)]
1246
+ [InlineData(false)]
1247
+ public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourSpecificExisting(bool useExistingSdks)
1220
1248
  {
1221
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewFamilyOfFourSpecificExisting)}_");
1249
+ using var tempDirectory = new TemporaryDirectory();
1250
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
1251
+ await File.WriteAllTextAsync(projectPath, """
1252
+ <Project Sdk="Microsoft.NET.Sdk">
1253
+ <PropertyGroup>
1254
+ <TargetFramework>net8.0</TargetFramework>
1255
+ </PropertyGroup>
1256
+ <ItemGroup>
1257
+ <PackageReference Include="System.Collections.Immutable" Version="7.0.0" />
1258
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.8.0" />
1259
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
1260
+ <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.8.0" />
1261
+ </ItemGroup>
1262
+ </Project>
1263
+ """);
1222
1264
 
1223
- try
1265
+ var dependencies = new[]
1224
1266
  {
1225
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
1226
- await File.WriteAllTextAsync(projectPath, """
1227
- <Project Sdk="Microsoft.NET.Sdk">
1228
- <PropertyGroup>
1229
- <TargetFramework>net8.0</TargetFramework>
1230
- </PropertyGroup>
1231
- <ItemGroup>
1232
- <PackageReference Include="System.Collections.Immutable" Version="7.0.0" />
1233
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.8.0" />
1234
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
1235
- <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.8.0" />
1236
- </ItemGroup>
1237
- </Project>
1238
- """);
1239
-
1240
- var dependencies = new[]
1241
- {
1242
- new Dependency("System.Collections.Immutable", "7.0.0", DependencyType.PackageReference),
1243
- new Dependency("Microsoft.CodeAnalysis.CSharp.Workspaces", "4.8.0", DependencyType.PackageReference),
1244
- new Dependency("Microsoft.CodeAnalysis.CSharp", "4.8.0", DependencyType.PackageReference),
1245
- new Dependency("Microsoft.CodeAnalysis.Common", "4.8.0", DependencyType.PackageReference),
1246
- };
1247
- var update = new[]
1248
- {
1249
- new Dependency("System.Collections.Immutable", "8.0.0", DependencyType.PackageReference),
1250
- };
1251
-
1252
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
1253
- Assert.NotNull(resolvedDependencies);
1254
- Assert.Equal(4, resolvedDependencies.Length);
1255
- Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
1256
- Assert.Equal("8.0.0", resolvedDependencies[0].Version);
1257
- Assert.Equal("Microsoft.CodeAnalysis.CSharp.Workspaces", resolvedDependencies[1].Name);
1258
- Assert.Equal("4.8.0", resolvedDependencies[1].Version);
1259
- Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[2].Name);
1260
- Assert.Equal("4.8.0", resolvedDependencies[2].Version);
1261
- Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[3].Name);
1262
- Assert.Equal("4.8.0", resolvedDependencies[3].Version);
1263
- }
1264
- finally
1267
+ new Dependency("System.Collections.Immutable", "7.0.0", DependencyType.PackageReference),
1268
+ new Dependency("Microsoft.CodeAnalysis.CSharp.Workspaces", "4.8.0", DependencyType.PackageReference),
1269
+ new Dependency("Microsoft.CodeAnalysis.CSharp", "4.8.0", DependencyType.PackageReference),
1270
+ new Dependency("Microsoft.CodeAnalysis.Common", "4.8.0", DependencyType.PackageReference),
1271
+ };
1272
+ var update = new[]
1265
1273
  {
1266
- repoRoot.Delete(recursive: true);
1267
- }
1274
+ new Dependency("System.Collections.Immutable", "8.0.0", DependencyType.PackageReference),
1275
+ };
1276
+
1277
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
1278
+ tempDirectory.DirectoryPath,
1279
+ projectPath,
1280
+ "net8.0",
1281
+ dependencies,
1282
+ update,
1283
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
1284
+ new TestLogger()
1285
+ );
1286
+ Assert.NotNull(resolvedDependencies);
1287
+ Assert.Equal(4, resolvedDependencies.Length);
1288
+ Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
1289
+ Assert.Equal("8.0.0", resolvedDependencies[0].Version);
1290
+ Assert.Equal("Microsoft.CodeAnalysis.CSharp.Workspaces", resolvedDependencies[1].Name);
1291
+ Assert.Equal("4.8.0", resolvedDependencies[1].Version);
1292
+ Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[2].Name);
1293
+ Assert.Equal("4.8.0", resolvedDependencies[2].Version);
1294
+ Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[3].Name);
1295
+ Assert.Equal("4.8.0", resolvedDependencies[3].Version);
1268
1296
  }
1269
1297
 
1270
1298
  // Similar to the last test, with the "grandchild" (System.Collections.Immutable) not in the existing list
1271
- [Fact]
1272
- public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourSpecificNotInExisting()
1299
+ [Theory]
1300
+ [InlineData(true)]
1301
+ [InlineData(false)]
1302
+ public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourSpecificNotInExisting(bool useExistingSdks)
1273
1303
  {
1274
- var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedNewFamilyOfFourSpecificNotInExisting)}_");
1304
+ using var tempDirectory = new TemporaryDirectory();
1305
+ var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
1306
+ await File.WriteAllTextAsync(projectPath, """
1307
+ <Project Sdk="Microsoft.NET.Sdk">
1308
+ <PropertyGroup>
1309
+ <TargetFramework>net8.0</TargetFramework>
1310
+ </PropertyGroup>
1311
+ <ItemGroup>
1312
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.8.0" />
1313
+ <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
1314
+ <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.8.0" />
1315
+ </ItemGroup>
1316
+ </Project>
1317
+ """);
1275
1318
 
1276
- try
1319
+ var dependencies = new[]
1277
1320
  {
1278
- var projectPath = Path.Join(repoRoot.FullName, "project.csproj");
1279
- await File.WriteAllTextAsync(projectPath, """
1280
- <Project Sdk="Microsoft.NET.Sdk">
1281
- <PropertyGroup>
1282
- <TargetFramework>net8.0</TargetFramework>
1283
- </PropertyGroup>
1284
- <ItemGroup>
1285
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.8.0" />
1286
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
1287
- <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.8.0" />
1288
- </ItemGroup>
1289
- </Project>
1290
- """);
1291
-
1292
- var dependencies = new[]
1293
- {
1294
- new Dependency("Microsoft.CodeAnalysis.CSharp.Workspaces", "4.8.0", DependencyType.PackageReference),
1295
- new Dependency("Microsoft.CodeAnalysis.CSharp", "4.8.0", DependencyType.PackageReference),
1296
- new Dependency("Microsoft.CodeAnalysis.Common", "4.8.0", DependencyType.PackageReference),
1297
-
1298
- };
1299
- var update = new[]
1300
- {
1301
- new Dependency("System.Collections.Immutable", "8.0.0", DependencyType.PackageReference),
1302
- };
1321
+ new Dependency("Microsoft.CodeAnalysis.CSharp.Workspaces", "4.8.0", DependencyType.PackageReference),
1322
+ new Dependency("Microsoft.CodeAnalysis.CSharp", "4.8.0", DependencyType.PackageReference),
1323
+ new Dependency("Microsoft.CodeAnalysis.Common", "4.8.0", DependencyType.PackageReference),
1303
1324
 
1304
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(repoRoot.FullName, projectPath, "net8.0", dependencies, update, new TestLogger());
1305
- Assert.NotNull(resolvedDependencies);
1306
- Assert.Equal(3, resolvedDependencies.Length);
1307
- Assert.Equal("Microsoft.CodeAnalysis.CSharp.Workspaces", resolvedDependencies[0].Name);
1308
- Assert.Equal("4.9.2", resolvedDependencies[0].Version);
1309
- Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[1].Name);
1310
- Assert.Equal("4.9.2", resolvedDependencies[1].Version);
1311
- Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[2].Name);
1312
- Assert.Equal("4.9.2", resolvedDependencies[2].Version);
1313
- }
1314
- finally
1325
+ };
1326
+ var update = new[]
1315
1327
  {
1316
- repoRoot.Delete(recursive: true);
1317
- }
1328
+ new Dependency("System.Collections.Immutable", "8.0.0", DependencyType.PackageReference),
1329
+ };
1330
+
1331
+ var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
1332
+ tempDirectory.DirectoryPath,
1333
+ projectPath,
1334
+ "net8.0",
1335
+ dependencies,
1336
+ update,
1337
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
1338
+ new TestLogger()
1339
+ );
1340
+ Assert.NotNull(resolvedDependencies);
1341
+ Assert.Equal(3, resolvedDependencies.Length);
1342
+ Assert.Equal("Microsoft.CodeAnalysis.CSharp.Workspaces", resolvedDependencies[0].Name);
1343
+ Assert.Equal("4.9.2", resolvedDependencies[0].Version);
1344
+ Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[1].Name);
1345
+ Assert.Equal("4.9.2", resolvedDependencies[1].Version);
1346
+ Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[2].Name);
1347
+ Assert.Equal("4.9.2", resolvedDependencies[2].Version);
1318
1348
  }
1319
1349
  #endregion
1320
1350