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:
parent
f78b408830
commit
a1717436a4
4 changed files with 1069 additions and 38 deletions
|
@ -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,);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue