1cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal/*
2cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal * Copyright (C) 2016 The Android Open Source Project
3cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal *
4cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal * Licensed under the Apache License, Version 2.0 (the "License");
5cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal * you may not use this file except in compliance with the License.
6cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal * You may obtain a copy of the License at
7cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal *
8cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal *      http://www.apache.org/licenses/LICENSE-2.0
9cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal *
10cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal * Unless required by applicable law or agreed to in writing, software
11cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal * distributed under the License is distributed on an "AS IS" BASIS,
12cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal * See the License for the specific language governing permissions and
14cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal * limitations under the License.
15cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal */
16cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
17cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawalpackage com.android.server.wifi.util;
18cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
19cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawalimport static org.junit.Assert.assertEquals;
20cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawalimport static org.junit.Assert.assertFalse;
21cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawalimport static org.junit.Assert.assertSame;
22cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawalimport static org.junit.Assert.assertTrue;
23cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
24cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawalimport android.test.suitebuilder.annotation.SmallTest;
25cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
26cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawalimport org.junit.Test;
27cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
28cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
29cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal/**
30cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal * Unit tests for {@link com.android.server.wifi.util.ByteArrayRingBuffer}.
31cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal */
32cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal@SmallTest
33cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawalpublic class ByteArrayRingBufferTest {
34cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    private static final int MAX_BYTES = 10;
35cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
36cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    @Test
37cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    public void ctorCreatesEmptyRingBuffer() {
38cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
39cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertEquals(0, rb.getNumBuffers());
40cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    }
41cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
42cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    @Test
43cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    public void canAddAndRetrieveSingleElement() {
44cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
45cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data = {0};
46cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data));
47cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertEquals(1, rb.getNumBuffers());
48cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertSame(data, rb.getBuffer(0));
49cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    }
50cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
51cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    @Test
52cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    public void canAddAndRetrieveMultipleElements() {
53cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
54cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data1 = {0};
55cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data2 = {1};
56cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data1));
57cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data2));
58cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertEquals(2, rb.getNumBuffers());
59cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertSame(data1, rb.getBuffer(0));
60cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertSame(data2, rb.getBuffer(1));
61cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    }
62cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
63cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    @Test
64cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    public void canFillToCapacityWithMultipleElements() {
65cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
66cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data1 = {1, 2, 3, 4, 5};
67cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data2 = {6, 7, 8, 9, 10};
68cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertEquals(MAX_BYTES, data1.length + data2.length);
69cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data1));
70cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data2));
71cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertEquals(2, rb.getNumBuffers());
72cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    }
73cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
74cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    @Test
75cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    public void canFillToCapacityWithSingleElement() {
76cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
77cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
78cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertEquals(MAX_BYTES, data.length);
79cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data));
80cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    }
81cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
82cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    @Test
83cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    public void canNotOverfillWithSingleElement() {
84cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
85cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
86cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(data.length > MAX_BYTES);
87cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertFalse(rb.appendBuffer(data));
88cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertEquals(0, rb.getNumBuffers());
89cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    }
90cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
91cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    @Test
92cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    public void appendPrunesBufferIfNecessary() {
93cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
94cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
95cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data1));
96cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
97cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data2 = {11};
98cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data2));
99cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertEquals(1, rb.getNumBuffers());
100cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertSame(data2, rb.getBuffer(0));
101cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    }
102cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
103cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    @Test
104cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    public void appendPrunesMultipleBuffersIfNecessary() {
105cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
106cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data1 = {1, 2, 3, 4, 5};
107cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data2 = {6, 7, 8, 9, 10};
108cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data1));
109cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data2));
110cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
111cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data3 = {11, 12, 13, 14, 15, 16};
112cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data3));
113cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertEquals(1, rb.getNumBuffers());
114cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertSame(data3, rb.getBuffer(0));
115cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    }
116cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
117cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    @Test
118cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    public void appendPrunesOnlyWhenNecessary() {
119cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
120cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data1 = {1, 2, 3, 4, 5};
121cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data1));
122cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
123cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data2 = {6};
124cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data2));
125cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertEquals(2, rb.getNumBuffers());
126cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    }
127cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
128cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    @Test
129cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    public void appendPrunesInFifoOrder() {
130cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
131cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data1 = {1, 2, 3, 4, 5};
132cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data2 = {6, 7, 8, 9, 10};
133cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data1));
134cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data2));
135cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
136cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data3 = {11};
137cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data3));
138cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertEquals(2, rb.getNumBuffers());
139cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertSame(data2, rb.getBuffer(0));
140cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertSame(data3, rb.getBuffer(1));
141cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    }
142cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
143cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    @Test
144cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    public void appendPrunesEvenWhenNewDataCanNotFit() {
145cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
146cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
147cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertTrue(rb.appendBuffer(data1));
148cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal
149cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        final byte[] data2 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
150cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertFalse(rb.appendBuffer(data2));
151cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal        assertEquals(0, rb.getNumBuffers());
152cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal    }
153ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal
154ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    /** Verifies resizes()'s behavior when shrinking the buffer:
155ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal     *  1) Existing data is pruned.
156ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal     *  2) We really do decrease the size limit.
157ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal     */
158ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    @Test
159ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    public void resizePrunesDataAndUpdatesSizeLimitOnShrink() {
160ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
161ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        assertTrue(rb.appendBuffer(new byte[MAX_BYTES]));
162ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal
163ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        final byte newSize = 1;
164ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        rb.resize(newSize);
165ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        assertEquals(0, rb.getNumBuffers());
166ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        assertFalse(rb.appendBuffer(new byte[newSize + 1]));
167ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    }
168ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal
169ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    /** Verifies resize()'s behavior when growing the buffer:
170ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal     *  1) Existing data is retained.
171ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal     *  2) We really do increase the size limit.
172ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal     */
173ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    @Test
174ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    public void resizeRetainsExistingDataAndUpdatesSizeLimitOnGrow() {
175ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
176ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        assertTrue(rb.appendBuffer(new byte[MAX_BYTES]));
177ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        rb.resize(MAX_BYTES * 2);
178ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        assertTrue(rb.appendBuffer(new byte[MAX_BYTES]));
179ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        assertEquals(2, rb.getNumBuffers());
180ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    }
181ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal
182ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    /** Verifies that we don't crash when shrinking an empty buffer. */
183ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    @Test
184ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    public void shrinkingEmptyBufferSucceeds() {
185ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES * 2);
186ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        rb.resize(MAX_BYTES);
187ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    }
188ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal
189ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    /** Verifies that we don't crash when growing an empty buffer. */
190ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    @Test
191ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    public void growingEmptyBufferSucceeds() {
192ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        final ByteArrayRingBuffer rb = new ByteArrayRingBuffer(MAX_BYTES);
193ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal        rb.resize(MAX_BYTES * 2);
194ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal    }
195ca0bac5826ab430d1b765b201a609f7bc38401eemukesh agrawal
196cc84bc6179db408b1e45168d43e10ba0ab089fcamukesh agrawal}
197