public IProxyExecutionManager GetExecutionManager()

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;
    }