Skip to content

Commit 14850f3

Browse files
SimaTiangithub-actions
authored andcommitted
refactoring to get rid of #if directives
1 parent 802facb commit 14850f3

File tree

2 files changed

+55
-53
lines changed

2 files changed

+55
-53
lines changed

src/Build.UnitTests/BackEnd/SdkResolverService_Tests.cs

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.Configuration;
67
using System.Diagnostics.Tracing;
78
using System.Linq;
89
using System.Text.RegularExpressions;
@@ -163,8 +164,8 @@ internal string TryResolveSdk(SdkResolverService service)
163164
// Scenario: we want to test that we solved the contention described here: https://github.com/dotnet/msbuild/issues/7927#issuecomment-1232470838
164165
public async Task AssertResolverPopulationContentionNotPresent()
165166
{
166-
var service = new SdkResolverService();
167-
service.InitializeForTests(new MockLoaderStrategy(includeResolversWithPatterns: true), contentionConditionTest: true);
167+
var service = new SdkResolverServiceTextExtension();
168+
service.InitializeForTests(new MockLoaderStrategy(includeResolversWithPatterns: true));
168169

169170
SdkReference sdk = new SdkReference("2sdkName", "referencedVersion", "minimumVersion");
170171

@@ -697,6 +698,44 @@ public void IsRunningInVisualStudioIsSetForResolverContext()
697698
isRunningInVisualStudio.ShouldBeTrue();
698699
}
699700

