//! Active writer inspected by a second built binary (`SMH-SPEC-SPEC0001`, Sessions). use assert_cmd::cargo::cargo_bin; use serde_json::Value; use std::io::{BufRead, BufReader, Write}; use std::process::{Command, Stdio}; use std::sync::mpsc; use std::time::Duration; #[test] fn active_rpc_session_is_visible_to_read_only_inspection() { let home = std::env::temp_dir().join(format!("smith-observe-e2e-{}", std::process::id())); let _ = std::fs::remove_dir_all(&home); let mut writer = Command::new(cargo_bin("smith")) .arg("rpc") .env("XDG_DATA_HOME", &home) .env_remove("SMITH_PROVIDER") .env_remove("SMITH_MODEL") .env_remove("SMITH_BASE_URL") .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) .spawn() .unwrap(); let mut input = writer.stdin.take().unwrap(); input .write_all(b"{\"id\":1,\"method\":\"ping\"}\n") .unwrap(); input.flush().unwrap(); let stdout = writer.stdout.take().unwrap(); let (tx, rx) = mpsc::sync_channel(1); std::thread::spawn(move || { let mut line = String::new(); let result = BufReader::new(stdout).read_line(&mut line).map(|_| line); let _ = tx.send(result); }); let ready = rx.recv_timeout(Duration::from_secs(10)).unwrap().unwrap(); assert_eq!(serde_json::from_str::(&ready).unwrap()["pong"], true); let listed = Command::new(cargo_bin("smith")) .args(["sessions", "list", "--json"]) .env("XDG_DATA_HOME", &home) .output() .unwrap(); assert!( listed.status.success(), "{}", String::from_utf8_lossy(&listed.stderr) ); let line: Value = serde_json::from_slice(&listed.stdout).unwrap(); let id = line["session"].as_str().unwrap(); let path = home.join("smith/sessions/run").join(format!("{id}.smh")); let original = std::fs::read(&path).unwrap(); let read = Command::new(cargo_bin("smith")) .args(["sessions", "get", id, "--json"]) .env("XDG_DATA_HOME", &home) .output() .unwrap(); assert!( read.status.success(), "{}", String::from_utf8_lossy(&read.stderr) ); assert_eq!(std::fs::read(&path).unwrap(), original); drop(input); assert!(writer.wait().unwrap().success()); let _ = std::fs::remove_dir_all(home); }