public void EventsHandlerHandleTestRunAttachmentsProcessingCompleteShouldSendAttachmentsProcessingCompleteMessage()
        {
            var attachments = new[] { new AttachmentSet(new System.Uri("http://www.bing.com/"), "code coverage") };
            var args        = new TestRunAttachmentsProcessingCompleteEventArgs(false, null);

            handler.HandleTestRunAttachmentsProcessingComplete(args, attachments);

            mockCommunicationManager.Verify(cm => cm.SendMessage(MessageType.TestRunAttachmentsProcessingComplete, It.Is <TestRunAttachmentsProcessingCompletePayload>(p => p.Attachments == attachments && p.AttachmentsProcessingCompleteEventArgs == args)));
        }
        private Collection <AttachmentSet> FinalizeOperation(IRequestData requestData, TestRunAttachmentsProcessingCompleteEventArgs completeArgs, Collection <AttachmentSet> attachments, Stopwatch stopwatch, ITestRunAttachmentsProcessingEventsHandler eventHandler)
        {
            testPlatformEventSource.TestRunAttachmentsProcessingStop(attachments.Count);
            requestData.MetricsCollection.Add(TelemetryDataConstants.NumberOfAttachmentsAfterProcessing, attachments.Count);
            requestData.MetricsCollection.Add(TelemetryDataConstants.AttachmentsProcessingState, completeArgs.Error != null ? AttachmentsProcessingFailed : completeArgs.IsCanceled ? AttachmentsProcessingCanceled : AttachmentsProcessingCompleted);

            stopwatch.Stop();
            requestData.MetricsCollection.Add(TelemetryDataConstants.TimeTakenInSecForAttachmentsProcessing, stopwatch.Elapsed.TotalSeconds);

            completeArgs.Metrics = requestData.MetricsCollection.Metrics;
            eventHandler?.HandleTestRunAttachmentsProcessingComplete(completeArgs, attachments);

            return(attachments);
        }
        private async Task SendMessageAndListenAndReportAttachmentsProcessingResultAsync(IEnumerable <AttachmentSet> attachments, bool collectMetrics, ITestRunAttachmentsProcessingEventsHandler eventHandler, CancellationToken cancellationToken)
        {
            try
            {
                var payload = new TestRunAttachmentsProcessingPayload
                {
                    Attachments    = attachments,
                    CollectMetrics = collectMetrics
                };

                this.communicationManager.SendMessage(MessageType.TestRunAttachmentsProcessingStart, payload);
                var isTestRunAttachmentsProcessingComplete = false;

                using (cancellationToken.Register(() => this.communicationManager.SendMessage(MessageType.TestRunAttachmentsProcessingCancel)))
                {
                    // Cycle through the messages that the vstest.console sends.
                    // Currently each of the operations are not separate tasks since they should not each take much time.
                    // This is just a notification.
                    while (!isTestRunAttachmentsProcessingComplete)
                    {
                        var message = await this.TryReceiveMessageAsync().ConfigureAwait(false);

                        if (string.Equals(MessageType.TestRunAttachmentsProcessingComplete, message.MessageType))
                        {
                            if (EqtTrace.IsInfoEnabled)
                            {
                                EqtTrace.Info("VsTestConsoleRequestSender.SendMessageAndListenAndReportAttachments: Process complete.");
                            }

                            var testRunAttachmentsProcessingCompletePayload = this.dataSerializer.DeserializePayload <TestRunAttachmentsProcessingCompletePayload>(message);

                            eventHandler.HandleTestRunAttachmentsProcessingComplete(testRunAttachmentsProcessingCompletePayload.AttachmentsProcessingCompleteEventArgs, testRunAttachmentsProcessingCompletePayload.Attachments);
                            isTestRunAttachmentsProcessingComplete = true;
                        }
                        else if (string.Equals(MessageType.TestRunAttachmentsProcessingProgress, message.MessageType))
                        {
                            var testRunAttachmentsProcessingProgressPayload = this.dataSerializer.DeserializePayload <TestRunAttachmentsProcessingProgressPayload>(message);
                            eventHandler.HandleTestRunAttachmentsProcessingProgress(testRunAttachmentsProcessingProgressPayload.AttachmentsProcessingProgressEventArgs);
                        }
                        else if (string.Equals(MessageType.TestMessage, message.MessageType))
                        {
                            var testMessagePayload = this.dataSerializer.DeserializePayload <TestMessagePayload>(message);
                            eventHandler.HandleLogMessage(testMessagePayload.MessageLevel, testMessagePayload.Message);
                        }
                        else
                        {
                            EqtTrace.Warning($"VsTestConsoleRequestSender.SendMessageAndListenAndReportAttachments: Unexpected message received {message.MessageType}.");
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                EqtTrace.Error("Aborting Test Session End Operation: {0}", exception);
                eventHandler.HandleLogMessage(TestMessageLevel.Error, TranslationLayerResources.AbortedTestRunAttachmentsProcessing);
                eventHandler.HandleTestRunAttachmentsProcessingComplete(new TestRunAttachmentsProcessingCompleteEventArgs(false, exception), null);

                // Earlier we were closing the connection with vstest.console in case of exceptions
                // Removing that code because vstest.console might be in a healthy state and letting the client
                // know of the error, so that the TL can wait for the next instruction from the client itself.
                // Also, connection termination might not kill the process which could result in files being locked by testhost.
            }
            finally
            {
                this.testPlatformEventSource.TranslationLayerTestRunAttachmentsProcessingStop();
            }
        }