dependabot-nuget 0.310.0 → 0.312.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/Directory.Packages.props +1 -1
- data/helpers/lib/NuGetUpdater/DotNetPackageCorrelation.Test/DotNetPackageCorrelation.Test.csproj +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Run.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/NuGetUpdater.Cli.Test.csproj +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +7 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/BadResponseException.cs +12 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +121 -9
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/ClosePullRequest.cs +13 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CreatePullRequest.cs +20 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +1 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobErrorBase.cs +26 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/MessageBase.cs +1 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UnknownError.cs +12 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UpdatePullRequest.cs +16 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/HttpApiHandler.cs +19 -50
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/IApiHandler.cs +33 -7
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/PullRequestTextGenerator.cs +49 -13
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +41 -11
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +13 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdateOperationBase.cs +1 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/DependencyConflictResolver.cs +6 -25
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +13 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/VersionFinderTests.cs +74 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Clone/CloneWorkerTests.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +3 -9
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +3 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +58 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +37 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/HttpApiHandlerTests.cs +116 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/MessageReportTests.cs +231 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/PullRequestTextTests.cs +32 -8
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +714 -11
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +44 -13
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/TestApiHandler.cs +2 -39
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestHttpServer.cs +9 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackageReferenceUpdaterTests.cs +99 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateOperationBaseTests.cs +3 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +1 -13
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/LoggerTests.cs +0 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +66 -8
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +1 -1
- data/helpers/lib/NuGetUpdater/global.json +1 -1
- metadata +30 -27
@@ -8,7 +8,7 @@ using Xunit;
|
|
8
8
|
|
9
9
|
namespace NuGetUpdater.Core.Test.Run;
|
10
10
|
|
11
|
-
public class SerializationTests
|
11
|
+
public class SerializationTests : TestBase
|
12
12
|
{
|
13
13
|
[Fact]
|
14
14
|
public void DeserializeJob()
|
@@ -50,7 +50,8 @@ public class SerializationTests
|
|
50
50
|
"credentials-metadata": [
|
51
51
|
{
|
52
52
|
"host": "github.com",
|
53
|
-
"type": "git_source"
|
53
|
+
"type": "git_source",
|
54
|
+
"replaces-base": false
|
54
55
|
}
|
55
56
|
],
|
56
57
|
"max-updater-run-time": 0
|
@@ -116,7 +117,8 @@ public class SerializationTests
|
|
116
117
|
"credentials": [
|
117
118
|
{
|
118
119
|
"name": "some-cred",
|
119
|
-
"token": "abc123"
|
120
|
+
"token": "abc123",
|
121
|
+
"replaces-base": false
|
120
122
|
}
|
121
123
|
],
|
122
124
|
"existing-pull-requests": [
|
@@ -258,15 +260,9 @@ public class SerializationTests
|
|
258
260
|
}
|
259
261
|
|
260
262
|
[Theory]
|
261
|
-
[MemberData(nameof(
|
263
|
+
[MemberData(nameof(SerializeErrorTypesData))]
|
262
264
|
public void SerializeError(JobErrorBase error, string expectedSerialization)
|
263
265
|
{
|
264
|
-
if (error is UnknownError unknown)
|
265
|
-
{
|
266
|
-
// special case the exception's call stack to make it testable
|
267
|
-
unknown.Details["error-backtrace"] = "TEST-BACKTRACE";
|
268
|
-
}
|
269
|
-
|
270
266
|
var actual = HttpApiHandler.Serialize(error);
|
271
267
|
Assert.Equal(expectedSerialization, actual);
|
272
268
|
}
|
@@ -277,7 +273,7 @@ public class SerializationTests
|
|
277
273
|
var untestedTypes = typeof(JobErrorBase).Assembly.GetTypes()
|
278
274
|
.Where(t => t.IsSubclassOf(typeof(JobErrorBase)))
|
279
275
|
.ToHashSet();
|
280
|
-
foreach (object?[] data in
|
276
|
+
foreach (object?[] data in SerializeErrorTypesData())
|
281
277
|
{
|
282
278
|
var testedErrorType = data[0]!.GetType();
|
283
279
|
untestedTypes.Remove(testedErrorType);
|
@@ -599,7 +595,42 @@ public class SerializationTests
|
|
599
595
|
Assert.Equal(expected, actual);
|
600
596
|
}
|
601
597
|
|
602
|
-
|
598
|
+
[Fact]
|
599
|
+
public void SerializeRealUnknownErrorWithInnerException()
|
600
|
+
{
|
601
|
+
// arrange
|
602
|
+
using var tempDir = new TemporaryDirectory();
|
603
|
+
var action = new Action(() =>
|
604
|
+
{
|
605
|
+
try
|
606
|
+
{
|
607
|
+
throw new NotImplementedException("inner message");
|
608
|
+
}
|
609
|
+
catch (Exception ex)
|
610
|
+
{
|
611
|
+
throw new InvalidOperationException("outer message", ex);
|
612
|
+
}
|
613
|
+
});
|
614
|
+
var ex = Assert.Throws<InvalidOperationException>(action);
|
615
|
+
|
616
|
+
// act
|
617
|
+
var error = JobErrorBase.ErrorFromException(ex, "TEST-JOB-ID", tempDir.DirectoryPath);
|
618
|
+
|
619
|
+
// assert
|
620
|
+
// real exception message should look like this:
|
621
|
+
// System.InvalidOperationException: outer message
|
622
|
+
// ---> System.NotImplementedException: inner message
|
623
|
+
// at Namespace.Class.Method() in file.cs:line 123
|
624
|
+
// --- End of inner exception stack trace ---
|
625
|
+
// at Namespace.Class.Method() in file.cs:line 456
|
626
|
+
var errorMessage = Assert.IsType<string>(error.Details["error-message"]);
|
627
|
+
var lines = errorMessage.Split('\n').Select(l => l.TrimEnd('\r')).ToArray();
|
628
|
+
Assert.Equal("System.InvalidOperationException: outer message", lines[0]);
|
629
|
+
Assert.Equal(" ---> System.NotImplementedException: inner message", lines[1]);
|
630
|
+
Assert.Contains(" --- End of inner exception stack trace ---", lines[2..]);
|
631
|
+
}
|
632
|
+
|
633
|
+
public static IEnumerable<object?[]> SerializeErrorTypesData()
|
603
634
|
{
|
604
635
|
yield return
|
605
636
|
[
|
@@ -677,7 +708,7 @@ public class SerializationTests
|
|
677
708
|
[
|
678
709
|
new UnknownError(new Exception("some message"), "JOB-ID"),
|
679
710
|
"""
|
680
|
-
{"data":{"error-type":"unknown_error","error-details":{"error-class":"Exception","error-message":"some message","error-backtrace":"
|
711
|
+
{"data":{"error-type":"unknown_error","error-details":{"error-class":"Exception","error-message":"System.Exception: some message","error-backtrace":"","package-manager":"nuget","job-id":"JOB-ID"}}}
|
681
712
|
"""
|
682
713
|
];
|
683
714
|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
using NuGetUpdater.Core.Run;
|
2
|
-
using NuGetUpdater.Core.Run.ApiModel;
|
3
2
|
|
4
3
|
namespace NuGetUpdater.Core.Test;
|
5
4
|
|
@@ -9,45 +8,9 @@ internal class TestApiHandler : IApiHandler
|
|
9
8
|
|
10
9
|
public IEnumerable<(Type Type, object Object)> ReceivedMessages => _receivedMessages;
|
11
10
|
|
12
|
-
public Task
|
11
|
+
public Task SendAsync(string endpoint, object body, string method)
|
13
12
|
{
|
14
|
-
_receivedMessages.Add((
|
15
|
-
return Task.CompletedTask;
|
16
|
-
}
|
17
|
-
|
18
|
-
public Task UpdateDependencyList(UpdatedDependencyList updatedDependencyList)
|
19
|
-
{
|
20
|
-
_receivedMessages.Add((updatedDependencyList.GetType(), updatedDependencyList));
|
21
|
-
return Task.CompletedTask;
|
22
|
-
}
|
23
|
-
|
24
|
-
public Task IncrementMetric(IncrementMetric incrementMetric)
|
25
|
-
{
|
26
|
-
_receivedMessages.Add((incrementMetric.GetType(), incrementMetric));
|
27
|
-
return Task.CompletedTask;
|
28
|
-
}
|
29
|
-
|
30
|
-
public Task CreatePullRequest(CreatePullRequest createPullRequest)
|
31
|
-
{
|
32
|
-
_receivedMessages.Add((createPullRequest.GetType(), createPullRequest));
|
33
|
-
return Task.CompletedTask;
|
34
|
-
}
|
35
|
-
|
36
|
-
public Task ClosePullRequest(ClosePullRequest closePullRequest)
|
37
|
-
{
|
38
|
-
_receivedMessages.Add((closePullRequest.GetType(), closePullRequest));
|
39
|
-
return Task.CompletedTask;
|
40
|
-
}
|
41
|
-
|
42
|
-
public Task UpdatePullRequest(UpdatePullRequest updatePullRequest)
|
43
|
-
{
|
44
|
-
_receivedMessages.Add((updatePullRequest.GetType(), updatePullRequest));
|
45
|
-
return Task.CompletedTask;
|
46
|
-
}
|
47
|
-
|
48
|
-
public Task MarkAsProcessed(MarkAsProcessed markAsProcessed)
|
49
|
-
{
|
50
|
-
_receivedMessages.Add((markAsProcessed.GetType(), markAsProcessed));
|
13
|
+
_receivedMessages.Add((body.GetType(), body));
|
51
14
|
return Task.CompletedTask;
|
52
15
|
}
|
53
16
|
}
|
@@ -10,13 +10,13 @@ namespace NuGetUpdater.Core.Test
|
|
10
10
|
{
|
11
11
|
public class TestHttpServer : IDisposable
|
12
12
|
{
|
13
|
-
private readonly Func<string, string, (int, byte[])> _requestHandler;
|
13
|
+
private readonly Func<string, string, (int, byte[]?)> _requestHandler;
|
14
14
|
private readonly HttpListener _listener;
|
15
15
|
private bool _runServer = true;
|
16
16
|
|
17
17
|
public string BaseUrl { get; }
|
18
18
|
|
19
|
-
private TestHttpServer(string baseurl, Func<string, string, (int, byte[])> requestHandler)
|
19
|
+
private TestHttpServer(string baseurl, Func<string, string, (int, byte[]?)> requestHandler)
|
20
20
|
{
|
21
21
|
BaseUrl = baseurl;
|
22
22
|
_requestHandler = requestHandler;
|
@@ -45,7 +45,11 @@ namespace NuGetUpdater.Core.Test
|
|
45
45
|
var context = await _listener.GetContextAsync();
|
46
46
|
var (statusCode, response) = _requestHandler(context.Request.HttpMethod, context.Request.Url!.AbsoluteUri);
|
47
47
|
context.Response.StatusCode = statusCode;
|
48
|
-
|
48
|
+
if (response is not null)
|
49
|
+
{
|
50
|
+
await context.Response.OutputStream.WriteAsync(response);
|
51
|
+
}
|
52
|
+
|
49
53
|
context.Response.Close();
|
50
54
|
}
|
51
55
|
}
|
@@ -57,7 +61,7 @@ namespace NuGetUpdater.Core.Test
|
|
57
61
|
return CreateTestServer((method, url) => requestHandler(url));
|
58
62
|
}
|
59
63
|
|
60
|
-
public static TestHttpServer CreateTestServer(Func<string, string, (int, byte[])> requestHandler)
|
64
|
+
public static TestHttpServer CreateTestServer(Func<string, string, (int, byte[]?)> requestHandler)
|
61
65
|
{
|
62
66
|
// static lock to ensure the port is not recycled after `FindFreePort()` and before we can start the real server
|
63
67
|
lock (PortGate)
|
@@ -77,7 +81,7 @@ namespace NuGetUpdater.Core.Test
|
|
77
81
|
|
78
82
|
public static TestHttpServer CreateTestStringServer(Func<string, string, (int, string)> requestHandler)
|
79
83
|
{
|
80
|
-
Func<string, string, (int, byte[])> bytesRequestHandler = (method, url) =>
|
84
|
+
Func<string, string, (int, byte[]?)> bytesRequestHandler = (method, url) =>
|
81
85
|
{
|
82
86
|
var (statusCode, response) = requestHandler(method, url);
|
83
87
|
return (statusCode, Encoding.UTF8.GetBytes(response));
|
@@ -55,7 +55,7 @@ public class PackageReferenceUpdaterTests
|
|
55
55
|
|
56
56
|
// assert
|
57
57
|
await buildFile.SaveAsync();
|
58
|
-
var actualContents = await File.ReadAllTextAsync(fullProjectPath);
|
58
|
+
var actualContents = await File.ReadAllTextAsync(fullProjectPath, TestContext.Current.CancellationToken);
|
59
59
|
var expectedContents = """
|
60
60
|
<Project Sdk="Microsoft.NET.Sdk">
|
61
61
|
<PropertyGroup>
|
@@ -71,6 +71,104 @@ public class PackageReferenceUpdaterTests
|
|
71
71
|
Assert.Equal(expectedContents, actualContents);
|
72
72
|
}
|
73
73
|
|
74
|
+
[Fact]
|
75
|
+
public async Task DirectBuildFileChangesAreMaintainedWhenPinningTransitiveDependency_DirectoryPackagesPropsIsDiscovered()
|
76
|
+
{
|
77
|
+
// arrange
|
78
|
+
using var tempDir = await TemporaryDirectory.CreateWithContentsAsync(
|
79
|
+
[
|
80
|
+
("project.csproj", """
|
81
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
82
|
+
<PropertyGroup>
|
83
|
+
<TargetFramework>net9.0</TargetFramework>
|
84
|
+
</PropertyGroup>
|
85
|
+
<ItemGroup>
|
86
|
+
<PackageReference Include="Completely.Different.Package" />
|
87
|
+
<PackageReference Include="Some.Package" />
|
88
|
+
</ItemGroup>
|
89
|
+
</Project>
|
90
|
+
"""),
|
91
|
+
("Directory.Packages.props", """
|
92
|
+
<Project>
|
93
|
+
<PropertyGroup>
|
94
|
+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
95
|
+
</PropertyGroup>
|
96
|
+
<ItemGroup>
|
97
|
+
<PackageVersion Include="Completely.Different.Package" Version="1.0.0" />
|
98
|
+
<PackageVersion Include="Some.Package" Version="1.0.0" />
|
99
|
+
</ItemGroup>
|
100
|
+
</Project>
|
101
|
+
""")
|
102
|
+
]);
|
103
|
+
var packages = new[]
|
104
|
+
{
|
105
|
+
MockNuGetPackage.CreateSimplePackage("Completely.Different.Package", "1.0.0", "net9.0"),
|
106
|
+
MockNuGetPackage.CreateSimplePackage("Completely.Different.Package", "2.0.0", "net9.0"),
|
107
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net9.0", [(null, [("Transitive.Package", "1.0.0")])]),
|
108
|
+
MockNuGetPackage.CreateSimplePackage("Transitive.Package", "1.0.0", "net9.0"),
|
109
|
+
MockNuGetPackage.CreateSimplePackage("Transitive.Package", "2.0.0", "net9.0"),
|
110
|
+
};
|
111
|
+
await UpdateWorkerTestBase.MockNuGetPackagesInDirectory(packages, tempDir.DirectoryPath);
|
112
|
+
var fullProjectPath = Path.Combine(tempDir.DirectoryPath, "project.csproj");
|
113
|
+
var fullDirectoryPackagesPath = Path.Combine(tempDir.DirectoryPath, "Directory.Packages.props");
|
114
|
+
var buildFiles = new[]
|
115
|
+
{
|
116
|
+
ProjectBuildFile.Open(tempDir.DirectoryPath, fullProjectPath),
|
117
|
+
ProjectBuildFile.Open(tempDir.DirectoryPath, fullDirectoryPackagesPath)
|
118
|
+
}.ToImmutableArray();
|
119
|
+
var experimentsManager = new ExperimentsManager();
|
120
|
+
|
121
|
+
// act
|
122
|
+
// pin transitive dependency
|
123
|
+
var updatedFiles = await PackageReferenceUpdater.UpdateTransitiveDependencyAsync(
|
124
|
+
tempDir.DirectoryPath,
|
125
|
+
fullProjectPath,
|
126
|
+
"Transitive.Package",
|
127
|
+
"2.0.0",
|
128
|
+
buildFiles,
|
129
|
+
experimentsManager,
|
130
|
+
new TestLogger());
|
131
|
+
|
132
|
+
// subsequent update should not overwrite previous change
|
133
|
+
PackageReferenceUpdater.TryUpdateDependencyVersion(buildFiles, "Completely.Different.Package", "1.0.0", "2.0.0", new TestLogger());
|
134
|
+
|
135
|
+
// assert
|
136
|
+
foreach (var bf in buildFiles)
|
137
|
+
{
|
138
|
+
await bf.SaveAsync();
|
139
|
+
}
|
140
|
+
|
141
|
+
var actualProjectContents = await File.ReadAllTextAsync(fullProjectPath, TestContext.Current.CancellationToken);
|
142
|
+
var expectedProjectContents = """
|
143
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
144
|
+
<PropertyGroup>
|
145
|
+
<TargetFramework>net9.0</TargetFramework>
|
146
|
+
</PropertyGroup>
|
147
|
+
<ItemGroup>
|
148
|
+
<PackageReference Include="Completely.Different.Package" />
|
149
|
+
<PackageReference Include="Some.Package" />
|
150
|
+
<PackageReference Include="Transitive.Package" />
|
151
|
+
</ItemGroup>
|
152
|
+
</Project>
|
153
|
+
""";
|
154
|
+
Assert.Equal(expectedProjectContents.Replace("\r", ""), actualProjectContents.Replace("\r", ""));
|
155
|
+
|
156
|
+
var actualDirectoryPackagesContents = await File.ReadAllTextAsync(fullDirectoryPackagesPath, TestContext.Current.CancellationToken);
|
157
|
+
var expectedDirectoryPackagesContents = """
|
158
|
+
<Project>
|
159
|
+
<PropertyGroup>
|
160
|
+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
161
|
+
</PropertyGroup>
|
162
|
+
<ItemGroup>
|
163
|
+
<PackageVersion Include="Completely.Different.Package" Version="2.0.0" />
|
164
|
+
<PackageVersion Include="Some.Package" Version="1.0.0" />
|
165
|
+
<PackageVersion Include="Transitive.Package" Version="2.0.0" />
|
166
|
+
</ItemGroup>
|
167
|
+
</Project>
|
168
|
+
""";
|
169
|
+
Assert.Equal(expectedDirectoryPackagesContents.Replace("\r", ""), actualDirectoryPackagesContents.Replace("\r", ""));
|
170
|
+
}
|
171
|
+
|
74
172
|
[Theory]
|
75
173
|
[MemberData(nameof(ComputeUpdateOperationsTestData))]
|
76
174
|
public async Task ComputeUpdateOperations
|
@@ -43,9 +43,9 @@ public class UpdateOperationBaseTests
|
|
43
43
|
// assert
|
44
44
|
var expectedReport = """
|
45
45
|
Performed the following updates:
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
- Updated Package.A to 1.0.0 in file/a.txt
|
47
|
+
- Pinned Package.B at 2.0.0 in file/b.txt
|
48
|
+
- Updated Package.C to 3.0.0 indirectly via Package.D/4.0.0 in file/c.txt
|
49
49
|
""".Replace("\r", "");
|
50
50
|
Assert.Equal(expectedReport, actualReport);
|
51
51
|
}
|
data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs
CHANGED
@@ -382,19 +382,7 @@ public partial class UpdateWorkerTests
|
|
382
382
|
MockNuGetPackage.CreateSimplePackage("Some.Package", "9.0.1", "net8.0"),
|
383
383
|
MockNuGetPackage.CreateSimplePackage("Some.Package", "13.0.1", "net8.0"),
|
384
384
|
// necessary for the `net8.0-windows10.0.19041.0` TFM
|
385
|
-
|
386
|
-
[
|
387
|
-
("data/FrameworkList.xml", Encoding.UTF8.GetBytes("""
|
388
|
-
<FileList Name="Windows SDK .NET 6.0">
|
389
|
-
<!-- contents omitted -->
|
390
|
-
</FileList>
|
391
|
-
""")),
|
392
|
-
("data/RuntimeList.xml", Encoding.UTF8.GetBytes("""
|
393
|
-
<FileList Name="Windows SDK .NET 6.0" TargetFrameworkIdentifier=".NETCoreApp" TargetFrameworkVersion="6.0" FrameworkName="Microsoft.Windows.SDK.NET.Ref">
|
394
|
-
<!-- contents omitted -->
|
395
|
-
</FileList>
|
396
|
-
""")),
|
397
|
-
]),
|
385
|
+
MockNuGetPackage.WellKnownWindowsSdkRefPackage("10.0.19041.0"),
|
398
386
|
],
|
399
387
|
// initial
|
400
388
|
projectContents: $"""
|
@@ -1370,11 +1370,11 @@ public class MSBuildHelperTests : TestBase
|
|
1370
1370
|
""");
|
1371
1371
|
await UpdateWorkerTestBase.MockNuGetPackagesInDirectory([
|
1372
1372
|
// initial packages
|
1373
|
-
MockNuGetPackage.CreateSimplePackage("Microsoft.EntityFrameworkCore", "7.0.11", "net8.0", [(null, [("Microsoft.EntityFrameworkCore.Analyzers", "7.0.11"), ("Microsoft.Extensions.Caching.Memory", "7.0.0")])]),
|
1373
|
+
MockNuGetPackage.CreateSimplePackage("Microsoft.EntityFrameworkCore", "7.0.11", "net8.0", [(null, [("Microsoft.EntityFrameworkCore.Analyzers", "7.0.11"), ("Microsoft.Extensions.Caching.Memory", "[7.0.0]")])]),
|
1374
1374
|
MockNuGetPackage.CreateSimplePackage("Microsoft.EntityFrameworkCore.Analyzers", "7.0.11", "net8.0"),
|
1375
1375
|
MockNuGetPackage.CreateSimplePackage("Microsoft.Extensions.Caching.Memory", "7.0.0", "net8.0"),
|
1376
1376
|
// available packages
|
1377
|
-
MockNuGetPackage.CreateSimplePackage("Microsoft.EntityFrameworkCore", "8.0.0", "net8.0", [(null, [("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0"), ("Microsoft.Extensions.Caching.Memory", "8.0.0")])]),
|
1377
|
+
MockNuGetPackage.CreateSimplePackage("Microsoft.EntityFrameworkCore", "8.0.0", "net8.0", [(null, [("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0"), ("Microsoft.Extensions.Caching.Memory", "[8.0.0]")])]),
|
1378
1378
|
MockNuGetPackage.CreateSimplePackage("Microsoft.EntityFrameworkCore.Analyzers", "8.0.0", "net8.0"),
|
1379
1379
|
MockNuGetPackage.CreateSimplePackage("Microsoft.Extensions.Caching.Memory", "8.0.0", "net8.0"),
|
1380
1380
|
], tempDirectory.DirectoryPath);
|
@@ -1627,16 +1627,13 @@ public class MSBuildHelperTests : TestBase
|
|
1627
1627
|
// initial packages
|
1628
1628
|
MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.CSharp.Workspaces", "4.8.0", "net8.0", [(null, [("Microsoft.CodeAnalysis.CSharp", "[4.8.0]"), ("Microsoft.CodeAnalysis.Common", "[4.8.0]")])]),
|
1629
1629
|
MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.CSharp", "4.8.0", "net8.0", [(null, [("Microsoft.CodeAnalysis.Common", "[4.8.0]")])]),
|
1630
|
-
MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.Common", "4.8.0", "net8.0", [(null, [("System.Collections.Immutable", "7.0.0")])]),
|
1630
|
+
MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.Common", "4.8.0", "net8.0", [(null, [("System.Collections.Immutable", "[7.0.0]")])]),
|
1631
1631
|
MockNuGetPackage.CreateSimplePackage("System.Collections.Immutable", "7.0.0", "net8.0"),
|
1632
1632
|
// available packages
|
1633
1633
|
MockNuGetPackage.CreateSimplePackage("System.Collections.Immutable", "8.0.0", "net8.0"),
|
1634
1634
|
MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.CSharp.Workspaces", "4.9.2", "net8.0", [(null, [("Microsoft.CodeAnalysis.CSharp", "[4.9.2]"), ("Microsoft.CodeAnalysis.Common", "[4.9.2]")])]),
|
1635
1635
|
MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.CSharp", "4.9.2", "net8.0", [(null, [("Microsoft.CodeAnalysis.Common", "[4.9.2]")])]),
|
1636
|
-
MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.Common", "4.9.2", "net8.0", [(null, [("System.Collections.Immutable", "8.0.0")])]),
|
1637
|
-
//MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.CSharp.Workspaces", "4.10.0", "net8.0", [(null, [("Microsoft.CodeAnalysis.CSharp", "[4.10.0]"), ("Microsoft.CodeAnalysis.Common", "[4.10.0]")])]),
|
1638
|
-
//MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.CSharp", "4.10.0", "net8.0", [(null, [("Microsoft.CodeAnalysis.Common", "[4.10.0]")])]),
|
1639
|
-
//MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.Common", "4.10.0", "net8.0", [(null, [("System.Collections.Immutable", "8.0.0")])])
|
1636
|
+
MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.Common", "4.9.2", "net8.0", [(null, [("System.Collections.Immutable", "[8.0.0]")])]),
|
1640
1637
|
], tempDirectory.DirectoryPath);
|
1641
1638
|
|
1642
1639
|
var dependencies = new[]
|
@@ -1669,6 +1666,59 @@ public class MSBuildHelperTests : TestBase
|
|
1669
1666
|
};
|
1670
1667
|
AssertEx.Equal(expectedResolvedDependencies, actualResolvedDependencies);
|
1671
1668
|
}
|
1669
|
+
|
1670
|
+
[Fact(Timeout = 120_000)] // 2m
|
1671
|
+
public async Task DependencyConflictsCanBeResolved_TopLevelDependencyHasNewerVersionsThatDoNotPullUpTransitive()
|
1672
|
+
{
|
1673
|
+
using var tempDirectory = new TemporaryDirectory();
|
1674
|
+
var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
|
1675
|
+
await File.WriteAllTextAsync(projectPath, """
|
1676
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
1677
|
+
<PropertyGroup>
|
1678
|
+
<TargetFramework>net8.0</TargetFramework>
|
1679
|
+
</PropertyGroup>
|
1680
|
+
<ItemGroup>
|
1681
|
+
<PackageReference Include="Top.Level.Package" Version="1.41.0" />
|
1682
|
+
</ItemGroup>
|
1683
|
+
</Project>
|
1684
|
+
""");
|
1685
|
+
await UpdateWorkerTestBase.MockNuGetPackagesInDirectory([
|
1686
|
+
// initial packages
|
1687
|
+
MockNuGetPackage.CreateSimplePackage("Top.Level.Package", "1.41.0", "net8.0", [(null, [("Transitive.Package", "6.0.0")])]),
|
1688
|
+
MockNuGetPackage.CreateSimplePackage("Transitive.Package", "6.0.0", "net8.0"),
|
1689
|
+
// available packages
|
1690
|
+
MockNuGetPackage.CreateSimplePackage("Top.Level.Package", "1.45.0", "net8.0", [(null, [("Transitive.Package", "6.0.0")])]),
|
1691
|
+
MockNuGetPackage.CreateSimplePackage("Transitive.Package", "8.0.5", "net8.0"),
|
1692
|
+
], tempDirectory.DirectoryPath);
|
1693
|
+
|
1694
|
+
var dependencies = new[]
|
1695
|
+
{
|
1696
|
+
new Dependency("Top.Level.Package", "1.41.0", DependencyType.PackageReference),
|
1697
|
+
}.ToImmutableArray();
|
1698
|
+
var update = new[]
|
1699
|
+
{
|
1700
|
+
new Dependency("Transitive.Package", "8.0.5", DependencyType.PackageReference),
|
1701
|
+
}.ToImmutableArray();
|
1702
|
+
|
1703
|
+
var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
|
1704
|
+
tempDirectory.DirectoryPath,
|
1705
|
+
projectPath,
|
1706
|
+
"net8.0",
|
1707
|
+
dependencies,
|
1708
|
+
update,
|
1709
|
+
new ExperimentsManager() { InstallDotnetSdks = true },
|
1710
|
+
new TestLogger()
|
1711
|
+
);
|
1712
|
+
Assert.NotNull(resolvedDependencies);
|
1713
|
+
var actualResolvedDependencies = resolvedDependencies.Value.Select(d => $"{d.Name}/{d.Version}").ToArray();
|
1714
|
+
var expectedResolvedDependencies = new[]
|
1715
|
+
{
|
1716
|
+
"Top.Level.Package/1.41.0",
|
1717
|
+
"Transitive.Package/8.0.5",
|
1718
|
+
};
|
1719
|
+
AssertEx.Equal(expectedResolvedDependencies, actualResolvedDependencies);
|
1720
|
+
}
|
1721
|
+
|
1672
1722
|
#endregion
|
1673
1723
|
|
1674
1724
|
[Theory]
|
@@ -1760,7 +1810,7 @@ public class MSBuildHelperTests : TestBase
|
|
1760
1810
|
// output
|
1761
1811
|
"Unable to find package Some.Package with version (= 1.2.3)",
|
1762
1812
|
// expectedError
|
1763
|
-
new DependencyNotFound("Some.Package"),
|
1813
|
+
new DependencyNotFound("Some.Package/= 1.2.3"),
|
1764
1814
|
];
|
1765
1815
|
|
1766
1816
|
yield return
|
@@ -1802,6 +1852,14 @@ public class MSBuildHelperTests : TestBase
|
|
1802
1852
|
// expectedError
|
1803
1853
|
new UpdateNotPossible(["Some.Package.1.2.3"]),
|
1804
1854
|
];
|
1855
|
+
|
1856
|
+
yield return
|
1857
|
+
[
|
1858
|
+
// output
|
1859
|
+
"Failed to fetch results from V2 feed at 'http://nuget.example.com/FindPackagesById()?id='Some.Package'&semVerLevel=2.0.0' with following message : Response status code does not indicate success: 404.",
|
1860
|
+
// expectedError
|
1861
|
+
new DependencyNotFound("Some.Package"),
|
1862
|
+
];
|
1805
1863
|
}
|
1806
1864
|
|
1807
1865
|
public static IEnumerable<object[]> GetTopLevelPackageDependencyInfosTestData()
|
@@ -59,7 +59,7 @@ public class PathHelperTests
|
|
59
59
|
}
|
60
60
|
|
61
61
|
[LinuxOnlyFact]
|
62
|
-
public async
|
62
|
+
public async Task FilesWithDifferentlyCasedDirectoriesCanBeResolved()
|
63
63
|
{
|
64
64
|
// arrange
|
65
65
|
using var temp = new TemporaryDirectory();
|