1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 11:37:44 +00:00

mv: use read_to_string and write when testing inter-partition copying (#6583)

* mv: inter partition copying test code cleanup

* mv: inter partition copying use of read_to_string and write

* Update tests/by-util/test_mv.rs

Co-authored-by: Ben Wiederhake <BenWiederhake.GitHub@gmx.de>

---------

Co-authored-by: Ben Wiederhake <BenWiederhake.GitHub@gmx.de>
This commit is contained in:
sreehari prasad 2024-07-19 22:33:20 +05:30 committed by GitHub
parent 868569496e
commit 5baf382f7e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1623,10 +1623,16 @@ fn test_acl() {
// mv: try to overwrite 'b', overriding mode 0444 (r--r--r--)? y // mv: try to overwrite 'b', overriding mode 0444 (r--r--r--)? y
// 'a' -> 'b' // 'a' -> 'b'
// Ensure that the copying code used in an inter-partition move unlinks the destination symlink.
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
mod inter_partition_copying {
use crate::common::util::TestScenario;
use std::fs::{read_to_string, set_permissions, write};
use std::os::unix::fs::{symlink, PermissionsExt};
use tempfile::TempDir;
// Ensure that the copying code used in an inter-partition move unlinks the destination symlink.
#[test] #[test]
fn test_mv_unlinks_dest_symlink() { pub(crate) fn test_mv_unlinks_dest_symlink() {
let scene = TestScenario::new(util_name!()); let scene = TestScenario::new(util_name!());
let at = &scene.fixtures; let at = &scene.fixtures;
@ -1635,19 +1641,16 @@ fn test_mv_unlinks_dest_symlink() {
// create a folder in another partition. // create a folder in another partition.
let other_fs_tempdir = let other_fs_tempdir =
tempfile::TempDir::new_in("/dev/shm/").expect("Unable to create temp directory"); TempDir::new_in("/dev/shm/").expect("Unable to create temp directory");
// create a file inside that folder. // create a file inside that folder.
let other_fs_file_path = other_fs_tempdir.path().join("other_fs_file"); let other_fs_file_path = other_fs_tempdir.path().join("other_fs_file");
let mut file = write(&other_fs_file_path, "other fs file contents")
std::fs::File::create(&other_fs_file_path).expect("Unable to create other_fs_file");
std::io::Write::write_all(&mut file, b"other fs file contents")
.expect("Unable to write to other_fs_file"); .expect("Unable to write to other_fs_file");
// create a symlink to the file inside the same directory. // create a symlink to the file inside the same directory.
let symlink_path = other_fs_tempdir.path().join("symlink_to_file"); let symlink_path = other_fs_tempdir.path().join("symlink_to_file");
std::os::unix::fs::symlink(&other_fs_file_path, &symlink_path) symlink(&other_fs_file_path, &symlink_path).expect("Unable to create symlink_to_file");
.expect("Unable to create symlink_to_file");
// mv src to symlink in another partition // mv src to symlink in another partition
scene scene
@ -1663,29 +1666,22 @@ fn test_mv_unlinks_dest_symlink() {
assert!(!symlink_path.is_symlink()); assert!(!symlink_path.is_symlink());
// make sure that file contents in other_fs_file didn't change. // make sure that file contents in other_fs_file didn't change.
let mut new_contents = String::new(); assert_eq!(
std::io::Read::read_to_string( read_to_string(&other_fs_file_path,).expect("Unable to read other_fs_file"),
&mut std::fs::File::open(&other_fs_file_path).expect("Unable to open other_fs_file"), "other fs file contents"
&mut new_contents, );
)
.expect("Unable to read other_fs_file");
assert_eq!(new_contents, "other fs file contents");
// make sure that src file contents got copied into new file created in symlink_path . // make sure that src file contents got copied into new file created in symlink_path
let mut new_contents = String::new(); assert_eq!(
std::io::Read::read_to_string( read_to_string(&symlink_path).expect("Unable to read other_fs_file"),
&mut std::fs::File::open(&symlink_path).expect("Unable to open file"), "src contents"
&mut new_contents, );
)
.expect("Unable to read file");
assert_eq!(new_contents, "src contents");
} }
// In an inter-partition move if unlinking the destination symlink fails, ensure // In an inter-partition move if unlinking the destination symlink fails, ensure
// that it would output the proper error message. // that it would output the proper error message.
#[cfg(target_os = "linux")]
#[test] #[test]
fn test_mv_unlinks_dest_symlink_error_message() { pub(crate) fn test_mv_unlinks_dest_symlink_error_message() {
let scene = TestScenario::new(util_name!()); let scene = TestScenario::new(util_name!());
let at = &scene.fixtures; let at = &scene.fixtures;
@ -1694,26 +1690,20 @@ fn test_mv_unlinks_dest_symlink_error_message() {
// create a folder in another partition. // create a folder in another partition.
let other_fs_tempdir = let other_fs_tempdir =
tempfile::TempDir::new_in("/dev/shm/").expect("Unable to create temp directory"); TempDir::new_in("/dev/shm/").expect("Unable to create temp directory");
// create a file inside that folder. // create a file inside that folder.
let other_fs_file_path = other_fs_tempdir.path().join("other_fs_file"); let other_fs_file_path = other_fs_tempdir.path().join("other_fs_file");
let mut file = write(&other_fs_file_path, "other fs file contents")
std::fs::File::create(&other_fs_file_path).expect("Unable to create other_fs_file");
std::io::Write::write_all(&mut file, b"other fs file contents")
.expect("Unable to write to other_fs_file"); .expect("Unable to write to other_fs_file");
// create a symlink to the file inside the same directory. // create a symlink to the file inside the same directory.
let symlink_path = other_fs_tempdir.path().join("symlink_to_file"); let symlink_path = other_fs_tempdir.path().join("symlink_to_file");
std::os::unix::fs::symlink(&other_fs_file_path, &symlink_path) symlink(&other_fs_file_path, &symlink_path).expect("Unable to create symlink_to_file");
.expect("Unable to create symlink_to_file");
// disable write for the target folder so that when mv tries to remove the // disable write for the target folder so that when mv tries to remove the
// the destination symlink inside the target directory it would fail. // the destination symlink inside the target directory it would fail.
std::fs::set_permissions( set_permissions(other_fs_tempdir.path(), PermissionsExt::from_mode(0o555))
other_fs_tempdir.path(),
std::os::unix::fs::PermissionsExt::from_mode(0o555),
)
.expect("Unable to set permissions for temp directory"); .expect("Unable to set permissions for temp directory");
// mv src to symlink in another partition // mv src to symlink in another partition
@ -1725,3 +1715,4 @@ fn test_mv_unlinks_dest_symlink_error_message() {
.stderr_contains("inter-device move failed:") .stderr_contains("inter-device move failed:")
.stderr_contains("Permission denied"); .stderr_contains("Permission denied");
} }
}