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