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 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}