This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-io.git
commit f22a4227401855ecbfdf8184bbe37275c3aeb5c3 Author: Gary Gregory <gardgreg...@gmail.com> AuthorDate: Sat Aug 13 11:35:14 2022 -0400 Fix new API and convert its tests to use fixed file times The goal is to avoid the vagueries and randomness of local file systems and operating systems. --- src/main/java/org/apache/commons/io/FileUtils.java | 8 +- .../java/org/apache/commons/io/FileUtilsTest.java | 121 ++++++++++----------- 2 files changed, 62 insertions(+), 67 deletions(-) diff --git a/src/main/java/org/apache/commons/io/FileUtils.java b/src/main/java/org/apache/commons/io/FileUtils.java index 0ce8e97e..156e5637 100644 --- a/src/main/java/org/apache/commons/io/FileUtils.java +++ b/src/main/java/org/apache/commons/io/FileUtils.java @@ -1522,7 +1522,7 @@ public class FileUtils { /** * Tests if the specified {@link File} is newer than the specified {@link ChronoLocalDate} - * at the current time. + * at the end of day. * * <p>Note: The input date is assumed to be in the system default time-zone with the time * part set to the current time. To use a non-default time-zone use the method @@ -1538,7 +1538,7 @@ public class FileUtils { * @since 2.8.0 */ public static boolean isFileNewer(final File file, final ChronoLocalDate chronoLocalDate) { - return isFileNewer(file, chronoLocalDate, LocalTime.now()); + return isFileNewer(file, chronoLocalDate, LocalTime.MAX); } /** @@ -1724,7 +1724,7 @@ public class FileUtils { /** * Tests if the specified {@link File} is older than the specified {@link ChronoLocalDate} - * at the current time. + * at the end of day. * * <p>Note: The input date is assumed to be in the system default time-zone with the time * part set to the current time. To use a non-default time-zone use the method @@ -1742,7 +1742,7 @@ public class FileUtils { * @since 2.8.0 */ public static boolean isFileOlder(final File file, final ChronoLocalDate chronoLocalDate) { - return isFileOlder(file, chronoLocalDate, LocalTime.now()); + return isFileOlder(file, chronoLocalDate, LocalTime.MAX); } /** diff --git a/src/test/java/org/apache/commons/io/FileUtilsTest.java b/src/test/java/org/apache/commons/io/FileUtilsTest.java index 03a93704..ed7d7eb8 100644 --- a/src/test/java/org/apache/commons/io/FileUtilsTest.java +++ b/src/test/java/org/apache/commons/io/FileUtilsTest.java @@ -44,6 +44,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.nio.file.attribute.FileTime; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; @@ -63,6 +64,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.zip.CRC32; import java.util.zip.Checksum; @@ -80,6 +82,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; /** * This is used to test FileUtils for correctness. @@ -1595,33 +1599,36 @@ public class FileUtilsTest extends AbstractTempDirTest { Assertions.assertFalse(FileUtils.isEmptyDirectory(PathUtilsIsEmptyTest.DIR_SIZE_1.toFile())); } - @Test - public void testIsFileNewerOlder() throws Exception { - final File reference = new File(tempDirFile, "FileUtils-reference.txt"); + @ParameterizedTest + @ValueSource(longs = {1L, 100L, 1_000L, 10_000L, 100_000L, 1_000_000L}) + public void testIsFileNewerOlder(final long millis) throws Exception { + // Files final File oldFile = new File(tempDirFile, "FileUtils-old.txt"); + final File refFile = new File(tempDirFile, "FileUtils-reference.txt"); final File newFile = new File(tempDirFile, "FileUtils-new.txt"); final File invalidFile = new File(tempDirFile, "FileUtils-invalid-file.txt"); - - // Create Files - if (!oldFile.getParentFile().exists()) { - throw new IOException("Cannot create file " + oldFile - + " as the parent directory does not exist"); - } - try (final OutputStream output1 = new BufferedOutputStream(Files.newOutputStream(oldFile.toPath()))) { - TestUtils.generateTestData(output1, 0); + // Paths + final Path oldPath = oldFile.toPath(); + final Path refPath = refFile.toPath(); + final Path newPath = newFile.toPath(); + // FileTimes + final FileTime oldFileTime = FileTime.from(millis * 1, TimeUnit.MILLISECONDS); + final FileTime refFileTime = FileTime.from(millis * 2, TimeUnit.MILLISECONDS); + final FileTime testFileTime = FileTime.from(millis * 3, TimeUnit.MILLISECONDS); + final FileTime newFileTime = FileTime.from(millis * 4, TimeUnit.MILLISECONDS); + + // Create fixtures + try (final OutputStream output = new BufferedOutputStream(Files.newOutputStream(oldPath))) { + TestUtils.generateTestData(output, 0); } + Files.setLastModifiedTime(oldPath, oldFileTime); - do { - TestUtils.sleepQuietly(1000); - if (!reference.getParentFile().exists()) { - throw new IOException("Cannot create file " + reference + " as the parent directory does not exist"); - } - try (final OutputStream output = new BufferedOutputStream(Files.newOutputStream(reference.toPath()))) { - TestUtils.generateTestData(output, 0); - } - } while (getLastModifiedMillis(oldFile) == getLastModifiedMillis(reference)); + try (final OutputStream output = new BufferedOutputStream(Files.newOutputStream(refPath))) { + TestUtils.generateTestData(output, 0); + } + Files.setLastModifiedTime(refPath, refFileTime); - final Date date = new Date(); + final Date date = new Date(testFileTime.toMillis()); final long now = date.getTime(); final Instant instant = date.toInstant(); final ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()); @@ -1629,26 +1636,16 @@ public class FileUtilsTest extends AbstractTempDirTest { final LocalDateTime localDateTime = zonedDateTime.toLocalDateTime(); final LocalDate localDate = zonedDateTime.toLocalDate(); final LocalDate localDatePlusDay = localDate.plusDays(1); - final LocalTime localTime = LocalTime.ofSecondOfDay(0); - final OffsetTime offsetTime = OffsetTime.of(localTime, ZoneOffset.UTC); - - do { - try { - TestUtils.sleep(1000); - } catch (final InterruptedException ie) { - // ignore - } - if (!newFile.getParentFile().exists()) { - throw new IOException("Cannot create file " + newFile - + " as the parent directory does not exist"); - } - try (final OutputStream output = new BufferedOutputStream(Files.newOutputStream(newFile.toPath()))) { - TestUtils.generateTestData(output, 0); - } - } while (getLastModifiedMillis(reference) == getLastModifiedMillis(newFile)); + final LocalTime localTime0 = LocalTime.MIDNIGHT; + final OffsetTime offsetTime0 = OffsetTime.of(localTime0, ZoneOffset.UTC); + + try (final OutputStream output = new BufferedOutputStream(Files.newOutputStream(newPath))) { + TestUtils.generateTestData(output, 0); + } + Files.setLastModifiedTime(newPath, newFileTime); - // Test isFileNewer() - assertFalse(FileUtils.isFileNewer(oldFile, reference), "Old File - Newer - File"); + // Test + assertFalse(FileUtils.isFileNewer(oldFile, refFile), "Old File - Newer - File"); assertFalse(FileUtils.isFileNewer(oldFile, date), "Old File - Newer - Date"); assertFalse(FileUtils.isFileNewer(oldFile, now), "Old File - Newer - Mili"); assertFalse(FileUtils.isFileNewer(oldFile, instant), "Old File - Newer - Instant"); @@ -1657,13 +1654,13 @@ public class FileUtilsTest extends AbstractTempDirTest { assertFalse(FileUtils.isFileNewer(oldFile, localDateTime), "Old File - Newer - LocalDateTime"); assertFalse(FileUtils.isFileNewer(oldFile, localDateTime, ZoneId.systemDefault()), "Old File - Newer - LocalDateTime,ZoneId"); assertFalse(FileUtils.isFileNewer(oldFile, localDate), "Old File - Newer - LocalDate"); - assertTrue(FileUtils.isFileNewer(oldFile, localDate, localTime), "Old File - Newer - LocalDate,LocalTime"); - assertTrue(FileUtils.isFileNewer(oldFile, localDate, offsetTime), "Old File - Newer - LocalDate,OffsetTime"); + assertTrue(FileUtils.isFileNewer(oldFile, localDate, localTime0), "Old File - Newer - LocalDate,LocalTime"); + assertTrue(FileUtils.isFileNewer(oldFile, localDate, offsetTime0), "Old File - Newer - LocalDate,OffsetTime"); assertFalse(FileUtils.isFileNewer(oldFile, localDatePlusDay), "Old File - Newer - LocalDate plus one day"); - assertFalse(FileUtils.isFileNewer(oldFile, localDatePlusDay, localTime), "Old File - Newer - LocalDate plus one day,LocalTime"); - assertFalse(FileUtils.isFileNewer(oldFile, localDatePlusDay, offsetTime), "Old File - Newer - LocalDate plus one day,OffsetTime"); + assertFalse(FileUtils.isFileNewer(oldFile, localDatePlusDay, localTime0), "Old File - Newer - LocalDate plus one day,LocalTime"); + assertFalse(FileUtils.isFileNewer(oldFile, localDatePlusDay, offsetTime0), "Old File - Newer - LocalDate plus one day,OffsetTime"); - assertTrue(FileUtils.isFileNewer(newFile, reference), "New File - Newer - File"); + assertTrue(FileUtils.isFileNewer(newFile, refFile), "New File - Newer - File"); assertTrue(FileUtils.isFileNewer(newFile, date), "New File - Newer - Date"); assertTrue(FileUtils.isFileNewer(newFile, now), "New File - Newer - Mili"); assertTrue(FileUtils.isFileNewer(newFile, instant), "New File - Newer - Instant"); @@ -1672,17 +1669,16 @@ public class FileUtilsTest extends AbstractTempDirTest { assertTrue(FileUtils.isFileNewer(newFile, localDateTime), "New File - Newer - LocalDateTime"); assertTrue(FileUtils.isFileNewer(newFile, localDateTime, ZoneId.systemDefault()), "New File - Newer - LocalDateTime,ZoneId"); assertFalse(FileUtils.isFileNewer(newFile, localDate), "New File - Newer - LocalDate"); - assertTrue(FileUtils.isFileNewer(newFile, localDate, localTime), "New File - Newer - LocalDate,LocalTime"); - assertTrue(FileUtils.isFileNewer(newFile, localDate, offsetTime), "New File - Newer - LocalDate,OffsetTime"); + assertTrue(FileUtils.isFileNewer(newFile, localDate, localTime0), "New File - Newer - LocalDate,LocalTime"); + assertTrue(FileUtils.isFileNewer(newFile, localDate, offsetTime0), "New File - Newer - LocalDate,OffsetTime"); assertFalse(FileUtils.isFileNewer(newFile, localDatePlusDay), "New File - Newer - LocalDate plus one day"); - assertFalse(FileUtils.isFileNewer(newFile, localDatePlusDay, localTime), "New File - Newer - LocalDate plus one day,LocalTime"); - assertFalse(FileUtils.isFileNewer(newFile, localDatePlusDay, offsetTime), "New File - Newer - LocalDate plus one day,OffsetTime"); - assertFalse(FileUtils.isFileNewer(invalidFile, reference), "Invalid - Newer - File"); - final String invalidFileName = invalidFile.getName(); + assertFalse(FileUtils.isFileNewer(newFile, localDatePlusDay, localTime0), "New File - Newer - LocalDate plus one day,LocalTime"); + assertFalse(FileUtils.isFileNewer(newFile, localDatePlusDay, offsetTime0), "New File - Newer - LocalDate plus one day,OffsetTime"); + assertFalse(FileUtils.isFileNewer(invalidFile, refFile), "Invalid - Newer - File"); assertThrows(IllegalArgumentException.class, () -> FileUtils.isFileNewer(newFile, invalidFile)); // Test isFileOlder() - assertTrue(FileUtils.isFileOlder(oldFile, reference), "Old File - Older - File"); + assertTrue(FileUtils.isFileOlder(oldFile, refFile), "Old File - Older - File"); assertTrue(FileUtils.isFileOlder(oldFile, date), "Old File - Older - Date"); assertTrue(FileUtils.isFileOlder(oldFile, now), "Old File - Older - Mili"); assertTrue(FileUtils.isFileOlder(oldFile, instant), "Old File - Older - Instant"); @@ -1691,13 +1687,13 @@ public class FileUtilsTest extends AbstractTempDirTest { assertTrue(FileUtils.isFileOlder(oldFile, localDateTime), "Old File - Older - LocalDateTime"); assertTrue(FileUtils.isFileOlder(oldFile, localDateTime, ZoneId.systemDefault()), "Old File - Older - LocalDateTime,LocalTime"); assertTrue(FileUtils.isFileOlder(oldFile, localDate), "Old File - Older - LocalDate"); - assertFalse(FileUtils.isFileOlder(oldFile, localDate, localTime), "Old File - Older - LocalDate,LocalTime"); - assertFalse(FileUtils.isFileOlder(oldFile, localDate, offsetTime), "Old File - Older - LocalDate,OffsetTime"); + assertFalse(FileUtils.isFileOlder(oldFile, localDate, localTime0), "Old File - Older - LocalDate,LocalTime"); + assertFalse(FileUtils.isFileOlder(oldFile, localDate, offsetTime0), "Old File - Older - LocalDate,OffsetTime"); assertTrue(FileUtils.isFileOlder(oldFile, localDatePlusDay), "Old File - Older - LocalDate plus one day"); - assertTrue(FileUtils.isFileOlder(oldFile, localDatePlusDay, localTime), "Old File - Older - LocalDate plus one day,LocalTime"); - assertTrue(FileUtils.isFileOlder(oldFile, localDatePlusDay, offsetTime), "Old File - Older - LocalDate plus one day,OffsetTime"); + assertTrue(FileUtils.isFileOlder(oldFile, localDatePlusDay, localTime0), "Old File - Older - LocalDate plus one day,LocalTime"); + assertTrue(FileUtils.isFileOlder(oldFile, localDatePlusDay, offsetTime0), "Old File - Older - LocalDate plus one day,OffsetTime"); - assertFalse(FileUtils.isFileOlder(newFile, reference), "New File - Older - File"); + assertFalse(FileUtils.isFileOlder(newFile, refFile), "New File - Older - File"); assertFalse(FileUtils.isFileOlder(newFile, date), "New File - Older - Date"); assertFalse(FileUtils.isFileOlder(newFile, now), "New File - Older - Mili"); assertFalse(FileUtils.isFileOlder(newFile, instant), "New File - Older - Instant"); @@ -1706,16 +1702,15 @@ public class FileUtilsTest extends AbstractTempDirTest { assertFalse(FileUtils.isFileOlder(newFile, localDateTime), "New File - Older - LocalDateTime"); assertFalse(FileUtils.isFileOlder(newFile, localDateTime, ZoneId.systemDefault()), "New File - Older - LocalDateTime,ZoneId"); assertTrue(FileUtils.isFileOlder(newFile, localDate), "New File - Older - LocalDate"); - assertFalse(FileUtils.isFileOlder(newFile, localDate, localTime), "New File - Older - LocalDate,LocalTime"); - assertFalse(FileUtils.isFileOlder(newFile, localDate, offsetTime), "New File - Older - LocalDate,OffsetTime"); + assertFalse(FileUtils.isFileOlder(newFile, localDate, localTime0), "New File - Older - LocalDate,LocalTime"); + assertFalse(FileUtils.isFileOlder(newFile, localDate, offsetTime0), "New File - Older - LocalDate,OffsetTime"); assertTrue(FileUtils.isFileOlder(newFile, localDatePlusDay), "New File - Older - LocalDate plus one day"); - assertTrue(FileUtils.isFileOlder(newFile, localDatePlusDay, localTime), "New File - Older - LocalDate plus one day,LocalTime"); - assertTrue(FileUtils.isFileOlder(newFile, localDatePlusDay, offsetTime), "New File - Older - LocalDate plus one day,OffsetTime"); + assertTrue(FileUtils.isFileOlder(newFile, localDatePlusDay, localTime0), "New File - Older - LocalDate plus one day,LocalTime"); + assertTrue(FileUtils.isFileOlder(newFile, localDatePlusDay, offsetTime0), "New File - Older - LocalDate plus one day,OffsetTime"); - assertFalse(FileUtils.isFileOlder(invalidFile, reference), "Invalid - Older - File"); + assertFalse(FileUtils.isFileOlder(invalidFile, refFile), "Invalid - Older - File"); assertThrows(IllegalArgumentException.class, () -> FileUtils.isFileOlder(newFile, invalidFile)); - // ----- Test isFileNewer() exceptions ----- // Null File assertThrows(NullPointerException.class, () -> FileUtils.isFileNewer(null, now));