dependabot-nuget 0.287.0 → 0.289.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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/lib/NuGetUpdater/.gitignore +1 -0
  3. data/helpers/lib/NuGetUpdater/Directory.Build.targets +17 -0
  4. data/helpers/lib/NuGetUpdater/Directory.Packages.props +26 -17
  5. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Packaging/NuGet.Packaging.csproj +0 -1
  6. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/DiscoverCommand.cs +7 -3
  7. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +1 -1
  8. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +3 -1
  9. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +88 -47
  10. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +31 -16
  11. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +1 -1
  12. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementArrayConverter.cs +39 -0
  13. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +1 -1
  14. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/ShellGitCommandHandler.cs +1 -1
  15. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyDiscovery.props +7 -0
  16. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyDiscovery.targets +10 -0
  17. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +64 -53
  18. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DotNetToolsJsonDiscovery.cs +2 -2
  19. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/GlobalJsonDiscovery.cs +2 -2
  20. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscovery.cs +17 -5
  21. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscoveryResult.cs +3 -1
  22. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/ProjectDiscoveryResult.cs +3 -0
  23. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +429 -12
  24. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/WorkspaceDiscoveryResult.cs +0 -1
  25. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +12 -2
  26. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/JsonBuildFile.cs +1 -1
  27. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/CompatabilityChecker.cs +2 -2
  28. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/NuGetUpdater.Core.csproj +7 -2
  29. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +23 -0
  30. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +43 -58
  31. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/TargetFrameworkReporter.targets +13 -0
  32. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +13 -43
  33. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/DotNetToolsJsonUpdater.cs +4 -4
  34. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/GlobalJsonUpdater.cs +5 -5
  35. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +3 -10
  36. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +40 -33
  37. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +12 -11
  38. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +16 -12
  39. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/CollectionExtensions.cs +17 -0
  40. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ConsoleLogger.cs +1 -1
  41. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/DependencyConflictResolver.cs +19 -19
  42. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ILogger.cs +11 -1
  43. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +74 -20
  44. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +1 -17
  45. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathComparer.cs +31 -0
  46. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +46 -10
  47. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProjectHelper.cs +96 -0
  48. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTests.cs +135 -3
  49. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs +71 -38
  50. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.PackagesConfig.cs +66 -4
  51. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Proj.cs +11 -5
  52. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +808 -222
  53. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +477 -97
  54. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +5 -9
  55. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +494 -0
  56. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +46 -1
  57. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj +0 -1
  58. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +401 -77
  59. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +35 -2
  60. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdatedDependencyListTests.cs +60 -2
  61. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +3 -2
  62. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestLogger.cs +1 -1
  63. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/BindingRedirectsTests.cs +1 -1
  64. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +8 -4
  65. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +40 -0
  66. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +1 -1
  67. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/AssertEx.cs +1 -1
  68. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/LinuxOnlyAttribute.cs +12 -0
  69. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +8 -5
  70. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +49 -3
  71. data/lib/dependabot/nuget/analysis/analysis_json_reader.rb +3 -1
  72. data/lib/dependabot/nuget/file_fetcher.rb +12 -393
  73. data/lib/dependabot/nuget/file_parser.rb +23 -54
  74. data/lib/dependabot/nuget/file_updater.rb +21 -16
  75. data/lib/dependabot/nuget/native_discovery/native_dependency_file_discovery.rb +2 -9
  76. data/lib/dependabot/nuget/native_discovery/native_discovery_json_reader.rb +183 -80
  77. data/lib/dependabot/nuget/native_discovery/native_project_discovery.rb +25 -3
  78. data/lib/dependabot/nuget/native_discovery/native_workspace_discovery.rb +1 -11
  79. data/lib/dependabot/nuget/native_helpers.rb +13 -4
  80. data/lib/dependabot/nuget/native_update_checker/native_update_checker.rb +17 -4
  81. metadata +15 -12
  82. data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Packages.props +0 -29
  83. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs +0 -17
  84. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscovery.cs +0 -69
  85. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscoveryResult.cs +0 -11
  86. data/lib/dependabot/nuget/file_fetcher/import_paths_finder.rb +0 -73
  87. data/lib/dependabot/nuget/file_fetcher/sln_project_paths_finder.rb +0 -60
  88. data/lib/dependabot/nuget/native_discovery/native_directory_packages_props_discovery.rb +0 -44
