Rollup merge of #103258 - SUPERCILEX:miri, r=RalfJung

Make miri read_dir test a little more robust

r? `@RalfJung`
This commit is contained in:
Matthias Krüger 2022-10-19 21:38:42 +02:00 committed by GitHub
commit 652417e332
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -4,7 +4,8 @@
#![feature(io_error_more)]
#![feature(io_error_uncategorized)]
use std::ffi::CString;
use std::collections::HashMap;
use std::ffi::{CString, OsString};
use std::fs::{
create_dir, read_dir, read_link, remove_dir, remove_dir_all, remove_file, rename, File,
OpenOptions,
@ -394,29 +395,34 @@ fn test_directory() {
// Creating a directory when it already exists should fail.
assert_eq!(ErrorKind::AlreadyExists, create_dir(&dir_path).unwrap_err().kind());
// Create some files inside the directory
// Create some files and dirs inside the directory
let path_1 = dir_path.join("test_file_1");
drop(File::create(&path_1).unwrap());
let path_2 = dir_path.join("test_file_2");
drop(File::create(&path_2).unwrap());
// Test that the files are present inside the directory
let dir_iter = read_dir(&dir_path).unwrap();
let mut file_names = dir_iter.map(|e| e.unwrap().file_name()).collect::<Vec<_>>();
file_names.sort_unstable();
assert_eq!(file_names, vec!["test_file_1", "test_file_2"]);
let dir_1 = dir_path.join("test_dir_1");
create_dir(&dir_1).unwrap();
// Test that read_dir metadata calls succeed
assert_eq!(
&[true, true],
&*read_dir(&dir_path)
HashMap::from([
(OsString::from("test_file_1"), true),
(OsString::from("test_file_2"), true),
(OsString::from("test_dir_1"), false)
]),
read_dir(&dir_path)
.unwrap()
.map(|e| e.unwrap().metadata().unwrap().is_file())
.collect::<Vec<_>>()
.map(|e| {
let e = e.unwrap();
(e.file_name(), e.metadata().unwrap().is_file())
})
.collect::<HashMap<_, _>>()
);
// Deleting the directory should fail, since it is not empty.
assert_eq!(ErrorKind::DirectoryNotEmpty, remove_dir(&dir_path).unwrap_err().kind());
// Clean up the files in the directory
remove_file(&path_1).unwrap();
remove_file(&path_2).unwrap();
remove_dir(&dir_1).unwrap();
// Now there should be nothing left in the directory.
let dir_iter = read_dir(&dir_path).unwrap();
let file_names = dir_iter.map(|e| e.unwrap().file_name()).collect::<Vec<_>>();