Compare commits

..
Author SHA1 Message Date
Rsclub2_2andClaude Opus 5.5 ed5ef82e95 ci: print full stacks of failed tests and keep reports on a cancel
Nightly #303 named the hanging test, SelectedStationMessageUiVisual-
RenderingTest at scene.render(), but the short exception format showed
only that line, not the call that blocked below it. The job timeout
cancels the run, and the test reports were kept only on failure().

Failed tests now print their full stack, causes included, and the
reports are uploaded on cancelled() as well.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 01:11:04 +02:00
Rsclub2_2andClaude Opus 5.5 af8affda8c ci: fail hanging tests by name instead of holding the job (#149)
Nightly #302 and the PR check for #147 hung in :app-desktop:test for
over an hour, and the log named only the task. Thirteen reruns of the
same commit passed, so the hang is rare and still unidentified.

Every test now gets a two-minute JUnit timeout in a separate thread, so
even an uninterruptible hang fails with the test's name and the stack
where it stood. The test jobs are capped at 20 minutes for a hang
outside any test.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 00:47:25 +02:00
4 changed files with 14 additions and 3 deletions

No files matched your search

+3 -1
View File
@@ -111,8 +111,10 @@ jobs:
exit 1 exit 1
fi fi
# Also on cancelled(): the job timeout cancels a hanging run, and the reports of the
# classes that did finish carry the timed-out tests' full stacks.
- name: Keep the test reports on a failure - name: Keep the test reports on a failure
if: failure() if: failure() || cancelled()
uses: actions/upload-artifact@v7 uses: actions/upload-artifact@v7
with: with:
name: test-results name: test-results
+3 -1
View File
@@ -286,8 +286,10 @@ jobs:
if-no-files-found: ignore if-no-files-found: ignore
retention-days: 14 retention-days: 14
# Also on cancelled(): the job timeout cancels a hanging run, and the reports of the
# classes that did finish carry the timed-out tests' full stacks.
- name: Keep the test reports on a failure - name: Keep the test reports on a failure
if: failure() if: failure() || cancelled()
uses: actions/upload-artifact@v7 uses: actions/upload-artifact@v7
with: with:
name: test-results name: test-results
+3 -1
View File
@@ -130,8 +130,10 @@ jobs:
exit 1 exit 1
fi fi
# Also on cancelled(): the job timeout cancels a hanging run, and the reports of the
# classes that did finish carry the timed-out tests' full stacks.
- name: Keep the test reports on a failure - name: Keep the test reports on a failure
if: failure() if: failure() || cancelled()
uses: actions/upload-artifact@v7 uses: actions/upload-artifact@v7
with: with:
name: test-results name: test-results
+5
View File
@@ -151,6 +151,11 @@ subprojects {
*/ */
systemProperty("junit.jupiter.execution.timeout.default", "2m") systemProperty("junit.jupiter.execution.timeout.default", "2m")
systemProperty("junit.jupiter.execution.timeout.thread.mode.default", "SEPARATE_THREAD") systemProperty("junit.jupiter.execution.timeout.thread.mode.default", "SEPARATE_THREAD")
// The default short format prints only the first frame of each cause, which for a
// timed-out test is the line it hung in but not the call that blocked there.
testLogging {
exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL
}
finalizedBy(checkTestUserHome) finalizedBy(checkTestUserHome)
} }