@@ -32,6 +32,9 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
32
32
  Dependencies = [
33
33
  new("Some.Package", "1.0.0", DependencyType.PackageReference),
34
34
  ],
35
+ ReferencedProjectPaths = [],
36
+ ImportedFiles = [],
37
+ AdditionalFiles = [],
35
38
  },
36
39
  ],
37
40
  },
@@ -80,6 +83,9 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
80
83
  new("Some.Package", "4.0.1", DependencyType.PackageReference),
81
84
  new("Some.Transitive.Dependency", "4.0.1", DependencyType.PackageReference),
82
85
  ],
86
+ ReferencedProjectPaths = [],
87
+ ImportedFiles = [],
88
+ AdditionalFiles = [],
83
89
  },
84
90
  ],
85
91
  },
@@ -129,6 +135,9 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
129
135
  Dependencies = [
130
136
  new("Some.Transitive.Dependency", "4.0.1", DependencyType.PackageReference, EvaluationResult: evaluationResult, TargetFrameworks: ["net8.0"]),
131
137
  ],
138
+ ReferencedProjectPaths = [],
139
+ ImportedFiles = [],
140
+ AdditionalFiles = [],
132
141
  },
133
142
  new()
134
143
  {
@@ -137,6 +146,9 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
137
146
  Dependencies = [
138
147
  new("Some.Package", "4.0.1", DependencyType.PackageReference, EvaluationResult: evaluationResult, TargetFrameworks: ["net8.0"]),
139
148
  ],
149
+ ReferencedProjectPaths = [],
150
+ ImportedFiles = [],
151
+ AdditionalFiles = [],
140
152
  },
141
153
  ],
142
154
  },
@@ -187,6 +199,9 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
187
199
  Dependencies = [
188
200
  new("Package.A", "4.5.0", DependencyType.PackageReference, EvaluationResult: evaluationResult, TargetFrameworks: ["net8.0"]),
189
201
  ],
202
+ ReferencedProjectPaths = [],
203
+ ImportedFiles = [],
204
+ AdditionalFiles = [],
190
205
  },
191
206
  new()
192
207
  {
@@ -195,6 +210,9 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
195
210
  Dependencies = [
196
211
  new("Package.B", "4.5.0", DependencyType.PackageReference, EvaluationResult: evaluationResult, TargetFrameworks: ["net8.0"]),
197
212
  ],
213
+ ReferencedProjectPaths = [],
214
+ ImportedFiles = [],
215
+ AdditionalFiles = [],
198
216
  },
199
217
  ],
200
218
  },
@@ -241,6 +259,9 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
241
259
  Dependencies = [
242
260
  new("Some.Transitive.Dependency", "$(MissingPackageVersion)", DependencyType.PackageReference, EvaluationResult: new EvaluationResult(EvaluationResultType.PropertyNotFound, "$(MissingPackageVersion)", "$(MissingPackageVersion)", "$(MissingPackageVersion)", ErrorMessage: null)),
243
261
  ],
262
+ ReferencedProjectPaths = [],
263
+ ImportedFiles = [],
264
+ AdditionalFiles = [],
244
265
  },
245
266
  ],
246
267
  },
@@ -281,6 +302,9 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
281
302
  Dependencies = [
282
303
  new("Some.Package", "1.0.0", DependencyType.PackageReference), // this was found in the source, but doesn't exist in any feed
283
304
  ],
305
+ ReferencedProjectPaths = [],
306
+ ImportedFiles = [],
307
+ AdditionalFiles = [],
284
308
  },
285
309
  ],
286
310
  },
@@ -326,6 +350,9 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
326
350
  Dependencies = [
327
351
  new("Some.Transitive.Dependency", "4.0.1", DependencyType.PackageReference),
328
352
  ],
353
+ ReferencedProjectPaths = [],
354
+ ImportedFiles = [],
355
+ AdditionalFiles = [],
329
356
  },
