From 152e4f18e8aa94cf0eae1a8b4edda04adf9993df Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Wed, 6 Nov 2024 07:37:28 -0500 Subject: [PATCH] Add Add RandomAccessFileMode.accept(Path, IOConsumer) Add Add RandomAccessFileMode.apply(Path, IOFunction) --- src/changes/changes.xml | 2 + .../commons/io/RandomAccessFileMode.java | 48 +++++ .../commons/io/build/AbstractOrigin.java | 4 +- .../io/filefilter/MagicNumberFileFilter.java | 6 +- .../commons/io/FileCleaningTrackerTest.java | 170 +++++++++--------- .../commons/io/RandomAccessFileModeTest.java | 4 +- .../commons/io/RandomAccessFilesTest.java | 93 +++++----- .../RandomAccessFileInputStreamTest.java | 3 + 8 files changed, 184 insertions(+), 146 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 75de60bac34..4b696172551 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -62,6 +62,8 @@ The type attribute can be add,update,fix,remove. Add FileAlterationObserver.Builder() and deprecate most constructors. Add IOUtils.readLines(CharSequence). Add ValidatingObjectInputStream.ObjectStreamClassPredicate to allow configuration reuse. + Add RandomAccessFileMode.accept(Path, IOConsumer<RandomAccessFile>). + Add RandomAccessFileMode.apply(Path, IOFunction<RandomAccessFile>, T). Bump org.apache.commons:commons-parent from 74 to 78 #670, #676, #679, #688. Bump commons.bytebuddy.version from 1.15.1 to 1.15.8 #672, #673, #685, #686, #694, #696. diff --git a/src/main/java/org/apache/commons/io/RandomAccessFileMode.java b/src/main/java/org/apache/commons/io/RandomAccessFileMode.java index e05f48e5e51..eeacaaa4a8e 100644 --- a/src/main/java/org/apache/commons/io/RandomAccessFileMode.java +++ b/src/main/java/org/apache/commons/io/RandomAccessFileMode.java @@ -19,12 +19,16 @@ import java.io.File; import java.io.FileNotFoundException; +import java.io.IOException; import java.io.RandomAccessFile; import java.nio.file.OpenOption; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.Objects; +import org.apache.commons.io.function.IOConsumer; +import org.apache.commons.io.function.IOFunction; + /** * Enumerates access modes for {@link RandomAccessFile} with factory methods. * @@ -147,8 +151,49 @@ public static RandomAccessFileMode valueOfMode(final String mode) { this.level = level; } + /** + * Performs an operation on the {@link RandomAccessFile} specified at the given {@link Path}. + *

+ * This method allocates and releases the {@link RandomAccessFile} given to the consumer. + *

