Make miri read_dir test a little more robust

Signed-off-by: Alex Saveau <saveau.alexandre@gmail.com>
This commit is contained in:
Alex Saveau 2022-10-19 10:43:57 -07:00
parent 4b8f431995
commit b0f693552d
No known key found for this signature in database
GPG Key ID: 3F8D5B16EB169D48

View File

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