]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | // Copyright 2014 The Rust Project Developers. See the COPYRIGHT |
2 | // file at the top-level directory of this distribution and at | |
3 | // http://rust-lang.org/COPYRIGHT. | |
4 | // | |
5 | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
6 | // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
7 | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
8 | // option. This file may not be copied, modified, or distributed | |
9 | // except according to those terms. | |
10 | ||
11 | // no-prefer-dynamic | |
12 | ||
13 | // The test copies itself into a subdirectory with a non-ASCII name and then | |
14 | // runs it as a child process within the subdirectory. The parent process | |
15 | // also adds an environment variable and an argument, both containing | |
16 | // non-ASCII characters. The child process ensures all the strings are | |
17 | // intact. | |
18 | ||
abe05a73 | 19 | // ignore-emscripten no processes |
c34b1796 AL |
20 | |
21 | use std::io::prelude::*; | |
22 | use std::io; | |
23 | use std::fs; | |
24 | use std::process::Command; | |
85aaf69f | 25 | use std::env; |
d9579d0f | 26 | use std::path::Path; |
1a4d82fc JJ |
27 | |
28 | fn main() { | |
85aaf69f | 29 | let my_args = env::args().collect::<Vec<_>>(); |
c34b1796 | 30 | let my_cwd = env::current_dir().unwrap(); |
85aaf69f | 31 | let my_env = env::vars().collect::<Vec<_>>(); |
c34b1796 AL |
32 | let my_path = env::current_exe().unwrap(); |
33 | let my_dir = my_path.parent().unwrap(); | |
34 | let my_ext = my_path.extension().and_then(|s| s.to_str()).unwrap_or(""); | |
1a4d82fc JJ |
35 | |
36 | // some non-ASCII characters | |
c34b1796 | 37 | let blah = "\u{3c0}\u{42f}\u{97f3}\u{e6}\u{221e}"; |
1a4d82fc JJ |
38 | |
39 | let child_name = "child"; | |
40 | let child_dir = format!("process-spawn-with-unicode-params-{}", blah); | |
41 | ||
42 | // parameters sent to child / expected to be received from parent | |
43 | let arg = blah; | |
c34b1796 | 44 | let cwd = my_dir.join(&child_dir); |
1a4d82fc JJ |
45 | let env = ("RUST_TEST_PROC_SPAWN_UNICODE".to_string(), blah.to_string()); |
46 | ||
47 | // am I the parent or the child? | |
48 | if my_args.len() == 1 { // parent | |
49 | ||
50 | let child_filestem = Path::new(child_name); | |
51 | let child_filename = child_filestem.with_extension(my_ext); | |
c34b1796 | 52 | let child_path = cwd.join(&child_filename); |
1a4d82fc JJ |
53 | |
54 | // make a separate directory for the child | |
c34b1796 AL |
55 | let _ = fs::create_dir(&cwd); |
56 | fs::copy(&my_path, &child_path).unwrap(); | |
1a4d82fc JJ |
57 | |
58 | // run child | |
59 | let p = Command::new(&child_path) | |
60 | .arg(arg) | |
c34b1796 AL |
61 | .current_dir(&cwd) |
62 | .env(&env.0, &env.1) | |
1a4d82fc JJ |
63 | .spawn().unwrap().wait_with_output().unwrap(); |
64 | ||
65 | // display the output | |
c34b1796 AL |
66 | io::stdout().write_all(&p.stdout).unwrap(); |
67 | io::stderr().write_all(&p.stderr).unwrap(); | |
1a4d82fc JJ |
68 | |
69 | // make sure the child succeeded | |
70 | assert!(p.status.success()); | |
71 | ||
72 | } else { // child | |
73 | ||
74 | // check working directory (don't try to compare with `cwd` here!) | |
c34b1796 | 75 | assert!(my_cwd.ends_with(&child_dir)); |
1a4d82fc JJ |
76 | |
77 | // check arguments | |
85aaf69f | 78 | assert_eq!(&*my_args[1], arg); |
1a4d82fc JJ |
79 | |
80 | // check environment variable | |
81 | assert!(my_env.contains(&env)); | |
82 | ||
83 | }; | |
84 | } |