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 package org.apache.harmony.tests.java.util.zip; 18 19 import java.io.ByteArrayInputStream; 20 import java.io.ByteArrayOutputStream; 21 import java.io.EOFException; 22 import java.io.IOException; 23 import java.io.InputStream; 24 import java.io.File; 25 import java.io.FileInputStream; 26 import java.util.zip.DeflaterOutputStream; 27 import java.util.zip.Inflater; 28 import java.util.zip.InflaterInputStream; 29 30 import junit.framework.TestCase; 31 import tests.support.resource.Support_Resources; 32 33 public class InflaterInputStreamTest extends TestCase { 34 35 // files hyts_construO,hyts_construOD,hyts_construODI needs to be 36 // included as resources 37 byte outPutBuf[] = new byte[500]; 38 39 class MyInflaterInputStream extends InflaterInputStream { 40 MyInflaterInputStream(InputStream in) { 41 super(in); 42 } 43 44 MyInflaterInputStream(InputStream in, Inflater infl) { 45 super(in, infl); 46 } 47 48 MyInflaterInputStream(InputStream in, Inflater infl, int size) { 49 super(in, infl, size); 50 } 51 52 void myFill() throws IOException { 53 fill(); 54 } 55 } 56 57 /** 58 * java.util.zip.InflaterInputStream#InflaterInputStream(java.io.InputStream) 59 */ 60 public void test_ConstructorLjava_io_InputStream() throws IOException { 61 //FIXME This test doesn't pass in Harmony classlib or Sun 5.0_7 RI 62 /* 63 int result = 0; 64 int buffer[] = new int[500]; 65 InputStream infile = Support_Resources 66 .getStream("hyts_construO.bin"); 67 68 InflaterInputStream inflatIP = new InflaterInputStream(infile); 69 70 int i = 0; 71 while ((result = inflatIP.read()) != -1) { 72 buffer[i] = result; 73 i++; 74 } 75 inflatIP.close(); 76 */ 77 } 78 79 /** 80 * java.util.zip.InflaterInputStream#InflaterInputStream(java.io.InputStream, 81 *java.util.zip.Inflater) 82 */ 83 public void test_ConstructorLjava_io_InputStreamLjava_util_zip_Inflater() throws IOException { 84 byte byteArray[] = new byte[100]; 85 InputStream infile = Support_Resources.getStream("hyts_construOD.bin"); 86 Inflater inflate = new Inflater(); 87 InflaterInputStream inflatIP = new InflaterInputStream(infile, 88 inflate); 89 90 inflatIP.read(byteArray, 0, 5);// only suppose to read in 5 bytes 91 inflatIP.close(); 92 } 93 94 /** 95 * java.util.zip.InflaterInputStream#InflaterInputStream(java.io.InputStream, 96 *java.util.zip.Inflater, int) 97 */ 98 public void test_ConstructorLjava_io_InputStreamLjava_util_zip_InflaterI() throws IOException { 99 int result = 0; 100 int buffer[] = new int[500]; 101 InputStream infile = Support_Resources.getStream("hyts_construODI.bin"); 102 Inflater inflate = new Inflater(); 103 InflaterInputStream inflatIP = new InflaterInputStream(infile, 104 inflate, 1); 105 106 int i = 0; 107 while ((result = inflatIP.read()) != -1) { 108 buffer[i] = result; 109 i++; 110 } 111 inflatIP.close(); 112 } 113 114 /** 115 * java.util.zip.InflaterInputStream#InflaterInputStream(java.io.InputStream, 116 *java.util.zip.Inflater, int) 117 */ 118 public void test_ConstructorLjava_io_InputStreamLjava_util_zip_InflaterI_1() throws IOException { 119 InputStream infile = Support_Resources.getStream("hyts_construODI.bin"); 120 Inflater inflate = new Inflater(); 121 InflaterInputStream inflatIP = null; 122 try { 123 inflatIP = new InflaterInputStream(infile, null, 1); 124 fail("NullPointerException expected"); 125 } catch (NullPointerException NPE) { 126 //expected 127 } 128 129 try { 130 inflatIP = new InflaterInputStream(null, inflate, 1); 131 fail("NullPointerException expected"); 132 } catch (NullPointerException NPE) { 133 //expected 134 } 135 136 try { 137 inflatIP = new InflaterInputStream(infile, inflate, -1); 138 fail("IllegalArgumentException expected"); 139 } catch (IllegalArgumentException iae) { 140 //expected 141 } 142 } 143 144 /** 145 * java.util.zip.InflaterInputStream#mark(int) 146 */ 147 public void test_markI() { 148 InputStream is = new ByteArrayInputStream(new byte[10]); 149 InflaterInputStream iis = new InflaterInputStream(is); 150 // mark do nothing, do no check 151 iis.mark(0); 152 iis.mark(-1); 153 iis.mark(10000000); 154 } 155 156 /** 157 * java.util.zip.InflaterInputStream#markSupported() 158 */ 159 public void test_markSupported() { 160 InputStream is = new ByteArrayInputStream(new byte[10]); 161 InflaterInputStream iis = new InflaterInputStream(is); 162 assertFalse(iis.markSupported()); 163 assertTrue(is.markSupported()); 164 } 165 166 /** 167 * java.util.zip.InflaterInputStream#read() 168 */ 169 public void test_read() throws IOException { 170 int result = 0; 171 int buffer[] = new int[500]; 172 byte orgBuffer[] = { 1, 3, 4, 7, 8 }; 173 InputStream infile = Support_Resources 174 .getStream("hyts_construOD.bin"); 175 Inflater inflate = new Inflater(); 176 InflaterInputStream inflatIP = new InflaterInputStream(infile, 177 inflate); 178 179 int i = 0; 180 while ((result = inflatIP.read()) != -1) { 181 buffer[i] = result; 182 i++; 183 } 184 inflatIP.close(); 185 186 for (int j = 0; j < orgBuffer.length; j++) { 187 assertEquals( 188 "original compressed data did not equal decompressed data", 189 orgBuffer[j], buffer[j]); 190 } 191 } 192 193 /** 194 * java.util.zip.InflaterInputStream#read(byte [], int, int) 195 */ 196 public void test_read_LBII() throws IOException { 197 int result = 0; 198 InputStream infile = Support_Resources.getStream("hyts_construOD.bin"); 199 Inflater inflate = new Inflater(); 200 InflaterInputStream inflatIP = new InflaterInputStream(infile, inflate); 201 202 byte[] b = new byte[3]; 203 try { 204 result = inflatIP.read(null, 0, 1); 205 fail("NullPointerException expected"); 206 } catch (NullPointerException npe) { 207 //expected 208 } 209 210 assertEquals(0, inflatIP.read(b, 0, 0)); 211 212 try { 213 result = inflatIP.read(b, 5, 2); //offset higher 214 fail("IndexOutOfBoundsException expected"); 215 } catch (IndexOutOfBoundsException iobe) { 216 //expected 217 } 218 219 inflatIP.close(); 220 try { 221 inflatIP.read(b, 0, 1); //read after close 222 fail("IOException expected"); 223 } catch (IOException ioe) { 224 //expected 225 } 226 } 227 228 public void testAvailableNonEmptySource() throws Exception { 229 // this byte[] is a deflation of these bytes: { 1, 3, 4, 6 } 230 byte[] deflated = { 72, -119, 99, 100, 102, 97, 3, 0, 0, 31, 0, 15, 0 }; 231 InputStream in = new InflaterInputStream(new ByteArrayInputStream(deflated)); 232 // InflaterInputStream.available() returns either 1 or 0, even though 233 // that contradicts the behavior defined in InputStream.available() 234 assertEquals(1, in.read()); 235 assertEquals(1, in.available()); 236 assertEquals(3, in.read()); 237 assertEquals(1, in.available()); 238 assertEquals(4, in.read()); 239 assertEquals(1, in.available()); 240 assertEquals(6, in.read()); 241 assertEquals(0, in.available()); 242 assertEquals(-1, in.read()); 243 assertEquals(-1, in.read()); 244 } 245 246 public void testAvailableSkip() throws Exception { 247 // this byte[] is a deflation of these bytes: { 1, 3, 4, 6 } 248 byte[] deflated = { 72, -119, 99, 100, 102, 97, 3, 0, 0, 31, 0, 15, 0 }; 249 InputStream in = new InflaterInputStream(new ByteArrayInputStream(deflated)); 250 assertEquals(1, in.available()); 251 assertEquals(4, in.skip(4)); 252 assertEquals(0, in.available()); 253 } 254 255 public void testAvailableEmptySource() throws Exception { 256 // this byte[] is a deflation of the empty file 257 byte[] deflated = { 120, -100, 3, 0, 0, 0, 0, 1 }; 258 InputStream in = new InflaterInputStream(new ByteArrayInputStream(deflated)); 259 assertEquals(-1, in.read()); 260 assertEquals(-1, in.read()); 261 assertEquals(0, in.available()); 262 } 263 264 /** 265 * java.util.zip.InflaterInputStream#read(byte[], int, int) 266 */ 267 public void test_read$BII() throws IOException { 268 byte[] test = new byte[507]; 269 for (int i = 0; i < 256; i++) { 270 test[i] = (byte) i; 271 } 272 for (int i = 256; i < test.length; i++) { 273 test[i] = (byte) (256 - i); 274 } 275 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 276 DeflaterOutputStream dos = new DeflaterOutputStream(baos); 277 dos.write(test); 278 dos.close(); 279 InputStream is = new ByteArrayInputStream(baos.toByteArray()); 280 InflaterInputStream iis = new InflaterInputStream(is); 281 byte[] outBuf = new byte[530]; 282 int result = 0; 283 while (true) { 284 result = iis.read(outBuf, 0, 5); 285 if (result == -1) { 286 //"EOF was reached"; 287 break; 288 } 289 } 290 try { 291 iis.read(outBuf, -1, 10); 292 fail("should throw IOOBE."); 293 } catch (IndexOutOfBoundsException e) { 294 // expected; 295 } 296 } 297 298 public void test_read$BII2() throws IOException { 299 File resources = Support_Resources.createTempFolder(); 300 Support_Resources.copyFile(resources, null, "Broken_manifest.jar"); 301 FileInputStream fis = new FileInputStream(new File(resources, 302 "Broken_manifest.jar")); 303 InflaterInputStream iis = new InflaterInputStream(fis); 304 byte[] outBuf = new byte[530]; 305 306 iis.close(); 307 try { 308 iis.read(outBuf, 0, 5); 309 fail("IOException expected"); 310 } catch (IOException ee) { 311 // expected. 312 } 313 } 314 315 public void test_read$BII3() throws IOException { 316 File resources = Support_Resources.createTempFolder(); 317 Support_Resources.copyFile(resources, null, "Broken_manifest.jar"); 318 FileInputStream fis = new FileInputStream(new File(resources, 319 "Broken_manifest.jar")); 320 InflaterInputStream iis = new InflaterInputStream(fis); 321 byte[] outBuf = new byte[530]; 322 323 try { 324 iis.read(); 325 fail("IOException expected."); 326 } catch (IOException ee) { 327 // expected 328 } 329 } 330 331 /** 332 * java.util.zip.InflaterInputStream#reset() 333 */ 334 public void test_reset() { 335 InputStream is = new ByteArrayInputStream(new byte[10]); 336 InflaterInputStream iis = new InflaterInputStream(is); 337 try { 338 iis.reset(); 339 fail("Should throw IOException"); 340 } catch (IOException e) { 341 // correct 342 } 343 } 344 345 /** 346 * java.util.zip.InflaterInputStream#skip(long) 347 */ 348 public void test_skipJ() throws IOException { 349 InputStream is = Support_Resources.getStream("hyts_available.tst"); 350 InflaterInputStream iis = new InflaterInputStream(is); 351 352 // Tests for skipping a negative number of bytes. 353 try { 354 iis.skip(-3); 355 fail("IllegalArgumentException not thrown"); 356 } catch (IllegalArgumentException e) { 357 // Expected 358 } 359 assertEquals("Incorrect Byte Returned.", 5, iis.read()); 360 361 try { 362 iis.skip(Integer.MIN_VALUE); 363 fail("IllegalArgumentException not thrown"); 364 } catch (IllegalArgumentException e) { 365 // Expected 366 } 367 assertEquals("Incorrect Byte Returned.", 4, iis.read()); 368 369 // Test to make sure the correct number of bytes were skipped 370 assertEquals("Incorrect Number Of Bytes Skipped.", 3, iis.skip(3)); 371 372 // Test to see if the number of bytes skipped returned is true. 373 assertEquals("Incorrect Byte Returned.", 7, iis.read()); 374 375 assertEquals("Incorrect Number Of Bytes Skipped.", 0, iis.skip(0)); 376 assertEquals("Incorrect Byte Returned.", 0, iis.read()); 377 378 // Test for skipping more bytes than available in the stream 379 assertEquals("Incorrect Number Of Bytes Skipped.", 2, iis.skip(4)); 380 assertEquals("Incorrect Byte Returned.", -1, iis.read()); 381 iis.close(); 382 } 383 384 /** 385 * java.util.zip.InflaterInputStream#skip(long) 386 */ 387 public void test_skipJ2() throws IOException { 388 int result = 0; 389 int buffer[] = new int[100]; 390 byte orgBuffer[] = { 1, 3, 4, 7, 8 }; 391 392 // testing for negative input to skip 393 InputStream infile = Support_Resources 394 .getStream("hyts_construOD.bin"); 395 Inflater inflate = new Inflater(); 396 InflaterInputStream inflatIP = new InflaterInputStream(infile, 397 inflate, 10); 398 long skip; 399 try { 400 skip = inflatIP.skip(Integer.MIN_VALUE); 401 fail("Expected IllegalArgumentException when skip() is called with negative parameter"); 402 } catch (IllegalArgumentException e) { 403 // Expected 404 } 405 inflatIP.close(); 406 407 // testing for number of bytes greater than input. 408 InputStream infile2 = Support_Resources 409 .getStream("hyts_construOD.bin"); 410 InflaterInputStream inflatIP2 = new InflaterInputStream(infile2); 411 412 // looked at how many bytes the skip skipped. It is 413 // 5 and its supposed to be the entire input stream. 414 415 skip = inflatIP2.skip(Integer.MAX_VALUE); 416 // System.out.println(skip); 417 assertEquals("method skip() returned wrong number of bytes skipped", 418 5, skip); 419 420 // test for skipping of 2 bytes 421 InputStream infile3 = Support_Resources 422 .getStream("hyts_construOD.bin"); 423 InflaterInputStream inflatIP3 = new InflaterInputStream(infile3); 424 skip = inflatIP3.skip(2); 425 assertEquals("the number of bytes returned by skip did not correspond with its input parameters", 426 2, skip); 427 int i = 0; 428 result = 0; 429 while ((result = inflatIP3.read()) != -1) { 430 buffer[i] = result; 431 i++; 432 } 433 inflatIP2.close(); 434 435 for (int j = 2; j < orgBuffer.length; j++) { 436 assertEquals( 437 "original compressed data did not equal decompressed data", 438 orgBuffer[j], buffer[j - 2]); 439 } 440 } 441 442 /** 443 * java.util.zip.InflaterInputStream#available() 444 */ 445 public void test_available() throws IOException { 446 InputStream is = Support_Resources.getStream("hyts_available.tst"); 447 InflaterInputStream iis = new InflaterInputStream(is); 448 449 int available; 450 for (int i = 0; i < 11; i++) { 451 iis.read(); 452 available = iis.available(); 453 if (available == 0) { 454 assertEquals("Expected no more bytes to read", -1, iis.read()); 455 } else { 456 assertEquals("Bytes Available Should Return 1.", 1, available); 457 } 458 } 459 460 iis.close(); 461 try { 462 iis.available(); 463 fail("available after close should throw IOException."); 464 } catch (IOException e) { 465 // Expected 466 } 467 } 468 469 /** 470 * java.util.zip.InflaterInputStream#close() 471 */ 472 public void test_close() throws IOException { 473 InflaterInputStream iin = new InflaterInputStream( 474 new ByteArrayInputStream(new byte[0])); 475 iin.close(); 476 477 // test for exception 478 iin.close(); 479 } 480 } 481