Skip to content

Commit a4dc055

Browse files
authored
Pass workloads to proxy managers (#4422)
1 parent b19ec25 commit a4dc055

File tree

7 files changed

+34
-33
lines changed

7 files changed

+34
-33
lines changed

src/Microsoft.TestPlatform.CrossPlatEngine/Client/Parallel/ParallelOperationManager.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ internal sealed class ParallelOperationManager<TManager, TEventHandler, TWorkloa
2424
out int num)
2525
? num
2626
: PreStart;
27-
private readonly Func<TestRuntimeProviderInfo, TManager> _createNewManager;
27+
private readonly Func<TestRuntimeProviderInfo, TWorkload, TManager> _createNewManager;
2828

2929
/// <summary>
3030
/// Default number of Processes
@@ -50,7 +50,7 @@ internal sealed class ParallelOperationManager<TManager, TEventHandler, TWorkloa
5050
/// <param name="createNewManager">Creates a new manager that is responsible for running a single part of the overall workload.
5151
/// A manager is typically a testhost, and the part of workload is discovering or running a single test dll.</param>
5252
/// <param name="parallelLevel">Determines the maximum amount of parallel managers that can be active at the same time.</param>
53-
public ParallelOperationManager(Func<TestRuntimeProviderInfo, TManager> createNewManager, int parallelLevel)
53+
public ParallelOperationManager(Func<TestRuntimeProviderInfo, TWorkload, TManager> createNewManager, int parallelLevel)
5454
{
5555
_createNewManager = createNewManager;
5656
MaxParallelLevel = parallelLevel;
@@ -144,7 +144,7 @@ private bool RunWorkInParallel()
144144
var workload = workloadsToAdd[i];
145145
slot.ShouldPreStart = occupiedSlots + i + 1 > MaxParallelLevel;
146146

147-
var manager = _createNewManager(workload.Provider);
147+
var manager = _createNewManager(workload.Provider, workload.Work);
148148
var eventHandler = _getEventHandler(_eventHandler, manager);
149149
slot.EventHandler = eventHandler;
150150
slot.Manager = manager;

src/Microsoft.TestPlatform.CrossPlatEngine/Client/Parallel/ParallelProxyDiscoveryManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ internal sealed class ParallelProxyDiscoveryManager : IParallelProxyDiscoveryMan
4343

4444
public ParallelProxyDiscoveryManager(
4545
IRequestData requestData,
46-
Func<TestRuntimeProviderInfo, IProxyDiscoveryManager> actualProxyManagerCreator,
46+
Func<TestRuntimeProviderInfo, DiscoveryCriteria, IProxyDiscoveryManager> actualProxyManagerCreator,
4747
DiscoveryDataAggregator dataAggregator,
4848
int parallelLevel,
4949
List<TestRuntimeProviderInfo> testHostProviders)
@@ -53,7 +53,7 @@ public ParallelProxyDiscoveryManager(
5353

5454
internal ParallelProxyDiscoveryManager(
5555
IRequestData requestData,
56-
Func<TestRuntimeProviderInfo, IProxyDiscoveryManager> actualProxyManagerCreator,
56+
Func<TestRuntimeProviderInfo, DiscoveryCriteria, IProxyDiscoveryManager> actualProxyManagerCreator,
5757
DiscoveryDataAggregator dataAggregator,
5858
IDataSerializer dataSerializer,
5959
int parallelLevel,

src/Microsoft.TestPlatform.CrossPlatEngine/Client/Parallel/ParallelProxyExecutionManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ internal sealed class ParallelProxyExecutionManager : IParallelProxyExecutionMan
6464

6565
public ParallelProxyExecutionManager(
6666
IRequestData requestData,
67-
Func<TestRuntimeProviderInfo, IProxyExecutionManager> actualProxyManagerCreator,
67+
Func<TestRuntimeProviderInfo, TestRunCriteria, IProxyExecutionManager> actualProxyManagerCreator,
6868
int parallelLevel,
6969
List<TestRuntimeProviderInfo> testHostProviders)
7070
: this(requestData, actualProxyManagerCreator, JsonDataSerializer.Instance, parallelLevel, testHostProviders)
@@ -73,7 +73,7 @@ public ParallelProxyExecutionManager(
7373

7474
internal ParallelProxyExecutionManager(
7575
IRequestData requestData,
76-
Func<TestRuntimeProviderInfo, IProxyExecutionManager> actualProxyManagerCreator,
76+
Func<TestRuntimeProviderInfo, TestRunCriteria, IProxyExecutionManager> actualProxyManagerCreator,
7777
IDataSerializer dataSerializer,
7878
int parallelLevel,
7979
List<TestRuntimeProviderInfo> testHostProviders)

src/Microsoft.TestPlatform.CrossPlatEngine/TestEngine.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@ public IProxyDiscoveryManager GetDiscoveryManager(
118118
// discovery manager to publish its current state. But doing so we are losing the collected state of all the
119119
// other managers.
120120
var discoveryDataAggregator = new DiscoveryDataAggregator();
121-
Func<TestRuntimeProviderInfo, IProxyDiscoveryManager> proxyDiscoveryManagerCreator = runtimeProviderInfo =>
121+
Func<TestRuntimeProviderInfo, DiscoveryCriteria, IProxyDiscoveryManager> proxyDiscoveryManagerCreator = (runtimeProviderInfo, discoveryCriteria) =>
122122
{
123-
var sources = runtimeProviderInfo.SourceDetails.Select(r => r.Source!).ToList();
123+
var sources = discoveryCriteria.Sources.ToList();
124124
var hostManager = _testHostProviderManager.GetTestHostManagerByRunConfiguration(runtimeProviderInfo.RunSettings, sources);
125125
hostManager?.Initialize(TestSessionMessageLogger.Instance, runtimeProviderInfo.RunSettings!);
126126

@@ -241,15 +241,16 @@ public IProxyExecutionManager GetExecutionManager(
241241
}
242242

243243
// This creates a single non-parallel execution manager, based requestData, isDataCollectorEnabled and the
244-
// overall testRunCriteria. The overall testRunCriteria are split to smaller pieces (e.g. each source from the overall
245-
// testRunCriteria) so we can run them in parallel, and those are then passed to those non-parallel execution managers.
244+
// split testRunCriteria. The overall testRunCriteria are split to smaller pieces (e.g. each source from the overall
245+
// testRunCriteria) so we can run them in parallel.
246246
//
247247
// The function below grabs most of the parameter via closure from the local context,
248-
// but gets the runtime provider later, because that is specific info to the source (or sources) it will be running.
248+
// but gets the runtime provider later, as well as the discovery request, because that is specific info to the source (or sources)
249+
// it will be running.
249250
// This creator does not get those smaller pieces of testRunCriteria, those come later when we call a method on
250251
// the non-parallel execution manager we create here. E.g. StartTests(<single piece of testRunCriteria>).
251-
Func<TestRuntimeProviderInfo, IProxyExecutionManager> proxyExecutionManagerCreator = runtimeProviderInfo =>
252-
CreateNonParallelExecutionManager(requestData, testRunCriteria, isDataCollectorEnabled, runtimeProviderInfo);
252+
Func<TestRuntimeProviderInfo, TestRunCriteria, IProxyExecutionManager> proxyExecutionManagerCreator = (runtimeProviderInfo, runCriteria) =>
253+
CreateNonParallelExecutionManager(requestData, runCriteria, isDataCollectorEnabled, runtimeProviderInfo);
253254

254255
var executionManager = new ParallelProxyExecutionManager(requestData, proxyExecutionManagerCreator, parallelLevel, testHostProviders);
255256

test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Client/Parallel/ParallelOperationManagerTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class ParallelOperationManagerTests
2020
public void OperationManagerShouldRunOnlyMaximumParallelLevelOfWorkInParallelEvenWhenThereAreMoreWorkloads()
2121
{
2222
// Arrange
23-
Func<TestRuntimeProviderInfo, SampleManager> createNewManager = _ => new SampleManager();
23+
Func<TestRuntimeProviderInfo, SampleWorkload, SampleManager> createNewManager = (_, _2) => new SampleManager();
2424
var maxParallelLevel = 3;
2525
var parallelOperationManager = new ParallelOperationManager<SampleManager, SampleHandler, SampleWorkload>(createNewManager, maxParallelLevel);
2626

@@ -72,7 +72,7 @@ public void OperationManagerShouldRunOnlyMaximumParallelLevelOfWorkInParallelEve
7272
public void OperationManagerShouldCreateOnlyAsManyParallelWorkersAsThereAreWorkloadsWhenTheAmountOfWorkloadsIsSmallerThanMaxParallelLevel()
7373
{
7474
// Arrange
75-
Func<TestRuntimeProviderInfo, SampleManager> createNewManager = _ => new SampleManager();
75+
Func<TestRuntimeProviderInfo, SampleWorkload, SampleManager> createNewManager = (_, _2) => new SampleManager();
7676
var maxParallelLevel = 10;
7777
var parallelOperationManager = new ParallelOperationManager<SampleManager, SampleHandler, SampleWorkload>(createNewManager, maxParallelLevel);
7878

@@ -108,7 +108,7 @@ public void OperationManagerShouldCreateOnlyAsManyParallelWorkersAsThereAreWorkl
108108
public void OperationManagerShouldCreateAsManyMaxParallelLevel()
109109
{
110110
// Arrange
111-
Func<TestRuntimeProviderInfo, SampleManager> createNewManager = _ => new SampleManager();
111+
Func<TestRuntimeProviderInfo, SampleWorkload, SampleManager> createNewManager = (_, _2) => new SampleManager();
112112
var maxParallelLevel = 10;
113113
var parallelOperationManager = new ParallelOperationManager<SampleManager, SampleHandler, SampleWorkload>(createNewManager, maxParallelLevel);
114114

@@ -148,7 +148,7 @@ public void OperationManagerShouldCreateAsManyMaxParallelLevel()
148148
public void OperationManagerMovesToTheNextWorkloadOnlyWhenRunNextWorkIsCalled()
149149
{
150150
// Arrange
151-
Func<TestRuntimeProviderInfo, SampleManager> createNewManager = _ => new SampleManager();
151+
Func<TestRuntimeProviderInfo, SampleWorkload, SampleManager> createNewManager = (_, _2) => new SampleManager();
152152
var maxParallelLevel = 2;
153153
var parallelOperationManager = new ParallelOperationManager<SampleManager, SampleHandler, SampleWorkload>(createNewManager, maxParallelLevel);
154154

@@ -195,7 +195,7 @@ public void OperationManagerRunsAnOperationOnAllActiveManagersWhenDoActionOnAllM
195195
// Arrange
196196
var createdManagers = new List<SampleManager>();
197197
// Store the managers we created so we can inspect them later and see if Abort was called on them.
198-
Func<TestRuntimeProviderInfo, SampleManager> createNewManager = _ =>
198+
Func<TestRuntimeProviderInfo, SampleWorkload, SampleManager> createNewManager = (_, _2) =>
199199
{
200200
var manager = new SampleManager();
201201
createdManagers.Add(manager);

test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Client/Parallel/ParallelProxyDiscoveryManagerTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class ParallelProxyDiscoveryManagerTests
2828
private const int Timeout3Seconds = 3 * 1000;
2929
private readonly Queue<Mock<IProxyDiscoveryManager>> _preCreatedMockManagers;
3030
private readonly List<Mock<IProxyDiscoveryManager>> _usedMockManagers;
31-
private readonly Func<TestRuntimeProviderInfo, IProxyDiscoveryManager> _createMockManager;
31+
private readonly Func<TestRuntimeProviderInfo, DiscoveryCriteria, IProxyDiscoveryManager> _createMockManager;
3232
private readonly Mock<ITestDiscoveryEventsHandler2> _mockEventHandler;
3333
private readonly List<string> _sources = new() { "1.dll", "2.dll" };
3434
private readonly DiscoveryCriteria _discoveryCriteriaWith2Sources;
@@ -55,7 +55,7 @@ public ParallelProxyDiscoveryManagerTests()
5555
new Mock<IProxyDiscoveryManager>(),
5656
});
5757
_usedMockManagers = new List<Mock<IProxyDiscoveryManager>>();
58-
_createMockManager = _ =>
58+
_createMockManager = (_, _2) =>
5959
{
6060
// We create the manager at the last possible
6161
// moment now, not when we create the parallel proxy manager class
@@ -163,7 +163,7 @@ public void HandlePartialDiscoveryCompleteShouldReturnTrueIfDiscoveryWasAbortedA
163163
{
164164
var discoveryManagerMock = new Mock<IProxyDiscoveryManager>();
165165
_preCreatedMockManagers.Enqueue(discoveryManagerMock);
166-
var parallelDiscoveryManager = SetupDiscoveryManager(_ => discoveryManagerMock.Object, 1, true);
166+
var parallelDiscoveryManager = SetupDiscoveryManager((_, _2) => discoveryManagerMock.Object, 1, true);
167167
var proxyDiscovermanager = new ProxyDiscoveryManager(_mockRequestData.Object, new Mock<ITestRequestSender>().Object, new Mock<ITestRuntimeProvider>().Object);
168168

169169
parallelDiscoveryManager.DiscoverTests(_discoveryCriteriaWith2Sources, _mockEventHandler.Object);
@@ -190,7 +190,7 @@ public void HandlePartialDiscoveryCompleteShouldReturnTrueIfDiscoveryWasAbortedA
190190
{
191191
var discoveryManagerMock = new Mock<IProxyDiscoveryManager>();
192192
_preCreatedMockManagers.Enqueue(discoveryManagerMock);
193-
var parallelDiscoveryManager = SetupDiscoveryManager(_ => discoveryManagerMock.Object, 1, true);
193+
var parallelDiscoveryManager = SetupDiscoveryManager((_, _2) => discoveryManagerMock.Object, 1, true);
194194
var proxyDiscovermanager = new ProxyDiscoveryManager(_mockRequestData.Object, new Mock<ITestRequestSender>().Object, new Mock<ITestRuntimeProvider>().Object);
195195

196196
parallelDiscoveryManager.DiscoverTests(_discoveryCriteriaWith2Sources, _mockEventHandler.Object);
@@ -206,7 +206,7 @@ public void DiscoveryTestsShouldStopDiscoveryIfAbortionWasRequested()
206206
// Since the hosts are aborted, total aggregated tests sent across will be -1
207207
var discoveryManagerMock = new Mock<IProxyDiscoveryManager>();
208208
_preCreatedMockManagers.Enqueue(discoveryManagerMock);
209-
var parallelDiscoveryManager = SetupDiscoveryManager(_ => discoveryManagerMock.Object, 1, true);
209+
var parallelDiscoveryManager = SetupDiscoveryManager((_, _2) => discoveryManagerMock.Object, 1, true);
210210

211211
Task.Run(() =>
212212
{
@@ -224,7 +224,7 @@ public void DiscoveryTestsShouldStopDiscoveryIfAbortionWithEventHandlerWasReques
224224
// Since the hosts are aborted, total aggregated tests sent across will be -1
225225
var discoveryManagerMock = new Mock<IProxyDiscoveryManager>();
226226
_preCreatedMockManagers.Enqueue(discoveryManagerMock);
227-
var parallelDiscoveryManager = SetupDiscoveryManager(_ => discoveryManagerMock.Object, 1, true);
227+
var parallelDiscoveryManager = SetupDiscoveryManager((_, _2) => discoveryManagerMock.Object, 1, true);
228228

229229
Task.Run(() =>
230230
{
@@ -331,7 +331,7 @@ public void DiscoveryTestsWithCompletionMarksAllSourcesAsFullyDiscovered()
331331
Assert.AreEqual(0, _dataAggregator.GetSourcesWithStatus(DiscoveryStatus.NotDiscovered).Count);
332332
}
333333

334-
private ParallelProxyDiscoveryManager SetupDiscoveryManager(Func<TestRuntimeProviderInfo, IProxyDiscoveryManager> getProxyManager, int parallelLevel, bool abortDiscovery)
334+
private ParallelProxyDiscoveryManager SetupDiscoveryManager(Func<TestRuntimeProviderInfo, DiscoveryCriteria, IProxyDiscoveryManager> getProxyManager, int parallelLevel, bool abortDiscovery)
335335
{
336336
var parallelDiscoveryManager = new ParallelProxyDiscoveryManager(_mockRequestData.Object, getProxyManager, dataAggregator: new(), parallelLevel, _runtimeProviders);
337337
SetupDiscoveryTests(_processedSources, abortDiscovery);

test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Client/Parallel/ParallelProxyExecutionManagerTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public class ParallelProxyExecutionManagerTests
3131
private static readonly int Timeout3Seconds = 3 * 1000; // In milliseconds
3232

3333
private readonly List<Mock<IProxyExecutionManager>> _usedMockManagers;
34-
private readonly Func<TestRuntimeProviderInfo, IProxyExecutionManager> _createMockManager;
34+
private readonly Func<TestRuntimeProviderInfo, TestRunCriteria, IProxyExecutionManager> _createMockManager;
3535
private readonly Mock<IInternalTestRunEventsHandler> _mockEventHandler;
3636

3737
private readonly List<string> _sources;
@@ -59,7 +59,7 @@ public ParallelProxyExecutionManagerTests()
5959
new Mock<IProxyExecutionManager>(),
6060
});
6161
_usedMockManagers = new List<Mock<IProxyExecutionManager>>();
62-
_createMockManager = _ =>
62+
_createMockManager = (_, _2) =>
6363
{
6464
_createMockManagerCalled++;
6565
var manager = _preCreatedMockManagers.Dequeue();
@@ -245,7 +245,7 @@ public void StartTestRunWithTestsShouldNotSendCompleteUntilAllTestsAreProcessed(
245245
public void StartTestRunShouldNotProcessAllSourcesOnExecutionCancelsForAnySource()
246246
{
247247
var executionManagerMock = new Mock<IProxyExecutionManager>();
248-
var parallelExecutionManager = new ParallelProxyExecutionManager(_mockRequestData.Object, _ => executionManagerMock.Object, 1, _runtimeProviders);
248+
var parallelExecutionManager = new ParallelProxyExecutionManager(_mockRequestData.Object, (_, _2) => executionManagerMock.Object, 1, _runtimeProviders);
249249
_preCreatedMockManagers.Enqueue(executionManagerMock);
250250
SetupMockManagers(_processedSources, isCanceled: true, isAborted: false);
251251
SetupHandleTestRunComplete(_executionCompleted);
@@ -260,7 +260,7 @@ public void StartTestRunShouldNotProcessAllSourcesOnExecutionCancelsForAnySource
260260
public void StartTestRunShouldNotProcessAllSourcesOnExecutionAborted()
261261
{
262262
var executionManagerMock = new Mock<IProxyExecutionManager>();
263-
var parallelExecutionManager = new ParallelProxyExecutionManager(_mockRequestData.Object, _ => executionManagerMock.Object, 1, _runtimeProviders);
263+
var parallelExecutionManager = new ParallelProxyExecutionManager(_mockRequestData.Object, (_, _2) => executionManagerMock.Object, 1, _runtimeProviders);
264264
_preCreatedMockManagers.Enqueue(executionManagerMock);
265265
SetupMockManagers(_processedSources, isCanceled: false, isAborted: false);
266266
SetupHandleTestRunComplete(_executionCompleted);
@@ -276,7 +276,7 @@ public void StartTestRunShouldNotProcessAllSourcesOnExecutionAborted()
276276
public void StartTestRunShouldProcessAllSourcesOnExecutionAbortsForAnySource()
277277
{
278278
var executionManagerMock = new Mock<IProxyExecutionManager>();
279-
var parallelExecutionManager = new ParallelProxyExecutionManager(_mockRequestData.Object, _ => executionManagerMock.Object, 1, _runtimeProviders);
279+
var parallelExecutionManager = new ParallelProxyExecutionManager(_mockRequestData.Object, (_, _2) => executionManagerMock.Object, 1, _runtimeProviders);
280280
_preCreatedMockManagers.Enqueue(executionManagerMock);
281281
SetupMockManagers(_processedSources, isCanceled: false, isAborted: true);
282282
SetupHandleTestRunComplete(_executionCompleted);
@@ -432,12 +432,12 @@ public void StartTestRunShouldAggregateRunData()
432432
AssertMissingAndDuplicateSources(_processedSources);
433433
}
434434

435-
private ParallelProxyExecutionManager SetupExecutionManager(Func<TestRuntimeProviderInfo, IProxyExecutionManager> proxyManagerFunc, int parallelLevel)
435+
private ParallelProxyExecutionManager SetupExecutionManager(Func<TestRuntimeProviderInfo, TestRunCriteria, IProxyExecutionManager> proxyManagerFunc, int parallelLevel)
436436
{
437437
return SetupExecutionManager(proxyManagerFunc, parallelLevel, false);
438438
}
439439

440-
private ParallelProxyExecutionManager SetupExecutionManager(Func<TestRuntimeProviderInfo, IProxyExecutionManager> proxyManagerFunc, int parallelLevel, bool setupTestCases)
440+
private ParallelProxyExecutionManager SetupExecutionManager(Func<TestRuntimeProviderInfo, TestRunCriteria, IProxyExecutionManager> proxyManagerFunc, int parallelLevel, bool setupTestCases)
441441
{
442442
var parallelExecutionManager = new ParallelProxyExecutionManager(_mockRequestData.Object, proxyManagerFunc, parallelLevel, _runtimeProviders);
443443

0 commit comments

Comments
 (0)