runner/
runner.rs

1use std::{
2    env,
3    fs::{self, File},
4    io,
5    process::{self, Child, Command, Stdio},
6    time::Duration,
7};
8
9use node::core::thread;
10
11fn main() {
12    let mut debugger = Command::new("bpf-recorder")
13        .envs([("RUST_LOG", "info"), ("SERVER_PORT", "8000")])
14        .stderr(Stdio::piped())
15        .spawn()
16        .expect("cannot run debugger");
17    thread::sleep(Duration::from_secs(2));
18    let mut test = Command::new(env::args().nth(1).unwrap())
19        .args(env::args().skip(2))
20        .envs(env::vars())
21        .stderr(Stdio::inherit())
22        .stdout(Stdio::piped())
23        .spawn()
24        .expect("cannot spawn the test");
25    {
26        let mut stdout = test.stdout.take().expect("must be stdout");
27        let mut log = File::create("test.log").expect("failed to create test log file");
28        thread::spawn(move || {
29            io::copy(&mut stdout, &mut log).expect("failed to store test log");
30        });
31    }
32    {
33        let mut stderr = debugger.stderr.take().expect("must be stderr");
34        let mut log = File::create("debugger.log").expect("failed to create debugger log file");
35        thread::spawn(move || {
36            io::copy(&mut stderr, &mut log).expect("failed to store debugger log");
37        });
38    }
39    let test_status = test.wait().expect("cannot run the test");
40    kill(debugger);
41    fs::remove_dir_all("target/db").unwrap_or_default();
42    if !test_status.success() {
43        println!("test failed, log:");
44        let mut log = File::open("test.log").expect("failed to open test log file");
45        io::copy(&mut log, &mut io::stdout()).expect("failed to print test log");
46        // println!("debugger log:");
47        // let mut log = File::open("debugger.log").expect("failed to open test debugger file");
48        // io::copy(&mut log, &mut io::stdout()).expect("failed to print debugger log");
49        process::exit(test_status.code().unwrap_or(-1));
50    }
51}
52
53fn kill(mut subprocess: Child) {
54    use nix::{
55        sys::signal::{self, Signal},
56        unistd::Pid,
57    };
58
59    if let Err(err) = signal::kill(Pid::from_raw(subprocess.id() as i32), Signal::SIGINT) {
60        eprintln!("error sending ctrl+c to Network debugger: {err}");
61    }
62    match subprocess.try_wait() {
63        Err(err) => {
64            eprintln!("error getting status from Network debugger: {err}");
65        }
66        Ok(None) => {
67            eprintln!("error getting status from Network debugger");
68        }
69        Ok(Some(status)) => {
70            eprintln!("network debugger {status}");
71        }
72    }
73}