Skip to content

Commit

Permalink
Merge pull request #6259 from cakebaker/env_remove_gnu_env_dependency
Browse files Browse the repository at this point in the history
env: remove dependency on GNU env in tests
  • Loading branch information
sylvestre authored Apr 22, 2024
2 parents d63bc4a + a2bc0ff commit a1cdab3
Showing 1 changed file with 48 additions and 71 deletions.
119 changes: 48 additions & 71 deletions tests/by-util/test_env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
// file that was distributed with this source code.
// spell-checker:ignore (words) bamf chdir rlimit prlimit COMSPEC cout cerr FFFD

#[cfg(target_os = "linux")]
use crate::common::util::expected_result;
use crate::common::util::TestScenario;
use regex::Regex;
use std::env;
Expand Down Expand Up @@ -472,127 +470,105 @@ fn test_gnu_e20() {
assert_eq!(out.stdout_str(), output);
}

#[macro_export]
macro_rules! compare_with_gnu {
( $ts:expr, $args:expr ) => {{
println!("==========================================================================");
let result = $ts.ucmd().args($args).run();

#[cfg(target_os = "linux")]
{
let reference = expected_result(&$ts, $args);
if let Ok(reference) = reference {
let success = result.code() == reference.code()
&& result.stdout_str() == reference.stdout_str()
&& result.stderr_str() == reference.stderr_str();
if !success {
println!("reference.code: {}", reference.code());
println!(" result.code: {}", result.code());
println!("reference.cout: {}", reference.stdout_str());
println!(" result.cout: {}", result.stdout_str());
println!("reference.cerr: {}", reference.stderr_str_lossy());
println!(" result.cerr: {}", result.stderr_str_lossy());
}
assert_eq!(result.code(), reference.code());
assert_eq!(result.stdout_str(), reference.stdout_str());
assert_eq!(result.stderr_str(), reference.stderr_str());
} else {
println!(
"gnu reference test skipped. Reason: {:?}",
reference.unwrap_err()
);
}
}

result
}};
}

#[test]
#[allow(clippy::cognitive_complexity)] // Ignore clippy lint of too long function sign
fn test_env_with_gnu_reference_parsing_errors() {
fn test_env_parsing_errors() {
let ts = TestScenario::new(util_name!());

compare_with_gnu!(ts, &["-S\\|echo hallo"]) // no quotes, invalid escape sequence |
.failure()
ts.ucmd()
.arg("-S\\|echo hallo") // no quotes, invalid escape sequence |
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\|' in -S\n");

compare_with_gnu!(ts, &["-S\\a"]) // no quotes, invalid escape sequence a
.failure()
ts.ucmd()
.arg("-S\\a") // no quotes, invalid escape sequence a
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\a' in -S\n");

compare_with_gnu!(ts, &["-S\"\\a\""]) // double quotes, invalid escape sequence a
.failure()
ts.ucmd()
.arg("-S\"\\a\"") // double quotes, invalid escape sequence a
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\a' in -S\n");

compare_with_gnu!(ts, &[r#"-S"\a""#]) // same as before, just using r#""#
.failure()
ts.ucmd()
.arg(r#"-S"\a""#) // same as before, just using r#""#
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\a' in -S\n");

compare_with_gnu!(ts, &["-S'\\a'"]) // single quotes, invalid escape sequence a
.failure()
ts.ucmd()
.arg("-S'\\a'") // single quotes, invalid escape sequence a
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\a' in -S\n");

compare_with_gnu!(ts, &[r#"-S\|\&\;"#]) // no quotes, invalid escape sequence |
.failure()
ts.ucmd()
.arg(r#"-S\|\&\;"#) // no quotes, invalid escape sequence |
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\|' in -S\n");

compare_with_gnu!(ts, &[r#"-S\<\&\;"#]) // no quotes, invalid escape sequence <
.failure()
ts.ucmd()
.arg(r#"-S\<\&\;"#) // no quotes, invalid escape sequence <
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\<' in -S\n");

compare_with_gnu!(ts, &[r#"-S\>\&\;"#]) // no quotes, invalid escape sequence >
.failure()
ts.ucmd()
.arg(r#"-S\>\&\;"#) // no quotes, invalid escape sequence >
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\>' in -S\n");

compare_with_gnu!(ts, &[r#"-S\`\&\;"#]) // no quotes, invalid escape sequence `
.failure()
ts.ucmd()
.arg(r#"-S\`\&\;"#) // no quotes, invalid escape sequence `
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\`' in -S\n");

compare_with_gnu!(ts, &[r#"-S"\`\&\;""#]) // double quotes, invalid escape sequence `
.failure()
ts.ucmd()
.arg(r#"-S"\`\&\;""#) // double quotes, invalid escape sequence `
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\`' in -S\n");

compare_with_gnu!(ts, &[r#"-S'\`\&\;'"#]) // single quotes, invalid escape sequence `
.failure()
ts.ucmd()
.arg(r#"-S'\`\&\;'"#) // single quotes, invalid escape sequence `
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\`' in -S\n");

compare_with_gnu!(ts, &[r#"-S\`"#]) // ` escaped without quotes
.failure()
ts.ucmd()
.arg(r#"-S\`"#) // ` escaped without quotes
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\`' in -S\n");

compare_with_gnu!(ts, &[r#"-S"\`""#]) // ` escaped in double quotes
.failure()
ts.ucmd()
.arg(r#"-S"\`""#) // ` escaped in double quotes
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\`' in -S\n");

compare_with_gnu!(ts, &[r#"-S'\`'"#]) // ` escaped in single quotes
.failure()
ts.ucmd()
.arg(r#"-S'\`'"#) // ` escaped in single quotes
.fails()
.code_is(125)
.no_stdout()
.stderr_is("env: invalid sequence '\\`' in -S\n");
Expand All @@ -606,7 +582,7 @@ fn test_env_with_gnu_reference_parsing_errors() {
}

#[test]
fn test_env_with_gnu_reference_empty_executable_single_quotes() {
fn test_env_with_empty_executable_single_quotes() {
let ts = TestScenario::new(util_name!());

ts.ucmd()
Expand All @@ -618,11 +594,12 @@ fn test_env_with_gnu_reference_empty_executable_single_quotes() {
}

#[test]
fn test_env_with_gnu_reference_empty_executable_double_quotes() {
fn test_env_with_empty_executable_double_quotes() {
let ts = TestScenario::new(util_name!());

compare_with_gnu!(ts, &["-S\"\""]) // empty double quotes, considered as program name
.failure()
ts.ucmd()
.args(&["-S\"\""]) // empty double quotes, considered as program name
.fails()
.code_is(127)
.no_stdout()
.stderr_is("env: '': No such file or directory\n");
Expand Down

0 comments on commit a1cdab3

Please sign in to comment.