Move a flaky process test out of libstd

This test ensures that everything in `env::vars()` is inherited but
that's not actually true because other tests may add env vars after we
spawn the process, causing the test to be flaky! This commit moves the
test to a run-pass test where it can execute in isolation.

Along the way this removes a lot of the platform specificity of the
test, using iteslf to print the environment instead of a foreign process.
This commit is contained in:
Alex Crichton 2018-11-21 21:56:23 -08:00
parent 0b9f19dff1
commit d1cd4e8d0d
2 changed files with 25 additions and 36 deletions

View File

@ -1889,42 +1889,6 @@ mod tests {
cmd
}
#[test]
fn test_inherit_env() {
use env;
let result = env_cmd().output().unwrap();
let output = String::from_utf8(result.stdout).unwrap();
for (ref k, ref v) in env::vars() {
// Don't check android RANDOM variable which seems to change
// whenever the shell runs, and our `env_cmd` is indeed running a
// shell which means it'll get a different RANDOM than we probably
// have.
//
// Also skip env vars with `-` in the name on android because, well,
// I'm not sure. It appears though that the `set` command above does
// not print env vars with `-` in the name, so we just skip them
// here as we won't find them in the output. Note that most env vars
// use `_` instead of `-`, but our build system sets a few env vars
// with `-` in the name.
if cfg!(target_os = "android") &&
(*k == "RANDOM" || k.contains("-")) {
continue
}
// Windows has hidden environment variables whose names start with
// equals signs (`=`). Those do not show up in the output of the
// `set` command.
assert!((cfg!(windows) && k.starts_with("=")) ||
k.starts_with("DYLD") ||
output.contains(&format!("{}={}", *k, *v)) ||
output.contains(&format!("{}='{}'", *k, *v)),
"output doesn't contain `{}={}`\n{}",
k, v, output);
}
}
#[test]
fn test_override_env() {
use env;

View File

@ -0,0 +1,25 @@
// ignore-emscripten
// ignore-wasm32
use std::env;
use std::process::Command;
fn main() {
if env::args().nth(1).map(|s| s == "print").unwrap_or(false) {
for (k, v) in env::vars() {
println!("{}={}", k, v);
}
return
}
let me = env::current_exe().unwrap();
let result = Command::new(me).arg("print").output().unwrap();
let output = String::from_utf8(result.stdout).unwrap();
for (k, v) in env::vars() {
assert!(output.contains(&format!("{}={}", k, v)),
"output doesn't contain `{}={}`\n{}",
k, v, output);
}
}