use std::io::Write as _; use std::process::{Command, Stdio}; #[test] fn stdio_process_initializes_lists_capabilities_and_reports_parse_errors() { let home = tempfile::tempdir().unwrap(); let mut child = Command::new(env!("CARGO_BIN_EXE_bds-mcp")) .env("HOME", home.path()) .env("XDG_DATA_HOME", home.path().join("data")) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) .spawn() .unwrap(); let stdin = child.stdin.as_mut().unwrap(); writeln!(stdin, r#"{{"jsonrpc":"2.0","id":1,"method":"initialize","params":{{"protocolVersion":"2025-06-18"}}}}"#).unwrap(); writeln!(stdin, r#"{{"jsonrpc":"2.0","id":2,"method":"tools/list"}}"#).unwrap(); writeln!(stdin, "not-json").unwrap(); drop(child.stdin.take()); let output = child.wait_with_output().unwrap(); assert!( output.status.success(), "{}", String::from_utf8_lossy(&output.stderr) ); let lines = String::from_utf8(output.stdout).unwrap(); let responses = lines .lines() .map(|line| serde_json::from_str::(line).unwrap()) .collect::>(); assert_eq!(responses.len(), 3); assert_eq!(responses[0]["result"]["protocolVersion"], "2025-06-18"); assert_eq!( responses[1]["result"]["tools"].as_array().unwrap().len(), 12 ); assert_eq!(responses[2]["error"]["code"], -32700); }