diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index da2c0c0b75f8..891aa15e5bc8 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -715,11 +715,11 @@
https://github.com/dotnet/runtime
e77011b31a3e5c47d931248a64b47f9b2d47853d
-
+
https://github.com/microsoft/testfx
66b23c38620c1ad74ce3f42d3555defdd2703177
-
+
https://github.com/microsoft/testfx
66b23c38620c1ad74ce3f42d3555defdd2703177
diff --git a/eng/Versions.props b/eng/Versions.props
index ef4e8079662d..08750af6441a 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -30,7 +30,7 @@
6.0.1
true
- 1.8.0-preview.25170.7
+ 1.7.0-preview.25171.2
30
@@ -174,10 +174,6 @@
17.14.0-preview-25167-01
17.14.0-preview-25167-01
-
-
- 1.5.0-preview.24602.2
-
10.0.0-preview.25155.1
@@ -299,7 +295,7 @@
6.12.0
6.1.0
4.18.4
- 3.10.0-preview.25170.7
+ 3.9.0-preview.25171.2
1.3.2
8.0.0-beta.23607.1
diff --git a/src/Cli/dotnet/commands/Test/CliConstants.cs b/src/Cli/dotnet/commands/Test/CliConstants.cs
index 3ba68cf5b31c..92ecdd868220 100644
--- a/src/Cli/dotnet/commands/Test/CliConstants.cs
+++ b/src/Cli/dotnet/commands/Test/CliConstants.cs
@@ -75,6 +75,7 @@ internal static class HandshakeMessagePropertyNames
internal const byte HostType = 5;
internal const byte ModulePath = 6;
internal const byte ExecutionId = 7;
+ internal const byte InstanceId = 8;
}
internal static class ProtocolConstants
diff --git a/src/Cli/dotnet/commands/Test/CustomEventArgs.cs b/src/Cli/dotnet/commands/Test/CustomEventArgs.cs
index bb1df5b904cd..afba9771b04c 100644
--- a/src/Cli/dotnet/commands/Test/CustomEventArgs.cs
+++ b/src/Cli/dotnet/commands/Test/CustomEventArgs.cs
@@ -19,6 +19,8 @@ internal class DiscoveredTestEventArgs : EventArgs
{
public string ExecutionId { get; set; }
+ public string InstanceId { get; set; }
+
public DiscoveredTest[] DiscoveredTests { get; set; }
}
@@ -26,6 +28,8 @@ internal class TestResultEventArgs : EventArgs
{
public string ExecutionId { get; set; }
+ public string InstanceId { get; set; }
+
public SuccessfulTestResult[] SuccessfulTestResults { get; set; }
public FailedTestResult[] FailedTestResults { get; set; }
@@ -35,6 +39,8 @@ internal class FileArtifactEventArgs : EventArgs
{
public string ExecutionId { get; set; }
+ public string InstanceId { get; set; }
+
public FileArtifact[] FileArtifacts { get; set; }
}
diff --git a/src/Cli/dotnet/commands/Test/IPC/Models/DiscoveredTestMessages.cs b/src/Cli/dotnet/commands/Test/IPC/Models/DiscoveredTestMessages.cs
index 3cf50b7d5943..183e655fc3cc 100644
--- a/src/Cli/dotnet/commands/Test/IPC/Models/DiscoveredTestMessages.cs
+++ b/src/Cli/dotnet/commands/Test/IPC/Models/DiscoveredTestMessages.cs
@@ -1,8 +1,8 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.DotNet.Tools.Test;
internal sealed record DiscoveredTestMessage(string? Uid, string? DisplayName);
-internal sealed record DiscoveredTestMessages(string? ExecutionId, DiscoveredTestMessage[] DiscoveredMessages) : IRequest;
+internal sealed record DiscoveredTestMessages(string? ExecutionId, string? InstanceId, DiscoveredTestMessage[] DiscoveredMessages) : IRequest;
diff --git a/src/Cli/dotnet/commands/Test/IPC/Models/FileArtifactMessages.cs b/src/Cli/dotnet/commands/Test/IPC/Models/FileArtifactMessages.cs
index da4c8624d9ee..91b80657f19c 100644
--- a/src/Cli/dotnet/commands/Test/IPC/Models/FileArtifactMessages.cs
+++ b/src/Cli/dotnet/commands/Test/IPC/Models/FileArtifactMessages.cs
@@ -1,8 +1,8 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.DotNet.Tools.Test;
internal sealed record FileArtifactMessage(string? FullPath, string? DisplayName, string? Description, string? TestUid, string? TestDisplayName, string? SessionUid);
-internal sealed record FileArtifactMessages(string? ExecutionId, FileArtifactMessage[] FileArtifacts) : IRequest;
+internal sealed record FileArtifactMessages(string? ExecutionId, string InstanceId, FileArtifactMessage[] FileArtifacts) : IRequest;
diff --git a/src/Cli/dotnet/commands/Test/IPC/Models/HandshakeMessage.cs b/src/Cli/dotnet/commands/Test/IPC/Models/HandshakeMessage.cs
index c93005339ff8..e8473efd9cca 100644
--- a/src/Cli/dotnet/commands/Test/IPC/Models/HandshakeMessage.cs
+++ b/src/Cli/dotnet/commands/Test/IPC/Models/HandshakeMessage.cs
@@ -1,5 +1,5 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.DotNet.Tools.Test;
diff --git a/src/Cli/dotnet/commands/Test/IPC/Models/TestResultMessages.cs b/src/Cli/dotnet/commands/Test/IPC/Models/TestResultMessages.cs
index 2bfe4f714f14..0145dfd59f21 100644
--- a/src/Cli/dotnet/commands/Test/IPC/Models/TestResultMessages.cs
+++ b/src/Cli/dotnet/commands/Test/IPC/Models/TestResultMessages.cs
@@ -1,5 +1,5 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.DotNet.Tools.Test;
@@ -9,4 +9,4 @@ internal sealed record FailedTestResultMessage(string? Uid, string? DisplayName,
internal sealed record ExceptionMessage(string? ErrorMessage, string? ErrorType, string? StackTrace);
-internal sealed record TestResultMessages(string? ExecutionId, SuccessfulTestResultMessage[] SuccessfulTestMessages, FailedTestResultMessage[] FailedTestMessages) : IRequest;
+internal sealed record TestResultMessages(string? ExecutionId, string? InstanceId, SuccessfulTestResultMessage[] SuccessfulTestMessages, FailedTestResultMessage[] FailedTestMessages) : IRequest;
diff --git a/src/Cli/dotnet/commands/Test/IPC/Models/TestSessionEvent.cs b/src/Cli/dotnet/commands/Test/IPC/Models/TestSessionEvent.cs
index fc6249bc1a8d..843a2e7be140 100644
--- a/src/Cli/dotnet/commands/Test/IPC/Models/TestSessionEvent.cs
+++ b/src/Cli/dotnet/commands/Test/IPC/Models/TestSessionEvent.cs
@@ -1,5 +1,5 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.DotNet.Tools.Test;
diff --git a/src/Cli/dotnet/commands/Test/IPC/ObjectFieldIds.cs b/src/Cli/dotnet/commands/Test/IPC/ObjectFieldIds.cs
index 506a788ae3fc..06bd6c6f0ccb 100644
--- a/src/Cli/dotnet/commands/Test/IPC/ObjectFieldIds.cs
+++ b/src/Cli/dotnet/commands/Test/IPC/ObjectFieldIds.cs
@@ -48,7 +48,8 @@ internal static class DiscoveredTestMessagesFieldsId
public const int MessagesSerializerId = 5;
public const ushort ExecutionId = 1;
- public const ushort DiscoveredTestMessageList = 2;
+ public const ushort InstanceId = 2;
+ public const ushort DiscoveredTestMessageList = 3;
}
internal static class DiscoveredTestMessageFieldsId
@@ -62,8 +63,9 @@ internal static class TestResultMessagesFieldsId
public const int MessagesSerializerId = 6;
public const ushort ExecutionId = 1;
- public const ushort SuccessfulTestMessageList = 2;
- public const ushort FailedTestMessageList = 3;
+ public const ushort InstanceId = 2;
+ public const ushort SuccessfulTestMessageList = 3;
+ public const ushort FailedTestMessageList = 4;
}
internal static class SuccessfulTestResultMessageFieldsId
@@ -103,7 +105,8 @@ internal static class FileArtifactMessagesFieldsId
public const int MessagesSerializerId = 7;
public const ushort ExecutionId = 1;
- public const ushort FileArtifactMessageList = 2;
+ public const ushort InstanceId = 2;
+ public const ushort FileArtifactMessageList = 3;
}
internal static class FileArtifactMessageFieldsId
diff --git a/src/Cli/dotnet/commands/Test/IPC/Serializers/DiscoveredTestMessagesSerializer.cs b/src/Cli/dotnet/commands/Test/IPC/Serializers/DiscoveredTestMessagesSerializer.cs
index 63de1370ba05..7f11f773c93e 100644
--- a/src/Cli/dotnet/commands/Test/IPC/Serializers/DiscoveredTestMessagesSerializer.cs
+++ b/src/Cli/dotnet/commands/Test/IPC/Serializers/DiscoveredTestMessagesSerializer.cs
@@ -15,6 +15,10 @@ namespace Microsoft.DotNet.Tools.Test;
|---ExecutionId Size---| (4 bytes)
|---ExecutionId Value---| (n bytes)
+|---InstanceId---| (2 bytes)
+|---InstanceId Size---| (4 bytes)
+|---InstanceId Value---| (n bytes)
+
|---DiscoveredTestMessageList Id---| (2 bytes)
|---DiscoveredTestMessageList Size---| (4 bytes)
|---DiscoveredTestMessageList Value---| (n bytes)
@@ -38,6 +42,7 @@ internal sealed class DiscoveredTestMessagesSerializer : BaseSerializer, INamedP
public object Deserialize(Stream stream)
{
string? executionId = null;
+ string? instanceId = null;
List? discoveredTestMessages = null;
ushort fieldCount = ReadShort(stream);
@@ -53,6 +58,10 @@ public object Deserialize(Stream stream)
executionId = ReadStringValue(stream, fieldSize);
break;
+ case DiscoveredTestMessagesFieldsId.InstanceId:
+ instanceId = ReadStringValue(stream, fieldSize);
+ break;
+
case DiscoveredTestMessagesFieldsId.DiscoveredTestMessageList:
discoveredTestMessages = ReadDiscoveredTestMessagesPayload(stream);
break;
@@ -64,7 +73,7 @@ public object Deserialize(Stream stream)
}
}
- return new DiscoveredTestMessages(executionId, discoveredTestMessages is null ? [] : [.. discoveredTestMessages]);
+ return new DiscoveredTestMessages(executionId, instanceId, discoveredTestMessages is null ? [] : [.. discoveredTestMessages]);
}
private static List ReadDiscoveredTestMessagesPayload(Stream stream)
@@ -114,6 +123,7 @@ public void Serialize(object objectToSerialize, Stream stream)
WriteShort(stream, GetFieldCount(discoveredTestMessages));
WriteField(stream, DiscoveredTestMessagesFieldsId.ExecutionId, discoveredTestMessages.ExecutionId);
+ WriteField(stream, DiscoveredTestMessagesFieldsId.InstanceId, discoveredTestMessages.InstanceId);
WriteDiscoveredTestMessagesPayload(stream, discoveredTestMessages.DiscoveredMessages);
}
@@ -147,6 +157,7 @@ private static void WriteDiscoveredTestMessagesPayload(Stream stream, Discovered
private static ushort GetFieldCount(DiscoveredTestMessages discoveredTestMessages) =>
(ushort)((discoveredTestMessages.ExecutionId is null ? 0 : 1) +
+ (discoveredTestMessages.InstanceId is null ? 0 : 1) +
(IsNullOrEmpty(discoveredTestMessages.DiscoveredMessages) ? 0 : 1));
private static ushort GetFieldCount(DiscoveredTestMessage discoveredTestMessage) =>
diff --git a/src/Cli/dotnet/commands/Test/IPC/Serializers/FileArtifactMessagesSerializer.cs b/src/Cli/dotnet/commands/Test/IPC/Serializers/FileArtifactMessagesSerializer.cs
index 959a8bd27568..181056b9922f 100644
--- a/src/Cli/dotnet/commands/Test/IPC/Serializers/FileArtifactMessagesSerializer.cs
+++ b/src/Cli/dotnet/commands/Test/IPC/Serializers/FileArtifactMessagesSerializer.cs
@@ -15,6 +15,10 @@ namespace Microsoft.DotNet.Tools.Test;
|---ExecutionId Size---| (4 bytes)
|---ExecutionId Value---| (n bytes)
+|---InstanceId---| (2 bytes)
+|---InstanceId Size---| (4 bytes)
+|---InstanceId Value---| (n bytes)
+
|---FileArtifactMessageList Id---| (2 bytes)
|---FileArtifactMessageList Size---| (4 bytes)
|---FileArtifactMessageList Value---| (n bytes)
@@ -54,6 +58,7 @@ internal sealed class FileArtifactMessagesSerializer : BaseSerializer, INamedPip
public object Deserialize(Stream stream)
{
string? executionId = null;
+ string? instanceId = null;
List? fileArtifactMessages = null;
ushort fieldCount = ReadShort(stream);
@@ -69,6 +74,10 @@ public object Deserialize(Stream stream)
executionId = ReadStringValue(stream, fieldSize);
break;
+ case FileArtifactMessagesFieldsId.InstanceId:
+ instanceId = ReadStringValue(stream, fieldSize);
+ break;
+
case FileArtifactMessagesFieldsId.FileArtifactMessageList:
fileArtifactMessages = ReadFileArtifactMessagesPayload(stream);
break;
@@ -80,7 +89,7 @@ public object Deserialize(Stream stream)
}
}
- return new FileArtifactMessages(executionId, fileArtifactMessages is null ? [] : [.. fileArtifactMessages]);
+ return new FileArtifactMessages(executionId, instanceId, fileArtifactMessages is null ? [] : [.. fileArtifactMessages]);
}
private static List ReadFileArtifactMessagesPayload(Stream stream)
@@ -146,6 +155,7 @@ public void Serialize(object objectToSerialize, Stream stream)
WriteShort(stream, GetFieldCount(fileArtifactMessages));
WriteField(stream, FileArtifactMessagesFieldsId.ExecutionId, fileArtifactMessages.ExecutionId);
+ WriteField(stream, FileArtifactMessagesFieldsId.InstanceId, fileArtifactMessages.InstanceId);
WriteFileArtifactMessagesPayload(stream, fileArtifactMessages.FileArtifacts);
}
@@ -183,6 +193,7 @@ private static void WriteFileArtifactMessagesPayload(Stream stream, FileArtifact
private static ushort GetFieldCount(FileArtifactMessages fileArtifactMessages) =>
(ushort)((fileArtifactMessages.ExecutionId is null ? 0 : 1) +
+ (fileArtifactMessages.InstanceId is null ? 0 : 1) +
(IsNullOrEmpty(fileArtifactMessages.FileArtifacts) ? 0 : 1));
private static ushort GetFieldCount(FileArtifactMessage fileArtifactMessage) =>
diff --git a/src/Cli/dotnet/commands/Test/IPC/Serializers/TestResultMessagesSerializer.cs b/src/Cli/dotnet/commands/Test/IPC/Serializers/TestResultMessagesSerializer.cs
index f1d3711517c5..f500988ab2bc 100644
--- a/src/Cli/dotnet/commands/Test/IPC/Serializers/TestResultMessagesSerializer.cs
+++ b/src/Cli/dotnet/commands/Test/IPC/Serializers/TestResultMessagesSerializer.cs
@@ -1,5 +1,5 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
@@ -12,6 +12,10 @@ namespace Microsoft.DotNet.Tools.Test;
|---ExecutionId Size---| (4 bytes)
|---ExecutionId Value---| (n bytes)
+ |---InstanceId Id---| (2 bytes)
+ |---InstanceId Size---| (4 bytes)
+ |---InstanceId Value---| (n bytes)
+
|---SuccessfulTestMessageList Id---| (2 bytes)
|---SuccessfulTestMessageList Size---| (4 bytes)
|---SuccessfulTestMessageList Value---| (n bytes)
@@ -106,6 +110,7 @@ internal sealed class TestResultMessagesSerializer : BaseSerializer, INamedPipeS
public object Deserialize(Stream stream)
{
string? executionId = null;
+ string? instanceId = null;
List? successfulTestResultMessages = null;
List? failedTestResultMessages = null;
@@ -122,6 +127,10 @@ public object Deserialize(Stream stream)
executionId = ReadStringValue(stream, fieldSize);
break;
+ case TestResultMessagesFieldsId.InstanceId:
+ instanceId = ReadStringValue(stream, fieldSize);
+ break;
+
case TestResultMessagesFieldsId.SuccessfulTestMessageList:
successfulTestResultMessages = ReadSuccessfulTestMessagesPayload(stream);
break;
@@ -139,6 +148,7 @@ public object Deserialize(Stream stream)
return new TestResultMessages(
executionId,
+ instanceId,
successfulTestResultMessages is null ? [] : [.. successfulTestResultMessages],
failedTestResultMessages is null ? [] : [.. failedTestResultMessages]);
}
@@ -325,6 +335,7 @@ public void Serialize(object objectToSerialize, Stream stream)
WriteShort(stream, GetFieldCount(testResultMessages));
WriteField(stream, TestResultMessagesFieldsId.ExecutionId, testResultMessages.ExecutionId);
+ WriteField(stream, TestResultMessagesFieldsId.InstanceId, testResultMessages.InstanceId);
WriteSuccessfulTestMessagesPayload(stream, testResultMessages.SuccessfulTestMessages);
WriteFailedTestMessagesPayload(stream, testResultMessages.FailedTestMessages);
}
@@ -429,6 +440,7 @@ private static void WriteExceptionMessagesPayload(Stream stream, ExceptionMessag
private static ushort GetFieldCount(TestResultMessages testResultMessages) =>
(ushort)((testResultMessages.ExecutionId is null ? 0 : 1) +
+ (testResultMessages.InstanceId is null ? 0 : 1) +
(IsNullOrEmpty(testResultMessages.SuccessfulTestMessages) ? 0 : 1) +
(IsNullOrEmpty(testResultMessages.FailedTestMessages) ? 0 : 1));
diff --git a/src/Cli/dotnet/commands/Test/TestApplication.cs b/src/Cli/dotnet/commands/Test/TestApplication.cs
index 03cb8bba41e6..046410500008 100644
--- a/src/Cli/dotnet/commands/Test/TestApplication.cs
+++ b/src/Cli/dotnet/commands/Test/TestApplication.cs
@@ -1,7 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System.Collections.Concurrent;
using System.Diagnostics;
using System.IO.Pipes;
using Microsoft.DotNet.Cli.Utils;
@@ -21,7 +20,6 @@ internal sealed class TestApplication : IDisposable
private Task _testAppPipeConnectionLoop;
private readonly List _testAppPipeConnections = new();
- private readonly ConcurrentDictionary _executionIds = [];
public event EventHandler HandshakeReceived;
public event EventHandler HelpRequested;
@@ -31,7 +29,6 @@ internal sealed class TestApplication : IDisposable
public event EventHandler SessionEventReceived;
public event EventHandler ErrorReceived;
public event EventHandler TestProcessExited;
- public event EventHandler ExecutionIdReceived;
public TestModule Module => _module;
@@ -41,11 +38,6 @@ public TestApplication(TestModule module, BuildOptions buildOptions)
_buildOptions = buildOptions;
}
- public void AddExecutionId(string executionId)
- {
- _ = _executionIds.GetOrAdd(executionId, _ => string.Empty);
- }
-
public async Task RunAsync(TestOptions testOptions)
{
if (testOptions.HasFilterMode && !ModulePathExists())
@@ -186,7 +178,7 @@ private Task OnRequest(IRequest request)
default:
// If it doesn't match any of the above, throw an exception
- throw new NotSupportedException(string.Format(Microsoft.DotNet.Tools.Test.LocalizableStrings.CmdUnsupportedMessageRequestTypeException, request.GetType()));
+ throw new NotSupportedException(string.Format(Tools.Test.LocalizableStrings.CmdUnsupportedMessageRequestTypeException, request.GetType()));
}
}
catch (Exception ex)
@@ -302,7 +294,6 @@ private string BuildArgsWithDotnetRun(TestOptions testOptions)
builder.Append($" {arg}");
}
-
if (!string.IsNullOrEmpty(_module.TargetFramework))
{
builder.Append($" {CliConstants.FrameworkOptionKey} {_module.TargetFramework}");
@@ -332,11 +323,6 @@ private void AppendCommonArgs(StringBuilder builder, TestOptions testOptions)
public void OnHandshakeMessage(HandshakeMessage handshakeMessage)
{
- if (handshakeMessage.Properties.TryGetValue(HandshakeMessagePropertyNames.ExecutionId, out string executionId))
- {
- AddExecutionId(executionId);
- ExecutionIdReceived?.Invoke(this, new ExecutionEventArgs { ModulePath = _module.RunProperties.RunCommand, ExecutionId = executionId });
- }
HandshakeReceived?.Invoke(this, new HandshakeArgs { Handshake = new Handshake(handshakeMessage.Properties) });
}
@@ -350,6 +336,7 @@ internal void OnDiscoveredTestMessages(DiscoveredTestMessages discoveredTestMess
DiscoveredTestsReceived?.Invoke(this, new DiscoveredTestEventArgs
{
ExecutionId = discoveredTestMessages.ExecutionId,
+ InstanceId = discoveredTestMessages.InstanceId,
DiscoveredTests = discoveredTestMessages.DiscoveredMessages.Select(message => new DiscoveredTest(message.Uid, message.DisplayName)).ToArray()
});
}
@@ -359,6 +346,7 @@ internal void OnTestResultMessages(TestResultMessages testResultMessage)
TestResultsReceived?.Invoke(this, new TestResultEventArgs
{
ExecutionId = testResultMessage.ExecutionId,
+ InstanceId = testResultMessage.InstanceId,
SuccessfulTestResults = testResultMessage.SuccessfulTestMessages.Select(message => new SuccessfulTestResult(message.Uid, message.DisplayName, message.State, message.Duration, message.Reason, message.StandardOutput, message.ErrorOutput, message.SessionUid)).ToArray(),
FailedTestResults = testResultMessage.FailedTestMessages.Select(message => new FailedTestResult(message.Uid, message.DisplayName, message.State, message.Duration, message.Reason, message.Exceptions.Select(e => new FlatException(e.ErrorMessage, e.ErrorType, e.StackTrace)).ToArray(), message.StandardOutput, message.ErrorOutput, message.SessionUid)).ToArray()
});
@@ -366,7 +354,12 @@ internal void OnTestResultMessages(TestResultMessages testResultMessage)
internal void OnFileArtifactMessages(FileArtifactMessages fileArtifactMessages)
{
- FileArtifactsReceived?.Invoke(this, new FileArtifactEventArgs { FileArtifacts = fileArtifactMessages.FileArtifacts.Select(message => new FileArtifact(message.FullPath, message.DisplayName, message.Description, message.TestUid, message.TestDisplayName, message.SessionUid)).ToArray() });
+ FileArtifactsReceived?.Invoke(this, new FileArtifactEventArgs
+ {
+ ExecutionId = fileArtifactMessages.ExecutionId,
+ InstanceId = fileArtifactMessages.InstanceId,
+ FileArtifacts = fileArtifactMessages.FileArtifacts.Select(message => new FileArtifact(message.FullPath, message.DisplayName, message.Description, message.TestUid, message.TestDisplayName, message.SessionUid)).ToArray()
+ });
}
internal void OnSessionEvent(TestSessionEvent sessionEvent)
diff --git a/src/Cli/dotnet/commands/Test/TestApplicationEventHandlers.cs b/src/Cli/dotnet/commands/Test/TestApplicationEventHandlers.cs
index a9e22abc6e6b..d0d6c390ca28 100644
--- a/src/Cli/dotnet/commands/Test/TestApplicationEventHandlers.cs
+++ b/src/Cli/dotnet/commands/Test/TestApplicationEventHandlers.cs
@@ -8,16 +8,13 @@
namespace Microsoft.DotNet.Cli;
-internal sealed class TestApplicationsEventHandlers
+internal sealed class TestApplicationsEventHandlers : IDisposable
{
- private readonly ConcurrentDictionary _executions;
+ private readonly ConcurrentDictionary _executions = new();
private readonly TerminalTestReporter _output;
- public TestApplicationsEventHandlers(
- ConcurrentDictionary executions,
- TerminalTestReporter output)
+ public TestApplicationsEventHandlers(TerminalTestReporter output)
{
- _executions = executions;
_output = output;
}
@@ -45,6 +42,7 @@ private static string GetHandshakePropertyName(byte propertyId) =>
HandshakeMessagePropertyNames.HostType => nameof(HandshakeMessagePropertyNames.HostType),
HandshakeMessagePropertyNames.ModulePath => nameof(HandshakeMessagePropertyNames.ModulePath),
HandshakeMessagePropertyNames.ExecutionId => nameof(HandshakeMessagePropertyNames.ExecutionId),
+ HandshakeMessagePropertyNames.InstanceId => nameof(HandshakeMessagePropertyNames.InstanceId),
_ => string.Empty,
};
@@ -65,10 +63,11 @@ public void OnDiscoveredTestsReceived(object sender, DiscoveredTestEventArgs arg
public void OnTestResultsReceived(object sender, TestResultEventArgs args)
{
+ var testApp = (TestApplication)sender;
+ var appInfo = _executions[testApp];
+
foreach (var testResult in args.SuccessfulTestResults)
{
- var testApp = (TestApplication)sender;
- var appInfo = _executions[testApp];
_output.TestCompleted(appInfo.ModulePath, appInfo.TargetFramework, appInfo.Architecture, appInfo.ExecutionId,
testResult.Uid,
testResult.DisplayName,
@@ -77,24 +76,22 @@ public void OnTestResultsReceived(object sender, TestResultEventArgs args)
exceptions: null,
expected: null,
actual: null,
- standardOutput: null,
- errorOutput: null);
+ standardOutput: testResult.StandardOutput,
+ errorOutput: testResult.ErrorOutput);
}
foreach (var testResult in args.FailedTestResults)
{
- var testApp = (TestApplication)sender;
- var appInfo = _executions[testApp];
_output.TestCompleted(appInfo.ModulePath, appInfo.TargetFramework, appInfo.Architecture, appInfo.ExecutionId,
testResult.Uid,
testResult.DisplayName,
ToOutcome(testResult.State),
TimeSpan.FromTicks(testResult.Duration ?? 0),
- exceptions: testResult.Exceptions.Select(fe => new Microsoft.Testing.Platform.OutputDevice.Terminal.FlatException(fe.ErrorMessage, fe.ErrorType, fe.StackTrace)).ToArray(),
+ exceptions: testResult.Exceptions.Select(fe => new Testing.Platform.OutputDevice.Terminal.FlatException(fe.ErrorMessage, fe.ErrorType, fe.StackTrace)).ToArray(),
expected: null,
actual: null,
- standardOutput: null,
- errorOutput: null);
+ standardOutput: testResult.StandardOutput,
+ errorOutput: testResult.ErrorOutput);
}
LogTestResults(args);
@@ -147,10 +144,6 @@ public void OnTestProcessExited(object sender, TestProcessExitEventArgs args)
LogTestProcessExit(args);
}
- public void OnExecutionIdReceived(object sender, ExecutionEventArgs args)
- {
- }
-
public static TestOutcome ToOutcome(byte? testState) => testState switch
{
TestStates.Passed => TestOutcome.Passed,
@@ -189,6 +182,8 @@ private static void LogDiscoveredTests(DiscoveredTestEventArgs args)
var logMessageBuilder = new StringBuilder();
logMessageBuilder.AppendLine($"DiscoveredTests Execution Id: {args.ExecutionId}");
+ logMessageBuilder.AppendLine($"TestResults Instance Id: {args.InstanceId}");
+
foreach (var discoveredTestMessage in args.DiscoveredTests)
{
logMessageBuilder.AppendLine($"DiscoveredTest: {discoveredTestMessage.Uid}, {discoveredTestMessage.DisplayName}");
@@ -207,6 +202,7 @@ private static void LogTestResults(TestResultEventArgs args)
var logMessageBuilder = new StringBuilder();
logMessageBuilder.AppendLine($"TestResults Execution Id: {args.ExecutionId}");
+ logMessageBuilder.AppendLine($"TestResults Instance Id: {args.InstanceId}");
foreach (SuccessfulTestResult successfulTestResult in args.SuccessfulTestResults)
{
@@ -235,6 +231,7 @@ private static void LogFileArtifacts(FileArtifactEventArgs args)
var logMessageBuilder = new StringBuilder();
logMessageBuilder.AppendLine($"FileArtifactMessages Execution Id: {args.ExecutionId}");
+ logMessageBuilder.AppendLine($"TestResults Instance Id: {args.InstanceId}");
foreach (FileArtifact fileArtifactMessage in args.FileArtifacts)
{
@@ -272,4 +269,12 @@ private static void LogTestProcessExit(TestProcessExitEventArgs args)
Logger.LogTrace(() => logMessageBuilder.ToString());
}
+
+ public void Dispose()
+ {
+ foreach (var execution in _executions)
+ {
+ execution.Key.Dispose();
+ }
+ }
}
diff --git a/src/Cli/dotnet/commands/Test/TestingPlatformCommand.cs b/src/Cli/dotnet/commands/Test/TestingPlatformCommand.cs
index 874a473d057e..2aa7b4e497a9 100644
--- a/src/Cli/dotnet/commands/Test/TestingPlatformCommand.cs
+++ b/src/Cli/dotnet/commands/Test/TestingPlatformCommand.cs
@@ -1,7 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System.Collections.Concurrent;
using System.CommandLine;
using Microsoft.DotNet.Cli.Extensions;
using Microsoft.TemplateEngine.Cli.Commands;
@@ -15,10 +14,10 @@ internal partial class TestingPlatformCommand : CliCommand, ICustomHelp
private MSBuildHandler _msBuildHandler;
private TerminalTestReporter _output;
private TestApplicationActionQueue _actionQueue;
- private readonly ConcurrentDictionary _executions = new();
+ private TestApplicationsEventHandlers _eventHandlers;
+
private byte _cancelled;
private bool _isDiscovery;
- private TestApplicationsEventHandlers _eventHandlers;
public TestingPlatformCommand(string name, string description = null) : base(name, description)
{
@@ -42,7 +41,7 @@ public int Run(ParseResult parseResult)
_msBuildHandler = new(buildOptions, _actionQueue, _output);
TestModulesFilterHandler testModulesFilterHandler = new(_actionQueue, _output);
- _eventHandlers = new TestApplicationsEventHandlers(_executions, _output);
+ _eventHandlers = new TestApplicationsEventHandlers(_output);
if (testOptions.HasFilterMode)
{
@@ -114,7 +113,7 @@ private void SetupCancelKeyPressHandler()
private void InitializeOutput(int degreeOfParallelism, ParseResult parseResult, bool isHelp)
{
var console = new SystemConsole();
- var showPassedTests = parseResult.GetValue(TestingPlatformOptions.OutputOption) == OutputOptions.Detailed;
+ var showPassedTests = parseResult.GetValue(TestingPlatformOptions.OutputOption) == OutputOptions.Detailed;
var noProgress = parseResult.HasOption(TestingPlatformOptions.NoProgressOption);
var noAnsi = parseResult.HasOption(TestingPlatformOptions.NoAnsiOption);
_output = new TerminalTestReporter(console, new TerminalTestReporterOptions()
@@ -136,7 +135,6 @@ private void InitializeHelpActionQueue(int degreeOfParallelism, TestOptions test
testApp.HelpRequested += OnHelpRequested;
testApp.ErrorReceived += _eventHandlers.OnErrorReceived;
testApp.TestProcessExited += _eventHandlers.OnTestProcessExited;
- testApp.ExecutionIdReceived += _eventHandlers.OnExecutionIdReceived;
return await testApp.RunAsync(testOptions);
});
@@ -153,7 +151,6 @@ private void InitializeTestExecutionActionQueue(int degreeOfParallelism, TestOpt
testApp.SessionEventReceived += _eventHandlers.OnSessionEventReceived;
testApp.ErrorReceived += _eventHandlers.OnErrorReceived;
testApp.TestProcessExited += _eventHandlers.OnTestProcessExited;
- testApp.ExecutionIdReceived += _eventHandlers.OnExecutionIdReceived;
return await testApp.RunAsync(testOptions);
});
@@ -192,9 +189,6 @@ private void CompleteRun()
private void CleanUp()
{
_msBuildHandler?.Dispose();
- foreach (var execution in _executions)
- {
- execution.Key.Dispose();
- }
+ _eventHandlers?.Dispose();
}
}