Skip to content

Commit 9378504

Browse files
committed
Auto merge of #112390 - MoskalykA:move-two-tests-from-library-to-tests, r=workingjubilee
Move two tests from `tests/ui/std` to `library/std/tests` Hi, there, This pull request comes from this issue (#99417), sorry I made some mistakes creating the pull request, it's my first one.
2 parents 46c7e86 + 8508786 commit 9378504

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed

std/tests/process_spawning.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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+
}

std/tests/switch-stdout.rs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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+
}

0 commit comments

Comments
 (0)