diff --git a/src/tools/run-make-support/src/run.rs b/src/tools/run-make-support/src/run/mod.rs similarity index 90% rename from src/tools/run-make-support/src/run.rs rename to src/tools/run-make-support/src/run/mod.rs index 43f0473ddf4a1..ea5d16248bcf9 100644 --- a/src/tools/run-make-support/src/run.rs +++ b/src/tools/run-make-support/src/run/mod.rs @@ -89,11 +89,13 @@ pub fn cmd>(program: S) -> Command { command } -fn split_maybe_args(s: &str) -> Vec { - // FIXME(132599): implement proper env var/shell argument splitting. - s.split(' ') - .filter_map(|s| { - if s.chars().all(|c| c.is_whitespace()) { None } else { Some(OsString::from(s)) } - }) +pub(crate) fn split_maybe_args(s: &str) -> Vec { + // Split on default shell IFS (space, tab, newline). + s.split(|c: char| matches!(c, ' ' | '\t' | '\n')) + .filter(|s| !s.is_empty()) + .map(OsString::from) .collect() } + +#[cfg(test)] +mod tests; diff --git a/src/tools/run-make-support/src/run/tests.rs b/src/tools/run-make-support/src/run/tests.rs new file mode 100644 index 0000000000000..690a0c4e68bc7 --- /dev/null +++ b/src/tools/run-make-support/src/run/tests.rs @@ -0,0 +1,51 @@ +use std::ffi::OsString; + +use super::split_maybe_args; + +fn os(s: &str) -> OsString { + OsString::from(s) +} + +#[test] +fn split_on_space() { + assert_eq!( + split_maybe_args("valgrind --tool=memcheck"), + vec![os("valgrind"), os("--tool=memcheck")] + ); +} + +#[test] +fn single_arg_no_whitespace() { + assert_eq!(split_maybe_args("valgrind"), vec![os("valgrind")]); +} + +#[test] +fn empty_string() { + assert_eq!(split_maybe_args(""), Vec::::new()); +} + +#[test] +fn split_on_tab() { + assert_eq!( + split_maybe_args("valgrind\t--tool=memcheck"), + vec![os("valgrind"), os("--tool=memcheck")] + ); +} + +#[test] +fn split_on_newline() { + assert_eq!( + split_maybe_args("valgrind\n--tool=memcheck"), + vec![os("valgrind"), os("--tool=memcheck")] + ); +} + +#[test] +fn multiple_ifs_separators() { + assert_eq!(split_maybe_args("a b\t\tc\n\nd"), vec![os("a"), os("b"), os("c"), os("d")]); +} + +#[test] +fn leading_and_trailing_whitespace() { + assert_eq!(split_maybe_args(" valgrind\t"), vec![os("valgrind")]); +}