about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libnative/io/process.rs4
-rw-r--r--src/test/run-pass/process-spawn-with-unicode-params.rs86
2 files changed, 90 insertions, 0 deletions
diff --git a/src/libnative/io/process.rs b/src/libnative/io/process.rs
index be67d0a3fb4..14ea1f12a5c 100644
--- a/src/libnative/io/process.rs
+++ b/src/libnative/io/process.rs
@@ -864,5 +864,9 @@ mod tests {
             make_command_line("echo", ["a b c".to_owned()]),
             "echo \"a b c\"".to_owned()
         );
+        assert_eq!(
+            make_command_line("\u03c0\u042f\u97f3\u00e6\u221e", []),
+            "\u03c0\u042f\u97f3\u00e6\u221e".to_owned()
+        );
     }
 }
diff --git a/src/test/run-pass/process-spawn-with-unicode-params.rs b/src/test/run-pass/process-spawn-with-unicode-params.rs
new file mode 100644
index 00000000000..f9839ed39e7
--- /dev/null
+++ b/src/test/run-pass/process-spawn-with-unicode-params.rs
@@ -0,0 +1,86 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// no-prefer-dynamic
+
+// The test copies itself into a subdirectory with a non-ASCII name and then
+// runs it as a child process within the subdirectory.  The parent process
+// also adds an environment variable and an argument, both containing
+// non-ASCII characters.  The child process ensures all the strings are
+// intact.
+
+extern crate native;
+
+use std::io;
+use std::io::fs;
+use std::io::process::Process;
+use std::io::process::ProcessConfig;
+use std::os;
+use std::path::Path;
+
+fn main() {
+    let my_args = os::args();
+    let my_cwd  = os::getcwd();
+    let my_env  = os::env();
+    let my_path = Path::new(os::self_exe_name().unwrap());
+    let my_dir  = my_path.dir_path();
+    let my_ext  = my_path.extension_str().unwrap_or("");
+
+    // some non-ASCII characters
+    let blah       = "\u03c0\u042f\u97f3\u00e6\u221e";
+
+    let child_name = "child";
+    let child_dir  = "process-spawn-with-unicode-params-" + blah;
+
+    // parameters sent to child / expected to be received from parent
+    let arg = blah;
+    let cwd = my_dir.join(Path::new(child_dir.clone()));
+    let env = ("RUST_TEST_PROC_SPAWN_UNICODE".to_owned(), blah.to_owned());
+
+    // am I the parent or the child?
+    if my_args.len() == 1 {             // parent
+
+        let child_filestem = Path::new(child_name);
+        let child_filename = child_filestem.with_extension(my_ext);
+        let child_path     = cwd.join(child_filename.clone());
+
+        // make a separate directory for the child
+        drop(fs::mkdir(&cwd, io::UserRWX).is_ok());
+        assert!(fs::copy(&my_path, &child_path).is_ok());
+
+        // run child
+        let p = Process::configure(ProcessConfig {
+            program: child_path.as_str().unwrap(),
+            args: [arg.to_owned()],
+            cwd: Some(&cwd),
+            env: Some(my_env.append_one(env).as_slice()),
+            .. ProcessConfig::new()
+        }).unwrap().wait_with_output();
+
+        // display the output
+        assert!(io::stdout().write(p.output.as_slice()).is_ok());
+        assert!(io::stderr().write(p.error.as_slice()).is_ok());
+
+        // make sure the child succeeded
+        assert!(p.status.success());
+
+    } else {                            // child
+
+        // check working directory (don't try to compare with `cwd` here!)
+        assert!(my_cwd.ends_with_path(&Path::new(child_dir)));
+
+        // check arguments
+        assert_eq!(my_args.get(1).as_slice(), arg);
+
+        // check environment variable
+        assert!(my_env.contains(&env));
+
+    };
+}