//! Running the `toolkit` binary as `brokerd` does: arguments on standard input. Do not edit. #![allow(dead_code)] // each test file uses its own part use std::io::Write; use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; use std::sync::atomic::{AtomicU32, Ordering}; static NEXT: AtomicU32 = AtomicU32::new(0); /// A temporary directory, removed when dropped. pub struct TempDir(pub PathBuf); impl TempDir { pub fn new(tag: &str) -> TempDir { let n = NEXT.fetch_add(1, Ordering::SeqCst); let path = std::env::temp_dir().join(format!("tk-{tag}-{}-{n}", std::process::id())); let _ = std::fs::remove_dir_all(&path); std::fs::create_dir_all(&path).unwrap(); TempDir(path) } pub fn path(&self) -> &Path { &self.0 } /// The path of `name` inside, as a string (the tools take strings). pub fn at(&self, name: &str) -> String { self.0.join(name).to_str().unwrap().to_string() } } impl Drop for TempDir { fn drop(&mut self) { let _ = std::fs::remove_dir_all(&self.0); } } pub struct Ran { pub code: i32, pub stdout: String, pub stderr: String, } /// Run `toolkit ` with `input` on standard input. pub fn toolkit(args: &[&str], input: &[u8]) -> Ran { let mut child = Command::new(env!("CARGO_BIN_EXE_toolkit")) .args(args) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) .spawn() .unwrap(); let mut stdin = child.stdin.take().unwrap(); // A broken pipe here only means toolkit stopped reading, which some tests expect. let _ = stdin.write_all(input); drop(stdin); let out = child.wait_with_output().unwrap(); Ran { code: out.status.code().unwrap_or(-1), stdout: String::from_utf8(out.stdout).unwrap(), stderr: String::from_utf8_lossy(&out.stderr).into_owned(), } } /// The JSON for one argument struct. pub fn json(value: &T) -> Vec { serde_json::to_vec(value).unwrap() }