dependabot-nuget 0.290.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 (27) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Update.cs +1 -1
  3. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +3 -0
  4. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/DependencyFinder.cs +2 -0
  5. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +44 -5
  6. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscovery.cs +2 -2
  7. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/ProjectDiscoveryResult.cs +2 -0
  8. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +19 -11
  9. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ErrorType.cs +1 -0
  10. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +3 -0
  11. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +3 -2
  12. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +43 -18
  13. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +1 -1
  14. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +40 -14
  15. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +2 -2
  16. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProcessExtensions.cs +45 -7
  17. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +41 -0
  18. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +1 -0
  19. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +1 -1
  20. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +2 -1
  21. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +246 -60
  22. data/lib/dependabot/nuget/file_fetcher.rb +1 -0
  23. data/lib/dependabot/nuget/file_parser.rb +90 -0
  24. data/lib/dependabot/nuget/language.rb +82 -0
  25. data/lib/dependabot/nuget/native_helpers.rb +23 -0
  26. data/lib/dependabot/nuget/package_manager.rb +51 -0
  27. metadata +7 -5
@@ -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,12 +349,21 @@ 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
368
  using var temp = new TemporaryDirectory();
346
369
 
@@ -362,12 +385,15 @@ public class MSBuildHelperTests : TestBase
362
385
  temp.DirectoryPath,
363
386
  "net8.0",
364
387
  [new Dependency("Some.Package", "4.5.11", DependencyType.Unknown)],
388
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
365
389
  new TestLogger()
366
390
  );
367
391
  }
368
392
 
369
- [Fact]
370
- public async Task LocalPackageSourcesAreHonored()
393
+ [Theory]
394
+ [InlineData(true)]
395
+ [InlineData(false)]
396
+ public async Task LocalPackageSourcesAreHonored(bool useExistingSdks)
371
397
  {
372
398
  using var temp = new TemporaryDirectory();
373
399
 
@@ -402,14 +428,17 @@ public class MSBuildHelperTests : TestBase
402
428
  temp.DirectoryPath,
403
429
  "net8.0",
404
430
  [new Dependency("Package.A", "1.0.0", DependencyType.Unknown)],
431
+ new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
405
432
  new TestLogger()
406
433
  );
407
434
 
408
435
  AssertEx.Equal(expectedDependencies, actualDependencies);
409
436
  }
410
437
 
411
- [Fact]
412
- public async Task DependencyConflictsCanBeResolvedWithBruteForce()
438
+ [Theory]
439
+ [InlineData(true)]
440
+ [InlineData(false)]
441
+ public async Task DependencyConflictsCanBeResolvedWithBruteForce(bool useExistingSdks)
413
442
  {
414
443
  var repoRoot = Directory.CreateTempSubdirectory($"test_{nameof(DependencyConflictsCanBeResolvedWithBruteForce)}_");
415
444
  MockNuGetPackage[] testPackages =
@@ -450,7 +479,14 @@ public class MSBuildHelperTests : TestBase
450
479
  {
451
480
  new Dependency("Some.Other.Package", "1.2.0", DependencyType.PackageReference),
452
481
  };
453
- 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
+ );
454
490
  Assert.NotNull(resolvedDependencies);
455
491
  Assert.Equal(2, resolvedDependencies.Length);
456
492
  Assert.Equal("Some.Package", resolvedDependencies[0].Name);
@@ -505,8 +541,10 @@ public class MSBuildHelperTests : TestBase
505
541
  #region
506
542
  // Updating root package
507
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
508
- [Fact]
509
- public async Task DependencyConflictsCanBeResolvedNewUpdatingTopLevelPackage()
544
+ [Theory]
545
+ [InlineData(true)]
546
+ [InlineData(false)]
547
+ public async Task DependencyConflictsCanBeResolvedNewUpdatingTopLevelPackage(bool useExistingSdks)
510
548
  {
511
549
  using var tempDirectory = new TemporaryDirectory();
512
550
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -535,7 +573,15 @@ public class MSBuildHelperTests : TestBase
535
573
  new Dependency("CS-Script.Core", "2.0.0", DependencyType.PackageReference),
536
574
  };
537
575
 
