in src/Microsoft.TestPlatform.CrossPlatEngine/TestEngine.cs [142:259]
public IProxyExecutionManager GetExecutionManager(
IRequestData requestData,
ITestRuntimeProvider testHostManager,
TestRunCriteria testRunCriteria)
{
var distinctSources = GetDistinctNumberOfSources(testRunCriteria);
var parallelLevel = VerifyParallelSettingAndCalculateParallelLevel(
distinctSources,
testRunCriteria.TestRunSettings);
// Collecting IsParallel enabled.
requestData.MetricsCollection.Add(
TelemetryDataConstants.ParallelEnabledDuringExecution,
parallelLevel > 1 ? "True" : "False");
var isDataCollectorEnabled = XmlRunSettingsUtilities.IsDataCollectionEnabled(testRunCriteria.TestRunSettings);
var isInProcDataCollectorEnabled = XmlRunSettingsUtilities.IsInProcDataCollectionEnabled(testRunCriteria.TestRunSettings);
if (ShouldRunInNoIsolation(
testRunCriteria.TestRunSettings,
parallelLevel > 1,
isDataCollectorEnabled || isInProcDataCollectorEnabled))
{
var isTelemetryOptedIn = requestData.IsTelemetryOptedIn;
var newRequestData = GetRequestData(isTelemetryOptedIn);
return new InProcessProxyExecutionManager(
testHostManager,
new TestHostManagerFactory(newRequestData));
}
// SetupChannel ProxyExecutionManager with data collection if data collectors are
// specified in run settings.
Func<IProxyExecutionManager> proxyExecutionManagerCreator = () =>
{
// Create a new host manager, to be associated with individual
// ProxyExecutionManager(&POM)
var hostManager = _testHostProviderManager.GetTestHostManagerByRunConfiguration(testRunCriteria.TestRunSettings);
hostManager?.Initialize(TestSessionMessageLogger.Instance, testRunCriteria.TestRunSettings);
if (testRunCriteria.TestHostLauncher != null)
{
hostManager.SetCustomLauncher(testRunCriteria.TestHostLauncher);
}
var requestSender = new TestRequestSender(requestData.ProtocolConfig, hostManager);
if (testRunCriteria.TestSessionInfo != null)
{
// This function is used to either take a pre-existing proxy operation manager from
// the test pool or to create a new proxy operation manager on the spot.
Func<string, ProxyExecutionManager, ProxyOperationManager>
proxyOperationManagerCreator = (
string source,
ProxyExecutionManager proxyExecutionManager) =>
{
var proxyOperationManager = TestSessionPool.Instance.TryTakeProxy(
testRunCriteria.TestSessionInfo,
source,
testRunCriteria.TestRunSettings);
if (proxyOperationManager == null)
{
// If the proxy creation process based on test session info failed, then
// we'll proceed with the normal creation process as if no test session
// info was passed in in the first place.
//
// WARNING: This should not normally happen and it raises questions
// regarding the test session pool operation and consistency.
EqtTrace.Warning("ProxyExecutionManager creation with test session failed.");
proxyOperationManager = new ProxyOperationManager(
requestData,
requestSender,
hostManager,
proxyExecutionManager);
}
return proxyOperationManager;
};
// In case we have an active test session, data collection needs were
// already taken care of when first creating the session. As a consequence
// we always return this proxy instead of choosing between the vanilla
// execution proxy and the one with data collection enabled.
return new ProxyExecutionManager(
testRunCriteria.TestSessionInfo,
proxyOperationManagerCreator,
testRunCriteria.DebugEnabledForTestSession);
}
return isDataCollectorEnabled
? new ProxyExecutionManagerWithDataCollection(
requestData,
requestSender,
hostManager,
new ProxyDataCollectionManager(
requestData,
testRunCriteria.TestRunSettings,
GetSourcesFromTestRunCriteria(testRunCriteria)))
: new ProxyExecutionManager(
requestData,
requestSender,
hostManager);
};
// parallelLevel = 1 for desktop should go via else route.
var executionManager = (parallelLevel > 1 || !testHostManager.Shared)
? new ParallelProxyExecutionManager(
requestData,
proxyExecutionManagerCreator,
parallelLevel,
sharedHosts: testHostManager.Shared)
: proxyExecutionManagerCreator();
EqtTrace.Verbose($"TestEngine.GetExecutionManager: Chosen execution manager '{executionManager.GetType().AssemblyQualifiedName}' ParallelLevel '{parallelLevel}' Shared host '{testHostManager.Shared}'");
return executionManager;
}