File tree Expand file tree Collapse file tree 2 files changed +89
-0
lines changed Expand file tree Collapse file tree 2 files changed +89
-0
lines changed Original file line number Diff line number Diff line change 1+ use std:: env;
2+ use std:: fs;
3+ use std:: process;
4+ use std:: str;
5+
6+ mod common;
7+
8+ #[ test]
9+ fn issue_15149 ( ) {
10+ // If we're the parent, copy our own binary to a new directory.
11+ let my_path = env:: current_exe ( ) . unwrap ( ) ;
12+
13+ let temp = common:: tmpdir ( ) ;
14+ let child_dir = temp. join ( "issue-15140-child" ) ;
15+ fs:: create_dir_all ( & child_dir) . unwrap ( ) ;
16+
17+ let child_path = child_dir. join ( & format ! ( "mytest{}" , env:: consts:: EXE_SUFFIX ) ) ;
18+ fs:: copy ( & my_path, & child_path) . unwrap ( ) ;
19+
20+ // Append the new directory to our own PATH.
21+ let path = {
22+ let mut paths: Vec < _ > = env:: split_paths ( & env:: var_os ( "PATH" ) . unwrap ( ) ) . collect ( ) ;
23+ paths. push ( child_dir. to_path_buf ( ) ) ;
24+ env:: join_paths ( paths) . unwrap ( )
25+ } ;
26+
27+ let child_output =
28+ process:: Command :: new ( "mytest" ) . env ( "PATH" , & path) . arg ( "child" ) . output ( ) . unwrap ( ) ;
29+
30+ assert ! (
31+ child_output. status. success( ) ,
32+ "child assertion failed\n child stdout:\n {}\n child stderr:\n {}" ,
33+ str :: from_utf8( & child_output. stdout) . unwrap( ) ,
34+ str :: from_utf8( & child_output. stderr) . unwrap( )
35+ ) ;
36+ }
Original file line number Diff line number Diff line change 1+ #[ cfg( any( target_family = "unix" , target_family = "windows" ) ) ]
2+
3+ use std:: fs:: File ;
4+ use std:: io:: { Read , Write } ;
5+
6+ mod common;
7+
8+ #[ cfg( unix) ]
9+ fn switch_stdout_to ( file : File ) {
10+ use std:: os:: unix:: prelude:: * ;
11+
12+ extern "C" {
13+ fn dup2 ( old : i32 , new : i32 ) -> i32 ;
14+ }
15+
16+ unsafe {
17+ assert_eq ! ( dup2( file. as_raw_fd( ) , 1 ) , 1 ) ;
18+ }
19+ }
20+
21+ #[ cfg( windows) ]
22+ fn switch_stdout_to ( file : File ) {
23+ use std:: os:: windows:: prelude:: * ;
24+
25+ extern "system" {
26+ fn SetStdHandle ( nStdHandle : u32 , handle : * mut u8 ) -> i32 ;
27+ }
28+
29+ const STD_OUTPUT_HANDLE : u32 = ( -11i32 ) as u32 ;
30+
31+ unsafe {
32+ let rc = SetStdHandle ( STD_OUTPUT_HANDLE , file. into_raw_handle ( ) as * mut _ ) ;
33+ assert ! ( rc != 0 ) ;
34+ }
35+ }
36+
37+ #[ test]
38+ fn switch_stdout ( ) {
39+ let temp = common:: tmpdir ( ) ;
40+ let path = temp. join ( "switch-stdout-output" ) ;
41+ let f = File :: create ( & path) . unwrap ( ) ;
42+
43+ let mut stdout = std:: io:: stdout ( ) ;
44+ stdout. write ( b"foo\n " ) . unwrap ( ) ;
45+ stdout. flush ( ) . unwrap ( ) ;
46+ switch_stdout_to ( f) ;
47+ stdout. write ( b"bar\n " ) . unwrap ( ) ;
48+ stdout. flush ( ) . unwrap ( ) ;
49+
50+ let mut contents = String :: new ( ) ;
51+ File :: open ( & path) . unwrap ( ) . read_to_string ( & mut contents) . unwrap ( ) ;
52+ assert_eq ! ( contents, "bar\n " ) ;
53+ }
You can’t perform that action at this time.
0 commit comments