|  | #[macro_use] | 
|  | extern crate log; | 
|  | extern crate env_logger; | 
|  |  | 
|  | use std::env; | 
|  | use std::fmt; | 
|  | use std::process; | 
|  | use std::str; | 
|  |  | 
|  | struct Foo; | 
|  |  | 
|  | impl fmt::Display for Foo { | 
|  | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 
|  | info!("test"); | 
|  | f.write_str("bar") | 
|  | } | 
|  | } | 
|  |  | 
|  | fn main() { | 
|  | env_logger::init(); | 
|  | if env::var("YOU_ARE_TESTING_NOW").is_ok() { | 
|  | return info!("{}", Foo); | 
|  | } | 
|  |  | 
|  | let exe = env::current_exe().unwrap(); | 
|  | let out = process::Command::new(exe) | 
|  | .env("YOU_ARE_TESTING_NOW", "1") | 
|  | .env("RUST_LOG", "debug") | 
|  | .output() | 
|  | .unwrap_or_else(|e| panic!("Unable to start child process: {}", e)); | 
|  | if out.status.success() { | 
|  | return; | 
|  | } | 
|  |  | 
|  | println!("test failed: {}", out.status); | 
|  | println!("--- stdout\n{}", str::from_utf8(&out.stdout).unwrap()); | 
|  | println!("--- stderr\n{}", str::from_utf8(&out.stderr).unwrap()); | 
|  | process::exit(1); | 
|  | } |