Skip to content

test: exit TestRunner upon a crash instead of waiting for a timeout#373

Merged
edusperoni merged 1 commit into
NativeScript:mainfrom
mukaschultze:fix/test-runner-timeout-crash
May 15, 2026
Merged

test: exit TestRunner upon a crash instead of waiting for a timeout#373
edusperoni merged 1 commit into
NativeScript:mainfrom
mukaschultze:fix/test-runner-timeout-crash

Conversation

@mukaschultze
Copy link
Copy Markdown
Contributor

testRuntime() previously called wait(for:timeout:) with a single 300s
budget. If the runtime crashed (EXC_BAD_ACCESS or similar) the HTTP
POST that fulfills runtimeUnitTestsExpectation never arrived, so the
test would sit out the full 5 minutes before reporting a generic
timeout, masking crashes as slow tests in CI.

Add a 0.5s polling Timer that watches XCUIApplication.state and
fulfills the expectation when the app reaches .notRunning, recording
the exit via a didCrash flag. The Timer is registered on
RunLoop.main in .common modes so it keeps firing while XCTWaiter
spins the run loop. After the wait resolves, didCrash drives a
specific XCTFail pointing reviewers at
~/Library/Logs/DiagnosticReports/TestRunner-*.ips, while a true
timeout still surfaces as the original "exceeded N seconds" failure.

Switching the expectation from self.expectation(...) to a standalone
XCTestExpectation is required because XCTestCase tracks the former
and requires waitForExpectations; driving it through XCTWaiter
directly avoids that constraint.

testRuntime() previously called wait(for:timeout:) with a single 300s
budget. If the runtime crashed (EXC_BAD_ACCESS or similar) the HTTP
POST that fulfills runtimeUnitTestsExpectation never arrived, so the
test would sit out the full 5 minutes before reporting a generic
timeout — masking crashes as slow tests in CI.

Add a 0.5s polling Timer that watches XCUIApplication.state and
fulfills the expectation when the app reaches .notRunning, recording
the exit via a didCrash flag. The Timer is registered on
RunLoop.main in .common modes so it keeps firing while XCTWaiter
spins the run loop. After the wait resolves, didCrash drives a
specific XCTFail pointing reviewers at
~/Library/Logs/DiagnosticReports/TestRunner-*.ips, while a true
timeout still surfaces as the original "exceeded N seconds" failure.

Switching the expectation from self.expectation(...) to a standalone
XCTestExpectation is required because XCTestCase tracks the former
and requires waitForExpectations; driving it through XCTWaiter
directly avoids that constraint.
@edusperoni edusperoni changed the title fix: exit TestRunner upon a crash instead of waiting for a timeout ci: exit TestRunner upon a crash instead of waiting for a timeout May 15, 2026
@edusperoni edusperoni changed the title ci: exit TestRunner upon a crash instead of waiting for a timeout test: exit TestRunner upon a crash instead of waiting for a timeout May 15, 2026
@edusperoni edusperoni merged commit a823a2a into NativeScript:main May 15, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants