add test for incredibly cursed windows rename behavior
This commit is contained in:
@@ -275,8 +275,21 @@ mod test {
|
|||||||
.expect("open the same directory via WasiDir abstraction");
|
.expect("open the same directory via WasiDir abstraction");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(windows))]
|
||||||
#[test]
|
#[test]
|
||||||
fn readdir() {
|
fn readdir() {
|
||||||
|
fn readdir_into_map(dir: &dyn WasiDir) -> HashMap<String, ReaddirEntity> {
|
||||||
|
let mut out = HashMap::new();
|
||||||
|
for readdir_result in dir
|
||||||
|
.readdir(ReaddirCursor::from(0))
|
||||||
|
.expect("readdir succeeds")
|
||||||
|
{
|
||||||
|
let (entity, name) = readdir_result.expect("readdir entry is valid");
|
||||||
|
out.insert(name, entity);
|
||||||
|
}
|
||||||
|
out
|
||||||
|
}
|
||||||
|
|
||||||
let tempdir = tempfile::Builder::new()
|
let tempdir = tempfile::Builder::new()
|
||||||
.prefix("cap-std-sync")
|
.prefix("cap-std-sync")
|
||||||
.tempdir()
|
.tempdir()
|
||||||
@@ -322,15 +335,61 @@ mod test {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn readdir_into_map(dir: &dyn WasiDir) -> HashMap<String, ReaddirEntity> {
|
#[test]
|
||||||
let mut out = HashMap::new();
|
fn rename_dir_to_existing_file() {
|
||||||
for readdir_result in dir
|
use std::path::Path;
|
||||||
.readdir(ReaddirCursor::from(0))
|
fn cleanup(p: &Path) {
|
||||||
.expect("readdir succeeds")
|
if p.exists() {
|
||||||
{
|
if p.is_dir() {
|
||||||
let (entity, name) = readdir_result.expect("readdir entry is valid");
|
std::fs::remove_dir_all(p).expect("delete dir");
|
||||||
out.insert(name, entity);
|
} else {
|
||||||
|
std::fs::remove_file(p).expect("delete file");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
out
|
|
||||||
|
let tempdir = tempfile::Builder::new()
|
||||||
|
.prefix("cap-std-sync")
|
||||||
|
.tempdir()
|
||||||
|
.expect("create temporary dir");
|
||||||
|
|
||||||
|
let preopen_dir = unsafe { cap_std::fs::Dir::open_ambient_dir(tempdir.path()) }
|
||||||
|
.expect("open ambient temporary dir");
|
||||||
|
/* DEBUG - non-temporary directory
|
||||||
|
let preopen_dir = unsafe { cap_std::fs::Dir::open_ambient_dir("c:\\") }
|
||||||
|
.expect("open ambient temporary dir");
|
||||||
|
*/
|
||||||
|
let preopen_dir = Dir::from_cap_std(preopen_dir);
|
||||||
|
let wasi_dir: &dyn WasiDir = &preopen_dir;
|
||||||
|
|
||||||
|
let target_path = tempdir.path().join("target");
|
||||||
|
/* DEBUG - non-temporary directory
|
||||||
|
let target_path = Path::new("c:\\target");
|
||||||
|
*/
|
||||||
|
// Clean up in case last test run
|
||||||
|
cleanup(&target_path);
|
||||||
|
let source_path = tempdir.path().join("source");
|
||||||
|
cleanup(&source_path);
|
||||||
|
|
||||||
|
let file = wasi_dir
|
||||||
|
.open_file(
|
||||||
|
false,
|
||||||
|
"target",
|
||||||
|
OFlags::CREATE,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
FdFlags::empty(),
|
||||||
|
)
|
||||||
|
.expect("create target");
|
||||||
|
// Close the file:
|
||||||
|
drop(file);
|
||||||
|
|
||||||
|
wasi_dir
|
||||||
|
.create_dir("source")
|
||||||
|
.expect("create source directory");
|
||||||
|
|
||||||
|
wasi_dir
|
||||||
|
.rename("source", wasi_dir, "target")
|
||||||
|
.expect_err("it should be impossible to rename a directory to an existing file");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user