|
8 | 8 | // option. This file may not be copied, modified, or distributed
|
9 | 9 | // except according to those terms.
|
10 | 10 |
|
11 |
| -use std::io::{TempDir, Command, fs}; |
| 11 | +use std::io::{Command, fs, USER_RWX}; |
12 | 12 | use std::os;
|
| 13 | +use std::path::BytesContainer; |
| 14 | +use std::rand::random; |
13 | 15 |
|
14 | 16 | fn main() {
|
15 | 17 | // If we're the child, make sure we were invoked correctly
|
16 | 18 | let args = os::args();
|
17 | 19 | if args.len() > 1 && args[1].as_slice() == "child" {
|
18 |
| - return assert_eq!(args[0].as_slice(), "mytest"); |
| 20 | + return assert_eq!(args[0], |
| 21 | + format!("mytest{}", os::consts::EXE_SUFFIX)); |
19 | 22 | }
|
20 | 23 |
|
21 | 24 | test();
|
22 | 25 | }
|
23 | 26 |
|
24 | 27 | fn test() {
|
25 |
| - // If we're the parent, copy our own binary to a tempr directory, and then |
26 |
| - // make it executable. |
27 |
| - let dir = TempDir::new("mytest").unwrap(); |
28 |
| - let me = os::self_exe_name().unwrap(); |
29 |
| - let dest = dir.path().join(format!("mytest{}", os::consts::EXE_SUFFIX)); |
30 |
| - fs::copy(&me, &dest).unwrap(); |
31 |
| - |
32 |
| - // Append the temp directory to our own PATH. |
| 28 | + // If we're the parent, copy our own binary to a new directory. |
| 29 | + let my_path = os::self_exe_name().unwrap(); |
| 30 | + let my_dir = my_path.dir_path(); |
| 31 | + |
| 32 | + let random_u32: u32 = random(); |
| 33 | + let child_dir = Path::new(my_dir.join(format!("issue-15149-child-{}", |
| 34 | + random_u32))); |
| 35 | + fs::mkdir(&child_dir, USER_RWX).unwrap(); |
| 36 | + |
| 37 | + let child_path = child_dir.join(format!("mytest{}", |
| 38 | + os::consts::EXE_SUFFIX)); |
| 39 | + fs::copy(&my_path, &child_path).unwrap(); |
| 40 | + |
| 41 | + // Append the new directory to our own PATH. |
33 | 42 | let mut path = os::split_paths(os::getenv("PATH").unwrap_or(String::new()));
|
34 |
| - path.push(dir.path().clone()); |
| 43 | + path.push(child_dir.clone()); |
35 | 44 | let path = os::join_paths(path.as_slice()).unwrap();
|
36 | 45 |
|
37 |
| - Command::new("mytest").env("PATH", path.as_slice()) |
38 |
| - .arg("child") |
39 |
| - .spawn().unwrap(); |
| 46 | + let child_output = Command::new("mytest").env("PATH", path.as_slice()) |
| 47 | + .arg("child") |
| 48 | + .output().unwrap(); |
| 49 | + |
| 50 | + assert!(child_output.status.success(), |
| 51 | + format!("child assertion failed\n child stdout:\n {}\n child stderr:\n {}", |
| 52 | + child_output.output.container_as_str().unwrap(), |
| 53 | + child_output.error.container_as_str().unwrap())); |
| 54 | + |
| 55 | + fs::rmdir_recursive(&child_dir).unwrap(); |
| 56 | + |
40 | 57 | }
|
0 commit comments