538
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
539
585
  Assert.NotNull(resolvedDependencies);
540
586
  Assert.Equal(3, resolvedDependencies.Length);
541
587
  Assert.Equal("CS-Script.Core", resolvedDependencies[0].Name);
@@ -547,8 +593,10 @@ public class MSBuildHelperTests : TestBase
547
593
  }
548
594
 
549
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
550
- [Fact]
551
- public async Task DependencyConflictsCanBeResolvedNewUpdatingNonExistingDependency()
596
+ [Theory]
597
+ [InlineData(true)]
598
+ [InlineData(false)]
599
+ public async Task DependencyConflictsCanBeResolvedNewUpdatingNonExistingDependency(bool useExistingSdks)
552
600
  {
553
601
  using var tempDirectory = new TemporaryDirectory();
554
602
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -572,7 +620,15 @@ public class MSBuildHelperTests : TestBase
572
620
  new Dependency("Microsoft.Bcl.AsyncInterfaces", "1.1.1", DependencyType.Unknown)
573
621
  };
574
622
 
575
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
576
632
  Assert.NotNull(resolvedDependencies);
577
633
  Assert.Single(resolvedDependencies);
578
634
  Assert.Equal("Azure.Core", resolvedDependencies[0].Name);
@@ -582,8 +638,10 @@ public class MSBuildHelperTests : TestBase
582
638
  // Adding a reference
583
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
584
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
585
- [Fact]
586
- public async Task DependencyConflictsCanBeResolvedNewUpdatingNonExistentDependencyAndKeepingReference()
641
+ [Theory]
642
+ [InlineData(true)]
643
+ [InlineData(false)]
644
+ public async Task DependencyConflictsCanBeResolvedNewUpdatingNonExistentDependencyAndKeepingReference(bool useExistingSdks)
587
645
  {
588
646
  using var tempDirectory = new TemporaryDirectory();
589
647
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -607,7 +665,15 @@ public class MSBuildHelperTests : TestBase
607
665
  new Dependency("Newtonsoft.Json", "13.0.1", DependencyType.Unknown)
608
666
  };
609
667
 
610
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
611
677
  Assert.NotNull(resolvedDependencies);
612
678
  Assert.Equal(2, resolvedDependencies.Length);
613
679
  Assert.Equal("Newtonsoft.Json.Bson", resolvedDependencies[0].Name);
@@ -620,8 +686,10 @@ public class MSBuildHelperTests : TestBase
620
686
  // Root package (Microsoft.CodeAnalysis.Compilers) and its dependencies (Microsoft.CodeAnalysis.CSharp), (Microsoft.CodeAnalysis.VisualBasic) are all 4.9.2
621
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
622
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
623
- [Fact]
624
- public async Task DependencyConflictsCanBeResolvedNewTransitiveDependencyNotExisting()
689
+ [Theory]
690
+ [InlineData(true)]
691
+ [InlineData(false)]
692
+ public async Task DependencyConflictsCanBeResolvedNewTransitiveDependencyNotExisting(bool useExistingSdks)
625
693
  {
626
694
  using var tempDirectory = new TemporaryDirectory();
627
695
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -649,7 +717,15 @@ public class MSBuildHelperTests : TestBase
649
717
  new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference)
650
718
  };
651
719
 
652
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
653
729
  Assert.NotNull(resolvedDependencies);
654
730
  Assert.Equal(3, resolvedDependencies.Length);
655
731
  Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
@@ -662,8 +738,10 @@ public class MSBuildHelperTests : TestBase
662
738
 
663
739
  // Updating referenced dependency
664
740
  // The same as previous test, but the transitive dependency (Microsoft.CodeAnalysis.Common) is in the existing list
665
- [Fact]
666
- public async Task DependencyConflictsCanBeResolvedNewSingleTransitiveDependencyExisting()
741
+ [Theory]
742
+ [InlineData(true)]
743
+ [InlineData(false)]
744
+ public async Task DependencyConflictsCanBeResolvedNewSingleTransitiveDependencyExisting(bool useExistingSdks)
667
745
  {
668
746
  using var tempDirectory = new TemporaryDirectory();
669
747
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -693,7 +771,15 @@ public class MSBuildHelperTests : TestBase
693
771
  new Dependency("Microsoft.CodeAnalysis.Common", "4.10.0", DependencyType.PackageReference)
694
772
  };
