Ejemplo n.º 1
0
        /// <inheritdoc/>
        public IProxyTestSessionManager GetTestSessionManager(
            IRequestData requestData,
            ITestRuntimeProvider testHostManager,
            StartTestSessionCriteria testSessionCriteria)
        {
            var parallelLevel = this.VerifyParallelSettingAndCalculateParallelLevel(
                testSessionCriteria.Sources.Count,
                testSessionCriteria.RunSettings);

            requestData.MetricsCollection.Add(
                TelemetryDataConstants.ParallelEnabledDuringStartTestSession,
                parallelLevel > 1 ? "True" : "False");

            var isDataCollectorEnabled       = XmlRunSettingsUtilities.IsDataCollectionEnabled(testSessionCriteria.RunSettings);
            var isInProcDataCollectorEnabled = XmlRunSettingsUtilities.IsInProcDataCollectionEnabled(testSessionCriteria.RunSettings);

            if (this.ShouldRunInNoIsolation(
                    testSessionCriteria.RunSettings,
                    parallelLevel > 1,
                    isDataCollectorEnabled || isInProcDataCollectorEnabled))
            {
                // This condition is the equivalent of the in-process proxy execution manager case.
                // In this case all tests will be run in the vstest.console process, so there's no
                // test host to be started. As a consequence there'll be no session info.
                return(null);
            }

            Func <ProxyOperationManager> proxyCreator = () =>
            {
                var hostManager = this.testHostProviderManager.GetTestHostManagerByRunConfiguration(testSessionCriteria.RunSettings);
                hostManager?.Initialize(TestSessionMessageLogger.Instance, testSessionCriteria.RunSettings);

                if (testSessionCriteria.TestHostLauncher != null)
                {
                    hostManager.SetCustomLauncher(testSessionCriteria.TestHostLauncher);
                }

                var requestSender = new TestRequestSender(requestData.ProtocolConfig, hostManager);

                return(isDataCollectorEnabled
                    ? new ProxyOperationManagerWithDataCollection(
                           requestData,
                           requestSender,
                           hostManager,
                           new ProxyDataCollectionManager(
                               requestData,
                               testSessionCriteria.RunSettings,
                               testSessionCriteria.Sources))
                    : new ProxyOperationManager(
                           requestData,
                           requestSender,
                           hostManager));
            };

            return(new ProxyTestSessionManager(parallelLevel, proxyCreator));
        }
Ejemplo n.º 2
0
        /// <inheritdoc/>
        public void StartTestSession(
            IRequestData requestData,
            StartTestSessionCriteria testSessionCriteria,
            ITestSessionEventsHandler eventsHandler)
        {
            if (testSessionCriteria == null)
            {
                throw new ArgumentNullException(nameof(testSessionCriteria));
            }

            this.AddExtensionAssemblies(testSessionCriteria.RunSettings);

            var runConfiguration = XmlRunSettingsUtilities.GetRunConfigurationNode(testSessionCriteria.RunSettings);

            // Update extension assemblies from source when design mode is false.
            //
            // TODO (copoiena): Is it possible for this code to run if we're not in design mode ?
            // An use case for this would be when running tests with "dotnet test". Usually there's
            // a build involved then.
            if (!runConfiguration.DesignMode)
            {
                return;
            }

            // Initialize loggers.
            var loggerManager = this.TestEngine.GetLoggerManager(requestData);

            loggerManager.Initialize(testSessionCriteria.RunSettings);

            var testHostManager = this.testHostProviderManager.GetTestHostManagerByRunConfiguration(testSessionCriteria.RunSettings);

            ThrowExceptionIfTestHostManagerIsNull(testHostManager, testSessionCriteria.RunSettings);

            testHostManager.Initialize(TestSessionMessageLogger.Instance, testSessionCriteria.RunSettings);

            if (testSessionCriteria.TestHostLauncher != null)
            {
                testHostManager.SetCustomLauncher(testSessionCriteria.TestHostLauncher);
            }

            var testSessionManager = this.TestEngine.GetTestSessionManager(requestData, testHostManager, testSessionCriteria);

            if (testSessionManager == null)
            {
                // The test session manager is null because the combination of runsettings and
                // sources tells us we should run in-process (i.e. in vstest.console). Because
                // of this no session will be created because there's no testhost to be launched.
                // Expecting a subsequent call to execute tests with the same set of parameters.
                eventsHandler.HandleStartTestSessionComplete(null);
                return;
            }

            testSessionManager.Initialize(false);
            testSessionManager.StartSession(testSessionCriteria, eventsHandler);
        }
