|  | use std::env; | 
|  | use std::process::Command; | 
|  | use std::path::{Path, PathBuf}; | 
|  |  | 
|  | fn main() { | 
|  | let args = env::args_os() | 
|  | .skip(1) | 
|  | .filter(|arg| arg != "--quiet") | 
|  | .collect::<Vec<_>>(); | 
|  | assert_eq!(args.len(), 1); | 
|  | let test = PathBuf::from(&args[0]); | 
|  | let dst = Path::new("/data/local/tmp").join(test.file_name().unwrap()); | 
|  |  | 
|  | println!("waiting for device to come online..."); | 
|  | let status = Command::new("adb") | 
|  | .arg("wait-for-device") | 
|  | .status() | 
|  | .expect("failed to run: adb wait-for-device"); | 
|  | assert!(status.success()); | 
|  |  | 
|  | println!("pushing executable..."); | 
|  | let status = Command::new("adb") | 
|  | .arg("push") | 
|  | .arg(&test) | 
|  | .arg(&dst) | 
|  | .status() | 
|  | .expect("failed to run: adb pushr"); | 
|  | assert!(status.success()); | 
|  |  | 
|  | println!("executing tests..."); | 
|  | let output = Command::new("adb") | 
|  | .arg("shell") | 
|  | .arg(&dst) | 
|  | .output() | 
|  | .expect("failed to run: adb shell"); | 
|  | assert!(status.success()); | 
|  |  | 
|  | println!("status: {}\nstdout ---\n{}\nstderr ---\n{}", | 
|  | output.status, | 
|  | String::from_utf8_lossy(&output.stdout), | 
|  | String::from_utf8_lossy(&output.stderr)); | 
|  |  | 
|  | let stdout = String::from_utf8_lossy(&output.stdout); | 
|  | stdout.lines().find(|l| | 
|  | (l.starts_with("PASSED ") && l.contains(" tests")) || | 
|  | l.starts_with("test result: ok") | 
|  | ).unwrap_or_else(|| { | 
|  | panic!("failed to find successful test run"); | 
|  | }); | 
|  | } |