private void HandleAfterTestRunEnd(Message message) { var isCancelled = this.dataSerializer.DeserializePayload <bool>(message); if (isCancelled) { this.cancellationTokenSource.Cancel(); } try { this.testCaseEventMonitorTask?.Wait(this.cancellationTokenSource.Token); this.dataCollectionTestCaseEventHandler.Close(); } catch (Exception ex) { EqtTrace.Error("DataCollectionRequestHandler.HandleAfterTestRunEnd : Error while processing event from testhost: {0}", ex.ToString()); } var attachmentsets = this.dataCollectionManager.SessionEnded(isCancelled); var afterTestRunEndResult = new AfterTestRunEndResult(attachmentsets, this.requestData.MetricsCollection.Metrics); // Dispose all datacollectors before sending attachments to vstest.console process. // As datacollector process exits itself on parent process(vstest.console) exits. this.dataCollectionManager?.Dispose(); this.communicationManager.SendMessage(MessageType.AfterTestRunEndResult, afterTestRunEndResult); EqtTrace.Info("DataCollectionRequestHandler.ProcessRequests : Session End message received from server. Closing the connection."); this.Close(); EqtTrace.Info("DataCollectionRequestHandler.ProcessRequests : DataCollection completed"); }
/// <summary> /// Invoked after ending of test run /// </summary> /// <param name="isCanceled"> /// The is Canceled. /// </param> /// <param name="runEventsHandler"> /// The run Events Handler. /// </param> /// <returns> /// The <see cref="Collection"/>. /// </returns> public Collection <AttachmentSet> AfterTestRunEnd(bool isCanceled, ITestMessageEventHandler runEventsHandler) { AfterTestRunEndResult afterTestRunEnd = null; this.InvokeDataCollectionServiceAction( () => { EqtTrace.Info("ProxyDataCollectionManager.AfterTestRunEnd: Get attachment set for datacollector processId: {0} port: {1}", dataCollectionProcessId, dataCollectionPort); afterTestRunEnd = this.dataCollectionRequestSender.SendAfterTestRunEndAndGetResult(runEventsHandler, isCanceled); }, runEventsHandler); if (requestData.IsTelemetryOptedIn && afterTestRunEnd?.Metrics != null) { foreach (var metric in afterTestRunEnd.Metrics) { requestData.MetricsCollection.Add(metric.Key, metric.Value); } } return(afterTestRunEnd?.AttachmentSets); }
/// <inheritdoc/> public AfterTestRunEndResult SendAfterTestRunEndAndGetResult(ITestMessageEventHandler runEventsHandler, bool isCancelled) { var isDataCollectionComplete = false; AfterTestRunEndResult result = null; if (EqtTrace.IsVerboseEnabled) { EqtTrace.Verbose("DataCollectionRequestSender.SendAfterTestRunStartAndGetResult : Send AfterTestRunEnd message with isCancelled: {0}", isCancelled); } this.communicationManager.SendMessage(MessageType.AfterTestRunEnd, isCancelled); // Cycle through the messages that the datacollector sends. // Currently each of the operations are not separate tasks since they should not each take much time. This is just a notification. while (!isDataCollectionComplete && !isCancelled) { var message = this.communicationManager.ReceiveMessage(); if (EqtTrace.IsVerboseEnabled) { EqtTrace.Verbose("DataCollectionRequestSender.SendAfterTestRunStartAndGetResult : Received message: {0}", message); } if (message.MessageType == MessageType.DataCollectionMessage) { var dataCollectionMessageEventArgs = this.dataSerializer.DeserializePayload <DataCollectionMessageEventArgs>(message); this.LogDataCollectorMessage(dataCollectionMessageEventArgs, runEventsHandler); } else if (message.MessageType == MessageType.AfterTestRunEndResult) { result = this.dataSerializer.DeserializePayload <AfterTestRunEndResult>(message); isDataCollectionComplete = true; } } return(result); }