chore: bump to 0.8.2, changelog for the PTY exit-signal fidelity fix
- version 0.8.1 -> 0.8.2 (patch: behavior-only bug fix in the local
feature's PTY waiter from db0b1fc; ADR-004 decision 1's negative-code
convention now holds on the PTY path; no API, wire-format, or
dependency change)
- CHANGELOG entry for 0.8.2 (review #004 resolution: the waitpid reap
mechanism, the signal round-trip notes, the tests, the docs)
- finish the em-dash sweep in prose 58da42a missed: doc comments in
tests/ (negotiation, pipe, pty, common) and fuzz/shared
(control_json, negotiation_frame, session_opseq); prose rewrites
only, no code, JSON literals, or wire shapes touched
- README checked: no version pins, nothing to update
Verification: cargo test; cargo test --all-features; cargo clippy
--all-targets -D warnings (default and --all-features); cargo fmt
--check; cargo doc --no-deps; fuzz/shared corpus replay (9 seeds pass);
cargo check + clippy for wasm32-unknown-unknown -D warnings; cargo
publish --dry-run --allow-dirty (43 files, 194.4 KiB); detached
campaigns over the four targets (chunk_frame 632s, negotiation_frame
602s, control_json 610s, session_opseq 608s) all exiting 0 with
0 crash/oom/timeout findings.
This commit is contained in:
1 parent
62f04c6856
commit
a701247ca6
11 files changed
+79
-28
No files matched your search
+3
-3
@@ -109,7 +109,7 @@ impl ClientSide {
|
||||
|
||||
/// Read a length-prefixed JSON error frame (Phase 1 framing, used
|
||||
/// for negotiation errors). The first byte of the 4-byte length
|
||||
/// prefix MUST be `0x00` (the framing-disambiguation invariant —
|
||||
/// prefix MUST be `0x00` (the framing-disambiguation invariant,
|
||||
/// ADR-052 §5); this method asserts that. Returns the parsed JSON.
|
||||
pub async fn read_error_frame(&mut self) -> serde_json::Value {
|
||||
let mut first = [0u8; 1];
|
||||
@@ -305,8 +305,8 @@ pub fn nanos_seed() -> u64 {
|
||||
/// Poll until `path` exists (or `timeout` elapses), sleeping 10 ms
|
||||
/// between probes. This is the readiness signal for tests that need
|
||||
/// the child to have reached a state (e.g. `exec`'d) before acting on
|
||||
/// it — replaces fixed pre-action sleeps, which fail spuriously on a
|
||||
/// loaded machine (review #001 N4). Returns `false` on timeout.
|
||||
/// it. This replaces fixed pre-action sleeps, which fail spuriously
|
||||
/// on a loaded machine (review #001 N4). Returns `false` on timeout.
|
||||
pub async fn wait_for_file(path: &std::path::Path, timeout: Duration) -> bool {
|
||||
let deadline = tokio::time::Instant::now() + timeout;
|
||||
loop {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#![cfg(feature = "local")]
|
||||
|
||||
//! Negotiation error tests — scenarios 14–18 of
|
||||
//! Negotiation error tests: scenarios 14–18 of
|
||||
//! `tasks/tty/integration-test.md`.
|
||||
//!
|
||||
//! 14. unknown_backend: error response, first byte `0x00`
|
||||
|
||||
+4
-4
@@ -1,6 +1,6 @@
|
||||
#![cfg(feature = "local")]
|
||||
|
||||
//! End-to-end integration tests for pipe mode (`terminal: None`) —
|
||||
//! End-to-end integration tests for pipe mode (`terminal: None`):
|
||||
//! `LocalTtyBackend` + `TtyAdapter::drive_session` over a
|
||||
//! `tokio::io::duplex` transport stand-in, running real commands.
|
||||
//!
|
||||
@@ -96,7 +96,7 @@ async fn pipe_signal_sigterm_kills_child() {
|
||||
.await;
|
||||
|
||||
// Readiness signal (N4): the child exec'd `sleep` once the marker
|
||||
// file exists — no fixed sleep.
|
||||
// file exists; no fixed sleep.
|
||||
assert!(
|
||||
common::wait_for_file(&marker, Duration::from_secs(5)).await,
|
||||
"child never became ready"
|
||||
@@ -171,8 +171,8 @@ async fn pipe_cancel_cleanup_kills_child_no_orphan() {
|
||||
/// 13. Resize no-op: negotiate `cmd:["cat"]`, send a `resize` control
|
||||
/// chunk, assert no error (PipeControl::resize is a no-op). Close the
|
||||
/// write half to signal end-of-input (the adapter's input pump drops
|
||||
/// the `ChildStdin` on `ConnectionClosed`, which closes the pipe —
|
||||
/// tokio's `ChildStdin::poll_shutdown` is a no-op on Unix). Await exit.
|
||||
/// the `ChildStdin` on `ConnectionClosed`, which closes the pipe
|
||||
/// (tokio's `ChildStdin::poll_shutdown` is a no-op on Unix). Await exit.
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
|
||||
async fn pipe_resize_noop() {
|
||||
let backend = Arc::new(LocalTtyBackend::new());
|
||||
|
||||
+3
-3
@@ -1,6 +1,6 @@
|
||||
#![cfg(feature = "local")]
|
||||
|
||||
//! End-to-end integration tests for PTY mode (`terminal: Some`) —
|
||||
//! End-to-end integration tests for PTY mode (`terminal: Some`):
|
||||
//! `LocalTtyBackend` + `TtyAdapter::drive_session` over a
|
||||
//! `tokio::io::duplex` transport stand-in, running real commands.
|
||||
//!
|
||||
@@ -128,7 +128,7 @@ async fn pty_signal_sigint_kills_child() {
|
||||
.await;
|
||||
|
||||
// Readiness signal (N4): the child exec'd `sleep` once the marker
|
||||
// file exists — no fixed sleep.
|
||||
// file exists; no fixed sleep.
|
||||
assert!(
|
||||
common::wait_for_file(&marker, Duration::from_secs(5)).await,
|
||||
"child never became ready"
|
||||
@@ -154,7 +154,7 @@ async fn pty_signal_sigint_kills_child() {
|
||||
/// <marker>; sleep 60'` (sleep is a child of bash, bash stays in the
|
||||
/// foreground waiting), wait for the marker, send `signal:"INT"`,
|
||||
/// assert the `sleep` child also receives the signal (the process
|
||||
/// group is targeted — REQ-TTY-02).
|
||||
/// group is targeted; REQ-TTY-02).
|
||||
#[cfg(unix)]
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
|
||||
async fn pty_signal_reaches_process_group_child() {
|
||||
|
||||
Reference in new issue
Block a user