View Javadoc
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
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
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 }