diff options
Diffstat (limited to 'vendor/xshell/tests/it/env.rs')
-rw-r--r-- | vendor/xshell/tests/it/env.rs | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/vendor/xshell/tests/it/env.rs b/vendor/xshell/tests/it/env.rs new file mode 100644 index 000000000..949869467 --- /dev/null +++ b/vendor/xshell/tests/it/env.rs @@ -0,0 +1,130 @@ +use std::collections::BTreeMap; + +use xshell::cmd; + +use crate::setup; + +#[test] +fn test_env() { + let sh = setup(); + + let v1 = "xshell_test_123"; + let v2 = "xshell_test_456"; + + assert_env(cmd!(sh, "xecho -$ {v1}").env(v1, "123"), &[(v1, Some("123"))]); + + assert_env( + cmd!(sh, "xecho -$ {v1} {v2}").envs([(v1, "123"), (v2, "456")].iter().copied()), + &[(v1, Some("123")), (v2, Some("456"))], + ); + assert_env( + cmd!(sh, "xecho -$ {v1} {v2}") + .envs([(v1, "123"), (v2, "456")].iter().copied()) + .env_remove(v2), + &[(v1, Some("123")), (v2, None)], + ); + assert_env( + cmd!(sh, "xecho -$ {v1} {v2}") + .envs([(v1, "123"), (v2, "456")].iter().copied()) + .env_remove("nothing"), + &[(v1, Some("123")), (v2, Some("456"))], + ); + + let _g1 = sh.push_env(v1, "foobar"); + let _g2 = sh.push_env(v2, "quark"); + + assert_env(cmd!(sh, "xecho -$ {v1} {v2}"), &[(v1, Some("foobar")), (v2, Some("quark"))]); + + assert_env( + cmd!(sh, "xecho -$ {v1} {v2}").env(v1, "wombo"), + &[(v1, Some("wombo")), (v2, Some("quark"))], + ); + + assert_env(cmd!(sh, "xecho -$ {v1} {v2}").env_remove(v1), &[(v1, None), (v2, Some("quark"))]); + assert_env( + cmd!(sh, "xecho -$ {v1} {v2}").env_remove(v1).env(v1, "baz"), + &[(v1, Some("baz")), (v2, Some("quark"))], + ); + assert_env( + cmd!(sh, "xecho -$ {v1} {v2}").env(v1, "baz").env_remove(v1), + &[(v1, None), (v2, Some("quark"))], + ); +} + +#[test] +fn test_env_clear() { + let sh = setup(); + + let v1 = "xshell_test_123"; + let v2 = "xshell_test_456"; + + let xecho = format!("./target/xecho{}", std::env::consts::EXE_SUFFIX); + + assert_env( + cmd!(sh, "{xecho} -$ {v1} {v2}") + .envs([(v1, "123"), (v2, "456")].iter().copied()) + .env_clear(), + &[(v1, None), (v2, None)], + ); + assert_env( + cmd!(sh, "{xecho} -$ {v1} {v2}") + .envs([(v1, "123"), (v2, "456")].iter().copied()) + .env_clear() + .env(v1, "789"), + &[(v1, Some("789")), (v2, None)], + ); + + let _g1 = sh.push_env(v1, "foobar"); + let _g2 = sh.push_env(v2, "quark"); + + assert_env(cmd!(sh, "{xecho} -$ {v1} {v2}").env_clear(), &[(v1, None), (v2, None)]); + assert_env( + cmd!(sh, "{xecho} -$ {v1} {v2}").env_clear().env(v1, "baz"), + &[(v1, Some("baz")), (v2, None)], + ); + assert_env( + cmd!(sh, "{xecho} -$ {v1} {v2}").env(v1, "baz").env_clear(), + &[(v1, None), (v2, None)], + ); +} + +#[track_caller] +fn assert_env(xecho_env_cmd: xshell::Cmd, want_env: &[(&str, Option<&str>)]) { + let output = xecho_env_cmd.output().unwrap(); + let env = String::from_utf8_lossy(&output.stdout) + .lines() + .filter(|line| !line.is_empty()) + .map(|line| { + let (key, val) = line.split_once('=').unwrap_or_else(|| { + panic!("failed to parse line from `xecho -$` output: {:?}", line) + }); + (key.to_owned(), val.to_owned()) + }) + .collect::<BTreeMap<_, _>>(); + check_env(&env, want_env); +} + +#[track_caller] +fn check_env(env: &BTreeMap<String, String>, wanted_env: &[(&str, Option<&str>)]) { + let mut failed = false; + let mut seen = env.clone(); + for &(k, val) in wanted_env { + match (seen.remove(k), val) { + (Some(env_v), Some(want_v)) if env_v == want_v => {} + (None, None) => {} + (have, want) => { + eprintln!("mismatch on env var {:?}: have `{:?}`, want `{:?}` ", k, have, want); + failed = true; + } + } + } + for (k, v) in seen { + eprintln!("Unexpected env key {:?} (value: {:?})", k, v); + failed = true; + } + assert!( + !failed, + "env didn't match (see stderr for cleaner output):\nsaw: {:?}\n\nwanted: {:?}", + env, wanted_env, + ); +} |