| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
The spec317_mustSupportACumulativePendingElementCountUpToLongMaxValue TCK test intermittently hangs on CI (seen on Java 21). Root cause: a race between onComplete() and finallyAfterEachPromiseFinishes() where the queue-emptiness check and the onCompleteRun read/write are not atomic — the last CF can complete between the check and the set, leaving the runnable stranded forever. Fix by extending the existing ReentrantLock scope to also cover onCompleteRun, making the emptiness check and runnable set/claim a single atomic operation on both sides. Runnables are executed outside the lock to avoid deadlocks with user code. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Test ReportTest Results
Code Coverage (Java 25)
Changed Class Coverage (59 classes)
|
Sorry, something went wrong.
Add jcstress tests for CompletionStageSubscriber race condition verification and integrate them into both PR and master CI workflows. Since jcstress doesn't produce JUnit XML, parse its console output to extract test counts for the unified test report. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
tee opens the output file immediately at startup. Since build/ doesn't exist yet on a fresh runner, tee fails to open the file and exits with code 1 (while still copying stdin to stdout). pipefail then picks up that non-zero exit code, failing the step despite gradle succeeding. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The test subscribes 3 subscribers to the same publisher and asserts all receive elements in the same order. With a new single-thread executor per mapping call, each CF ran on its own thread, making delivery order depend on thread scheduling. Sometimes elements arrived in order (test passed), sometimes not (assertion failed, caught by TCK, converted to skip). Use a shared single-thread executor per publisher (matching the pattern already used by the Ordered publisher variants) so CFs complete sequentially in submission order. The test now deterministically passes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Reactive Streams TCK silently converts optional test failures to skips. Add a post-run verification step that asserts exactly 49 tests are skipped, catching any newly-silenced failure or newly-passing test immediately. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The previous gate only checked overall line/branch/method coverage, which allowed per-class regressions to pass when offset by improvements elsewhere. Now fails on any class regressing any metric by >0.05%. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Skip classes with 0 total lines (interfaces, annotations, abstract classes) in the per-class coverage gate and changed-class display, fixing 113 false regressions caused by JaCoCo non-determinism for non-concrete classes. Also exclude these from future baseline generation. Add tests for GraphQLList.equals()/hashCode() and for CompletionStageOrderedSubscriber's cfExceptionUnwrap error path (catch block in emptyInFlightQueueIfWeCan). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…notation These methods delegate to super and their coverage is non-deterministic (depends on hash collisions), causing false regressions in the per-class coverage gate. A Gradle task uses ASM to inject an invisible @generated annotation post-compilation, which JaCoCo's AnnotationGeneratedFilter recognizes and excludes from reports. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CI installs JDK 25 and labels the default test run as "java25", but the Gradle toolchain was pinned to 21 causing Gradle to auto-provision JDK 21 instead of using the CI-installed JDK 25. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
| Back | FazBrowse Home | New Git URL |
Summary
Details
Race condition fix
The race occurred in CompletionStageSubscriber when onComplete() checked inFlightDataQ.isEmpty() and decided to signal downstream, but between that check and setting onCompleteRun, another thread could drain the last CF and miss the runnable — leaving the subscriber hanging forever. Fix: extend the existing ReentrantLock scope to make the emptiness check and onCompleteRun set/claim a single atomic operation on both sides.
jcstress integration
jcstress doesn't produce JUnit XML, so console output is parsed to extract test counts (planned, passed, failed, soft errs, hard errs) for the unified test report.
Coverage gate
The per-class gate compares each class's line/branch/method coverage against the master baseline. Classes with 0 total lines (interfaces, annotations) are skipped to avoid false positives from JaCoCo non-deterministic attribution on non-concrete classes. The master workflow also excludes these from future baselines.
Missing test coverage
Test plan
🤖 Generated with Claude Code