695
773
 
696
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
697
783
  Assert.NotNull(resolvedDependencies);
698
784
  Assert.Equal(4, resolvedDependencies.Length);
699
785
  Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
@@ -709,8 +795,10 @@ public class MSBuildHelperTests : TestBase
709
795
  // A combination of the third and fourth test, to measure efficiency of updating separate families
710
796
  // Keeping a dependency that was not included in the original list (Newtonsoft.Json)
711
797
  // Not keeping a dependency that was not included in the original list (Microsoft.CodeAnalysis.Common)
712
- [Fact]
713
- public async Task DependencyConflictsCanBeResolvedNewSelectiveAdditionPackages()
798
+ [Theory]
799
+ [InlineData(true)]
800
+ [InlineData(false)]
801
+ public async Task DependencyConflictsCanBeResolvedNewSelectiveAdditionPackages(bool useExistingSdks)
714
802
  {
715
803
  using var tempDirectory = new TemporaryDirectory();
716
804
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -741,7 +829,15 @@ public class MSBuildHelperTests : TestBase
741
829
  new Dependency("Newtonsoft.Json", "13.0.1", DependencyType.Unknown)
742
830
  };
743
831
 
744
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
745
841
  Assert.NotNull(resolvedDependencies);
746
842
  Assert.Equal(5, resolvedDependencies.Length);
747
843
  Assert.Equal("Microsoft.CodeAnalysis.Compilers", resolvedDependencies[0].Name);
@@ -761,8 +857,10 @@ public class MSBuildHelperTests : TestBase
761
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)
762
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)
763
859
  // Updating Buildalyzer to 7.0.1 will update its transitive dependency (Microsoft.CodeAnalysis.Common) and then its transitive dependency's "family"
764
- [Fact]
765
- public async Task DependencyConflictsCanBeResolvedNewSharingDependency()
860
+ [Theory]
861
+ [InlineData(true)]
862
+ [InlineData(false)]
863
+ public async Task DependencyConflictsCanBeResolvedNewSharingDependency(bool useExistingSdks)
766
864
  {
767
865
  using var tempDirectory = new TemporaryDirectory();
768
866
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -792,7 +890,15 @@ public class MSBuildHelperTests : TestBase
792
890
  new Dependency("Buildalyzer", "7.0.1", DependencyType.PackageReference),
793
891
  };
794
892
 
795
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
796
902
  Assert.NotNull(resolvedDependencies);
797
903
  Assert.Equal(4, resolvedDependencies.Length);
798
904
  Assert.Equal("Buildalyzer", resolvedDependencies[0].Name);
@@ -808,8 +914,10 @@ public class MSBuildHelperTests : TestBase
808
914
  // Updating two families at once to test efficiency
809
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)
810
916
  // Second family: Updating the root package (Azure.Core) in the existing list will also need to update its dependency (Microsoft.Bcl.AsyncInterfaces)
811
- [Fact]
812
- public async Task DependencyConflictsCanBeResolvedNewUpdatingEntireFamily()
917
+ [Theory]
918
+ [InlineData(true)]
919
+ [InlineData(false)]
920
+ public async Task DependencyConflictsCanBeResolvedNewUpdatingEntireFamily(bool useExistingSdks)
813
921
  {
814
922
  using var tempDirectory = new TemporaryDirectory();
815
923
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -841,7 +949,15 @@ public class MSBuildHelperTests : TestBase
841
949
  new Dependency("Azure.Core", "1.22.0", DependencyType.PackageReference)
842
950
  };
843
951
 
844
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
845
961
  Assert.NotNull(resolvedDependencies);
846
962
  Assert.Equal(4, resolvedDependencies.Length);
847
963
  Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
@@ -855,8 +971,10 @@ public class MSBuildHelperTests : TestBase
855
971
  }
856
972
 
857
973
  // Similar to the last test, except Microsoft.CodeAnalysis.Common is in the existing list
