1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.commons.io; 19 20 import static org.junit.jupiter.api.Assertions.assertArrayEquals; 21 import static org.junit.jupiter.api.Assertions.assertEquals; 22 import static org.junit.jupiter.api.Assertions.assertFalse; 23 import static org.junit.jupiter.api.Assertions.assertThrows; 24 import static org.junit.jupiter.api.Assertions.assertTrue; 25 26 import java.io.IOException; 27 import java.io.RandomAccessFile; 28 import java.nio.file.Files; 29 import java.nio.file.Path; 30 import java.util.Arrays; 31 32 import org.junit.jupiter.api.Test; 33 34 /** 35 * Tests {@link RandomAccessFiles}. 36 */ 37 public class RandomAccessFilesTest { 38 39 private static final String FILE_NAME_RO_20 = "src/test/resources/org/apache/commons/io/test-file-20byteslength.bin"; 40 private static final String FILE_NAME_RO_0 = "src/test/resources/org/apache/commons/io/test-file-empty.bin"; 41 private static final String FILE_NAME_RO_0_BIS = "src/test/resources/org/apache/commons/io/test-file-empty2.bin"; 42 43 @Test testContentEquals()44 public void testContentEquals() throws IOException { 45 try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { 46 assertEquals(raf1, raf1); 47 assertTrue(RandomAccessFiles.contentEquals(raf1, raf1)); 48 } 49 // as above, to make sure resources are OK 50 try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { 51 assertEquals(raf1, raf1); 52 assertTrue(RandomAccessFiles.contentEquals(raf1, raf1)); 53 } 54 // same 20 bytes 55 try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20); 56 RandomAccessFile raf2 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { 57 assertTrue(RandomAccessFiles.contentEquals(raf1, raf2)); 58 } 59 // same empty file 60 try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_0); 61 RandomAccessFile raf2 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_0)) { 62 assertTrue(RandomAccessFiles.contentEquals(raf1, raf2)); 63 assertTrue(RandomAccessFiles.contentEquals(RandomAccessFiles.reset(raf2), RandomAccessFiles.reset(raf1))); 64 } 65 // diff empty file 66 try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_0); 67 RandomAccessFile raf2 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_0_BIS)) { 68 assertTrue(RandomAccessFiles.contentEquals(raf1, raf2)); 69 assertTrue(RandomAccessFiles.contentEquals(RandomAccessFiles.reset(raf2), RandomAccessFiles.reset(raf1))); 70 } 71 try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_0); 72 RandomAccessFile raf2 = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { 73 assertFalse(RandomAccessFiles.contentEquals(raf1, raf2)); 74 assertFalse(RandomAccessFiles.contentEquals(RandomAccessFiles.reset(raf2), RandomAccessFiles.reset(raf1))); 75 } 76 // 77 final Path bigFile1 = Files.createTempFile(getClass().getSimpleName(), "-1.bin"); 78 final Path bigFile2 = Files.createTempFile(getClass().getSimpleName(), "-2.bin"); 79 final Path bigFile3 = Files.createTempFile(getClass().getSimpleName(), "-3.bin"); 80 try { 81 final int newLength = 1_000_000; 82 final byte[] bytes1 = new byte[newLength]; 83 final byte[] bytes2 = new byte[newLength]; 84 Arrays.fill(bytes1, (byte) 1); 85 Arrays.fill(bytes2, (byte) 2); 86 Files.write(bigFile1, bytes1); 87 Files.write(bigFile2, bytes2); 88 try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(bigFile1); 89 RandomAccessFile raf2 = RandomAccessFileMode.READ_ONLY.create(bigFile2)) { 90 assertFalse(RandomAccessFiles.contentEquals(raf1, raf2)); 91 assertFalse(RandomAccessFiles.contentEquals(RandomAccessFiles.reset(raf2), RandomAccessFiles.reset(raf1))); 92 assertTrue(RandomAccessFiles.contentEquals(RandomAccessFiles.reset(raf1), RandomAccessFiles.reset(raf1))); 93 } 94 // Make the last byte different 95 final byte[] bytes3 = bytes1.clone(); 96 bytes3[bytes3.length - 1] = 9; 97 Files.write(bigFile3, bytes3); 98 try (RandomAccessFile raf1 = RandomAccessFileMode.READ_ONLY.create(bigFile1); 99 RandomAccessFile raf3 = RandomAccessFileMode.READ_ONLY.create(bigFile3)) { 100 assertFalse(RandomAccessFiles.contentEquals(raf1, raf3)); 101 assertFalse(RandomAccessFiles.contentEquals(RandomAccessFiles.reset(raf3), RandomAccessFiles.reset(raf1))); 102 } 103 } finally { 104 // Delete ASAP 105 Files.deleteIfExists(bigFile1); 106 Files.deleteIfExists(bigFile2); 107 Files.deleteIfExists(bigFile3); 108 } 109 } 110 111 @Test testRead()112 public void testRead() throws IOException { 113 try (final RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { 114 final byte[] buffer = RandomAccessFiles.read(raf, 0, 0); 115 assertArrayEquals(new byte[] {}, buffer); 116 } 117 try (final RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { 118 final byte[] buffer = RandomAccessFiles.read(raf, 1, 0); 119 assertArrayEquals(new byte[] {}, buffer); 120 } 121 try (final RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { 122 final byte[] buffer = RandomAccessFiles.read(raf, 0, 1); 123 assertArrayEquals(new byte[] { '1' }, buffer); 124 } 125 try (final RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { 126 final byte[] buffer = RandomAccessFiles.read(raf, 1, 1); 127 assertArrayEquals(new byte[] { '2' }, buffer); 128 } 129 try (final RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { 130 final byte[] buffer = RandomAccessFiles.read(raf, 0, 20); 131 assertEquals(20, buffer.length); 132 } 133 try (final RandomAccessFile raf = RandomAccessFileMode.READ_ONLY.create(FILE_NAME_RO_20)) { 134 assertThrows(IOException.class, () -> RandomAccessFiles.read(raf, 0, 21)); 135 } 136 } 137 } 138