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