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 package org.apache.harmony.tests.java.util.zip;
     18 
     19 import java.io.ByteArrayInputStream;
     20 import java.io.ByteArrayOutputStream;
     21 import java.io.File;
     22 import java.io.FileInputStream;
     23 import java.io.FileOutputStream;
     24 import java.io.IOException;
     25 import java.io.InputStream;
     26 import java.net.URL;
     27 import java.util.zip.Checksum;
     28 import java.util.zip.GZIPInputStream;
     29 import java.util.zip.GZIPOutputStream;
     30 import libcore.junit.junit3.TestCaseWithRules;
     31 import libcore.junit.util.ResourceLeakageDetector;
     32 import libcore.junit.util.ResourceLeakageDetector.DisableResourceLeakageDetection;
     33 import org.junit.Rule;
     34 import org.junit.rules.TestRule;
     35 import tests.support.resource.Support_Resources;
     36 
     37 public class GZIPInputStreamTest extends TestCaseWithRules {
     38     @Rule
     39     public TestRule guardRule = ResourceLeakageDetector.getRule();
     40 
     41     File resources;
     42 
     43     class TestGZIPInputStream extends GZIPInputStream {
     44         TestGZIPInputStream(InputStream in) throws IOException {
     45             super(in);
     46         }
     47 
     48         TestGZIPInputStream(InputStream in, int size) throws IOException {
     49             super(in, size);
     50         }
     51 
     52         Checksum getChecksum() {
     53             return crc;
     54         }
     55 
     56         boolean endofInput() {
     57             return eos;
     58         }
     59     }
     60 
     61     /**
     62      * @tests java.util.zip.GZIPInputStream#GZIPInputStream(java.io.InputStream)
     63      */
     64     public void test_ConstructorLjava_io_InputStream() {
     65         // test method java.util.zip.GZIPInputStream.constructor
     66         try {
     67             Support_Resources.copyFile(resources, null, "hyts_gInput.txt.gz");
     68             final URL gInput = new File(resources.toString() + "/hyts_gInput.txt.gz").toURL();
     69             TestGZIPInputStream inGZIP = new TestGZIPInputStream(gInput
     70                     .openConnection().getInputStream());
     71             assertNotNull("the constructor for GZIPInputStream is null",
     72                     inGZIP);
     73             assertEquals("the CRC value of the inputStream is not zero", 0, inGZIP
     74                     .getChecksum().getValue());
     75             inGZIP.close();
     76         } catch (IOException e) {
     77             fail(
     78                     "an IO error occured while trying to open the input file");
     79         }
     80     }
     81 
     82     /**
     83      * @tests java.util.zip.GZIPInputStream#GZIPInputStream(java.io.InputStream,
     84      *int)
     85      */
     86     @DisableResourceLeakageDetection(
     87             why = "InflaterInputStream does not clean up the default Inflater created in the"
     88                     + " constructor if the constructor fails; i.e. constructor calls"
     89                     + " this(..., new Inflater(), ...) and that constructor fails but does not know"
     90                     + " that it needs to call Inflater.end() as the caller has no access to it",
     91             bug = "31798154")
     92     public void test_ConstructorLjava_io_InputStreamI() {
     93         // test method java.util.zip.GZIPInputStream.constructorI
     94         try {
     95             Support_Resources.copyFile(resources, null, "hyts_gInput.txt.gz");
     96             final URL gInput = new File(resources.toString() + "/hyts_gInput.txt.gz").toURL();
     97             TestGZIPInputStream inGZIP = new TestGZIPInputStream(gInput
     98                     .openConnection().getInputStream(), 200);
     99             assertNotNull("the constructor for GZIPInputStream is null",
    100                     inGZIP);
    101             assertEquals("the CRC value of the inputStream is not zero", 0, inGZIP
    102                     .getChecksum().getValue());
    103             inGZIP.close();
    104 
    105             try {
    106                 TestGZIPInputStream inGZIP1 = new TestGZIPInputStream(gInput
    107                         .openConnection().getInputStream(), 0);
    108                 fail("IllegalArgumentException expected");
    109             } catch (IllegalArgumentException ioe) {
    110                 //expected
    111             }
    112 
    113             Support_Resources.copyFile(resources, null, "hyts_checkInput.txt");
    114             final URL jarInput = new File(resources.toString() + "/hyts_checkInput.txt").toURL();
    115             try {
    116                 TestGZIPInputStream inGZIP1 = new TestGZIPInputStream(jarInput
    117                         .openConnection().getInputStream(), 200);
    118                 fail("IOException expected");
    119             } catch (IOException ex) {
    120                 //expected
    121             }
    122 
    123         } catch (IOException e) {
    124             fail(
    125                     "an IO error occured while trying to open the input file");
    126         }
    127     }
    128 
    129     /**
    130      * @tests java.util.zip.GZIPInputStream#read(byte[], int, int)
    131      */
    132     public void test_read$BII() throws IOException {
    133         // test method java.util.zip.GZIPInputStream.readBII
    134         byte orgBuf[] = { '3', '5', '2', 'r', 'g', 'e', 'f', 'd', 'e', 'w' };
    135         byte outBuf[] = new byte[100];
    136         int result = 0;
    137         Support_Resources.copyFile(resources, null, "hyts_gInput.txt.gz");
    138         final URL gInput = new File(resources.toString() + "/hyts_gInput.txt.gz").toURL();
    139         TestGZIPInputStream inGZIP = new TestGZIPInputStream(gInput
    140                 .openConnection().getInputStream());
    141         while (!(inGZIP.endofInput())) {
    142             result += inGZIP.read(outBuf, result, outBuf.length - result);
    143         }
    144         assertEquals(
    145                 "the checkSum value of the compressed and decompressed data does not equal",
    146                 2074883667L, inGZIP.getChecksum().getValue());
    147         for (int i = 0; i < orgBuf.length; i++) {
    148             assertEquals(
    149                     "the decompressed data does not equal the original data decompressed",
    150                     orgBuf[i], outBuf[i]);
    151             // System.out.println(orgBuf[i] + " " + outBuf[i]);
    152         }
    153         int r = 0;
    154         try {
    155             inGZIP.read(outBuf, 100, 1);
    156         } catch (IndexOutOfBoundsException e) {
    157             r = 1;
    158         }
    159         inGZIP.close();
    160         // line below fails on RI also, comment out.
    161         // assertEquals("Boundary Check was not present", 1, r);
    162 
    163         // Create compressed data which is exactly 512 bytes (after the
    164         // header),
    165         // the size of the InflaterStream internal buffer
    166         byte[] test = new byte[507];
    167         for (int i = 0; i < 256; i++) {
    168             test[i] = (byte) i;
    169         }
    170         for (int i = 256; i < test.length; i++) {
    171             test[i] = (byte) (256 - i);
    172         }
    173         ByteArrayOutputStream bout = new ByteArrayOutputStream();
    174         GZIPOutputStream out = new GZIPOutputStream(bout);
    175         out.write(test);
    176         out.close();
    177         byte[] comp = bout.toByteArray();
    178         int total;
    179         try (GZIPInputStream gin2 = new GZIPInputStream(new ByteArrayInputStream(comp), 512)) {
    180             total = 0;
    181             while ((result = gin2.read(test)) != -1) {
    182                 total += result;
    183             }
    184             assertEquals("Should return -1", -1, gin2.read());
    185         }
    186         assertEquals("Incorrectly decompressed", test.length, total);
    187 
    188         try (GZIPInputStream gin2 = new GZIPInputStream(new ByteArrayInputStream(comp), 512)) {
    189             total = 0;
    190             while ((result = gin2.read(new byte[200])) != -1) {
    191                 total += result;
    192             }
    193             assertEquals("Should return -1", -1, gin2.read());
    194         }
    195         assertEquals("Incorrectly decompressed", test.length, total);
    196 
    197         try (GZIPInputStream gin2 = new GZIPInputStream(new ByteArrayInputStream(comp), 516)) {
    198             total = 0;
    199             while ((result = gin2.read(new byte[200])) != -1) {
    200                 total += result;
    201             }
    202             assertEquals("Should return -1", -1, gin2.read());
    203         }
    204         assertEquals("Incorrectly decompressed", test.length, total);
    205 
    206         comp[40] = 0;
    207         try (GZIPInputStream gin2 = new GZIPInputStream(new ByteArrayInputStream(comp), 512)) {
    208             boolean exception = false;
    209             try {
    210                 while (gin2.read(test) != -1) {
    211                     ;
    212                 }
    213             } catch (IOException e) {
    214                 exception = true;
    215             }
    216             assertTrue("Exception expected", exception);
    217         }
    218 
    219         ByteArrayOutputStream baos = new ByteArrayOutputStream();
    220         try (GZIPOutputStream zipout = new GZIPOutputStream(baos)) {
    221             zipout.write(test);
    222         }
    223         outBuf = new byte[530];
    224         try (GZIPInputStream in = new GZIPInputStream(
    225                 new ByteArrayInputStream(baos.toByteArray()))) {
    226             try {
    227                 in.read(outBuf, 530, 1);
    228                 fail("Test failed IOOBE was not thrown");
    229             } catch (IndexOutOfBoundsException e) {
    230             }
    231             while (true) {
    232                 result = in.read(outBuf, 0, 5);
    233                 if (result == -1) {
    234                     //"EOF was reached";
    235                     break;
    236                 }
    237             }
    238             result = -10;
    239             result = in.read(null, 100, 1);
    240             result = in.read(outBuf, -100, 1);
    241             result = in.read(outBuf, -1, 1);// 100, 1);
    242         }
    243     }
    244 
    245     /**
    246      * @tests java.util.zip.GZIPInputStream#close()
    247      */
    248     public void test_close() {
    249         // test method java.util.zip.GZIPInputStream.close
    250         byte outBuf[] = new byte[100];
    251         try {
    252             int result = 0;
    253             Support_Resources.copyFile(resources, null, "hyts_gInput.txt.gz");
    254             final URL gInput = new File(resources.toString() + "/hyts_gInput.txt.gz").toURL();
    255             TestGZIPInputStream inGZIP = new TestGZIPInputStream(gInput
    256                     .openConnection().getInputStream());
    257             while (!(inGZIP.endofInput())) {
    258                 result += inGZIP.read(outBuf, result, outBuf.length - result);
    259             }
    260             assertEquals("the checkSum value of the compressed and decompressed data does not equal",
    261                     2074883667L, inGZIP.getChecksum().getValue());
    262             inGZIP.close();
    263             int r = 0;
    264             try {
    265                 inGZIP.read(outBuf, 0, 1);
    266             } catch (IOException e) {
    267                 r = 1;
    268             }
    269             assertEquals("GZIPInputStream can still be used after close is called",
    270                     1, r);
    271         } catch (IOException e) {
    272             e.printStackTrace();
    273             fail("unexpected: " + e);
    274         }
    275     }
    276 
    277     /**
    278      * Regression test for HARMONY-3703.
    279      *
    280      * @tests java.util.zip.GZIPInputStream#read()
    281      */
    282     public void test_read() throws IOException {
    283         int result = 0;
    284         byte[] buffer = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    285         File f = new File(resources.getAbsolutePath() + "test.gz");
    286         FileOutputStream out = new FileOutputStream(f);
    287         GZIPOutputStream gout = new GZIPOutputStream(out);
    288 
    289         // write 100 bytes to the stream
    290         for (int i = 0; i < 10; i++) {
    291             gout.write(buffer);
    292         }
    293         gout.finish();
    294         out.write(1);
    295         out.close();
    296         gout.close();
    297 
    298         GZIPInputStream gis = new GZIPInputStream(new FileInputStream(f));
    299         buffer = new byte[100];
    300         gis.read(buffer);
    301         result = gis.read();
    302         gis.close();
    303         f.delete();
    304 
    305         assertEquals("Incorrect value returned at the end of the file", -1, result);
    306     }
    307 
    308     @Override
    309     protected void setUp() {
    310         resources = Support_Resources.createTempFolder();
    311     }
    312 
    313     @Override
    314     protected void tearDown() {
    315     }
    316 
    317 }
    318