Skip to content

Commit 657f31a

Browse files
committed
cp: add more tests
1 parent 35d2e02 commit 657f31a

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed

tests/by-util/test_cp.rs

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ use std::os::windows::fs::symlink_file;
1111
#[cfg(not(windows))]
1212
use std::env;
1313

14+
use filetime::FileTime;
15+
use std::fs as std_fs;
16+
1417
static TEST_EXISTING_FILE: &str = "existing_file.txt";
1518
static TEST_HELLO_WORLD_SOURCE: &str = "hello_world.txt";
1619
static TEST_HELLO_WORLD_SOURCE_SYMLINK: &str = "hello_world.txt.link";
@@ -487,3 +490,104 @@ fn test_cp_no_deref_folder_to_folder() {
487490
let path_to_check = path_to_new_symlink.to_str().unwrap();
488491
assert_eq!(at.read(&path_to_check), "Hello, World!\n");
489492
}
493+
494+
495+
496+
#[test]
497+
fn test_cp_archive() {
498+
let (at, mut ucmd) = at_and_ucmd!();
499+
let ts = time::now().to_timespec();
500+
let previous = FileTime::from_unix_time(ts.sec as i64 - 3600, ts.nsec as u32);
501+
// set the file creation/modif an hour ago
502+
filetime::set_file_times(at.plus_as_string(TEST_HELLO_WORLD_SOURCE), previous, previous).unwrap();
503+
let result = ucmd
504+
.arg(TEST_HELLO_WORLD_SOURCE)
505+
.arg("--archive")
506+
.arg(TEST_HOW_ARE_YOU_SOURCE)
507+
.run();
508+
509+
assert!(result.success);
510+
assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n");
511+
512+
let metadata = std_fs::metadata(at.subdir.join(TEST_HELLO_WORLD_SOURCE)).unwrap();
513+
let creation = metadata.modified().unwrap();
514+
515+
let metadata2 = std_fs::metadata(at.subdir.join(TEST_HOW_ARE_YOU_SOURCE)).unwrap();
516+
let creation2 = metadata2.modified().unwrap();
517+
518+
519+
let scene2 = TestScenario::new("ls");
520+
let result = scene2.cmd("ls").arg("-al").arg(at.subdir).run();
521+
522+
println!("ls dest {}", result.stdout);
523+
assert_eq!(creation, creation2);
524+
assert!(result.success);
525+
}
526+
527+
528+
#[test]
529+
fn test_cp_preserve_timestamps() {
530+
let (at, mut ucmd) = at_and_ucmd!();
531+
let ts = time::now().to_timespec();
532+
let previous = FileTime::from_unix_time(ts.sec as i64 - 3600, ts.nsec as u32);
533+
// set the file creation/modif an hour ago
534+
filetime::set_file_times(at.plus_as_string(TEST_HELLO_WORLD_SOURCE), previous, previous).unwrap();
535+
let result = ucmd
536+
.arg(TEST_HELLO_WORLD_SOURCE)
537+
.arg("--preserve=timestamps")
538+
.arg(TEST_HOW_ARE_YOU_SOURCE)
539+
.run();
540+
541+
assert!(result.success);
542+
assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n");
543+
544+
let metadata = std_fs::metadata(at.subdir.join(TEST_HELLO_WORLD_SOURCE)).unwrap();
545+
let creation = metadata.modified().unwrap();
546+
547+
let metadata2 = std_fs::metadata(at.subdir.join(TEST_HOW_ARE_YOU_SOURCE)).unwrap();
548+
let creation2 = metadata2.modified().unwrap();
549+
550+
let scene2 = TestScenario::new("ls");
551+
let result = scene2.cmd("ls").arg("-al").arg(at.subdir).run();
552+
553+
println!("ls dest {}", result.stdout);
554+
assert_eq!(creation, creation2);
555+
assert!(result.success);
556+
}
557+
558+
559+
#[test]
560+
fn test_cp_dont_preserve_timestamps() {
561+
let (at, mut ucmd) = at_and_ucmd!();
562+
let ts = time::now().to_timespec();
563+
let previous = FileTime::from_unix_time(ts.sec as i64 - 3600, ts.nsec as u32);
564+
// set the file creation/modif an hour ago
565+
filetime::set_file_times(at.plus_as_string(TEST_HELLO_WORLD_SOURCE), previous, previous).unwrap();
566+
let result = ucmd
567+
.arg(TEST_HELLO_WORLD_SOURCE)
568+
.arg("--no-preserve=timestamps")
569+
.arg(TEST_HOW_ARE_YOU_SOURCE)
570+
.run();
571+
572+
assert!(result.success);
573+
assert_eq!(at.read(TEST_HOW_ARE_YOU_SOURCE), "Hello, World!\n");
574+
575+
let metadata = std_fs::metadata(at.subdir.join(TEST_HELLO_WORLD_SOURCE)).unwrap();
576+
let creation = metadata.modified().unwrap();
577+
578+
let metadata2 = std_fs::metadata(at.subdir.join(TEST_HOW_ARE_YOU_SOURCE)).unwrap();
579+
let creation2 = metadata2.modified().unwrap();
580+
581+
let scene2 = TestScenario::new("ls");
582+
let result = scene2.cmd("ls").arg("-al").arg(at.subdir).run();
583+
584+
println!("ls dest {}", result.stdout);
585+
println!("creation {:?} / {:?}", creation, creation2);
586+
587+
assert_ne!(creation, creation2);
588+
let res = creation.elapsed().unwrap() - creation2.elapsed().unwrap();
589+
// Some margins with time check
590+
assert!(res.as_secs() > 3595);
591+
assert!(res.as_secs() < 3605);
592+
assert!(result.success);
593+
}

0 commit comments

Comments
 (0)