diff options
| author | George Tokmaji <tokmajigeorge@gmail.com> | 2024-09-30 19:49:18 +0200 |
|---|---|---|
| committer | George Tokmaji <tokmajigeorge@gmail.com> | 2024-09-30 19:49:18 +0200 |
| commit | e2bb09467d28b5ff72f0c29f311d8a3b9059c1f7 (patch) | |
| tree | 65f61cdafffd4df28788b43b37ae65f74a3e9931 | |
| parent | 1e414f1ffff517902979ebde83c8a3be97cc3822 (diff) | |
| download | rust-e2bb09467d28b5ff72f0c29f311d8a3b9059c1f7.tar.gz rust-e2bb09467d28b5ff72f0c29f311d8a3b9059c1f7.zip | |
Win: Add test cases for renaming a directory while the target file is opened and for renaming over a non-empty directory
| -rw-r--r-- | library/std/src/fs/tests.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/library/std/src/fs/tests.rs b/library/std/src/fs/tests.rs index 0672fe6f771..e95f4b88c62 100644 --- a/library/std/src/fs/tests.rs +++ b/library/std/src/fs/tests.rs @@ -1766,3 +1766,44 @@ fn test_hidden_file_truncation() { let metadata = file.metadata().unwrap(); assert_eq!(metadata.len(), 0); } + +#[cfg(windows)] +#[test] +fn test_rename_file_over_open_file() { + // Make sure that std::fs::rename works if the target file is already opened with FILE_SHARE_DELETE. See #123985. + let tmpdir = tmpdir(); + + // Create source with test data to read. + let source_path = tmpdir.join("source_file.txt"); + fs::write(&source_path, b"source hello world").unwrap(); + + // Create target file with test data to read; + let target_path = tmpdir.join("target_file.txt"); + fs::write(&target_path, b"target hello world").unwrap(); + + // Open target file + let target_file = fs::File::open(&target_path).unwrap(); + + // Rename source + fs::rename(source_path, &target_path).unwrap(); + + core::mem::drop(target_file); + assert_eq!(fs::read(target_path).unwrap(), b"source hello world"); +} + +#[test] +#[cfg(windows)] +fn test_rename_directory_to_non_empty_directory() { + // Renaming a directory over a non-empty existing directory should fail on Windows. + let tmpdir: TempDir = tmpdir(); + + let source_path = tmpdir.join("source_directory"); + let target_path = tmpdir.join("target_directory"); + + fs::create_dir(&source_path).unwrap(); + fs::create_dir(&target_path).unwrap(); + + fs::write(target_path.join("target_file.txt"), b"target hello world").unwrap(); + + error!(fs::rename(source_path, target_path), 145); // ERROR_DIR_NOT_EMPTY +} |