Ejemplo n.º 3
0
        /// <inheritdoc/>
        public void StartSession(
            StartTestSessionCriteria criteria,
            ITestSessionEventsHandler eventsHandler)
        {
            var testSessionInfo = new TestSessionInfo();

            Task[] taskList = new Task[this.parallelLevel];

            // Create all the proxies in parallel, one task per proxy.
            for (int i = 0; i < this.parallelLevel; ++i)
            {
                taskList[i] = Task.Factory.StartNew(() =>
                {
                    // Create the proxy.
                    var operationManagerProxy = this.CreateProxy();

                    // Initialize the proxy.
                    operationManagerProxy.Initialize(this.skipDefaultAdapters);

                    // Start the test host associated to the proxy.
                    operationManagerProxy.SetupChannel(
                        criteria.Sources,
                        criteria.RunSettings,
                        eventsHandler);
                });
            }

            // Wait for proxy creation to be over.
            Task.WaitAll(taskList);

            // Make the session available.
            TestSessionPool.Instance.AddSession(testSessionInfo, this);

            // Let the caller know the session has been created.
            eventsHandler.HandleStartTestSessionComplete(testSessionInfo);
        }
Ejemplo n.º 4
0
        /// <inheritdoc/>
        public void StartTestSession(
            StartTestSessionPayload payload,
            ITestHostLauncher testHostLauncher,
            ITestSessionEventsHandler eventsHandler,
            ProtocolConfig protocolConfig)
        {
            EqtTrace.Info("TestRequestManager.StartTestSession: Starting test session.");

            if (payload.TestPlatformOptions != null)
            {
                this.telemetryOptedIn = payload.TestPlatformOptions.CollectMetrics;
            }

            var requestData = this.GetRequestData(protocolConfig);

            if (this.UpdateRunSettingsIfRequired(
                    payload.RunSettings,
                    payload.Sources,
                    null,
                    out string updatedRunsettings))
            {
                payload.RunSettings = updatedRunsettings;
            }

            if (InferRunSettingsHelper.AreRunSettingsCollectorsIncompatibleWithTestSettings(payload.RunSettings))
            {
                throw new SettingsException(
                          string.Format(
                              Resources.RunsettingsWithDCErrorMessage,
                              payload.RunSettings));
            }

            // TODO (copoiena): Collect metrics ?

            lock (this.syncObject)
            {
                try
                {
                    EqtTrace.Info("TestRequestManager.StartTestRunner: Synchronization context taken.");
                    this.TestPlatformEventSourceInstance.StartTestSessionStart();

                    var criteria = new StartTestSessionCriteria()
                    {
                        Sources          = payload.Sources,
                        RunSettings      = payload.RunSettings,
                        TestHostLauncher = testHostLauncher
                    };

                    this.testPlatform.StartTestSession(requestData, criteria, eventsHandler);
                }
                finally
                {
                    EqtTrace.Info("TestRequestManager.StartTestSession: Starting test session completed.");
                    this.TestPlatformEventSourceInstance.StartTestSessionStop();

                    // Post the attachments processing complete event.
                    this.metricsPublisher.Result.PublishMetrics(
                        TelemetryDataConstants.StartTestSessionCompleteEvent,
                        requestData.MetricsCollection.Metrics);
                }
            }
        }