summaryrefslogtreecommitdiffstats
path: root/library/std/src/sys/unix/process/process_unix/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--library/std/src/sys/unix/process/process_unix/tests.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/library/std/src/sys/unix/process/process_unix/tests.rs b/library/std/src/sys/unix/process/process_unix/tests.rs
new file mode 100644
index 000000000..e0e2d478f
--- /dev/null
+++ b/library/std/src/sys/unix/process/process_unix/tests.rs
@@ -0,0 +1,62 @@
+use crate::os::unix::process::{CommandExt, ExitStatusExt};
+use crate::panic::catch_unwind;
+use crate::process::Command;
+
+// Many of the other aspects of this situation, including heap alloc concurrency
+// safety etc., are tested in src/test/ui/process/process-panic-after-fork.rs
+
+#[test]
+fn exitstatus_display_tests() {
+ // In practice this is the same on every Unix.
+ // If some weird platform turns out to be different, and this test fails, use #[cfg].
+ use crate::os::unix::process::ExitStatusExt;
+ use crate::process::ExitStatus;
+
+ let t = |v, s| assert_eq!(s, format!("{}", <ExitStatus as ExitStatusExt>::from_raw(v)));
+
+ t(0x0000f, "signal: 15 (SIGTERM)");
+ t(0x0008b, "signal: 11 (SIGSEGV) (core dumped)");
+ t(0x00000, "exit status: 0");
+ t(0x0ff00, "exit status: 255");
+
+ // On MacOS, 0x0137f is WIFCONTINUED, not WIFSTOPPED. Probably *BSD is similar.
+ // https://github.com/rust-lang/rust/pull/82749#issuecomment-790525956
+ // The purpose of this test is to test our string formatting, not our understanding of the wait
+ // status magic numbers. So restrict these to Linux.
+ if cfg!(target_os = "linux") {
+ t(0x0137f, "stopped (not terminated) by signal: 19 (SIGSTOP)");
+ t(0x0ffff, "continued (WIFCONTINUED)");
+ }
+
+ // Testing "unrecognised wait status" is hard because the wait.h macros typically
+ // assume that the value came from wait and isn't mad. With the glibc I have here
+ // this works:
+ if cfg!(all(target_os = "linux", target_env = "gnu")) {
+ t(0x000ff, "unrecognised wait status: 255 0xff");
+ }
+}
+
+#[test]
+#[cfg_attr(target_os = "emscripten", ignore)]
+fn test_command_fork_no_unwind() {
+ let got = catch_unwind(|| {
+ let mut c = Command::new("echo");
+ c.arg("hi");
+ unsafe {
+ c.pre_exec(|| panic!("{}", "crash now!"));
+ }
+ let st = c.status().expect("failed to get command status");
+ dbg!(st);
+ st
+ });
+ dbg!(&got);
+ let status = got.expect("panic unexpectedly propagated");
+ dbg!(status);
+ let signal = status.signal().expect("expected child process to die of signal");
+ assert!(
+ signal == libc::SIGABRT
+ || signal == libc::SIGILL
+ || signal == libc::SIGTRAP
+ || signal == libc::SIGSEGV
+ );
+}