use gix_testtools::Result; mod prepare { fn quoted(input: &[&str]) -> String { input.iter().map(|s| format!("\"{s}\"")).collect::>().join(" ") } #[test] fn single_and_multiple_arguments() { let cmd = std::process::Command::from(gix_command::prepare("ls").arg("first").args(["second", "third"])); assert_eq!(format!("{cmd:?}"), quoted(&["ls", "first", "second", "third"])); } } mod spawn { #[cfg(unix)] use bstr::ByteSlice; #[test] #[cfg(unix)] fn environment_variables_are_passed_one_by_one() -> crate::Result { let out = gix_command::prepare("echo $FIRST $SECOND") .env("FIRST", "first") .env("SECOND", "second") .with_shell() .spawn()? .wait_with_output()?; assert_eq!(out.stdout.as_bstr(), "first second\n"); Ok(()) } #[test] #[cfg(unix)] fn disallow_shell() -> crate::Result { let out = gix_command::prepare("PATH= echo hi") .with_shell() .spawn()? .wait_with_output()?; assert_eq!(out.stdout.as_bstr(), "hi\n"); let mut cmd: std::process::Command = gix_command::prepare("echo hi").with_shell().without_shell().into(); assert!( cmd.env_remove("PATH").spawn().is_err(), "no command named 'echo hi' exists" ); Ok(()) } #[test] fn direct_command_execution_searches_in_path() -> crate::Result { assert!(gix_command::prepare(if cfg!(unix) { "ls" } else { "dir.exe" }) .spawn()? .wait()? .success()); Ok(()) } #[cfg(unix)] #[test] fn direct_command_with_absolute_command_path() -> crate::Result { assert!(gix_command::prepare("/bin/ls").spawn()?.wait()?.success()); Ok(()) } mod with_shell { use gix_testtools::bstr::ByteSlice; #[test] fn command_in_path_with_args() -> crate::Result { assert!(gix_command::prepare(if cfg!(unix) { "ls -l" } else { "dir.exe -a" }) .with_shell() .spawn()? .wait()? .success()); Ok(()) } #[test] fn sh_shell_specific_script_code() -> crate::Result { assert!(gix_command::prepare(":;:;:").with_shell().spawn()?.wait()?.success()); Ok(()) } #[test] fn sh_shell_specific_script_code_with_single_extra_arg() -> crate::Result { let out = gix_command::prepare("echo") .with_shell() .arg("1") .spawn()? .wait_with_output()?; assert!(out.status.success()); #[cfg(not(windows))] assert_eq!(out.stdout.as_bstr(), "1\n"); #[cfg(windows)] assert_eq!(out.stdout.as_bstr(), "1\r\n"); Ok(()) } #[test] fn sh_shell_specific_script_code_with_multiple_extra_args() -> crate::Result { let out = gix_command::prepare("echo") .with_shell() .arg("1") .arg("2") .spawn()? .wait_with_output()?; assert!(out.status.success()); #[cfg(not(windows))] assert_eq!(out.stdout.as_bstr(), "1 2\n"); #[cfg(windows)] assert_eq!(out.stdout.as_bstr(), "1 2\r\n"); Ok(()) } } }