Skip to content

Commit fc7a1c0

Browse files
committed
Review changes #1
1 parent b25a64e commit fc7a1c0

26 files changed

Lines changed: 403 additions & 471 deletions

File tree

src/Microsoft.TestPlatform.Client/DesignMode/DesignModeClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ private void StartMultiTestRunFinalization(MultiTestRunFinalizationPayload final
479479
{
480480
try
481481
{
482-
testRequestManager.FinalizeMultiTestRun(finalizationPayload, new MultiTestRunFinalizationEventsHandler(this.communicationManager));
482+
testRequestManager.FinalizeMultiTestRun(finalizationPayload, new MultiTestRunFinalizationEventsHandler(this.communicationManager), this.protocolConfig);
483483
}
484484
catch (Exception ex)
485485
{

src/Microsoft.TestPlatform.Client/RequestHelper/ITestRequestManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public interface ITestRequestManager : IDisposable
4949
/// </summary>
5050
/// <param name="multiTestRunFinalizationPayload">Multi test run finalization payload</param>
5151
/// <param name="multiTestRunFinalizationEventsHandler">Multi test run finalization events handler</param>
52-
void FinalizeMultiTestRun(MultiTestRunFinalizationPayload multiTestRunFinalizationPayload, IMultiTestRunFinalizationEventsHandler multiTestRunFinalizationEventsHandler);
52+
void FinalizeMultiTestRun(MultiTestRunFinalizationPayload multiTestRunFinalizationPayload, IMultiTestRunFinalizationEventsHandler multiTestRunFinalizationEventsHandler, ProtocolConfig protocolConfig);
5353

5454
/// <summary>
5555
/// Cancel the current TestRun request

src/Microsoft.TestPlatform.Common/Interfaces/Engine/IMultiTestRunFinalizationManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ internal interface IMultiTestRunFinalizationManager
2020
/// <param name="attachments">Collection of attachments</param>
2121
/// <param name="eventHandler">EventHandler for handling multi test run finalization event</param>
2222
/// <param name="cancellationToken">Cancellation token</param>
23-
Task FinalizeMultiTestRunAsync(ICollection<AttachmentSet> attachments, IMultiTestRunFinalizationEventsHandler eventHandler, CancellationToken cancellationToken);
23+
Task FinalizeMultiTestRunAsync(IRequestData requestData, IEnumerable<AttachmentSet> attachments, IMultiTestRunFinalizationEventsHandler eventHandler, CancellationToken cancellationToken);
2424

2525
/// <summary>
2626
/// Finalizes multi test run
2727
/// </summary>
2828
/// <param name="attachments">Collection of attachments</param>
2929
/// <param name="cancellationToken">Cancellation token</param>
3030
/// <returns>Collection of attachments.</returns>
31-
Task<Collection<AttachmentSet>> FinalizeMultiTestRunAsync(ICollection<AttachmentSet> attachments, CancellationToken cancellationToken);
31+
Task<Collection<AttachmentSet>> FinalizeMultiTestRunAsync(IRequestData requestData, IEnumerable<AttachmentSet> attachments, CancellationToken cancellationToken);
3232
}
3333
}

src/Microsoft.TestPlatform.Common/Telemetry/TelemetryDataConstants.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,19 @@ public static class TelemetryDataConstants
9090

9191
public static string NumberOfAdapterUsedToDiscoverTests = "VS.TestDiscovery.AdaptersUsedCount";
9292

93+
// *********************Finalization****************************
94+
public static string NumberOfAttachmentsSentForFinalization = "VS.TestFinalization.InitialAttachmentsCount";
95+
96+
public static string NumberOfAttachmentsAfterFinalization = "VS.TestFinalization.FinalAttachmentsCount";
97+
98+
public static string TimeTakenInSecForFinalization = "VS.TestFinalization.TotalTimeTakenInSec";
99+
public static string FinalizationState = "VS.TestFinalization.FinalizationState";
100+
93101
// **************Events Name **********************************
94102
public static string TestDiscoveryCompleteEvent = "vs/testplatform/testdiscoverysession";
95103

96104
public static string TestExecutionCompleteEvent = "vs/testplatform/testrunsession";
105+
106+
public static string TestFinalizationCompleteEvent = "vs/testplatform/testfinalizationsession";
97107
}
98108
}

