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