Done the way the owner asked and the spike mapped: the crate and the manifests renamed, then what the build reported fixed. Layers: 138 "proto unresolved" errors across 169 files; cargo fmt reordering imports; six fixture paths built as strings in brokerd's and bxctl's tests, which the compiler cannot see, and comments naming crates/proto/; the crate-dependency check and its self-test. One more the spike did not reach: a `\nproto =` key inside a printf format in the self-test, which a word-boundary replacement skips because `n` and `p` are both word characters. make gate: gate: ok, 944 tests; no new entry in /tmp. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
43 lines
1.3 KiB
Rust
43 lines
1.3 KiB
Rust
//! A `brokerd` that accepts and never answers does not hang `bxctl` (M3a review finding 9).
|
|
|
|
#[path = "support/temp.rs"]
|
|
mod temp;
|
|
use std::os::unix::net::UnixListener;
|
|
use std::time::{Duration, Instant};
|
|
|
|
use bxcore::{Empty, Message};
|
|
use bxctl::admin::{ADMIN_TIMEOUT, request_with_timeout};
|
|
|
|
#[test]
|
|
fn the_default_is_thirty_seconds() {
|
|
assert_eq!(ADMIN_TIMEOUT, Duration::from_secs(30));
|
|
}
|
|
|
|
#[test]
|
|
fn a_silent_brokerd_is_an_error_after_the_timeout() {
|
|
let dir = temp::TempDir::new("bx-admin-timeout");
|
|
let socket = dir.join("admin.sock");
|
|
let listener = UnixListener::bind(&socket).unwrap();
|
|
let held = std::thread::spawn(move || {
|
|
let (stream, _) = listener.accept().unwrap();
|
|
std::thread::sleep(Duration::from_millis(2_000));
|
|
drop(stream);
|
|
});
|
|
|
|
let started = Instant::now();
|
|
let got = request_with_timeout(
|
|
&socket,
|
|
Message::Approvals(Empty {}),
|
|
Duration::from_millis(200),
|
|
);
|
|
let took = started.elapsed();
|
|
let text = got.expect_err("a silent brokerd is an error").to_string();
|
|
assert!(
|
|
text.contains("whether it acted is unknown"),
|
|
"brokerd may have approved and run the call before going quiet: {text}"
|
|
);
|
|
assert!(took < Duration::from_millis(1_500), "waited {took:?}");
|
|
held.join().unwrap();
|
|
let _ = std::fs::remove_dir_all(&dir);
|
|
}
|