1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.core;
18
19import junit.framework.TestCase;
20
21import java.util.zip.Adler32;
22import java.util.zip.CRC32;
23import android.test.suitebuilder.annotation.SmallTest;
24
25/**
26 * tests for CRC32 and Adler32 checksum algorithms.
27 */
28public class ChecksumTest extends TestCase {
29
30    @SmallTest
31    public void testChecksum() throws Exception {
32        /*
33         * Values computed experimentally, using C interfaces.
34         */
35        adler32Test(mTestString, 0x9de210dbL);
36        cRC32Test(mTestString, 0x939f04afL);
37
38        // Test for issue 1016037
39        wrongChecksumWithAdler32Test();
40    }
41
42    private void adler32Test(byte[] values, long expected) {
43        Adler32 adler = new Adler32();
44
45        // try it all at once
46        adler.update(values);
47        assertEquals(adler.getValue(), expected);
48
49        // try resetting and computing one byte at a time
50        adler.reset();
51        for (int i = 0; i < values.length; i++) {
52            adler.update(values[i]);
53        }
54        assertEquals(adler.getValue(), expected);
55    }
56
57    private void cRC32Test(byte[] values, long expected) {
58        CRC32 crc = new CRC32();
59
60        // try it all at once
61        crc.update(values);
62        assertEquals(crc.getValue(), expected);
63
64        // try resetting and computing one byte at a time
65        crc.reset();
66        for (int i = 0; i < values.length; i++) {
67            crc.update(values[i]);
68        }
69        assertEquals(crc.getValue(), expected);
70    }
71
72    // "The quick brown fox jumped over the lazy dogs\n"
73    private static byte[] mTestString = {
74            0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
75            0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
76            0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
77            0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20,
78            0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79,
79            0x20, 0x64, 0x6f, 0x67, 0x73, 0x2e, 0x0a
80    };
81
82
83    // Test for issue 1016037
84    private void wrongChecksumWithAdler32Test() {
85        byte[] bytes = {1, 0, 5, 0, 15, 0, 1, 11, 0, 1};
86        Adler32 adler = new Adler32();
87        adler.update(bytes);
88        long arrayChecksum = adler.getValue();
89        adler.reset();
90        for (int i = 0; i < bytes.length; i++) {
91            adler.update(bytes[i]);
92        }
93        assertEquals("Checksums not equal: expected: " + arrayChecksum +
94                " actual: " + adler.getValue(), arrayChecksum, adler.getValue());
95    }
96}
97
98