1cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson/*
2cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson * Copyright (C) 2010 The Android Open Source Project
3cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson *
4cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson * you may not use this file except in compliance with the License.
6cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson * You may obtain a copy of the License at
7cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson *
8cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
9cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson *
10cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson * Unless required by applicable law or agreed to in writing, software
11cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson * See the License for the specific language governing permissions and
14cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson * limitations under the License.
15cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson */
16cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson
174557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonpackage libcore.java.util.zip;
18cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson
194557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.util.zip.DataFormatException;
204557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.util.zip.Deflater;
214557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.util.zip.Inflater;
2227604018f783bf6354a13870b3e7785edca69b5fPaul Duffinimport libcore.junit.junit3.TestCaseWithRules;
2327604018f783bf6354a13870b3e7785edca69b5fPaul Duffinimport libcore.junit.util.ResourceLeakageDetector;
2427604018f783bf6354a13870b3e7785edca69b5fPaul Duffinimport org.junit.Rule;
2527604018f783bf6354a13870b3e7785edca69b5fPaul Duffinimport org.junit.rules.TestRule;
26cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson
2727604018f783bf6354a13870b3e7785edca69b5fPaul Duffinpublic class DeflaterTest extends TestCaseWithRules {
2827604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    @Rule
2927604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    public TestRule resourceLeakageDetectorRule = ResourceLeakageDetector.getRule();
30cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson
31cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson    private byte[] compressed = new byte[32];
32cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson    private byte[] decompressed = new byte[20];
3327604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    private Deflater deflater;
3427604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    private Inflater inflater;
35cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson    private int totalDeflated = 0;
36cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson    private int totalInflated = 0;
37cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson
3827604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    @Override
3927604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    protected void setUp() throws Exception {
4027604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        super.setUp();
4127604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        deflater = new Deflater();
4227604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        inflater = new Inflater();
4327604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    }
4427604018f783bf6354a13870b3e7785edca69b5fPaul Duffin
4527604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    @Override
4627604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    protected void tearDown() throws Exception {
4727604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        deflater.end();
4827604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        inflater.end();
4927604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        super.tearDown();
5027604018f783bf6354a13870b3e7785edca69b5fPaul Duffin    }
5127604018f783bf6354a13870b3e7785edca69b5fPaul Duffin
52cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson    public void testDeflate() throws DataFormatException {
53cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        deflater.setInput(new byte[] { 1, 2, 3 });
54cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        deflateInflate(Deflater.NO_FLUSH);
55cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        assertTrue(totalInflated < 3);
56cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        assertEquals(0, decompressed[2]); // the 3rd byte shouldn't have been flushed yet
57cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson
58cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        deflater.setInput(new byte[] { 4, 5, 6 });
59cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        deflateInflate(Deflater.SYNC_FLUSH);
60cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        assertEquals(6, totalInflated);
61cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        assertDecompressed(1, 2, 3, 4, 5, 6);
62cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        assertEquals(0, inflater.inflate(decompressed));
63cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson
64cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        deflater.setInput(new byte[] { 7, 8, 9 });
65cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        deflateInflate(Deflater.FULL_FLUSH);
66cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        assertEquals(9, totalInflated);
67cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        assertDecompressed(1, 2, 3, 4, 5, 6, 7, 8, 9);
68cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        assertEquals(0, inflater.inflate(decompressed));
6927604018f783bf6354a13870b3e7785edca69b5fPaul Duffin
7027604018f783bf6354a13870b3e7785edca69b5fPaul Duffin        inflater.end();
71cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        inflater = new Inflater(true); // safe because we did a FULL_FLUSH
72cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson
73cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        deflater.setInput(new byte[] { 10, 11, 12 });
74cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        deflateInflate(Deflater.SYNC_FLUSH);
75cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        assertEquals(12, totalInflated);
76cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        assertDecompressed(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
77cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        assertEquals(0, inflater.inflate(decompressed));
78cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson    }
79cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson
80cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson    private void deflateInflate(int flush) throws DataFormatException {
81cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        int lastDeflated = deflater.deflate(compressed, totalDeflated,
82cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson                compressed.length - totalDeflated, flush);
83cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        assertTrue(inflater.needsInput());
84cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        inflater.setInput(compressed, totalDeflated, lastDeflated);
85cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        totalDeflated += lastDeflated;
86cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        totalInflated += inflater.inflate(decompressed, totalInflated,
87cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson                decompressed.length - totalInflated);
88cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson    }
89cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson
90cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson    private void assertDecompressed(int... expected) {
91cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        for (int i = 0; i < decompressed.length; i++) {
92cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson            int expectedValue = i < expected.length ? expected[i] : 0;
93cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson            assertEquals(expectedValue, decompressed[i]);
94cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson        }
95cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson    }
96b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson
97b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson    /**
98b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson     * Deflating without calling setInput() is the same as deflating an empty
99b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson     * byte array.
100b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson     */
101b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson    public void testDeflateWithoutSettingInput() throws Exception {
102b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        deflateInflate(Deflater.FULL_FLUSH);
103b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        assertTrue(totalDeflated > 0); // the deflated form should be non-empty
104b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson        assertEquals(0, totalInflated);
105b814b1850f5ed997ea1e7f574c8fc0df6a693c36Jesse Wilson    }
1065ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath
1075ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath    public void testDeflaterCounts() throws Exception {
1085ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        deflater.setInput(new byte[] { 1, 2, 3 });
1095ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(11, deflater.deflate(compressed, 0, compressed.length, Deflater.FULL_FLUSH));
1105ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(3, deflater.getBytesRead());
1115ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(3, deflater.getTotalIn());
1125ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(11, deflater.getBytesWritten());
1135ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(11, deflater.getTotalOut());
1145ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath
1155ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        deflater.setInput(new byte[] { 1, 2, 3 });
1165ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(9, deflater.deflate(compressed, 0, compressed.length, Deflater.FULL_FLUSH));
1175ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(6, deflater.getBytesRead());
1185ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(6, deflater.getTotalIn());
1195ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(20, deflater.getBytesWritten());
1205ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath
1215ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath
1225ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        deflater.reset();
1235ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(0, deflater.getBytesRead());
1245ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(0, deflater.getBytesWritten());
1255ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(0, deflater.getTotalIn());
1265ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath        assertEquals(0, deflater.getTotalOut());
1275ccb2b3621f633708eb3ae1fd0f27f88bdb32a9dNarayan Kamath    }
128cf900b4862df0e261b3cce2195ff0654124ad7dbJesse Wilson}
129