1use std::env;
2use std::process::Command;
3use std::path::{Path, PathBuf};
4
5fn main() {
6    let args = env::args_os()
7        .skip(1)
8        .filter(|arg| arg != "--quiet")
9        .collect::<Vec<_>>();
10    assert_eq!(args.len(), 1);
11    let test = PathBuf::from(&args[0]);
12    let dst = Path::new("/data/local/tmp").join(test.file_name().unwrap());
13
14    let status = Command::new("adb")
15        .arg("wait-for-device")
16        .status()
17        .expect("failed to run: adb wait-for-device");
18    assert!(status.success());
19
20    let status = Command::new("adb")
21        .arg("push")
22        .arg(&test)
23        .arg(&dst)
24        .status()
25        .expect("failed to run: adb push");
26    assert!(status.success());
27
28    let output = Command::new("adb")
29        .arg("shell")
30        .arg("RUST_BACKTRACE=1")
31        .arg(&dst)
32        .output()
33        .expect("failed to run: adb shell");
34    assert!(status.success());
35
36    let stdout = String::from_utf8_lossy(&output.stdout);
37    let stderr = String::from_utf8_lossy(&output.stderr);
38
39    println!("status: {}\nstdout ---\n{}\nstderr ---\n{}",
40             output.status,
41             stdout,
42             stderr);
43
44    if !stderr.lines().any(|l| (l.starts_with("PASSED ") && l.contains(" tests")) || l.starts_with("test result: ok"))
45        && !stdout.lines().any(|l| (l.starts_with("PASSED ") && l.contains(" tests")) || l.starts_with("test result: ok"))
46    {
47        panic!("failed to find successful test run");
48    };
49}
50