858
- [Fact]
859
- public async Task DependencyConflictsCanBeResolvedNewUpdatingTopLevelAndDependency()
974
+ [Theory]
975
+ [InlineData(true)]
976
+ [InlineData(false)]
977
+ public async Task DependencyConflictsCanBeResolvedNewUpdatingTopLevelAndDependency(bool useExistingSdks)
860
978
  {
861
979
  using var tempDirectory = new TemporaryDirectory();
862
980
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -890,7 +1008,15 @@ public class MSBuildHelperTests : TestBase
890
1008
  new Dependency("Azure.Core", "1.22.0", DependencyType.PackageReference)
891
1009
  };
892
1010
 
893
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
894
1020
  Assert.NotNull(resolvedDependencies);
895
1021
  Assert.Equal(5, resolvedDependencies.Length);
896
1022
  Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
@@ -908,8 +1034,10 @@ public class MSBuildHelperTests : TestBase
908
1034
  // Out of scope test: AutoMapper.Extensions.Microsoft.DependencyInjection's versions are not yet compatible
909
1035
  // To update root package (AutoMapper.Collection) to 10.0.0, its dependency (AutoMapper) needs to update to 13.0.0.
910
1036
  // However, there is no higher version of AutoMapper's other "parent" (AutoMapper.Extensions.Microsoft.DependencyInjection) that is compatible with the new version
911
- [Fact]
912
- public async Task DependencyConflictsCanBeResolvedNewOutOfScope()
1037
+ [Theory]
1038
+ [InlineData(true)]
1039
+ [InlineData(false)]
1040
+ public async Task DependencyConflictsCanBeResolvedNewOutOfScope(bool useExistingSdks)
913
1041
  {
914
1042
  using var tempDirectory = new TemporaryDirectory();
915
1043
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -937,7 +1065,15 @@ public class MSBuildHelperTests : TestBase
937
1065
  new Dependency("AutoMapper.Collection", "10.0.0", DependencyType.PackageReference)
938
1066
  };
939
1067
 
940
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
941
1077
  Assert.NotNull(resolvedDependencies);
942
1078
  Assert.Equal(3, resolvedDependencies.Length);
943
1079
  Assert.Equal("AutoMapper.Extensions.Microsoft.DependencyInjection", resolvedDependencies[0].Name);
@@ -949,8 +1085,10 @@ public class MSBuildHelperTests : TestBase
949
1085
  }
950
1086
 
951
1087
  // Two dependencies (Microsoft.Extensions.Caching.Memory), (Microsoft.EntityFrameworkCore.Analyzers) used by the same parent (Microsoft.EntityFrameworkCore), updating one of the dependencies
952
- [Fact]
953
- public async Task DependencyConflictsCanBeResolvedNewTwoDependenciesShareSameParent()
1088
+ [Theory]
1089
+ [InlineData(true)]
1090
+ [InlineData(false)]
1091
+ public async Task DependencyConflictsCanBeResolvedNewTwoDependenciesShareSameParent(bool useExistingSdks)
954
1092
  {
955
1093
  using var tempDirectory = new TemporaryDirectory();
956
1094
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -976,7 +1114,15 @@ public class MSBuildHelperTests : TestBase
976
1114
  new Dependency("Microsoft.Extensions.Caching.Memory", "8.0.0", DependencyType.PackageReference)
977
1115
  };
978
1116
 
979
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
980
1126
  Assert.NotNull(resolvedDependencies);
981
1127
  Assert.Equal(2, resolvedDependencies.Length);
982
1128
  Assert.Equal("Microsoft.EntityFrameworkCore", resolvedDependencies[0].Name);
@@ -987,8 +1133,10 @@ public class MSBuildHelperTests : TestBase
987
1133
 
988
1134
  // Updating referenced package
989
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
990
- [Fact]
991
- public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourExisting()
1136
+ [Theory]
1137
+ [InlineData(true)]
1138
+ [InlineData(false)]
1139
+ public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourExisting(bool useExistingSdks)
992
1140
  {
993
1141
  using var tempDirectory = new TemporaryDirectory();
994
1142
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -1018,7 +1166,15 @@ public class MSBuildHelperTests : TestBase
1018
1166
  new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0", DependencyType.PackageReference)
1019
1167
  };
