/// <inheritdoc/> public int StartTestRun(TestRunCriteria testRunCriteria, ITestRunEventsHandler eventHandler) { try { var runConfiguration = XmlRunSettingsUtilities.GetRunConfigurationNode(testRunCriteria.TestRunSettings); var testPackages = new List <string>(testRunCriteria.HasSpecificSources ? testRunCriteria.Sources : // If the test execution is with a test filter, group them by sources testRunCriteria.Tests.GroupBy(tc => tc.Source).Select(g => g.Key)); // This code should be in sync with ProxyExecutionManager.StartTestRun executionContext var executionContext = new TestExecutionContext( testRunCriteria.FrequencyOfRunStatsChangeEvent, testRunCriteria.RunStatsChangeEventTimeout, inIsolation: runConfiguration.InIsolation, keepAlive: testRunCriteria.KeepAlive, isDataCollectionEnabled: false, areTestCaseLevelEventsRequired: false, hasTestRun: true, isDebug: (testRunCriteria.TestHostLauncher != null && testRunCriteria.TestHostLauncher.IsDebug), testCaseFilter: testRunCriteria.TestCaseFilter, filterOptions: testRunCriteria.FilterOptions); // Initialize extension before execution this.InitializeExtensions(testPackages); if (testRunCriteria.HasSpecificSources) { var runRequest = testRunCriteria.CreateTestRunCriteriaForSources(testHostManager, testRunCriteria.TestRunSettings, executionContext, testPackages); Task.Run(() => executionManager.StartTestRun(runRequest.AdapterSourceMap, runRequest.Package, runRequest.RunSettings, runRequest.TestExecutionContext, null, eventHandler)); } else { var runRequest = testRunCriteria.CreateTestRunCriteriaForTests(testHostManager, testRunCriteria.TestRunSettings, executionContext, testPackages); Task.Run(() => executionManager.StartTestRun(runRequest.Tests, runRequest.Package, runRequest.RunSettings, runRequest.TestExecutionContext, null, eventHandler)); } } catch (Exception exception) { EqtTrace.Error("InProcessProxyexecutionManager.StartTestRun: Failed to start test run: {0}", exception); // Send exception message. eventHandler.HandleLogMessage(TestMessageLevel.Error, exception.ToString()); // Send a run complete to caller. var completeArgs = new TestRunCompleteEventArgs(null, false, true, exception, new Collection <AttachmentSet>(), TimeSpan.Zero); eventHandler.HandleTestRunComplete(completeArgs, null, null, null); } return(0); }
/// <summary> /// Starts the test run /// </summary> /// <param name="testRunCriteria"> The settings/options for the test run. </param> /// <param name="eventHandler"> EventHandler for handling execution events from Engine. </param> /// <returns> The process id of the runner executing tests. </returns> public virtual int StartTestRun(TestRunCriteria testRunCriteria, ITestRunEventsHandler eventHandler) { try { var executionEngineStartTime = DateTime.UtcNow; if (EqtTrace.IsVerboseEnabled) { EqtTrace.Verbose("ProxyExecutionManager: Test host is always Lazy initialize."); } var testPackages = new List <string>(testRunCriteria.HasSpecificSources ? testRunCriteria.Sources : // If the test execution is with a test filter, group them by sources testRunCriteria.Tests.GroupBy(tc => tc.Source).Select(g => g.Key)); this.isCommunicationEstablished = this.SetupChannel(testPackages, this.cancellationTokenSource.Token); if (this.isCommunicationEstablished) { if (this.cancellationTokenSource.IsCancellationRequested) { if (EqtTrace.IsVerboseEnabled) { EqtTrace.Verbose("ProxyExecutionManager.StartTestRun: Canceling the current run after getting cancelation request."); } throw new TestPlatformException(Resources.Resources.CancelationRequested); } this.InitializeExtensions(testPackages); // Collecting Time Taken to Start Discovery Engine var executionEngineTotalTime = DateTime.UtcNow - executionEngineStartTime; // Collecting Data Point for Time taken to start Execution Engine. In case of Parallel, it will be maximum time taken. this.requestData.MetricsCollection.Add(TelemetryDataConstants.TimeTakenToStartExecutionEngineExe, executionEngineTotalTime.TotalSeconds.ToString()); // This code should be in sync with InProcessProxyExecutionManager.StartTestRun executionContext var executionContext = new TestExecutionContext( testRunCriteria.FrequencyOfRunStatsChangeEvent, testRunCriteria.RunStatsChangeEventTimeout, inIsolation: false, keepAlive: testRunCriteria.KeepAlive, isDataCollectionEnabled: false, areTestCaseLevelEventsRequired: false, hasTestRun: true, isDebug: (testRunCriteria.TestHostLauncher != null && testRunCriteria.TestHostLauncher.IsDebug), testCaseFilter: testRunCriteria.TestCaseFilter); // This is workaround for the bug https://github.com/Microsoft/vstest/issues/970 var runsettings = this.RemoveNodesFromRunsettingsIfRequired(testRunCriteria.TestRunSettings, (testMessageLevel, message) => { this.LogMessage(testMessageLevel, message, eventHandler); }); if (testRunCriteria.HasSpecificSources) { var runRequest = testRunCriteria.CreateTestRunCriteriaForSources(testHostManager, runsettings, executionContext, testPackages); this.RequestSender.StartTestRun(runRequest, eventHandler); } else { var runRequest = testRunCriteria.CreateTestRunCriteriaForTests(testHostManager, runsettings, executionContext, testPackages); this.RequestSender.StartTestRun(runRequest, eventHandler); } } } catch (Exception exception) { EqtTrace.Error("ProxyExecutionManager.StartTestRun: Failed to start test run: {0}", exception); this.LogMessage(TestMessageLevel.Error, exception.Message, eventHandler); // Send a run complete to caller. Similar logic is also used in ParallelProxyExecutionManager.StartTestRunOnConcurrentManager // Aborted is `true`: in case of parallel run (or non shared host), an aborted message ensures another execution manager // created to replace the current one. This will help if the current execution manager is aborted due to irreparable error // and the test host is lost as well. var completeArgs = new TestRunCompleteEventArgs(null, false, true, exception, new Collection <AttachmentSet>(), TimeSpan.Zero, null); eventHandler.HandleTestRunComplete(completeArgs, null, null, null); } return(0); }
/// <inheritdoc/> public virtual int StartTestRun(TestRunCriteria testRunCriteria, ITestRunEventsHandler eventHandler) { this.baseTestRunEventsHandler = eventHandler; try { if (EqtTrace.IsVerboseEnabled) { EqtTrace.Verbose("ProxyExecutionManager: Test host is always Lazy initialize."); } var testSources = new List <string>( testRunCriteria.HasSpecificSources ? testRunCriteria.Sources // If the test execution is with a test filter, group them by sources. : testRunCriteria.Tests.GroupBy(tc => tc.Source).Select(g => g.Key)); this.isCommunicationEstablished = this.ProxyOperationManager.SetupChannel( testSources, testRunCriteria.TestRunSettings); if (this.isCommunicationEstablished) { this.ProxyOperationManager.CancellationTokenSource.Token.ThrowTestPlatformExceptionIfCancellationRequested(); this.InitializeExtensions(testSources); // This code should be in sync with InProcessProxyExecutionManager.StartTestRun // execution context. var executionContext = new TestExecutionContext( testRunCriteria.FrequencyOfRunStatsChangeEvent, testRunCriteria.RunStatsChangeEventTimeout, inIsolation: false, keepAlive: testRunCriteria.KeepAlive, isDataCollectionEnabled: false, areTestCaseLevelEventsRequired: false, hasTestRun: true, // Debugging should happen if there's a custom test host launcher present // and is in debugging mode, or if the debugging is enabled in case the // test session info is present. isDebug: (testRunCriteria.TestHostLauncher != null && testRunCriteria.TestHostLauncher.IsDebug) || this.debugEnabledForTestSession, testCaseFilter: testRunCriteria.TestCaseFilter, filterOptions: testRunCriteria.FilterOptions); // This is workaround for the bug https://github.com/Microsoft/vstest/issues/970 var runsettings = this.ProxyOperationManager.RemoveNodesFromRunsettingsIfRequired( testRunCriteria.TestRunSettings, (testMessageLevel, message) => { this.LogMessage(testMessageLevel, message); }); if (testRunCriteria.HasSpecificSources) { var runRequest = testRunCriteria.CreateTestRunCriteriaForSources( testHostManager, runsettings, executionContext, testSources); this.ProxyOperationManager.RequestSender.StartTestRun(runRequest, this); } else { var runRequest = testRunCriteria.CreateTestRunCriteriaForTests( testHostManager, runsettings, executionContext, testSources); this.ProxyOperationManager.RequestSender.StartTestRun(runRequest, this); } } } catch (Exception exception) { EqtTrace.Error("ProxyExecutionManager.StartTestRun: Failed to start test run: {0}", exception); // Log error message to design mode and CLI. // TestPlatformException is expected exception, log only the message. // For other exceptions, log the stacktrace as well. var errorMessage = exception is TestPlatformException ? exception.Message : exception.ToString(); var testMessagePayload = new TestMessagePayload() { MessageLevel = TestMessageLevel.Error, Message = errorMessage }; this.HandleRawMessage(this.dataSerializer.SerializePayload(MessageType.TestMessage, testMessagePayload)); this.LogMessage(TestMessageLevel.Error, errorMessage); // Send a run complete to caller. Similar logic is also used in // ParallelProxyExecutionManager.StartTestRunOnConcurrentManager. // // Aborted is `true`: in case of parallel run (or non shared host), an aborted // message ensures another execution manager created to replace the current one. // This will help if the current execution manager is aborted due to irreparable // error and the test host is lost as well. var completeArgs = new TestRunCompleteEventArgs(null, false, true, null, new Collection <AttachmentSet>(), TimeSpan.Zero); var testRunCompletePayload = new TestRunCompletePayload { TestRunCompleteArgs = completeArgs }; this.HandleRawMessage(this.dataSerializer.SerializePayload(MessageType.ExecutionComplete, testRunCompletePayload)); this.HandleTestRunComplete(completeArgs, null, null, null); } return(0); }