Home | History | Annotate | Download | only in zip
      1 /*
      2  * Licensed to the Apache Software Foundation (ASF) under one or more
      3  * contributor license agreements.  See the NOTICE file distributed with
      4  * this work for additional information regarding copyright ownership.
      5  * The ASF licenses this file to You under the Apache License, Version 2.0
      6  * (the "License"); you may not use this file except in compliance with
      7  * the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 package org.apache.harmony.archive.tests.java.util.zip;
     19 
     20 import java.io.InputStream;
     21 import java.io.UnsupportedEncodingException;
     22 import java.util.zip.Adler32;
     23 import java.util.zip.DataFormatException;
     24 import java.util.zip.Deflater;
     25 import java.util.zip.Inflater;
     26 
     27 import junit.framework.TestCase;
     28 import tests.support.resource.Support_Resources;
     29 
     30 public class DeflaterTest extends TestCase {
     31 
     32 	class MyDeflater extends Deflater {
     33 		MyDeflater() {
     34 			super();
     35 		}
     36 
     37 		MyDeflater(int lvl) {
     38 			super(lvl);
     39 		}
     40 
     41 		MyDeflater(int lvl, boolean noHeader) {
     42 			super(lvl, noHeader);
     43 		}
     44 
     45 		void myFinalize() {
     46 			finalize();
     47 		}
     48 
     49 		int getDefCompression() {
     50 			return DEFAULT_COMPRESSION;
     51 		}
     52 
     53 		int getDefStrategy() {
     54 			return DEFAULT_STRATEGY;
     55 		}
     56 
     57 		int getHuffman() {
     58 			return HUFFMAN_ONLY;
     59 		}
     60 
     61 		int getFiltered() {
     62 			return FILTERED;
     63 		}
     64 	}
     65 
     66 	/**
     67 	 * @tests java.util.zip.Deflater#deflate(byte[])
     68 	 */
     69 	public void test_deflate$B() {
     70 		byte outPutBuf[] = new byte[50];
     71 		byte byteArray[] = { 1, 3, 4, 7, 8 };
     72 		byte outPutInf[] = new byte[50];
     73 		int x = 0;
     74 
     75 		Deflater defl = new Deflater();
     76 		defl.setInput(byteArray);
     77 		defl.finish();
     78 		while (!defl.finished()) {
     79             x += defl.deflate(outPutBuf);
     80         }
     81 		assertEquals("Deflater at end of stream, should return 0", 0, defl
     82 				.deflate(outPutBuf));
     83         int totalOut = defl.getTotalOut();
     84         int totalIn = defl.getTotalIn();
     85         assertEquals(x, totalOut);
     86         assertEquals(byteArray.length, totalIn);
     87 		defl.end();
     88 
     89 		Inflater infl = new Inflater();
     90 		try {
     91 			infl.setInput(outPutBuf);
     92 			while (!infl.finished()) {
     93                 infl.inflate(outPutInf);
     94             }
     95 		} catch (DataFormatException e) {
     96 			fail("Invalid input to be decompressed");
     97 		}
     98         assertEquals(totalIn, infl.getTotalOut());
     99         assertEquals(totalOut, infl.getTotalIn());
    100 		for (int i = 0; i < byteArray.length; i++) {
    101             assertEquals(byteArray[i], outPutInf[i]);
    102         }
    103 		assertEquals("Final decompressed data contained more bytes than original",
    104 				0, outPutInf[byteArray.length]);
    105 		infl.end();
    106 	}
    107 
    108 	/**
    109 	 * @tests java.util.zip.Deflater#deflate(byte[], int, int)
    110 	 */
    111 	public void test_deflate$BII() {
    112 		byte outPutBuf[] = new byte[50];
    113 		byte byteArray[] = { 5, 2, 3, 7, 8 };
    114 		byte outPutInf[] = new byte[50];
    115 		int offSet = 1;
    116 		int length = outPutBuf.length - 1;
    117 		int x = 0;
    118 
    119 		Deflater defl = new Deflater();
    120 		defl.setInput(byteArray);
    121 		defl.finish();
    122 		while (!defl.finished()) {
    123             x += defl.deflate(outPutBuf, offSet, length);
    124         }
    125 		assertEquals("Deflater at end of stream, should return 0", 0, defl.deflate(
    126 				outPutBuf, offSet, length));
    127 		int totalOut = defl.getTotalOut();
    128 		int totalIn = defl.getTotalIn();
    129         assertEquals(x, totalOut);
    130         assertEquals(byteArray.length, totalIn);
    131 		defl.end();
    132 
    133 		Inflater infl = new Inflater();
    134 		try {
    135 			infl.setInput(outPutBuf, offSet, length);
    136 			while (!infl.finished()) {
    137                 infl.inflate(outPutInf);
    138             }
    139 		} catch (DataFormatException e) {
    140 			fail("Invalid input to be decompressed");
    141 		}
    142         assertEquals(totalIn, infl.getTotalOut());
    143         assertEquals(totalOut, infl.getTotalIn());
    144 		for (int i = 0; i < byteArray.length; i++) {
    145             assertEquals(byteArray[i], outPutInf[i]);
    146         }
    147 		assertEquals("Final decompressed data contained more bytes than original",
    148 				0, outPutInf[byteArray.length]);
    149 		infl.end();
    150 
    151 		// Set of tests testing the boundaries of the offSet/length
    152 		defl = new Deflater();
    153 		outPutBuf = new byte[100];
    154 		defl.setInput(byteArray);
    155 		for (int i = 0; i < 2; i++) {
    156 			if (i == 0) {
    157 				offSet = outPutBuf.length + 1;
    158 				length = outPutBuf.length;
    159 			} else {
    160 				offSet = 0;
    161 				length = outPutBuf.length + 1;
    162 			}
    163 			try {
    164 				defl.deflate(outPutBuf, offSet, length);
    165 				fail("Test " + i
    166 						+ ": ArrayIndexOutOfBoundsException not thrown");
    167 			} catch (ArrayIndexOutOfBoundsException e) {
    168 			}
    169 		}
    170 		defl.end();
    171 	}
    172 
    173 	/**
    174 	 * @tests java.util.zip.Deflater#end()
    175 	 */
    176 	public void test_end() {
    177 		byte byteArray[] = { 5, 2, 3, 7, 8 };
    178 		byte outPutBuf[] = new byte[100];
    179 
    180 		Deflater defl = new Deflater();
    181 		defl.setInput(byteArray);
    182 		defl.finish();
    183 		while (!defl.finished()) {
    184             defl.deflate(outPutBuf);
    185         }
    186 		defl.end();
    187 		helper_end_test(defl, "end");
    188 	}
    189 
    190 	/**
    191 	 * @tests java.util.zip.Deflater#finalize()
    192 	 */
    193 	public void test_finalize() {
    194 		MyDeflater mdefl = new MyDeflater();
    195 		mdefl.myFinalize();
    196 		System.gc();
    197 		helper_end_test(mdefl, "finalize");
    198 	}
    199 
    200 	/**
    201 	 * @tests java.util.zip.Deflater#finish()
    202 	 */
    203 	public void test_finish() throws Exception {
    204 		// This test already here, its the same as test_deflate()
    205 		byte byteArray[] = { 5, 2, 3, 7, 8 };
    206 		byte outPutBuf[] = new byte[100];
    207 		byte outPutInf[] = new byte[100];
    208 		int x = 0;
    209 		Deflater defl = new Deflater();
    210 		defl.setInput(byteArray);
    211 		defl.finish();
    212 
    213 		// needsInput should never return true after finish() is called
    214 		if (System.getProperty("java.vendor").startsWith("IBM")) {
    215             assertFalse("needsInput() should return false after finish() is called", defl
    216                     .needsInput());
    217         }
    218 
    219 		while (!defl.finished()) {
    220             x += defl.deflate(outPutBuf);
    221         }
    222 		int totalOut = defl.getTotalOut();
    223 		int totalIn = defl.getTotalIn();
    224         assertEquals(x, totalOut);
    225         assertEquals(byteArray.length, totalIn);
    226 		defl.end();
    227 
    228 		Inflater infl = new Inflater();
    229 		infl.setInput(outPutBuf);
    230 		while (!infl.finished()) {
    231 		    infl.inflate(outPutInf);
    232 		}
    233         assertEquals(totalIn, infl.getTotalOut());
    234         assertEquals(totalOut, infl.getTotalIn());
    235 		for (int i = 0; i < byteArray.length; i++) {
    236             assertEquals(byteArray[i], outPutInf[i]);
    237         }
    238 		assertEquals("Final decompressed data contained more bytes than original",
    239 				0, outPutInf[byteArray.length]);
    240 		infl.end();
    241 	}
    242 
    243 	/**
    244 	 * @tests java.util.zip.Deflater#finished()
    245 	 */
    246 	public void test_finished() {
    247 		byte byteArray[] = { 5, 2, 3, 7, 8 };
    248 		byte outPutBuf[] = new byte[100];
    249 		Deflater defl = new Deflater();
    250 		assertTrue("Test 1: Deflater should not be finished.", !defl.finished());
    251 		defl.setInput(byteArray);
    252 		assertTrue("Test 2: Deflater should not be finished.", !defl.finished());
    253 		defl.finish();
    254 		assertTrue("Test 3: Deflater should not be finished.", !defl.finished());
    255 		while (!defl.finished()) {
    256             defl.deflate(outPutBuf);
    257         }
    258 		assertTrue("Test 4: Deflater should be finished.", defl.finished());
    259 		defl.end();
    260 		assertTrue("Test 5: Deflater should be finished.", defl.finished());
    261 	}
    262 
    263 	/**
    264 	 * @tests java.util.zip.Deflater#getAdler()
    265 	 */
    266 	public void test_getAdler() {
    267 		byte byteArray[] = { 'a', 'b', 'c', 1, 2, 3 };
    268 		byte outPutBuf[] = new byte[100];
    269 		Deflater defl = new Deflater();
    270 
    271 		// getting the checkSum value using the Adler
    272 		defl.setInput(byteArray);
    273 		defl.finish();
    274 		while (!defl.finished()) {
    275             defl.deflate(outPutBuf);
    276         }
    277 		long checkSumD = defl.getAdler();
    278 		defl.end();
    279 
    280 		// getting the checkSum value through the Adler32 class
    281 		Adler32 adl = new Adler32();
    282 		adl.update(byteArray);
    283 		long checkSumR = adl.getValue();
    284 		assertEquals(
    285                 "The checksum value returned by getAdler() is not the same as the checksum returned by creating the adler32 instance",
    286                 checkSumD, checkSumR);
    287 	}
    288 
    289 	/**
    290 	 * @tests java.util.zip.Deflater#getTotalIn()
    291 	 */
    292 	public void test_getTotalIn() {
    293 		byte outPutBuf[] = new byte[5];
    294 		byte byteArray[] = { 1, 3, 4, 7, 8 };
    295 
    296 		Deflater defl = new Deflater();
    297 		defl.setInput(byteArray);
    298 		defl.finish();
    299 		while (!defl.finished()) {
    300             defl.deflate(outPutBuf);
    301         }
    302         assertEquals(byteArray.length, defl.getTotalIn());
    303 		defl.end();
    304 
    305 		defl = new Deflater();
    306 		int offSet = 2;
    307 		int length = 3;
    308 		outPutBuf = new byte[5];
    309 		defl.setInput(byteArray, offSet, length);
    310 		defl.finish();
    311 		while (!defl.finished()) {
    312             defl.deflate(outPutBuf);
    313         }
    314         assertEquals(length, defl.getTotalIn());
    315 		defl.end();
    316 	}
    317 
    318 	/**
    319 	 * @tests java.util.zip.Deflater#getTotalOut()
    320 	 */
    321 	public void test_getTotalOut() {
    322 		// the getTotalOut should equal the sum of value returned by deflate()
    323 		byte outPutBuf[] = new byte[5];
    324 		byte byteArray[] = { 5, 2, 3, 7, 8 };
    325 		int x = 0;
    326 		Deflater defl = new Deflater();
    327 		defl.setInput(byteArray);
    328 		defl.finish();
    329 		while (!defl.finished()) {
    330             x += defl.deflate(outPutBuf);
    331         }
    332         assertEquals(x, defl.getTotalOut());
    333 		defl.end();
    334 
    335 		x = 0;
    336 		int offSet = 2;
    337 		int length = 3;
    338 		defl = new Deflater();
    339 		outPutBuf = new byte[5];
    340 		defl.setInput(byteArray, offSet, length);
    341 		defl.finish();
    342 		while (!defl.finished()) {
    343             x += defl.deflate(outPutBuf);
    344         }
    345         assertEquals(x, defl.getTotalOut());
    346 	}
    347 
    348 	/**
    349 	 * @tests java.util.zip.Deflater#needsInput()
    350 	 */
    351 	public void test_needsInput() {
    352 		Deflater defl = new Deflater();
    353 		assertTrue(
    354 				"needsInput give the wrong boolean value as a result of no input buffer",
    355 				defl.needsInput());
    356 		byte byteArray[] = { 1, 2, 3 };
    357 		defl.setInput(byteArray);
    358 		assertFalse(
    359 				"needsInput give wrong boolean value as a result of a full input buffer",
    360 				defl.needsInput());
    361 		byte[] outPutBuf = new byte[50];
    362 		while (!defl.needsInput()) {
    363             defl.deflate(outPutBuf);
    364         }
    365 		byte emptyByteArray[] = new byte[0];
    366 		defl.setInput(emptyByteArray);
    367 		assertTrue(
    368 				"needsInput give wrong boolean value as a result of an empty input buffer",
    369 				defl.needsInput());
    370 		defl.setInput(byteArray);
    371 		defl.finish();
    372 		while (!defl.finished()) {
    373             defl.deflate(outPutBuf);
    374         }
    375 		// needsInput should NOT return true after finish() has been
    376 		// called.
    377 		if (System.getProperty("java.vendor").startsWith("IBM")) {
    378             assertFalse(
    379 					"needsInput gave wrong boolean value as a result of finish() being called",
    380 					defl.needsInput());
    381         }
    382 		defl.end();
    383 	}
    384 
    385 	/**
    386 	 * @tests java.util.zip.Deflater#reset()
    387 	 */
    388 	public void test_reset() {
    389 		byte outPutBuf[] = new byte[100];
    390 		byte outPutInf[] = new byte[100];
    391 		byte curArray[] = new byte[5];
    392 		byte byteArray[] = { 1, 3, 4, 7, 8 };
    393 		byte byteArray2[] = { 8, 7, 4, 3, 1 };
    394 		int x = 0;
    395 		int orgValue = 0;
    396 		Deflater defl = new Deflater();
    397 
    398 		for (int i = 0; i < 3; i++) {
    399 			if (i == 0) {
    400                 curArray = byteArray;
    401             } else if (i == 1) {
    402                 curArray = byteArray2;
    403             } else {
    404                 defl.reset();
    405             }
    406 
    407 			defl.setInput(curArray);
    408 			defl.finish();
    409 			while (!defl.finished()) {
    410                 x += defl.deflate(outPutBuf);
    411             }
    412 
    413 			if (i == 0) {
    414                 assertEquals(x, defl.getTotalOut());
    415             } else if (i == 1) {
    416                 assertEquals(x, orgValue);
    417             } else {
    418                 assertEquals(x, orgValue * 2);
    419             }
    420 
    421 			if (i == 0) {
    422                 orgValue = x;
    423             }
    424 
    425 			try {
    426 				Inflater infl = new Inflater();
    427 				infl.setInput(outPutBuf);
    428 				while (!infl.finished()) {
    429                     infl.inflate(outPutInf);
    430                 }
    431 				infl.end();
    432 			} catch (DataFormatException e) {
    433 				fail("Test " + i + ": Invalid input to be decompressed");
    434 			}
    435 
    436 			if (i == 1) {
    437                 curArray = byteArray;
    438             }
    439 
    440 			for (int j = 0; j < curArray.length; j++) {
    441                 assertEquals(curArray[j], outPutInf[j]);
    442             }
    443             assertEquals(0, outPutInf[curArray.length]);
    444 		}
    445 	}
    446 
    447 	/**
    448 	 * @tests java.util.zip.Deflater#setDictionary(byte[])
    449 	 */
    450 	public void test_setDictionary$B() {
    451 		// This test is very close to getAdler()
    452 		byte dictionaryArray[] = { 'e', 'r', 't', 'a', 'b', 2, 3 };
    453 		byte byteArray[] = { 4, 5, 3, 2, 'a', 'b', 6, 7, 8, 9, 0, 's', '3',
    454 				'w', 'r' };
    455 		byte outPutBuf[] = new byte[100];
    456 
    457 		Deflater defl = new Deflater();
    458 		long deflAdler = defl.getAdler();
    459 		assertEquals("No dictionary set, no data deflated, getAdler should return 1",
    460 				1, deflAdler);
    461 		defl.setDictionary(dictionaryArray);
    462 		deflAdler = defl.getAdler();
    463 
    464 		// getting the checkSum value through the Adler32 class
    465 		Adler32 adl = new Adler32();
    466 		adl.update(dictionaryArray);
    467 		long realAdler = adl.getValue();
    468         assertEquals(deflAdler, realAdler);
    469 
    470 		defl.setInput(byteArray);
    471 		defl.finish();
    472 		while (!defl.finished()) {
    473             defl.deflate(outPutBuf);
    474         }
    475 		deflAdler = defl.getAdler();
    476 		adl = new Adler32();
    477 		adl.update(byteArray);
    478 		realAdler = adl.getValue();
    479 		// Deflate is finished and there were bytes deflated that did not occur
    480 		// in the dictionaryArray, therefore a new dictionary was automatically
    481 		// set.
    482         assertEquals(realAdler, deflAdler);
    483 		defl.end();
    484 	}
    485 
    486 	/**
    487 	 * @tests java.util.zip.Deflater#setDictionary(byte[], int, int)
    488 	 */
    489 	public void test_setDictionary$BII() {
    490 		// This test is very close to getAdler()
    491 		byte dictionaryArray[] = { 'e', 'r', 't', 'a', 'b', 2, 3, 'o', 't' };
    492 		byte byteArray[] = { 4, 5, 3, 2, 'a', 'b', 6, 7, 8, 9, 0, 's', '3',
    493 				'w', 'r', 't', 'u', 'i', 'o', 4, 5, 6, 7 };
    494 		byte outPutBuf[] = new byte[500];
    495 
    496 		int offSet = 4;
    497 		int length = 5;
    498 
    499 		Deflater defl = new Deflater();
    500 		long deflAdler = defl.getAdler();
    501 		assertEquals("No dictionary set, no data deflated, getAdler should return 1",
    502 				1, deflAdler);
    503 		defl.setDictionary(dictionaryArray, offSet, length);
    504 		deflAdler = defl.getAdler();
    505 
    506 		// getting the checkSum value through the Adler32 class
    507 		Adler32 adl = new Adler32();
    508 		adl.update(dictionaryArray, offSet, length);
    509 		long realAdler = adl.getValue();
    510         assertEquals(deflAdler, realAdler);
    511 
    512 		defl.setInput(byteArray);
    513 		while (!defl.needsInput()) {
    514             defl.deflate(outPutBuf);
    515         }
    516 		deflAdler = defl.getAdler();
    517 		adl = new Adler32();
    518 		adl.update(byteArray);
    519 		realAdler = adl.getValue();
    520 		// Deflate is finished and there were bytes deflated that did not occur
    521 		// in the dictionaryArray, therefore a new dictionary was automatically
    522 		// set.
    523         assertEquals(realAdler, deflAdler);
    524 		defl.end();
    525 
    526 		// boundary check
    527 		defl = new Deflater();
    528 		for (int i = 0; i < 2; i++) {
    529 			if (i == 0) {
    530 				offSet = 0;
    531 				length = dictionaryArray.length + 1;
    532 			} else {
    533 				offSet = dictionaryArray.length + 1;
    534 				length = 1;
    535 			}
    536 			try {
    537 				defl.setDictionary(dictionaryArray, offSet, length);
    538 				fail(
    539 						"Test "
    540 								+ i
    541 								+ ": boundary check for setDictionary failed for offset "
    542 								+ offSet + " and length " + length);
    543 			} catch (ArrayIndexOutOfBoundsException e) {
    544 			}
    545 		}
    546 	}
    547 
    548 	/**
    549 	 * @tests java.util.zip.Deflater#setInput(byte[])
    550 	 */
    551 	public void test_setInput$B() {
    552 		byte[] byteArray = { 1, 2, 3 };
    553 		byte[] outPutBuf = new byte[50];
    554 		byte[] outPutInf = new byte[50];
    555 
    556 		Deflater defl = new Deflater();
    557 		defl.setInput(byteArray);
    558 		assertTrue("the array buffer in setInput() is empty", !defl
    559 				.needsInput());
    560 		// The second setInput() should be ignored since needsInput() return
    561 		// false
    562 		defl.setInput(byteArray);
    563 		defl.finish();
    564 		while (!defl.finished()) {
    565             defl.deflate(outPutBuf);
    566         }
    567 		defl.end();
    568 
    569 		Inflater infl = new Inflater();
    570 		try {
    571 			infl.setInput(outPutBuf);
    572 			while (!infl.finished()) {
    573                 infl.inflate(outPutInf);
    574             }
    575 		} catch (DataFormatException e) {
    576 			fail("Invalid input to be decompressed");
    577 		}
    578 		for (int i = 0; i < byteArray.length; i++) {
    579             assertEquals(byteArray[i], outPutInf[i]);
    580         }
    581 		assertEquals(byteArray.length, infl.getTotalOut());
    582 		infl.end();
    583 	}
    584 
    585 	/**
    586 	 * @tests java.util.zip.Deflater#setInput(byte[], int, int)
    587 	 */
    588 	public void test_setInput$BII() throws Exception {
    589 		byte[] byteArray = { 1, 2, 3, 4, 5 };
    590 		byte[] outPutBuf = new byte[50];
    591 		byte[] outPutInf = new byte[50];
    592 		int offSet = 1;
    593 		int length = 3;
    594 
    595 		Deflater defl = new Deflater();
    596 		defl.setInput(byteArray, offSet, length);
    597 		assertFalse("the array buffer in setInput() is empty", defl.needsInput());
    598 		// The second setInput() should be ignored since needsInput() return
    599 		// false
    600 		defl.setInput(byteArray, offSet, length);
    601 		defl.finish();
    602 		while (!defl.finished()) {
    603             defl.deflate(outPutBuf);
    604         }
    605 		defl.end();
    606 
    607 		Inflater infl = new Inflater();
    608 		infl.setInput(outPutBuf);
    609 		while (!infl.finished()) {
    610 		    infl.inflate(outPutInf);
    611 		}
    612 		for (int i = 0; i < length; i++) {
    613             assertEquals(byteArray[i + offSet], outPutInf[i]);
    614         }
    615 		assertEquals(length, infl.getTotalOut());
    616 		infl.end();
    617 
    618 		// boundary check
    619 		defl = new Deflater();
    620 		for (int i = 0; i < 2; i++) {
    621 			if (i == 0) {
    622 				offSet = 0;
    623 				length = byteArray.length + 1;
    624 			} else {
    625 				offSet = byteArray.length + 1;
    626 				length = 1;
    627 			}
    628 			try {
    629 				defl.setInput(byteArray, offSet, length);
    630 				fail("Test " + i
    631 						+ ": boundary check for setInput failed for offset "
    632 						+ offSet + " and length " + length);
    633 			} catch (ArrayIndexOutOfBoundsException e) {
    634 			}
    635 		}
    636 	}
    637 
    638 	/**
    639 	 * @tests java.util.zip.Deflater#setLevel(int)
    640 	 */
    641 	public void test_setLevelI() throws Exception {
    642 		// Very similar to test_Constructor(int)
    643 		byte[] byteArray = new byte[100];
    644 		InputStream inFile = Support_Resources.getStream("hyts_checkInput.txt");
    645 		inFile.read(byteArray);
    646 		inFile.close();
    647 
    648 		byte[] outPutBuf;
    649 		int totalOut;
    650 		for (int i = 0; i < 10; i++) {
    651 			Deflater defl = new Deflater();
    652 			defl.setLevel(i);
    653 			outPutBuf = new byte[500];
    654 			defl.setInput(byteArray);
    655 			while (!defl.needsInput()) {
    656                 defl.deflate(outPutBuf);
    657             }
    658 			defl.finish();
    659 			while (!defl.finished()) {
    660                 defl.deflate(outPutBuf);
    661             }
    662 			totalOut = defl.getTotalOut();
    663 			defl.end();
    664 
    665 			outPutBuf = new byte[500];
    666 			defl = new Deflater(i);
    667 			defl.setInput(byteArray);
    668 			while (!defl.needsInput()) {
    669                 defl.deflate(outPutBuf);
    670             }
    671 			defl.finish();
    672 			while (!defl.finished()) {
    673                 defl.deflate(outPutBuf);
    674             }
    675 			assertEquals(totalOut, defl.getTotalOut());
    676 			defl.end();
    677 		}
    678 
    679         //test setLevel - Call after inputArray
    680         Deflater defl = new Deflater();
    681         defl.setLevel(2);
    682         outPutBuf = new byte[500];
    683         defl.setInput(byteArray);
    684         defl.setLevel(3);
    685         while (!defl.needsInput()) {
    686             defl.deflate(outPutBuf);
    687         }
    688         defl.finish();
    689         while (!defl.finished()) {
    690             defl.deflate(outPutBuf);
    691         }
    692         totalOut = defl.getTotalOut();
    693         defl.end();
    694 
    695 		// testing boundaries
    696 		try {
    697 			Deflater boundDefl = new Deflater();
    698 			// Level must be between 0-9
    699 			boundDefl.setLevel(-2);
    700 			fail(
    701 					"IllegalArgumentException not thrown when setting level to a number < 0.");
    702 		} catch (IllegalArgumentException e) {
    703 		}
    704 		try {
    705 			Deflater boundDefl = new Deflater();
    706 			boundDefl.setLevel(10);
    707 			fail(
    708 					"IllegalArgumentException not thrown when setting level to a number > 9.");
    709 		} catch (IllegalArgumentException e) {
    710 		}
    711 	}
    712 
    713 	/**
    714 	 * @tests java.util.zip.Deflater#setStrategy(int)
    715 	 */
    716 	public void test_setStrategyI() throws Exception {
    717 		byte[] byteArray = new byte[100];
    718 			InputStream inFile = Support_Resources.getStream("hyts_checkInput.txt");
    719 			inFile.read(byteArray);
    720 			inFile.close();
    721 
    722 		for (int i = 0; i < 3; i++) {
    723 			byte outPutBuf[] = new byte[500];
    724 			MyDeflater mdefl = new MyDeflater();
    725 
    726 			if (i == 0) {
    727                 mdefl.setStrategy(mdefl.getDefStrategy());
    728             } else if (i == 1) {
    729                 mdefl.setStrategy(mdefl.getHuffman());
    730             } else {
    731                 mdefl.setStrategy(mdefl.getFiltered());
    732             }
    733 
    734 			mdefl.setInput(byteArray);
    735 			while (!mdefl.needsInput()) {
    736                 mdefl.deflate(outPutBuf);
    737             }
    738 			mdefl.finish();
    739 			while (!mdefl.finished()) {
    740                 mdefl.deflate(outPutBuf);
    741             }
    742 
    743 			if (i == 0) {
    744 				// System.out.println(mdefl.getTotalOut());
    745 				// ran JDK and found that getTotalOut() = 86 for this particular
    746 				// file
    747 				assertEquals("getTotalOut() for the default strategy did not correspond with JDK",
    748 						86, mdefl.getTotalOut());
    749 			} else if (i == 1) {
    750 				// System.out.println(mdefl.getTotalOut());
    751 				// ran JDK and found that getTotalOut() = 100 for this
    752 				// particular file
    753 				assertEquals("getTotalOut() for the Huffman strategy did not correspond with JDK",
    754 						100, mdefl.getTotalOut());
    755 			} else {
    756 				// System.out.println(mdefl.getTotalOut());
    757 				// ran JDK and found that totalOut = 93 for this particular file
    758 				assertEquals("Total Out for the Filtered strategy did not correspond with JDK",
    759 						93, mdefl.getTotalOut());
    760 			}
    761 			mdefl.end();
    762 		}
    763 
    764 		//Call setStrategy after setInput call
    765         byte outPutBuf[] = new byte[500];
    766         MyDeflater mdefl = new MyDeflater();
    767         mdefl.setStrategy(mdefl.getDefStrategy());
    768         mdefl.setInput(byteArray);
    769         mdefl.setStrategy(mdefl.getHuffman());
    770         while (!mdefl.needsInput()) {
    771             mdefl.deflate(outPutBuf);
    772         }
    773         mdefl.finish();
    774         while (!mdefl.finished()) {
    775             mdefl.deflate(outPutBuf);
    776         }
    777         mdefl.end();
    778 
    779 		// Attempting to setStrategy to an invalid value
    780 		try {
    781 			Deflater defl = new Deflater();
    782 			defl.setStrategy(-412);
    783 			fail(
    784 					"IllegalArgumentException not thrown when setting strategy to an invalid value.");
    785 		} catch (IllegalArgumentException e) {
    786 		}
    787 	}
    788 
    789 	/**
    790 	 * @tests java.util.zip.Deflater#Deflater()
    791 	 */
    792 	public void test_Constructor() throws Exception {
    793 		byte[] byteArray = new byte[100];
    794 		InputStream inFile = Support_Resources.getStream("hyts_checkInput.txt");
    795 		inFile.read(byteArray);
    796 		inFile.close();
    797 
    798 		Deflater defl = new Deflater();
    799 		byte[] outPutBuf = new byte[500];
    800 		defl.setInput(byteArray);
    801 		while (!defl.needsInput()) {
    802             defl.deflate(outPutBuf);
    803         }
    804 		defl.finish();
    805 		while (!defl.finished()) {
    806             defl.deflate(outPutBuf);
    807         }
    808 		int totalOut = defl.getTotalOut();
    809 		defl.end();
    810 
    811 		// creating a Deflater using the DEFAULT_COMPRESSION as the int
    812 		MyDeflater mdefl = new MyDeflater();
    813 		mdefl = new MyDeflater(mdefl.getDefCompression());
    814 		outPutBuf = new byte[500];
    815 		mdefl.setInput(byteArray);
    816 		while (!mdefl.needsInput()) {
    817             mdefl.deflate(outPutBuf);
    818         }
    819 		mdefl.finish();
    820 		while (!mdefl.finished()) {
    821             mdefl.deflate(outPutBuf);
    822         }
    823 		assertEquals(totalOut, mdefl.getTotalOut());
    824 		mdefl.end();
    825 	}
    826 
    827 	/**
    828 	 * @tests java.util.zip.Deflater#Deflater(int, boolean)
    829 	 */
    830 	public void test_ConstructorIZ() throws Exception {
    831 		byte byteArray[] = { 4, 5, 3, 2, 'a', 'b', 6, 7, 8, 9, 0, 's', '3',
    832 				'w', 'r' };
    833 
    834 		Deflater defl = new Deflater();
    835 		byte outPutBuf[] = new byte[500];
    836 		defl.setLevel(2);
    837 		defl.setInput(byteArray);
    838 		while (!defl.needsInput()) {
    839             defl.deflate(outPutBuf);
    840         }
    841 		defl.finish();
    842 		while (!defl.finished()) {
    843             defl.deflate(outPutBuf);
    844         }
    845 		int totalOut = defl.getTotalOut();
    846 		defl.end();
    847 
    848 		outPutBuf = new byte[500];
    849 		defl = new Deflater(2, false);
    850 		defl.setInput(byteArray);
    851 		while (!defl.needsInput()) {
    852             defl.deflate(outPutBuf);
    853         }
    854 		defl.finish();
    855 		while (!defl.finished()) {
    856             defl.deflate(outPutBuf);
    857         }
    858 		assertEquals(totalOut, defl.getTotalOut());
    859 		defl.end();
    860 
    861 		outPutBuf = new byte[500];
    862 		defl = new Deflater(2, true);
    863 		defl.setInput(byteArray);
    864 		while (!defl.needsInput()) {
    865             defl.deflate(outPutBuf);
    866         }
    867 		defl.finish();
    868 		while (!defl.finished()) {
    869             defl.deflate(outPutBuf);
    870         }
    871 		assertTrue(
    872 				"getTotalOut() should not be equal comparing two Deflaters with different header options.",
    873 				defl.getTotalOut() != totalOut);
    874 		defl.end();
    875 
    876 		byte outPutInf[] = new byte[500];
    877 		Inflater infl = new Inflater(true);
    878 		while (!infl.finished()) {
    879 		    if (infl.needsInput()) {
    880 		        infl.setInput(outPutBuf);
    881 		    }
    882 		    infl.inflate(outPutInf);
    883 		}
    884 		for (int i = 0; i < byteArray.length; i++) {
    885             assertEquals(byteArray[i], outPutInf[i]);
    886         }
    887 		assertEquals("final decompressed data contained more bytes than original - constructorIZ",
    888 				0, outPutInf[byteArray.length]);
    889 		infl.end();
    890 
    891 		infl = new Inflater(false);
    892 		outPutInf = new byte[500];
    893 		int r = 0;
    894 		try {
    895 			while (!infl.finished()) {
    896 				if (infl.needsInput()) {
    897                     infl.setInput(outPutBuf);
    898                 }
    899 				infl.inflate(outPutInf);
    900 			}
    901 		} catch (DataFormatException e) {
    902 			r = 1;
    903 		}
    904 		assertEquals("header option did not correspond", 1, r);
    905 
    906 		// testing boundaries
    907 		try {
    908 			Deflater boundDefl = new Deflater();
    909 			// Level must be between 0-9
    910 			boundDefl.setLevel(-2);
    911 			fail("IllegalArgumentException not thrown when setting level to a number < 0.");
    912 		} catch (IllegalArgumentException e) {
    913 		}
    914 		try {
    915 			Deflater boundDefl = new Deflater();
    916 			boundDefl.setLevel(10);
    917 			fail("IllegalArgumentException not thrown when setting level to a number > 9.");
    918 		} catch (IllegalArgumentException e) {
    919 		}
    920 
    921         try {
    922             Deflater boundDefl = new Deflater(-2, true);
    923             fail("IllegalArgumentException not thrown when passing level to a number < 0.");
    924         } catch (IllegalArgumentException e) {
    925         }
    926 
    927         try {
    928             Deflater boundDefl = new Deflater(10, true);
    929             fail("IllegalArgumentException not thrown when passing level to a number > 9.");
    930         } catch (IllegalArgumentException e) {
    931         }
    932 	}
    933 
    934 	/**
    935 	 * @tests java.util.zip.Deflater#Deflater(int)
    936 	 */
    937 	public void test_ConstructorI() throws Exception {
    938 	    byte[] byteArray = new byte[100];
    939         InputStream inFile = Support_Resources.getStream("hyts_checkInput.txt");
    940         inFile.read(byteArray);
    941         inFile.close();
    942 
    943 		byte outPutBuf[] = new byte[500];
    944 		Deflater defl = new Deflater(3);
    945 		defl.setInput(byteArray);
    946 		while (!defl.needsInput()) {
    947             defl.deflate(outPutBuf);
    948         }
    949 		defl.finish();
    950 		while (!defl.finished()) {
    951             defl.deflate(outPutBuf);
    952         }
    953 		int totalOut = defl.getTotalOut();
    954 		defl.end();
    955 
    956 		// test to see if the compression ratio is the same as setting the level
    957 		// on a deflater
    958 		outPutBuf = new byte[500];
    959 		defl = new Deflater();
    960 		defl.setLevel(3);
    961 		defl.setInput(byteArray);
    962 		while (!defl.needsInput()) {
    963             defl.deflate(outPutBuf);
    964         }
    965 		defl.finish();
    966 		while (!defl.finished()) {
    967             defl.deflate(outPutBuf);
    968         }
    969 		assertEquals(totalOut, defl.getTotalOut());
    970 		defl.end();
    971 
    972 		// testing boundaries
    973 		try {
    974             Deflater boundDefl = new Deflater();
    975             // Level must be between 0-9
    976             boundDefl.setLevel(-2);
    977             fail("IllegalArgumentException not thrown when setting level to a number < 0.");
    978         } catch (IllegalArgumentException e) {
    979 		}
    980 		try {
    981             Deflater boundDefl = new Deflater();
    982             boundDefl.setLevel(10);
    983             fail("IllegalArgumentException not thrown when setting level to a number > 9.");
    984         } catch (IllegalArgumentException e) {
    985         }
    986 	}
    987 
    988 	private void helper_end_test(Deflater defl, String desc) {
    989 		// Help tests for test_end() and test_reset().
    990 		byte byteArray[] = { 5, 2, 3, 7, 8 };
    991 
    992 		// Methods where we expect IllegalStateException or NullPointerException
    993 		// to be thrown
    994 		try {
    995 			defl.getTotalOut();
    996 			fail("defl.getTotalOut() can still be used after " + desc
    997 					+ " is called in test_" + desc);
    998 		} catch (IllegalStateException e) {
    999 		} catch (NullPointerException e) {
   1000 		}
   1001 		try {
   1002 			defl.getTotalIn();
   1003 			fail("defl.getTotalIn() can still be used after " + desc
   1004 					+ " is called in test_" + desc);
   1005 		} catch (IllegalStateException e) {
   1006 		} catch (NullPointerException e) {
   1007 		}
   1008 		try {
   1009 			defl.getAdler();
   1010 			fail("defl.getAdler() can still be used after " + desc
   1011 					+ " is called in test_" + desc);
   1012 		} catch (IllegalStateException e) {
   1013 		} catch (NullPointerException e) {
   1014 		}
   1015 		try {
   1016 			byte[] dict = { 'a', 'b', 'c' };
   1017 			defl.setDictionary(dict);
   1018 			fail("defl.setDictionary() can still be used after " + desc
   1019 					+ " is called in test_" + desc);
   1020 		} catch (IllegalStateException e) {
   1021 		} catch (NullPointerException e) {
   1022 		}
   1023 		try {
   1024 			defl.getTotalIn();
   1025 			fail("defl.getTotalIn() can still be used after " + desc
   1026 					+ " is called in test_" + desc);
   1027 		} catch (IllegalStateException e) {
   1028 		} catch (NullPointerException e) {
   1029 		}
   1030 		try {
   1031 			defl.getTotalIn();
   1032 			fail("defl.getTotalIn() can still be used after " + desc
   1033 					+ " is called in test_" + desc);
   1034 		} catch (IllegalStateException e) {
   1035 		} catch (NullPointerException e) {
   1036 		}
   1037 		try {
   1038 			defl.deflate(byteArray);
   1039 			fail("defl.deflate() can still be used after " + desc
   1040 					+ " is called in test_" + desc);
   1041 		} catch (IllegalStateException e) {
   1042 		} catch (NullPointerException e) {
   1043 		}
   1044 
   1045 		// Methods where we expect NullPointerException to be thrown
   1046 		try {
   1047 			defl.reset();
   1048 			fail("defl.reset() can still be used after " + desc
   1049 					+ " is called in test_" + desc);
   1050 		} catch (NullPointerException expected) {
   1051 		} catch (IllegalStateException expected) {
   1052 		}
   1053 
   1054         // Methods where we expect NullPointerException to be thrown
   1055         try {
   1056             defl.getBytesRead();
   1057             fail("defl.reset() can still be used after " + desc
   1058                     + " is called in test_" + desc);
   1059 	} catch (NullPointerException expected) {
   1060 	} catch (IllegalStateException expected) {
   1061         }
   1062 
   1063         // Methods where we expect NullPointerException to be thrown
   1064         try {
   1065             defl.getBytesWritten();
   1066             fail("defl.getBytesWritten() can still be used after " + desc
   1067                     + " is called in test_" + desc);
   1068 	} catch (NullPointerException expected) {
   1069 	} catch (IllegalStateException expected) {
   1070         }
   1071 
   1072 		// Methods that should be allowed to be called after end() is called
   1073 		defl.needsInput();
   1074 		defl.setStrategy(1);
   1075 		defl.setLevel(1);
   1076 		defl.end();
   1077 
   1078 		// Methods where exceptions should be thrown
   1079 		String vendor = System.getProperty("java.vendor");
   1080 		if (vendor.indexOf("IBM") != -1) {
   1081 			try {
   1082 				defl.setInput(byteArray);
   1083 				fail("defl.setInput() can still be used after " + desc
   1084 						+ " is called in test_" + desc);
   1085 			} catch (IllegalStateException e) {
   1086 			}
   1087 		}
   1088 	}
   1089 
   1090     /**
   1091      * @tests java.util.zip.Deflater()
   1092      */
   1093     public void test_needsDictionary() {
   1094         Deflater inf = new Deflater();
   1095         assertEquals(0, inf.getTotalIn());
   1096         assertEquals(0, inf.getTotalOut());
   1097         assertEquals(0, inf.getBytesRead());
   1098         assertEquals(0, inf.getBytesWritten());
   1099     }
   1100 
   1101     /**
   1102      * @throws DataFormatException
   1103      * @throws UnsupportedEncodingException
   1104      * @tests java.util.zip.Deflater#getBytesRead()
   1105      */
   1106     public void test_getBytesRead() throws DataFormatException,
   1107             UnsupportedEncodingException {
   1108         // Regression test for HARMONY-158
   1109         Deflater def = new Deflater();
   1110         assertEquals(0, def.getTotalIn());
   1111         assertEquals(0, def.getTotalOut());
   1112         assertEquals(0, def.getBytesRead());
   1113         // Encode a String into bytes
   1114         String inputString = "blahblahblah??";
   1115         byte[] input = inputString.getBytes("UTF-8");
   1116 
   1117         // Compress the bytes
   1118         byte[] output = new byte[100];
   1119         def.setInput(input);
   1120         def.finish();
   1121         int compressedDataLength = def.deflate(output);
   1122         assertEquals(14, def.getTotalIn());
   1123         assertEquals(compressedDataLength, def.getTotalOut());
   1124         assertEquals(14, def.getBytesRead());
   1125     }
   1126 
   1127     /**
   1128      * @throws DataFormatException
   1129      * @throws UnsupportedEncodingException
   1130      * @tests java.util.zip.Deflater#getBytesRead()
   1131      */
   1132     public void test_getBytesWritten() throws DataFormatException,
   1133             UnsupportedEncodingException {
   1134         // Regression test for HARMONY-158
   1135         Deflater def = new Deflater();
   1136         assertEquals(0, def.getTotalIn());
   1137         assertEquals(0, def.getTotalOut());
   1138         assertEquals(0, def.getBytesWritten());
   1139         // Encode a String into bytes
   1140         String inputString = "blahblahblah??";
   1141         byte[] input = inputString.getBytes("UTF-8");
   1142 
   1143         // Compress the bytes
   1144         byte[] output = new byte[100];
   1145         def.setInput(input);
   1146         def.finish();
   1147         int compressedDataLength = def.deflate(output);
   1148         assertEquals(14, def.getTotalIn());
   1149         assertEquals(compressedDataLength, def.getTotalOut());
   1150         assertEquals(compressedDataLength, def.getBytesWritten());
   1151     }
   1152 
   1153     //Regression Test for HARMONY-2481
   1154     public void test_deflate_beforeSetInput() throws Exception {
   1155         Deflater deflater = new Deflater();
   1156         deflater.finish();
   1157         byte[] buffer = new byte[1024];
   1158         assertEquals(8, deflater.deflate(buffer));
   1159         byte[] expectedBytes = { 120, -100, 3, 0, 0, 0, 0, 1 };
   1160         for (int i = 0; i < expectedBytes.length; i++) {
   1161             assertEquals(expectedBytes[i], buffer[i]);
   1162         }
   1163     }
   1164 }
   1165