330
357
  ],
331
358
  },
@@ -347,6 +374,62 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
347
374
  );
348
375
  }
349
376
 
377
+ [Fact]
378
+ public async Task DuplicateTargetFrameworksWithCasingDifferencesAreCombined()
379
+ {
380
+ await TestAnalyzeAsync(
381
+ packages:
382
+ [
383
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0"),
384
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "1.1.0", "net8.0"),
385
+ ],
386
+ discovery: new()
387
+ {
388
+ Path = "",
389
+ Projects = [
390
+ new()
391
+ {
392
+ FilePath = "projecta/projecta.csproj",
393
+ TargetFrameworks = ["net8.0"],
394
+ Dependencies = [
395
+ new("Some.Package", "1.0.0", DependencyType.PackageReference, TargetFrameworks: ["net8.0"]),
396
+ ],
397
+ ReferencedProjectPaths = [],
398
+ ImportedFiles = [],
399
+ AdditionalFiles = [],
400
+ },
401
+ new()
402
+ {
403
+ FilePath = "projectb/projectb.csproj",
404
+ TargetFrameworks = ["NET8.0"],
405
+ Dependencies = [
406
+ new("Some.Package", "1.0.0", DependencyType.PackageReference, TargetFrameworks: ["net8.0"]),
407
+ ],
408
+ ReferencedProjectPaths = [],
409
+ ImportedFiles = [],
410
+ AdditionalFiles = [],
411
+ }
412
+ ]
413
+ },
414
+ dependencyInfo: new()
415
+ {
416
+ Name = "Some.Package",
417
+ Version = "1.0.0",
418
+ IsVulnerable = false,
419
+ IgnoredVersions = [],
420
+ Vulnerabilities = [],
421
+ },
422
+ expectedResult: new()
423
+ {
424
+ UpdatedVersion = "1.1.0",
425
+ CanUpdate = true,
426
+ UpdatedDependencies = [
427
+ new("Some.Package", "1.1.0", DependencyType.Unknown, TargetFrameworks: ["net8.0"]),
428
+ ],
429
+ }
430
+ );
431
+ }
432
+
350
433
  [Fact]
351
434
  public async Task IgnoredVersionsCanHandleWildcardSpecification()
352
435
  {
@@ -368,6 +451,9 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
368
451
  Dependencies = [
369
452
  new("Some.Package", "1.0.0", DependencyType.PackageReference),
370
453
  ],
454
+ ReferencedProjectPaths = [],
455
+ ImportedFiles = [],
456
+ AdditionalFiles = [],
371
457
  },
372
458
  ],
373
459
  },
@@ -535,7 +621,10 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
535
621
  Dependencies =
536
622
  [
537
623
  new("Some.Package", "1.0.0", DependencyType.PackageReference),
538
- ]
624
+ ],
625
+ ReferencedProjectPaths = [],
626
+ ImportedFiles = [],
627
+ AdditionalFiles = [],
539
628
  }
540
629
  ]
541
630
  },
@@ -704,7 +793,10 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
704
793
  Dependencies =
705
794
  [
706
795
  new("Some.Package", "1.0.0", DependencyType.PackageReference),
707
- ]
796
+ ],
797
+ ReferencedProjectPaths = [],
798
+ ImportedFiles = [],
799
+ AdditionalFiles = [],
708
800
  }
709
801
  ]
710
802
  },
@@ -889,7 +981,10 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
889
981
  Dependencies =
890
982
  [
891
983
  new("Some.Package", "1.0.0", DependencyType.PackageReference),
892
- ]
984
+ ],
985
+ ReferencedProjectPaths = [],
986
+ ImportedFiles = [],
987
+ AdditionalFiles = [],
893
988
  }
894
989
  ]
895
990
  },
@@ -999,6 +1094,9 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
999
1094
  Dependencies = [
1000
1095
  new("Some.Package", "1.2.3", DependencyType.PackageReference),
1001
1096
  ],
1097
+ ReferencedProjectPaths = [],
1098
+ ImportedFiles = [],
1099
+ AdditionalFiles = [],
1002
1100
  }
