@@ -11,6 +11,9 @@ use std::os::windows::fs::symlink_file;
1111#[ cfg( not( windows) ) ]
1212use std:: env;
1313
14+ use filetime:: FileTime ;
15+ use std:: fs as std_fs;
16+
1417static TEST_EXISTING_FILE : & str = "existing_file.txt" ;
1518static TEST_HELLO_WORLD_SOURCE : & str = "hello_world.txt" ;
1619static 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