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