1#[macro_use]
2extern crate log;
3extern crate env_logger;
4
5use std::env;
6use std::fmt;
7use std::process;
8use std::str;
9
10struct Foo;
11
12impl fmt::Display for Foo {
13    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
14        info!("test");
15        f.write_str("bar")
16    }
17}
18
19fn main() {
20    env_logger::init();
21    if env::var("YOU_ARE_TESTING_NOW").is_ok() {
22        return info!("{}", Foo);
23    }
24
25    let exe = env::current_exe().unwrap();
26    let out = process::Command::new(exe)
27        .env("YOU_ARE_TESTING_NOW", "1")
28        .env("RUST_LOG", "debug")
29        .output()
30        .unwrap_or_else(|e| panic!("Unable to start child process: {}", e));
31    if out.status.success() {
32        return;
33    }
34
35    println!("test failed: {}", out.status);
36    println!("--- stdout\n{}", str::from_utf8(&out.stdout).unwrap());
37    println!("--- stderr\n{}", str::from_utf8(&out.stderr).unwrap());
38    process::exit(1);
39}
40