Skip to content

Commit f22a422

Browse files
author
Gary Gregory
committed
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.
1 parent fc1e535 commit f22a422

2 files changed

Lines changed: 62 additions & 67 deletions

File tree

src/main/java/org/apache/commons/io/FileUtils.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1522,7 +1522,7 @@ public static boolean isEmptyDirectory(final File directory) throws IOException
15221522

15231523
/**
15241524
* Tests if the specified {@link File} is newer than the specified {@link ChronoLocalDate}
1525-
* at the current time.
1525+
* at the end of day.
15261526
*
15271527
* <p>Note: The input date is assumed to be in the system default time-zone with the time
15281528
* part set to the current time. To use a non-default time-zone use the method
@@ -1538,7 +1538,7 @@ public static boolean isEmptyDirectory(final File directory) throws IOException
15381538
* @since 2.8.0
15391539
*/
15401540
public static boolean isFileNewer(final File file, final ChronoLocalDate chronoLocalDate) {
1541-
return isFileNewer(file, chronoLocalDate, LocalTime.now());
1541+
return isFileNewer(file, chronoLocalDate, LocalTime.MAX);
15421542
}
15431543

15441544
/**
@@ -1724,7 +1724,7 @@ public static boolean isFileNewer(final File file, final OffsetDateTime offsetDa
17241724

17251725
/**
17261726
* Tests if the specified {@link File} is older than the specified {@link ChronoLocalDate}
1727-
* at the current time.
1727+
* at the end of day.
17281728
*
17291729
* <p>Note: The input date is assumed to be in the system default time-zone with the time
17301730
* part set to the current time. To use a non-default time-zone use the method
@@ -1742,7 +1742,7 @@ public static boolean isFileNewer(final File file, final OffsetDateTime offsetDa
17421742
* @since 2.8.0
17431743
*/
17441744
public static boolean isFileOlder(final File file, final ChronoLocalDate chronoLocalDate) {
1745-
return isFileOlder(file, chronoLocalDate, LocalTime.now());
1745+
return isFileOlder(file, chronoLocalDate, LocalTime.MAX);
17461746
}
17471747

