lesavka/tests/chaos/input/input_packet_ordering_chaos_contract.rs

47 lines
1.8 KiB
Rust

// Simulated delayed/duplicate input packet contracts.
//
// Scope: verify the server HID stream remains bounded and freshness-biased
// under packet pressure, without opening real HID devices.
// Targets: `server/src/main/relay_service/input_stream_rpc.rs` and
// `server/src/runtime_support/hid_write.rs`.
// Why: the input path should not build an unbounded backlog that turns a
// delayed packet into a stale click or keystroke seconds later.
const INPUT_STREAM_RPC: &str =
include_str!("../../../server/src/main/relay_service/input_stream_rpc.rs");
const HID_WRITE: &str = include_str!("../../../server/src/runtime_support/hid_write.rs");
#[test]
fn keyboard_stream_uses_small_ack_channel_and_bounded_report_delay() {
assert!(
INPUT_STREAM_RPC.contains("tokio::sync::mpsc::channel(32)"),
"keyboard stream should keep the echo/ack queue small"
);
assert!(
INPUT_STREAM_RPC.contains("let report_delay = live_keyboard_report_delay();"),
"keyboard stream should preserve the configured live report pacing"
);
}
#[test]
fn hid_write_retries_backpressure_but_does_not_retry_forever() {
assert!(HID_WRITE.contains("LESAVKA_HID_WRITE_RETRIES"));
assert!(HID_WRITE.contains(".unwrap_or(24)"));
assert!(HID_WRITE.contains(".max(1)"));
assert!(
HID_WRITE.contains(
"Err(last_error.unwrap_or_else(|| std::io::Error::from_raw_os_error(libc::EAGAIN)))"
),
"bounded retry exhaustion should surface EAGAIN instead of hanging"
);
}
#[test]
fn eagain_is_dropped_in_the_stream_instead_of_triggering_gadget_recovery() {
assert!(
INPUT_STREAM_RPC.contains("if e.raw_os_error() == Some(libc::EAGAIN)")
&& INPUT_STREAM_RPC.contains("write would block (dropped)"),
"stale HID backpressure should drop the packet, not wedge recovery"
);
}