Skip to content

Commit 5de4f3e

Browse files
SimaTiangithub-actions
authored andcommitted
addressing review comments
1 parent 37048d6 commit 5de4f3e

File tree

2 files changed

+47
-54
lines changed

2 files changed

+47
-54
lines changed

src/Build.UnitTests/BackEnd/SdkResolverService_Tests.cs

Lines changed: 19 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Generic;
66
using System.Diagnostics.Tracing;
77
using System.Linq;
8+
using System.Runtime.CompilerServices;
89
using System.Text.RegularExpressions;
910
using System.Threading;
1011
using System.Threading.Tasks;
@@ -26,16 +27,14 @@
2627

2728
namespace Microsoft.Build.Engine.UnitTests.BackEnd
2829
{
29-
public class SdkResolverService_Tests : IDisposable
30+
public class SdkResolverService_Tests
3031
{
3132
private readonly MockLogger _logger;
3233
private readonly LoggingContext _loggingContext;
33-
private static SdkResolverService s_sdkResolverService;
3434

3535

3636
public SdkResolverService_Tests()
3737
{
38-
s_sdkResolverService = new SdkResolverService();
3938
_logger = new MockLogger();
4039
ILoggingService loggingService = LoggingService.CreateLoggingService(LoggerMode.Synchronous, 1);
4140
loggingService.RegisterLogger(_logger);
@@ -45,12 +44,6 @@ public SdkResolverService_Tests()
4544
new BuildEventContext(0, 0, BuildEventContext.InvalidProjectContextId, 0, 0));
4645
}
4746

48-
public void Dispose()
49-
{
50-
var service = new SdkResolverService();
51-
service.InitializeForTests();
52-
}
53-
5447
[Fact]
5548
// Scenario: Sdk is not resolved.
5649
public void AssertAllResolverErrorsLoggedWhenSdkNotResolved()
@@ -144,13 +137,13 @@ public void AssertSecondResolverWithPatternCanResolve()
144137
}
145138

146139
#if DEBUG
147-
internal void TryResolveSdk(out bool success)
140+
internal string TryResolveSdk(SdkResolverService service)
148141
{
149-
success = true;
142+
var message = "";
150143
SdkReference sdk = new SdkReference("2sdkName", "referencedVersion", "minimumVersion");
151144
try
152145
{
153-
s_sdkResolverService.ResolveSdk(BuildEventContext.InvalidSubmissionId,
146+
service.ResolveSdk(BuildEventContext.InvalidSubmissionId,
154147
sdk,
155148
_loggingContext,
156149
new MockElementLocation("file"),
@@ -160,43 +153,32 @@ internal void TryResolveSdk(out bool success)
160153
isRunningInVisualStudio: false,
161154
failOnUnresolvedSdk: true);
162155
}
163-
catch (Exception)
156+
catch (Exception e)
164157
{
165-
success = false;
158+
message = e.ToString();
166159
}
160+
return message;
167161
}
168162

169163

170164
[Fact]
171165
// Scenario: we want to test that we solved the contention described here: https://github.com/dotnet/msbuild/issues/7927#issuecomment-1232470838
172-
public void AssertResolverPopulationContentionNotPresent()
166+
public async Task AssertResolverPopulationContentionNotPresent()
173167
{
174-
s_sdkResolverService.InitializeForTests(new MockLoaderStrategy(includeResolversWithPatterns: true), resolverOnly: true);
175-
176-
List<SdkResolverManifest> manifests = new List<SdkResolverManifest>();
177-
for (int i = 1; i != 20; i++)
178-
{
179-
var man = new SdkResolverManifest(DisplayName: "TestResolversManifest", Path: null, ResolvableSdkRegex: new Regex("abc"));
180-
manifests.Add(man);
181-
man = new SdkResolverManifest(DisplayName: "TestResolversManifest", Path: null, null);
182-
manifests.Add(man);
183-
}
184-
s_sdkResolverService._fakeManifestRegistry = manifests.AsReadOnly();
185-
s_sdkResolverService._fake_initialization = true;
168+
var service = new SdkResolverService();
169+
service.InitializeForTests(new MockLoaderStrategy(includeResolversWithPatterns: true), contentionConditionTest: true);
186170

187171
SdkReference sdk = new SdkReference("2sdkName", "referencedVersion", "minimumVersion");
188172

189-
bool result1 = false;
190-
bool result2 = false;
191-
Thread thread1 = new Thread(() => TryResolveSdk(out result1));
192-
Thread thread2 = new Thread(() => TryResolveSdk(out result2));
193-
thread1.Start();
173+
var res1 = Task.Run(() => TryResolveSdk(service));
174+
194175
Thread.Sleep(200);
195-
thread2.Start();
196-
thread2.Join();
197-
thread1.Join();
198-
Assert.True(result1);
199-
Assert.True(result2);
176+
var res2 = Task.Run(() => TryResolveSdk(service));
177+
string message1 = await res1;
178+
string message2 = await res2;
179+
180+
Assert.Equal("", message1);
181+
Assert.Equal("", message2);
200182
}
201183
#endif
202184

src/Build/BackEnd/Components/SdkResolution/SdkResolverService.cs

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -407,14 +407,25 @@ private bool TryResolveSdkUsingSpecifiedResolvers(
407407
/// </summary>
408408
/// <param name="resolverLoader">An <see cref="SdkResolverLoader"/> to use for loading SDK resolvers.</param>
409409
/// <param name="resolvers">Explicit set of SdkResolvers to use for all SDK resolution.</param>
410-
/// <param name="resolverOnly"> Debug parameter for initializing only the resolver part</param>
411-
internal void InitializeForTests(SdkResolverLoader resolverLoader = null, IReadOnlyList<SdkResolver> resolvers = null, bool resolverOnly = false)
410+
/// <param name="contentionConditionTest"> Debug parameter for initializing only the stuff required for the Contention Condition check test.</param>
411+
internal void InitializeForTests(SdkResolverLoader resolverLoader = null, IReadOnlyList<SdkResolver> resolvers = null, bool contentionConditionTest = false)
412412
{
413413
if (resolverLoader != null)
414414
{
415415
_sdkResolverLoader = resolverLoader;
416-
if (resolverOnly)
416+
417+
if (contentionConditionTest)
417418
{
419+
_fake_initialization = true;
420+
List<SdkResolverManifest> manifests = new List<SdkResolverManifest>();
421+
for (int i = 1; i != 20; i++)
422+
{
423+
var man = new SdkResolverManifest(DisplayName: "TestResolversManifest", Path: null, ResolvableSdkRegex: new Regex("abc"));
424+
manifests.Add(man);
425+
man = new SdkResolverManifest(DisplayName: "TestResolversManifest", Path: null, null);
426+
manifests.Add(man);
427+
}
428+
_fakeManifestRegistry = manifests.AsReadOnly();
418429
return;
419430
}
420431
}
@@ -423,21 +434,21 @@ internal void InitializeForTests(SdkResolverLoader resolverLoader = null, IReadO
423434
_sdkResolverLoader = CachingSdkResolverLoader.Instance;
424435
}
425436

426-
List<SdkResolverManifest> _specificResolversManifestsRegistryPlaceholder = null;
427-
List<SdkResolverManifest> _generalResolversManifestsRegistryPlaceholder = null;
437+
List<SdkResolverManifest> specificResolversManifestsRegistryPlaceholder = null;
438+
List<SdkResolverManifest> generalResolversManifestsRegistryPlaceholder = null;
428439
_manifestToResolvers = null;
429440

430441
if (resolvers != null)
431442
{
432-
_specificResolversManifestsRegistryPlaceholder = new List<SdkResolverManifest>();
433-
_generalResolversManifestsRegistryPlaceholder = new List<SdkResolverManifest>();
443+
specificResolversManifestsRegistryPlaceholder = new List<SdkResolverManifest>();
444+
generalResolversManifestsRegistryPlaceholder = new List<SdkResolverManifest>();
434445
_manifestToResolvers = new Dictionary<SdkResolverManifest, IReadOnlyList<SdkResolver>>();
435446

436447
SdkResolverManifest sdkResolverManifest = new SdkResolverManifest(DisplayName: "TestResolversManifest", Path: null, ResolvableSdkRegex: null);
437-
_generalResolversManifestsRegistryPlaceholder.Add(sdkResolverManifest);
448+
generalResolversManifestsRegistryPlaceholder.Add(sdkResolverManifest);
438449
_manifestToResolvers[sdkResolverManifest] = resolvers;
439-
_generalResolversManifestsRegistry = _generalResolversManifestsRegistryPlaceholder.AsReadOnly();
440-
_specificResolversManifestsRegistry = _specificResolversManifestsRegistryPlaceholder.AsReadOnly();
450+
_generalResolversManifestsRegistry = generalResolversManifestsRegistryPlaceholder.AsReadOnly();
451+
_specificResolversManifestsRegistry = specificResolversManifestsRegistryPlaceholder.AsReadOnly();
441452
}
442453
}
443454

@@ -515,8 +526,8 @@ private void RegisterResolversManifests(ElementLocation location)
515526
}
516527
}
517528

