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    *      https://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.assertTrue;
24  
25  import java.io.IOException;
26  import java.io.RandomAccessFile;
27  import java.nio.charset.StandardCharsets;
28  import java.nio.file.Files;
29  import java.nio.file.LinkOption;
30  import java.nio.file.Path;
31  import java.nio.file.StandardOpenOption;
32  
33  import org.junit.jupiter.api.Test;
34  import org.junit.jupiter.api.io.TempDir;
35  import org.junit.jupiter.params.ParameterizedTest;
36  import org.junit.jupiter.params.provider.EnumSource;
37  
38  /**
39   * Tests {@link RandomAccessFileMode}.
40   */
41  class RandomAccessFileModeTest {
42  
43      private static final byte[] BYTES_FIXTURE = "Foo".getBytes(StandardCharsets.US_ASCII);
44  
45      private static final String FIXTURE = "test.txt";
46  
47      /**
48       * Temporary directory.
49       */
50      @TempDir
51      public Path tempDir;
52  
53      private byte[] read(final RandomAccessFile randomAccessFile) throws IOException {
54          return RandomAccessFiles.read(randomAccessFile, 0, (int) randomAccessFile.length());
55      }
56  
57      @ParameterizedTest
58      @EnumSource(RandomAccessFileMode.class)
59      void testCreateFile(final RandomAccessFileMode randomAccessFileMode) throws IOException {
60          final byte[] expected = BYTES_FIXTURE;
61          final Path fixture = writeFixture(expected);
62          try (RandomAccessFile randomAccessFile = randomAccessFileMode.create(fixture.toFile())) {
63              assertArrayEquals(expected, read(randomAccessFile));
64          }
65      }
66  
67      @ParameterizedTest
68      @EnumSource(RandomAccessFileMode.class)
69      void testCreatePath(final RandomAccessFileMode randomAccessFileMode) throws IOException {
70          final byte[] expected = BYTES_FIXTURE;
71          final Path fixture = writeFixture(expected);
72          randomAccessFileMode.accept(fixture, raf -> assertArrayEquals(expected, read(raf)));
73      }
74  
75      @ParameterizedTest
76      @EnumSource(RandomAccessFileMode.class)
77      void testCreateString(final RandomAccessFileMode randomAccessFileMode) throws IOException {
78          final byte[] expected = BYTES_FIXTURE;
79          final Path fixture = writeFixture(expected);
80          try (RandomAccessFile randomAccessFile = randomAccessFileMode.create(fixture.toString())) {
81              assertArrayEquals(expected, read(randomAccessFile));
82          }
83      }
84  
85      @Test
86      void testGetMode() {
87          assertEquals("r", RandomAccessFileMode.READ_ONLY.getMode());
88          assertEquals("rw", RandomAccessFileMode.READ_WRITE.getMode());
89          assertEquals("rwd", RandomAccessFileMode.READ_WRITE_SYNC_CONTENT.getMode());
90          assertEquals("rws", RandomAccessFileMode.READ_WRITE_SYNC_ALL.getMode());
91      }
92  
93      @Test
94      void testImplies() {
95          assertTrue(RandomAccessFileMode.READ_WRITE_SYNC_ALL.implies(RandomAccessFileMode.READ_WRITE_SYNC_CONTENT));
96          assertTrue(RandomAccessFileMode.READ_WRITE_SYNC_CONTENT.implies(RandomAccessFileMode.READ_WRITE));
97          assertTrue(RandomAccessFileMode.READ_WRITE.implies(RandomAccessFileMode.READ_ONLY));
98          assertFalse(RandomAccessFileMode.READ_ONLY.implies(RandomAccessFileMode.READ_WRITE_SYNC_ALL));
99      }
100 
101     @ParameterizedTest
102     @EnumSource(RandomAccessFileMode.class)
103     void testIoString(final RandomAccessFileMode randomAccessFileMode) throws IOException {
104         final byte[] expected = BYTES_FIXTURE;
105         final Path fixture = writeFixture(expected);
106         try (IORandomAccessFile randomAccessFile = randomAccessFileMode.io(fixture.toString())) {
107             assertArrayEquals(expected, read(randomAccessFile));
108         }
109     }
110 
111     /**
112      * Tests the standard {@link Enum#toString()} behavior.
113      */
114     @Test
115     void testToString() {
116         assertEquals("READ_ONLY", RandomAccessFileMode.READ_ONLY.toString());
117         assertEquals("READ_WRITE", RandomAccessFileMode.READ_WRITE.toString());
118         assertEquals("READ_WRITE_SYNC_ALL", RandomAccessFileMode.READ_WRITE_SYNC_ALL.toString());
119         assertEquals("READ_WRITE_SYNC_CONTENT", RandomAccessFileMode.READ_WRITE_SYNC_CONTENT.toString());
120     }
121 
122     @ParameterizedTest
123     @EnumSource(LinkOption.class)
124     void testValueOf(final LinkOption option) {
125         assertTrue(RandomAccessFileMode.valueOf(option).implies(RandomAccessFileMode.READ_ONLY));
126     }
127 
128     @ParameterizedTest
129     @EnumSource(StandardOpenOption.class)
130     void testValueOf(final StandardOpenOption option) {
131         assertTrue(RandomAccessFileMode.valueOf(option).implies(RandomAccessFileMode.READ_ONLY));
132     }
133 
134     @Test
135     void testValueOfMode() {
136         assertEquals(RandomAccessFileMode.READ_ONLY, RandomAccessFileMode.valueOfMode("r"));
137         assertEquals(RandomAccessFileMode.READ_WRITE, RandomAccessFileMode.valueOfMode("rw"));
138         assertEquals(RandomAccessFileMode.READ_WRITE_SYNC_CONTENT, RandomAccessFileMode.valueOfMode("rwd"));
139         assertEquals(RandomAccessFileMode.READ_WRITE_SYNC_ALL, RandomAccessFileMode.valueOfMode("rws"));
140     }
141 
142     @Test
143     void testValueOfOpenOptions() {
144         // READ_ONLY
145         assertEquals(RandomAccessFileMode.READ_ONLY, RandomAccessFileMode.valueOf(StandardOpenOption.READ));
146         // READ_WRITE
147         assertEquals(RandomAccessFileMode.READ_WRITE, RandomAccessFileMode.valueOf(StandardOpenOption.WRITE));
148         assertEquals(RandomAccessFileMode.READ_WRITE, RandomAccessFileMode.valueOf(StandardOpenOption.READ, StandardOpenOption.WRITE));
149         // READ_WRITE_SYNC_CONTENT
150         assertEquals(RandomAccessFileMode.READ_WRITE_SYNC_CONTENT, RandomAccessFileMode.valueOf(StandardOpenOption.DSYNC));
151         assertEquals(RandomAccessFileMode.READ_WRITE_SYNC_CONTENT, RandomAccessFileMode.valueOf(StandardOpenOption.WRITE, StandardOpenOption.DSYNC));
152         assertEquals(RandomAccessFileMode.READ_WRITE_SYNC_CONTENT,
153                 RandomAccessFileMode.valueOf(StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.DSYNC));
154         // READ_WRITE_SYNC_ALL
155         assertEquals(RandomAccessFileMode.READ_WRITE_SYNC_ALL, RandomAccessFileMode.valueOf(StandardOpenOption.SYNC));
156         assertEquals(RandomAccessFileMode.READ_WRITE_SYNC_ALL, RandomAccessFileMode.valueOf(StandardOpenOption.READ, StandardOpenOption.SYNC));
157         assertEquals(RandomAccessFileMode.READ_WRITE_SYNC_ALL,
158                 RandomAccessFileMode.valueOf(StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.SYNC));
159     }
160 
161     private Path writeFixture(final byte[] bytes) throws IOException {
162         return Files.write(tempDir.resolve(FIXTURE), bytes, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
163     }
164 }