1990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson/*
2990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * Copyright (C) 2008 The Android Open Source Project
3990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson *
4990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * you may not use this file except in compliance with the License.
6990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * You may obtain a copy of the License at
7990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson *
8990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
9990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson *
10990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * Unless required by applicable law or agreed to in writing, software
11990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * See the License for the specific language governing permissions and
14990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * limitations under the License.
15990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson */
16990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
17990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonpackage libcore.java.util.zip;
18990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
19990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonimport junit.framework.TestCase;
20990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
21990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonimport java.util.zip.Adler32;
22990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonimport java.util.zip.CRC32;
23990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
24990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson/**
25990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson * tests for CRC32 and Adler32 checksum algorithms.
26990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson */
27990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilsonpublic class OldAndroidChecksumTest extends TestCase {
28990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
29990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    public void testChecksum() throws Exception {
30990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        /*
31990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson         * Values computed experimentally, using C interfaces.
32990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson         */
33990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        adler32Test(mTestString, 0x9de210dbL);
34990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        cRC32Test(mTestString, 0x939f04afL);
35990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
36990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        // Test for issue 1016037
37990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        wrongChecksumWithAdler32Test();
38990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    }
39990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
40990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    private void adler32Test(byte[] values, long expected) {
41990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        Adler32 adler = new Adler32();
42990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
43990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        // try it all at once
44990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        adler.update(values);
45990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        assertEquals(adler.getValue(), expected);
46990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
47990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        // try resetting and computing one byte at a time
48990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        adler.reset();
49990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        for (int i = 0; i < values.length; i++) {
50990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            adler.update(values[i]);
51990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        }
52990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        assertEquals(adler.getValue(), expected);
53990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    }
54990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
55990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    private void cRC32Test(byte[] values, long expected) {
56990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        CRC32 crc = new CRC32();
57990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
58990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        // try it all at once
59990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        crc.update(values);
60990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        assertEquals(crc.getValue(), expected);
61990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
62990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        // try resetting and computing one byte at a time
63990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        crc.reset();
64990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        for (int i = 0; i < values.length; i++) {
65990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            crc.update(values[i]);
66990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        }
67990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        assertEquals(crc.getValue(), expected);
68990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    }
69990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
70990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    // "The quick brown fox jumped over the lazy dogs\n"
71990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    private static byte[] mTestString = {
72990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63,
73990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            0x6b, 0x20, 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x20,
74990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            0x66, 0x6f, 0x78, 0x20, 0x6a, 0x75, 0x6d, 0x70,
75990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20,
76990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x7a, 0x79,
77990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            0x20, 0x64, 0x6f, 0x67, 0x73, 0x2e, 0x0a
78990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    };
79990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
80990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
81990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    // Test for issue 1016037
82990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    private void wrongChecksumWithAdler32Test() {
83990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        byte[] bytes = {1, 0, 5, 0, 15, 0, 1, 11, 0, 1};
84990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        Adler32 adler = new Adler32();
85990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        adler.update(bytes);
86990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        long arrayChecksum = adler.getValue();
87990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        adler.reset();
88990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        for (int i = 0; i < bytes.length; i++) {
89990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson            adler.update(bytes[i]);
90990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        }
91990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson        assertEquals("Checksums not equal: expected: " + arrayChecksum +
92990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson                " actual: " + adler.getValue(), arrayChecksum, adler.getValue());
93990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson    }
94990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson}
95990640f1775dc6f429a5f8b9fc6cab6b4220c03aJesse Wilson
96