183917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink/* 283917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * Copyright (C) 2006 The Android Open Source Project 383917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * 483917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * Licensed under the Apache License, Version 2.0 (the "License"); 583917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * you may not use this file except in compliance with the License. 683917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * You may obtain a copy of the License at 783917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * 883917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * http://www.apache.org/licenses/LICENSE-2.0 983917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * 1083917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * Unless required by applicable law or agreed to in writing, software 1183917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * distributed under the License is distributed on an "AS IS" BASIS, 1283917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1383917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * See the License for the specific language governing permissions and 1483917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink * limitations under the License. 1583917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink */ 1683917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink 171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage com.android.internal.util; 1883917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink 1983917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalinkimport com.android.internal.util.BitwiseInputStream; 2083917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalinkimport com.android.internal.util.BitwiseOutputStream; 2183917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalinkimport com.android.internal.util.HexDump; 2283917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink 2383917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalinkimport android.test.AndroidTestCase; 2483917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalinkimport android.test.suitebuilder.annotation.SmallTest; 2583917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink 26e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalinkimport android.util.Log; 27e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink 28326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalinkimport java.util.Random; 29326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink 3083917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalinkpublic class BitwiseStreamsTest extends AndroidTestCase { 3183917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink private final static String LOG_TAG = "BitwiseStreamsTest"; 3283917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink 3383917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink @SmallTest 3483917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink public void testOne() throws Exception { 3583917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink int offset = 3; 3683917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink byte[] inBuf = HexDump.hexStringToByteArray("FFDD"); 3783917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink BitwiseOutputStream outStream = new BitwiseOutputStream(30); 3883917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink outStream.skip(offset); 3983917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink for (int i = 0; i < inBuf.length; i++) outStream.write(8, inBuf[i]); 4083917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink byte[] outBuf = outStream.toByteArray(); 4183917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink BitwiseInputStream inStream = new BitwiseInputStream(outBuf); 4283917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink byte[] inBufDup = new byte[inBuf.length]; 4383917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink inStream.skip(offset); 44326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink for (int i = 0; i < inBufDup.length; i++) inBufDup[i] = (byte)inStream.read(8); 4583917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink assertEquals(HexDump.toHexString(inBuf), HexDump.toHexString(inBufDup)); 4683917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink } 4783917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink 4883917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink @SmallTest 4983917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink public void testTwo() throws Exception { 5083917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink int offset = 3; 5183917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink byte[] inBuf = HexDump.hexStringToByteArray("11d4f29c0e9ad3c36e72584e064d9b53"); 5283917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink BitwiseOutputStream outStream = new BitwiseOutputStream(30); 5383917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink outStream.skip(offset); 5483917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink for (int i = 0; i < inBuf.length; i++) outStream.write(8, inBuf[i]); 5583917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink BitwiseInputStream inStream = new BitwiseInputStream(outStream.toByteArray()); 5683917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink inStream.skip(offset); 5783917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink byte[] inBufDup = new byte[inBuf.length]; 58326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink for (int i = 0; i < inBufDup.length; i++) inBufDup[i] = (byte)inStream.read(8); 5983917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink assertEquals(HexDump.toHexString(inBuf), HexDump.toHexString(inBufDup)); 6083917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink } 6183917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink 6283917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink @SmallTest 6383917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink public void testThree() throws Exception { 6483917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink int offset = 4; 6583917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink byte[] inBuf = HexDump.hexStringToByteArray("00031040900112488ea794e0"); 6683917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink BitwiseOutputStream outStream = new BitwiseOutputStream(30); 6783917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink outStream.skip(offset); 6883917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink for (int i = 0; i < inBuf.length; i++) outStream.write(8, inBuf[i]); 6983917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink BitwiseInputStream inStream = new BitwiseInputStream(outStream.toByteArray()); 7083917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink inStream.skip(offset); 7183917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink byte[] inBufDup = new byte[inBuf.length]; 72326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink for (int i = 0; i < inBufDup.length; i++) inBufDup[i] = (byte)inStream.read(8); 7383917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink assertEquals(HexDump.toHexString(inBuf), HexDump.toHexString(inBufDup)); 7483917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink } 7583917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink 7683917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink @SmallTest 7783917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink public void testFour() throws Exception { 7883917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink int offset = 7; 7983917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink byte[] inBuf = HexDump.hexStringToByteArray("00031040900112488ea794e0"); 8083917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink BitwiseOutputStream outStream = new BitwiseOutputStream(30); 8183917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink outStream.skip(offset); 8283917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink for (int i = 0; i < inBuf.length; i++) { 8383917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink outStream.write(5, inBuf[i] >>> 3); 8483917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink outStream.write(3, inBuf[i] & 0x07); 8583917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink } 8683917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink BitwiseInputStream inStream = new BitwiseInputStream(outStream.toByteArray()); 8783917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink inStream.skip(offset); 8883917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink byte[] inBufDup = new byte[inBuf.length]; 89326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink for (int i = 0; i < inBufDup.length; i++) inBufDup[i] = (byte)inStream.read(8); 9083917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink assertEquals(HexDump.toHexString(inBuf), HexDump.toHexString(inBufDup)); 9183917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink } 92e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink 93e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink @SmallTest 94e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink public void testFive() throws Exception { 95326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink Random random = new Random(); 96326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink int iterations = 10000; 97326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink int[] sizeArr = new int[iterations]; 98326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink int[] valueArr = new int[iterations]; 99326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink BitwiseOutputStream outStream = new BitwiseOutputStream(iterations * 4); 100326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink for (int i = 0; i < iterations; i++) { 101326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink int x = random.nextInt(); 102326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink int size = (x & 0x07) + 1; 103326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink int value = x & (-1 >>> (32 - size)); 104326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink sizeArr[i] = size; 105326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink valueArr[i] = value; 106326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink outStream.write(size, value); 107326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink } 108326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink BitwiseInputStream inStream = new BitwiseInputStream(outStream.toByteArray()); 109326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink for (int i = 0; i < iterations; i++) { 110326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink assertEquals(valueArr[i], inStream.read(sizeArr[i])); 111326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink } 112326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink } 113326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink 114326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink @SmallTest 115326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink public void testSix() throws Exception { 116e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink int num_runs = 10; 117e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink long start = android.os.SystemClock.elapsedRealtime(); 118e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink for (int run = 0; run < num_runs; run++) { 119e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink int offset = run % 8; 120e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink byte[] inBuf = HexDump.hexStringToByteArray("00031040900112488ea794e0"); 121e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink BitwiseOutputStream outStream = new BitwiseOutputStream(30); 122e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink outStream.skip(offset); 123e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink for (int i = 0; i < inBuf.length; i++) { 124e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink outStream.write(5, inBuf[i] >>> 3); 125e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink outStream.write(3, inBuf[i] & 0x07); 126e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink } 127e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink BitwiseInputStream inStream = new BitwiseInputStream(outStream.toByteArray()); 128e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink inStream.skip(offset); 129e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink byte[] inBufDup = new byte[inBuf.length]; 130326c66d888f9b3ce82af93fe63e4828a4a4e3fbeTammo Spalink for (int i = 0; i < inBufDup.length; i++) inBufDup[i] = (byte)inStream.read(8); 131e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink assertEquals(HexDump.toHexString(inBuf), HexDump.toHexString(inBufDup)); 132e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink } 133e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink long end = android.os.SystemClock.elapsedRealtime(); 134e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink Log.d(LOG_TAG, "repeated encode-decode took " + (end - start) + " ms"); 135e564b19ed2f6b8b5667648254bc6c6859bb536e7Tammo Spalink } 1363e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby 1373e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby @SmallTest 1383e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby public void testExpandArray() throws Exception { 1393e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby Random random = new Random(); 1403e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby int iterations = 10000; 1413e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby int[] sizeArr = new int[iterations]; 1423e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby int[] valueArr = new int[iterations]; 1433e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby BitwiseOutputStream outStream = new BitwiseOutputStream(8); 1443e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby for (int i = 0; i < iterations; i++) { 1453e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby int x = random.nextInt(); 1463e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby int size = (x & 0x07) + 1; 1473e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby int value = x & (-1 >>> (32 - size)); 1483e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby sizeArr[i] = size; 1493e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby valueArr[i] = value; 1503e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby outStream.write(size, value); 1513e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby } 1523e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby BitwiseInputStream inStream = new BitwiseInputStream(outStream.toByteArray()); 1533e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby for (int i = 0; i < iterations; i++) { 1543e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby assertEquals(valueArr[i], inStream.read(sizeArr[i])); 1553e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby } 1563e3c3f80a90b156ff500076f8655647dfb317acfJake Hamby } 15783917db040bd7498ebca3b74f879dc1c9e223d8eTammo Spalink} 158