src/Microsoft.TestPlatform.CrossPlatEngine/Client/Parallel/ParallelRunEventsHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ internal class ParallelRunEventsHandler : ITestRunEventsHandler2
3131

3232
private IDataSerializer dataSerializer;
3333

34-
private IRequestData requestData;
34+
protected IRequestData requestData;
3535

3636
public ParallelRunEventsHandler(IRequestData requestData,
3737
IProxyExecutionManager proxyExecutionManager,

src/Microsoft.TestPlatform.CrossPlatEngine/DataCollection/ParallelDataCollectionEventsHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public override void HandleTestRunComplete(
5656

5757
if (parallelRunComplete)
5858
{
59-
runDataAggregator.RunContextAttachments = finalizationManager.FinalizeMultiTestRunAsync(runDataAggregator.RunContextAttachments, cancellationToken).Result ?? runDataAggregator.RunContextAttachments;
59+
runDataAggregator.RunContextAttachments = finalizationManager.FinalizeMultiTestRunAsync(requestData, runDataAggregator.RunContextAttachments, cancellationToken).Result ?? runDataAggregator.RunContextAttachments;
6060

6161
var completedArgs = new TestRunCompleteEventArgs(this.runDataAggregator.GetAggregatedRunStats(),
6262
this.runDataAggregator.IsCanceled,

src/Microsoft.TestPlatform.CrossPlatEngine/MultiTestRunFinalization/MultiTestRunFinalizationManager.cs

Lines changed: 74 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Collections.ObjectModel;
7+
using System.Diagnostics;
78
using System.Linq;
89
using System.Threading;
910
using System.Threading.Tasks;
11+
using Microsoft.VisualStudio.TestPlatform.Common.Telemetry;
1012
using Microsoft.VisualStudio.TestPlatform.CoreUtilities.Tracing.Interfaces;
1113
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
1214
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client;
@@ -20,6 +22,10 @@ namespace Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.MultiTestRunFinali
2022
/// </summary>
2123
public class MultiTestRunFinalizationManager : IMultiTestRunFinalizationManager
2224
{
25+
private static string FinalizationCompleted = "Completed";
26+
private static string FinalizationCanceled = "Canceled";
27+
private static string FinalizationFailed = "Failed";
28+
2329
private readonly ITestPlatformEventSource testPlatformEventSource;
2430
private readonly IDataCollectorAttachments[] dataCollectorAttachmentsHandlers;
2531

@@ -33,65 +39,74 @@ public MultiTestRunFinalizationManager(ITestPlatformEventSource testPlatformEven
3339
}
3440

3541
/// <inheritdoc/>
36-
public async Task FinalizeMultiTestRunAsync(ICollection<AttachmentSet> attachments, IMultiTestRunFinalizationEventsHandler eventHandler, CancellationToken cancellationToken)
42+
public async Task FinalizeMultiTestRunAsync(IRequestData requestData, IEnumerable<AttachmentSet> attachments, IMultiTestRunFinalizationEventsHandler eventHandler, CancellationToken cancellationToken)
3743
{
38-
await InternalFinalizeMultiTestRunAsync(new Collection<AttachmentSet>(attachments.ToList()), eventHandler, cancellationToken).ConfigureAwait(false);
44+
await InternalFinalizeMultiTestRunAsync(requestData, new Collection<AttachmentSet>(attachments.ToList()), eventHandler, cancellationToken).ConfigureAwait(false);
3945
}
40-
4146
/// <inheritdoc/>
42-
public Task<Collection<AttachmentSet>> FinalizeMultiTestRunAsync(ICollection<AttachmentSet> attachments, CancellationToken cancellationToken)
47+
public Task<Collection<AttachmentSet>> FinalizeMultiTestRunAsync(IRequestData requestData, IEnumerable<AttachmentSet> attachments, CancellationToken cancellationToken)
4348
{
44-
return InternalFinalizeMultiTestRunAsync(new Collection<AttachmentSet>(attachments.ToList()), null, cancellationToken);
49+
return InternalFinalizeMultiTestRunAsync(requestData, new Collection<AttachmentSet>(attachments.ToList()), null, cancellationToken);
4550
}
4651

47-
private async Task<Collection<AttachmentSet>> InternalFinalizeMultiTestRunAsync(Collection<AttachmentSet> attachments, IMultiTestRunFinalizationEventsHandler eventHandler, CancellationToken cancellationToken)
52+
private async Task<Collection<AttachmentSet>> InternalFinalizeMultiTestRunAsync(IRequestData requestData, Collection<AttachmentSet> attachments, IMultiTestRunFinalizationEventsHandler eventHandler, CancellationToken cancellationToken)
4853
{
54+
Stopwatch stopwatch = Stopwatch.StartNew();
55+
4956
try
5057
{
5158
testPlatformEventSource.MultiTestRunFinalizationStart(attachments?.Count ?? 0);
52-
59+
requestData.MetricsCollection.Add(TelemetryDataConstants.NumberOfAttachmentsSentForFinalization, attachments?.Count ?? 0);
60+
5361
cancellationToken.ThrowIfCancellationRequested();
5462

55-
var taskCompletionSource = new TaskCompletionSource<object>();
63+
var taskCompletionSource = new TaskCompletionSource<Collection<AttachmentSet>>();
5664
using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled()))
5765
{
58-
Task task = Task.Run(() =>
66+
Task<Collection<AttachmentSet>> task = Task.Run(() =>
5967
{
60-
HandleAttachments(attachments, cancellationToken);
68+
return ProcessAttachments(new Collection<AttachmentSet>(attachments.ToList()), new ProgressReporter(eventHandler, dataCollectorAttachmentsHandlers.Length), cancellationToken);
6169
});
6270

6371
var completedTask = await Task.WhenAny(task, taskCompletionSource.Task).ConfigureAwait(false);
6472

6573
if (completedTask == task)
6674
{
67-
await task;
68-
eventHandler?.HandleMultiTestRunFinalizationComplete(attachments);
69-
testPlatformEventSource.MultiTestRunFinalizationStop(attachments.Count);
70-
return attachments;
75+
return FinalizeOperation(requestData, await task, eventHandler, FinalizationCompleted);
7176
}
7277
else
7378
{
7479
eventHandler?.HandleLogMessage(ObjectModel.Logging.TestMessageLevel.Informational, "Finalization was cancelled.");
75-
eventHandler?.HandleMultiTestRunFinalizationComplete(null);
76-
testPlatformEventSource.MultiTestRunFinalizationStop(0);
80+
return FinalizeOperation(requestData, attachments, eventHandler, FinalizationCanceled);
7781
}
7882
}
79-
80-
return null;
83+
}
84+
catch (OperationCanceledException)
85+
{
86+
if (EqtTrace.IsWarningEnabled)
87+
{
88+
EqtTrace.Warning("MultiTestRunFinalizationManager: operation was cancelled.");
89+
}
90+
return FinalizeOperation(requestData, attachments, eventHandler, FinalizationCanceled);
8191
}
8292
catch (Exception e)
8393
{
8494
EqtTrace.Error("MultiTestRunFinalizationManager: Exception in FinalizeMultiTestRunAsync: " + e);
8595

8696
eventHandler?.HandleLogMessage(ObjectModel.Logging.TestMessageLevel.Error, e.Message);
87-
eventHandler?.HandleMultiTestRunFinalizationComplete(null);
88-
testPlatformEventSource.MultiTestRunFinalizationStop(0);
89-
return null;
97+
return FinalizeOperation(requestData, attachments, eventHandler, FinalizationFailed);
98+
}
99+
finally
100+
{
101+
stopwatch.Stop();
102+
requestData.MetricsCollection.Metrics.Add(TelemetryDataConstants.TimeTakenInSecForFinalization, stopwatch.Elapsed.TotalSeconds);
90103
}
91104
}
92105

93-
private void HandleAttachments(ICollection<AttachmentSet> attachments, CancellationToken cancellationToken)
106+
private Collection<AttachmentSet> ProcessAttachments(Collection<AttachmentSet> attachments, ProgressReporter progressReporter, CancellationToken cancellationToken)
94107
{
108+
if (attachments == null || !attachments.Any()) return attachments;
109+
95110
foreach (var dataCollectorAttachmentsHandler in dataCollectorAttachmentsHandlers)
96111
{
97112
Uri attachementUri = dataCollectorAttachmentsHandler.GetExtensionUri();
@@ -105,14 +120,50 @@ private void HandleAttachments(ICollection<AttachmentSet> attachments, Cancellat
105120
attachments.Remove(attachment);
106121
}
107122

108-
ICollection<AttachmentSet> processedAttachments = dataCollectorAttachmentsHandler.HandleDataCollectionAttachmentSets(new Collection<AttachmentSet>(attachmentsToBeProcessed), cancellationToken);
123+
ICollection<AttachmentSet> processedAttachments = dataCollectorAttachmentsHandler.HandleDataCollectionAttachmentSets(new Collection<AttachmentSet>(attachmentsToBeProcessed), progressReporter, cancellationToken);
109124
foreach (var attachment in processedAttachments)
110125
{
111126
attachments.Add(attachment);
112127
}
113128
}
114129
}
115130
}
131+
132+
return attachments;
133+
}
134+
135+
private Collection<AttachmentSet> FinalizeOperation(IRequestData requestData, Collection<AttachmentSet> attachments, IMultiTestRunFinalizationEventsHandler eventHandler, string finalizationState)
136+
{
137+
eventHandler?.HandleMultiTestRunFinalizationComplete(attachments);
138+
testPlatformEventSource.MultiTestRunFinalizationStop(attachments.Count);
139+
requestData.MetricsCollection.Add(TelemetryDataConstants.NumberOfAttachmentsAfterFinalization, attachments.Count);
140+
requestData.MetricsCollection.Add(TelemetryDataConstants.FinalizationState, attachments.Count);
141+
142+
return attachments;
143+
}
144+
145+
private class ProgressReporter : IProgress<int>
146+
{
147+
private readonly IMultiTestRunFinalizationEventsHandler eventsHandler;
148+
private readonly int totalNumberOfHandlers;
149+
private int currentHandlerIndex;
150+
151+
public ProgressReporter(IMultiTestRunFinalizationEventsHandler eventsHandler, int totalNumberOfHandlers)
152+
{
153+
this.eventsHandler = eventsHandler;
154+
this.currentHandlerIndex = 0;
155+
this.totalNumberOfHandlers = totalNumberOfHandlers;
156+
}
157+
158+
public void IncremenetHandlerIndex()
159+
{
160+
currentHandlerIndex++;
161+
}
162+
163+
public void Report(int value)
164+
{
165+
//eventsHandler.report( current, total, value)
166+
}
116167
}
117168
}
118169
}

