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.tests.java.util.zip;
     19 
     20 import java.io.File;
     21 import java.io.FileOutputStream;
     22 import java.io.IOException;
     23 import java.io.InputStream;
     24 import java.io.OutputStream;
     25 import java.util.Enumeration;
     26 import java.util.zip.ZipEntry;
     27 import java.util.zip.ZipException;
     28 import java.util.zip.ZipFile;
     29 import libcore.io.Streams;
     30 import libcore.java.lang.ref.FinalizationTester;
     31 import tests.support.resource.Support_Resources;
     32 
     33 public class ZipFileTest extends junit.framework.TestCase {
     34 
     35     // the file hyts_zipFile.zip in setup must be included as a resource
     36     private String tempFileName;
     37     private ZipFile zfile;
     38 
     39     /**
     40      * java.util.zip.ZipFile#ZipFile(java.io.File, int)
     41      */
     42     public void test_ConstructorLjava_io_FileI() throws IOException {
     43         zfile.close(); // about to reopen the same temp file
     44 
     45         File file = new File(tempFileName);
     46         ZipFile zip = new ZipFile(file, ZipFile.OPEN_DELETE | ZipFile.OPEN_READ);
     47         zip.close();
     48         assertTrue("Zip should not exist", !file.exists());
     49 
     50         file = new File(tempFileName);
     51         try {
     52             zip = new ZipFile(file, ZipFile.OPEN_READ);
     53             fail("IOException expected");
     54         } catch (IOException ee) {
     55             // expected
     56         }
     57         file = new File(tempFileName);
     58         try {
     59             zip = new ZipFile(file, -1);
     60             fail("IllegalArgumentException expected");
     61         } catch (IllegalArgumentException ee) {
     62             // expected
     63         }
     64     }
     65 
     66     /**
     67      * @throws IOException
     68      * java.util.zip.ZipFile#ZipFile(java.lang.String)
     69      */
     70     public void test_ConstructorLjava_lang_String() throws IOException {
     71         zfile.close(); // about to reopen the same temp file
     72         ZipFile zip = new ZipFile(tempFileName);
     73         zip.close();
     74         File file = File.createTempFile("zip", "tmp");
     75         try {
     76             zip = new ZipFile(file.getAbsolutePath());
     77             fail("ZipException expected");
     78         } catch (ZipException ee) {
     79             // expected
     80         }
     81         file.delete();
     82     }
     83 
     84     protected ZipEntry test_finalize1(ZipFile zip) {
     85         return zip.getEntry("File1.txt");
     86     }
     87 
     88     protected ZipFile test_finalize2(File file) throws IOException {
     89         return new ZipFile(file);
     90     }
     91 
     92     /**
     93      * java.util.zip.ZipFile#finalize()
     94      */
     95     public void test_finalize() throws IOException {
     96         InputStream in = Support_Resources.getStream("hyts_ZipFile.zip");
     97         File file = Support_Resources.createTempFile(".jar");
     98         OutputStream out = new FileOutputStream(file);
     99         int result;
    100         byte[] buf = new byte[4096];
    101         while ((result = in.read(buf)) != -1) {
    102             out.write(buf, 0, result);
    103         }
    104         in.close();
    105         out.close();
    106         /*
    107          * ZipFile zip = new ZipFile(file); ZipEntry entry1 =
    108          * zip.getEntry("File1.txt"); assertNotNull("Did not find entry",
    109          * entry1); entry1 = null; zip = null;
    110          */
    111 
    112         assertNotNull("Did not find entry", test_finalize1(test_finalize2(file)));
    113         FinalizationTester.induceFinalization();
    114         file.delete();
    115         assertTrue("Zip should not exist", !file.exists());
    116     }
    117 
    118     /**
    119      * @throws IOException
    120      * java.util.zip.ZipFile#close()
    121      */
    122     public void test_close() throws IOException {
    123         // Test for method void java.util.zip.ZipFile.close()
    124         File fl = new File(tempFileName);
    125         ZipFile zf = new ZipFile(fl);
    126         InputStream is1 = zf.getInputStream(zf.getEntry("File1.txt"));
    127         InputStream is2 = zf.getInputStream(zf.getEntry("File2.txt"));
    128 
    129         is1.read();
    130         is2.read();
    131 
    132         zf.close();
    133 
    134         try {
    135             is1.read();
    136             fail("IOException expected");
    137         } catch (IOException ee) {
    138             // expected
    139         }
    140 
    141         try {
    142             is2.read();
    143             fail("IOException expected");
    144         } catch (IOException ee) {
    145             // expected
    146         }
    147     }
    148 
    149     /**
    150      * java.util.zip.ZipFile#entries()
    151      */
    152     public void test_entries() throws Exception {
    153         // Test for method java.util.Enumeration java.util.zip.ZipFile.entries()
    154         Enumeration<? extends ZipEntry> enumer = zfile.entries();
    155         int c = 0;
    156         while (enumer.hasMoreElements()) {
    157             ++c;
    158             enumer.nextElement();
    159         }
    160         assertTrue("Incorrect number of entries returned: " + c, c == 6);
    161 
    162         Enumeration<? extends ZipEntry> enumeration = zfile.entries();
    163         zfile.close();
    164         try {
    165             enumeration.nextElement();
    166             fail("did not detect closed file");
    167         } catch (IllegalStateException expected) {
    168         }
    169 
    170         try {
    171             enumeration.hasMoreElements();
    172             fail("did not detect closed file");
    173         } catch (IllegalStateException expected) {
    174         }
    175 
    176         try {
    177             zfile.entries();
    178             fail("did not detect closed file");
    179         } catch (IllegalStateException expected) {
    180         }
    181     }
    182 
    183     /**
    184      * java.util.zip.ZipFile#getEntry(java.lang.String)
    185      */
    186     public void test_getEntryLjava_lang_String() throws IOException {
    187         // Test for method java.util.zip.ZipEntry
    188         // java.util.zip.ZipFile.getEntry(java.lang.String)
    189         java.util.zip.ZipEntry zentry = zfile.getEntry("File1.txt");
    190         assertNotNull("Could not obtain ZipEntry", zentry);
    191         int r;
    192         InputStream in;
    193 
    194         zentry = zfile.getEntry("testdir1/File1.txt");
    195         assertNotNull("Could not obtain ZipEntry: testdir1/File1.txt", zentry);
    196         zentry = zfile.getEntry("testdir1/");
    197         assertNotNull("Could not obtain ZipEntry: testdir1/", zentry);
    198         in = zfile.getInputStream(zentry);
    199         assertNotNull("testdir1/ should not have null input stream", in);
    200         r = in.read();
    201         in.close();
    202         assertEquals("testdir1/ should not contain data", -1, r);
    203 
    204         zentry = zfile.getEntry("testdir1/testdir1");
    205         assertNotNull("Could not obtain ZipEntry: testdir1/testdir1", zentry);
    206         in = zfile.getInputStream(zentry);
    207         byte[] buf = new byte[256];
    208         r = in.read(buf);
    209         in.close();
    210         assertEquals("incorrect contents", "This is also text", new String(buf,
    211                 0, r));
    212     }
    213 
    214     public void test_getEntryLjava_lang_String_AndroidOnly() throws IOException {
    215         java.util.zip.ZipEntry zentry = zfile.getEntry("File1.txt");
    216         assertNotNull("Could not obtain ZipEntry", zentry);
    217         int r;
    218         InputStream in;
    219 
    220         zentry = zfile.getEntry("testdir1");
    221         assertNotNull("Must be able to obtain ZipEntry: testdir1", zentry);
    222         in = zfile.getInputStream(zentry);
    223         /*
    224          * Android delivers empty InputStream, RI no InputStream at all. The
    225          * spec doesn't clarify this, so we need to deal with both situations.
    226          */
    227         int data = -1;
    228         if (in != null) {
    229             data = in.read();
    230             in.close();
    231         }
    232         assertEquals("Must not be able to read directory data", -1, data);
    233     }
    234 
    235     public void test_getEntryLjava_lang_String_Ex() throws IOException {
    236         java.util.zip.ZipEntry zentry = zfile.getEntry("File1.txt");
    237         assertNotNull("Could not obtain ZipEntry", zentry);
    238 
    239         zfile.close();
    240         try {
    241             zfile.getEntry("File2.txt");
    242             fail("IllegalStateException expected");
    243         } catch (IllegalStateException ee) {
    244         }
    245     }
    246 
    247     /**
    248      * @throws IOException
    249      * java.util.zip.ZipFile#getInputStream(java.util.zip.ZipEntry)
    250      */
    251     public void test_getInputStreamLjava_util_zip_ZipEntry() throws IOException {
    252         // Test for method java.io.InputStream
    253         // java.util.zip.ZipFile.getInputStream(java.util.zip.ZipEntry)
    254         ZipEntry zentry = null;
    255         InputStream is = null;
    256         try {
    257             zentry = zfile.getEntry("File1.txt");
    258             is = zfile.getInputStream(zentry);
    259             byte[] rbuf = new byte[1000];
    260             int r;
    261             is.read(rbuf, 0, r = (int) zentry.getSize());
    262             assertEquals("getInputStream read incorrect data", "This is text",
    263                     new String(rbuf, 0, r));
    264         } catch (java.io.IOException e) {
    265             fail("IOException during getInputStream");
    266         } finally {
    267             try {
    268                 is.close();
    269             } catch (java.io.IOException e) {
    270                 fail("Failed to close input stream");
    271             }
    272         }
    273 
    274         zentry = zfile.getEntry("File2.txt");
    275         zfile.close();
    276         try {
    277             is = zfile.getInputStream(zentry);
    278             fail("IllegalStateException expected");
    279         } catch (IllegalStateException ee) {
    280             // expected
    281         }
    282 
    283         // ZipException can not be checked. Stream object returned or null.
    284     }
    285 
    286     /**
    287      * java.util.zip.ZipFile#getName()
    288      */
    289     public void test_getName() {
    290         // Test for method java.lang.String java.util.zip.ZipFile.getName()
    291         assertTrue("Returned incorrect name: " + zfile.getName(), zfile
    292                 .getName().equals(tempFileName));
    293     }
    294 
    295     /**
    296      * @throws IOException
    297      * java.util.zip.ZipFile#size()
    298      */
    299     public void test_size() throws IOException {
    300         assertEquals(6, zfile.size());
    301         zfile.close();
    302         try {
    303             zfile.size();
    304             fail("IllegalStateException expected");
    305         } catch (IllegalStateException expected) {
    306         }
    307     }
    308 
    309     /**
    310      * java.io.InputStream#reset()
    311      */
    312     public void test_reset() throws IOException {
    313         // read an uncompressed entry
    314         ZipEntry zentry = zfile.getEntry("File1.txt");
    315         InputStream is = zfile.getInputStream(zentry);
    316         byte[] rbuf1 = new byte[6];
    317         byte[] rbuf2 = new byte[6];
    318         int r1, r2;
    319         r1 = is.read(rbuf1);
    320         assertEquals(rbuf1.length, r1);
    321         r2 = is.read(rbuf2);
    322         assertEquals(rbuf2.length, r2);
    323 
    324         try {
    325             is.reset();
    326             fail();
    327         } catch (IOException expected) {
    328         }
    329         is.close();
    330 
    331         // read a compressed entry
    332         byte[] rbuf3 = new byte[4185];
    333         ZipEntry zentry2 = zfile.getEntry("File3.txt");
    334         is = zfile.getInputStream(zentry2);
    335         r1 = is.read(rbuf3);
    336         assertEquals(4183, r1);
    337         try {
    338             is.reset();
    339             fail();
    340         } catch (IOException expected) {
    341         }
    342         is.close();
    343 
    344         is = zfile.getInputStream(zentry2);
    345         r1 = is.read(rbuf3, 0, 3000);
    346         assertEquals(3000, r1);
    347         try {
    348             is.reset();
    349             fail();
    350         } catch (IOException expected) {
    351         }
    352         is.close();
    353     }
    354 
    355     /**
    356      * java.io.InputStream#reset()
    357      */
    358     public void test_reset_subtest0() throws IOException {
    359         // read an uncompressed entry
    360         ZipEntry zentry = zfile.getEntry("File1.txt");
    361         InputStream is = zfile.getInputStream(zentry);
    362         byte[] rbuf1 = new byte[12];
    363         byte[] rbuf2 = new byte[12];
    364         int r = is.read(rbuf1, 0, 4);
    365         assertEquals(4, r);
    366         is.mark(0);
    367         r = is.read(rbuf1);
    368         assertEquals(8, r);
    369         assertEquals(-1, is.read());
    370 
    371         try {
    372             is.reset();
    373             fail();
    374         } catch (IOException expected) {
    375         }
    376 
    377         is.close();
    378 
    379         // read a compressed entry
    380         byte[] rbuf3 = new byte[4185];
    381         ZipEntry zentry2 = zfile.getEntry("File3.txt");
    382         is = zfile.getInputStream(zentry2);
    383         r = is.read(rbuf3, 0, 3000);
    384         assertEquals(3000, r);
    385         is.mark(0);
    386         r = is.read(rbuf3);
    387         assertEquals(1183, r);
    388         assertEquals(-1, is.read());
    389 
    390         try {
    391             is.reset();
    392             fail();
    393         } catch (IOException expected) {
    394         }
    395 
    396         is.close();
    397     }
    398 
    399     @Override
    400     protected void setUp() throws IOException {
    401         // Create a local copy of the file since some tests want to alter information.
    402         File tempFile = File.createTempFile("OldZipFileTest", "zip");
    403         tempFileName = tempFile.getAbsolutePath();
    404 
    405 
    406         InputStream is = Support_Resources.getStream("hyts_ZipFile.zip");
    407         FileOutputStream fos = new FileOutputStream(tempFile);
    408         Streams.copy(is, fos);
    409 
    410         is.close();
    411         fos.close();
    412         zfile = new ZipFile(tempFile);
    413     }
    414 
    415     @Override
    416     protected void tearDown() throws IOException {
    417         if (zfile != null) {
    418             zfile.close();
    419         }
    420     }
    421 }
    422