fleetd #537: pin CapturedLog.close()'s appender-detach and setLevel-immunity contracts #540

Merged
ltms merged 1 commits from worker/537-capturedlog-close-e4c437-2 into main 2026-09-12 08:42:19 +02:00
Member

Test-only change. Adds fleetd/src/test/java/dev/ltms/fleet/testing/CapturedLogTest.java pinning the two halves of CapturedLog#close() that were not covered before this:

  1. The appender is detached on close (observable via events() not growing after close, not via iteratorForAppenders()).
  2. The level is restored on close, pinned in one readable place independent of any production test.
  3. setLevel(Level) mid-capture does not change what close() restores (the helper's own javadoc claim, previously unchecked).

Measured gap before this change: deleting logger.detachAppender(appender); from CapturedLog.close() left mvn clean install green (1701 tests, 0 failures, 0 errors) -- the appender-detach half of fleetd #525's fix was unmeasured.

CapturedLog.java itself is untouched; only the new test file is added.

Build: mvn clean install -> Tests run: 1704, Failures: 0, Errors: 0, Skipped: 0, BUILD SUCCESS (up from 1701, +3 new tests).

Mutation testing performed (each restored after, sha256 verified pristine before/after):

  • Removed logger.detachAppender(appender): only closeDetachesTheAppenderSoALaterLogIsNotCaptured went red.
  • Removed logger.setLevel(originalLevel): closeRestoresTheLevelCapturedAtOpen went red (closeRestoresTheLevelCapturedAtOpen and setLevelDuringCaptureDoesNotChangeWhatCloseRestores both went red, since both depend on the same restore line -- expected, not a flaw).
  • Made setLevel() overwrite the field close() restores from (originalLevel non-final): only setLevelDuringCaptureDoesNotChangeWhatCloseRestores went red -- isolates the setLevel-immunity contract exactly.

Final control re-run after restoring CapturedLog.java to pristine: BUILD SUCCESS, 1704/0/0/0, git status clean.

Test-only change. Adds fleetd/src/test/java/dev/ltms/fleet/testing/CapturedLogTest.java pinning the two halves of CapturedLog#close() that were not covered before this: 1. The appender is detached on close (observable via events() not growing after close, not via iteratorForAppenders()). 2. The level is restored on close, pinned in one readable place independent of any production test. 3. setLevel(Level) mid-capture does not change what close() restores (the helper's own javadoc claim, previously unchecked). Measured gap before this change: deleting logger.detachAppender(appender); from CapturedLog.close() left mvn clean install green (1701 tests, 0 failures, 0 errors) -- the appender-detach half of fleetd #525's fix was unmeasured. CapturedLog.java itself is untouched; only the new test file is added. Build: mvn clean install -> Tests run: 1704, Failures: 0, Errors: 0, Skipped: 0, BUILD SUCCESS (up from 1701, +3 new tests). Mutation testing performed (each restored after, sha256 verified pristine before/after): - Removed logger.detachAppender(appender): only closeDetachesTheAppenderSoALaterLogIsNotCaptured went red. - Removed logger.setLevel(originalLevel): closeRestoresTheLevelCapturedAtOpen went red (closeRestoresTheLevelCapturedAtOpen and setLevelDuringCaptureDoesNotChangeWhatCloseRestores both went red, since both depend on the same restore line -- expected, not a flaw). - Made setLevel() overwrite the field close() restores from (originalLevel non-final): only setLevelDuringCaptureDoesNotChangeWhatCloseRestores went red -- isolates the setLevel-immunity contract exactly. Final control re-run after restoring CapturedLog.java to pristine: BUILD SUCCESS, 1704/0/0/0, git status clean.
agent added 1 commit 2026-09-12 08:37:20 +02:00
fleetd #537: pin CapturedLog.close()'s appender-detach and setLevel-immunity contracts
CI / contract (pull_request) Successful in 1m2s
CI / build (pull_request) Successful in 1m36s
202e37e3b3
Only the level-restore half of close() was pinned before this
(WorktreeSessionManagerTest). Deleting logger.detachAppender(appender)
from close() left mvn clean install green (1701 tests, 0 failures) --
the appender-detach half of the contract was unmeasured.

Adds CapturedLogTest with three tests, each using a logger name no
production class uses:
- closeDetachesTheAppenderSoALaterLogIsNotCaptured: an event logged
  after close() must not land in events().
- closeRestoresTheLevelCapturedAtOpen: the helper's headline contract
  in one place, independent of any production class.
- setLevelDuringCaptureDoesNotChangeWhatCloseRestores: setLevel()'s
  own javadoc claim that close() always restores the level captured
  at construction, never a value set through setLevel() mid-capture.

Test-only change; CapturedLog.java itself is untouched.
ltms merged commit 57cd96f5e6 into main 2026-09-12 08:42:19 +02:00
Sign in to join this conversation.