Commits
Tarun Sukhani authored f81305ebf30
feat(testrunner): split DB-touching unit tests onto a single-permit lane Stage 1 routed every U:-prefixed unit test through one N-wide parallel gate. That breaks tests that call Fixtures.deleteDatabase() / load() or otherwise mutate JPA state — two such tests running concurrently against the same DB race on the table-truncate and detach each other's in-flight entities. TestRunner.list now ASM-walks each unit test's transitive call graph through application classes only and tags it as DB-touching if any reachable class references: * play.test.Fixtures * any class under play.db.* * any application entity (assignable to play.db.jpa.Model) DB-touching tests get the D: prefix; pure tests stay on U:. The walk stops at non-application boundaries (framework / library / JDK), since application code reaches DB only through its own packages or directly through Play's DB APIs — both caught by the marker checks. ASM scan failures default to D: (DB-serial) so misclassification can't fall back to the unsafe parallel path. FirePhoque consumes both prefixes through a shared VT executor with two gates: a parallel pureGate (N permits, default 16) and a single-permit dbGate. The two lanes run concurrently — pure tests don't touch the DB, so they aren't blocked by the serializing DB lane. Common gating logic factored into submitGated() so both lanes share the acquire/ runOneUnitTest/release try-finally. Net effect: DB-isolation preserved for fixture-driven tests, full parallelism preserved for pure unit tests, and the two run side-by-side instead of one waiting for the other. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>