src/Microsoft.TestPlatform.ObjectModel/Client/Payloads/MultiTestRunFinalizationPayload.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ public class MultiTestRunFinalizationPayload
1515
/// Collection of attachments.
1616
/// </summary>
1717
[DataMember]
18-
public ICollection<AttachmentSet> Attachments { get; set; }
18+
public IEnumerable<AttachmentSet> Attachments { get; set; }
19+
20+
/// <summary>
21+
/// Gets or sets whether Metrics should be collected or not.
22+
/// </summary>
23+
[DataMember]
24+
public bool CollectMetrics { get; set; }
1925
}
2026
}

src/Microsoft.TestPlatform.ObjectModel/DataCollector/IDataCollectorAttachments.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ public interface IDataCollectorAttachments
2121
/// <summary>
2222
/// Gets the attachment set after Test Run Session
2323
/// </summary>
24+
/// <param name="dataCollectionAttachments">Attachments to be processed</param>
25+
/// <param name="progressReporter">Progress reporter. Accepts integers from 0 to 100</param>
26+
/// <param name="cancellationToken">Cancellation token</param>
2427
/// <returns>Gets the attachment set after Test Run Session</returns>
25-
ICollection<AttachmentSet> HandleDataCollectionAttachmentSets(ICollection<AttachmentSet> dataCollectionAttachments, CancellationToken cancellationToken);
28+
ICollection<AttachmentSet> HandleDataCollectionAttachmentSets(ICollection<AttachmentSet> dataCollectionAttachments, IProgress<int> progressReporter, CancellationToken cancellationToken);
2629

