Files
boxmaker/crates/brokerd/tests/notices.rs
T
kyleandClaude Opus 5.5 a15c428ea6 tests: every temporary path is removed by a guard; no leftovers in /tmp
About 10,000 test leftovers had built up in titan's /tmp. loopd's Home
and FakeServer, its fake broker's socket, bxctl's temp sockets, fake
loopd and command homes, inferproxy's socket, and a few brokerd and
toolkit tests created uniquely named directories or sockets and never
removed them, or removed them by hand at the end, which a failing test
skips. Each is now a guard removed on drop (bxctl gains
tests/support/temp.rs). Two races also left gatewayd homes behind: the
test Running only signalled its server to stop, and two Stage structs
declared the home first, so it was removed while the server could still
write into it. Running's drop now waits for the thread (with a 5-second
limit), and every home is declared last.

Checked: make gate twice, then the gate and three rounds of gatewayd and
loopd tests; no new entry in /tmp; 944 tests pass.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-26 01:29:32 -07:00

82 lines
2.5 KiB
Rust

//! Two small texts from the M3b review: every line `brokerd serve` prints about its runtime starts
//! with `brokerd:`, and a bad `[runner]` value is quoted in its error. Do not edit.
#[path = "support/tmp.rs"]
mod tmp;
#[path = "support/fake_podman.rs"]
mod fake_podman;
use std::io::Read;
use std::os::unix::net::UnixStream;
use std::process::{Command, Stdio};
use std::time::{Duration, Instant};
use brokerd::config::{Config, ConfigError};
use fake_podman::{Fake, IMAGE, serial};
#[test]
fn the_runtime_notice_starts_with_brokerd() {
let _s = serial();
let fake = Fake::new("notice", "exit 0");
let home = fake.dir.join("home");
std::fs::create_dir_all(home.join("grants")).unwrap();
let config = fake.dir.join("brokerd.toml");
std::fs::write(
&config,
format!(
"[paths]\nhome = \"{0}\"\ngrants = \"{0}/grants\"\n[runner]\npodman = \"{1}\"\nimage = \"{IMAGE}\"\n",
home.display(),
fake.script.display()
),
)
.unwrap();
let mut child = Command::new(env!("CARGO_BIN_EXE_brokerd"))
.args(["serve", "--config"])
.arg(&config)
.stderr(Stdio::piped())
.spawn()
.unwrap();
let until = Instant::now() + Duration::from_secs(10);
while UnixStream::connect(home.join("run/loop-broker/broker.sock")).is_err() {
assert!(Instant::now() < until, "brokerd never listened");
std::thread::sleep(Duration::from_millis(20));
}
std::thread::sleep(Duration::from_millis(100));
child.kill().unwrap();
child.wait().unwrap();
let mut printed = String::new();
child
.stderr
.take()
.unwrap()
.read_to_string(&mut printed)
.unwrap();
assert!(
printed
.lines()
.any(|l| l == format!("brokerd: tools run in containers from {IMAGE}")),
"{printed}"
);
}
#[test]
fn a_bad_runner_value_is_quoted() {
let dir = tmp::TempDir::new("notice-cfg");
let cases = [
("image = \"not by digest\"", "\"not by digest\""),
(
&*format!("image = \"{IMAGE}\"\nmemory = \"lots\""),
"\"lots\"",
),
];
for (n, (body, quoted)) in cases.iter().enumerate() {
let path = dir.path().join(format!("q{n}.toml"));
std::fs::write(&path, format!("[runner]\n{body}\n")).unwrap();
match Config::load(&path) {
Err(ConfigError::Invalid(_, why)) => assert!(why.contains(quoted), "{why}"),
other => panic!("{body}: {other:?}"),
}
}
}