diff --git a/src/TUnit.Engine/TestExecutor.cs b/src/TUnit.Engine/TestExecutor.cs index 8566aa0d4c..94614bfa82 100644 --- a/src/TUnit.Engine/TestExecutor.cs +++ b/src/TUnit.Engine/TestExecutor.cs @@ -458,7 +458,9 @@ private static async ValueTask ExecuteTestAsync(AbstractExecutableTest executabl if (executableTest.Context.InternalDiscoveredTest?.TestExecutor is { } testExecutor) { await testExecutor.ExecuteTest(executableTest.Context, - () => new ValueTask(executableTest.InvokeTestAsync(executableTest.Context.Metadata.TestDetails.ClassInstance, cancellationToken))).ConfigureAwait(false); + () => new ValueTask(executableTest.InvokeTestAsync( + executableTest.Context.Metadata.TestDetails.ClassInstance, + executableTest.Context.Execution.CancellationToken))).ConfigureAwait(false); } else { diff --git a/tests/TUnit.Engine.Tests/TestExecutorCancellationTokenTests.cs b/tests/TUnit.Engine.Tests/TestExecutorCancellationTokenTests.cs new file mode 100644 index 0000000000..8b3ed57d3f --- /dev/null +++ b/tests/TUnit.Engine.Tests/TestExecutorCancellationTokenTests.cs @@ -0,0 +1,20 @@ +using Shouldly; +using TUnit.Engine.Tests.Enums; + +namespace TUnit.Engine.Tests; + +public class TestExecutorCancellationTokenTests(TestMode testMode) : InvokableTestBase(testMode) +{ + [Test] + public async Task Test() + { + await RunTestsWithFilter( + "/*/*/TestExecutorCancellationTokenTests/*", + [ + result => result.ResultSummary.Outcome.ShouldBe("Completed"), + result => result.ResultSummary.Counters.Total.ShouldBe(1), + result => result.ResultSummary.Counters.Passed.ShouldBe(1), + result => result.ResultSummary.Counters.Failed.ShouldBe(0) + ]); + } +} diff --git a/tests/TUnit.TestProject/TestExecutorCancellationTokenTests.cs b/tests/TUnit.TestProject/TestExecutorCancellationTokenTests.cs new file mode 100644 index 0000000000..5076d624b2 --- /dev/null +++ b/tests/TUnit.TestProject/TestExecutorCancellationTokenTests.cs @@ -0,0 +1,28 @@ +using TUnit.Core.Executors; +using TUnit.Core.Interfaces; +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject; + +[EngineTest(ExpectedResult.Pass)] +public class TestExecutorCancellationTokenTests +{ + [Test] + [TestExecutor] + public async Task LinkedCancellationToken_IsPassedToTest(CancellationToken cancellationToken) + { + await Assert.That(cancellationToken.IsCancellationRequested).IsTrue(); + } +} + +public class CancellingTestExecutor : ITestExecutor +{ + public async ValueTask ExecuteTest(TestContext context, Func action) + { + using var cancellationTokenSource = new CancellationTokenSource(); + context.Execution.AddLinkedCancellationToken(cancellationTokenSource.Token); + cancellationTokenSource.Cancel(); + + await action(); + } +}