@@ -906,6 +906,57 @@ public void testCopyDirectoryFiltered() throws Exception {
906906 assertEquals ("file3.txt" , files .get (2 ).getName ());
907907 }
908908
909+ public void testCopyDirectoryPreserveDates () throws Exception {
910+ File source = new File (getTestDirectory (), "source" );
911+ File sourceDirectory = new File (source , "directory" );
912+ File sourceFile = new File (sourceDirectory , "hello.txt" );
913+
914+ // Prepare source data
915+ source .mkdirs ();
916+ sourceDirectory .mkdir ();
917+ FileUtils .writeStringToFile (sourceFile , "HELLO WORLD" , "UTF8" );
918+ // Set dates in reverse order to avoid overwriting previous values
919+ // Also, use full seconds (arguments are in ms) close to today
920+ // but still highly unlikely to occur in the real world
921+ sourceFile .setLastModified (1000000002000L );
922+ sourceDirectory .setLastModified (1000000001000L );
923+ source .setLastModified (1000000000000L );
924+
925+ File target = new File (getTestDirectory (), "target" );
926+ File targetDirectory = new File (target , "directory" );
927+ File targetFile = new File (targetDirectory , "hello.txt" );
928+
929+ // Test with preserveFileDate disabled
930+ FileUtils .copyDirectory (source , target , false );
931+ assertTrue (1000000000000L != target .lastModified ());
932+ assertTrue (1000000001000L != targetDirectory .lastModified ());
933+ assertTrue (1000000002000L != targetFile .lastModified ());
934+ FileUtils .deleteDirectory (target );
935+
936+ // Test with preserveFileDate enabled
937+ FileUtils .copyDirectory (source , target , true );
938+ assertEquals (1000000000000L , target .lastModified ());
939+ assertEquals (1000000001000L , targetDirectory .lastModified ());
940+ assertEquals (1000000002000L , targetFile .lastModified ());
941+ FileUtils .deleteDirectory (target );
942+
943+ // also if the target directory already exists (IO-190)
944+ target .mkdirs ();
945+ FileUtils .copyDirectory (source , target , true );
946+ assertEquals (1000000000000L , target .lastModified ());
947+ assertEquals (1000000001000L , targetDirectory .lastModified ());
948+ assertEquals (1000000002000L , targetFile .lastModified ());
949+ FileUtils .deleteDirectory (target );
950+
951+ // also if the target subdirectory already exists (IO-190)
952+ targetDirectory .mkdirs ();
953+ FileUtils .copyDirectory (source , target , true );
954+ assertEquals (1000000000000L , target .lastModified ());
955+ assertEquals (1000000001000L , targetDirectory .lastModified ());
956+ assertEquals (1000000002000L , targetFile .lastModified ());
957+ FileUtils .deleteDirectory (target );
958+ }
959+
909960 /** Test for IO-141 */
910961 public void testCopyDirectoryToChild () throws Exception {
911962 File grandParentDir = new File (getTestDirectory (), "grandparent" );
0 commit comments