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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/lib/NuGetUpdater/Directory.Packages.props +1 -1
  3. data/helpers/lib/NuGetUpdater/DotNetPackageCorrelation.Test/DotNetPackageCorrelation.Test.csproj +1 -1
  4. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Run.cs +2 -2
  5. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/NuGetUpdater.Cli.Test.csproj +1 -1
  6. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +7 -0
  7. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/BadResponseException.cs +12 -0
  8. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/SdkProjectDiscovery.cs +121 -9
  9. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/ClosePullRequest.cs +13 -0
  10. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CreatePullRequest.cs +20 -0
  11. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/Job.cs +1 -2
  12. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobErrorBase.cs +26 -0
  13. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/MessageBase.cs +1 -0
  14. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UnknownError.cs +12 -2
  15. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UpdatePullRequest.cs +16 -0
  16. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/HttpApiHandler.cs +19 -50
  17. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/IApiHandler.cs +33 -7
  18. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/PullRequestTextGenerator.cs +49 -13
  19. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +41 -11
  20. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +13 -1
  21. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdateOperationBase.cs +1 -2
  22. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/DependencyConflictResolver.cs +6 -25
  23. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +13 -1
  24. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/VersionFinderTests.cs +74 -1
  25. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Clone/CloneWorkerTests.cs +1 -1
  26. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.Project.cs +3 -9
  27. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +3 -4
  28. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/SdkProjectDiscoveryTests.cs +58 -2
  29. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/MockNuGetPackage.cs +37 -2
  30. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj +1 -1
  31. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/HttpApiHandlerTests.cs +116 -0
  32. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/MessageReportTests.cs +231 -0
  33. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/PullRequestTextTests.cs +32 -8
  34. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +714 -11
  35. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +44 -13
  36. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/TestApiHandler.cs +2 -39
  37. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestHttpServer.cs +9 -5
  38. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackageReferenceUpdaterTests.cs +99 -1
  39. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateOperationBaseTests.cs +3 -3
  40. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +1 -13
  41. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/LoggerTests.cs +0 -1
  42. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +66 -8
  43. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +1 -1
  44. data/helpers/lib/NuGetUpdater/global.json +1 -1
  45. 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(DeserializeErrorTypesData))]
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 DeserializeErrorTypesData())
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
- public static IEnumerable<object?[]> DeserializeErrorTypesData()
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":"TEST-BACKTRACE","package-manager":"nuget","job-id":"JOB-ID"}}}
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 RecordUpdateJobError(JobErrorBase error)
11
+ public Task SendAsync(string endpoint, object body, string method)
13
12
  {
14
- _receivedMessages.Add((error.GetType(), error));
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
- await context.Response.OutputStream.WriteAsync(response);
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
- - 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
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
  }
@@ -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
- new("Microsoft.Windows.SDK.NET.Ref", "10.0.19041.54", Files:
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: $"""
@@ -5,7 +5,6 @@ using System.Text;
5
5
  using System.Threading.Tasks;
6
6
 
7
7
  using Xunit;
8
- using Xunit.Abstractions;
9
8
  using Xunit.Sdk;
10
9
 
11
10
  namespace NuGetUpdater.Core.Test.Utilities;
@@ -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 void FilesWithDifferentlyCasedDirectoriesCanBeResolved()
62
+ public async Task FilesWithDifferentlyCasedDirectoriesCanBeResolved()
63
63
  {
64
64
  // arrange
65
65
  using var temp = new TemporaryDirectory();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "sdk": {
3
- "version": "9.0.101",
3
+ "version": "9.0.203",
4
4
  "rollForward": "latestMinor"
5
5
  }
6
6
  }