518-
var _specificResolversManifestsRegistryPlaceholder = new List<SdkResolverManifest>();
519-
var _generalResolversManifestsRegistryPlaceholder = new List<SdkResolverManifest>();
529+
var specificResolversManifestsRegistryPlaceholder = new List<SdkResolverManifest>();
530+
var generalResolversManifestsRegistryPlaceholder = new List<SdkResolverManifest>();
520531

521532
// Break the list of all resolvers manifests into two parts: manifests with specific and general resolvers.
522533
// Since the collections are meant to be immutable, we have to only ever assign them when they're complete.
@@ -531,25 +542,25 @@ private void RegisterResolversManifests(ElementLocation location)
531542
#endif
532543
if (manifest.ResolvableSdkRegex == null)
533544
{
534-
_generalResolversManifestsRegistryPlaceholder.Add(manifest);
545+
generalResolversManifestsRegistryPlaceholder.Add(manifest);
535546
}
536547
else
537548
{
538-
_specificResolversManifestsRegistryPlaceholder.Add(manifest);
549+
specificResolversManifestsRegistryPlaceholder.Add(manifest);
539550
}
540551
}
541552
if (sdkDefaultResolversManifest != null)
542553
{
543-
_generalResolversManifestsRegistryPlaceholder.Add(sdkDefaultResolversManifest);
554+
generalResolversManifestsRegistryPlaceholder.Add(sdkDefaultResolversManifest);
544555
}
545556

546557
// Until this is set(and this is under lock), the ResolveSdkUsingResolversWithPatternsFirst will always
547558
// enter if branch leaving to this section.
548559
// Then it will wait at the lock and return after we release it since the collections we have filled them before releasing the lock.
549560
// The collections are never modified after this point.
550561
// So I've made them ReadOnly
551-
_generalResolversManifestsRegistry = _generalResolversManifestsRegistryPlaceholder.AsReadOnly();
552-
_specificResolversManifestsRegistry = _specificResolversManifestsRegistryPlaceholder.AsReadOnly();
562+
_specificResolversManifestsRegistry = specificResolversManifestsRegistryPlaceholder.AsReadOnly();
563+
_generalResolversManifestsRegistry = generalResolversManifestsRegistryPlaceholder.AsReadOnly();
553564
}
554565
}
555566

0 commit comments

Comments
 (0)