1/* 2 * Copyright (C) 2010 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 libcore.java.util.zip; 18 19import java.util.zip.DataFormatException; 20import java.util.zip.Deflater; 21import java.util.zip.Inflater; 22import junit.framework.TestCase; 23 24public class DeflaterTest extends TestCase { 25 26 private byte[] compressed = new byte[32]; 27 private byte[] decompressed = new byte[20]; 28 private Deflater deflater = new Deflater(); 29 private Inflater inflater = new Inflater(); 30 private int totalDeflated = 0; 31 private int totalInflated = 0; 32 33 public void testDeflate() throws DataFormatException { 34 deflater.setInput(new byte[] { 1, 2, 3 }); 35 deflateInflate(Deflater.NO_FLUSH); 36 assertTrue(totalInflated < 3); 37 assertEquals(0, decompressed[2]); // the 3rd byte shouldn't have been flushed yet 38 39 deflater.setInput(new byte[] { 4, 5, 6 }); 40 deflateInflate(Deflater.SYNC_FLUSH); 41 assertEquals(6, totalInflated); 42 assertDecompressed(1, 2, 3, 4, 5, 6); 43 assertEquals(0, inflater.inflate(decompressed)); 44 45 deflater.setInput(new byte[] { 7, 8, 9 }); 46 deflateInflate(Deflater.FULL_FLUSH); 47 assertEquals(9, totalInflated); 48 assertDecompressed(1, 2, 3, 4, 5, 6, 7, 8, 9); 49 assertEquals(0, inflater.inflate(decompressed)); 50 inflater = new Inflater(true); // safe because we did a FULL_FLUSH 51 52 deflater.setInput(new byte[] { 10, 11, 12 }); 53 deflateInflate(Deflater.SYNC_FLUSH); 54 assertEquals(12, totalInflated); 55 assertDecompressed(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); 56 assertEquals(0, inflater.inflate(decompressed)); 57 } 58 59 private void deflateInflate(int flush) throws DataFormatException { 60 int lastDeflated = deflater.deflate(compressed, totalDeflated, 61 compressed.length - totalDeflated, flush); 62 assertTrue(inflater.needsInput()); 63 inflater.setInput(compressed, totalDeflated, lastDeflated); 64 totalDeflated += lastDeflated; 65 totalInflated += inflater.inflate(decompressed, totalInflated, 66 decompressed.length - totalInflated); 67 } 68 69 private void assertDecompressed(int... expected) { 70 for (int i = 0; i < decompressed.length; i++) { 71 int expectedValue = i < expected.length ? expected[i] : 0; 72 assertEquals(expectedValue, decompressed[i]); 73 } 74 } 75 76 /** 77 * Deflating without calling setInput() is the same as deflating an empty 78 * byte array. 79 */ 80 public void testDeflateWithoutSettingInput() throws Exception { 81 deflateInflate(Deflater.FULL_FLUSH); 82 assertTrue(totalDeflated > 0); // the deflated form should be non-empty 83 assertEquals(0, totalInflated); 84 } 85} 86