Private
Public Access
0
0
Commit Graph

3 Commits

Author SHA1 Message Date
ed 34290e5d1a test(watchdog): update PYTEST_FINISHED_TIMEOUT_SECONDS to 600 to match conftest 2026-06-09 18:42:53 -04:00
ed b0fefb2aab fix(tests): use pytest_terminal_summary as primary 'session done' signal
The previous smart watchdog (44b0b5d4, 91b19c90) used pytest_unconfigure as its signal. But pytest_unconfigure fires AFTER all fixtures, terminal summary, and finalizers — at the very end of the session. If anything in conftest's chain (e.g., the io_pool created in AppController.__init__ at conftest line ~65) hangs in __del__, pytest_unconfigure never gets called. Result: every batch's watchdog waited the full 60s/90s and then fired.

The right signal is pytest_terminal_summary, which fires AFTER the test summary is printed (the user can see '241 passed, 1 skipped in 32.30s' in the output) but BEFORE the shutdown hangs begin. At that point the test session is logically done; the watchdog can give a short 5s grace for normal finalization, then os._exit(0) so the runner can move to the next batch.

The previous attempts and why they failed (documented in test_conftest_smart_watchdog.py docstring):
  - e1c8730f: 30s os._exit(0) cut off batches mid-test
  - 719c5e27: os._exit(2) but daemon thread fired on every batch
  - 91b19c90: kept exit 2 but pytest_unconfigure never fires when io_pool hangs
  - 44b0b5d4: pytest_unconfigure as signal still hung
  - 2026-06-07 final: pytest_terminal_summary fires after summary print, before shutdown hangs

New contract:
  - Normal batch: pytest_terminal_summary fires at ~32s (after summary
    is printed), 5s grace, os._exit(0). Total: 37s.
  - Hung in test execution: pytest_terminal_summary never fires,
    smart watchdog waits 300s, fires os._exit(2).
  - Hung in conftest load (before any test): unconditional watchdog
    fires os._exit(2) at 60s.

7 tests in test_conftest_smart_watchdog.py updated to match:
  - test_terminal_summary_hook_sets_finished_event: primary signal source
  - test_unconfigure_hook_is_fallback_signal: fallback for crashes
  - test_clean_exit_uses_zero_exit_code: os._exit(0) after signal
  - test_hang_uses_nonzero_exit_code: os._exit(2) for true hangs
2026-06-07 13:37:09 -04:00
ed 44b0b5d4ee fix(tests): add SMART hang watchdog (pytest_unconfigure-triggered, exit 2)
Re-add hang protection after the user's run showed pytest hanging in interpreter shutdown (ThreadPoolExecutor.__del__ / live_gui teardown) after Batch 1 completed successfully. The previous naive watchdog (e1c8730f, 30s os._exit(0)) cut off batches mid-test; the immediate removal (4103c08e) let real hangs wait 1000s for the runner's subprocess timeout.

This SMART watchdog only fires when pytest is ACTUALLY hanging:
  - pytest_unconfigure hook sets _pytest_finished_event when the
    test session is done (BEFORE interpreter finalization).
  - Watchdog waits for the event with 120s timeout:
      * If not set in 120s: pytest is hung in test execution -> os._exit(2).
      * If set: pytest finished cleanly; give 30s for normal
        interpreter shutdown (ThreadPoolExecutor.__del__, etc.).
      * If still alive after grace: io_pool / live_gui teardown
        is hung -> os._exit(2).
  - Exit code 2 (not 0) so run_tests_batched.py correctly reports
    a failed batch (CalledProcessError). The 0 in the previous
    version masked hangs and hid test failures.

Contract:
  - Normal batch (35s execution, 2s shutdown): pytest_unconfigure
    fires at 35s, watchdog's first wait returns immediately, 30s
    grace elapses without fire, pytest exits with 0. Runner: passed.
  - Hung batch: pytest_unconfigure never fires, watchdog fires
    os._exit(2) at 120s. Runner: failed.
  - Hung shutdown (io_pool.__del__ blocks): pytest_unconfigure
    fires, 30s grace elapses, watchdog fires os._exit(2). Runner: failed.

5 new tests in tests/test_conftest_smart_watchdog.py:
  - test_watchdog_thread_registered: daemon thread named conftest-smart-watchdog
  - test_watchdog_thread_is_daemon: doesn't block pytest exit
  - test_pytest_unconfigure_sets_finished_flag: hook exists in conftest
  - test_watchdog_uses_non_zero_exit_code: os._exit(2) is used
  - test_watchdog_timeouts_documented: 120s and 30s are present
2026-06-07 13:18:11 -04:00