Skip to content

Commit 902daf8

Browse files
author
Cameron Nemo
committed
Add tests for posix_spawn function
1 parent 3f2a4da commit 902daf8

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

test/test.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@ mod test_pty;
3333
mod test_sched;
3434
#[cfg(any(linux_android, freebsdlike, apple_targets, solarish))]
3535
mod test_sendfile;
36+
#[cfg(any(
37+
target_os = "freebsd",
38+
target_os = "haiku",
39+
target_os = "linux",
40+
target_os = "netbsd",
41+
apple_targets
42+
))]
43+
mod test_spawn;
44+
3645
mod test_time;
3746
mod test_unistd;
3847

test/test_spawn.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use std::ffi::CString;
2+
3+
use nix::spawn::{self, PosixSpawnAttr, PosixSpawnFileActions};
4+
use nix::sys::signal;
5+
use nix::sys::wait::{waitpid, WaitPidFlag, WaitStatus};
6+
7+
#[test]
8+
fn spawn_true() {
9+
let bin = &CString::new("/bin/true").unwrap();
10+
let args = &[CString::new("true").unwrap(), CString::new("story").unwrap()];
11+
let vars: &[CString] = &[];
12+
let actions = PosixSpawnFileActions::init().unwrap();
13+
let attr = PosixSpawnAttr::init().unwrap();
14+
15+
let pid = spawn::posix_spawn(bin, &actions, &attr, args, vars).unwrap();
16+
17+
let status = waitpid(pid, Some(WaitPidFlag::empty())).unwrap();
18+
19+
match status {
20+
WaitStatus::Exited(wpid, ret) => {
21+
assert_eq!(pid, wpid);
22+
assert_eq!(ret, 0);
23+
},
24+
_ => {
25+
panic!("Invalid WaitStatus");
26+
},
27+
};
28+
}
29+
30+
#[test]
31+
fn spawn_sleep() {
32+
let bin = &CString::new("/bin/sleep").unwrap();
33+
let args = &[CString::new("sleep").unwrap(), CString::new("30").unwrap()];
34+
let vars: &[CString] = &[];
35+
let actions = PosixSpawnFileActions::init().unwrap();
36+
let attr = PosixSpawnAttr::init().unwrap();
37+
38+
let pid = spawn::posix_spawn(bin, &actions, &attr, args, vars).unwrap();
39+
40+
let status = waitpid(pid, WaitPidFlag::from_bits(WaitPidFlag::WNOHANG.bits())).unwrap();
41+
match status {
42+
WaitStatus::StillAlive => { },
43+
_ => {
44+
panic!("Invalid WaitStatus");
45+
},
46+
};
47+
48+
signal::kill(pid, signal::SIGTERM).unwrap();
49+
50+
let status = waitpid(pid, Some(WaitPidFlag::empty())).unwrap();
51+
match status {
52+
WaitStatus::Signaled(wpid, wsignal, _) => {
53+
assert_eq!(pid, wpid);
54+
assert_eq!(wsignal, signal::SIGTERM);
55+
},
56+
_ => {
57+
panic!("Invalid WaitStatus");
58+
},
59+
};
60+
}

0 commit comments

Comments
 (0)