]> git.proxmox.com Git - rustc.git/blame - src/test/ui/command/command-pre-exec.rs
Update unsuspicious file list
[rustc.git] / src / test / ui / command / command-pre-exec.rs
CommitLineData
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
12extern crate libc;
13
9fa01778
XL
14use std::env;
15use std::io::Error;
16use std::os::unix::process::CommandExt;
17use std::process::Command;
18use std::sync::atomic::{AtomicUsize, Ordering};
19use std::sync::Arc;
20
21fn 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}