1003
1101
  ]
1004
1102
  },
@@ -1117,6 +1215,9 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
1117
1215
  Dependencies = [
1118
1216
  new("Some.Package", "1.0.0", DependencyType.PackageReference),
1119
1217
  ],
1218
+ ReferencedProjectPaths = [],
1219
+ ImportedFiles = [],
1220
+ AdditionalFiles = [],
1120
1221
  }
1121
1222
  ]
1122
1223
  },
@@ -1137,4 +1238,35 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
1137
1238
  }
1138
1239
  );
1139
1240
  }
1241
+
1242
+ [Fact]
1243
+ public void DeserializeDependencyInfo_UnsupportedIgnoredVersionsAreIgnored()
1244
+ {
1245
+ // arrange
1246
+ // "1.0.0.pre.rc2" isn't a valid NuGet version; ignore that requirement
1247
+ var json = """
1248
+ {
1249
+ "Name": "Some.Package",
1250
+ "Version": "1.10.0",
1251
+ "IsVulnerable": false,
1252
+ "IgnoredVersions": [
1253
+ "> 1.0.0.pre.rc2, < 2",
1254
+ "< 1.0.1"
1255
+ ],
1256
+ "Vulnerabilities": []
1257
+ }
1258
+ """;
1259
+
1260
+ // act
1261
+ var dependencyInfo = AnalyzeWorker.DeserializeDependencyInfo(json);
1262
+
1263
+ // assert
1264
+ Assert.NotNull(dependencyInfo);
1265
+ Assert.Equal("Some.Package", dependencyInfo.Name);
1266
+ Assert.Equal("1.10.0", dependencyInfo.Version);
1267
+ Assert.False(dependencyInfo.IsVulnerable);
1268
+ Assert.Single(dependencyInfo.IgnoredVersions);
1269
+ Assert.Equal("< 1.0.1", dependencyInfo.IgnoredVersions.Single().ToString());
1270
+ Assert.Empty(dependencyInfo.Vulnerabilities);
1271
+ }
1140
1272
  }
@@ -1,10 +1,12 @@
1
1
  using System.Collections.Immutable;
2
2
  using System.Diagnostics.CodeAnalysis;
3
+ using System.Runtime.InteropServices;
3
4
  using System.Text.Json;
4
5
 
5
6
  using NuGetUpdater.Core.Discover;
6
7
  using NuGetUpdater.Core.Test.Update;
7
8
  using NuGetUpdater.Core.Test.Utilities;
9
+ using NuGetUpdater.Core.Utilities;
8
10
 
9
11
  using Xunit;
10
12
 
@@ -12,41 +14,42 @@ namespace NuGetUpdater.Core.Test.Discover;
12
14
 
13
15
  using TestFile = (string Path, string Content);
14
16
 
15
- public class DiscoveryWorkerTestBase
17
+ public class DiscoveryWorkerTestBase : TestBase
16
18
  {
17
19
  protected static async Task TestDiscoveryAsync(
18
20
  string workspacePath,
19
21
  TestFile[] files,
20
22
  ExpectedWorkspaceDiscoveryResult expectedResult,
21
- MockNuGetPackage[]? packages = null)
23
+ MockNuGetPackage[]? packages = null,
24
+ ExperimentsManager? experimentsManager = null)
22
25
  {
26
+ experimentsManager ??= new ExperimentsManager();
23
27
  var actualResult = await RunDiscoveryAsync(files, async directoryPath =>
24
28
  {
25
29
  await UpdateWorkerTestBase.MockNuGetPackagesInDirectory(packages, directoryPath);
26
30
 
27
- var worker = new DiscoveryWorker(new TestLogger());
31
+ var worker = new DiscoveryWorker(experimentsManager, new TestLogger());
28
32
  var result = await worker.RunWithErrorHandlingAsync(directoryPath, workspacePath);
29
33
  return result;
30
34
  });
31
35
 
32
- ValidateWorkspaceResult(expectedResult, actualResult);
36
+ ValidateWorkspaceResult(expectedResult, actualResult, experimentsManager);
33
37
  }
34
38
 
