Skip to content

Commit afca1f4

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

File tree

2 files changed

+74
-0
lines changed

2 files changed

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

0 commit comments

Comments
 (0)