+ * + * @param file the file specifying the {@link RandomAccessFile} to open. + * @param consumer the function to apply. + * @throws FileNotFoundException See {@link IORandomAccessFile#IORandomAccessFile(File, String)}. + * @throws IOException Thrown by the given function. + * @since 2.18.0 + */ + public void accept(final Path file, final IOConsumer consumer) throws IOException { + try (RandomAccessFile raf = create(file)) { + consumer.accept(raf); + } + } + + /** + * Applies the given function for a {@link RandomAccessFile} specified at the given {@link Path}. + *

+ * This method allocates and releases the {@link RandomAccessFile} given to the function. + *

+ * + * @param the return type of the function. + * @param file the file specifying the {@link RandomAccessFile} to open. + * @param function the function to apply. + * @return the function's result value. + * @throws FileNotFoundException See {@link IORandomAccessFile#IORandomAccessFile(File, String)}. + * @throws IOException Thrown by the given function. + * @since 2.18.0 + */ + public T apply(final Path file, final IOFunction function) throws IOException { + try (RandomAccessFile raf = create(file)) { + return function.apply(raf); + } + } + /** * Constructs a random access file to read from, and optionally to write to, the file specified by the {@link File} argument. + *

+ * Prefer {@link #create(Path)} over this. + *

* * @param file the file object * @return a random access file @@ -171,6 +216,9 @@ public RandomAccessFile create(final Path file) throws FileNotFoundException { /** * Constructs a random access file to read from, and optionally to write to, the file specified by the {@link File} argument. + *

+ * Prefer {@link #create(Path)} over this. + *

* * @param name the file object * @return a random access file diff --git a/src/main/java/org/apache/commons/io/build/AbstractOrigin.java b/src/main/java/org/apache/commons/io/build/AbstractOrigin.java index c9801d81089..c33245d3edb 100644 --- a/src/main/java/org/apache/commons/io/build/AbstractOrigin.java +++ b/src/main/java/org/apache/commons/io/build/AbstractOrigin.java @@ -413,9 +413,7 @@ public PathOrigin(final Path origin) { @Override public byte[] getByteArray(final long position, final int length) throws IOException { - try (RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(origin)) { - return RandomAccessFiles.read(raf, position, length); - } + return RandomAccessFileMode.READ_ONLY.apply(origin, raf -> RandomAccessFiles.read(raf, position, length)); } @Override diff --git a/src/main/java/org/apache/commons/io/filefilter/MagicNumberFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/MagicNumberFileFilter.java index ee95e104c67..68ea69c6da6 100644 --- a/src/main/java/org/apache/commons/io/filefilter/MagicNumberFileFilter.java +++ b/src/main/java/org/apache/commons/io/filefilter/MagicNumberFileFilter.java @@ -18,7 +18,6 @@ import java.io.File; import java.io.IOException; -import java.io.RandomAccessFile; import java.io.Serializable; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; @@ -262,8 +261,9 @@ public MagicNumberFileFilter(final String magicNumber, final long offset) { @Override public boolean accept(final File file) { if (file != null && file.isFile() && file.canRead()) { - try (RandomAccessFile randomAccessFile = RandomAccessFileMode.READ_ONLY.create(file)) { - return Arrays.equals(magicNumbers, RandomAccessFiles.read(randomAccessFile, byteOffset, magicNumbers.length)); + try { + return RandomAccessFileMode.READ_ONLY.apply(file.toPath(), + raf -> Arrays.equals(magicNumbers, RandomAccessFiles.read(raf, byteOffset, magicNumbers.length))); } catch (final IOException ignored) { // Do nothing, fall through and do not accept file } diff --git a/src/test/java/org/apache/commons/io/FileCleaningTrackerTest.java b/src/test/java/org/apache/commons/io/FileCleaningTrackerTest.java index b5074515ff5..55aa26b3006 100644 --- a/src/test/java/org/apache/commons/io/FileCleaningTrackerTest.java +++ b/src/test/java/org/apache/commons/io/FileCleaningTrackerTest.java @@ -48,7 +48,7 @@ public class FileCleaningTrackerTest extends AbstractTempDirTest { private File testFile; private Path testPath; - private FileCleaningTracker theInstance; + private FileCleaningTracker fileCleaningTracker; RandomAccessFile createRandomAccessFile() throws FileNotFoundException { return RandomAccessFileMode.READ_WRITE.create(testFile); @@ -78,14 +78,14 @@ private void pauseForDeleteToComplete(Path file) { public void setUp() { testFile = new File(tempDirFile, "file-test.txt"); testPath = testFile.toPath(); - theInstance = newInstance(); + fileCleaningTracker = newInstance(); } private String showFailures() { - if (theInstance.deleteFailures.size() == 1) { - return "[Delete Failed: " + theInstance.deleteFailures.get(0) + "]"; + if (fileCleaningTracker.deleteFailures.size() == 1) { + return "[Delete Failed: " + fileCleaningTracker.deleteFailures.get(0) + "]"; } - return "[Delete Failures: " + theInstance.deleteFailures.size() + "]"; + return "[Delete Failures: " + fileCleaningTracker.deleteFailures.size() + "]"; } @AfterEach @@ -99,16 +99,16 @@ public void tearDown() { * not. */ { - if (theInstance != null) { - theInstance.q = new ReferenceQueue<>(); - theInstance.trackers.clear(); - theInstance.deleteFailures.clear(); - theInstance.exitWhenFinished = false; - theInstance.reaper = null; + if (fileCleaningTracker != null) { + fileCleaningTracker.q = new ReferenceQueue<>(); + fileCleaningTracker.trackers.clear(); + fileCleaningTracker.deleteFailures.clear(); + fileCleaningTracker.exitWhenFinished = false; + fileCleaningTracker.reaper = null; } } - theInstance = null; + fileCleaningTracker = null; } @Test @@ -125,16 +125,16 @@ public void testFileCleanerDirectory_ForceStrategy_FileSource() throws Exception assertTrue(tempDirFile.exists()); Object obj = new Object(); - assertEquals(0, theInstance.getTrackCount()); - theInstance.track(tempDirFile, obj, FileDeleteStrategy.FORCE); - assertEquals(1, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); + fileCleaningTracker.track(tempDirFile, obj, FileDeleteStrategy.FORCE); + assertEquals(1, fileCleaningTracker.getTrackCount()); obj = null; waitUntilTrackCount(); pauseForDeleteToComplete(testFile.getParentFile()); - assertEquals(0, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); assertFalse(new File(testFile.getPath()).exists(), showFailures()); assertFalse(testFile.getParentFile().exists(), showFailures()); } @@ -153,16 +153,16 @@ public void testFileCleanerDirectory_ForceStrategy_PathSource() throws Exception assertTrue(Files.exists(tempDirPath)); Object obj = new Object(); - assertEquals(0, theInstance.getTrackCount()); - theInstance.track(tempDirPath, obj, FileDeleteStrategy.FORCE); - assertEquals(1, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); + fileCleaningTracker.track(tempDirPath, obj, FileDeleteStrategy.FORCE); + assertEquals(1, fileCleaningTracker.getTrackCount()); obj = null; waitUntilTrackCount(); pauseForDeleteToComplete(testPath.getParent()); - assertEquals(0, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); assertFalse(Files.exists(testPath), showFailures()); assertFalse(Files.exists(testPath.getParent()), showFailures()); } @@ -174,15 +174,15 @@ public void testFileCleanerDirectory_NullStrategy() throws Exception { assertTrue(tempDirFile.exists()); Object obj = new Object(); - assertEquals(0, theInstance.getTrackCount()); - theInstance.track(tempDirFile, obj, null); - assertEquals(1, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); + fileCleaningTracker.track(tempDirFile, obj, null); + assertEquals(1, fileCleaningTracker.getTrackCount()); obj = null; waitUntilTrackCount(); - assertEquals(0, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); assertTrue(testFile.exists()); // not deleted, as dir not empty assertTrue(testFile.getParentFile().exists()); // not deleted, as dir not empty } @@ -194,15 +194,15 @@ public void testFileCleanerDirectoryFileSource() throws Exception { assertTrue(tempDirFile.exists()); Object obj = new Object(); - assertEquals(0, theInstance.getTrackCount()); - theInstance.track(tempDirFile, obj); - assertEquals(1, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); + fileCleaningTracker.track(tempDirFile, obj); + assertEquals(1, fileCleaningTracker.getTrackCount()); obj = null; waitUntilTrackCount(); - assertEquals(0, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); assertTrue(testFile.exists()); // not deleted, as dir not empty assertTrue(testFile.getParentFile().exists()); // not deleted, as dir not empty } @@ -214,32 +214,32 @@ public void testFileCleanerDirectoryPathSource() throws Exception { assertTrue(Files.exists(tempDirPath)); Object obj = new Object(); - assertEquals(0, theInstance.getTrackCount()); - theInstance.track(tempDirPath, obj); - assertEquals(1, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); + fileCleaningTracker.track(tempDirPath, obj); + assertEquals(1, fileCleaningTracker.getTrackCount()); obj = null; waitUntilTrackCount(); - assertEquals(0, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); assertTrue(Files.exists(testPath)); // not deleted, as dir not empty assertTrue(Files.exists(testPath.getParent())); // not deleted, as dir not empty } @Test public void testFileCleanerExitWhenFinished_NoTrackAfter() { - assertFalse(theInstance.exitWhenFinished); - theInstance.exitWhenFinished(); - assertTrue(theInstance.exitWhenFinished); - assertNull(theInstance.reaper); + assertFalse(fileCleaningTracker.exitWhenFinished); + fileCleaningTracker.exitWhenFinished(); + assertTrue(fileCleaningTracker.exitWhenFinished); + assertNull(fileCleaningTracker.reaper); final String path = testFile.getPath(); final Object marker = new Object(); - assertThrows(IllegalStateException.class, () -> theInstance.track(path, marker)); - assertTrue(theInstance.exitWhenFinished); - assertNull(theInstance.reaper); + assertThrows(IllegalStateException.class, () -> fileCleaningTracker.track(path, marker)); + assertTrue(fileCleaningTracker.exitWhenFinished); + assertNull(fileCleaningTracker.reaper); } @Test @@ -252,16 +252,16 @@ public void testFileCleanerExitWhenFinished1() throws Exception { RandomAccessFile raf = createRandomAccessFile(); assertTrue(testFile.exists(), "2-testFile exists"); - assertEquals(0, theInstance.getTrackCount(), "3-Track Count"); - theInstance.track(path, raf); - assertEquals(1, theInstance.getTrackCount(), "4-Track Count"); - assertFalse(theInstance.exitWhenFinished, "5-exitWhenFinished"); - assertTrue(theInstance.reaper.isAlive(), "6-reaper.isAlive"); + assertEquals(0, fileCleaningTracker.getTrackCount(), "3-Track Count"); + fileCleaningTracker.track(path, raf); + assertEquals(1, fileCleaningTracker.getTrackCount(), "4-Track Count"); + assertFalse(fileCleaningTracker.exitWhenFinished, "5-exitWhenFinished"); + assertTrue(fileCleaningTracker.reaper.isAlive(), "6-reaper.isAlive"); - assertFalse(theInstance.exitWhenFinished, "7-exitWhenFinished"); - theInstance.exitWhenFinished(); - assertTrue(theInstance.exitWhenFinished, "8-exitWhenFinished"); - assertTrue(theInstance.reaper.isAlive(), "9-reaper.isAlive"); + assertFalse(fileCleaningTracker.exitWhenFinished, "7-exitWhenFinished"); + fileCleaningTracker.exitWhenFinished(); + assertTrue(fileCleaningTracker.exitWhenFinished, "8-exitWhenFinished"); + assertTrue(fileCleaningTracker.reaper.isAlive(), "9-reaper.isAlive"); raf.close(); testFile = null; @@ -270,10 +270,10 @@ public void testFileCleanerExitWhenFinished1() throws Exception { waitUntilTrackCount(); pauseForDeleteToComplete(new File(path)); - assertEquals(0, theInstance.getTrackCount(), "10-Track Count"); + assertEquals(0, fileCleaningTracker.getTrackCount(), "10-Track Count"); assertFalse(new File(path).exists(), "11-testFile exists " + showFailures()); - assertTrue(theInstance.exitWhenFinished, "12-exitWhenFinished"); - assertFalse(theInstance.reaper.isAlive(), "13-reaper.isAlive"); + assertTrue(fileCleaningTracker.exitWhenFinished, "12-exitWhenFinished"); + assertFalse(fileCleaningTracker.reaper.isAlive(), "13-reaper.isAlive"); } @Test @@ -284,11 +284,11 @@ public void testFileCleanerExitWhenFinished2() throws Exception { RandomAccessFile r = createRandomAccessFile(); assertTrue(testFile.exists()); - assertEquals(0, theInstance.getTrackCount()); - theInstance.track(path, r); - assertEquals(1, theInstance.getTrackCount()); - assertFalse(theInstance.exitWhenFinished); - assertTrue(theInstance.reaper.isAlive()); + assertEquals(0, fileCleaningTracker.getTrackCount()); + fileCleaningTracker.track(path, r); + assertEquals(1, fileCleaningTracker.getTrackCount()); + assertFalse(fileCleaningTracker.exitWhenFinished); + assertTrue(fileCleaningTracker.reaper.isAlive()); r.close(); testFile = null; @@ -297,32 +297,32 @@ public void testFileCleanerExitWhenFinished2() throws Exception { waitUntilTrackCount(); pauseForDeleteToComplete(new File(path)); - assertEquals(0, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); assertFalse(new File(path).exists(), showFailures()); - assertFalse(theInstance.exitWhenFinished); - assertTrue(theInstance.reaper.isAlive()); + assertFalse(fileCleaningTracker.exitWhenFinished); + assertTrue(fileCleaningTracker.reaper.isAlive()); - assertFalse(theInstance.exitWhenFinished); - theInstance.exitWhenFinished(); - for (int i = 0; i < 20 && theInstance.reaper.isAlive(); i++) { + assertFalse(fileCleaningTracker.exitWhenFinished); + fileCleaningTracker.exitWhenFinished(); + for (int i = 0; i < 20 && fileCleaningTracker.reaper.isAlive(); i++) { TestUtils.sleep(500L); // allow reaper thread to die } - assertTrue(theInstance.exitWhenFinished); - assertFalse(theInstance.reaper.isAlive()); + assertTrue(fileCleaningTracker.exitWhenFinished); + assertFalse(fileCleaningTracker.reaper.isAlive()); } @Test public void testFileCleanerExitWhenFinishedFirst() throws Exception { - assertFalse(theInstance.exitWhenFinished); - theInstance.exitWhenFinished(); - assertTrue(theInstance.exitWhenFinished); - assertNull(theInstance.reaper); + assertFalse(fileCleaningTracker.exitWhenFinished); + fileCleaningTracker.exitWhenFinished(); + assertTrue(fileCleaningTracker.exitWhenFinished); + assertNull(fileCleaningTracker.reaper); waitUntilTrackCount(); - assertEquals(0, theInstance.getTrackCount()); - assertTrue(theInstance.exitWhenFinished); - assertNull(theInstance.reaper); + assertEquals(0, fileCleaningTracker.getTrackCount()); + assertTrue(fileCleaningTracker.exitWhenFinished); + assertNull(fileCleaningTracker.reaper); } @Test @@ -330,40 +330,40 @@ public void testFileCleanerFile() throws Exception { final String path = testFile.getPath(); assertFalse(testFile.exists()); - RandomAccessFile r = createRandomAccessFile(); + RandomAccessFile raf = createRandomAccessFile(); assertTrue(testFile.exists()); - assertEquals(0, theInstance.getTrackCount()); - theInstance.track(path, r); - assertEquals(1, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); + fileCleaningTracker.track(path, raf); + assertEquals(1, fileCleaningTracker.getTrackCount()); - r.close(); + raf.close(); testFile = null; - r = null; + raf = null; waitUntilTrackCount(); pauseForDeleteToComplete(new File(path)); - assertEquals(0, theInstance.getTrackCount()); + assertEquals(0, fileCleaningTracker.getTrackCount()); assertFalse(new File(path).exists(), showFailures()); } @Test public void testFileCleanerNull() { - assertThrows(NullPointerException.class, () -> theInstance.track((File) null, new Object())); - assertThrows(NullPointerException.class, () -> theInstance.track((File) null, new Object(), FileDeleteStrategy.NORMAL)); - assertThrows(NullPointerException.class, () -> theInstance.track((String) null, new Object())); - assertThrows(NullPointerException.class, () -> theInstance.track((String) null, new Object(), FileDeleteStrategy.NORMAL)); + assertThrows(NullPointerException.class, () -> fileCleaningTracker.track((File) null, new Object())); + assertThrows(NullPointerException.class, () -> fileCleaningTracker.track((File) null, new Object(), FileDeleteStrategy.NORMAL)); + assertThrows(NullPointerException.class, () -> fileCleaningTracker.track((String) null, new Object())); + assertThrows(NullPointerException.class, () -> fileCleaningTracker.track((String) null, new Object(), FileDeleteStrategy.NORMAL)); } private void waitUntilTrackCount() throws Exception { System.gc(); TestUtils.sleep(500); int count = 0; - while (theInstance.getTrackCount() != 0 && count++ < 5) { + while (fileCleaningTracker.getTrackCount() != 0 && count++ < 5) { List list = new ArrayList<>(); try { long i = 0; - while (theInstance.getTrackCount() != 0) { + while (fileCleaningTracker.getTrackCount() != 0) { list.add( "A Big String A Big String A Big String A Big String A Big String A Big String A Big String A Big String A Big String A Big String " + i++); @@ -374,7 +374,7 @@ private void waitUntilTrackCount() throws Exception { System.gc(); TestUtils.sleep(1000); } - if (theInstance.getTrackCount() != 0) { + if (fileCleaningTracker.getTrackCount() != 0) { throw new IllegalStateException("Your JVM is not releasing References, try running the test with less memory (-Xmx)"); } diff --git a/src/test/java/org/apache/commons/io/RandomAccessFileModeTest.java b/src/test/java/org/apache/commons/io/RandomAccessFileModeTest.java index 394d5db9c1f..1acaa80ec06 100644 --- a/src/test/java/org/apache/commons/io/RandomAccessFileModeTest.java +++ b/src/test/java/org/apache/commons/io/RandomAccessFileModeTest.java @@ -69,9 +69,7 @@ public void testCreateFile(final RandomAccessFileMode randomAccessFileMode) thro public void testCreatePath(final RandomAccessFileMode randomAccessFileMode) throws IOException { final byte[] expected = BYTES_FIXTURE; final Path fixture = writeFixture(expected); - try (RandomAccessFile randomAccessFile = randomAccessFileMode.create(fixture)) { - assertArrayEquals(expected, read(randomAccessFile)); - } + randomAccessFileMode.accept(fixture, raf -> assertArrayEquals(expected, read(raf))); } @ParameterizedTest diff --git a/src/test/java/org/apache/commons/io/RandomAccessFilesTest.java b/src/test/java/org/apache/commons/io/RandomAccessFilesTest.java index ce7fa8fdf44..564a27af339 100644 --- a/src/test/java/org/apache/commons/io/RandomAccessFilesTest.java +++ b/src/test/java/org/apache/commons/io/RandomAccessFilesTest.java @@ -27,49 +27,54 @@ import java.io.RandomAccessFile; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Arrays; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; /** * Tests {@link RandomAccessFiles}. */ public class RandomAccessFilesTest { - private static final String FILE_NAME_RO_20 = "src/test/resources/org/apache/commons/io/test-file-20byteslength.bin"; - private static final String FILE_NAME_RO_0 = "src/test/resources/org/apache/commons/io/test-file-empty.bin"; - private static final String FILE_NAME_RO_0_BIS = "src/test/resources/org/apache/commons/io/test-file-empty2.bin"; + private static final Path PATH_RO_20 = Paths.get("src/test/resources/org/apache/commons/io/test-file-20byteslength.bin"); + private static final Path PATH_RO_0 = Paths.get("src/test/resources/org/apache/commons/io/test-file-empty.bin"); + private static final Path PATH_RO_0_BIS = Paths.get("src/test/resources/org/apache/commons/io/test-file-empty2.bin"); - @Test - public void testContentEquals() throws IOException { - try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { - assertEquals(raf1, raf1); - assertTrue(RandomAccessFiles.contentEquals(raf1, raf1)); - } + @ParameterizedTest() + @EnumSource(value = RandomAccessFileMode.class) + public void testContentEquals(final RandomAccessFileMode mode) throws IOException { + mode.accept(PATH_RO_20, raf -> { + assertEquals(raf, raf); + assertTrue(RandomAccessFiles.contentEquals(raf, raf)); + }); // as above, to make sure resources are OK - try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { - assertEquals(raf1, raf1); - assertTrue(RandomAccessFiles.contentEquals(raf1, raf1)); - } - // same 20 bytes - try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20); - RandomAccessFile raf2 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { + mode.accept(PATH_RO_20, raf -> { + assertEquals(raf, raf); + assertTrue(RandomAccessFiles.contentEquals(raf, raf)); + }); + // same 20 bytes, 2 RAFs + try (RandomAccessFile raf1 = mode.create(PATH_RO_20); + RandomAccessFile raf2 = mode.create(PATH_RO_20)) { assertTrue(RandomAccessFiles.contentEquals(raf1, raf2)); } + // as above, nested + mode.accept(PATH_RO_20, raf1 -> mode.accept(PATH_RO_20, raf2 -> assertTrue(RandomAccessFiles.contentEquals(raf1, raf2)))); // same empty file - try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_0); - RandomAccessFile raf2 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_0)) { + try (RandomAccessFile raf1 = mode.create(PATH_RO_0); + RandomAccessFile raf2 = mode.create(PATH_RO_0)) { assertTrue(RandomAccessFiles.contentEquals(raf1, raf2)); assertTrue(RandomAccessFiles.contentEquals(RandomAccessFiles.reset(raf2), RandomAccessFiles.reset(raf1))); } // diff empty file - try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_0); - RandomAccessFile raf2 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_0_BIS)) { + try (RandomAccessFile raf1 = mode.create(PATH_RO_0); + RandomAccessFile raf2 = mode.create(PATH_RO_0_BIS)) { assertTrue(RandomAccessFiles.contentEquals(raf1, raf2)); assertTrue(RandomAccessFiles.contentEquals(RandomAccessFiles.reset(raf2), RandomAccessFiles.reset(raf1))); } - try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_0); - RandomAccessFile raf2 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { + try (RandomAccessFile raf1 = mode.create(PATH_RO_0); + RandomAccessFile raf2 = mode.create(PATH_RO_20)) { assertFalse(RandomAccessFiles.contentEquals(raf1, raf2)); assertFalse(RandomAccessFiles.contentEquals(RandomAccessFiles.reset(raf2), RandomAccessFiles.reset(raf1))); } @@ -85,8 +90,8 @@ public void testContentEquals() throws IOException { Arrays.fill(bytes2, (byte) 2); Files.write(bigFile1, bytes1); Files.write(bigFile2, bytes2); - try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(bigFile1); - RandomAccessFile raf2 = RandomAccessFileMode.READ_ONLY.create(bigFile2)) { + try (RandomAccessFile raf1 = mode.create(bigFile1); + RandomAccessFile raf2 = mode.create(bigFile2)) { assertFalse(RandomAccessFiles.contentEquals(raf1, raf2)); assertFalse(RandomAccessFiles.contentEquals(RandomAccessFiles.reset(raf2), RandomAccessFiles.reset(raf1))); assertTrue(RandomAccessFiles.contentEquals(RandomAccessFiles.reset(raf1), RandomAccessFiles.reset(raf1))); @@ -95,8 +100,8 @@ public void testContentEquals() throws IOException { final byte[] bytes3 = bytes1.clone(); bytes3[bytes3.length - 1] = 9; Files.write(bigFile3, bytes3); - try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(bigFile1); - RandomAccessFile raf3 = RandomAccessFileMode.READ_ONLY.create(bigFile3)) { + try (RandomAccessFile raf1 = mode.create(bigFile1); + RandomAccessFile raf3 = mode.create(bigFile3)) { assertFalse(RandomAccessFiles.contentEquals(raf1, raf3)); assertFalse(RandomAccessFiles.contentEquals(RandomAccessFiles.reset(raf3), RandomAccessFiles.reset(raf1))); } @@ -108,30 +113,14 @@ public void testContentEquals() throws IOException { } } - @Test - public void testRead() throws IOException { - try (final RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { - final byte[] buffer = RandomAccessFiles.read(raf, 0, 0); - assertArrayEquals(new byte[] {}, buffer); - } - try (final RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { - final byte[] buffer = RandomAccessFiles.read(raf, 1, 0); - assertArrayEquals(new byte[] {}, buffer); - } - try (final RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { - final byte[] buffer = RandomAccessFiles.read(raf, 0, 1); - assertArrayEquals(new byte[] { '1' }, buffer); - } - try (final RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { - final byte[] buffer = RandomAccessFiles.read(raf, 1, 1); - assertArrayEquals(new byte[] { '2' }, buffer); - } - try (final RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { - final byte[] buffer = RandomAccessFiles.read(raf, 0, 20); - assertEquals(20, buffer.length); - } - try (final RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { - assertThrows(IOException.class, () -> RandomAccessFiles.read(raf, 0, 21)); - } + @ParameterizedTest() + @EnumSource(value = RandomAccessFileMode.class) + public void testRead(final RandomAccessFileMode mode) throws IOException { + mode.accept(PATH_RO_20, raf -> assertArrayEquals(new byte[] {}, RandomAccessFiles.read(raf, 0, 0))); + mode.accept(PATH_RO_20, raf -> assertArrayEquals(new byte[] {}, RandomAccessFiles.read(raf, 1, 0))); + mode.accept(PATH_RO_20, raf -> assertArrayEquals(new byte[] { '1' }, RandomAccessFiles.read(raf, 0, 1))); + mode.accept(PATH_RO_20, raf -> assertArrayEquals(new byte[] { '2' }, RandomAccessFiles.read(raf, 1, 1))); + mode.accept(PATH_RO_20, raf -> assertEquals(20, RandomAccessFiles.read(raf, 0, 20).length)); + mode.accept(PATH_RO_20, raf -> assertThrows(IOException.class, () -> RandomAccessFiles.read(raf, 0, 21))); } } diff --git a/src/test/java/org/apache/commons/io/input/RandomAccessFileInputStreamTest.java b/src/test/java/org/apache/commons/io/input/RandomAccessFileInputStreamTest.java index 6d28c078ab2..cd01563ad97 100644 --- a/src/test/java/org/apache/commons/io/input/RandomAccessFileInputStreamTest.java +++ b/src/test/java/org/apache/commons/io/input/RandomAccessFileInputStreamTest.java @@ -36,6 +36,9 @@ import org.apache.commons.io.RandomAccessFileMode; import org.junit.jupiter.api.Test; +/** + * Tests {@link RandomAccessFileInputStream}. + */ public class RandomAccessFileInputStreamTest { private static final String DATA_FILE_NAME = "src/test/resources/org/apache/commons/io/test-file-iso8859-1.bin";