xref: /aosp_15_r20/art/test/580-crc32/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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