use os_pipe::pipe;
use std::{
io::Read,
process::{Command, ExitStatus},
sync::Mutex,
};
use structopt::lazy_static::lazy_static;
struct RunResult {
exit_status: ExitStatus,
output: String,
}
lazy_static! {
static ref ONE_RUN_AT_A_TIME: Mutex<i32> = Mutex::new(0i32);
}
fn run_and_truncate(args: &str) -> RunResult {
let _guard = ONE_RUN_AT_A_TIME.lock().unwrap();
let complete_command = format!("run -- {} --shorten-paths", args);
let (mut reader, writer) = pipe().unwrap();
let writer_clone = writer.try_clone().unwrap();
let mut handle = Command::new("cargo")
.args(complete_command.split(" "))
.stdout(writer)
.stderr(writer_clone)
.spawn()
.unwrap();
let mut probe_run_output = String::new();
reader.read_to_string(&mut probe_run_output).unwrap();
let exit_status = handle.wait().unwrap();
let output = probe_run_output
.lines()
.filter(|line| {
!line.starts_with(" Finished")
&& !line.starts_with(" Running `")
&& !line.starts_with(" Blocking waiting for file lock ")
&& !line.starts_with(" Compiling probe-run v")
&& !line.starts_with("└─ ")
})
.map(|line| format!("{}\n", line))
.collect();
RunResult {
exit_status,
output,
}
}
#[test]
#[ignore]
fn successful_run_has_no_backtrace() {
let run_result = run_and_truncate("--chip nRF52840_xxAA tests/test_elfs/hello");
assert_eq!(true, run_result.exit_status.success());
insta::assert_snapshot!(run_result.output);
}
#[test]
#[ignore]
fn successful_run_can_enforce_backtrace() {
let run_result =
run_and_truncate("--chip nRF52840_xxAA tests/test_elfs/hello --force-backtrace");
assert_eq!(true, run_result.exit_status.success());
insta::assert_snapshot!(run_result.output);
}
#[test]
#[ignore]
fn stack_overflow_is_reported_as_such() {
let run_result = run_and_truncate("--chip nRF52840_xxAA tests/test_elfs/overflow");
assert_eq!(false, run_result.exit_status.success());
insta::assert_snapshot!(run_result.output);
}
#[test]
#[ignore]
fn panic_is_reported_as_such() {
let run_result = run_and_truncate("--chip nRF52840_xxAA tests/test_elfs/panic");
assert_eq!(false, run_result.exit_status.success());
insta::assert_snapshot!(run_result.output);
}
#[test]
#[ignore]
fn panic_verbose() {
let run_result = run_and_truncate("--chip nRF52840_xxAA tests/test_elfs/panic --verbose");
assert_eq!(false, run_result.exit_status.success());
insta::assert_snapshot!(run_result.output);
}