diff options
Diffstat (limited to 'test/test_unistd.rs')
-rw-r--r-- | test/test_unistd.rs | 57 |
1 files changed, 45 insertions, 12 deletions
diff --git a/test/test_unistd.rs b/test/test_unistd.rs index 8fe1d432..0b2a810a 100644 --- a/test/test_unistd.rs +++ b/test/test_unistd.rs @@ -256,8 +256,38 @@ fn test_initgroups() { #[cfg(not(target_os = "redox"))] macro_rules! execve_test_factory( ($test_name:ident, $syscall:ident, $exe: expr $(, $pathname:expr, $flags:expr)*) => ( - #[test] - fn $test_name() { + + #[cfg(test)] + mod $test_name { + use super::*; + + fn syscall_cstr_ref() -> Result<std::convert::Infallible, nix::Error> { + $syscall( + $exe, + $(CString::new($pathname).unwrap().as_c_str(), )* + &[CString::new(b"".as_ref()).unwrap().as_c_str(), + CString::new(b"-c".as_ref()).unwrap().as_c_str(), + CString::new(b"echo nix!!! && echo foo=$foo && echo baz=$baz" + .as_ref()).unwrap().as_c_str()], + &[CString::new(b"foo=bar".as_ref()).unwrap().as_c_str(), + CString::new(b"baz=quux".as_ref()).unwrap().as_c_str()] + $(, $flags)*) + } + + fn syscall_cstring() -> Result<std::convert::Infallible, nix::Error> { + $syscall( + $exe, + $(CString::new($pathname).unwrap().as_c_str(), )* + &[CString::new(b"".as_ref()).unwrap(), + CString::new(b"-c".as_ref()).unwrap(), + CString::new(b"echo nix!!! && echo foo=$foo && echo baz=$baz" + .as_ref()).unwrap()], + &[CString::new(b"foo=bar".as_ref()).unwrap(), + CString::new(b"baz=quux".as_ref()).unwrap()] + $(, $flags)*) + } + + fn common_test(syscall: fn() -> Result<std::convert::Infallible, nix::Error>) { if "execveat" == stringify!($syscall) { // Though undocumented, Docker's default seccomp profile seems to // block this syscall. https://github.com/nix-rust/nix/issues/1122 @@ -276,16 +306,7 @@ macro_rules! execve_test_factory( Child => { // Make `writer` be the stdout of the new process. dup2(writer, 1).unwrap(); - let r = $syscall( - $exe, - $(CString::new($pathname).unwrap().as_c_str(), )* - &[CString::new(b"".as_ref()).unwrap().as_c_str(), - CString::new(b"-c".as_ref()).unwrap().as_c_str(), - CString::new(b"echo nix!!! && echo foo=$foo && echo baz=$baz" - .as_ref()).unwrap().as_c_str()], - &[CString::new(b"foo=bar".as_ref()).unwrap().as_c_str(), - CString::new(b"baz=quux".as_ref()).unwrap().as_c_str()] - $(, $flags)*); + let r = syscall(); let _ = std::io::stderr() .write_all(format!("{:?}", r).as_bytes()); // Should only get here in event of error @@ -307,6 +328,18 @@ macro_rules! execve_test_factory( } } } + + #[test] + fn test_cstr_ref() { + common_test(syscall_cstr_ref); + } + + #[test] + fn test_cstring() { + common_test(syscall_cstring); + } + } + ) ); |