35
- protected static void ValidateWorkspaceResult(ExpectedWorkspaceDiscoveryResult expectedResult, WorkspaceDiscoveryResult actualResult)
39
+ protected static void ValidateWorkspaceResult(ExpectedWorkspaceDiscoveryResult expectedResult, WorkspaceDiscoveryResult actualResult, ExperimentsManager experimentsManager)
36
40
  {
37
41
  Assert.NotNull(actualResult);
38
42
  Assert.Equal(expectedResult.Path.NormalizePathToUnix(), actualResult.Path.NormalizePathToUnix());
39
- ValidateDirectoryPackagesProps(expectedResult.DirectoryPackagesProps, actualResult.DirectoryPackagesProps);
40
43
  ValidateResultWithDependencies(expectedResult.GlobalJson, actualResult.GlobalJson);
41
44
  ValidateResultWithDependencies(expectedResult.DotNetToolsJson, actualResult.DotNetToolsJson);
42
- ValidateProjectResults(expectedResult.Projects, actualResult.Projects);
45
+ ValidateProjectResults(expectedResult.Projects, actualResult.Projects, experimentsManager);
43
46
  Assert.Equal(expectedResult.ExpectedProjectCount ?? expectedResult.Projects.Length, actualResult.Projects.Length);
44
47
  Assert.Equal(expectedResult.ErrorType, actualResult.ErrorType);
45
48
  Assert.Equal(expectedResult.ErrorDetails, actualResult.ErrorDetails);
46
49
 
47
50
  return;
48
51
 
49
- void ValidateResultWithDependencies(ExpectedDependencyDiscoveryResult? expectedResult, IDiscoveryResultWithDependencies? actualResult)
52
+ static void ValidateResultWithDependencies(ExpectedDependencyDiscoveryResult? expectedResult, IDiscoveryResultWithDependencies? actualResult)
50
53
  {
51
54
  if (expectedResult is null)
52
55
  {
@@ -62,50 +65,80 @@ public class DiscoveryWorkerTestBase
62
65
  ValidateDependencies(expectedResult.Dependencies, actualResult.Dependencies);
63
66
  Assert.Equal(expectedResult.ExpectedDependencyCount ?? expectedResult.Dependencies.Length, actualResult.Dependencies.Length);
64
67
  }
68
+ }
69
+
70
+ internal static void ValidateProjectResults(ImmutableArray<ExpectedSdkProjectDiscoveryResult> expectedProjects, ImmutableArray<ProjectDiscoveryResult> actualProjects, ExperimentsManager experimentsManager)
71
+ {
72
+ if (expectedProjects.IsDefaultOrEmpty)
73
+ {
74
+ return;
75
+ }
65
76
 
66
- void ValidateProjectResults(ImmutableArray<ExpectedSdkProjectDiscoveryResult> expectedProjects, ImmutableArray<ProjectDiscoveryResult> actualProjects)
77
+ foreach (var expectedProject in expectedProjects)
67
78
  {
68
- if (expectedProjects.IsDefaultOrEmpty)
79
+ var actualProject = actualProjects.SingleOrDefault(p => p.FilePath.NormalizePathToUnix() == expectedProject.FilePath.NormalizePathToUnix());
80
+ Assert.True(actualProject is not null, $"Unable to find project with path `{expectedProject.FilePath.NormalizePathToUnix()}` in collection [{string.Join(", ", actualProjects.Select(p => p.FilePath))}]");
81
+ Assert.Equal(expectedProject.FilePath.NormalizePathToUnix(), actualProject.FilePath.NormalizePathToUnix());
82
+
83
+ // some properties are byproducts of the older temporary project discovery process and shouldn't be returned
84
+ var actualProperties = actualProject.Properties;
85
+ if (!experimentsManager.UseDirectDiscovery)
69
86
  {
70
- return;
87
+ var forbiddenProperties = new HashSet<string>(["TargetFrameworkVersion"], StringComparer.OrdinalIgnoreCase);
88
+ actualProperties = actualProperties.Where(p => !forbiddenProperties.Contains(p.Name)).ToImmutableArray();
71
89
  }
72
90
 
73
- foreach (var expectedProject in expectedProjects)
91
+ AssertEx.Equal(expectedProject.Properties, actualProperties, PropertyComparer.Instance);
92
+ AssertEx.Equal(expectedProject.TargetFrameworks, actualProject.TargetFrameworks);
93
+ AssertEx.Equal(expectedProject.ReferencedProjectPaths, actualProject.ReferencedProjectPaths);
94
+ AssertEx.Equal(expectedProject.ImportedFiles, actualProject.ImportedFiles);
95
+ AssertEx.Equal(expectedProject.AdditionalFiles, actualProject.AdditionalFiles);
96
+
97
+ // some dependencies are byproducts of the older temporary project discovery process and shouldn't be returned
98
+ var actualDependencies = actualProject.Dependencies;
99
+ if (!experimentsManager.UseDirectDiscovery)
74
100
  {
75
- var actualProject = actualProjects.Single(p => p.FilePath.NormalizePathToUnix() == expectedProject.FilePath.NormalizePathToUnix());
76
-
77
- Assert.Equal(expectedProject.FilePath.NormalizePathToUnix(), actualProject.FilePath.NormalizePathToUnix());
78
- AssertEx.Equal(expectedProject.Properties, actualProject.Properties, PropertyComparer.Instance);
79
- AssertEx.Equal(expectedProject.TargetFrameworks, actualProject.TargetFrameworks);
80
- AssertEx.Equal(expectedProject.ReferencedProjectPaths.Select(PathHelper.NormalizePathToUnix), actualProject.ReferencedProjectPaths.Select(PathHelper.NormalizePathToUnix));
81
- ValidateDependencies(expectedProject.Dependencies, actualProject.Dependencies);
82
- Assert.Equal(expectedProject.ExpectedDependencyCount ?? expectedProject.Dependencies.Length, actualProject.Dependencies.Length);
101
+ var forbiddenDependencies = new HashSet<string>(["Microsoft.NET.Sdk"], StringComparer.OrdinalIgnoreCase);
102
+ actualDependencies = actualDependencies.Where(d => !forbiddenDependencies.Contains(d.Name)).ToImmutableArray();
83
103
  }
104
+
105
+ // some dependencies are byproducts of the test framework and shouldn't be returned to make the tests more deterministic
106
+ var forbiddenTestDependencies = new HashSet<string>(["Microsoft.NETFramework.ReferenceAssemblies"], StringComparer.OrdinalIgnoreCase);
107
+ actualDependencies = actualDependencies.Where(d => !forbiddenTestDependencies.Contains(d.Name)).ToImmutableArray();
108
+
109
+ ValidateDependencies(expectedProject.Dependencies, actualDependencies);
110
+ Assert.Equal(expectedProject.ExpectedDependencyCount ?? expectedProject.Dependencies.Length, actualDependencies.Length);
84
111
  }
112
+ }
85
113
 
86
- void ValidateDirectoryPackagesProps(ExpectedDirectoryPackagesPropsDiscovertyResult? expected, DirectoryPackagesPropsDiscoveryResult? actual)
114
+ internal static void ValidateDependencies(ImmutableArray<Dependency> expectedDependencies, ImmutableArray<Dependency> actualDependencies)
115
+ {
116
+ if (expectedDependencies.IsDefault)
87
117
  {
88
- ValidateResultWithDependencies(expected, actual);
89
- Assert.Equal(expected?.IsTransitivePinningEnabled, actual?.IsTransitivePinningEnabled);
118
+ return;
90
119
  }
91
120
 
92
- void ValidateDependencies(ImmutableArray<Dependency> expectedDependencies, ImmutableArray<Dependency> actualDependencies)
121
+ foreach (var expectedDependency in expectedDependencies)
93
122
  {
94
- if (expectedDependencies.IsDefault)
95
- {
96
- return;
97
- }
98
-
99
- foreach (var expectedDependency in expectedDependencies)
123
+ var matchingDependencies = actualDependencies.Where(d =>
100
124
  {
101
- var actualDependency = actualDependencies.Single(d => d.Name == expectedDependency.Name && d.Type == expectedDependency.Type);
102
- Assert.Equal(expectedDependency.Name, actualDependency.Name);
103
- Assert.Equal(expectedDependency.Version, actualDependency.Version);
104
- Assert.Equal(expectedDependency.Type, actualDependency.Type);
105
- AssertEx.Equal(expectedDependency.TargetFrameworks, actualDependency.TargetFrameworks);
106
- Assert.Equal(expectedDependency.IsDirect, actualDependency.IsDirect);
107
- Assert.Equal(expectedDependency.IsTransitive, actualDependency.IsTransitive);
108
- }
125
+ return d.Name == expectedDependency.Name
126
+ && d.Type == expectedDependency.Type
127
+ && d.Version == expectedDependency.Version
128
+ && d.IsDirect == expectedDependency.IsDirect
129
+ && d.IsTransitive == expectedDependency.IsTransitive
130
+ && d.TargetFrameworks.SequenceEqual(expectedDependency.TargetFrameworks);
131
+ }).ToArray();
132
+ Assert.True(matchingDependencies.Length == 1, $"""
133
+ Unable to find 1 dependency matching; found {matchingDependencies.Length}:
134
+ Name: {expectedDependency.Name}
135
+ Type: {expectedDependency.Type}
136
+ Version: {expectedDependency.Version}
137
+ IsDirect: {expectedDependency.IsDirect}
138
+ IsTransitive: {expectedDependency.IsTransitive}
139
+ TargetFrameworks: {string.Join(", ", expectedDependency.TargetFrameworks ?? [])}
140
+ Found:{"\n\t"}{string.Join("\n\t", actualDependencies)}
141
+ """);
109
142
  }
110
143
  }
