Repository navigation
test: planted-bug follow-ups (restart, budget, backoff, link and timer oracles; Kani layer; bounded waits) - #265
Conversation
fea546f to
9f5ccf6
Compare
…alesce_into_one_round (flaky on one CPU)
🤖 Codex Code ReviewNo actionable issues found. The changes improve bounded waits and fuzzing coverage without modifying production actor behavior. I couldn’t run tests: the pinned Rust toolchain requires initialization, which is blocked by the read-only Rustup directory. Automated review by OpenAI Codex · gpt-6.1-sol · custom prompt |
🤖 Claude Code ReviewReview: PR #265, planted-bug follow-upsThis PR only touches tests, the fuzz harness, docs and scripts. No runtime code in
|
🤖 Grok Code ReviewI'll inspect the new deadline helper and the fuzzer oracles more closely, since those are the behavioral changes most likely to hide bugs. Automated review by Grok (xAI) · grok-4.7 · custom prompt |
🤖 Gemini Code ReviewThe bounded-wait helper ( I found a couple of edge cases in the new fuzzer oracle state tracking that can cause false positives or missed checks under certain generated scenarios/schedules: 1.
|
🤖 DeepSeek Code ReviewReview notesMostly test-harness changes; the bounded Issues
Automated review by DeepSeek · deepseek-v4-pro · custom prompt |
🤖 Kimi Code ReviewNo blocking correctness or concurrency issues found. The bounded waits are a useful improvement, and the new fuzz bookkeeping avoids holding the world lock across awaits. Minor test-harness concerns:
Otherwise, the timer cancellation accounting, restart-oracle bounds, and Automated review by Kimi (Moonshot AI) · kimi-k3.1-pro · custom prompt |
…rt) into feat/otp-exit-signals
…(0.8) #265's X3 linked-reason oracle (an actor stopped only through a link publishes its peer's reason, and a Normal peer exit does not stop it) predates 0.8's late links: a link made after the peer's death point delivers a NoProc exit signal, so a non-trapping caller ends NoProc whatever the peer's reason (E4), as the existing X3 Exit-reason oracle already accepts. With it, the corpus and 3000 generated inputs pass.
…, never hang) Planted-bug follow-up (#265): under planted bug 20, tasks::actor::tests::backend_blocking_handles_send_and_request hung the job instead of failing (its assertion failed, then the Tokio runtime's teardown waited forever for the Blocking backend's thread); other unit tests under concurrency/src also waited without a bound. concurrency/src/test_wait.rs gains HANG (120 s, as tests/support/deadline.rs), `bounded(name, body)` and `within(name, future)`. Every #[test] under concurrency/src whose body starts, calls, joins or waits on actors (162 tests in 18 files) runs its whole body (runtime and teardown included) through `bounded`, on a thread named after the test; a #[tokio::test] body goes through `within`. A body still running after 120 s fails the test by name; a panic in the body, an assertion or a #[should_panic] test's expected one, is re-raised unchanged. No unit test runs on paused Tokio time, so none is exempted. Checked: with planted bug 20 applied by hand (its 0.7 patch does not apply), backend_blocking_handles_send_and_request fails after 120 s with "timed out after 120s: ...backend_blocking_handles_send_and_request did not finish". Unit tests pass in the default, no-default and failpoints+lifecycle-trace+metrics feature sets (227, 110, 234).
Follow-ups to #247 (planted-bug sensitivity). Tests, fuzz oracles, the planted runner and docs only; no library code.
Fuzzer oracles (
fuzz/src/oracles.rs,fuzz/src/driver.rs)max_restarts.stable_after), from zero through it with jitter.Normalexit and otherwise publishes the peer's reason.Exitand no linked death after both sides unlinked.fuzz/tests/budget_reserved_after_round.rs.Second independent checks
01, 02: Kani
restart_window_admits_exactly_within_budget, now runner layer K (both are unobservable through the public API:reserve_retryre-checks the same window beforeadmit_in_windowruns). 06: fuzzer V6. 11: fuzzer X5. 21: fuzzer T1. Each shown failing with its bug planted.Bounded waits
within!(..)(concurrency/tests/support/deadline.rs, 120 s, virtual on the simulator) wraps 177 completion awaits in integration tests. Under bug 08, T now fails 19 named tests in 212 s instead of hanging. Bug 20 still hangstasks::actor::tests::backend_blocking_handles_send_and_request, a unit test insideconcurrency/src/tasks/actor.rs(#240's file, left alone); the runner now names hung tests.Flaky test
semantics_gaps::supervision_contract::concurrent_failures_coalesce_into_one_roundreadcurrent()after the first crash's OneForAll round had begun stopping siblings (ChildUnavailable(Stopping)). It now takes every generation before crashing any. Pinned to one CPU on fede: before, 8 of 300 and 3 of 150 runs failed (all at thatunwrap); after, 0 of 1000. A test assumption, not a library bug.Matrix (docs/TESTING.md, "Planted-bug sensitivity")
tasks/actor.rs)23 of 24 caught, every caught bug by at least two layers; 15 is still unobservable. Controls: unpatched baseline missed in every layer, F for 900 s twice (440k and 770k executions).
No library bugs found; no discrepancy between the new oracles and the TLA+ models (
Supervision.tlaRestarts/Retriesmatch the restart table the oracles encode).