public void EventsHandlerHandleTestRunAttachmentsProcessingProgressShouldSendAttachmentsProcessingProgressMessage()
        {
            var args = new TestRunAttachmentsProcessingProgressEventArgs(1, new[] { new System.Uri("http://www.bing.com/") }, 90, 2);

            handler.HandleTestRunAttachmentsProcessingProgress(args);

            mockCommunicationManager.Verify(cm => cm.SendMessage(MessageType.TestRunAttachmentsProcessingProgress, It.Is <TestRunAttachmentsProcessingProgressPayload>(p => p.AttachmentsProcessingProgressEventArgs == args)));
        }
        private async Task <Collection <AttachmentSet> > ProcessAttachmentsAsync(Collection <AttachmentSet> attachments, ITestRunAttachmentsProcessingEventsHandler eventsHandler, CancellationToken cancellationToken)
        {
            if (attachments == null || !attachments.Any())
            {
                return(attachments);
            }

            var logger = CreateMessageLogger(eventsHandler);

            for (int i = 0; i < dataCollectorAttachmentsProcessors.Length; i++)
            {
                var dataCollectorAttachmentsProcessor = dataCollectorAttachmentsProcessors[i];
                int attachmentsHandlerIndex           = i + 1;

                ICollection <Uri> attachmentProcessorUris = dataCollectorAttachmentsProcessor.GetExtensionUris()?.ToList();
                if (attachmentProcessorUris != null && attachmentProcessorUris.Any())
                {
                    var attachmentsToBeProcessed = attachments.Where(dataCollectionAttachment => attachmentProcessorUris.Any(uri => uri.Equals(dataCollectionAttachment.Uri))).ToArray();
                    if (attachmentsToBeProcessed.Any())
                    {
                        foreach (var attachment in attachmentsToBeProcessed)
                        {
                            attachments.Remove(attachment);
                        }

                        IProgress <int> progressReporter = new Progress <int>((int progress) =>
                                                                              eventsHandler?.HandleTestRunAttachmentsProcessingProgress(
                                                                                  new TestRunAttachmentsProcessingProgressEventArgs(attachmentsHandlerIndex, attachmentProcessorUris, progress, dataCollectorAttachmentsProcessors.Length)));

                        ICollection <AttachmentSet> processedAttachments = await dataCollectorAttachmentsProcessor.ProcessAttachmentSetsAsync(new Collection <AttachmentSet>(attachmentsToBeProcessed), progressReporter, logger, cancellationToken).ConfigureAwait(false);

                        foreach (var attachment in processedAttachments)
                        {
                            attachments.Add(attachment);
                        }
                    }
                }
            }

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