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