#![cfg(not(target_env = "sgx"))]

use std::{env, fs, process, str};

mod common;

#[test]
// Process spawning not supported by Miri, Emscripten and wasi
#[cfg_attr(any(miri, target_os = "emscripten", target_os = "wasi"), ignore)]
#[cfg_attr(any(target_os = "tvos", target_os = "watchos"), ignore = "fork is prohibited")]
fn issue_15149() {
    // If we're the parent, copy our own binary to a new directory.
    let my_path = env::current_exe().unwrap();

    let temp = common::tmpdir();
    let child_dir = temp.join("issue-15140-child");
    fs::create_dir_all(&child_dir).unwrap();

    let child_path = child_dir.join(&format!("mytest{}", env::consts::EXE_SUFFIX));
    fs::copy(&my_path, &child_path).unwrap();

    // Append the new directory to our own PATH.
    let path = {
        let mut paths: Vec<_> = env::split_paths(&env::var_os("PATH").unwrap()).collect();
        paths.push(child_dir.to_path_buf());
        env::join_paths(paths).unwrap()
    };

    // If a custom `runner` is set up for the current target, we'll be executing `./runner ./test`,
    // not just `./test`. For such a case, use the same arguments for child to avoid executing
    // `runner` without an actual executable.
    let args = env::args();
    let child_output = process::Command::new("mytest")
        .args(args)
        .env("PATH", &path)
        .arg("child")
        .output()
        .unwrap();

    assert!(
        child_output.status.success(),
        "child assertion failed\n child stdout:\n {}\n child stderr:\n {}",
        str::from_utf8(&child_output.stdout).unwrap(),
        str::from_utf8(&child_output.stderr).unwrap()
    );
}
