RFR: 8328629: JUnit test without a timeout value can hang indefinitely

Kevin Rushforth kcr at openjdk.org
Thu Sep 19 18:30:52 UTC 2024


This PR adds a default timeout of 120 seconds for JUnit 5 tests that do not have an explicit `@Timeout` on either the methods or the class, and a default timeout of 20 seconds for lifecycle methods (e.g., `@BeforeEach`, `@BeforeAll`, `@AfterEach`, `@AfterAll`).

JUnit 5 effects its timeout by interrupting the test thread. We have several tests that catch and ignore InterruptedException for sleep or await, so I fixed these tests to throw an error if InterruptedException is caught (they may or may not be a problem, but if any of them can happen in a loop, it would block the timeout from killing the test).

While testing this, I discovered that by itself, this JUnit 5 timeout is ineffective if the deadlock described in [JDK-8238505](https://bugs.openjdk.org/browse/JDK-8238505)  occurs. The reason for this is that the deadlock almost always occurs when called from a shutdown hook (called by `System.exit`), and that prevents the process from exiting even when interrupted by the test runner after the timeout. A separate PR is out for that bug fix.

### Testing instructions

I tested this in connection with PR #1574 / [JDK-8340405](https://bugs.openjdk.org/browse/JDK-8340405) using my [test-timeout-and-shutdown-hang](https://github.com/kevinrushforth/jfx/tree/test-timeout-and-shutdown-hang) branch. That branch has the fixes from both this PR and PR #1574 as well as tests that will hang indefinitely without the fixes and fail due to the expected timeout with the fixes.

The default timeout values for test and lifecycle methods can be modified using a gradle property:

* `JUNIT_TEST_TIMEOUT` : default = 120s
* `JUNIT_LIFECYCLE_TIMEOUT` : default = 20s

For example, to set a timeout of 60 seconds for tests and 15 seconds for lifecycle methods:


gradle -PJUNIT_TEST_TIMEOUT=60s -PJUNIT_LIFECYCLE_TIMEOUT=15s test

-------------

Commit messages:
 - Fix typo (extra spaces) in system property name
 - 8328629: JUnit test without a timeout value can hang indefinitely

Changes: https://git.openjdk.org/jfx/pull/1575/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=1575&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8328629
  Stats: 108 lines in 29 files changed: 81 ins; 2 del; 25 mod
  Patch: https://git.openjdk.org/jfx/pull/1575.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/1575/head:pull/1575

PR: https://git.openjdk.org/jfx/pull/1575


More information about the openjfx-dev mailing list