111
144
 
@@ -7,9 +7,10 @@ public partial class DiscoveryWorkerTests
7
7
  public class PackagesConfig : DiscoveryWorkerTestBase
8
8
  {
9
9
  [Fact]
10
- public async Task DiscoversDependencies()
10
+ public async Task DiscoversDependencies_DirectDiscovery()
11
11
  {
12
12
  await TestDiscoveryAsync(
13
+ experimentsManager: new ExperimentsManager() { UseDirectDiscovery = true },
13
14
  packages:
14
15
  [
15
16
  MockNuGetPackage.CreateSimplePackage("Package.A", "1.0.0", "net46"),
@@ -25,10 +26,13 @@ public partial class DiscoveryWorkerTests
25
26
  </packages>
26
27
  """),
27
28
  ("myproj.csproj", """
28
- <Project>
29
+ <Project Sdk="Microsoft.NET.Sdk">
29
30
  <PropertyGroup>
30
31
  <TargetFramework>net46</TargetFramework>
31
32
  </PropertyGroup>
33
+ <ItemGroup>
34
+ <None Include="packages.config" />
35
+ </ItemGroup>
32
36
  </Project>
33
37
  """)
34
38
  ],
@@ -40,14 +44,72 @@ public partial class DiscoveryWorkerTests
40
44
  {
41
45
  FilePath = "myproj.csproj",
42
46
  Properties = [
43
- new("TargetFramework", "net46", "myproj.csproj"),
47
+ new("TargetFramework", "net46", "myproj.csproj")
44
48
  ],
45
49
  TargetFrameworks = ["net46"],
46
50
  Dependencies = [
47
- new("Microsoft.NETFramework.ReferenceAssemblies", "1.0.3", DependencyType.Unknown, TargetFrameworks: ["net46"], IsTransitive: true),
48
51
  new("Package.A", "1.0.0", DependencyType.PackagesConfig, TargetFrameworks: ["net46"]),
49
52
  new("Package.B", "2.0.0", DependencyType.PackagesConfig, TargetFrameworks: ["net46"]),
50
53
  ],
54
+ ReferencedProjectPaths = [],
55
+ ImportedFiles = [],
56
+ AdditionalFiles = [
57
+ "packages.config"
58
+ ],
59
+ }
60
+ ],
61
+ }
62
+ );
63
+ }
64
+
65
+ [Fact]
66
+ public async Task DiscoversDependencies_TemporaryProjectDiscovery()
67
+ {
68
+ await TestDiscoveryAsync(
69
+ experimentsManager: new ExperimentsManager() { UseDirectDiscovery = false },
70
+ packages:
71
+ [
72
+ MockNuGetPackage.CreateSimplePackage("Package.A", "1.0.0", "net46"),
73
+ MockNuGetPackage.CreateSimplePackage("Package.B", "2.0.0", "net46"),
74
+ ],
75
+ workspacePath: "",
76
+ files: [
77
+ ("packages.config", """
78
+ <?xml version="1.0" encoding="utf-8"?>
79
+ <packages>
80
+ <package id="Package.A" version="1.0.0" targetFramework="net46" />
81
+ <package id="Package.B" version="2.0.0" targetFramework="net46" />
82
+ </packages>
83
+ """),
84
+ ("myproj.csproj", """
85
+ <Project Sdk="Microsoft.NET.Sdk">
86
+ <PropertyGroup>
87
+ <TargetFramework>net46</TargetFramework>
88
+ </PropertyGroup>
89
+ <ItemGroup>
90
+ <None Include="packages.config" />
91
+ </ItemGroup>
92
+ </Project>
93
+ """)
94
+ ],
95
+ expectedResult: new()
96
+ {
97
+ Path = "",
98
+ Projects = [
99
+ new()
100
+ {
101
+ FilePath = "myproj.csproj",
102
+ Properties = [new("TargetFramework", "net46", "myproj.csproj")],
103
+ TargetFrameworks = ["net46"],
104
+ Dependencies = [
105
+ new("Package.A", "1.0.0", DependencyType.PackagesConfig, TargetFrameworks: ["net46"]),
106
+ new("Package.B", "2.0.0", DependencyType.PackagesConfig, TargetFrameworks: ["net46"]),
107
+ ],
108
+ ReferencedProjectPaths = [],
109
+ ImportedFiles = [],
110
+ AdditionalFiles = [
111
+ "packages.config"
112
+ ],
51
113
  }
52
114
  ],
53
115
  }
@@ -12,7 +12,11 @@ public partial class DiscoveryWorkerTests
12
12
  public async Task DirsProjExpansion(string itemType)
13
13
  {
14
14
  await TestDiscoveryAsync(
15
- packages: [],
15
+ packages:
16
+ [
17
+ MockNuGetPackage.CreateSimplePackage("Package.A", "1.0.0", "net8.0"),
18
+ MockNuGetPackage.CreateSimplePackage("Package.B", "2.0.0", "net8.0"),
19
+ ],
16
20
  workspacePath: "dependabot",
17
21
  files:
18
22
  [
@@ -60,7 +64,6 @@ public partial class DiscoveryWorkerTests
60
64
  new()
61
65
  {
62
66
  FilePath = "../src/project1/project1.csproj",
63
- ExpectedDependencyCount = 2,
64
67
  Dependencies =
65
68
  [
66
69
  new("Package.A", "1.0.0", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
@@ -70,12 +73,13 @@ public partial class DiscoveryWorkerTests
70
73
  new("TargetFramework", "net8.0", "src/project1/project1.csproj")
71
74
  ],
72
75
  TargetFrameworks = ["net8.0"],
73
- ReferencedProjectPaths = []
76
+ ReferencedProjectPaths = [],
77
+ ImportedFiles = [],
78
+ AdditionalFiles = [],
74
79
  },
75
80
  new()
76
81
  {
77
82
  FilePath = "../src/project2/project2.csproj",
78
- ExpectedDependencyCount = 2,
79
83
  Dependencies =
80
84
  [
81
85
  new("Package.B", "2.0.0", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
@@ -85,7 +89,9 @@ public partial class DiscoveryWorkerTests
85
89
  new("TargetFramework", "net8.0", "src/project2/project2.csproj")
86
90
  ],
87
91
  TargetFrameworks = ["net8.0"],
88
- ReferencedProjectPaths = []
92
+ ReferencedProjectPaths = [],
93
+ ImportedFiles = [],
94
+ AdditionalFiles = [],
89
95
  }
90
96
  ]
91
97
  }