extern crate env_logger;
extern crate log;

use std::env;
use std::process;
use std::str;

fn main() {
    if env::var("YOU_ARE_TESTING_NOW").is_ok() {
        // Init from the env (which should set the max level to `Debug`)
        env_logger::init();

        assert_eq!(log::LevelFilter::Debug, log::max_level());

        // Init again using a different max level
        // This shouldn't clobber the level that was previously set
        env_logger::Builder::new()
            .parse_filters("info")
            .try_init()
            .unwrap_err();

        assert_eq!(log::LevelFilter::Debug, log::max_level());
        return;
    }

    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);
}
