]>
Commit | Line | Data |
---|---|---|
416331ca | 1 | // run-pass |
17df50a5 XL |
2 | // revisions: mir thir |
3 | // [thir]compile-flags: -Zthir-unsafeck | |
416331ca | 4 | |
9fa01778 XL |
5 | #![allow(stable_features)] |
6 | // ignore-windows - this is a unix-specific test | |
9fa01778 | 7 | // ignore-emscripten no processes |
48663c56 | 8 | // ignore-sgx no processes |
2b03887a | 9 | // ignore-fuchsia no execvp syscall |
9fa01778 XL |
10 | #![feature(process_exec, rustc_private)] |
11 | ||
c295e0f8 XL |
12 | extern crate libc; |
13 | ||
9fa01778 XL |
14 | use std::env; |
15 | use std::io::Error; | |
16 | use std::os::unix::process::CommandExt; | |
17 | use std::process::Command; | |
18 | use std::sync::atomic::{AtomicUsize, Ordering}; | |
19 | use std::sync::Arc; | |
20 | ||
21 | fn main() { | |
22 | if let Some(arg) = env::args().nth(1) { | |
23 | match &arg[..] { | |
24 | "test1" => println!("hello2"), | |
25 | "test2" => assert_eq!(env::var("FOO").unwrap(), "BAR"), | |
26 | "test3" => assert_eq!(env::current_dir().unwrap().to_str().unwrap(), "/"), | |
27 | "empty" => {} | |
28 | _ => panic!("unknown argument: {}", arg), | |
29 | } | |
30 | return; | |
31 | } | |
32 | ||
33 | let me = env::current_exe().unwrap(); | |
34 | ||
35 | let output = unsafe { | |
36 | Command::new(&me) | |
37 | .arg("test1") | |
38 | .pre_exec(|| { | |
39 | println!("hello"); | |
40 | Ok(()) | |
41 | }) | |
42 | .output() | |
43 | .unwrap() | |
44 | }; | |
45 | assert!(output.status.success()); | |
46 | assert!(output.stderr.is_empty()); | |
47 | assert_eq!(output.stdout, b"hello\nhello2\n"); | |
48 | ||
9fa01778 XL |
49 | let output = unsafe { |
50 | Command::new(&me) | |
51 | .arg("test3") | |
52 | .pre_exec(|| { | |
53 | env::set_current_dir("/").unwrap(); | |
54 | Ok(()) | |
55 | }) | |
56 | .output() | |
57 | .unwrap() | |
58 | }; | |
59 | assert!(output.status.success()); | |
60 | assert!(output.stderr.is_empty()); | |
61 | assert!(output.stdout.is_empty()); | |
62 | ||
63 | let output = unsafe { | |
64 | Command::new(&me) | |
65 | .arg("bad") | |
66 | .pre_exec(|| Err(Error::from_raw_os_error(102))) | |
67 | .output() | |
68 | .unwrap_err() | |
69 | }; | |
70 | assert_eq!(output.raw_os_error(), Some(102)); | |
71 | ||
c295e0f8 XL |
72 | let pid = unsafe { libc::getpid() }; |
73 | assert!(pid >= 0); | |
9fa01778 XL |
74 | let output = unsafe { |
75 | Command::new(&me) | |
76 | .arg("empty") | |
77 | .pre_exec(move || { | |
c295e0f8 XL |
78 | let child = libc::getpid(); |
79 | assert!(child >= 0); | |
9fa01778 XL |
80 | assert!(pid != child); |
81 | Ok(()) | |
82 | }) | |
83 | .output() | |
84 | .unwrap() | |
85 | }; | |
86 | assert!(output.status.success()); | |
87 | assert!(output.stderr.is_empty()); | |
88 | assert!(output.stdout.is_empty()); | |
89 | ||
90 | let mem = Arc::new(AtomicUsize::new(0)); | |
91 | let mem2 = mem.clone(); | |
92 | let output = unsafe { | |
93 | Command::new(&me) | |
94 | .arg("empty") | |
95 | .pre_exec(move || { | |
96 | assert_eq!(mem2.fetch_add(1, Ordering::SeqCst), 0); | |
97 | Ok(()) | |
98 | }) | |
99 | .output() | |
100 | .unwrap() | |
101 | }; | |
102 | assert!(output.status.success()); | |
103 | assert!(output.stderr.is_empty()); | |
104 | assert!(output.stdout.is_empty()); | |
105 | assert_eq!(mem.load(Ordering::SeqCst), 0); | |
106 | } |