From c63d6a46775bc7ccc60bd64139b1136d2a964b60 Mon Sep 17 00:00:00 2001
From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com>
Date: Tue, 21 Jul 2026 13:07:03 -0700
Subject: [PATCH 1/7] WIP: xUnit v3 + MTP migration (checkpoint before rebase
onto main)
Migrates 11 test projects + TestHelpers/CommonTestRunner from xUnit v2
(Arcade classic xunit.console) to xUnit v3 self-running MTP executables.
Deletes Skippable machinery; uses native Assert.Skip/SkipUnless.
Updates eng/build.ps1 + eng/build.sh test filters to MTP syntax.
SOS.UnitTests temporarily disabled in dirs.proj.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---
eng/build.ps1 | 9 ++-
eng/build.sh | 4 +-
.../AcquireDotNetTestStep.cs | 2 +-
.../AssertX.cs | 2 +-
.../BaseDebuggeeCompiler.cs | 2 +-
.../ConsoleTestOutputHelper.cs | 16 ++++-
.../CsprojBuildDebuggeeTestStep.cs | 2 +-
.../DebuggeeCompiler.cs | 2 +-
.../DotNetBuildDebuggeeTestStep.cs | 2 +-
.../FileTestOutputHelper.cs | 20 +++++-
.../IndentedTestOutputHelper.cs | 14 ++++-
.../LoggingListener.cs | 2 +-
.../Microsoft.Diagnostics.TestHelpers.csproj | 4 +-
.../MultiplexTestOutputHelper.cs | 32 +++++++++-
.../PrebuiltDebuggeeCompiler.cs | 2 +-
.../ProcessRunner.cs | 16 ++++-
.../RemoteExecutorHelper.cs | 2 +-
.../SdkPrebuiltDebuggeeCompiler.cs | 2 +-
.../TestOutputProcessLogger.cs | 2 +-
.../TestRunner.cs | 18 +++++-
.../TestStep.cs | 2 +-
.../Xunit.Extensions/SkipTestException.cs | 10 ++-
.../SkippableFactAttribute.cs | 10 ---
.../SkippableFactDiscoverer.cs | 24 -------
.../SkippableFactMessageBus.cs | 40 ------------
.../Xunit.Extensions/SkippableFactTestCase.cs | 37 -----------
.../SkippableTheoryAttribute.cs | 10 ---
.../SkippableTheoryDiscoverer.cs | 36 -----------
.../SkippableTheoryTestCase.cs | 38 ------------
src/tests/Common/MockConsole.cs | 3 +-
src/tests/CommonTestRunner/TestRunner.cs | 4 +-
.../CommonTestRunner/TestRunnerUtilities.cs | 2 +-
src/tests/DbgShim.UnitTests/DbgShimTests.cs | 25 ++++----
src/tests/DbgShim.UnitTests/DebuggeeInfo.cs | 1 -
src/tests/Directory.Build.props | 24 +++++++
.../ClrmaTests.cs | 5 +-
.../CommandServiceTests.cs | 4 +-
.../DebugServicesTests.cs | 9 ++-
.../RunTests.cs | 10 ++-
...nostics.ExtensionCommands.UnitTests.csproj | 4 --
.../AspNetTriggerUnitTests.cs | 1 -
.../DistributedTracesPipelineUnitTests.cs | 6 +-
.../EventCounterPipelineUnitTests.cs | 7 +--
.../EventCounterTriggerTests.cs | 3 +-
.../EventLogsPipelineUnitTests.cs | 17 +++--
.../EventTracePipelineUnitTests.cs | 8 +--
.../GlobMatcherTests.cs | 1 -
.../LogsPipelineUnitTests.cs | 4 +-
...tics.Monitoring.EventPipe.UnitTests.csproj | 1 -
.../PipelineTestUtilities.cs | 2 +-
...ft.Diagnostics.Monitoring.UnitTests.csproj | 1 -
.../PipelineTests.cs | 1 -
.../EventPipeSessionTests.cs | 21 +++----
.../GetProcessEnvironmentTests.cs | 7 +--
.../GetProcessInfoTests.cs | 9 ++-
.../GetPublishedProcessesTests.cs | 10 ++-
.../HandleableCollectionTests.cs | 1 -
...iagnostics.NETCore.Client.UnitTests.csproj | 1 -
.../PerfMapTests.cs | 7 +--
.../PidIpcEndpointTests.cs | 19 +++---
.../ReversedServerTests.cs | 17 +++--
.../KeyGeneratorTests.cs | 1 -
.../PEFileKeyGenerationTests.cs | 3 +-
.../SymbolStoreTests.cs | 1 -
.../Microsoft.SymbolStore.UnitTests/Tracer.cs | 2 +-
src/tests/dirs.proj | 6 ++
.../dotnet-counters/ConsoleExporterTests.cs | 1 -
.../CounterMonitorPayloadTests.cs | 11 ++--
src/tests/dotnet-trace/ChildProcessTests.cs | 9 ++-
.../CollectCommandFunctionalTests.cs | 3 +-
.../CollectLinuxCommandFunctionalTests.cs | 62 ++++++++++++-------
.../dotnet-trace/DotnetTrace.UnitTests.csproj | 4 --
src/tests/eventpipe/ContentionEvents.cs | 3 +-
src/tests/eventpipe/CustomEvents.cs | 3 +-
.../eventpipe/EventPipe.UnitTests.csproj | 1 -
src/tests/eventpipe/GCEvents.cs | 3 +-
src/tests/eventpipe/LoaderEvents.cs | 3 +-
src/tests/eventpipe/MethodEvents.cs | 3 +-
src/tests/eventpipe/ThreadPoolEvents.cs | 3 +-
.../common/RemoteTestExecutorHelper.cs | 2 +-
src/tests/eventpipe/providers.cs | 3 +-
81 files changed, 325 insertions(+), 399 deletions(-)
delete mode 100644 src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactAttribute.cs
delete mode 100644 src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactDiscoverer.cs
delete mode 100644 src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactMessageBus.cs
delete mode 100644 src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactTestCase.cs
delete mode 100644 src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableTheoryAttribute.cs
delete mode 100644 src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableTheoryDiscoverer.cs
delete mode 100644 src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableTheoryTestCase.cs
diff --git a/eng/build.ps1 b/eng/build.ps1
index 0f64647493..6b23e1bf96 100644
--- a/eng/build.ps1
+++ b/eng/build.ps1
@@ -114,14 +114,17 @@ if ($test) {
$env:SOS_TEST_INTERPRETER="true"
}
- # Build the test filter argument if provided
+ # Build the test filter argument if provided.
+ # Tests run as xUnit v3 / Microsoft.Testing.Platform executables, so use the MTP
+ # filter options (--filter-method / --filter-class) instead of the old xunit.console
+ # -method / -class flags.
# Use backslash-escaped quotes so they survive the additional quoting in tools.ps1
$testFilterArg = ''
if ($methodfilter -ne '') {
- $testFilterArg = "/p:TestRunnerAdditionalArguments=\`"-method $methodfilter\`""
+ $testFilterArg = "/p:TestRunnerAdditionalArguments=\`"--filter-method $methodfilter\`""
}
elseif ($classfilter -ne '') {
- $testFilterArg = "/p:TestRunnerAdditionalArguments=\`"-class $classfilter\`""
+ $testFilterArg = "/p:TestRunnerAdditionalArguments=\`"--filter-class $classfilter\`""
}
# When the managed build was skipped (e.g. the test-only CI legs that download prebuilt
diff --git a/eng/build.sh b/eng/build.sh
index 76a5874586..31dd55f152 100755
--- a/eng/build.sh
+++ b/eng/build.sh
@@ -108,12 +108,12 @@ handle_arguments() {
;;
methodfilter|-methodfilter)
- __TestFilter="-method $2"
+ __TestFilter="--filter-method $2"
__ShiftArgs=1
;;
classfilter|-classfilter)
- __TestFilter="-class $2"
+ __TestFilter="--filter-class $2"
__ShiftArgs=1
;;
diff --git a/src/Microsoft.Diagnostics.TestHelpers/AcquireDotNetTestStep.cs b/src/Microsoft.Diagnostics.TestHelpers/AcquireDotNetTestStep.cs
index 1bdb2cccbc..1c257442b4 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/AcquireDotNetTestStep.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/AcquireDotNetTestStep.cs
@@ -6,7 +6,7 @@
using System.IO.Compression;
using System.Net.Http;
using System.Threading.Tasks;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
diff --git a/src/Microsoft.Diagnostics.TestHelpers/AssertX.cs b/src/Microsoft.Diagnostics.TestHelpers/AssertX.cs
index cbb1a9455a..1b107644b0 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/AssertX.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/AssertX.cs
@@ -3,7 +3,7 @@
using System;
using System.IO;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
diff --git a/src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs b/src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs
index d5db5c5086..a66107ab9b 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs
@@ -5,7 +5,7 @@
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
diff --git a/src/Microsoft.Diagnostics.TestHelpers/ConsoleTestOutputHelper.cs b/src/Microsoft.Diagnostics.TestHelpers/ConsoleTestOutputHelper.cs
index 4ea7b609ee..8a84579605 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/ConsoleTestOutputHelper.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/ConsoleTestOutputHelper.cs
@@ -2,12 +2,26 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
public class ConsoleTestOutputHelper : ITestOutputHelper
{
+ public string Output => string.Empty;
+
+ public void Write(string message)
+ {
+ Console.Write(message);
+ Console.Out.Flush();
+ }
+
+ public void Write(string format, params object[] args)
+ {
+ Console.Write(format, args);
+ Console.Out.Flush();
+ }
+
public void WriteLine(string message)
{
Console.WriteLine(message);
diff --git a/src/Microsoft.Diagnostics.TestHelpers/CsprojBuildDebuggeeTestStep.cs b/src/Microsoft.Diagnostics.TestHelpers/CsprojBuildDebuggeeTestStep.cs
index f17a0d9e00..6b1fb64b65 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/CsprojBuildDebuggeeTestStep.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/CsprojBuildDebuggeeTestStep.cs
@@ -5,7 +5,7 @@
using System.IO;
using System.Threading.Tasks;
using System.Xml.Linq;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
diff --git a/src/Microsoft.Diagnostics.TestHelpers/DebuggeeCompiler.cs b/src/Microsoft.Diagnostics.TestHelpers/DebuggeeCompiler.cs
index ce74a318ea..be34d38f37 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/DebuggeeCompiler.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/DebuggeeCompiler.cs
@@ -3,7 +3,7 @@
using System;
using System.Threading.Tasks;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
diff --git a/src/Microsoft.Diagnostics.TestHelpers/DotNetBuildDebuggeeTestStep.cs b/src/Microsoft.Diagnostics.TestHelpers/DotNetBuildDebuggeeTestStep.cs
index 3df7b4a512..0839fc80b8 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/DotNetBuildDebuggeeTestStep.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/DotNetBuildDebuggeeTestStep.cs
@@ -7,7 +7,7 @@
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
diff --git a/src/Microsoft.Diagnostics.TestHelpers/FileTestOutputHelper.cs b/src/Microsoft.Diagnostics.TestHelpers/FileTestOutputHelper.cs
index e3eba6f5cf..2d553231cb 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/FileTestOutputHelper.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/FileTestOutputHelper.cs
@@ -3,7 +3,7 @@
using System;
using System.IO;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
@@ -24,6 +24,24 @@ public FileTestOutputHelper(string logFilePath, FileMode fileMode = FileMode.Cre
_lock = new object();
}
+ public string Output => string.Empty;
+
+ public void Write(string message)
+ {
+ lock (_lock)
+ {
+ _logWriter.Write(message);
+ }
+ }
+
+ public void Write(string format, params object[] args)
+ {
+ lock (_lock)
+ {
+ _logWriter.Write(format, args);
+ }
+ }
+
public void WriteLine(string message)
{
lock (_lock)
diff --git a/src/Microsoft.Diagnostics.TestHelpers/IndentedTestOutputHelper.cs b/src/Microsoft.Diagnostics.TestHelpers/IndentedTestOutputHelper.cs
index 8e60b403a7..e56796afce 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/IndentedTestOutputHelper.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/IndentedTestOutputHelper.cs
@@ -1,7 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
@@ -20,6 +20,18 @@ public IndentedTestOutputHelper(ITestOutputHelper innerOutput, string indentText
_indentText = indentText;
}
+ public string Output => _output.Output;
+
+ public void Write(string message)
+ {
+ _output.Write(_indentText + message);
+ }
+
+ public void Write(string format, params object[] args)
+ {
+ _output.Write(_indentText + format, args);
+ }
+
public void WriteLine(string message)
{
_output.WriteLine(_indentText + message);
diff --git a/src/Microsoft.Diagnostics.TestHelpers/LoggingListener.cs b/src/Microsoft.Diagnostics.TestHelpers/LoggingListener.cs
index 991325b862..61c0216206 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/LoggingListener.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/LoggingListener.cs
@@ -4,7 +4,7 @@
using System;
using System.Diagnostics;
using Microsoft.Diagnostics.DebugServices.Implementation;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
diff --git a/src/Microsoft.Diagnostics.TestHelpers/Microsoft.Diagnostics.TestHelpers.csproj b/src/Microsoft.Diagnostics.TestHelpers/Microsoft.Diagnostics.TestHelpers.csproj
index 4e3df14e84..382974308f 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/Microsoft.Diagnostics.TestHelpers.csproj
+++ b/src/Microsoft.Diagnostics.TestHelpers/Microsoft.Diagnostics.TestHelpers.csproj
@@ -14,8 +14,8 @@
-
-
+
+
diff --git a/src/Microsoft.Diagnostics.TestHelpers/MultiplexTestOutputHelper.cs b/src/Microsoft.Diagnostics.TestHelpers/MultiplexTestOutputHelper.cs
index 539398e8fe..a85c695af6 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/MultiplexTestOutputHelper.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/MultiplexTestOutputHelper.cs
@@ -1,7 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using Xunit.Abstractions;
+using System.Text;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
@@ -14,6 +15,35 @@ public MultiplexTestOutputHelper(params ITestOutputHelper[] outputs)
_outputs = outputs;
}
+ public string Output
+ {
+ get
+ {
+ StringBuilder builder = new();
+ foreach (ITestOutputHelper output in _outputs)
+ {
+ builder.Append(output.Output);
+ }
+ return builder.ToString();
+ }
+ }
+
+ public void Write(string message)
+ {
+ foreach (ITestOutputHelper output in _outputs)
+ {
+ output.Write(message);
+ }
+ }
+
+ public void Write(string format, params object[] args)
+ {
+ foreach (ITestOutputHelper output in _outputs)
+ {
+ output.Write(format, args);
+ }
+ }
+
public void WriteLine(string message)
{
foreach (ITestOutputHelper output in _outputs)
diff --git a/src/Microsoft.Diagnostics.TestHelpers/PrebuiltDebuggeeCompiler.cs b/src/Microsoft.Diagnostics.TestHelpers/PrebuiltDebuggeeCompiler.cs
index 218aa5196c..429e3aa9e9 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/PrebuiltDebuggeeCompiler.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/PrebuiltDebuggeeCompiler.cs
@@ -3,7 +3,7 @@
using System.IO;
using System.Threading.Tasks;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
diff --git a/src/Microsoft.Diagnostics.TestHelpers/ProcessRunner.cs b/src/Microsoft.Diagnostics.TestHelpers/ProcessRunner.cs
index fde12ad22a..f82ba75a3d 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/ProcessRunner.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/ProcessRunner.cs
@@ -9,7 +9,7 @@
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
@@ -489,6 +489,20 @@ public ConsoleTestOutputHelper(ITestOutputHelper output)
_output = output;
}
+ public string Output => _output?.Output ?? string.Empty;
+
+ public void Write(string message)
+ {
+ Console.Write(message);
+ _output?.Write(message);
+ }
+
+ public void Write(string format, params object[] args)
+ {
+ Console.Write(format, args);
+ _output?.Write(format, args);
+ }
+
public void WriteLine(string message)
{
Console.WriteLine(message);
diff --git a/src/Microsoft.Diagnostics.TestHelpers/RemoteExecutorHelper.cs b/src/Microsoft.Diagnostics.TestHelpers/RemoteExecutorHelper.cs
index 1ba0c666e6..61ed34e370 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/RemoteExecutorHelper.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/RemoteExecutorHelper.cs
@@ -8,7 +8,7 @@
using System.Threading.Tasks;
using Microsoft.Diagnostics.NETCore.Client;
using Microsoft.DotNet.RemoteExecutor;
-using Xunit.Abstractions;
+using Xunit;
using Xunit.Sdk;
namespace Microsoft.Diagnostics.TestHelpers
diff --git a/src/Microsoft.Diagnostics.TestHelpers/SdkPrebuiltDebuggeeCompiler.cs b/src/Microsoft.Diagnostics.TestHelpers/SdkPrebuiltDebuggeeCompiler.cs
index ebc4105d43..4417d92ddc 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/SdkPrebuiltDebuggeeCompiler.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/SdkPrebuiltDebuggeeCompiler.cs
@@ -3,7 +3,7 @@
using System.IO;
using System.Threading.Tasks;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
diff --git a/src/Microsoft.Diagnostics.TestHelpers/TestOutputProcessLogger.cs b/src/Microsoft.Diagnostics.TestHelpers/TestOutputProcessLogger.cs
index 426abef2d8..1242d158d4 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/TestOutputProcessLogger.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/TestOutputProcessLogger.cs
@@ -5,7 +5,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
diff --git a/src/Microsoft.Diagnostics.TestHelpers/TestRunner.cs b/src/Microsoft.Diagnostics.TestHelpers/TestRunner.cs
index 433eb94e0b..7bf8216c0e 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/TestRunner.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/TestRunner.cs
@@ -7,7 +7,7 @@
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
@@ -165,6 +165,22 @@ public OutputHelper(ITestOutputHelper output, FileTestOutputHelper fileLogger, C
IndentedOutput = new IndentedTestOutputHelper(this);
}
+ public string Output => _output.Output;
+
+ public void Write(string message)
+ {
+ _output.Write(message);
+ _fileLogger?.Write(message);
+ _consoleLogger?.Write(message);
+ }
+
+ public void Write(string format, params object[] args)
+ {
+ _output.Write(format, args);
+ _fileLogger?.Write(format, args);
+ _consoleLogger?.Write(format, args);
+ }
+
public void WriteLine(string message)
{
_output.WriteLine(message);
diff --git a/src/Microsoft.Diagnostics.TestHelpers/TestStep.cs b/src/Microsoft.Diagnostics.TestHelpers/TestStep.cs
index edcd180c49..98e47c99bd 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/TestStep.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/TestStep.cs
@@ -10,7 +10,7 @@
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.TestHelpers
{
diff --git a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkipTestException.cs b/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkipTestException.cs
index ee26f404b7..104a4be1fe 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkipTestException.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkipTestException.cs
@@ -5,9 +5,17 @@
namespace Xunit.Extensions
{
+ ///
+ /// Exception that dynamically skips a test under xUnit v3. The message is prefixed
+ /// with the dynamic-skip token so the xUnit v3 runner reports the test as skipped
+ /// (the same mechanism used by Assert.Skip) instead of failed.
+ ///
public class SkipTestException : Exception
{
+ // Mirrors the internal Xunit.Sdk.DynamicSkipToken.Value constant from xunit.v3.assert.
+ private const string DynamicSkipToken = "$XunitDynamicSkip$";
+
public SkipTestException(string reason)
- : base(reason) { }
+ : base(DynamicSkipToken + reason) { }
}
}
diff --git a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactAttribute.cs b/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactAttribute.cs
deleted file mode 100644
index b6b44f497b..0000000000
--- a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactAttribute.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Xunit.Sdk;
-
-namespace Xunit.Extensions
-{
- [XunitTestCaseDiscoverer("Xunit.Extensions.SkippableFactDiscoverer", "Microsoft.Diagnostics.TestHelpers")]
- public class SkippableFactAttribute : FactAttribute { }
-}
diff --git a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactDiscoverer.cs b/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactDiscoverer.cs
deleted file mode 100644
index 9451db2b8b..0000000000
--- a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactDiscoverer.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-// 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.Generic;
-using Xunit.Abstractions;
-using Xunit.Sdk;
-
-namespace Xunit.Extensions
-{
- public class SkippableFactDiscoverer : IXunitTestCaseDiscoverer
- {
- private readonly IMessageSink diagnosticMessageSink;
-
- public SkippableFactDiscoverer(IMessageSink diagnosticMessageSink)
- {
- this.diagnosticMessageSink = diagnosticMessageSink;
- }
-
- public IEnumerable Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute)
- {
- yield return new SkippableFactTestCase(diagnosticMessageSink, discoveryOptions.MethodDisplayOrDefault(), discoveryOptions.MethodDisplayOptionsOrDefault(), testMethod);
- }
- }
-}
diff --git a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactMessageBus.cs b/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactMessageBus.cs
deleted file mode 100644
index b48add3a3e..0000000000
--- a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactMessageBus.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Linq;
-using Xunit.Abstractions;
-using Xunit.Sdk;
-
-namespace Xunit.Extensions
-{
- public class SkippableFactMessageBus : IMessageBus
- {
- private readonly IMessageBus innerBus;
-
- public SkippableFactMessageBus(IMessageBus innerBus)
- {
- this.innerBus = innerBus;
- }
-
- public int DynamicallySkippedTestCount { get; private set; }
-
- public void Dispose() { }
-
- public bool QueueMessage(IMessageSinkMessage message)
- {
- ITestFailed testFailed = message as ITestFailed;
- if (testFailed != null)
- {
- string exceptionType = testFailed.ExceptionTypes.FirstOrDefault();
- if (exceptionType == typeof(SkipTestException).FullName)
- {
- DynamicallySkippedTestCount++;
- return innerBus.QueueMessage(new TestSkipped(testFailed.Test, testFailed.Messages.FirstOrDefault()));
- }
- }
-
- // Nothing we care about, send it on its way
- return innerBus.QueueMessage(message);
- }
- }
-}
diff --git a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactTestCase.cs b/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactTestCase.cs
deleted file mode 100644
index b56c76341c..0000000000
--- a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableFactTestCase.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using Xunit.Abstractions;
-using Xunit.Sdk;
-
-namespace Xunit.Extensions
-{
- public class SkippableFactTestCase : XunitTestCase
- {
- [Obsolete("Called by the de-serializer; should only be called by deriving classes for de-serialization purposes")]
- public SkippableFactTestCase() { }
-
- public SkippableFactTestCase(IMessageSink diagnosticMessageSink, TestMethodDisplay defaultMethodDisplay, TestMethodDisplayOptions defaultMethodDisplayOptions, ITestMethod testMethod, object[] testMethodArguments = null)
- : base(diagnosticMessageSink, defaultMethodDisplay, defaultMethodDisplayOptions, testMethod, testMethodArguments) { }
-
- public override async Task RunAsync(IMessageSink diagnosticMessageSink,
- IMessageBus messageBus,
- object[] constructorArguments,
- ExceptionAggregator aggregator,
- CancellationTokenSource cancellationTokenSource)
- {
- SkippableFactMessageBus skipMessageBus = new(messageBus);
- RunSummary result = await base.RunAsync(diagnosticMessageSink, skipMessageBus, constructorArguments, aggregator, cancellationTokenSource).ConfigureAwait(false);
- if (skipMessageBus.DynamicallySkippedTestCount > 0)
- {
- result.Failed -= skipMessageBus.DynamicallySkippedTestCount;
- result.Skipped += skipMessageBus.DynamicallySkippedTestCount;
- }
-
- return result;
- }
- }
-}
diff --git a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableTheoryAttribute.cs b/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableTheoryAttribute.cs
deleted file mode 100644
index 444c40e098..0000000000
--- a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableTheoryAttribute.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Xunit.Sdk;
-
-namespace Xunit.Extensions
-{
- [XunitTestCaseDiscoverer("Xunit.Extensions.SkippableTheoryDiscoverer", "Microsoft.Diagnostics.TestHelpers")]
- public class SkippableTheoryAttribute : TheoryAttribute { }
-}
diff --git a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableTheoryDiscoverer.cs b/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableTheoryDiscoverer.cs
deleted file mode 100644
index ed91b555ee..0000000000
--- a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableTheoryDiscoverer.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-// 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.Generic;
-using System.Linq;
-using Xunit.Abstractions;
-using Xunit.Sdk;
-
-namespace Xunit.Extensions
-{
- public class SkippableTheoryDiscoverer : IXunitTestCaseDiscoverer
- {
- private readonly IMessageSink diagnosticMessageSink;
- private readonly TheoryDiscoverer theoryDiscoverer;
-
- public SkippableTheoryDiscoverer(IMessageSink diagnosticMessageSink)
- {
- this.diagnosticMessageSink = diagnosticMessageSink;
-
- theoryDiscoverer = new TheoryDiscoverer(diagnosticMessageSink);
- }
-
- public IEnumerable Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute)
- {
- TestMethodDisplay defaultMethodDisplay = discoveryOptions.MethodDisplayOrDefault();
- TestMethodDisplayOptions defaultMethodDisplayOptions = discoveryOptions.MethodDisplayOptionsOrDefault();
-
- // Unlike fact discovery, the underlying algorithm for theories is complex, so we let the theory discoverer
- // do its work, and do a little on-the-fly conversion into our own test cases.
- return theoryDiscoverer.Discover(discoveryOptions, testMethod, factAttribute)
- .Select(testCase => testCase is XunitTheoryTestCase
- ? (IXunitTestCase)new SkippableTheoryTestCase(diagnosticMessageSink, defaultMethodDisplay, defaultMethodDisplayOptions, testCase.TestMethod)
- : new SkippableFactTestCase(diagnosticMessageSink, defaultMethodDisplay, defaultMethodDisplayOptions, testCase.TestMethod, testCase.TestMethodArguments));
- }
- }
-}
diff --git a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableTheoryTestCase.cs b/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableTheoryTestCase.cs
deleted file mode 100644
index 9dc34df816..0000000000
--- a/src/Microsoft.Diagnostics.TestHelpers/Xunit.Extensions/SkippableTheoryTestCase.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using Xunit.Abstractions;
-using Xunit.Sdk;
-
-namespace Xunit.Extensions
-{
- public class SkippableTheoryTestCase : XunitTheoryTestCase
- {
- [Obsolete("Called by the de-serializer; should only be called by deriving classes for de-serialization purposes")]
- public SkippableTheoryTestCase() { }
-
- public SkippableTheoryTestCase(IMessageSink diagnosticMessageSink, TestMethodDisplay defaultMethodDisplay, TestMethodDisplayOptions defaultMethodDisplayOptions, ITestMethod testMethod)
- : base(diagnosticMessageSink, defaultMethodDisplay, defaultMethodDisplayOptions, testMethod) { }
-
- public override async Task RunAsync(IMessageSink diagnosticMessageSink,
- IMessageBus messageBus,
- object[] constructorArguments,
- ExceptionAggregator aggregator,
- CancellationTokenSource cancellationTokenSource)
- {
- // Duplicated code from SkippableFactTestCase. I'm sure we could find a way to de-dup with some thought.
- SkippableFactMessageBus skipMessageBus = new(messageBus);
- RunSummary result = await base.RunAsync(diagnosticMessageSink, skipMessageBus, constructorArguments, aggregator, cancellationTokenSource).ConfigureAwait(false);
- if (skipMessageBus.DynamicallySkippedTestCount > 0)
- {
- result.Failed -= skipMessageBus.DynamicallySkippedTestCount;
- result.Skipped += skipMessageBus.DynamicallySkippedTestCount;
- }
-
- return result;
- }
- }
-}
diff --git a/src/tests/Common/MockConsole.cs b/src/tests/Common/MockConsole.cs
index 9b864a71f7..bd201805c4 100644
--- a/src/tests/Common/MockConsole.cs
+++ b/src/tests/Common/MockConsole.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -7,7 +7,6 @@
using System.Text;
using Microsoft.Diagnostics.Tools.Common;
using Xunit;
-using Xunit.Abstractions;
namespace Microsoft.Diagnostics.Tests.Common
{
diff --git a/src/tests/CommonTestRunner/TestRunner.cs b/src/tests/CommonTestRunner/TestRunner.cs
index e42383cc5b..76d0482e95 100644
--- a/src/tests/CommonTestRunner/TestRunner.cs
+++ b/src/tests/CommonTestRunner/TestRunner.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -14,7 +14,7 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Diagnostics.TestHelpers;
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.Diagnostics.CommonTestRunner
{
diff --git a/src/tests/CommonTestRunner/TestRunnerUtilities.cs b/src/tests/CommonTestRunner/TestRunnerUtilities.cs
index 7cbc88b264..ff3ce88574 100644
--- a/src/tests/CommonTestRunner/TestRunnerUtilities.cs
+++ b/src/tests/CommonTestRunner/TestRunnerUtilities.cs
@@ -5,7 +5,7 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Diagnostics.TestHelpers;
-using Xunit.Abstractions;
+using Xunit;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
namespace CommonTestRunner
diff --git a/src/tests/DbgShim.UnitTests/DbgShimTests.cs b/src/tests/DbgShim.UnitTests/DbgShimTests.cs
index 118cf2527c..27140e75c1 100644
--- a/src/tests/DbgShim.UnitTests/DbgShimTests.cs
+++ b/src/tests/DbgShim.UnitTests/DbgShimTests.cs
@@ -16,7 +16,6 @@
using Microsoft.Diagnostics.TestHelpers;
using SOS.Hosting;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
// Newer SDKs flag MemberData(nameof(Configurations)) with this error
@@ -49,7 +48,7 @@ public DbgShimTests(ITestOutputHelper output)
///
/// Test RegisterForRuntimeStartup for launch
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task Launch1(TestConfiguration config)
{
await RemoteInvoke(config, nameof(Launch1), static async (string configXml) => {
@@ -65,7 +64,7 @@ await RemoteInvoke(config, nameof(Launch1), static async (string configXml) => {
///
/// Test RegisterForRuntimeStartupEx for launch
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task Launch2(TestConfiguration config)
{
await RemoteInvoke(config, nameof(Launch2), static async (string configXml) => {
@@ -81,7 +80,7 @@ await RemoteInvoke(config, nameof(Launch2), static async (string configXml) => {
///
/// Test RegisterForRuntimeStartup3 for launch
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task Launch3(TestConfiguration config)
{
if (OS.Kind == OSKind.OSX && config.PublishSingleFile)
@@ -106,7 +105,7 @@ await RemoteInvoke(config, nameof(Launch3), static async (string configXml) => {
///
/// Test RegisterForRuntimeStartup for attach
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task Attach1(TestConfiguration config)
{
await RemoteInvoke(config, nameof(Attach1), static async (string configXml) => {
@@ -119,7 +118,7 @@ await RemoteInvoke(config, nameof(Attach1), static async (string configXml) => {
///
/// Test RegisterForRuntimeStartupEx for attach
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task Attach2(TestConfiguration config)
{
await RemoteInvoke(config, nameof(Attach2), static async (string configXml) => {
@@ -132,7 +131,7 @@ await RemoteInvoke(config, nameof(Attach2), static async (string configXml) => {
///
/// Test RegisterForRuntimeStartup3 for attach
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task Attach3(TestConfiguration config)
{
if (OS.Kind == OSKind.OSX && config.PublishSingleFile)
@@ -154,7 +153,7 @@ await RemoteInvoke(config, nameof(Attach3), static async (string configXml) => {
///
/// Test EnumerateCLRs/CloseCLREnumeration
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task EnumerateCLRs(TestConfiguration config)
{
await RemoteInvoke(config, nameof(EnumerateCLRs), static async (string configXml) => {
@@ -178,7 +177,7 @@ await RemoteInvoke(config, nameof(EnumerateCLRs), static async (string configXml
///
/// Test CreateVersionStringFromModule/CreateDebuggingInterfaceFromVersion
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task CreateDebuggingInterfaceFromVersion(TestConfiguration config)
{
await RemoteInvoke(config, nameof(CreateDebuggingInterfaceFromVersion), static async (string configXml) => {
@@ -191,7 +190,7 @@ await RemoteInvoke(config, nameof(CreateDebuggingInterfaceFromVersion), static a
///
/// Test CreateVersionStringFromModule/CreateDebuggingInterfaceFromVersionEx
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task CreateDebuggingInterfaceFromVersionEx(TestConfiguration config)
{
await RemoteInvoke(config, nameof(CreateDebuggingInterfaceFromVersionEx), static async (string configXml) => {
@@ -204,7 +203,7 @@ await RemoteInvoke(config, nameof(CreateDebuggingInterfaceFromVersionEx), static
///
/// Test CreateVersionStringFromModule/CreateDebuggingInterfaceFromVersion2
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task CreateDebuggingInterfaceFromVersion2(TestConfiguration config)
{
await RemoteInvoke(config, nameof(CreateDebuggingInterfaceFromVersion2), static async (string configXml) => {
@@ -217,7 +216,7 @@ await RemoteInvoke(config, nameof(CreateDebuggingInterfaceFromVersion2), static
///
/// Test CreateVersionStringFromModule/CreateDebuggingInterfaceFromVersion3
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task CreateDebuggingInterfaceFromVersion3(TestConfiguration config)
{
if (OS.Kind == OSKind.OSX && config.PublishSingleFile)
@@ -236,7 +235,7 @@ await RemoteInvoke(config, nameof(CreateDebuggingInterfaceFromVersion3), static
});
}
- [SkippableTheory, MemberData(nameof(GetConfigurations), "TestName", "OpenVirtualProcess")]
+ [Theory, MemberData(nameof(GetConfigurations), "TestName", "OpenVirtualProcess")]
public async Task OpenVirtualProcess(TestConfiguration config)
{
// The current Linux test assets are not alpine/musl
diff --git a/src/tests/DbgShim.UnitTests/DebuggeeInfo.cs b/src/tests/DbgShim.UnitTests/DebuggeeInfo.cs
index 48588a6c64..346f97a488 100644
--- a/src/tests/DbgShim.UnitTests/DebuggeeInfo.cs
+++ b/src/tests/DbgShim.UnitTests/DebuggeeInfo.cs
@@ -9,7 +9,6 @@
using Microsoft.Diagnostics.Runtime.Utilities;
using Microsoft.Diagnostics.TestHelpers;
using Xunit;
-using Xunit.Abstractions;
namespace Microsoft.Diagnostics
{
diff --git a/src/tests/Directory.Build.props b/src/tests/Directory.Build.props
index e36d68d633..45bbcf4ff9 100644
--- a/src/tests/Directory.Build.props
+++ b/src/tests/Directory.Build.props
@@ -1,3 +1,27 @@
+
+
+
+ XUnitV3
+ Exe
+
+ $(NoWarn);xUnit1051;xUnit1031
+
diff --git a/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/ClrmaTests.cs b/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/ClrmaTests.cs
index 3be29ffc2c..9cc9c123d2 100644
--- a/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/ClrmaTests.cs
+++ b/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/ClrmaTests.cs
@@ -8,7 +8,6 @@
using System.Linq;
using Microsoft.Diagnostics.TestHelpers;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
// Newer SDKs flag MemberData(nameof(Configurations)) with this error
@@ -51,7 +50,7 @@ private static readonly (string, int)[] s_clrmaFilterList = [
( "Unable to load image ", 1 ),
];
- [SkippableTheory, MemberData(nameof(GetConfigurations))]
+ [Theory, MemberData(nameof(GetConfigurations))]
public void BangClrmaTests(TestHost host)
{
ITarget target = host.Target;
@@ -137,7 +136,7 @@ private static readonly (string, int)[] s_analyzeFilterList = [
( "Unable to load image ", 1 ),
];
- [SkippableTheory, MemberData(nameof(GetConfigurations))]
+ [Theory, MemberData(nameof(GetConfigurations))]
public void BangAnalyzeTests(TestHost host)
{
ITarget target = host.Target;
diff --git a/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/CommandServiceTests.cs b/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/CommandServiceTests.cs
index e70a57ced8..378b4b9879 100644
--- a/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/CommandServiceTests.cs
+++ b/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/CommandServiceTests.cs
@@ -7,8 +7,6 @@
using Microsoft.Diagnostics.DebugServices.Implementation;
using Microsoft.Diagnostics.TestHelpers;
using Xunit;
-using Xunit.Abstractions;
-using Xunit.Extensions;
[assembly: SuppressMessage("Performance", "CA1825:Avoid zero-length array allocations.", Justification = "")]
@@ -43,7 +41,7 @@ public CommandServiceTests(ITestOutputHelper output)
void IDisposable.Dispose() => Trace.Listeners.Remove(ListenerName);
- [SkippableTheory, MemberData(nameof(GetConfiguration))]
+ [Theory, MemberData(nameof(GetConfiguration))]
public void CommandServiceTest1(TestConfiguration config)
{
using TestDump testDump = new(config);
diff --git a/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/DebugServicesTests.cs b/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/DebugServicesTests.cs
index 9c56848cd8..dc6b48411d 100644
--- a/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/DebugServicesTests.cs
+++ b/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/DebugServicesTests.cs
@@ -11,7 +11,6 @@
using Microsoft.Diagnostics.Runtime;
using Microsoft.Diagnostics.TestHelpers;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
// Newer SDKs flag MemberData(nameof(Configurations)) with this error
@@ -59,7 +58,7 @@ public DebugServicesTests(ITestOutputHelper output)
void IDisposable.Dispose() => Trace.Listeners.Remove(ListenerName);
- [SkippableTheory, MemberData(nameof(GetConfigurations))]
+ [Theory, MemberData(nameof(GetConfigurations))]
public void TargetTests(TestHost host)
{
ITarget target = host.Target;
@@ -73,7 +72,7 @@ public void TargetTests(TestHost host)
host.TestData.CompareMembers(host.TestData.Target, target);
}
- [SkippableTheory, MemberData(nameof(GetConfigurations))]
+ [Theory, MemberData(nameof(GetConfigurations))]
public void ModuleTests(TestHost host)
{
IModuleService moduleService = host.Target.Services.GetService();
@@ -219,7 +218,7 @@ public void ModuleTests(TestHost host)
}
}
- [SkippableTheory, MemberData(nameof(GetConfigurations))]
+ [Theory, MemberData(nameof(GetConfigurations))]
public void ThreadTests(TestHost host)
{
IThreadService threadService = host.Target.Services.GetService();
@@ -262,7 +261,7 @@ public void ThreadTests(TestHost host)
}
}
- [SkippableTheory, MemberData(nameof(GetConfigurations))]
+ [Theory, MemberData(nameof(GetConfigurations))]
public void RuntimeTests(TestHost host)
{
// The current Linux test assets are not alpine/musl
diff --git a/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/RunTests.cs b/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/RunTests.cs
index c2299c85bf..1f5de90dbe 100644
--- a/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/RunTests.cs
+++ b/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/RunTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -12,7 +12,7 @@
using Microsoft.Diagnostics.DebugServices.Implementation;
using Microsoft.Diagnostics.TestHelpers;
using SOS.Extensions;
-using Xunit.Abstractions;
+using Xunit;
using Xunit.Extensions;
namespace Microsoft.Diagnostics.DebugServices.UnitTests
@@ -126,6 +126,12 @@ public override void Invoke()
#region ITestOutputHelper
+ string ITestOutputHelper.Output => string.Empty;
+
+ void ITestOutputHelper.Write(string message) => Write(message);
+
+ void ITestOutputHelper.Write(string format, params object[] args) => Write(string.Format(format, args));
+
void ITestOutputHelper.WriteLine(string message) => WriteLine(message);
void ITestOutputHelper.WriteLine(string format, params object[] args) => WriteLine(format, args);
diff --git a/src/tests/Microsoft.Diagnostics.ExtensionCommands.UnitTests/Microsoft.Diagnostics.ExtensionCommands.UnitTests.csproj b/src/tests/Microsoft.Diagnostics.ExtensionCommands.UnitTests/Microsoft.Diagnostics.ExtensionCommands.UnitTests.csproj
index 9d28481712..7d2e0eef1a 100644
--- a/src/tests/Microsoft.Diagnostics.ExtensionCommands.UnitTests/Microsoft.Diagnostics.ExtensionCommands.UnitTests.csproj
+++ b/src/tests/Microsoft.Diagnostics.ExtensionCommands.UnitTests/Microsoft.Diagnostics.ExtensionCommands.UnitTests.csproj
@@ -5,10 +5,6 @@
false
-
-
-
-
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/AspNetTriggerUnitTests.cs b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/AspNetTriggerUnitTests.cs
index c29c1ee092..8995438378 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/AspNetTriggerUnitTests.cs
+++ b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/AspNetTriggerUnitTests.cs
@@ -5,7 +5,6 @@
using System.ComponentModel.DataAnnotations;
using Microsoft.Diagnostics.Monitoring.EventPipe.Triggers.AspNet;
using Xunit;
-using Xunit.Abstractions;
namespace Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests
{
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/DistributedTracesPipelineUnitTests.cs b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/DistributedTracesPipelineUnitTests.cs
index d50db93c79..e8fb5d33c5 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/DistributedTracesPipelineUnitTests.cs
+++ b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/DistributedTracesPipelineUnitTests.cs
@@ -12,8 +12,6 @@
using Microsoft.Diagnostics.NETCore.Client;
using Microsoft.Diagnostics.TestHelpers;
using Xunit;
-using Xunit.Abstractions;
-using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
namespace Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests
@@ -29,7 +27,7 @@ public DistributedTracesPipelineUnitTests(ITestOutputHelper output)
_output = output;
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestTracesPipeline(TestConfiguration config)
{
TestActivityLogger logger = new();
@@ -80,7 +78,7 @@ await PipelineTestUtilities.ExecutePipelineWithTracee(
Assert.Equal("18", tags["custom.tag.int"]);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestTracesPipelineWithSamplingRatio(TestConfiguration config)
{
TestActivityLogger logger = new();
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventCounterPipelineUnitTests.cs b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventCounterPipelineUnitTests.cs
index 2fb091ea9b..1f0e5f47e6 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventCounterPipelineUnitTests.cs
+++ b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventCounterPipelineUnitTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// 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.Generic;
@@ -8,7 +8,6 @@
using Microsoft.Diagnostics.NETCore.Client;
using Microsoft.Diagnostics.TestHelpers;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
@@ -119,7 +118,7 @@ public Task PipelineStarted(CancellationToken token)
public Task PipelineStopped(CancellationToken token) => Task.CompletedTask;
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestCounterEventPipeline(TestConfiguration config)
{
string[] expectedCounters = new[] { "cpu-usage", "working-set" };
@@ -162,7 +161,7 @@ await PipelineTestUtilities.ExecutePipelineWithTracee(
Assert.True(logger.Metrics.All(m => string.Equals(m.CounterMetadata.ProviderName, expectedProvider)));
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestDuplicateNameMetrics(TestConfiguration config)
{
if (config.RuntimeFrameworkVersionMajor < 9)
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventCounterTriggerTests.cs b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventCounterTriggerTests.cs
index def5d754ab..7222de06d4 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventCounterTriggerTests.cs
+++ b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventCounterTriggerTests.cs
@@ -12,7 +12,6 @@
using Microsoft.Diagnostics.NETCore.Client;
using Microsoft.Diagnostics.TestHelpers;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
@@ -321,7 +320,7 @@ public void EventCounterTriggerDropTest()
/// Tests that the trigger condition can be detected on a live application
/// using the EventPipeTriggerPipeline.
///
- [SkippableTheory(Skip = "https://github.com/dotnet/diagnostics/issues/4782"), MemberData(nameof(Configurations))]
+ [Theory(Skip = "https://github.com/dotnet/diagnostics/issues/4782"), MemberData(nameof(Configurations))]
public async Task EventCounterTriggerWithEventPipePipelineTest(TestConfiguration config)
{
if (config.RuntimeFrameworkVersionMajor < 6)
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventLogsPipelineUnitTests.cs b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventLogsPipelineUnitTests.cs
index 1b1d00e0e8..25a839b2ee 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventLogsPipelineUnitTests.cs
+++ b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventLogsPipelineUnitTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -12,7 +12,6 @@
using Microsoft.Diagnostics.TestHelpers;
using Microsoft.Extensions.Logging;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
@@ -40,7 +39,7 @@ public EventLogsPipelineUnitTests(ITestOutputHelper output)
///
/// Test that all log events are collected if no filters are specified.
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestLogsAllCategoriesAllLevels(TestConfiguration config)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
@@ -68,7 +67,7 @@ public async Task TestLogsAllCategoriesAllLevels(TestConfiguration config)
///
/// Test that log events at or above the default level are collected.
///
- [SkippableTheory(Skip = "https://github.com/dotnet/diagnostics/issues/2541"), MemberData(nameof(Configurations))]
+ [Theory(Skip = "https://github.com/dotnet/diagnostics/issues/2541"), MemberData(nameof(Configurations))]
public async Task TestLogsAllCategoriesDefaultLevel(TestConfiguration config)
{
using Stream outputStream = await GetLogsAsync(config, settings => {
@@ -90,7 +89,7 @@ public async Task TestLogsAllCategoriesDefaultLevel(TestConfiguration config)
///
/// Test that log events at the default level are collected for categories without a specified level.
///
- [SkippableTheory(Skip = "Unreliable test https://github.com/dotnet/diagnostics/issues/3143"), MemberData(nameof(Configurations))]
+ [Theory(Skip = "Unreliable test https://github.com/dotnet/diagnostics/issues/3143"), MemberData(nameof(Configurations))]
public async Task TestLogsAllCategoriesDefaultLevelFallback(TestConfiguration config)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
@@ -122,7 +121,7 @@ public async Task TestLogsAllCategoriesDefaultLevelFallback(TestConfiguration co
///
/// Test that LogLevel.None is not supported as the default log level.
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestLogsAllCategoriesDefaultLevelNoneNotSupported(TestConfiguration config)
{
// Pipeline should throw PipelineException with inner exception of NotSupportedException.
@@ -140,7 +139,7 @@ public async Task TestLogsAllCategoriesDefaultLevelNoneNotSupported(TestConfigur
///
/// Test that log events are collected for the categories and levels specified by the application.
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestLogsUseAppFilters(TestConfiguration config)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
@@ -164,7 +163,7 @@ public async Task TestLogsUseAppFilters(TestConfiguration config)
/// Test that log events are collected for the categories and levels specified by the application
/// and for the categories and levels specified in the filter specs.
///
- [SkippableTheory(Skip = "https://github.com/dotnet/diagnostics/issues/2541"), MemberData(nameof(Configurations))]
+ [Theory(Skip = "https://github.com/dotnet/diagnostics/issues/2541"), MemberData(nameof(Configurations))]
public async Task TestLogsUseAppFiltersAndFilterSpecs(TestConfiguration config)
{
using Stream outputStream = await GetLogsAsync(config, settings => {
@@ -188,7 +187,7 @@ public async Task TestLogsUseAppFiltersAndFilterSpecs(TestConfiguration config)
///
/// Test that log events are collected for wildcard categories.
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestLogsWildcardCategory(TestConfiguration config)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventTracePipelineUnitTests.cs b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventTracePipelineUnitTests.cs
index e24250a3ae..86211a4da2 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventTracePipelineUnitTests.cs
+++ b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventTracePipelineUnitTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -11,8 +11,6 @@
using Microsoft.Diagnostics.TestHelpers;
using Microsoft.Diagnostics.Tracing;
using Xunit;
-using Xunit.Abstractions;
-using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
// Newer SDKs flag MemberData(nameof(Configurations)) with this error
@@ -32,7 +30,7 @@ public EventTracePipelineUnitTests(ITestOutputHelper output)
_output = output;
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestTraceStopAsync(TestConfiguration config)
{
Stream eventStream = null;
@@ -75,7 +73,7 @@ await PipelineTestUtilities.ExecutePipelineWithTracee(
Assert.Throws(() => eventStream.Read(new byte[4], 0, 4));
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestEventStreamCleanup(TestConfiguration config)
{
Stream eventStream = null;
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/GlobMatcherTests.cs b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/GlobMatcherTests.cs
index 88317be47b..007a021852 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/GlobMatcherTests.cs
+++ b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/GlobMatcherTests.cs
@@ -6,7 +6,6 @@
using System.Linq;
using Microsoft.Diagnostics.Monitoring.EventPipe.Triggers.AspNet;
using Xunit;
-using Xunit.Abstractions;
namespace Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests
{
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/LogsPipelineUnitTests.cs b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/LogsPipelineUnitTests.cs
index 0b11d899be..f84818a0c4 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/LogsPipelineUnitTests.cs
+++ b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/LogsPipelineUnitTests.cs
@@ -13,8 +13,6 @@
using Microsoft.Diagnostics.TestHelpers;
using Microsoft.Extensions.Logging;
using Xunit;
-using Xunit.Abstractions;
-using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
namespace Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests
@@ -32,7 +30,7 @@ public LogsPipelineUnitTests(ITestOutputHelper output)
_output = output;
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestLogsPipeline(TestConfiguration config)
{
// TODO: When distributed tracing support lands EventPipeTracee
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests.csproj b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests.csproj
index 7d44500941..b9d2ed1078 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests.csproj
+++ b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests.csproj
@@ -12,7 +12,6 @@
-
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/PipelineTestUtilities.cs b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/PipelineTestUtilities.cs
index 5630f2dd71..e3ae508d7d 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/PipelineTestUtilities.cs
+++ b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/PipelineTestUtilities.cs
@@ -6,7 +6,7 @@
using System.Threading.Tasks;
using CommonTestRunner;
using Microsoft.Diagnostics.TestHelpers;
-using Xunit.Abstractions;
+using Xunit;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
namespace Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.UnitTests.csproj b/src/tests/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.UnitTests.csproj
index e7bb6394da..2f10c19aca 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.UnitTests.csproj
+++ b/src/tests/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.UnitTests.csproj
@@ -11,7 +11,6 @@
-
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring/PipelineTests.cs b/src/tests/Microsoft.Diagnostics.Monitoring/PipelineTests.cs
index 071eb7622f..e1d2ea713a 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring/PipelineTests.cs
+++ b/src/tests/Microsoft.Diagnostics.Monitoring/PipelineTests.cs
@@ -5,7 +5,6 @@
using System.Threading;
using System.Threading.Tasks;
using Xunit;
-using Xunit.Abstractions;
namespace Microsoft.Diagnostics.Monitoring.UnitTests
{
diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs
index 3acc97be3e..e8e899f5ab 100644
--- a/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs
+++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -11,7 +11,6 @@
using Microsoft.Diagnostics.Tracing;
using Microsoft.Diagnostics.Tracing.Etlx;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
@@ -32,13 +31,13 @@ public EventPipeSessionTests(ITestOutputHelper outputHelper)
_output = outputHelper;
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task BasicEventPipeSessionTest(TestConfiguration config)
{
return BasicEventPipeSessionTestCore(config, useAsync: false);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task BasicEventPipeSessionTestAsync(TestConfiguration config)
{
return BasicEventPipeSessionTestCore(config, useAsync: true);
@@ -61,13 +60,13 @@ private async Task BasicEventPipeSessionTestCore(TestConfiguration config, bool
runner.Stop();
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task EventPipeSessionStreamTest(TestConfiguration config)
{
return EventPipeSessionStreamTestCore(config, useAsync: false);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task EventPipeSessionStreamTestAsync(TestConfiguration config)
{
return EventPipeSessionStreamTestCore(config, useAsync: true);
@@ -119,13 +118,13 @@ private async Task EventPipeSessionStreamTestCore(TestConfiguration config, bool
}
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task EventPipeSessionUnavailableTest(TestConfiguration config)
{
return EventPipeSessionTests.EventPipeSessionUnavailableTestCore(config, useAsync: false);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task EventPipeSessionUnavailableTestAsync(TestConfiguration config)
{
return EventPipeSessionTests.EventPipeSessionUnavailableTestCore(config, useAsync: true);
@@ -147,13 +146,13 @@ await Assert.ThrowsAsync(() => clientShim.StartEven
}));
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task StartEventPipeSessionWithSingleProviderTest(TestConfiguration config)
{
return StartEventPipeSessionWithSingleProviderTestCore(config, useAsync: false);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task StartEventPipeSessionWithSingleProviderTestAsync(TestConfiguration config)
{
return StartEventPipeSessionWithSingleProviderTestCore(config, useAsync: true);
@@ -173,7 +172,7 @@ private async Task StartEventPipeSessionWithSingleProviderTestCore(TestConfigura
runner.Stop();
}
- [SkippableTheory(Skip = "https://github.com/dotnet/diagnostics/issues/4717"), MemberData(nameof(Configurations))]
+ [Theory(Skip = "https://github.com/dotnet/diagnostics/issues/4717"), MemberData(nameof(Configurations))]
public async Task StartEventPipeSessionWithoutStackwalkTestAsync(TestConfiguration testConfig)
{
if (testConfig.RuntimeFrameworkVersionMajor < 9)
diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetProcessEnvironmentTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetProcessEnvironmentTests.cs
index 92587d0b63..5fc8a4f7ef 100644
--- a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetProcessEnvironmentTests.cs
+++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetProcessEnvironmentTests.cs
@@ -1,11 +1,10 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// 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.Generic;
using System.Threading.Tasks;
using Microsoft.Diagnostics.TestHelpers;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
@@ -26,13 +25,13 @@ public ProcessEnvironmentTests(ITestOutputHelper outputHelper)
_output = outputHelper;
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task BasicEnvTest(TestConfiguration config)
{
return BasicEnvTestCore(config, useAsync: false);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task BasicEnvTestAsync(TestConfiguration config)
{
return BasicEnvTestCore(config, useAsync: true);
diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetProcessInfoTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetProcessInfoTests.cs
index 7f7181bc47..ffd2fb1c27 100644
--- a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetProcessInfoTests.cs
+++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetProcessInfoTests.cs
@@ -8,7 +8,6 @@
using Microsoft.Diagnostics.CommonTestRunner;
using Microsoft.Diagnostics.TestHelpers;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
@@ -29,25 +28,25 @@ public GetProcessInfoTests(ITestOutputHelper outputHelper)
_output = outputHelper;
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task BasicProcessInfoNoSuspendTest(TestConfiguration config)
{
return BasicProcessInfoTestCore(config, useAsync: false, suspend: false);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task BasicProcessInfoNoSuspendTestAsync(TestConfiguration config)
{
return BasicProcessInfoTestCore(config, useAsync: true, suspend: false);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task BasicProcessInfoSuspendTest(TestConfiguration config)
{
return BasicProcessInfoTestCore(config, useAsync: false, suspend: true);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public Task BasicProcessInfoSuspendTestAsync(TestConfiguration config)
{
return BasicProcessInfoTestCore(config, useAsync: true, suspend: true);
diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs
index 851db1184e..757acc3c9d 100644
--- a/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs
+++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/GetPublishedProcessesTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -7,8 +7,6 @@
using System.Threading.Tasks;
using Microsoft.Diagnostics.TestHelpers;
using Xunit;
-using Xunit.Abstractions;
-using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
// Newer SDKs flag MemberData(nameof(Configurations)) with this error
@@ -32,7 +30,7 @@ public GetPublishedProcessesTest(ITestOutputHelper outputHelper)
_output = outputHelper;
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task PublishedProcessTest1(TestConfiguration config)
{
await using TestRunner runner = await TestRunner.Create(config, _output, "Tracee");
@@ -47,7 +45,7 @@ public async Task PublishedProcessTest1(TestConfiguration config)
runner.WakeupTracee();
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task MultiplePublishedProcessTest(TestConfiguration config)
{
TestRunner[] runner = new TestRunner[3];
@@ -87,7 +85,7 @@ public async Task MultiplePublishedProcessTest(TestConfiguration config)
}
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task WaitForConnectionTest(TestConfiguration config)
{
await using TestRunner runner = await TestRunner.Create(config, _output, "Tracee");
diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/HandleableCollectionTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/HandleableCollectionTests.cs
index 1a4b7e0b75..1e43c33f7e 100644
--- a/src/tests/Microsoft.Diagnostics.NETCore.Client/HandleableCollectionTests.cs
+++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/HandleableCollectionTests.cs
@@ -8,7 +8,6 @@
using System.Threading;
using System.Threading.Tasks;
using Xunit;
-using Xunit.Abstractions;
namespace Microsoft.Diagnostics.NETCore.Client
{
diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj b/src/tests/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj
index 8dfe4a33f3..30562d9f87 100644
--- a/src/tests/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj
+++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj
@@ -12,7 +12,6 @@
-
diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/PerfMapTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/PerfMapTests.cs
index 6673b7729a..f50fb6a3a3 100644
--- a/src/tests/Microsoft.Diagnostics.NETCore.Client/PerfMapTests.cs
+++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/PerfMapTests.cs
@@ -12,7 +12,6 @@
using Microsoft.Diagnostics.CommonTestRunner;
using Microsoft.Diagnostics.TestHelpers;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
@@ -149,7 +148,7 @@ private void CheckWellKnownMethods(PerfMapType type, int pid)
}
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task GenerateAllTest(TestConfiguration config)
{
if (config.RuntimeFrameworkVersionMajor >= 8)
@@ -159,7 +158,7 @@ public async Task GenerateAllTest(TestConfiguration config)
await GenerateTestCore(PerfMapType.All, config);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task GeneratePerfMapTest(TestConfiguration config)
{
if (config.RuntimeFrameworkVersionMajor >= 8)
@@ -169,7 +168,7 @@ public async Task GeneratePerfMapTest(TestConfiguration config)
await GenerateTestCore(PerfMapType.PerfMap, config);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task GenerateJitDumpTest(TestConfiguration config)
{
await GenerateTestCore(PerfMapType.JitDump, config);
diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/PidIpcEndpointTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/PidIpcEndpointTests.cs
index c08f0ce023..e2a54d9023 100644
--- a/src/tests/Microsoft.Diagnostics.NETCore.Client/PidIpcEndpointTests.cs
+++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/PidIpcEndpointTests.cs
@@ -7,7 +7,6 @@
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
-using Microsoft.DotNet.XUnitExtensions;
using Xunit;
namespace Microsoft.Diagnostics.NETCore.Client
@@ -128,34 +127,38 @@ public void ParseTmpDir_EmptyEnviron_ReturnsFallback()
#region Behavioral tests (platform-specific, real system calls)
- [ConditionalFact(nameof(IsLinux))]
+ [Fact]
public void TryGetNamespacePid_CurrentProcess_SameNamespace_ReturnsFalse()
{
+ Assert.SkipUnless(IsLinux, "Condition 'IsLinux' was not met.");
int currentPid = Process.GetCurrentProcess().Id;
bool result = PidIpcEndpoint.TryGetNamespacePid(currentPid, out int nsPid);
Assert.False(result);
Assert.Equal(currentPid, nsPid);
}
- [ConditionalFact(nameof(IsNotLinux))]
+ [Fact]
public void TryGetNamespacePid_NonLinux_ReturnsFalse()
{
+ Assert.SkipUnless(IsNotLinux, "Condition 'IsNotLinux' was not met.");
bool result = PidIpcEndpoint.TryGetNamespacePid(1, out int nsPid);
Assert.False(result);
Assert.Equal(1, nsPid);
}
- [ConditionalFact(nameof(IsLinux))]
+ [Fact]
public void TryGetNamespacePid_NonExistentPid_DoesNotThrow()
{
+ Assert.SkipUnless(IsLinux, "Condition 'IsLinux' was not met.");
bool result = PidIpcEndpoint.TryGetNamespacePid(int.MaxValue, out int nsPid);
Assert.False(result);
Assert.Equal(int.MaxValue, nsPid);
}
- [ConditionalFact(nameof(IsLinux))]
+ [Fact]
public void GetProcessTmpDir_ChildProcess_ReadsTmpdir()
{
+ Assert.SkipUnless(IsLinux, "Condition 'IsLinux' was not met.");
string customTmpDir = "/custom/tmp/test";
ProcessStartInfo psi = new("sleep", "30")
{
@@ -277,9 +280,10 @@ public void GetDefaultAddress_NonExistentPid_ThrowsServerNotAvailable()
Assert.Contains("is not running", ex.Message);
}
- [ConditionalFact(nameof(IsLinux))]
+ [Fact]
public void GetProcessTmpDir_KernelThread_DoesNotThrow()
{
+ Assert.SkipUnless(IsLinux, "Condition 'IsLinux' was not met.");
int unreadableEnvironPid = -1;
foreach (string procEntry in Directory.EnumerateDirectories("/proc"))
{
@@ -305,7 +309,8 @@ public void GetProcessTmpDir_KernelThread_DoesNotThrow()
if (unreadableEnvironPid == -1)
{
- throw new SkipTestException("No process with an unreadable (IOException) /proc/{pid}/environ was found.");
+ Assert.Skip("No process with an unreadable (IOException) /proc/{pid}/environ was found.");
+ return;
}
bool environReadable = true;
diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/ReversedServerTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/ReversedServerTests.cs
index a60d93138f..a948e31425 100644
--- a/src/tests/Microsoft.Diagnostics.NETCore.Client/ReversedServerTests.cs
+++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/ReversedServerTests.cs
@@ -14,7 +14,6 @@
using Microsoft.Diagnostics.TestHelpers;
using Microsoft.Diagnostics.Tracing;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
@@ -103,7 +102,7 @@ await Assert.ThrowsAsync(
() => server.RemoveConnection(Guid.Empty));
}
- [SkippableFact]
+ [Fact]
public async Task ReversedServerAddressInUseTest()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
@@ -156,13 +155,13 @@ public async Task ReversedServerAcceptAsyncYieldsTest()
Assert.True(acceptTask.IsCanceled);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task ReversedServerNonExistingRuntimeIdentifierTest(TestConfiguration config)
{
await ReversedServerNonExistingRuntimeIdentifierTestCore(config, useAsync: false);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task ReversedServerNonExistingRuntimeIdentifierTestAsync(TestConfiguration config)
{
await ReversedServerNonExistingRuntimeIdentifierTestCore(config, useAsync: true);
@@ -194,13 +193,13 @@ private async Task ReversedServerNonExistingRuntimeIdentifierTestCore(TestConfig
Assert.False(server.RemoveConnection(Guid.NewGuid()), "Removal of nonexisting connection should fail.");
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task ReversedServerSingleTargetMultipleUseClientTest(TestConfiguration config)
{
await ReversedServerSingleTargetMultipleUseClientTestCore(config, useAsync: false);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task ReversedServerSingleTargetMultipleUseClientTestAsync(TestConfiguration config)
{
await ReversedServerSingleTargetMultipleUseClientTestCore(config, useAsync: true);
@@ -254,13 +253,13 @@ private async Task ReversedServerSingleTargetMultipleUseClientTestCore(TestConfi
await VerifyNoNewEndpointInfos(server, useAsync);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task ReversedServerSingleTargetExitsClientInviableTest(TestConfiguration config)
{
await ReversedServerSingleTargetExitsClientInviableTestCore(config, useAsync: false);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task ReversedServerSingleTargetExitsClientInviableTestAsync(TestConfiguration config)
{
await ReversedServerSingleTargetExitsClientInviableTestCore(config, useAsync: true);
@@ -313,7 +312,7 @@ private async Task ReversedServerSingleTargetExitsClientInviableTestCore(TestCon
/// Validates that the does not create a new server
/// transport during disposal.
///
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task ReversedServerNoCreateTransportAfterDispose(TestConfiguration config)
{
if (config.RuntimeFrameworkVersionMajor < 5)
diff --git a/src/tests/Microsoft.SymbolStore.UnitTests/KeyGeneratorTests.cs b/src/tests/Microsoft.SymbolStore.UnitTests/KeyGeneratorTests.cs
index 428893488d..af82e51797 100644
--- a/src/tests/Microsoft.SymbolStore.UnitTests/KeyGeneratorTests.cs
+++ b/src/tests/Microsoft.SymbolStore.UnitTests/KeyGeneratorTests.cs
@@ -7,7 +7,6 @@
using Microsoft.SymbolStore.KeyGenerators;
using TestHelpers;
using Xunit;
-using Xunit.Abstractions;
namespace Microsoft.SymbolStore.Tests
{
diff --git a/src/tests/Microsoft.SymbolStore.UnitTests/PEFileKeyGenerationTests.cs b/src/tests/Microsoft.SymbolStore.UnitTests/PEFileKeyGenerationTests.cs
index 2d6e3044c6..e8c5315525 100644
--- a/src/tests/Microsoft.SymbolStore.UnitTests/PEFileKeyGenerationTests.cs
+++ b/src/tests/Microsoft.SymbolStore.UnitTests/PEFileKeyGenerationTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// 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.Generic;
@@ -7,7 +7,6 @@
using Microsoft.SymbolStore.KeyGenerators;
using TestHelpers;
using Xunit;
-using Xunit.Abstractions;
namespace Microsoft.SymbolStore.Tests
{
diff --git a/src/tests/Microsoft.SymbolStore.UnitTests/SymbolStoreTests.cs b/src/tests/Microsoft.SymbolStore.UnitTests/SymbolStoreTests.cs
index ee87de31da..984bdde946 100644
--- a/src/tests/Microsoft.SymbolStore.UnitTests/SymbolStoreTests.cs
+++ b/src/tests/Microsoft.SymbolStore.UnitTests/SymbolStoreTests.cs
@@ -11,7 +11,6 @@
using Microsoft.SymbolStore.SymbolStores;
using SOS;
using Xunit;
-using Xunit.Abstractions;
namespace Microsoft.SymbolStore.Tests
{
diff --git a/src/tests/Microsoft.SymbolStore.UnitTests/Tracer.cs b/src/tests/Microsoft.SymbolStore.UnitTests/Tracer.cs
index 0adf3d85d9..ea5943e3f9 100644
--- a/src/tests/Microsoft.SymbolStore.UnitTests/Tracer.cs
+++ b/src/tests/Microsoft.SymbolStore.UnitTests/Tracer.cs
@@ -1,7 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using Xunit.Abstractions;
+using Xunit;
namespace Microsoft.SymbolStore.Tests
{
diff --git a/src/tests/dirs.proj b/src/tests/dirs.proj
index a37899c9ce..291e740552 100644
--- a/src/tests/dirs.proj
+++ b/src/tests/dirs.proj
@@ -6,6 +6,12 @@
+
+
+
diff --git a/src/tests/dotnet-counters/ConsoleExporterTests.cs b/src/tests/dotnet-counters/ConsoleExporterTests.cs
index 12680effa1..8917344965 100644
--- a/src/tests/dotnet-counters/ConsoleExporterTests.cs
+++ b/src/tests/dotnet-counters/ConsoleExporterTests.cs
@@ -10,7 +10,6 @@
using Microsoft.Diagnostics.Tests.Common;
using Microsoft.Diagnostics.Tools.Counters.Exporters;
using Xunit;
-using Xunit.Abstractions;
namespace DotnetCounters.UnitTests
{
diff --git a/src/tests/dotnet-counters/CounterMonitorPayloadTests.cs b/src/tests/dotnet-counters/CounterMonitorPayloadTests.cs
index 38bc614706..ae4e35468e 100644
--- a/src/tests/dotnet-counters/CounterMonitorPayloadTests.cs
+++ b/src/tests/dotnet-counters/CounterMonitorPayloadTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -13,7 +13,6 @@
using Microsoft.Diagnostics.TestHelpers;
using Microsoft.Diagnostics.Tools.Counters;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
using Constants = DotnetCounters.UnitTests.TestConstants;
@@ -42,7 +41,7 @@ public CounterMonitorPayloadTests(ITestOutputHelper outputHelper)
_outputHelper = outputHelper;
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestCounterMonitorCustomMetricsJSON(TestConfiguration configuration)
{
CheckRuntimeOS();
@@ -53,7 +52,7 @@ public async Task TestCounterMonitorCustomMetricsJSON(TestConfiguration configur
ValidateCustomMetrics(metricComponents, CountersExportFormat.json);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestCounterMonitorCustomMetricsCSV(TestConfiguration configuration)
{
CheckRuntimeOS();
@@ -64,7 +63,7 @@ public async Task TestCounterMonitorCustomMetricsCSV(TestConfiguration configura
ValidateCustomMetrics(metricComponents, CountersExportFormat.csv);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestCounterMonitorEventCounterSystemRuntimeMetricsJSON(TestConfiguration configuration)
{
CheckRuntimeOS();
@@ -74,7 +73,7 @@ public async Task TestCounterMonitorEventCounterSystemRuntimeMetricsJSON(TestCon
ValidateEventCounterSystemRuntimeMetrics(metricComponents);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public async Task TestCounterMonitorEventCounterSystemRuntimeMetricsCSV(TestConfiguration configuration)
{
CheckRuntimeOS();
diff --git a/src/tests/dotnet-trace/ChildProcessTests.cs b/src/tests/dotnet-trace/ChildProcessTests.cs
index 73b59d44bf..21444aa7c1 100644
--- a/src/tests/dotnet-trace/ChildProcessTests.cs
+++ b/src/tests/dotnet-trace/ChildProcessTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// 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.Generic;
@@ -7,7 +7,6 @@
using Microsoft.Diagnostics.CommonTestRunner;
using Microsoft.Diagnostics.TestHelpers;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
using TestRunner = Microsoft.Diagnostics.CommonTestRunner.TestRunner;
@@ -91,7 +90,7 @@ private void LaunchDotNetTrace(TestConfiguration config, string dotnetTraceComma
}
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public void VerifyExitCode(TestConfiguration config)
{
VerifyExitCodeX(config, "232", 232);
@@ -105,7 +104,7 @@ private void VerifyExitCodeX(TestConfiguration config, string commandLineArg, in
Assert.Contains($"Process exited with code '{exitCode}'.", stdOut);
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public void VerifyHideIO(TestConfiguration config)
{
LaunchDotNetTrace(config, "collect -o VerifyHideIO.nettrace", "0 this is a message", out int dotnetTraceExitCode, out string stdOut, out string stdErr);
@@ -119,7 +118,7 @@ public void VerifyHideIO(TestConfiguration config)
}
}
- [SkippableTheory, MemberData(nameof(Configurations))]
+ [Theory, MemberData(nameof(Configurations))]
public void VerifyShowIO(TestConfiguration config)
{
LaunchDotNetTrace(config, "collect -o VerifyShowIO.nettrace --show-child-io", "0 this is a message", out int dotnetTraceExitCode, out string stdOut, out string stdErr);
diff --git a/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs
index c59802287e..e5f403aa10 100644
--- a/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs
+++ b/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -13,7 +13,6 @@
using Microsoft.Diagnostics.Tools.Trace;
using Microsoft.Internal.Common.Utils;
using Xunit;
-using Xunit.Abstractions;
namespace Microsoft.Diagnostics.Tools.Trace
{
diff --git a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs
index 6a3f429b3f..1ae7b728c1 100644
--- a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs
+++ b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs
@@ -13,10 +13,8 @@
using System.Threading.Tasks;
using Microsoft.Diagnostics.Tests.Common;
using Microsoft.Diagnostics.Tools.Trace;
-using Microsoft.DotNet.XUnitExtensions;
using Microsoft.Internal.Common.Utils;
using Xunit;
-using Xunit.Abstractions;
namespace Microsoft.Diagnostics.Tools.Trace
{
@@ -57,29 +55,32 @@ private static CollectLinuxCommandHandler.CollectLinuxArgs TestArgs(
probe);
}
- [ConditionalTheory(nameof(IsCollectLinuxSupported))]
+ [Theory]
[MemberData(nameof(BasicCases))]
public void CollectLinuxCommandProviderConfigurationConsolidation(object testArgs, string[] expectedLines)
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper);
int exitCode = Run(testArgs, console);
Assert.Equal((int)ReturnCode.Ok, exitCode);
console.AssertSanitizedLinesEqual(CollectLinuxSanitizer, expectedLines);
}
- [ConditionalTheory(nameof(IsCollectLinuxSupported))]
+ [Theory]
[MemberData(nameof(InvalidProviders))]
public void CollectLinuxCommandProviderConfigurationConsolidation_Throws(object testArgs, string[] expectedException)
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper);
int exitCode = Run(testArgs, console);
Assert.Equal((int)ReturnCode.ArgumentError, exitCode);
console.AssertSanitizedLinesEqual(null, expectedException);
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_ReportsResolveProcessErrors()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper);
var args = TestArgs(processId: -1);
int exitCode = Run(args, console);
@@ -88,9 +89,10 @@ public void CollectLinuxCommand_ReportsResolveProcessErrors()
console.AssertSanitizedLinesEqual(null, FormatException("-1 is not a valid process ID"));
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_ReportsResolveProcessNameErrors()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper);
var args = TestArgs(name: "process-that-should-not-exist", processId: 0);
int exitCode = Run(args, console);
@@ -99,10 +101,11 @@ public void CollectLinuxCommand_ReportsResolveProcessNameErrors()
console.AssertSanitizedLinesEqual(null, FormatException("There is no active process with the given name: process-that-should-not-exist"));
}
- [ConditionalTheory(nameof(IsCollectLinuxSupported))]
+ [Theory]
[MemberData(nameof(ResolveProcessExceptions))]
public void CollectLinuxCommand_ResolveProcessExceptions(object testArgs, string[] expectedError)
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper);
int exitCode = Run(testArgs, console);
@@ -111,9 +114,10 @@ public void CollectLinuxCommand_ResolveProcessExceptions(object testArgs, string
console.AssertSanitizedLinesEqual(null, expectedError);
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_Probe_ListsProcesses_WhenNoArgs()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 2000, _outputHelper);
var args = TestArgs(probe: true, output: new FileInfo(CommonOptions.DefaultTraceName));
int exitCode = Run(args, console);
@@ -131,9 +135,10 @@ public void CollectLinuxCommand_Probe_ListsProcesses_WhenNoArgs()
console.AssertSanitizedLinesEqual(CollectLinuxProbeSanitizer, expected);
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_Probe_CsvToConsole()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 2000, _outputHelper);
var args = TestArgs(probe: true, output: new FileInfo("stdout"));
int exitCode = Run(args, console);
@@ -148,9 +153,10 @@ public void CollectLinuxCommand_Probe_CsvToConsole()
console.AssertSanitizedLinesEqual(CollectLinuxProbeSanitizer, expected);
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_Probe_Csv()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 2000, _outputHelper);
string tempFilePath = Path.GetTempFileName();
var args = TestArgs(probe: true, output: new FileInfo(tempFilePath));
@@ -167,9 +173,10 @@ public void CollectLinuxCommand_Probe_Csv()
console.AssertSanitizedLinesEqual(null, expected);
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_Probe_ReportsResolveProcessErrors_InvalidPid()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper);
var args = TestArgs(processId: -1, probe: true);
int exitCode = Run(args, console);
@@ -181,9 +188,10 @@ public void CollectLinuxCommand_Probe_ReportsResolveProcessErrors_InvalidPid()
console.AssertSanitizedLinesEqual(null, expected);
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_Probe_ReportsResolveProcessErrors_InvalidName()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper);
var args = TestArgs(name: "process-that-should-not-exist", processId: 0, probe: true);
int exitCode = Run(args, console);
@@ -195,9 +203,10 @@ public void CollectLinuxCommand_Probe_ReportsResolveProcessErrors_InvalidName()
console.AssertSanitizedLinesEqual(null, expected);
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_Probe_ReportsResolveProcessErrors_BothPidAndName()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper);
var args = TestArgs(name: "dummy", processId: 1, probe: true);
int exitCode = Run(args, console);
@@ -211,9 +220,10 @@ public void CollectLinuxCommand_Probe_ReportsResolveProcessErrors_BothPidAndName
console.AssertSanitizedLinesEqual(null, expected);
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_ReportsConnectionFailed_NonDotNetProcess()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
// PID 1 (init/systemd) exists but is not a .NET process — no diagnostic port.
string pid1Name = Process.GetProcessById(1).ProcessName;
MockConsole console = new(200, 30, _outputHelper);
@@ -225,9 +235,10 @@ public void CollectLinuxCommand_ReportsConnectionFailed_NonDotNetProcess()
$"Unable to connect to process '{pid1Name} (1)'. The process may have exited, or it doesn't have an accessible .NET diagnostic port."));
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_Probe_ReportsConnectionFailed_NonDotNetProcess()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
// PID 1 (init/systemd) exists but is not a .NET process — no diagnostic port.
string pid1Name = Process.GetProcessById(1).ProcessName;
MockConsole console = new(200, 2000, _outputHelper);
@@ -243,9 +254,10 @@ public void CollectLinuxCommand_Probe_ReportsConnectionFailed_NonDotNetProcess()
console.AssertSanitizedLinesEqual(null, expected);
}
- [ConditionalFact(nameof(IsCollectLinuxNotSupported))]
+ [Fact]
public void CollectLinuxCommand_NotSupported_OnNonLinux()
{
+ Assert.SkipUnless(IsCollectLinuxNotSupported, "Condition 'IsCollectLinuxNotSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper);
int exitCode = Run(TestArgs(), console);
Assert.Equal((int)ReturnCode.PlatformNotSupportedError, exitCode);
@@ -255,9 +267,10 @@ public void CollectLinuxCommand_NotSupported_OnNonLinux()
});
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_RestoresCursorVisibility_OnSuccess()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper)
{
CursorVisible = false
@@ -269,9 +282,10 @@ public void CollectLinuxCommand_RestoresCursorVisibility_OnSuccess()
Assert.True(console.CursorVisible, "Cursor should be visible after command completes");
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_RestoresCursorVisibility_OnError()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper)
{
CursorVisible = false
@@ -290,11 +304,12 @@ public void CollectLinuxCommand_RestoresCursorVisibility_OnError()
Assert.Equal((int)ReturnCode.TracingError, exitCode);
}
- [ConditionalTheory(nameof(IsCollectLinuxSupported))]
+ [Theory]
[InlineData(true)]
[InlineData(false)]
public void CollectLinuxCommand_DoesNotChangeCursorVisibility_WhenOutputIsRedirected(bool initialCursorVisible)
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper)
{
CursorVisible = initialCursorVisible,
@@ -308,9 +323,10 @@ public void CollectLinuxCommand_DoesNotChangeCursorVisibility_WhenOutputIsRedire
Assert.Equal(initialCursorVisible, console.CursorVisible);
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_DoesNotPrintStatusUpdates_WhenOutputIsRedirected()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper);
console.IsOutputRedirected = true;
@@ -329,9 +345,10 @@ public void CollectLinuxCommand_DoesNotPrintStatusUpdates_WhenOutputIsRedirected
Assert.DoesNotContain(lines, l => l.Contains("Press ", StringComparison.OrdinalIgnoreCase));
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_DoesNotReadKey_WhenInputIsRedirected()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper);
console.IsInputRedirected = true;
console.KeyAvailable = true;
@@ -359,9 +376,10 @@ public void CollectLinuxCommand_DoesNotReadKey_WhenInputIsRedirected()
Assert.True(callbackInvoked);
}
- [ConditionalFact(nameof(IsCollectLinuxSupported))]
+ [Fact]
public void CollectLinuxCommand_PrintsStatusOnce_WhenCursorRepositioningUnsupported()
{
+ Assert.SkipUnless(IsCollectLinuxSupported, "Condition 'IsCollectLinuxSupported' was not met.");
MockConsole console = new(200, 30, _outputHelper);
var handler = new CollectLinuxCommandHandler(console);
diff --git a/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj b/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj
index 056dd23295..155aab243a 100644
--- a/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj
+++ b/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj
@@ -4,10 +4,6 @@
$(NetCoreAppTestTargetFramework)
-
-
-
-
diff --git a/src/tests/eventpipe/ContentionEvents.cs b/src/tests/eventpipe/ContentionEvents.cs
index 2e41c356a3..18b104f56b 100644
--- a/src/tests/eventpipe/ContentionEvents.cs
+++ b/src/tests/eventpipe/ContentionEvents.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -10,7 +10,6 @@
using Microsoft.Diagnostics.NETCore.Client;
using Microsoft.Diagnostics.Tracing;
using Xunit;
-using Xunit.Abstractions;
namespace EventPipe.UnitTests.ContentionValidation
{
diff --git a/src/tests/eventpipe/CustomEvents.cs b/src/tests/eventpipe/CustomEvents.cs
index bb81f5fd5f..e714b39e11 100644
--- a/src/tests/eventpipe/CustomEvents.cs
+++ b/src/tests/eventpipe/CustomEvents.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -8,7 +8,6 @@
using EventPipe.UnitTests.Common;
using Microsoft.Diagnostics.NETCore.Client;
using Xunit;
-using Xunit.Abstractions;
namespace EventPipe.UnitTests.CustomEventsValidation
{
diff --git a/src/tests/eventpipe/EventPipe.UnitTests.csproj b/src/tests/eventpipe/EventPipe.UnitTests.csproj
index 0234a80bbe..500882ae9f 100644
--- a/src/tests/eventpipe/EventPipe.UnitTests.csproj
+++ b/src/tests/eventpipe/EventPipe.UnitTests.csproj
@@ -7,7 +7,6 @@
-
diff --git a/src/tests/eventpipe/GCEvents.cs b/src/tests/eventpipe/GCEvents.cs
index c4374ff0a5..ba8199974e 100644
--- a/src/tests/eventpipe/GCEvents.cs
+++ b/src/tests/eventpipe/GCEvents.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -10,7 +10,6 @@
using Microsoft.Diagnostics.NETCore.Client;
using Microsoft.Diagnostics.Tracing;
using Xunit;
-using Xunit.Abstractions;
namespace EventPipe.UnitTests.GCEventsValidation
{
diff --git a/src/tests/eventpipe/LoaderEvents.cs b/src/tests/eventpipe/LoaderEvents.cs
index a54cfea294..11c4a61673 100644
--- a/src/tests/eventpipe/LoaderEvents.cs
+++ b/src/tests/eventpipe/LoaderEvents.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -13,7 +13,6 @@
using Microsoft.Diagnostics.NETCore.Client;
using Microsoft.Diagnostics.Tracing;
using Xunit;
-using Xunit.Abstractions;
namespace EventPipe.UnitTests.LoaderEventsValidation
{
diff --git a/src/tests/eventpipe/MethodEvents.cs b/src/tests/eventpipe/MethodEvents.cs
index ef1daf66f3..39260dbf86 100644
--- a/src/tests/eventpipe/MethodEvents.cs
+++ b/src/tests/eventpipe/MethodEvents.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -10,7 +10,6 @@
using Microsoft.Diagnostics.NETCore.Client;
using Microsoft.Diagnostics.Tracing;
using Xunit;
-using Xunit.Abstractions;
namespace EventPipe.UnitTests.MethodEventsValidation
{
diff --git a/src/tests/eventpipe/ThreadPoolEvents.cs b/src/tests/eventpipe/ThreadPoolEvents.cs
index 3561aab0eb..138db9d038 100644
--- a/src/tests/eventpipe/ThreadPoolEvents.cs
+++ b/src/tests/eventpipe/ThreadPoolEvents.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -10,7 +10,6 @@
using Microsoft.Diagnostics.NETCore.Client;
using Microsoft.Diagnostics.Tracing;
using Xunit;
-using Xunit.Abstractions;
namespace EventPipe.UnitTests.ThreadPoolValidation
{
diff --git a/src/tests/eventpipe/common/RemoteTestExecutorHelper.cs b/src/tests/eventpipe/common/RemoteTestExecutorHelper.cs
index 92ee3e7b6b..59c71e4ffd 100644
--- a/src/tests/eventpipe/common/RemoteTestExecutorHelper.cs
+++ b/src/tests/eventpipe/common/RemoteTestExecutorHelper.cs
@@ -5,7 +5,7 @@
using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.DotNet.RemoteExecutor;
-using Xunit.Abstractions;
+using Xunit;
namespace EventPipe.UnitTests.Common
{
diff --git a/src/tests/eventpipe/providers.cs b/src/tests/eventpipe/providers.cs
index ffde173d9b..be15a699a1 100644
--- a/src/tests/eventpipe/providers.cs
+++ b/src/tests/eventpipe/providers.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -8,7 +8,6 @@
using EventPipe.UnitTests.Common;
using Microsoft.Diagnostics.NETCore.Client;
using Xunit;
-using Xunit.Abstractions;
// Use this test as an example of how to write tests for EventPipe in
// the dotnet/diagnostics repo
From 86e879c074ed462090fbdc8e609c84337dbdc4bc Mon Sep 17 00:00:00 2001
From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com>
Date: Tue, 21 Jul 2026 20:53:28 -0700
Subject: [PATCH 2/7] Migrate SOS.UnitTests to xUnit v3 + MTP
Migrate the last remaining test project (SOS.UnitTests) off the xUnit v2
Skippable* machinery to xUnit v3 running under Microsoft.Testing.Platform,
and re-enable it in the test traversal.
- SOS.cs / SOSRunner.cs: drop `using Xunit.Abstractions` (ITestOutputHelper is
now in the Xunit namespace under v3) and rename [SkippableFact]/[SkippableTheory]
to [Fact]/[Theory]. `Xunit.Extensions` stays because both files still throw
SkipTestException, which emits the v3 dynamic-skip token.
- xunit.runner.json / SOS.UnitTests.csproj: stop shipping xunit.runner.json as
Content (it collided with the copy Arcade's XUnitV3 tooling injects, causing
NETSDK1152 during publish). Instead point Arcade's XUnitCoreSettingsFile /
XUnitDesktopSettingsFile at the project's own file, which both resolves the
conflict and ensures the settings are honored under MTP. Merge Arcade's
shadowCopy:false alongside the existing preEnumerateTheories:false.
- global.json: add the .NET 10 test runner switch so standalone `dotnet test`
drives Microsoft.Testing.Platform instead of VSTest.
- dirs.proj: re-enable SOS.UnitTests in the traversal.
Verified on Windows x64: full tree builds 0/0; MTP discovery finds 30 tests;
SOSExceptionTests.DivZero passes across all runtime configs (full dump ->
SOS-command -> assert pipeline); interpreter tests dynamically skip (not fail).
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---
global.json | 3 +
src/tests/SOS.UnitTests/SOS.UnitTests.csproj | 11 ++--
src/tests/SOS.UnitTests/SOS.cs | 61 ++++++++++----------
src/tests/SOS.UnitTests/SOSRunner.cs | 4 +-
src/tests/SOS.UnitTests/xunit.runner.json | 1 +
src/tests/dirs.proj | 6 --
6 files changed, 43 insertions(+), 43 deletions(-)
diff --git a/global.json b/global.json
index c551a87c31..153ce31467 100644
--- a/global.json
+++ b/global.json
@@ -4,6 +4,9 @@
"allowPrerelease": true,
"rollForward": "major"
},
+ "test": {
+ "runner": "Microsoft.Testing.Platform"
+ },
"tools": {
"dotnet": "10.0.110",
"runtimes": {
diff --git a/src/tests/SOS.UnitTests/SOS.UnitTests.csproj b/src/tests/SOS.UnitTests/SOS.UnitTests.csproj
index df9a23e046..a09eabd3a1 100644
--- a/src/tests/SOS.UnitTests/SOS.UnitTests.csproj
+++ b/src/tests/SOS.UnitTests/SOS.UnitTests.csproj
@@ -8,6 +8,13 @@
$(OutputPath)$(TargetFramework)\Debugger.Tests.Common.txttruetrue
+
+ $(MSBuildThisFileDirectory)xunit.runner.json
+ $(MSBuildThisFileDirectory)xunit.runner.json
@@ -16,10 +23,6 @@
-
-
-
-
Debugger.Tests.Config.txt
diff --git a/src/tests/SOS.UnitTests/SOS.cs b/src/tests/SOS.UnitTests/SOS.cs
index 5d365a55ec..56b9085f88 100644
--- a/src/tests/SOS.UnitTests/SOS.cs
+++ b/src/tests/SOS.UnitTests/SOS.cs
@@ -11,7 +11,6 @@
using Microsoft.Diagnostics.TestHelpers;
using System.Text.Json;
using Xunit;
-using Xunit.Abstractions;
using Xunit.Extensions;
public static class SOSTestHelpers
@@ -296,7 +295,7 @@ public SOSStackTraceTests(ITestOutputHelper output)
private ITestOutputHelper Output { get; set; }
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task StackTraceSoftwareExceptionFrame(TestConfiguration config)
{
if (config.RuntimeFrameworkVersionMajor < 10)
@@ -315,7 +314,7 @@ await SOSTestHelpers.RunTest(
testTriage: true);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task StackTraceFaultingExceptionFrame(TestConfiguration config)
{
SOSTestHelpers.SkipIfWinX86(config);
@@ -329,7 +328,7 @@ await SOSTestHelpers.RunTest(
testTriage: true);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task StackTests(TestConfiguration config)
{
// Tracking: https://github.com/dotnet/diagnostics/issues/5883 (dotnet/runtime#129456)
@@ -343,7 +342,7 @@ await SOSTestHelpers.RunTest(
testName: "SOS.StackTests");
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task ClrStackWithNumberOfFrames(TestConfiguration config)
{
if (config.IsDesktop)
@@ -369,7 +368,7 @@ public SOSExceptionTests(ITestOutputHelper output)
private ITestOutputHelper Output { get; set; }
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task DivZero(TestConfiguration config)
{
await SOSTestHelpers.RunTest(
@@ -380,13 +379,13 @@ await SOSTestHelpers.RunTest(
testTriage: true);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task SimpleThrow(TestConfiguration config)
{
await SOSTestHelpers.RunTest(config, debuggeeName: "SimpleThrow", scriptName: "SimpleThrow.script", Output, testTriage: true);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task NestedExceptionTest(TestConfiguration config)
{
await SOSTestHelpers.RunTest(
@@ -397,7 +396,7 @@ await SOSTestHelpers.RunTest(
testTriage: true);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task TaskNestedException(TestConfiguration config)
{
await SOSTestHelpers.RunTest(
@@ -418,7 +417,7 @@ public SOSInterpreterTests(ITestOutputHelper output)
private ITestOutputHelper Output { get; set; }
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.InterpreterConfigurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.InterpreterConfigurations), MemberType = typeof(SOSTestHelpers))]
public async Task InterpreterStackTest(TestConfiguration config)
{
if (!config.UseInterpreter)
@@ -439,7 +438,7 @@ await SOSTestHelpers.RunTest(
Output);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.InterpreterConfigurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.InterpreterConfigurations), MemberType = typeof(SOSTestHelpers))]
public async Task InterpreterStackInterleavedTest(TestConfiguration config)
{
if (!config.UseInterpreter)
@@ -470,7 +469,7 @@ public SOSOverflowTests(ITestOutputHelper output)
private ITestOutputHelper Output { get; set; }
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task Overflow(TestConfiguration config)
{
await SOSTestHelpers.RunTest(
@@ -500,7 +499,7 @@ public SOSGCTests(ITestOutputHelper output)
private ITestOutputHelper Output { get; set; }
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task GCTests(TestConfiguration config)
{
SOSTestHelpers.SkipIfArm(config);
@@ -517,7 +516,7 @@ await SOSTestHelpers.RunTest(
testDump: false);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task GCPOHTests(TestConfiguration config)
{
if (config.IsDesktop || config.RuntimeFrameworkVersionMajor < 5)
@@ -535,7 +534,7 @@ await SOSTestHelpers.RunTest(
testDump: false);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetGCConfigurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.GetGCConfigurations), MemberType = typeof(SOSTestHelpers))]
public async Task FindRootsOlderGeneration(TestConfiguration config)
{
if (OS.Kind != OSKind.Windows)
@@ -557,7 +556,7 @@ await SOSTestHelpers.RunTest(
testDump: false);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetGCConfigurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.GetGCConfigurations), MemberType = typeof(SOSTestHelpers))]
public async Task DumpGCData(TestConfiguration config)
{
if (config.RuntimeFrameworkVersionMajor < 10)
@@ -574,7 +573,7 @@ await SOSTestHelpers.RunTest(
testDump: false);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task DumpGen(TestConfiguration config)
{
await SOSTestHelpers.RunTest(
@@ -603,7 +602,7 @@ public SOSDumpTests(ITestOutputHelper output)
private ITestOutputHelper Output { get; set; }
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetNetCoreConfigurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.GetNetCoreConfigurations), MemberType = typeof(SOSTestHelpers))]
public async Task MiniDumpLocalVarLookup(TestConfiguration config)
{
if (OS.Kind != OSKind.Windows)
@@ -629,7 +628,7 @@ await SOSTestHelpers.RunTest(
dumpGenerator: SOSRunner.DumpGenerator.NativeDebugger);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task ConcurrentDictionaries(TestConfiguration config)
{
if (OS.Kind != OSKind.Windows && config.RuntimeFrameworkVersionMajor == 10)
@@ -653,7 +652,7 @@ await SOSTestHelpers.RunTest(
Output);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task OtherCommands(TestConfiguration config)
{
// This debuggee needs the directory of the exes/dlls to load the SymbolTestDll assembly.
@@ -681,7 +680,7 @@ public SOSMethodTests(ITestOutputHelper output)
private ITestOutputHelper Output { get; set; }
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task DynamicMethod(TestConfiguration config)
{
if (config.PublishSingleFile || config.IsDesktop)
@@ -698,13 +697,13 @@ public async Task DynamicMethod(TestConfiguration config)
await SOSTestHelpers.RunTest(config, debuggeeName: "DynamicMethod", scriptName: "DynamicMethod.script", Output);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task Reflection(TestConfiguration config)
{
await SOSTestHelpers.RunTest(config, debuggeeName: "ReflectionTest", scriptName: "Reflection.script", Output, testTriage: true);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetNetCoreConfigurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.GetNetCoreConfigurations), MemberType = typeof(SOSTestHelpers))]
public async Task VarargPInvokeInteropMD(TestConfiguration config)
{
if (OS.Kind != OSKind.Windows)
@@ -733,7 +732,7 @@ public SOSThreadingTests(ITestOutputHelper output)
private ITestOutputHelper Output { get; set; }
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task ThreadApartment(TestConfiguration config)
{
if (OS.Kind != OSKind.Windows)
@@ -744,7 +743,7 @@ public async Task ThreadApartment(TestConfiguration config)
await SOSTestHelpers.RunTest(config, debuggeeName: "ThreadApartment", scriptName: "ThreadApartment.script", Output);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task LineNums(TestConfiguration config)
{
await SOSTestHelpers.RunTest(
@@ -765,7 +764,7 @@ public SOSAsyncTests(ITestOutputHelper output)
private ITestOutputHelper Output { get; set; }
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task AsyncMain(TestConfiguration config)
{
await SOSTestHelpers.RunTest(config, debuggeeName: "AsyncMain", scriptName: "AsyncMain.script", Output, testTriage: true);
@@ -781,7 +780,7 @@ public SOSScenarioTests(ITestOutputHelper output)
private ITestOutputHelper Output { get; set; }
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetConfigurations), "TestName", "SOS.TestExtensions", MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.GetConfigurations), "TestName", "SOS.TestExtensions", MemberType = typeof(SOSTestHelpers))]
public async Task TestExtensions(TestConfiguration config)
{
await SOSTestHelpers.RunTest(
@@ -792,7 +791,7 @@ await SOSTestHelpers.RunTest(
testName: "SOS.TestExtensions");
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetConfigurations), "TestName", "SOS.WebApp3", MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.GetConfigurations), "TestName", "SOS.WebApp3", MemberType = typeof(SOSTestHelpers))]
public async Task WebApp3(TestConfiguration config)
{
await SOSTestHelpers.RunTest("WebApp.script", new SOSRunner.TestInformation
@@ -806,7 +805,7 @@ public async Task WebApp3(TestConfiguration config)
Output);
}
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetConfigurations), "TestName", "SOS.DualRuntimes", MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.GetConfigurations), "TestName", "SOS.DualRuntimes", MemberType = typeof(SOSTestHelpers))]
public async Task DualRuntimes(TestConfiguration config)
{
// This test on linux/macOS can be called with an empty config because vstest and dotnet test fail/complain about no test parameters. The
@@ -857,7 +856,7 @@ public SOSStackAndOtherTests(ITestOutputHelper output)
private ITestOutputHelper Output { get; set; }
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetConfigurations), "TestName", "SOS.StackAndOtherTests", MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.GetConfigurations), "TestName", "SOS.StackAndOtherTests", MemberType = typeof(SOSTestHelpers))]
public async Task StackAndOtherTests(TestConfiguration config)
{
// Single-file .NET 8 servicing DAC signature verification fails with CDB SecureLoadDotNetExtensions.
@@ -924,7 +923,7 @@ public SOSPluginTests(ITestOutputHelper output)
private ITestOutputHelper Output { get; set; }
- [SkippableTheory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
+ [Theory, MemberData(nameof(SOSTestHelpers.Configurations), MemberType = typeof(SOSTestHelpers))]
public async Task LLDBPluginTests(TestConfiguration config)
{
SOSTestHelpers.SkipIfArm(config);
diff --git a/src/tests/SOS.UnitTests/SOSRunner.cs b/src/tests/SOS.UnitTests/SOSRunner.cs
index d45026f038..feb7446bf3 100644
--- a/src/tests/SOS.UnitTests/SOSRunner.cs
+++ b/src/tests/SOS.UnitTests/SOSRunner.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -13,7 +13,7 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Diagnostics.TestHelpers;
-using Xunit.Abstractions;
+using Xunit;
using Xunit.Extensions;
public class SOSRunner : IDisposable
diff --git a/src/tests/SOS.UnitTests/xunit.runner.json b/src/tests/SOS.UnitTests/xunit.runner.json
index f0245a5b0f..53912d55f1 100644
--- a/src/tests/SOS.UnitTests/xunit.runner.json
+++ b/src/tests/SOS.UnitTests/xunit.runner.json
@@ -1,4 +1,5 @@
{
"$schema": "https://xunit.net/schema/current/xunit.runner.schema.json",
+ "shadowCopy": false,
"preEnumerateTheories": false
}
diff --git a/src/tests/dirs.proj b/src/tests/dirs.proj
index 291e740552..a37899c9ce 100644
--- a/src/tests/dirs.proj
+++ b/src/tests/dirs.proj
@@ -6,12 +6,6 @@
-
-
-
From a072086ec2289d6f843f990bae282eef316b2d8b Mon Sep 17 00:00:00 2001
From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com>
Date: Thu, 23 Jul 2026 17:45:08 -0700
Subject: [PATCH 3/7] Rewrite CI test filter guard to clear-then-glob-sum
When a -classfilter/-methodfilter is active, clear the results XML
directory before the test run, then sum the assembly total counts across
all result XMLs afterward and fail if zero tests ran. This replaces the
timestamp/newer-file approach, which was not portable across the bash and
pwsh scripts and could miscount stale per-TFM result files.
---
eng/build.ps1 | 48 +++++++++++++++++++++++++++++++++++++++++++++---
eng/build.sh | 41 +++++++++++++++++++++++++++++++++++++++--
2 files changed, 84 insertions(+), 5 deletions(-)
diff --git a/eng/build.ps1 b/eng/build.ps1
index 6b23e1bf96..57d8118e0d 100644
--- a/eng/build.ps1
+++ b/eng/build.ps1
@@ -118,13 +118,23 @@ if ($test) {
# Tests run as xUnit v3 / Microsoft.Testing.Platform executables, so use the MTP
# filter options (--filter-method / --filter-class) instead of the old xunit.console
# -method / -class flags.
- # Use backslash-escaped quotes so they survive the additional quoting in tools.ps1
+ # Use backslash-escaped quotes so they survive the additional quoting in tools.ps1.
+ #
+ # A filter is applied to EVERY project in the test traversal, so projects that don't
+ # contain a matching test legitimately run zero tests. MTP returns exit code 8 ("zero
+ # tests ran") in that case, which Arcade would otherwise treat as a failure. Append
+ # --ignore-exit-code 8 so those non-matching projects don't fail the run. The trade-off
+ # (a mistyped filter that matches nothing anywhere would pass silently) is covered by the
+ # "at least one test ran" guard after the test run below.
+ $testFilterActive = $false
$testFilterArg = ''
if ($methodfilter -ne '') {
- $testFilterArg = "/p:TestRunnerAdditionalArguments=\`"--filter-method $methodfilter\`""
+ $testFilterActive = $true
+ $testFilterArg = "/p:TestRunnerAdditionalArguments=\`"--filter-method $methodfilter --ignore-exit-code 8\`""
}
elseif ($classfilter -ne '') {
- $testFilterArg = "/p:TestRunnerAdditionalArguments=\`"--filter-class $classfilter\`""
+ $testFilterActive = $true
+ $testFilterArg = "/p:TestRunnerAdditionalArguments=\`"--filter-class $classfilter --ignore-exit-code 8\`""
}
# When the managed build was skipped (e.g. the test-only CI legs that download prebuilt
@@ -149,6 +159,17 @@ if ($test) {
}
}
+ # When a filter is active it is applied to every project in the traversal, so non-matching
+ # projects run zero tests. --ignore-exit-code 8 (added to $testFilterArg above) keeps those
+ # from failing the run; to still catch a filter that matches nothing ANYWHERE, count the
+ # tests that ran after the build. Clear this run's result XMLs first so the post-run count
+ # only reflects the current run (result file names embed the target framework, so stale
+ # files from a previous run would not otherwise be overwritten).
+ $resultsDir = Join-Path (Join-Path $artifactsdir "TestResults") $configuration
+ if ($testFilterActive -and (Test-Path $resultsDir)) {
+ Remove-Item (Join-Path $resultsDir "*.xml") -Force -ErrorAction SilentlyContinue
+ }
+
& "$engroot\common\build.ps1" `
-test `
-restore:$skipmanaged `
@@ -170,5 +191,26 @@ if ($test) {
if ($lastExitCode -ne 0) {
exit $lastExitCode
}
+
+ # Guard against a filter that silently matches nothing (see note above): sum the test
+ # counts from the xUnit result XMLs this run produced and fail if nothing ran.
+ if ($testFilterActive) {
+ $testsRan = 0
+ if (Test-Path $resultsDir) {
+ foreach ($xml in Get-ChildItem $resultsDir -Filter *.xml -File -ErrorAction SilentlyContinue) {
+ try {
+ [xml]$doc = Get-Content -LiteralPath $xml.FullName -Raw
+ foreach ($asm in @($doc.assemblies.assembly)) {
+ if ($asm -and $asm.total) { $testsRan += [int]$asm.total }
+ }
+ } catch { }
+ }
+ }
+ if ($testsRan -eq 0) {
+ Write-Host "ERROR: The test filter matched zero tests across all projects. Check the -methodfilter/-classfilter value." -ForegroundColor Red
+ exit 1
+ }
+ Write-Host "Test filter matched $testsRan test(s) across the run." -ForegroundColor Green
+ }
}
}
diff --git a/eng/build.sh b/eng/build.sh
index 31dd55f152..45da6eaa5a 100755
--- a/eng/build.sh
+++ b/eng/build.sh
@@ -347,10 +347,19 @@ if [[ "$__Test" == 1 ]]; then
export SOS_TEST_INTERPRETER="true"
fi
- # Build the test filter argument if provided
+ # Build the test filter argument if provided.
+ #
+ # A filter is applied to EVERY project in the test traversal, so projects that don't
+ # contain a matching test legitimately run zero tests. MTP returns exit code 8 ("zero
+ # tests ran") in that case, which Arcade would otherwise treat as a failure. Append
+ # --ignore-exit-code 8 so those non-matching projects don't fail the run. The trade-off
+ # (a mistyped filter that matches nothing anywhere would pass silently) is covered by the
+ # "at least one test ran" guard after the test run below.
__TestFilterArg=
+ __TestFilterActive=0
if [[ -n "$__TestFilter" ]]; then
- __TestFilterArg="/p:TestRunnerAdditionalArguments=\"$__TestFilter\""
+ __TestFilterActive=1
+ __TestFilterArg="/p:TestRunnerAdditionalArguments=\"$__TestFilter --ignore-exit-code 8\""
fi
# When the managed build was skipped (e.g. the test-only CI legs that download prebuilt
@@ -377,6 +386,17 @@ if [[ "$__Test" == 1 ]]; then
fi
fi
+ # When a filter is active it is applied to every project in the traversal, so non-matching
+ # projects run zero tests. --ignore-exit-code 8 (added to __TestFilterArg above) keeps those
+ # from failing the run; to still catch a filter that matches nothing ANYWHERE, count the
+ # tests that ran after the build. Clear this run's result XMLs first so the post-run count
+ # only reflects the current run (result file names embed the target framework, so stale
+ # files from a previous run would not otherwise be overwritten).
+ __ResultsDir="$__RootBinDir/TestResults/$__BuildType"
+ if [[ "$__TestFilterActive" == 1 && -d "$__ResultsDir" ]]; then
+ rm -f "$__ResultsDir"/*.xml
+ fi
+
# __CommonMSBuildArgs contains TargetOS property
"$__RepoRootDir/eng/common/build.sh" \
--test \
@@ -397,6 +417,23 @@ if [[ "$__Test" == 1 ]]; then
if [ $? != 0 ]; then
exit 1
fi
+
+ # Guard against a filter that silently matches nothing (see note above): sum the test
+ # counts from the xUnit result XMLs this run produced and fail if nothing ran.
+ if [[ "$__TestFilterActive" == 1 ]]; then
+ __TestsRan=0
+ if [[ -d "$__ResultsDir" ]]; then
+ __TestsRan=$(cat "$__ResultsDir"/*.xml 2>/dev/null | grep -oE ']*total="[0-9]+"' | grep -oE 'total="[0-9]+"' | grep -oE '[0-9]+' | awk '{s+=$1} END {print s+0}')
+ fi
+ if [[ -z "$__TestsRan" ]]; then
+ __TestsRan=0
+ fi
+ if [[ "$__TestsRan" == 0 ]]; then
+ echo "ERROR: The test filter matched zero tests across all projects. Check the -methodfilter/-classfilter value."
+ exit 1
+ fi
+ echo "Test filter matched $__TestsRan test(s) across the run."
+ fi
fi
fi
From 3edf04d8f779c11c95986c2d34822d315d455b29 Mon Sep 17 00:00:00 2001
From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com>
Date: Thu, 23 Jul 2026 17:45:18 -0700
Subject: [PATCH 4/7] Resolve test BaseDir from AppContext.BaseDirectory
TestConfiguration.BaseDir defaulted to the current working directory
("."). Under the classic xunit.console runner the working directory was
the test output directory, so "." found Debugger.Tests.Config.txt and the
other assets. The Microsoft.Testing.Platform runner launches the test
executable with a different working directory, so default to
AppContext.BaseDirectory (the app base, where the assets are copied)
instead. Callers can still override it.
---
.../TestConfiguration.cs | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs b/src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs
index bd3112cfe8..9a7a3c1864 100644
--- a/src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs
+++ b/src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs
@@ -376,7 +376,13 @@ public partial class TestConfiguration
public static TestConfiguration Empty { get; } = new TestConfiguration();
- public static string BaseDir { get; set; } = Path.GetFullPath(".");
+ // Default to the directory containing the test assembly (where Debugger.Tests.Config.txt
+ // and the other test assets are copied) rather than the current working directory. Under
+ // the classic xunit.console runner the working directory happened to be the output
+ // directory, so "." resolved correctly; the Microsoft.Testing.Platform runner launches the
+ // test executable with a different working directory, so relying on "." no longer finds the
+ // config file. Callers can still override this.
+ public static string BaseDir { get; set; } = Path.GetFullPath(AppContext.BaseDirectory);
private static readonly Regex versionRegex = GetVersionRegex();
From 5319b9f37d71b083ce1fb277e7af316a6e84ae6b Mon Sep 17 00:00:00 2001
From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com>
Date: Thu, 23 Jul 2026 17:45:31 -0700
Subject: [PATCH 5/7] Fix xUnit1051 and suppress xUnit1031; drop repo-wide
NoWarn
Remove the central NoWarn suppression of the xUnit v3 analyzers in
src/tests/Directory.Build.props and address the flagged sites so
TreatWarningsAsErrors passes:
- xUnit1051 (29 sites): pass TestContext.Current.CancellationToken at
call sites that already take a CancellationToken (Task.Delay/Run/Wait,
StreamReader.ReadToEndAsync, Pipeline.StopAsync, and the CollectLinux
TestArgs helper). No product signatures change - the analyzer only
fires where a CancellationToken overload already exists.
- xUnit1031 (1 site): the blocking streamTask.Wait is inside the skipped
StartEventPipeSessionWithoutStackwalkTestAsync theory (the async fix is
tied to the race in dotnet/diagnostics#4717); keep the blocking wait
and suppress it with a scoped pragma, matching the existing pattern in
src/tests/eventpipe/ThreadPoolEvents.cs.
---
src/tests/Directory.Build.props | 6 ------
.../EventLogsPipelineUnitTests.cs | 14 +++++++-------
.../PipelineTests.cs | 2 +-
.../EventPipeSessionTests.cs | 6 ++++--
.../HandleableCollectionTests.cs | 6 +++---
.../CollectLinuxCommandFunctionalTests.cs | 3 +--
6 files changed, 16 insertions(+), 21 deletions(-)
diff --git a/src/tests/Directory.Build.props b/src/tests/Directory.Build.props
index 45bbcf4ff9..afe53704c4 100644
--- a/src/tests/Directory.Build.props
+++ b/src/tests/Directory.Build.props
@@ -17,11 +17,5 @@
XUnitV3Exe
-
- $(NoWarn);xUnit1051;xUnit1031
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventLogsPipelineUnitTests.cs b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventLogsPipelineUnitTests.cs
index 25a839b2ee..4fe83c4f0b 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventLogsPipelineUnitTests.cs
+++ b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/EventLogsPipelineUnitTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -61,7 +61,7 @@ public async Task TestLogsAllCategoriesAllLevels(TestConfiguration config)
ValidateAppLoggerCategoryWarningMessage(reader);
ValidateAppLoggerCategoryErrorMessage(reader);
- Assert.True(string.IsNullOrEmpty(await reader.ReadToEndAsync()), "Expected to have read all entries from stream.");
+ Assert.True(string.IsNullOrEmpty(await reader.ReadToEndAsync(TestContext.Current.CancellationToken)), "Expected to have read all entries from stream.");
}
///
@@ -83,7 +83,7 @@ public async Task TestLogsAllCategoriesDefaultLevel(TestConfiguration config)
ValidateAppLoggerCategoryWarningMessage(reader);
ValidateAppLoggerCategoryErrorMessage(reader);
- Assert.True(string.IsNullOrEmpty(await reader.ReadToEndAsync()), "Expected to have read all entries from stream.");
+ Assert.True(string.IsNullOrEmpty(await reader.ReadToEndAsync(TestContext.Current.CancellationToken)), "Expected to have read all entries from stream.");
}
///
@@ -115,7 +115,7 @@ public async Task TestLogsAllCategoriesDefaultLevelFallback(TestConfiguration co
ValidateLoggerRemoteCategoryWarningMessage(reader);
ValidateAppLoggerCategoryErrorMessage(reader);
- Assert.True(string.IsNullOrEmpty(await reader.ReadToEndAsync()), "Expected to have read all entries from stream.");
+ Assert.True(string.IsNullOrEmpty(await reader.ReadToEndAsync(TestContext.Current.CancellationToken)), "Expected to have read all entries from stream.");
}
///
@@ -156,7 +156,7 @@ public async Task TestLogsUseAppFilters(TestConfiguration config)
ValidateAppLoggerCategoryWarningMessage(reader);
ValidateAppLoggerCategoryErrorMessage(reader);
- Assert.True(string.IsNullOrEmpty(await reader.ReadToEndAsync()), "Expected to have read all entries from stream.");
+ Assert.True(string.IsNullOrEmpty(await reader.ReadToEndAsync(TestContext.Current.CancellationToken)), "Expected to have read all entries from stream.");
}
///
@@ -181,7 +181,7 @@ public async Task TestLogsUseAppFiltersAndFilterSpecs(TestConfiguration config)
ValidateAppLoggerCategoryWarningMessage(reader);
ValidateAppLoggerCategoryErrorMessage(reader);
- Assert.True(string.IsNullOrEmpty(await reader.ReadToEndAsync()), "Expected to have read all entries from stream.");
+ Assert.True(string.IsNullOrEmpty(await reader.ReadToEndAsync(TestContext.Current.CancellationToken)), "Expected to have read all entries from stream.");
}
///
@@ -212,7 +212,7 @@ public async Task TestLogsWildcardCategory(TestConfiguration config)
ValidateAppLoggerCategoryWarningMessage(reader);
ValidateAppLoggerCategoryErrorMessage(reader);
- Assert.True(string.IsNullOrEmpty(await reader.ReadToEndAsync()), "Expected to have read all entries from stream.");
+ Assert.True(string.IsNullOrEmpty(await reader.ReadToEndAsync(TestContext.Current.CancellationToken)), "Expected to have read all entries from stream.");
}
private async Task GetLogsAsync(TestConfiguration config, Action settingsCallback = null)
diff --git a/src/tests/Microsoft.Diagnostics.Monitoring/PipelineTests.cs b/src/tests/Microsoft.Diagnostics.Monitoring/PipelineTests.cs
index e1d2ea713a..3b5e703a5b 100644
--- a/src/tests/Microsoft.Diagnostics.Monitoring/PipelineTests.cs
+++ b/src/tests/Microsoft.Diagnostics.Monitoring/PipelineTests.cs
@@ -24,7 +24,7 @@ public async Task TestStartStopCancelDispose()
CancellationTokenSource cancellationTokenSource = new();
CancellationToken token = cancellationTokenSource.Token;
- await Assert.ThrowsAsync(() => timePipeline.StopAsync());
+ await Assert.ThrowsAsync(() => timePipeline.StopAsync(TestContext.Current.CancellationToken));
Task startTask = timePipeline.RunAsync(token);
Task secondStartCall = timePipeline.RunAsync(token);
diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs
index e8e899f5ab..a5cd4e5e18 100644
--- a/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs
+++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/EventPipeSessionTests.cs
@@ -213,9 +213,11 @@ public async Task StartEventPipeSessionWithoutStackwalkTestAsync(TestConfigurati
{
runner.WakeupTracee();
}
- });
+ }, TestContext.Current.CancellationToken);
runner.WriteLine("Waiting for stream Task");
- streamTask.Wait(10000);
+#pragma warning disable xUnit1031 // Intentional blocking wait; the proper async fix is tied to the race condition in https://github.com/dotnet/diagnostics/issues/4717
+ streamTask.Wait(10000, TestContext.Current.CancellationToken);
+#pragma warning restore xUnit1031
runner.WriteLine("Done waiting for stream Task");
session.Stop();
await streamTask;
diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/HandleableCollectionTests.cs b/src/tests/Microsoft.Diagnostics.NETCore.Client/HandleableCollectionTests.cs
index 1e43c33f7e..4429cf36cd 100644
--- a/src/tests/Microsoft.Diagnostics.NETCore.Client/HandleableCollectionTests.cs
+++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/HandleableCollectionTests.cs
@@ -43,7 +43,7 @@ public async Task HandleableCollectionThrowsWhenDisposedTest()
// Task.Delay intentionally shorter than default timeout to check that Handle*
// calls did not complete quickly.
- Task delayTask = Task.Delay(TimeSpan.FromSeconds(1));
+ Task delayTask = Task.Delay(TimeSpan.FromSeconds(1), TestContext.Current.CancellationToken);
Task completedTask = await Task.WhenAny(delayTask, handleTask, handleAsyncTask);
// Check that the handle tasks didn't complete
@@ -298,7 +298,7 @@ public async Task HandleableCollectionClearItemsTest()
// Task.Delay intentionally shorter than default timeout to check that HandleAsync
// calls did not complete quickly.
- Task delayTask = Task.Delay(TimeSpan.FromSeconds(1));
+ Task delayTask = Task.Delay(TimeSpan.FromSeconds(1), TestContext.Current.CancellationToken);
Task completedTask = await Task.WhenAny(delayTask, handleAsyncTask);
// Check that the handle task didn't complete
@@ -318,7 +318,7 @@ public async Task HandleableCollectionClearItemsTest()
// Task.Delay intentionally longer than default timeout to check that HandleAsync
// does complete by handling a value. The delay Task is used in case the handler doesn't
// handle a value and doesn't respect cancellation so as to not stall the test indefinitely.
- delayTask = Task.Delay(2 * DefaultPositiveVerificationTimeout);
+ delayTask = Task.Delay(2 * DefaultPositiveVerificationTimeout, TestContext.Current.CancellationToken);
completedTask = await Task.WhenAny(delayTask, handleAsyncTask);
// Check that the handle task did complete
diff --git a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs
index 1ae7b728c1..a05473881d 100644
--- a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs
+++ b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs
@@ -30,7 +30,6 @@ public CollectLinuxCommandFunctionalTests(ITestOutputHelper outputHelper)
_outputHelper = outputHelper;
}
private static CollectLinuxCommandHandler.CollectLinuxArgs TestArgs(
- CancellationToken ct = default,
string[] providers = null,
string clrEventLevel = "",
string clrEvents = "",
@@ -42,7 +41,7 @@ private static CollectLinuxCommandHandler.CollectLinuxArgs TestArgs(
int processId = 0,
bool probe = false)
{
- return new CollectLinuxCommandHandler.CollectLinuxArgs(ct,
+ return new CollectLinuxCommandHandler.CollectLinuxArgs(TestContext.Current.CancellationToken,
providers ?? Array.Empty(),
clrEventLevel,
clrEvents,
From 8f16097e00743fe9baeb3851fa6fb508b302d134 Mon Sep 17 00:00:00 2001
From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com>
Date: Tue, 4 Aug 2026 11:48:45 -0700
Subject: [PATCH 6/7] Resolve xUnit v3 test host from artifacts/dotnet-test
Set TestDotNetRoot to $(ArtifactsDotnetTestDir) for MTP test projects so
Arcade's XUnitV3 RunTests target launches each test executable with
DOTNET_ROOT pointing at the test .NET install instead of the Arcade
toolset SDK (.dotnet). This removes the dependency on the runtime that
global.json's tools.runtimes staged into .dotnet.
---
src/tests/Directory.Build.props | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/src/tests/Directory.Build.props b/src/tests/Directory.Build.props
index afe53704c4..0998a90047 100644
--- a/src/tests/Directory.Build.props
+++ b/src/tests/Directory.Build.props
@@ -17,5 +17,19 @@
XUnitV3Exe
+
+
+ $(ArtifactsDotnetTestDir)
From 08d3fc935a8a18f08afa1107c6bbbbfbaa784b86 Mon Sep 17 00:00:00 2001
From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com>
Date: Tue, 4 Aug 2026 11:48:56 -0700
Subject: [PATCH 7/7] Stage x86 test host runtime, drop global.json x86 runtime
Add an InstallHostRuntimeX86 target that stages the x86 shared framework
into artifacts/dotnet-test/x86 on the Windows x86 test leg, matching the
DOTNET_ROOT_X86 that Arcade's XUnitV3 RunTests target sets. A 32-bit
apphost reads DOTNET_ROOT_X86 before DOTNET_ROOT and does not fall back
when it is set, so the runtime must live in that subdirectory.
With the test host now resolving its runtime from artifacts/dotnet-test,
remove the tools.runtimes.dotnet/x86 entry from global.json that used to
stage the same x86 framework into .dotnet.
---
eng/InstallRuntimes.proj | 20 +++++++++++++++++++-
global.json | 7 +------
2 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/eng/InstallRuntimes.proj b/eng/InstallRuntimes.proj
index 64fee58a67..b24e74d410 100644
--- a/eng/InstallRuntimes.proj
+++ b/eng/InstallRuntimes.proj
@@ -63,7 +63,7 @@
+ DependsOnTargets="CleanupVersionManifest;InstallRuntimesWindows;InstallRuntimesUnix;InstallHostRuntimeX86;InstallBuildSdk;OverrideLatestRuntime;WriteTestVersionManifest" />
+
+
+
+
+
+
diff --git a/global.json b/global.json
index 153ce31467..4aafc89647 100644
--- a/global.json
+++ b/global.json
@@ -8,12 +8,7 @@
"runner": "Microsoft.Testing.Platform"
},
"tools": {
- "dotnet": "10.0.110",
- "runtimes": {
- "dotnet/x86": [
- "$(MicrosoftNETCoreApp100Version)"
- ]
- }
+ "dotnet": "10.0.110"
},
"msbuild-sdks": {
"Microsoft.Build.NoTargets": "3.7.0",