capture_stdio/pipe/
stderr.rs

1//! Intercept [std::io::Stderr]
2
3use super::PipedFd;
4use crate::Capture;
5use os_pipe::PipeReader;
6use std::io::Error;
7
8/// Intercept stderr
9pub struct PipedStderr {
10    internal: PipedFd,
11}
12
13impl Capture for PipedStderr {
14    fn capture() -> Result<Self, Error> {
15        let internal = PipedFd::capture(2, false)?;
16        Ok(Self { internal })
17    }
18
19    fn restore(&mut self) {
20        self.internal.restore();
21    }
22}
23
24impl PipedStderr {
25    /// Get reader of pipe
26    pub fn get_reader(&mut self) -> &mut PipeReader {
27        &mut self.internal.reader
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use crate::pipe::stderr::PipedStderr;
34    use crate::Capture;
35    use std::io::{set_output_capture, BufRead, BufReader};
36
37    #[test]
38    fn test_stderr() {
39        // stderr is captured by testing
40        let original = set_output_capture(None);
41
42        let mut piped_stderr = PipedStderr::capture().unwrap();
43        let string = "Write something to stderr\n";
44        eprint!("{}", string);
45
46        set_output_capture(original);
47
48        let mut output = String::new();
49        let mut buf_reader = BufReader::new(piped_stderr.get_reader());
50        buf_reader.read_line(&mut output).unwrap();
51
52        assert_eq!(output, string);
53        piped_stderr.restore();
54    }
55}