701+
internal sealed class SdkResolverServiceTextExtension : SdkResolverService
702+
{
703+
704+
internal bool _fake_initialization = false;
705+
internal IReadOnlyList<SdkResolverManifest> _fakeManifestRegistry;
706+
707+
internal override void WaitIfTestRequires()
708+
{
709+
if (_fake_initialization)
710+
{
711+
Thread.Sleep(10);
712+
}
713+
}
714+
internal override IReadOnlyList<SdkResolverManifest> GetResolverManifests(ElementLocation location)
715+
{
716+
return _fakeManifestRegistry;
717+
}
718+
719+
internal override void InitializeForTests(SdkResolverLoader resolverLoader = null, IReadOnlyList<SdkResolver> resolvers = null)
720+
{
721+
if (resolverLoader != null)
722+
{
723+
_sdkResolverLoader = resolverLoader;
724+
_fake_initialization = true;
725+
List<SdkResolverManifest> manifests = new List<SdkResolverManifest>();
726+
for (int i = 1; i != 20; i++)
727+
{
728+
var man = new SdkResolverManifest(DisplayName: "TestResolversManifest", Path: null, ResolvableSdkRegex: new Regex("abc"));
729+
manifests.Add(man);
730+
man = new SdkResolverManifest(DisplayName: "TestResolversManifest", Path: null, null);
731+
manifests.Add(man);
732+
}
733+
_fakeManifestRegistry = manifests.AsReadOnly();
734+
return;
735+
}
736+
}
737+
}
738+
700739
private sealed class MockLoaderStrategy : SdkResolverLoader
701740
{
702741
private List<SdkResolver> _resolvers;

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

Lines changed: 14 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.Text.RegularExpressions;
1111
#if DEBUG
1212
using System.Threading;
13+
1314
#endif
1415
using Microsoft.Build.BackEnd.Logging;
1516
using Microsoft.Build.Construction;
@@ -51,17 +52,12 @@ internal class SdkResolverService : ISdkResolverService
5152
/// <summary>
5253
/// Stores the list of manifests of specific SDK resolvers which could be loaded.
5354
/// </summary>
54-
private IReadOnlyList<SdkResolverManifest> _specificResolversManifestsRegistry;
55+
protected IReadOnlyList<SdkResolverManifest> _specificResolversManifestsRegistry;
5556

5657
/// <summary>
5758
/// Stores the list of manifests of general SDK resolvers which could be loaded.
5859
/// </summary>
59-
private IReadOnlyList<SdkResolverManifest> _generalResolversManifestsRegistry;
60-
61-
#if DEBUG
62-
internal bool _fake_initialization = false;
63-
internal IReadOnlyList<SdkResolverManifest> _fakeManifestRegistry;
64-
#endif
60+
protected IReadOnlyList<SdkResolverManifest> _generalResolversManifestsRegistry;
6561

6662
/// <summary>
6763
/// Stores an <see cref="SdkResolverLoader"/> which can load registered SDK resolvers.
@@ -70,7 +66,7 @@ internal class SdkResolverService : ISdkResolverService
7066
/// Unless the 17.10 changewave is disabled, we use a singleton instance because the set of SDK resolvers
7167
/// is not expected to change during the lifetime of the process.
7268
/// </remarks>
73-
private SdkResolverLoader _sdkResolverLoader = ChangeWaves.AreFeaturesEnabled(ChangeWaves.Wave17_10)
69+
protected SdkResolverLoader _sdkResolverLoader = ChangeWaves.AreFeaturesEnabled(ChangeWaves.Wave17_10)
7470
? CachingSdkResolverLoader.Instance
7571
: new SdkResolverLoader();
7672

@@ -186,13 +182,7 @@ private SdkResult ResolveSdkUsingResolversWithPatternsFirst(int submissionId, Sd
186182
List<SdkResolverManifest> matchingResolversManifests = new();
187183
foreach (SdkResolverManifest manifest in _specificResolversManifestsRegistry)
188184
{
189-
#if DEBUG
190-
// If we're checking about the race condition, we should better make sure we would hit it.
191-
if (_fake_initialization)
192-
{
193-
Thread.Sleep(10);
194-
}
195-
#endif
185+
WaitIfTestRequires();
196186
try
197187
{
198188
if (manifest.ResolvableSdkRegex.IsMatch(sdk.Name))
@@ -402,33 +392,20 @@ private bool TryResolveSdkUsingSpecifiedResolvers(
402392
return false;
403393
}
404394

395+
internal virtual void WaitIfTestRequires() { }
396+
397+
internal virtual IReadOnlyList<SdkResolverManifest> GetResolverManifests(ElementLocation location) => _sdkResolverLoader.GetResolversManifests(location);
398+
405399
/// <summary>
406400
/// Used for unit tests only. This is currently only called through reflection in Microsoft.Build.Engine.UnitTests.TransientSdkResolution.CallResetForTests
407401
/// </summary>
408402
/// <param name="resolverLoader">An <see cref="SdkResolverLoader"/> to use for loading SDK resolvers.</param>
409403
/// <param name="resolvers">Explicit set of SdkResolvers to use for all SDK resolution.</param>
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)
404+
internal virtual void InitializeForTests(SdkResolverLoader resolverLoader = null, IReadOnlyList<SdkResolver> resolvers = null)
412405
{
413406
if (resolverLoader != null)
414407
{
415408
_sdkResolverLoader = resolverLoader;
416-
#if DEBUG
417-
if (contentionConditionTest)
418-
{
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();
429-
return;
430-
}
431-
#endif
432409
}
433410
else
434411
{
@@ -499,19 +476,9 @@ private void RegisterResolversManifests(ElementLocation location)
499476
{
500477
return;
501478
}
502-
IReadOnlyList<SdkResolverManifest> allResolversManifests;
503-
#if DEBUG
504-
if (_fake_initialization)
505-
{
506-
allResolversManifests = _fakeManifestRegistry;
507-
}
508-
else
509-
#endif
510-
{
511-
allResolversManifests = _sdkResolverLoader.GetResolversManifests(location);
512-
}
513479

514-
_manifestToResolvers = new Dictionary<SdkResolverManifest, IReadOnlyList<SdkResolver>>();
480+
IReadOnlyList<SdkResolverManifest> allResolversManifests = GetResolverManifests(location);
481+
_manifestToResolvers = new Dictionary<SdkResolverManifest, IReadOnlyList<SdkResolver>>();
515482

516483
SdkResolverManifest sdkDefaultResolversManifest = null;
517484
#if NETCOREAPP
@@ -535,12 +502,8 @@ private void RegisterResolversManifests(ElementLocation location)
535502
// Otherwise race can happen, see https://github.com/dotnet/msbuild/issues/7927
536503
foreach (SdkResolverManifest manifest in allResolversManifests)
537504
{
538-
#if DEBUG
539-
if (_fake_initialization)
540-
{
541-
Thread.Sleep(10);
542-
}
543-
#endif
505+
WaitIfTestRequires();
506+
544507
if (manifest.ResolvableSdkRegex == null)
545508
{
546509
generalResolversManifestsRegistryPlaceholder.Add(manifest);

0 commit comments

Comments
 (0)