swift-testing icon indicating copy to clipboard operation
swift-testing copied to clipboard

Using recording an issue inside of a detached task causes a crash.

Open younata opened this issue 8 months ago • 7 comments

Description

This is something I learned while researching potential ways to address #475. Which, at the time I wrote that issue, I thought would have just resulted in the failure being silently dropped.

The current way of determining what the current reporting tests natively in Swift-Testing is broken when you run an expect inside of a detached task. Technically, you get a failing test result, but it's because the test runner crashed. I haven't yet spelunked enough through the codebase to figure out where that crash is.

This is because Test.current is stored as a task-local value. Which means that when you make an expect inside of a detached task, Swift Testing has lost that context, which means that Test.current is incorrectly (from the semantics of the current running test) as nil.

I don't know the concurrency system well enough to be able to suggest a good solution. The issue is that, because Swift Testing supports task-based parallelization, the value of Test.current strongly depends on the task it's running on. Which makes having a global Test.current like what's in swift-corelibs-xctest the wrong solution.

Expected behavior

No response

Actual behavior

No response

Steps to reproduce

This test should pass. The test runner crashes with a non-zero error instead.

import Testing

@Test func CheckingExpectWithDetachedTasks() async {
    await Task.detached {
        #expect(Bool(false))
    }.value
}

Screenshot 2024-06-13 at 6 41 15 AM

swift-testing version/commit hash

Testing Library Version: 75.7 (arm64e-apple-macos13.0)

Swift & OS version (output of swift --version ; uname -a)

No response

younata avatar Jun 13 '24 14:06 younata