• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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