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

cp: gnu "same-file" test case compatibility (#6190)

* cp: -b doesn't ignore "version control" env

* cp: gnu "same-file" test compatibility fix
This commit is contained in:
sreehari prasad 2024-04-21 13:19:45 +05:30 committed by GitHub
parent f78b408830
commit a1717436a4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 1069 additions and 38 deletions

View file

@ -3,7 +3,7 @@
// For the full copyright and license information, please view the LICENSE
// file that was distributed with this source code.
// spell-checker:ignore (flags) reflink (fs) tmpfs (linux) rlimit Rlim NOFILE clob btrfs neve ROOTDIR USERDIR procfs outfile uufs xattrs
// spell-checker:ignore bdfl hlsl
use crate::common::util::TestScenario;
#[cfg(not(windows))]
use std::fs::set_permissions;
@ -3886,3 +3886,927 @@ fn test_cp_no_dereference_attributes_only_with_symlink() {
"file2 content does not match expected"
);
}
#[cfg(all(unix, not(target_os = "android")))]
#[cfg(test)]
/// contains the test for cp when the source and destination points to the same file
mod same_file {
use crate::common::util::TestScenario;
const FILE_NAME: &str = "foo";
const SYMLINK_NAME: &str = "symlink";
const CONTENTS: &str = "abcd";
// the following tests tries to copy a file to the symlink of the same file with
// various options
#[test]
fn test_same_file_from_file_to_symlink() {
for option in ["-d", "-f", "-df"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&[option, FILE_NAME, SYMLINK_NAME])
.fails()
.stderr_contains("'foo' and 'symlink' are the same file");
assert!(at.symlink_exists(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_symlink_with_rem_option() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&["--rem", FILE_NAME, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(SYMLINK_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
#[test]
fn test_same_file_from_file_to_symlink_with_backup_option() {
for option in ["-b", "-bd", "-bf", "-bdf"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let backup = "symlink~";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&[option, FILE_NAME, SYMLINK_NAME])
.succeeds();
assert!(at.symlink_exists(backup));
assert_eq!(FILE_NAME, at.resolve_link(backup));
assert!(at.file_exists(SYMLINK_NAME));
assert_eq!(at.read(SYMLINK_NAME), CONTENTS,);
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_symlink_with_link_option() {
for option in ["-l", "-dl"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&[option, FILE_NAME, SYMLINK_NAME])
.fails()
.stderr_contains("cp: cannot create hard link 'symlink' to 'foo'");
assert!(at.symlink_exists(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_symlink_with_options_link_and_force() {
for option in ["-fl", "-dfl"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&[option, FILE_NAME, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(SYMLINK_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_symlink_with_options_backup_and_link() {
for option in ["-bl", "-bdl", "-bfl", "-bdfl"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let backup = "symlink~";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&[option, FILE_NAME, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(SYMLINK_NAME));
assert!(at.symlink_exists(backup));
assert_eq!(FILE_NAME, at.resolve_link(backup));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_symlink_with_options_symlink() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&["-s", FILE_NAME, SYMLINK_NAME])
.fails()
.stderr_contains("cp: cannot create symlink 'symlink' to 'foo'");
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
#[test]
fn test_same_file_from_file_to_symlink_with_options_symlink_and_force() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&["-sf", FILE_NAME, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
// the following tests tries to copy a symlink to the file that symlink points to with
// various options
#[test]
fn test_same_file_from_symlink_to_file() {
for option in ["-d", "-f", "-df", "--rem"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&[option, SYMLINK_NAME, FILE_NAME])
.fails()
.stderr_contains("'symlink' and 'foo' are the same file");
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_symlink_to_file_with_option_backup() {
for option in ["-b", "-bf"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&[option, SYMLINK_NAME, FILE_NAME])
.fails()
.stderr_contains("'symlink' and 'foo' are the same file");
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_symlink_to_file_with_option_backup_without_deref() {
for option in ["-bd", "-bdf"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let backup = "foo~";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&[option, SYMLINK_NAME, FILE_NAME])
.succeeds();
assert!(at.file_exists(backup));
assert!(at.symlink_exists(FILE_NAME));
// this doesn't makes sense but this is how gnu does it
assert_eq!(FILE_NAME, at.resolve_link(FILE_NAME));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(at.read(backup), CONTENTS,);
}
}
#[test]
fn test_same_file_from_symlink_to_file_with_options_link() {
for option in ["-l", "-dl", "-fl", "-bl", "-bfl"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&[option, SYMLINK_NAME, FILE_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_symlink_to_file_with_option_symlink() {
for option in ["-s", "-sf"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
scene
.ucmd()
.args(&[option, SYMLINK_NAME, FILE_NAME])
.fails()
.stderr_contains("'symlink' and 'foo' are the same file");
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
// the following tests tries to copy a file to the same file with various options
#[test]
fn test_same_file_from_file_to_file() {
for option in ["-d", "-f", "-df", "--rem"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
scene
.ucmd()
.args(&[option, FILE_NAME, FILE_NAME])
.fails()
.stderr_contains("'foo' and 'foo' are the same file");
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_file_with_backup() {
for option in ["-b", "-bd"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
scene
.ucmd()
.args(&[option, FILE_NAME, FILE_NAME])
.fails()
.stderr_contains("'foo' and 'foo' are the same file");
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_file_with_options_backup_and_no_deref() {
for option in ["-bf", "-bdf"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let backup = "foo~";
at.write(FILE_NAME, CONTENTS);
scene
.ucmd()
.args(&[option, FILE_NAME, FILE_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(backup));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(at.read(backup), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_file_with_options_link() {
for option in ["-l", "-dl", "-fl", "-dfl", "-bl", "-bdl"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let backup = "foo~";
at.write(FILE_NAME, CONTENTS);
scene
.ucmd()
.args(&[option, FILE_NAME, FILE_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(!at.file_exists(backup));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_file_with_options_link_and_backup_and_force() {
for option in ["-bfl", "-bdfl"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let backup = "foo~";
at.write(FILE_NAME, CONTENTS);
scene
.ucmd()
.args(&[option, FILE_NAME, FILE_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(backup));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(at.read(backup), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_file_with_options_symlink() {
for option in ["-s", "-sf"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(FILE_NAME, CONTENTS);
scene
.ucmd()
.args(&[option, FILE_NAME, FILE_NAME])
.fails()
.stderr_contains("'foo' and 'foo' are the same file");
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
// the following tests tries to copy a symlink that points to a file to a symlink
// that points to the same file with various options
#[test]
fn test_same_file_from_symlink_to_symlink_with_option_no_deref() {
for option in ["-d", "-df"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let symlink1 = "sl1";
let symlink2 = "sl2";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, symlink1);
at.symlink_file(FILE_NAME, symlink2);
scene.ucmd().args(&[option, symlink1, symlink2]).succeeds();
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(FILE_NAME, at.resolve_link(symlink1));
assert_eq!(FILE_NAME, at.resolve_link(symlink2));
}
}
#[test]
fn test_same_file_from_symlink_to_symlink_with_option_force() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let symlink1 = "sl1";
let symlink2 = "sl2";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, symlink1);
at.symlink_file(FILE_NAME, symlink2);
scene
.ucmd()
.args(&["-f", symlink1, symlink2])
.fails()
.stderr_contains("'sl1' and 'sl2' are the same file");
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(FILE_NAME, at.resolve_link(symlink1));
assert_eq!(FILE_NAME, at.resolve_link(symlink2));
}
#[test]
fn test_same_file_from_symlink_to_symlink_with_option_rem() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let symlink1 = "sl1";
let symlink2 = "sl2";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, symlink1);
at.symlink_file(FILE_NAME, symlink2);
scene.ucmd().args(&["--rem", symlink1, symlink2]).succeeds();
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(FILE_NAME, at.resolve_link(symlink1));
assert!(at.file_exists(symlink2));
assert_eq!(at.read(symlink2), CONTENTS,);
}
#[test]
fn test_same_file_from_symlink_to_symlink_with_option_backup() {
for option in ["-b", "-bf"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let symlink1 = "sl1";
let symlink2 = "sl2";
let backup = "sl2~";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, symlink1);
at.symlink_file(FILE_NAME, symlink2);
scene.ucmd().args(&[option, symlink1, symlink2]).succeeds();
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(FILE_NAME, at.resolve_link(symlink1));
assert!(at.file_exists(symlink2));
assert_eq!(at.read(symlink2), CONTENTS,);
assert_eq!(FILE_NAME, at.resolve_link(backup));
}
}
#[test]
fn test_same_file_from_symlink_to_symlink_with_option_backup_and_no_deref() {
for option in ["-bd", "-bdf"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let symlink1 = "sl1";
let symlink2 = "sl2";
let backup = "sl2~";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, symlink1);
at.symlink_file(FILE_NAME, symlink2);
scene.ucmd().args(&[option, symlink1, symlink2]).succeeds();
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(FILE_NAME, at.resolve_link(symlink1));
assert_eq!(FILE_NAME, at.resolve_link(symlink2));
assert_eq!(FILE_NAME, at.resolve_link(backup));
}
}
#[test]
fn test_same_file_from_symlink_to_symlink_with_option_link() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let symlink1 = "sl1";
let symlink2 = "sl2";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, symlink1);
at.symlink_file(FILE_NAME, symlink2);
scene
.ucmd()
.args(&["-l", symlink1, symlink2])
.fails()
.stderr_contains("cannot create hard link 'sl2' to 'sl1'");
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(FILE_NAME, at.resolve_link(symlink1));
assert_eq!(FILE_NAME, at.resolve_link(symlink2));
}
#[test]
fn test_same_file_from_symlink_to_symlink_with_option_force_link() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let symlink1 = "sl1";
let symlink2 = "sl2";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, symlink1);
at.symlink_file(FILE_NAME, symlink2);
scene.ucmd().args(&["-fl", symlink1, symlink2]).succeeds();
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(FILE_NAME, at.resolve_link(symlink1));
assert!(at.file_exists(symlink2));
assert_eq!(at.read(symlink2), CONTENTS,);
}
#[test]
fn test_same_file_from_symlink_to_symlink_with_option_backup_and_link() {
for option in ["-bl", "-bfl"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let symlink1 = "sl1";
let symlink2 = "sl2";
let backup = "sl2~";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, symlink1);
at.symlink_file(FILE_NAME, symlink2);
scene.ucmd().args(&[option, symlink1, symlink2]).succeeds();
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(FILE_NAME, at.resolve_link(symlink1));
assert!(at.file_exists(symlink2));
assert_eq!(at.read(symlink2), CONTENTS,);
assert_eq!(FILE_NAME, at.resolve_link(backup));
}
}
#[test]
fn test_same_file_from_symlink_to_symlink_with_option_symlink() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let symlink1 = "sl1";
let symlink2 = "sl2";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, symlink1);
at.symlink_file(FILE_NAME, symlink2);
scene
.ucmd()
.args(&["-s", symlink1, symlink2])
.fails()
.stderr_contains("cannot create symlink 'sl2' to 'sl1'");
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(FILE_NAME, at.resolve_link(symlink1));
assert_eq!(FILE_NAME, at.resolve_link(symlink2));
}
#[test]
fn test_same_file_from_symlink_to_symlink_with_option_symlink_and_force() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let symlink1 = "sl1";
let symlink2 = "sl2";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, symlink1);
at.symlink_file(FILE_NAME, symlink2);
scene.ucmd().args(&["-sf", symlink1, symlink2]).succeeds();
assert!(at.file_exists(FILE_NAME));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(FILE_NAME, at.resolve_link(symlink1));
assert_eq!(symlink1, at.resolve_link(symlink2));
}
// the following tests tries to copy file to a hardlink of the same file with
// various options
#[test]
fn test_same_file_from_file_to_hardlink() {
for option in ["-d", "-f", "-df"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink = "hardlink";
at.write(FILE_NAME, CONTENTS);
at.hard_link(FILE_NAME, hardlink);
scene
.ucmd()
.args(&[option, FILE_NAME, hardlink])
.fails()
.stderr_contains("'foo' and 'hardlink' are the same file");
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(hardlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_hardlink_with_option_rem() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink = "hardlink";
at.write(FILE_NAME, CONTENTS);
at.hard_link(FILE_NAME, hardlink);
scene
.ucmd()
.args(&["--rem", FILE_NAME, hardlink])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(hardlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
#[test]
fn test_same_file_from_file_to_hardlink_with_option_backup() {
for option in ["-b", "-bd", "-bf", "-bdf"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink = "hardlink";
let backup = "hardlink~";
at.write(FILE_NAME, CONTENTS);
at.hard_link(FILE_NAME, hardlink);
scene.ucmd().args(&[option, FILE_NAME, hardlink]).succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(hardlink));
assert!(at.file_exists(backup));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_hardlink_with_option_link() {
for option in ["-l", "-dl", "-fl", "-dfl", "-bl", "-bdl", "-bfl", "-bdfl"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink = "hardlink";
at.write(FILE_NAME, CONTENTS);
at.hard_link(FILE_NAME, hardlink);
scene.ucmd().args(&[option, FILE_NAME, hardlink]).succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(hardlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_file_to_hardlink_with_option_symlink() {
for option in ["-s", "-sf"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink = "hardlink";
at.write(FILE_NAME, CONTENTS);
at.hard_link(FILE_NAME, hardlink);
scene
.ucmd()
.args(&[option, FILE_NAME, hardlink])
.fails()
.stderr_contains("'foo' and 'hardlink' are the same file");
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(hardlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
// the following tests tries to copy symlink to a hardlink of the same symlink with
// various options
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&[hardlink_to_symlink, SYMLINK_NAME])
.fails()
.stderr_contains("cp: 'hlsl' and 'symlink' are the same file");
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink_with_option_force() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&["-f", hardlink_to_symlink, SYMLINK_NAME])
.fails()
.stderr_contains("cp: 'hlsl' and 'symlink' are the same file");
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink_with_option_no_deref() {
for option in ["-d", "-df"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&[option, hardlink_to_symlink, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink_with_option_rem() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&["--rem", hardlink_to_symlink, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(SYMLINK_NAME));
assert!(!at.symlink_exists(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(at.read(SYMLINK_NAME), CONTENTS,);
}
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink_with_option_backup() {
for option in ["-b", "-bf"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let backup = "symlink~";
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&[option, hardlink_to_symlink, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(SYMLINK_NAME));
assert!(!at.symlink_exists(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert!(at.symlink_exists(backup));
assert_eq!(FILE_NAME, at.resolve_link(backup));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
assert_eq!(at.read(SYMLINK_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink_with_option_backup_and_no_deref() {
for option in ["-bd", "-bdf"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let backup = "symlink~";
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&[option, hardlink_to_symlink, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert!(at.symlink_exists(backup));
assert_eq!(FILE_NAME, at.resolve_link(backup));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink_with_option_link() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&["-l", hardlink_to_symlink, SYMLINK_NAME])
.fails()
.stderr_contains("cannot create hard link 'symlink' to 'hlsl'");
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink_with_option_link_and_no_deref() {
for option in ["-dl", "-dfl"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&[option, hardlink_to_symlink, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink_with_option_link_and_force() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&["-fl", hardlink_to_symlink, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(SYMLINK_NAME));
assert!(!at.symlink_exists(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink_with_option_link_and_backup() {
for option in ["-bl", "-bfl"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let backup = "symlink~";
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&[option, hardlink_to_symlink, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.file_exists(SYMLINK_NAME));
assert!(!at.symlink_exists(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert!(at.symlink_exists(backup));
assert_eq!(FILE_NAME, at.resolve_link(backup));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink_with_options_backup_link_no_deref() {
for option in ["-bdl", "-bdfl"] {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&[option, hardlink_to_symlink, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink_with_option_symlink() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&["-s", hardlink_to_symlink, SYMLINK_NAME])
.fails()
.stderr_contains("cannot create symlink 'symlink' to 'hlsl'");
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(FILE_NAME, at.resolve_link(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
#[test]
fn test_same_file_from_hard_link_of_symlink_to_symlink_with_option_symlink_and_force() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
let hardlink_to_symlink = "hlsl";
at.write(FILE_NAME, CONTENTS);
at.symlink_file(FILE_NAME, SYMLINK_NAME);
at.hard_link(SYMLINK_NAME, hardlink_to_symlink);
scene
.ucmd()
.args(&["-sf", hardlink_to_symlink, SYMLINK_NAME])
.succeeds();
assert!(at.file_exists(FILE_NAME));
assert!(at.symlink_exists(SYMLINK_NAME));
assert!(at.symlink_exists(hardlink_to_symlink));
assert_eq!(hardlink_to_symlink, at.resolve_link(SYMLINK_NAME));
assert_eq!(FILE_NAME, at.resolve_link(hardlink_to_symlink));
assert_eq!(at.read(FILE_NAME), CONTENTS,);
}
}