1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker import java.util.zip.CRC32; 18*795d594fSAndroid Build Coastguard Worker import java.util.Random; 19*795d594fSAndroid Build Coastguard Worker import java.nio.ByteBuffer; 20*795d594fSAndroid Build Coastguard Worker 21*795d594fSAndroid Build Coastguard Worker /** 22*795d594fSAndroid Build Coastguard Worker * The ART compiler can use intrinsics for the java.util.zip.CRC32 methods: 23*795d594fSAndroid Build Coastguard Worker * private native static int update(int crc, int b) 24*795d594fSAndroid Build Coastguard Worker * private native static int updateBytes(int crc, byte[] b, int off, int len) 25*795d594fSAndroid Build Coastguard Worker * 26*795d594fSAndroid Build Coastguard Worker * As the methods are private it is not possible to check the use of intrinsics 27*795d594fSAndroid Build Coastguard Worker * for them directly. 28*795d594fSAndroid Build Coastguard Worker * The tests check that correct checksums are produced. 29*795d594fSAndroid Build Coastguard Worker */ 30*795d594fSAndroid Build Coastguard Worker public class Main { Main()31*795d594fSAndroid Build Coastguard Worker public Main() { 32*795d594fSAndroid Build Coastguard Worker } 33*795d594fSAndroid Build Coastguard Worker CRC32Byte(int value)34*795d594fSAndroid Build Coastguard Worker public static long CRC32Byte(int value) { 35*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 36*795d594fSAndroid Build Coastguard Worker crc32.update(value); 37*795d594fSAndroid Build Coastguard Worker return crc32.getValue(); 38*795d594fSAndroid Build Coastguard Worker } 39*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(int... values)40*795d594fSAndroid Build Coastguard Worker public static long CRC32BytesUsingUpdateInt(int... values) { 41*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 42*795d594fSAndroid Build Coastguard Worker for (int value : values) { 43*795d594fSAndroid Build Coastguard Worker crc32.update(value); 44*795d594fSAndroid Build Coastguard Worker } 45*795d594fSAndroid Build Coastguard Worker return crc32.getValue(); 46*795d594fSAndroid Build Coastguard Worker } 47*795d594fSAndroid Build Coastguard Worker assertEqual(long expected, long actual)48*795d594fSAndroid Build Coastguard Worker public static void assertEqual(long expected, long actual) { 49*795d594fSAndroid Build Coastguard Worker if (expected != actual) { 50*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + actual); 51*795d594fSAndroid Build Coastguard Worker } 52*795d594fSAndroid Build Coastguard Worker } 53*795d594fSAndroid Build Coastguard Worker assertEqual(boolean expected, boolean actual)54*795d594fSAndroid Build Coastguard Worker private static void assertEqual(boolean expected, boolean actual) { 55*795d594fSAndroid Build Coastguard Worker if (expected != actual) { 56*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + actual); 57*795d594fSAndroid Build Coastguard Worker } 58*795d594fSAndroid Build Coastguard Worker } 59*795d594fSAndroid Build Coastguard Worker TestCRC32Update()60*795d594fSAndroid Build Coastguard Worker private static void TestCRC32Update() { 61*795d594fSAndroid Build Coastguard Worker // public void update(int b) 62*795d594fSAndroid Build Coastguard Worker // 63*795d594fSAndroid Build Coastguard Worker // Tests for checksums of the byte 0x0 64*795d594fSAndroid Build Coastguard Worker // Check that only the low eight bits of the argument are used. 65*795d594fSAndroid Build Coastguard Worker assertEqual(0xD202EF8DL, CRC32Byte(0x0)); 66*795d594fSAndroid Build Coastguard Worker assertEqual(0xD202EF8DL, CRC32Byte(0x0100)); 67*795d594fSAndroid Build Coastguard Worker assertEqual(0xD202EF8DL, CRC32Byte(0x010000)); 68*795d594fSAndroid Build Coastguard Worker assertEqual(0xD202EF8DL, CRC32Byte(0x01000000)); 69*795d594fSAndroid Build Coastguard Worker assertEqual(0xD202EF8DL, CRC32Byte(0xff00)); 70*795d594fSAndroid Build Coastguard Worker assertEqual(0xD202EF8DL, CRC32Byte(0xffff00)); 71*795d594fSAndroid Build Coastguard Worker assertEqual(0xD202EF8DL, CRC32Byte(0xffffff00)); 72*795d594fSAndroid Build Coastguard Worker assertEqual(0xD202EF8DL, CRC32Byte(0x1200)); 73*795d594fSAndroid Build Coastguard Worker assertEqual(0xD202EF8DL, CRC32Byte(0x123400)); 74*795d594fSAndroid Build Coastguard Worker assertEqual(0xD202EF8DL, CRC32Byte(0x12345600)); 75*795d594fSAndroid Build Coastguard Worker assertEqual(0xD202EF8DL, CRC32Byte(Integer.MIN_VALUE)); 76*795d594fSAndroid Build Coastguard Worker 77*795d594fSAndroid Build Coastguard Worker // Tests for checksums of the byte 0x1 78*795d594fSAndroid Build Coastguard Worker // Check that only the low eight bits of the argument are used. 79*795d594fSAndroid Build Coastguard Worker assertEqual(0xA505DF1BL, CRC32Byte(0x1)); 80*795d594fSAndroid Build Coastguard Worker assertEqual(0xA505DF1BL, CRC32Byte(0x0101)); 81*795d594fSAndroid Build Coastguard Worker assertEqual(0xA505DF1BL, CRC32Byte(0x010001)); 82*795d594fSAndroid Build Coastguard Worker assertEqual(0xA505DF1BL, CRC32Byte(0x01000001)); 83*795d594fSAndroid Build Coastguard Worker assertEqual(0xA505DF1BL, CRC32Byte(0xff01)); 84*795d594fSAndroid Build Coastguard Worker assertEqual(0xA505DF1BL, CRC32Byte(0xffff01)); 85*795d594fSAndroid Build Coastguard Worker assertEqual(0xA505DF1BL, CRC32Byte(0xffffff01)); 86*795d594fSAndroid Build Coastguard Worker assertEqual(0xA505DF1BL, CRC32Byte(0x1201)); 87*795d594fSAndroid Build Coastguard Worker assertEqual(0xA505DF1BL, CRC32Byte(0x123401)); 88*795d594fSAndroid Build Coastguard Worker assertEqual(0xA505DF1BL, CRC32Byte(0x12345601)); 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker // Tests for checksums of the byte 0x0f 91*795d594fSAndroid Build Coastguard Worker // Check that only the low eight bits of the argument are used. 92*795d594fSAndroid Build Coastguard Worker assertEqual(0x42BDF21CL, CRC32Byte(0x0f)); 93*795d594fSAndroid Build Coastguard Worker assertEqual(0x42BDF21CL, CRC32Byte(0x010f)); 94*795d594fSAndroid Build Coastguard Worker assertEqual(0x42BDF21CL, CRC32Byte(0x01000f)); 95*795d594fSAndroid Build Coastguard Worker assertEqual(0x42BDF21CL, CRC32Byte(0x0100000f)); 96*795d594fSAndroid Build Coastguard Worker assertEqual(0x42BDF21CL, CRC32Byte(0xff0f)); 97*795d594fSAndroid Build Coastguard Worker assertEqual(0x42BDF21CL, CRC32Byte(0xffff0f)); 98*795d594fSAndroid Build Coastguard Worker assertEqual(0x42BDF21CL, CRC32Byte(0xffffff0f)); 99*795d594fSAndroid Build Coastguard Worker assertEqual(0x42BDF21CL, CRC32Byte(0x120f)); 100*795d594fSAndroid Build Coastguard Worker assertEqual(0x42BDF21CL, CRC32Byte(0x12340f)); 101*795d594fSAndroid Build Coastguard Worker assertEqual(0x42BDF21CL, CRC32Byte(0x1234560f)); 102*795d594fSAndroid Build Coastguard Worker 103*795d594fSAndroid Build Coastguard Worker // Tests for checksums of the byte 0xff 104*795d594fSAndroid Build Coastguard Worker // Check that only the low eight bits of the argument are used. 105*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF000000L, CRC32Byte(0x00ff)); 106*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF000000L, CRC32Byte(0x01ff)); 107*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF000000L, CRC32Byte(0x0100ff)); 108*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF000000L, CRC32Byte(0x010000ff)); 109*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF000000L, CRC32Byte(0x0000ffff)); 110*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF000000L, CRC32Byte(0x00ffffff)); 111*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF000000L, CRC32Byte(0xffffffff)); 112*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF000000L, CRC32Byte(0x12ff)); 113*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF000000L, CRC32Byte(0x1234ff)); 114*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF000000L, CRC32Byte(0x123456ff)); 115*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF000000L, CRC32Byte(Integer.MAX_VALUE)); 116*795d594fSAndroid Build Coastguard Worker 117*795d594fSAndroid Build Coastguard Worker // Tests for sequences 118*795d594fSAndroid Build Coastguard Worker // Check that only the low eight bits of the values are used. 119*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF41D912L, CRC32BytesUsingUpdateInt(0, 0, 0)); 120*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF41D912L, 121*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0x0100, 0x010000, 0x01000000)); 122*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF41D912L, 123*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0xff00, 0xffff00, 0xffffff00)); 124*795d594fSAndroid Build Coastguard Worker assertEqual(0xFF41D912L, 125*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0x1200, 0x123400, 0x12345600)); 126*795d594fSAndroid Build Coastguard Worker 127*795d594fSAndroid Build Coastguard Worker assertEqual(0x909FB2F2L, CRC32BytesUsingUpdateInt(1, 1, 1)); 128*795d594fSAndroid Build Coastguard Worker assertEqual(0x909FB2F2L, 129*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0x0101, 0x010001, 0x01000001)); 130*795d594fSAndroid Build Coastguard Worker assertEqual(0x909FB2F2L, 131*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0xff01, 0xffff01, 0xffffff01)); 132*795d594fSAndroid Build Coastguard Worker assertEqual(0x909FB2F2L, 133*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0x1201, 0x123401, 0x12345601)); 134*795d594fSAndroid Build Coastguard Worker 135*795d594fSAndroid Build Coastguard Worker assertEqual(0xE33A9F71L, CRC32BytesUsingUpdateInt(0x0f, 0x0f, 0x0f)); 136*795d594fSAndroid Build Coastguard Worker assertEqual(0xE33A9F71L, 137*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0x010f, 0x01000f, 0x0100000f)); 138*795d594fSAndroid Build Coastguard Worker assertEqual(0xE33A9F71L, 139*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0xff0f, 0xffff0f, 0xffffff0f)); 140*795d594fSAndroid Build Coastguard Worker assertEqual(0xE33A9F71L, 141*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0x120f, 0x12340f, 0x1234560f)); 142*795d594fSAndroid Build Coastguard Worker 143*795d594fSAndroid Build Coastguard Worker assertEqual(0xFFFFFF00L, CRC32BytesUsingUpdateInt(0x0ff, 0x0ff, 0x0ff)); 144*795d594fSAndroid Build Coastguard Worker assertEqual(0xFFFFFF00L, 145*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0x01ff, 0x0100ff, 0x010000ff)); 146*795d594fSAndroid Build Coastguard Worker assertEqual(0xFFFFFF00L, 147*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0x00ffff, 0x00ffffff, 0xffffffff)); 148*795d594fSAndroid Build Coastguard Worker assertEqual(0xFFFFFF00L, 149*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0x12ff, 0x1234ff, 0x123456ff)); 150*795d594fSAndroid Build Coastguard Worker 151*795d594fSAndroid Build Coastguard Worker assertEqual(0xB6CC4292L, CRC32BytesUsingUpdateInt(0x01, 0x02)); 152*795d594fSAndroid Build Coastguard Worker 153*795d594fSAndroid Build Coastguard Worker assertEqual(0xB2DE047CL, 154*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0x0, -1, Integer.MIN_VALUE, Integer.MAX_VALUE)); 155*795d594fSAndroid Build Coastguard Worker } 156*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(byte[] bytes, int off, int len)157*795d594fSAndroid Build Coastguard Worker private static long CRC32ByteArray(byte[] bytes, int off, int len) { 158*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 159*795d594fSAndroid Build Coastguard Worker crc32.update(bytes, off, len); 160*795d594fSAndroid Build Coastguard Worker return crc32.getValue(); 161*795d594fSAndroid Build Coastguard Worker } 162*795d594fSAndroid Build Coastguard Worker 163*795d594fSAndroid Build Coastguard Worker // This is used to test we generate correct code for constant offsets. 164*795d594fSAndroid Build Coastguard Worker // In this case the offset is 0. CRC32ByteArray(byte[] bytes)165*795d594fSAndroid Build Coastguard Worker private static long CRC32ByteArray(byte[] bytes) { 166*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 167*795d594fSAndroid Build Coastguard Worker crc32.update(bytes); 168*795d594fSAndroid Build Coastguard Worker return crc32.getValue(); 169*795d594fSAndroid Build Coastguard Worker } 170*795d594fSAndroid Build Coastguard Worker CRC32ByteAndByteArray(int value, byte[] bytes)171*795d594fSAndroid Build Coastguard Worker private static long CRC32ByteAndByteArray(int value, byte[] bytes) { 172*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 173*795d594fSAndroid Build Coastguard Worker crc32.update(value); 174*795d594fSAndroid Build Coastguard Worker crc32.update(bytes); 175*795d594fSAndroid Build Coastguard Worker return crc32.getValue(); 176*795d594fSAndroid Build Coastguard Worker } 177*795d594fSAndroid Build Coastguard Worker CRC32ByteArrayAndByte(byte[] bytes, int value)178*795d594fSAndroid Build Coastguard Worker private static long CRC32ByteArrayAndByte(byte[] bytes, int value) { 179*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 180*795d594fSAndroid Build Coastguard Worker crc32.update(bytes); 181*795d594fSAndroid Build Coastguard Worker crc32.update(value); 182*795d594fSAndroid Build Coastguard Worker return crc32.getValue(); 183*795d594fSAndroid Build Coastguard Worker } 184*795d594fSAndroid Build Coastguard Worker CRC32ByteArrayThrowsAIOOBE(byte[] bytes, int off, int len)185*795d594fSAndroid Build Coastguard Worker private static boolean CRC32ByteArrayThrowsAIOOBE(byte[] bytes, int off, int len) { 186*795d594fSAndroid Build Coastguard Worker try { 187*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 188*795d594fSAndroid Build Coastguard Worker crc32.update(bytes, off, len); 189*795d594fSAndroid Build Coastguard Worker } catch (ArrayIndexOutOfBoundsException ex) { 190*795d594fSAndroid Build Coastguard Worker return true; 191*795d594fSAndroid Build Coastguard Worker } 192*795d594fSAndroid Build Coastguard Worker return false; 193*795d594fSAndroid Build Coastguard Worker } 194*795d594fSAndroid Build Coastguard Worker CRC32ByteArrayThrowsNPE()195*795d594fSAndroid Build Coastguard Worker private static boolean CRC32ByteArrayThrowsNPE() { 196*795d594fSAndroid Build Coastguard Worker try { 197*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 198*795d594fSAndroid Build Coastguard Worker crc32.update(null, 0, 0); 199*795d594fSAndroid Build Coastguard Worker return false; 200*795d594fSAndroid Build Coastguard Worker } catch (NullPointerException e) {} 201*795d594fSAndroid Build Coastguard Worker 202*795d594fSAndroid Build Coastguard Worker try { 203*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 204*795d594fSAndroid Build Coastguard Worker crc32.update(null, 1, 2); 205*795d594fSAndroid Build Coastguard Worker return false; 206*795d594fSAndroid Build Coastguard Worker } catch (NullPointerException e) {} 207*795d594fSAndroid Build Coastguard Worker 208*795d594fSAndroid Build Coastguard Worker try { 209*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 210*795d594fSAndroid Build Coastguard Worker crc32.update((byte[])null); 211*795d594fSAndroid Build Coastguard Worker return false; 212*795d594fSAndroid Build Coastguard Worker } catch (NullPointerException e) {} 213*795d594fSAndroid Build Coastguard Worker 214*795d594fSAndroid Build Coastguard Worker return true; 215*795d594fSAndroid Build Coastguard Worker } 216*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(byte[] bytes, int off, int len)217*795d594fSAndroid Build Coastguard Worker private static long CRC32BytesUsingUpdateInt(byte[] bytes, int off, int len) { 218*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 219*795d594fSAndroid Build Coastguard Worker while (len-- > 0) { 220*795d594fSAndroid Build Coastguard Worker crc32.update(bytes[off++]); 221*795d594fSAndroid Build Coastguard Worker } 222*795d594fSAndroid Build Coastguard Worker return crc32.getValue(); 223*795d594fSAndroid Build Coastguard Worker } 224*795d594fSAndroid Build Coastguard Worker TestCRC32UpdateBytes()225*795d594fSAndroid Build Coastguard Worker private static void TestCRC32UpdateBytes() { 226*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32ByteArray(new byte[] {})); 227*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32ByteArray(new byte[] {}, 0, 0)); 228*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32ByteArray(new byte[] {0}, 0, 0)); 229*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32ByteArray(new byte[] {0}, 1, 0)); 230*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32ByteArray(new byte[] {0, 0}, 1, 0)); 231*795d594fSAndroid Build Coastguard Worker 232*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsNPE()); 233*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {}, -1, 0)); 234*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {0}, -1, 1)); 235*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {0}, 0, -1)); 236*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {}, 0, -1)); 237*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {}, 1, 0)); 238*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {}, -1, 1)); 239*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {}, 1, -1)); 240*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {}, 0, 1)); 241*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {}, 0, 10)); 242*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {0}, 0, 10)); 243*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {}, 10, 10)); 244*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {0, 0, 0, 0}, 2, 3)); 245*795d594fSAndroid Build Coastguard Worker assertEqual(true, CRC32ByteArrayThrowsAIOOBE(new byte[] {0, 0, 0, 0}, 3, 2)); 246*795d594fSAndroid Build Coastguard Worker 247*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(0), CRC32ByteArray(new byte[] {0})); 248*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(0), CRC32ByteArray(new byte[] {0}, 0, 1)); 249*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(1), CRC32ByteArray(new byte[] {1})); 250*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(1), CRC32ByteArray(new byte[] {1}, 0, 1)); 251*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(0x0f), CRC32ByteArray(new byte[] {0x0f})); 252*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(0x0f), CRC32ByteArray(new byte[] {0x0f}, 0, 1)); 253*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(0xff), CRC32ByteArray(new byte[] {-1})); 254*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(0xff), CRC32ByteArray(new byte[] {-1}, 0, 1)); 255*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0, 0, 0), 256*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(new byte[] {0, 0, 0})); 257*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0, 0, 0), 258*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(new byte[] {0, 0, 0}, 0, 3)); 259*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 1, 1), 260*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(new byte[] {1, 1, 1})); 261*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 1, 1), 262*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(new byte[] {1, 1, 1}, 0, 3)); 263*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0x0f, 0x0f, 0x0f), 264*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(new byte[] {0x0f, 0x0f, 0x0f})); 265*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0x0f, 0x0f, 0x0f), 266*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(new byte[] {0x0f, 0x0f, 0x0f}, 0, 3)); 267*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0xff, 0xff, 0xff), 268*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(new byte[] {-1, -1, -1})); 269*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0xff, 0xff, 0xff), 270*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(new byte[] {-1, -1, -1}, 0, 3)); 271*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 2), 272*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(new byte[] {1, 2})); 273*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 2), 274*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(new byte[] {1, 2}, 0, 2)); 275*795d594fSAndroid Build Coastguard Worker assertEqual( 276*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0, -1, Byte.MIN_VALUE, Byte.MAX_VALUE), 277*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(new byte[] {0, -1, Byte.MIN_VALUE, Byte.MAX_VALUE})); 278*795d594fSAndroid Build Coastguard Worker assertEqual( 279*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0, -1, Byte.MIN_VALUE, Byte.MAX_VALUE), 280*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(new byte[] {0, -1, Byte.MIN_VALUE, Byte.MAX_VALUE}, 0, 4)); 281*795d594fSAndroid Build Coastguard Worker 282*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0, 0, 0), 283*795d594fSAndroid Build Coastguard Worker CRC32ByteAndByteArray(0, new byte[] {0, 0})); 284*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 1, 1), 285*795d594fSAndroid Build Coastguard Worker CRC32ByteAndByteArray(1, new byte[] {1, 1})); 286*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0x0f, 0x0f, 0x0f), 287*795d594fSAndroid Build Coastguard Worker CRC32ByteAndByteArray(0x0f, new byte[] {0x0f, 0x0f})); 288*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0xff, 0xff, 0xff), 289*795d594fSAndroid Build Coastguard Worker CRC32ByteAndByteArray(-1, new byte[] {-1, -1})); 290*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 2, 3), 291*795d594fSAndroid Build Coastguard Worker CRC32ByteAndByteArray(1, new byte[] {2, 3})); 292*795d594fSAndroid Build Coastguard Worker assertEqual( 293*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0, -1, Byte.MIN_VALUE, Byte.MAX_VALUE), 294*795d594fSAndroid Build Coastguard Worker CRC32ByteAndByteArray(0, new byte[] {-1, Byte.MIN_VALUE, Byte.MAX_VALUE})); 295*795d594fSAndroid Build Coastguard Worker 296*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0, 0, 0), 297*795d594fSAndroid Build Coastguard Worker CRC32ByteArrayAndByte(new byte[] {0, 0}, 0)); 298*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 1, 1), 299*795d594fSAndroid Build Coastguard Worker CRC32ByteArrayAndByte(new byte[] {1, 1}, 1)); 300*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0x0f, 0x0f, 0x0f), 301*795d594fSAndroid Build Coastguard Worker CRC32ByteArrayAndByte(new byte[] {0x0f, 0x0f}, 0x0f)); 302*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0xff, 0xff, 0xff), 303*795d594fSAndroid Build Coastguard Worker CRC32ByteArrayAndByte(new byte[] {-1, -1}, -1)); 304*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 2, 3), 305*795d594fSAndroid Build Coastguard Worker CRC32ByteArrayAndByte(new byte[] {1, 2}, 3)); 306*795d594fSAndroid Build Coastguard Worker assertEqual( 307*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0, -1, Byte.MIN_VALUE, Byte.MAX_VALUE), 308*795d594fSAndroid Build Coastguard Worker CRC32ByteArrayAndByte(new byte[] {0, -1, Byte.MIN_VALUE}, Byte.MAX_VALUE)); 309*795d594fSAndroid Build Coastguard Worker 310*795d594fSAndroid Build Coastguard Worker byte[] bytes = new byte[128 * 1024]; 311*795d594fSAndroid Build Coastguard Worker Random rnd = new Random(0); 312*795d594fSAndroid Build Coastguard Worker rnd.nextBytes(bytes); 313*795d594fSAndroid Build Coastguard Worker 314*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, bytes.length), 315*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(bytes)); 316*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, 8 * 1024), 317*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(bytes, 0, 8 * 1024)); 318*795d594fSAndroid Build Coastguard Worker 319*795d594fSAndroid Build Coastguard Worker int off = rnd.nextInt(bytes.length / 2); 320*795d594fSAndroid Build Coastguard Worker for (int len = 0; len <= 16; ++len) { 321*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, off, len), 322*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(bytes, off, len)); 323*795d594fSAndroid Build Coastguard Worker } 324*795d594fSAndroid Build Coastguard Worker 325*795d594fSAndroid Build Coastguard Worker // Check there are no issues with unaligned accesses. 326*795d594fSAndroid Build Coastguard Worker for (int o = 1; o < 8; ++o) { 327*795d594fSAndroid Build Coastguard Worker for (int l = 0; l <= 16; ++l) { 328*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, o, l), 329*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(bytes, o, l)); 330*795d594fSAndroid Build Coastguard Worker } 331*795d594fSAndroid Build Coastguard Worker } 332*795d594fSAndroid Build Coastguard Worker 333*795d594fSAndroid Build Coastguard Worker int len = bytes.length / 2; 334*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, len - 1), 335*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(bytes, 0, len - 1)); 336*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, len), 337*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(bytes, 0, len)); 338*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, len + 1), 339*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(bytes, 0, len + 1)); 340*795d594fSAndroid Build Coastguard Worker 341*795d594fSAndroid Build Coastguard Worker len = rnd.nextInt(bytes.length + 1); 342*795d594fSAndroid Build Coastguard Worker off = rnd.nextInt(bytes.length - len); 343*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, off, len), 344*795d594fSAndroid Build Coastguard Worker CRC32ByteArray(bytes, off, len)); 345*795d594fSAndroid Build Coastguard Worker } 346*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(byte[] bytes, int off, int len)347*795d594fSAndroid Build Coastguard Worker private static long CRC32ByteBuffer(byte[] bytes, int off, int len) { 348*795d594fSAndroid Build Coastguard Worker ByteBuffer buf = ByteBuffer.wrap(bytes, 0, off + len); 349*795d594fSAndroid Build Coastguard Worker buf.position(off); 350*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 351*795d594fSAndroid Build Coastguard Worker crc32.update(buf); 352*795d594fSAndroid Build Coastguard Worker return crc32.getValue(); 353*795d594fSAndroid Build Coastguard Worker } 354*795d594fSAndroid Build Coastguard Worker TestCRC32UpdateByteBuffer()355*795d594fSAndroid Build Coastguard Worker private static void TestCRC32UpdateByteBuffer() { 356*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32ByteBuffer(new byte[] {}, 0, 0)); 357*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32ByteBuffer(new byte[] {0}, 0, 0)); 358*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32ByteBuffer(new byte[] {0}, 1, 0)); 359*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32ByteBuffer(new byte[] {0, 0}, 1, 0)); 360*795d594fSAndroid Build Coastguard Worker 361*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(0), CRC32ByteBuffer(new byte[] {0}, 0, 1)); 362*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(1), CRC32ByteBuffer(new byte[] {1}, 0, 1)); 363*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(0x0f), CRC32ByteBuffer(new byte[] {0x0f}, 0, 1)); 364*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(0xff), CRC32ByteBuffer(new byte[] {-1}, 0, 1)); 365*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0, 0, 0), 366*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(new byte[] {0, 0, 0}, 0, 3)); 367*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 1, 1), 368*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(new byte[] {1, 1, 1}, 0, 3)); 369*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0x0f, 0x0f, 0x0f), 370*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(new byte[] {0x0f, 0x0f, 0x0f}, 0, 3)); 371*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0xff, 0xff, 0xff), 372*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(new byte[] {-1, -1, -1}, 0, 3)); 373*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 2), 374*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(new byte[] {1, 2}, 0, 2)); 375*795d594fSAndroid Build Coastguard Worker assertEqual( 376*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0, -1, Byte.MIN_VALUE, Byte.MAX_VALUE), 377*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(new byte[] {0, -1, Byte.MIN_VALUE, Byte.MAX_VALUE}, 0, 4)); 378*795d594fSAndroid Build Coastguard Worker 379*795d594fSAndroid Build Coastguard Worker byte[] bytes = new byte[128 * 1024]; 380*795d594fSAndroid Build Coastguard Worker Random rnd = new Random(0); 381*795d594fSAndroid Build Coastguard Worker rnd.nextBytes(bytes); 382*795d594fSAndroid Build Coastguard Worker 383*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, 8 * 1024), 384*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(bytes, 0, 8 * 1024)); 385*795d594fSAndroid Build Coastguard Worker 386*795d594fSAndroid Build Coastguard Worker int off = rnd.nextInt(bytes.length / 2); 387*795d594fSAndroid Build Coastguard Worker for (int len = 0; len <= 16; ++len) { 388*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, off, len), 389*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(bytes, off, len)); 390*795d594fSAndroid Build Coastguard Worker } 391*795d594fSAndroid Build Coastguard Worker 392*795d594fSAndroid Build Coastguard Worker // Check there are no issues with unaligned accesses. 393*795d594fSAndroid Build Coastguard Worker for (int o = 1; o < 8; ++o) { 394*795d594fSAndroid Build Coastguard Worker for (int l = 0; l <= 16; ++l) { 395*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, o, l), 396*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(bytes, o, l)); 397*795d594fSAndroid Build Coastguard Worker } 398*795d594fSAndroid Build Coastguard Worker } 399*795d594fSAndroid Build Coastguard Worker 400*795d594fSAndroid Build Coastguard Worker int len = bytes.length / 2; 401*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, len - 1), 402*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(bytes, 0, len - 1)); 403*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, len), 404*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(bytes, 0, len)); 405*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, len + 1), 406*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(bytes, 0, len + 1)); 407*795d594fSAndroid Build Coastguard Worker 408*795d594fSAndroid Build Coastguard Worker len = rnd.nextInt(bytes.length + 1); 409*795d594fSAndroid Build Coastguard Worker off = rnd.nextInt(bytes.length - len); 410*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, off, len), 411*795d594fSAndroid Build Coastguard Worker CRC32ByteBuffer(bytes, off, len)); 412*795d594fSAndroid Build Coastguard Worker } 413*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(byte[] bytes, int off, int len)414*795d594fSAndroid Build Coastguard Worker private static long CRC32DirectByteBuffer(byte[] bytes, int off, int len) { 415*795d594fSAndroid Build Coastguard Worker final int total_len = off + len; 416*795d594fSAndroid Build Coastguard Worker ByteBuffer buf = ByteBuffer.allocateDirect(total_len).put(bytes, 0, total_len); 417*795d594fSAndroid Build Coastguard Worker buf.position(off); 418*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 419*795d594fSAndroid Build Coastguard Worker crc32.update(buf); 420*795d594fSAndroid Build Coastguard Worker return crc32.getValue(); 421*795d594fSAndroid Build Coastguard Worker } 422*795d594fSAndroid Build Coastguard Worker CRC32ByteAndDirectByteBuffer(int value, byte[] bytes)423*795d594fSAndroid Build Coastguard Worker private static long CRC32ByteAndDirectByteBuffer(int value, byte[] bytes) { 424*795d594fSAndroid Build Coastguard Worker ByteBuffer buf = ByteBuffer.allocateDirect(bytes.length).put(bytes); 425*795d594fSAndroid Build Coastguard Worker buf.position(0); 426*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 427*795d594fSAndroid Build Coastguard Worker crc32.update(value); 428*795d594fSAndroid Build Coastguard Worker crc32.update(buf); 429*795d594fSAndroid Build Coastguard Worker return crc32.getValue(); 430*795d594fSAndroid Build Coastguard Worker } 431*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBufferAndByte(byte[] bytes, int value)432*795d594fSAndroid Build Coastguard Worker private static long CRC32DirectByteBufferAndByte(byte[] bytes, int value) { 433*795d594fSAndroid Build Coastguard Worker ByteBuffer buf = ByteBuffer.allocateDirect(bytes.length).put(bytes); 434*795d594fSAndroid Build Coastguard Worker buf.position(0); 435*795d594fSAndroid Build Coastguard Worker CRC32 crc32 = new CRC32(); 436*795d594fSAndroid Build Coastguard Worker crc32.update(buf); 437*795d594fSAndroid Build Coastguard Worker crc32.update(value); 438*795d594fSAndroid Build Coastguard Worker return crc32.getValue(); 439*795d594fSAndroid Build Coastguard Worker } 440*795d594fSAndroid Build Coastguard Worker TestCRC32UpdateDirectByteBuffer()441*795d594fSAndroid Build Coastguard Worker private static void TestCRC32UpdateDirectByteBuffer() { 442*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32DirectByteBuffer(new byte[] {}, 0, 0)); 443*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32DirectByteBuffer(new byte[] {0}, 0, 0)); 444*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32DirectByteBuffer(new byte[] {0}, 1, 0)); 445*795d594fSAndroid Build Coastguard Worker assertEqual(0L, CRC32DirectByteBuffer(new byte[] {0, 0}, 1, 0)); 446*795d594fSAndroid Build Coastguard Worker 447*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(0), CRC32DirectByteBuffer(new byte[] {0}, 0, 1)); 448*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(1), CRC32DirectByteBuffer(new byte[] {1}, 0, 1)); 449*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(0x0f), CRC32DirectByteBuffer(new byte[] {0x0f}, 0, 1)); 450*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32Byte(0xff), CRC32DirectByteBuffer(new byte[] {-1}, 0, 1)); 451*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0, 0, 0), 452*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(new byte[] {0, 0, 0}, 0, 3)); 453*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 1, 1), 454*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(new byte[] {1, 1, 1}, 0, 3)); 455*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0x0f, 0x0f, 0x0f), 456*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(new byte[] {0x0f, 0x0f, 0x0f}, 0, 3)); 457*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0xff, 0xff, 0xff), 458*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(new byte[] {-1, -1, -1}, 0, 3)); 459*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 2), 460*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(new byte[] {1, 2}, 0, 2)); 461*795d594fSAndroid Build Coastguard Worker assertEqual( 462*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0, -1, Byte.MIN_VALUE, Byte.MAX_VALUE), 463*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(new byte[] {0, -1, Byte.MIN_VALUE, Byte.MAX_VALUE}, 0, 4)); 464*795d594fSAndroid Build Coastguard Worker 465*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0, 0, 0), 466*795d594fSAndroid Build Coastguard Worker CRC32ByteAndDirectByteBuffer(0, new byte[] {0, 0})); 467*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 1, 1), 468*795d594fSAndroid Build Coastguard Worker CRC32ByteAndDirectByteBuffer(1, new byte[] {1, 1})); 469*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0x0f, 0x0f, 0x0f), 470*795d594fSAndroid Build Coastguard Worker CRC32ByteAndDirectByteBuffer(0x0f, new byte[] {0x0f, 0x0f})); 471*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0xff, 0xff, 0xff), 472*795d594fSAndroid Build Coastguard Worker CRC32ByteAndDirectByteBuffer(-1, new byte[] {-1, -1})); 473*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 2, 3), 474*795d594fSAndroid Build Coastguard Worker CRC32ByteAndDirectByteBuffer(1, new byte[] {2, 3})); 475*795d594fSAndroid Build Coastguard Worker assertEqual( 476*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0, -1, Byte.MIN_VALUE, Byte.MAX_VALUE), 477*795d594fSAndroid Build Coastguard Worker CRC32ByteAndDirectByteBuffer(0, new byte[] {-1, Byte.MIN_VALUE, Byte.MAX_VALUE})); 478*795d594fSAndroid Build Coastguard Worker 479*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0, 0, 0), 480*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBufferAndByte(new byte[] {0, 0}, 0)); 481*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 1, 1), 482*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBufferAndByte(new byte[] {1, 1}, 1)); 483*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0x0f, 0x0f, 0x0f), 484*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBufferAndByte(new byte[] {0x0f, 0x0f}, 0x0f)); 485*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(0xff, 0xff, 0xff), 486*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBufferAndByte(new byte[] {-1, -1}, -1)); 487*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(1, 2, 3), 488*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBufferAndByte(new byte[] {1, 2}, 3)); 489*795d594fSAndroid Build Coastguard Worker assertEqual( 490*795d594fSAndroid Build Coastguard Worker CRC32BytesUsingUpdateInt(0, -1, Byte.MIN_VALUE, Byte.MAX_VALUE), 491*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBufferAndByte(new byte[] {0, -1, Byte.MIN_VALUE}, Byte.MAX_VALUE)); 492*795d594fSAndroid Build Coastguard Worker 493*795d594fSAndroid Build Coastguard Worker byte[] bytes = new byte[128 * 1024]; 494*795d594fSAndroid Build Coastguard Worker Random rnd = new Random(0); 495*795d594fSAndroid Build Coastguard Worker rnd.nextBytes(bytes); 496*795d594fSAndroid Build Coastguard Worker 497*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, bytes.length), 498*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(bytes, 0, bytes.length)); 499*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, 8 * 1024), 500*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(bytes, 0, 8 * 1024)); 501*795d594fSAndroid Build Coastguard Worker 502*795d594fSAndroid Build Coastguard Worker int off = rnd.nextInt(bytes.length / 2); 503*795d594fSAndroid Build Coastguard Worker for (int len = 0; len <= 16; ++len) { 504*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, off, len), 505*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(bytes, off, len)); 506*795d594fSAndroid Build Coastguard Worker } 507*795d594fSAndroid Build Coastguard Worker 508*795d594fSAndroid Build Coastguard Worker // Check there are no issues with unaligned accesses. 509*795d594fSAndroid Build Coastguard Worker for (int o = 1; o < 8; ++o) { 510*795d594fSAndroid Build Coastguard Worker for (int l = 0; l <= 16; ++l) { 511*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, o, l), 512*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(bytes, o, l)); 513*795d594fSAndroid Build Coastguard Worker } 514*795d594fSAndroid Build Coastguard Worker } 515*795d594fSAndroid Build Coastguard Worker 516*795d594fSAndroid Build Coastguard Worker int len = bytes.length / 2; 517*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, len - 1), 518*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(bytes, 0, len - 1)); 519*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, len), 520*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(bytes, 0, len)); 521*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, 0, len + 1), 522*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(bytes, 0, len + 1)); 523*795d594fSAndroid Build Coastguard Worker 524*795d594fSAndroid Build Coastguard Worker len = rnd.nextInt(bytes.length + 1); 525*795d594fSAndroid Build Coastguard Worker off = rnd.nextInt(bytes.length - len); 526*795d594fSAndroid Build Coastguard Worker assertEqual(CRC32BytesUsingUpdateInt(bytes, off, len), 527*795d594fSAndroid Build Coastguard Worker CRC32DirectByteBuffer(bytes, off, len)); 528*795d594fSAndroid Build Coastguard Worker } 529*795d594fSAndroid Build Coastguard Worker main(String args[])530*795d594fSAndroid Build Coastguard Worker public static void main(String args[]) { 531*795d594fSAndroid Build Coastguard Worker TestCRC32Update(); 532*795d594fSAndroid Build Coastguard Worker TestCRC32UpdateBytes(); 533*795d594fSAndroid Build Coastguard Worker TestCRC32UpdateByteBuffer(); 534*795d594fSAndroid Build Coastguard Worker TestCRC32UpdateDirectByteBuffer(); 535*795d594fSAndroid Build Coastguard Worker } 536*795d594fSAndroid Build Coastguard Worker } 537