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  package org.apache.commons.io.input.buffer;
18  
19  import static org.junit.jupiter.api.Assertions.assertEquals;
20  import static org.junit.jupiter.api.Assertions.assertFalse;
21  import static org.junit.jupiter.api.Assertions.assertThrows;
22  import static org.junit.jupiter.api.Assertions.assertTrue;
23  
24  import java.nio.charset.StandardCharsets;
25  
26  import org.junit.jupiter.api.Test;
27  
28  /**
29   * Tests {@link CircularByteBuffer}.
30   */
31  class CircularByteBufferTest {
32  
33      @Test
34      void testAddByteSmallestBuffer() {
35          final CircularByteBuffer cbb = new CircularByteBuffer(1);
36          cbb.add((byte) 1);
37          assertEquals(1, cbb.read());
38          cbb.add((byte) 2);
39          assertEquals(2, cbb.read());
40      }
41  
42      @Test
43      void testAddInvalidOffset() {
44          final CircularByteBuffer cbb = new CircularByteBuffer();
45          assertThrows(IllegalArgumentException.class, () -> cbb.add(new byte[] { 1, 2, 3 }, -1, 3));
46      }
47  
48      @Test
49      void testAddNegativeLength() {
50          final CircularByteBuffer cbb = new CircularByteBuffer();
51          final byte[] targetBuffer = { 1, 2, 3 };
52          assertThrows(IllegalArgumentException.class, () -> cbb.add(targetBuffer, 0, -1));
53      }
54  
55      @Test
56      void testAddNullBuffer() {
57          final CircularByteBuffer cbb = new CircularByteBuffer();
58          assertThrows(NullPointerException.class, () -> cbb.add(null, 0, 3));
59      }
60  
61      /**
62       * Tests for add function with 3 arguments of type byte[], int and int.
63       */
64      @Test
65      void testAddValidData() {
66          final CircularByteBuffer cbb = new CircularByteBuffer();
67          final int length = 3;
68          cbb.add(new byte[] { 3, 6, 9 }, 0, length);
69          assertEquals(length, cbb.getCurrentNumberOfBytes());
70      }
71  
72      @Test
73      void testClear() {
74         final byte[] data = { 1, 2, 3 };
75         final CircularByteBuffer buffer = new CircularByteBuffer(10);
76         assertEquals(0, buffer.getCurrentNumberOfBytes());
77         assertFalse(buffer.hasBytes());
78  
79         buffer.add(data, 0, data.length);
80         assertEquals(3, buffer.getCurrentNumberOfBytes());
81         assertEquals(7, buffer.getSpace());
82         assertTrue(buffer.hasBytes());
83         assertTrue(buffer.hasSpace());
84  
85         buffer.clear();
86         assertEquals(0, buffer.getCurrentNumberOfBytes());
87         assertEquals(10, buffer.getSpace());
88         assertFalse(buffer.hasBytes());
89         assertTrue(buffer.hasSpace());
90      }
91  
92      @Test
93      void testHasSpace() {
94          final CircularByteBuffer cbb = new CircularByteBuffer(1);
95          assertTrue(cbb.hasSpace());
96          cbb.add((byte) 1);
97          assertFalse(cbb.hasSpace());
98          assertEquals(1, cbb.read());
99          assertTrue(cbb.hasSpace());
100         cbb.add((byte) 2);
101         assertFalse(cbb.hasSpace());
102         assertEquals(2, cbb.read());
103         assertTrue(cbb.hasSpace());
104     }
105 
106     @Test
107     void testHasSpaceInt() {
108         final CircularByteBuffer cbb = new CircularByteBuffer(1);
109         assertTrue(cbb.hasSpace(1));
110         cbb.add((byte) 1);
111         assertFalse(cbb.hasSpace(1));
112         assertEquals(1, cbb.read());
113         assertTrue(cbb.hasSpace(1));
114         cbb.add((byte) 2);
115         assertFalse(cbb.hasSpace(1));
116         assertEquals(2, cbb.read());
117         assertTrue(cbb.hasSpace(1));
118     }
119 
120     @Test
121     void testPeekWithExcessiveLength() {
122         assertFalse(new CircularByteBuffer().peek(new byte[] { 1, 3, 5, 7, 9 }, 0, 6));
123     }
124 
125     @Test
126     void testPeekWithInvalidOffset() {
127         final CircularByteBuffer cbb = new CircularByteBuffer();
128         final IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> cbb.peek(new byte[] { 2, 4, 6, 8, 10 }, -1, 5));
129         assertEquals("Illegal offset: -1", e.getMessage());
130     }
131 
132     @Test
133     void testPeekWithNegativeLength() {
134         final CircularByteBuffer cbb = new CircularByteBuffer();
135         final IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> cbb.peek(new byte[] { 1, 4, 3 }, 0, -1));
136         assertEquals("Illegal length: -1", e.getMessage());
137     }
138 
139     // Tests for peek function
140     @Test
141     void testPeekWithValidArguments() {
142         assertFalse(new CircularByteBuffer().peek(new byte[] { 5, 10, 15, 20, 25 }, 0, 5));
143     }
144 
145     @Test
146     void testReadByteArray() {
147         final CircularByteBuffer cbb = new CircularByteBuffer();
148         final String string = "0123456789";
149         final byte[] bytesIn = string.getBytes(StandardCharsets.UTF_8);
150         cbb.add(bytesIn, 0, 10);
151         final byte[] bytesOut = new byte[10];
152         cbb.read(bytesOut, 0, 10);
153         assertEquals(string, new String(bytesOut, StandardCharsets.UTF_8));
154     }
155 
156     @Test
157     void testReadByteArrayIllegalArgumentException() {
158         final CircularByteBuffer cbb = new CircularByteBuffer();
159         final byte[] bytesOut = new byte[10];
160         // targetOffset < 0
161         assertThrows(IllegalArgumentException.class, () -> cbb.read(bytesOut, -1, 10));
162         // targetOffset >= targetBuffer.length
163         assertThrows(IllegalArgumentException.class, () -> cbb.read(bytesOut, 0, bytesOut.length + 1));
164     }
165 }