use crate::cli::doctor::{DoctorArgs, classify_output};
struct ClosedPipe;
impl std::io::Write for ClosedPipe {
fn write(&mut self, _buf: &[u8]) -> std::io::Result<usize> {
Err(std::io::Error::new(
std::io::ErrorKind::BrokenPipe,
"closed",
))
}
fn flush(&mut self) -> std::io::Result<()> {
Ok(())
}
}
struct BadDisk;
impl std::io::Write for BadDisk {
fn write(&mut self, _buf: &[u8]) -> std::io::Result<usize> {
Err(std::io::Error::other("disk on fire"))
}
fn flush(&mut self) -> std::io::Result<()> {
Ok(())
}
}
#[tokio::test]
async fn a_closed_pipe_is_not_a_failure_but_a_real_write_error_is() {
let dir = tempfile::tempdir().expect("tempdir");
std::fs::write(dir.path().join("a.py"), "x = 1\n").expect("a.py");
let args = DoctorArgs {
path: dir.path().to_path_buf(),
config: None,
};
let mut sink = ClosedPipe;
let pipe_result = super::run_scoped(&mut sink, &args, dir.path()).await;
assert_eq!(
classify_output(pipe_result).expect("a closed pipe is clean"),
crate::Exit::Clean
);
let mut sink = BadDisk;
let disk_result = super::run_scoped(&mut sink, &args, dir.path()).await;
assert!(
classify_output(disk_result).is_err(),
"a real output failure must not be classified as success"
);
}