From b8e3f3a41715a7de7e32eb32456aa25132c8ff46 Mon Sep 17 00:00:00 2001 From: Phil Ruffwind Date: Wed, 7 May 2014 19:26:16 -0400 Subject: [PATCH] Test Unicode support of process spawning Added a run-pass test to ensure that processes can be correctly spawned using non-ASCII arguments, working directory, and environment variables. It also tests Unicode support of os::env_as_bytes. An additional assertion was added to the test for make_command_line to verify it handles Unicode correctly. --- src/libnative/io/process.rs | 4 + .../process-spawn-with-unicode-params.rs | 86 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 src/test/run-pass/process-spawn-with-unicode-params.rs diff --git a/src/libnative/io/process.rs b/src/libnative/io/process.rs index be67d0a3fb45d..14ea1f12a5ca0 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 0000000000000..f9839ed39e752 --- /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 or the MIT license +// , 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)); + + }; +}