2730
/// <summary>
2831
/// Gets the attachment Uri, which is handled by current Collector

src/Microsoft.TestPlatform.Utilities/CodeCoverageDataAttachmentsHandler.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace Microsoft.VisualStudio.TestPlatform.Utilities
99
using System.IO;
1010
using System.Linq;
1111
using System.Reflection;
12+
using System.Resources;
1213
using System.Threading;
1314
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
1415
using Microsoft.VisualStudio.TestPlatform.ObjectModel.DataCollection;
@@ -33,15 +34,15 @@ public Uri GetExtensionUri()
3334

3435
public ICollection<AttachmentSet> HandleDataCollectionAttachmentSets(ICollection<AttachmentSet> dataCollectionAttachments)
3536
{
36-
return HandleDataCollectionAttachmentSets(dataCollectionAttachments, CancellationToken.None);
37+
return HandleDataCollectionAttachmentSets(dataCollectionAttachments, null, CancellationToken.None);
3738
}
3839

39-
public ICollection<AttachmentSet> HandleDataCollectionAttachmentSets(ICollection<AttachmentSet> dataCollectionAttachments, CancellationToken cancellationToken)
40+
public ICollection<AttachmentSet> HandleDataCollectionAttachmentSets(ICollection<AttachmentSet> dataCollectionAttachments, IProgress<int> progressReporter, CancellationToken cancellationToken)
4041
{
4142
if (dataCollectionAttachments != null && dataCollectionAttachments.Any())
4243
{
4344
var codeCoverageFiles = dataCollectionAttachments.Select(coverageAttachment => coverageAttachment.Attachments[0].Uri.LocalPath).ToArray();
44-
var outputFile = MergeCodeCoverageFiles(codeCoverageFiles, cancellationToken);
45+
var outputFile = MergeCodeCoverageFiles(codeCoverageFiles, progressReporter, cancellationToken);
4546
var attachmentSet = new AttachmentSet(CodeCoverageDataCollectorUri, CoverageFriendlyName);
4647

4748
if (!string.IsNullOrEmpty(outputFile))
@@ -57,7 +58,7 @@ public ICollection<AttachmentSet> HandleDataCollectionAttachmentSets(ICollection
5758
return new Collection<AttachmentSet>();
5859
}
5960

60-
private string MergeCodeCoverageFiles(IList<string> files, CancellationToken cancellationToken)
61+
private string MergeCodeCoverageFiles(IList<string> files, IProgress<int> progressReporter, CancellationToken cancellationToken)
6162
{
6263
string fileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + CoverageFileExtension);
6364
string outputfileName = files[0];
@@ -82,11 +83,14 @@ private string MergeCodeCoverageFiles(IList<string> files, CancellationToken can
8283

8384
cancellationToken.ThrowIfCancellationRequested();
8485
File.Copy(fileName, outputfileName, true);
86+
87+
progressReporter?.Report(100 * i / files.Count);
8588
}
8689

8790
File.Delete(fileName);
8891
}
8992

93+
progressReporter?.Report(100);
9094
return outputfileName;
9195
}
9296
catch (OperationCanceledException)

0 commit comments

Comments
 (0)