Auto merge of #108233 - ChrisDenton:move-std-tests, r=thomcc

Move some std tests from `tests/ui-fulldeps` into `library/std`

This allows them to be tested normally along with other `./x test std` tests. Moving `rename_directory` is simple enough but `create_dir_all_bare` needed to be an std integration test.

Additionally, some tests that I couldn't move atm have instead been placed in an `std` subdirectory. These tests include ones that do fun things with processes or that intentionally abort the test process.

r? libs
This commit is contained in:
bors 2023-02-25 10:26:57 +00:00
commit 26c98689f2
10 changed files with 115 additions and 53 deletions

View File

@ -1595,3 +1595,19 @@ fn test_read_dir_infinite_loop() {
// Check for duplicate errors // Check for duplicate errors
assert!(dir.filter(|e| e.is_err()).take(2).count() < 2); assert!(dir.filter(|e| e.is_err()).take(2).count() < 2);
} }
#[test]
fn rename_directory() {
let tmpdir = tmpdir();
let old_path = tmpdir.join("foo/bar/baz");
fs::create_dir_all(&old_path).unwrap();
let test_file = &old_path.join("temp.txt");
File::create(test_file).unwrap();
let new_path = tmpdir.join("quux/blat");
fs::create_dir_all(&new_path).unwrap();
fs::rename(&old_path, &new_path.join("newdir")).unwrap();
assert!(new_path.join("newdir").is_dir());
assert!(new_path.join("newdir/temp.txt").exists());
}

View File

@ -0,0 +1,58 @@
#![allow(unused)]
use std::env;
use std::fs;
use std::path::{Path, PathBuf};
use std::thread;
use rand::RngCore;
/// Copied from `std::test_helpers::test_rng`, since these tests rely on the
/// seed not being the same for every RNG invocation too.
#[track_caller]
pub(crate) fn test_rng() -> rand_xorshift::XorShiftRng {
use core::hash::{BuildHasher, Hash, Hasher};
let mut hasher = std::collections::hash_map::RandomState::new().build_hasher();
core::panic::Location::caller().hash(&mut hasher);
let hc64 = hasher.finish();
let seed_vec = hc64.to_le_bytes().into_iter().chain(0u8..8).collect::<Vec<u8>>();
let seed: [u8; 16] = seed_vec.as_slice().try_into().unwrap();
rand::SeedableRng::from_seed(seed)
}
// Copied from std::sys_common::io
pub struct TempDir(PathBuf);
impl TempDir {
pub fn join(&self, path: &str) -> PathBuf {
let TempDir(ref p) = *self;
p.join(path)
}
pub fn path(&self) -> &Path {
let TempDir(ref p) = *self;
p
}
}
impl Drop for TempDir {
fn drop(&mut self) {
// Gee, seeing how we're testing the fs module I sure hope that we
// at least implement this correctly!
let TempDir(ref p) = *self;
let result = fs::remove_dir_all(p);
// Avoid panicking while panicking as this causes the process to
// immediately abort, without displaying test results.
if !thread::panicking() {
result.unwrap();
}
}
}
#[track_caller] // for `test_rng`
pub fn tmpdir() -> TempDir {
let p = env::temp_dir();
let mut r = test_rng();
let ret = p.join(&format!("rust-{}", r.next_u32()));
fs::create_dir(&ret).unwrap();
TempDir(ret)
}

View File

@ -0,0 +1,39 @@
#![cfg(all(test, not(any(target_os = "emscripten", target_env = "sgx"))))]
//! Note that this test changes the current directory so
//! should not be in the same process as other tests.
use std::env;
use std::fs;
use std::path::{Path, PathBuf};
mod common;
// On some platforms, setting the current directory will prevent deleting it.
// So this helper ensures the current directory is reset.
struct CurrentDir(PathBuf);
impl CurrentDir {
fn new() -> Self {
Self(env::current_dir().unwrap())
}
fn set(&self, path: &Path) {
env::set_current_dir(path).unwrap();
}
fn with(path: &Path, f: impl FnOnce()) {
let current_dir = Self::new();
current_dir.set(path);
f();
}
}
impl Drop for CurrentDir {
fn drop(&mut self) {
env::set_current_dir(&self.0).unwrap();
}
}
#[test]
fn create_dir_all_bare() {
let tmpdir = common::tmpdir();
CurrentDir::with(tmpdir.path(), || {
fs::create_dir_all("create-dir-all-bare").unwrap();
});
}

View File

@ -3,18 +3,8 @@
use rand::distributions::{Alphanumeric, DistString}; use rand::distributions::{Alphanumeric, DistString};
/// Copied from `std::test_helpers::test_rng`, since these tests rely on the mod common;
/// seed not being the same for every RNG invocation too. use common::test_rng;
#[track_caller]
pub(crate) fn test_rng() -> rand_xorshift::XorShiftRng {
use core::hash::{BuildHasher, Hash, Hasher};
let mut hasher = std::collections::hash_map::RandomState::new().build_hasher();
core::panic::Location::caller().hash(&mut hasher);
let hc64 = hasher.finish();
let seed_vec = hc64.to_le_bytes().into_iter().chain(0u8..8).collect::<Vec<u8>>();
let seed: [u8; 16] = seed_vec.as_slice().try_into().unwrap();
rand::SeedableRng::from_seed(seed)
}
#[track_caller] #[track_caller]
fn make_rand_name() -> OsString { fn make_rand_name() -> OsString {

View File

@ -1,11 +0,0 @@
// run-pass
use std::env;
use std::fs;
use std::path::PathBuf;
fn main() {
let path = PathBuf::from(env::var_os("RUST_TEST_TMPDIR").unwrap());
env::set_current_dir(&path).unwrap();
fs::create_dir_all("create-dir-all-bare").unwrap();
}

View File

@ -1,30 +0,0 @@
// run-pass
#![allow(unused_must_use)]
#![allow(unused_imports)]
// This test can't be a unit test in std,
// because it needs TempDir, which is in extra
// ignore-cross-compile
use std::env;
use std::ffi::CString;
use std::fs::{self, File};
use std::path::PathBuf;
fn rename_directory() {
let tmpdir = PathBuf::from(env::var_os("RUST_TEST_TMPDIR").unwrap());
let old_path = tmpdir.join("foo/bar/baz");
fs::create_dir_all(&old_path).unwrap();
let test_file = &old_path.join("temp.txt");
File::create(test_file).unwrap();
let new_path = tmpdir.join("quux/blat");
fs::create_dir_all(&new_path).unwrap();
fs::rename(&old_path, &new_path.join("newdir"));
assert!(new_path.join("newdir").is_dir());
assert!(new_path.join("newdir/temp.txt").exists());
}
pub fn main() { rename_directory() }