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.
- checksums.yaml +4 -4
- data/helpers/lib/NuGetUpdater/.gitignore +1 -0
- data/helpers/lib/NuGetUpdater/Directory.Build.targets +17 -0
- data/helpers/lib/NuGetUpdater/Directory.Packages.props +26 -17
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Packaging/NuGet.Packaging.csproj +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/DiscoverCommand.cs +7 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +3 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +88 -47
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +31 -16
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementArrayConverter.cs +39 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/ShellGitCommandHandler.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyDiscovery.props +7 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyDiscovery.targets +10 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +64 -53
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DotNetToolsJsonDiscovery.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/GlobalJsonDiscovery.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscovery.cs +17 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/PackagesConfigDiscoveryResult.cs +3 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/ProjectDiscoveryResult.cs +3 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +429 -12
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/WorkspaceDiscoveryResult.cs +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +12 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/JsonBuildFile.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/CompatabilityChecker.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/NuGetUpdater.Core.csproj +7 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +23 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +43 -58
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/TargetFrameworkReporter.targets +13 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +13 -43
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/DotNetToolsJsonUpdater.cs +4 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/GlobalJsonUpdater.cs +5 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +3 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +40 -33
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +12 -11
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +16 -12
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/CollectionExtensions.cs +17 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ConsoleLogger.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/DependencyConflictResolver.cs +19 -19
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ILogger.cs +11 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +74 -20
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +1 -17
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathComparer.cs +31 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +46 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProjectHelper.cs +96 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTests.cs +135 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs +71 -38
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.PackagesConfig.cs +66 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Proj.cs +11 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +808 -222
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +477 -97
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +5 -9
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +494 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +46 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +401 -77
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +35 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/UpdatedDependencyListTests.cs +60 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +3 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestLogger.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/BindingRedirectsTests.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +8 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +40 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/AssertEx.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/LinuxOnlyAttribute.cs +12 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +8 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +49 -3
- data/lib/dependabot/nuget/analysis/analysis_json_reader.rb +3 -1
- data/lib/dependabot/nuget/file_fetcher.rb +12 -393
- data/lib/dependabot/nuget/file_parser.rb +23 -54
- data/lib/dependabot/nuget/file_updater.rb +21 -16
- data/lib/dependabot/nuget/native_discovery/native_dependency_file_discovery.rb +2 -9
- data/lib/dependabot/nuget/native_discovery/native_discovery_json_reader.rb +183 -80
- data/lib/dependabot/nuget/native_discovery/native_project_discovery.rb +25 -3
- data/lib/dependabot/nuget/native_discovery/native_workspace_discovery.rb +1 -11
- data/lib/dependabot/nuget/native_helpers.rb +13 -4
- data/lib/dependabot/nuget/native_update_checker/native_update_checker.rb +17 -4
- metadata +15 -12
- data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Packages.props +0 -29
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs +0 -17
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscovery.cs +0 -69
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DirectoryPackagesPropsDiscoveryResult.cs +0 -11
- data/lib/dependabot/nuget/file_fetcher/import_paths_finder.rb +0 -73
- data/lib/dependabot/nuget/file_fetcher/sln_project_paths_finder.rb +0 -60
- 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
|
-
|
77
|
+
foreach (var expectedProject in expectedProjects)
|
67
78
|
{
|
68
|
-
|
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
|
-
|
87
|
+
var forbiddenProperties = new HashSet<string>(["TargetFrameworkVersion"], StringComparer.OrdinalIgnoreCase);
|
88
|
+
actualProperties = actualProperties.Where(p => !forbiddenProperties.Contains(p.Name)).ToImmutableArray();
|
71
89
|
}
|
72
90
|
|
73
|
-
|
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
|
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
|
-
|
114
|
+
internal static void ValidateDependencies(ImmutableArray<Dependency> expectedDependencies, ImmutableArray<Dependency> actualDependencies)
|
115
|
+
{
|
116
|
+
if (expectedDependencies.IsDefault)
|
87
117
|
{
|
88
|
-
|
89
|
-
Assert.Equal(expected?.IsTransitivePinningEnabled, actual?.IsTransitivePinningEnabled);
|
118
|
+
return;
|
90
119
|
}
|
91
120
|
|
92
|
-
|
121
|
+
foreach (var expectedDependency in expectedDependencies)
|
93
122
|
{
|
94
|
-
|
95
|
-
{
|
96
|
-
return;
|
97
|
-
}
|
98
|
-
|
99
|
-
foreach (var expectedDependency in expectedDependencies)
|
123
|
+
var matchingDependencies = actualDependencies.Where(d =>
|
100
124
|
{
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
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
|
|
data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.PackagesConfig.cs
CHANGED
@@ -7,9 +7,10 @@ public partial class DiscoveryWorkerTests
|
|
7
7
|
public class PackagesConfig : DiscoveryWorkerTestBase
|
8
8
|
{
|
9
9
|
[Fact]
|
10
|
-
public async Task
|
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
|
}
|