17481748
/**

src/test/java/org/apache/commons/io/FileUtilsTest.java

Lines changed: 58 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import java.nio.file.Path;
4545
import java.nio.file.Paths;
4646
import java.nio.file.StandardCopyOption;
47+
import java.nio.file.attribute.FileTime;
4748
import java.time.Instant;
4849
import java.time.LocalDate;
4950
import java.time.LocalDateTime;
@@ -63,6 +64,7 @@
6364
import java.util.Iterator;
6465
import java.util.List;
6566
import java.util.Map;
67+
import java.util.concurrent.TimeUnit;
6668
import java.util.zip.CRC32;
6769
import java.util.zip.Checksum;
6870

@@ -80,6 +82,8 @@
8082
import org.junit.jupiter.api.BeforeEach;
8183
import org.junit.jupiter.api.Disabled;
8284
import org.junit.jupiter.api.Test;
85+
import org.junit.jupiter.params.ParameterizedTest;
86+
import org.junit.jupiter.params.provider.ValueSource;
8387

8488
/**
8589
* This is used to test FileUtils for correctness.
@@ -1595,60 +1599,53 @@ public void testIsEmptyDirectory() throws IOException {
15951599
Assertions.assertFalse(FileUtils.isEmptyDirectory(PathUtilsIsEmptyTest.DIR_SIZE_1.toFile()));
15961600
}
15971601

1598-
@Test
1599-
public void testIsFileNewerOlder() throws Exception {
1600-
final File reference = new File(tempDirFile, "FileUtils-reference.txt");
1602+
@ParameterizedTest
1603+
@ValueSource(longs = {1L, 100L, 1_000L, 10_000L, 100_000L, 1_000_000L})
1604+
public void testIsFileNewerOlder(final long millis) throws Exception {
1605+
// Files
16011606
final File oldFile = new File(tempDirFile, "FileUtils-old.txt");
1607+
final File refFile = new File(tempDirFile, "FileUtils-reference.txt");
16021608
final File newFile = new File(tempDirFile, "FileUtils-new.txt");
16031609
final File invalidFile = new File(tempDirFile, "FileUtils-invalid-file.txt");
1604-
1605-
// Create Files
1606-
if (!oldFile.getParentFile().exists()) {
1607-
throw new IOException("Cannot create file " + oldFile
1608-
+ " as the parent directory does not exist");
1609-
}
1610-
try (final OutputStream output1 = new BufferedOutputStream(Files.newOutputStream(oldFile.toPath()))) {
1611-
TestUtils.generateTestData(output1, 0);
1610+
// Paths
1611+
final Path oldPath = oldFile.toPath();
1612+
final Path refPath = refFile.toPath();
1613+
final Path newPath = newFile.toPath();
1614+
// FileTimes
1615+
final FileTime oldFileTime = FileTime.from(millis * 1, TimeUnit.MILLISECONDS);
1616+
final FileTime refFileTime = FileTime.from(millis * 2, TimeUnit.MILLISECONDS);
1617+
final FileTime testFileTime = FileTime.from(millis * 3, TimeUnit.MILLISECONDS);
1618+
final FileTime newFileTime = FileTime.from(millis * 4, TimeUnit.MILLISECONDS);
1619+
1620+
// Create fixtures
1621+
try (final OutputStream output = new BufferedOutputStream(Files.newOutputStream(oldPath))) {
1622+
TestUtils.generateTestData(output, 0);
16121623
}
1624+
Files.setLastModifiedTime(oldPath, oldFileTime);
16131625

1614-
do {
1615-
TestUtils.sleepQuietly(1000);
1616-
if (!reference.getParentFile().exists()) {
1617-
throw new IOException("Cannot create file " + reference + " as the parent directory does not exist");
1618-
}
1619-
try (final OutputStream output = new BufferedOutputStream(Files.newOutputStream(reference.toPath()))) {
1620-
TestUtils.generateTestData(output, 0);
1621-
}
1622-
} while (getLastModifiedMillis(oldFile) == getLastModifiedMillis(reference));
1626+
try (final OutputStream output = new BufferedOutputStream(Files.newOutputStream(refPath))) {
1627+
TestUtils.generateTestData(output, 0);
1628+
}
1629+
Files.setLastModifiedTime(refPath, refFileTime);
16231630

1624-
final Date date = new Date();
1631+
final Date date = new Date(testFileTime.toMillis());
16251632
final long now = date.getTime();
16261633
final Instant instant = date.toInstant();
16271634
final ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
16281635
final OffsetDateTime offsetDateTime = zonedDateTime.toOffsetDateTime();
16291636
final LocalDateTime localDateTime = zonedDateTime.toLocalDateTime();
16301637
final LocalDate localDate = zonedDateTime.toLocalDate();
16311638
final LocalDate localDatePlusDay = localDate.plusDays(1);
1632-
final LocalTime localTime = LocalTime.ofSecondOfDay(0);
1633-
final OffsetTime offsetTime = OffsetTime.of(localTime, ZoneOffset.UTC);
1634-
1635-
do {
1636-
try {
1637-
TestUtils.sleep(1000);
1638-
} catch (final InterruptedException ie) {
1639-
// ignore
1640-
}
1641-
if (!newFile.getParentFile().exists()) {
1642-
throw new IOException("Cannot create file " + newFile
1643-
+ " as the parent directory does not exist");
1644-
}
1645-
try (final OutputStream output = new BufferedOutputStream(Files.newOutputStream(newFile.toPath()))) {
1646-
TestUtils.generateTestData(output, 0);
1647-
}
1648-
} while (getLastModifiedMillis(reference) == getLastModifiedMillis(newFile));
1639+
final LocalTime localTime0 = LocalTime.MIDNIGHT;
1640+
final OffsetTime offsetTime0 = OffsetTime.of(localTime0, ZoneOffset.UTC);
1641+
1642+
try (final OutputStream output = new BufferedOutputStream(Files.newOutputStream(newPath))) {
1643+
TestUtils.generateTestData(output, 0);
1644+
}
1645+
Files.setLastModifiedTime(newPath, newFileTime);
16491646

1650-
// Test isFileNewer()
1651-
assertFalse(FileUtils.isFileNewer(oldFile, reference), "Old File - Newer - File");
1647+
// Test
1648+
assertFalse(FileUtils.isFileNewer(oldFile, refFile), "Old File - Newer - File");
16521649
assertFalse(FileUtils.isFileNewer(oldFile, date), "Old File - Newer - Date");
16531650
assertFalse(FileUtils.isFileNewer(oldFile, now), "Old File - Newer - Mili");
16541651
assertFalse(FileUtils.isFileNewer(oldFile, instant), "Old File - Newer - Instant");
@@ -1657,13 +1654,13 @@ public void testIsFileNewerOlder() throws Exception {
16571654
assertFalse(FileUtils.isFileNewer(oldFile, localDateTime), "Old File - Newer - LocalDateTime");
16581655
assertFalse(FileUtils.isFileNewer(oldFile, localDateTime, ZoneId.systemDefault()), "Old File - Newer - LocalDateTime,ZoneId");
16591656
assertFalse(FileUtils.isFileNewer(oldFile, localDate), "Old File - Newer - LocalDate");
1660-
assertTrue(FileUtils.isFileNewer(oldFile, localDate, localTime), "Old File - Newer - LocalDate,LocalTime");
1661-
assertTrue(FileUtils.isFileNewer(oldFile, localDate, offsetTime), "Old File - Newer - LocalDate,OffsetTime");
1657+
assertTrue(FileUtils.isFileNewer(oldFile, localDate, localTime0), "Old File - Newer - LocalDate,LocalTime");
1658+
assertTrue(FileUtils.isFileNewer(oldFile, localDate, offsetTime0), "Old File - Newer - LocalDate,OffsetTime");
16621659
assertFalse(FileUtils.isFileNewer(oldFile, localDatePlusDay), "Old File - Newer - LocalDate plus one day");
1663-
assertFalse(FileUtils.isFileNewer(oldFile, localDatePlusDay, localTime), "Old File - Newer - LocalDate plus one day,LocalTime");
1664-
assertFalse(FileUtils.isFileNewer(oldFile, localDatePlusDay, offsetTime), "Old File - Newer - LocalDate plus one day,OffsetTime");
1660+
assertFalse(FileUtils.isFileNewer(oldFile, localDatePlusDay, localTime0), "Old File - Newer - LocalDate plus one day,LocalTime");
1661+
assertFalse(FileUtils.isFileNewer(oldFile, localDatePlusDay, offsetTime0), "Old File - Newer - LocalDate plus one day,OffsetTime");
16651662

1666-
assertTrue(FileUtils.isFileNewer(newFile, reference), "New File - Newer - File");
1663+
assertTrue(FileUtils.isFileNewer(newFile, refFile), "New File - Newer - File");
16671664
assertTrue(FileUtils.isFileNewer(newFile, date), "New File - Newer - Date");
16681665
assertTrue(FileUtils.isFileNewer(newFile, now), "New File - Newer - Mili");
16691666
assertTrue(FileUtils.isFileNewer(newFile, instant), "New File - Newer - Instant");
@@ -1672,17 +1669,16 @@ public void testIsFileNewerOlder() throws Exception {
16721669
assertTrue(FileUtils.isFileNewer(newFile, localDateTime), "New File - Newer - LocalDateTime");
16731670
assertTrue(FileUtils.isFileNewer(newFile, localDateTime, ZoneId.systemDefault()), "New File - Newer - LocalDateTime,ZoneId");
16741671
assertFalse(FileUtils.isFileNewer(newFile, localDate), "New File - Newer - LocalDate");
1675-
assertTrue(FileUtils.isFileNewer(newFile, localDate, localTime), "New File - Newer - LocalDate,LocalTime");
1676-
assertTrue(FileUtils.isFileNewer(newFile, localDate, offsetTime), "New File - Newer - LocalDate,OffsetTime");
1672+
assertTrue(FileUtils.isFileNewer(newFile, localDate, localTime0), "New File - Newer - LocalDate,LocalTime");
1673+
assertTrue(FileUtils.isFileNewer(newFile, localDate, offsetTime0), "New File - Newer - LocalDate,OffsetTime");
16771674
assertFalse(FileUtils.isFileNewer(newFile, localDatePlusDay), "New File - Newer - LocalDate plus one day");
1678-
assertFalse(FileUtils.isFileNewer(newFile, localDatePlusDay, localTime), "New File - Newer - LocalDate plus one day,LocalTime");
1679-
assertFalse(FileUtils.isFileNewer(newFile, localDatePlusDay, offsetTime), "New File - Newer - LocalDate plus one day,OffsetTime");
1680-
assertFalse(FileUtils.isFileNewer(invalidFile, reference), "Invalid - Newer - File");
1681-
final String invalidFileName = invalidFile.getName();
1675+
assertFalse(FileUtils.isFileNewer(newFile, localDatePlusDay, localTime0), "New File - Newer - LocalDate plus one day,LocalTime");
1676+
assertFalse(FileUtils.isFileNewer(newFile, localDatePlusDay, offsetTime0), "New File - Newer - LocalDate plus one day,OffsetTime");
1677+
assertFalse(FileUtils.isFileNewer(invalidFile, refFile), "Invalid - Newer - File");
16821678
assertThrows(IllegalArgumentException.class, () -> FileUtils.isFileNewer(newFile, invalidFile));
16831679

16841680
// Test isFileOlder()
1685-
assertTrue(FileUtils.isFileOlder(oldFile, reference), "Old File - Older - File");
1681+
assertTrue(FileUtils.isFileOlder(oldFile, refFile), "Old File - Older - File");
16861682
assertTrue(FileUtils.isFileOlder(oldFile, date), "Old File - Older - Date");
16871683
assertTrue(FileUtils.isFileOlder(oldFile, now), "Old File - Older - Mili");
16881684
assertTrue(FileUtils.isFileOlder(oldFile, instant), "Old File - Older - Instant");
@@ -1691,13 +1687,13 @@ public void testIsFileNewerOlder() throws Exception {
16911687
assertTrue(FileUtils.isFileOlder(oldFile, localDateTime), "Old File - Older - LocalDateTime");
16921688
assertTrue(FileUtils.isFileOlder(oldFile, localDateTime, ZoneId.systemDefault()), "Old File - Older - LocalDateTime,LocalTime");
16931689
assertTrue(FileUtils.isFileOlder(oldFile, localDate), "Old File - Older - LocalDate");
1694-
assertFalse(FileUtils.isFileOlder(oldFile, localDate, localTime), "Old File - Older - LocalDate,LocalTime");
1695-
assertFalse(FileUtils.isFileOlder(oldFile, localDate, offsetTime), "Old File - Older - LocalDate,OffsetTime");
1690+
assertFalse(FileUtils.isFileOlder(oldFile, localDate, localTime0), "Old File - Older - LocalDate,LocalTime");
1691+
assertFalse(FileUtils.isFileOlder(oldFile, localDate, offsetTime0), "Old File - Older - LocalDate,OffsetTime");
16961692
assertTrue(FileUtils.isFileOlder(oldFile, localDatePlusDay), "Old File - Older - LocalDate plus one day");
1697-
assertTrue(FileUtils.isFileOlder(oldFile, localDatePlusDay, localTime), "Old File - Older - LocalDate plus one day,LocalTime");
1698-
assertTrue(FileUtils.isFileOlder(oldFile, localDatePlusDay, offsetTime), "Old File - Older - LocalDate plus one day,OffsetTime");
1693+
assertTrue(FileUtils.isFileOlder(oldFile, localDatePlusDay, localTime0), "Old File - Older - LocalDate plus one day,LocalTime");
1694+
assertTrue(FileUtils.isFileOlder(oldFile, localDatePlusDay, offsetTime0), "Old File - Older - LocalDate plus one day,OffsetTime");
16991695

1700-
assertFalse(FileUtils.isFileOlder(newFile, reference), "New File - Older - File");
1696+
assertFalse(FileUtils.isFileOlder(newFile, refFile), "New File - Older - File");
17011697
assertFalse(FileUtils.isFileOlder(newFile, date), "New File - Older - Date");
17021698
assertFalse(FileUtils.isFileOlder(newFile, now), "New File - Older - Mili");
17031699
assertFalse(FileUtils.isFileOlder(newFile, instant), "New File - Older - Instant");
@@ -1706,16 +1702,15 @@ public void testIsFileNewerOlder() throws Exception {
17061702
assertFalse(FileUtils.isFileOlder(newFile, localDateTime), "New File - Older - LocalDateTime");
17071703
assertFalse(FileUtils.isFileOlder(newFile, localDateTime, ZoneId.systemDefault()), "New File - Older - LocalDateTime,ZoneId");
17081704
assertTrue(FileUtils.isFileOlder(newFile, localDate), "New File - Older - LocalDate");
1709-
assertFalse(FileUtils.isFileOlder(newFile, localDate, localTime), "New File - Older - LocalDate,LocalTime");
1710-
assertFalse(FileUtils.isFileOlder(newFile, localDate, offsetTime), "New File - Older - LocalDate,OffsetTime");
1705+
assertFalse(FileUtils.isFileOlder(newFile, localDate, localTime0), "New File - Older - LocalDate,LocalTime");
1706+
assertFalse(FileUtils.isFileOlder(newFile, localDate, offsetTime0), "New File - Older - LocalDate,OffsetTime");
17111707
assertTrue(FileUtils.isFileOlder(newFile, localDatePlusDay), "New File - Older - LocalDate plus one day");
1712-
assertTrue(FileUtils.isFileOlder(newFile, localDatePlusDay, localTime), "New File - Older - LocalDate plus one day,LocalTime");
1713-
assertTrue(FileUtils.isFileOlder(newFile, localDatePlusDay, offsetTime), "New File - Older - LocalDate plus one day,OffsetTime");
1708+
assertTrue(FileUtils.isFileOlder(newFile, localDatePlusDay, localTime0), "New File - Older - LocalDate plus one day,LocalTime");
1709+
assertTrue(FileUtils.isFileOlder(newFile, localDatePlusDay, offsetTime0), "New File - Older - LocalDate plus one day,OffsetTime");
17141710

1715-
assertFalse(FileUtils.isFileOlder(invalidFile, reference), "Invalid - Older - File");
1711+
assertFalse(FileUtils.isFileOlder(invalidFile, refFile), "Invalid - Older - File");
17161712
assertThrows(IllegalArgumentException.class, () -> FileUtils.isFileOlder(newFile, invalidFile));
17171713

1718-
// ----- Test isFileNewer() exceptions -----
17191714
// Null File
17201715
assertThrows(NullPointerException.class, () -> FileUtils.isFileNewer(null, now));
17211716

0 commit comments

Comments
 (0)