1020
1168
 
1021
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
1022
1178
  Assert.NotNull(resolvedDependencies);
1023
1179
  Assert.Equal(4, resolvedDependencies.Length);
1024
1180
  Assert.Equal("Microsoft.EntityFrameworkCore.Design", resolvedDependencies[0].Name);
@@ -1033,8 +1189,10 @@ public class MSBuildHelperTests : TestBase
1033
1189
 
1034
1190
  // Updating unreferenced package
1035
1191
  // 4 dependency chain to be updated, dependency to be updated is not in the existing list, so its family will all be updated
1036
- [Fact]
1037
- public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourNotInExisting()
1192
+ [Theory]
1193
+ [InlineData(true)]
1194
+ [InlineData(false)]
1195
+ public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourNotInExisting(bool useExistingSdks)
1038
1196
  {
1039
1197
  using var tempDirectory = new TemporaryDirectory();
1040
1198
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -1062,7 +1220,15 @@ public class MSBuildHelperTests : TestBase
1062
1220
  new Dependency("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0", DependencyType.PackageReference)
1063
1221
  };
1064
1222
 
1065
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
1066
1232
  Assert.NotNull(resolvedDependencies);
1067
1233
  Assert.Equal(3, resolvedDependencies.Length);
1068
1234
  Assert.Equal("Microsoft.EntityFrameworkCore.Design", resolvedDependencies[0].Name);
@@ -1075,8 +1241,10 @@ public class MSBuildHelperTests : TestBase
1075
1241
 
1076
1242
  // Updating a referenced transitive dependency
1077
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
1078
- [Fact]
1079
- public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourSpecificExisting()
1244
+ [Theory]
1245
+ [InlineData(true)]
1246
+ [InlineData(false)]
1247
+ public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourSpecificExisting(bool useExistingSdks)
1080
1248
  {
1081
1249
  using var tempDirectory = new TemporaryDirectory();
1082
1250
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -1106,7 +1274,15 @@ public class MSBuildHelperTests : TestBase
1106
1274
  new Dependency("System.Collections.Immutable", "8.0.0", DependencyType.PackageReference),
1107
1275
  };
1108
1276
 
1109
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
1110
1286
  Assert.NotNull(resolvedDependencies);
1111
1287
  Assert.Equal(4, resolvedDependencies.Length);
1112
1288
  Assert.Equal("System.Collections.Immutable", resolvedDependencies[0].Name);
@@ -1120,8 +1296,10 @@ public class MSBuildHelperTests : TestBase
1120
1296
  }
1121
1297
 
1122
1298
  // Similar to the last test, with the "grandchild" (System.Collections.Immutable) not in the existing list
1123
- [Fact]
1124
- public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourSpecificNotInExisting()
1299
+ [Theory]
1300
+ [InlineData(true)]
1301
+ [InlineData(false)]
1302
+ public async Task DependencyConflictsCanBeResolvedNewFamilyOfFourSpecificNotInExisting(bool useExistingSdks)
1125
1303
  {
1126
1304
  using var tempDirectory = new TemporaryDirectory();
1127
1305
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
@@ -1150,7 +1328,15 @@ public class MSBuildHelperTests : TestBase
1150
1328
  new Dependency("System.Collections.Immutable", "8.0.0", DependencyType.PackageReference),
1151
1329
  };
1152
1330
 
1153
- var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(tempDirectory.DirectoryPath, projectPath, "net8.0", dependencies, update, new TestLogger());
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
+ );
1154
1340
  Assert.NotNull(resolvedDependencies);
1155
1341
  Assert.Equal(3, resolvedDependencies.Length);
1156
1342
  Assert.Equal("Microsoft.CodeAnalysis.CSharp.Workspaces", resolvedDependencies[0].Name);
@@ -26,6 +26,7 @@ module Dependabot
26
26
 
27
27
  sig { override.returns(T::Array[DependencyFile]) }
28
28
  def fetch_files
29
+ NativeHelpers.install_dotnet_sdks
29
30
  discovery_json_reader = DiscoveryJsonReader.run_discovery_in_directory(
30
31
  repo_contents_path: T.must(repo_contents_path),
31
32
  directory: directory,