aboutsummaryrefslogtreecommitdiffstats
path: root/tests/fixtures/mod.rs
blob: 766886c736e13a39ae039190e46a9b1667a31abc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use pty_process::Command as _;
use std::io::Read as _;
use std::os::unix::io::AsRawFd as _;

pub fn run_fixture<F>(name: &str, screenguard: bool, f: F)
where
    F: FnOnce(&mut std::fs::File),
{
    let temp = assert_fs::TempDir::new().unwrap();
    let run = escargot::CargoBuild::new()
        .bin(name)
        .current_release()
        .current_target()
        .manifest_path("tests/fixtures/bin/Cargo.toml")
        .target_dir(temp.path())
        .run()
        .unwrap();
    let mut cmd = run.command();
    let mut child = cmd
        .spawn_pty(Some(&pty_process::Size::new(24, 80)))
        .unwrap();

    if screenguard {
        assert!(read_ready(child.pty().as_raw_fd()));
        let mut buf = vec![0u8; 1024];
        let bytes = child.pty().read(&mut buf).unwrap();
        buf.truncate(bytes);
        assert_eq!(&buf[..], b"\x1b7\x1b[?47h\x1b[2J\x1b[H\x1b[?25h");
    }

    f(child.pty_mut());

    if screenguard {
        assert!(read_ready(child.pty().as_raw_fd()));
        let mut buf = vec![0u8; 1024];
        let bytes = child.pty().read(&mut buf).unwrap();
        buf.truncate(bytes);
        assert_eq!(&buf[..], b"\x1b[?47l\x1b8\x1b[?25h");
    }

    let status = child.wait().unwrap();
    assert!(status.success());
}

pub fn read(f: &mut std::fs::File) -> Vec<u8> {
    assert!(read_ready(f.as_raw_fd()));
    let mut buf = vec![0u8; 1024];
    let bytes = f.read(&mut buf).unwrap();
    buf.truncate(bytes);
    buf
}

pub fn read_ready(fd: std::os::unix::io::RawFd) -> bool {
    let mut set = nix::sys::select::FdSet::new();
    set.insert(fd);
    let timeout = libc::timeval {
        tv_sec: 0,
        tv_usec: 100_000,
    };
    let timeout = &mut nix::sys::time::TimeVal::from(timeout);
    match nix::sys::select::select(
        None,
        Some(&mut set),
        None,
        None,
        Some(timeout),
    ) {
        Ok(n) => {
            if n > 0 {
                set.contains(fd)
            } else {
                false
            }
        }
        Err(_) => false,
    }
}