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 
     19 package org.apache.commons.compress.archivers.zip;
     20 
     21 import static org.apache.commons.compress.AbstractTestCase.getFile;
     22 import static org.junit.Assert.*;
     23 
     24 import java.io.ByteArrayOutputStream;
     25 import java.util.zip.ZipEntry;
     26 
     27 import org.junit.Test;
     28 
     29 /**
     30  * JUnit testcases for org.apache.commons.compress.archivers.zip.ZipEntry.
     31  *
     32  */
     33 public class ZipArchiveEntryTest {
     34 
     35     /**
     36      * test handling of extra fields
     37      */
     38     @Test
     39     public void testExtraFields() {
     40         final AsiExtraField a = new AsiExtraField();
     41         a.setDirectory(true);
     42         a.setMode(0755);
     43         final UnrecognizedExtraField u = new UnrecognizedExtraField();
     44         u.setHeaderId(ExtraFieldUtilsTest.UNRECOGNIZED_HEADER);
     45         u.setLocalFileDataData(new byte[0]);
     46 
     47         final ZipArchiveEntry ze = new ZipArchiveEntry("test/");
     48         ze.setExtraFields(new ZipExtraField[] {a, u});
     49         final byte[] data1 = ze.getExtra();
     50         ZipExtraField[] result = ze.getExtraFields();
     51         assertEquals("first pass", 2, result.length);
     52         assertSame(a, result[0]);
     53         assertSame(u, result[1]);
     54 
     55         final UnrecognizedExtraField u2 = new UnrecognizedExtraField();
     56         u2.setHeaderId(ExtraFieldUtilsTest.UNRECOGNIZED_HEADER);
     57         u2.setLocalFileDataData(new byte[] {1});
     58 
     59         ze.addExtraField(u2);
     60         final byte[] data2 = ze.getExtra();
     61         result = ze.getExtraFields();
     62         assertEquals("second pass", 2, result.length);
     63         assertSame(a, result[0]);
     64         assertSame(u2, result[1]);
     65         assertEquals("length second pass", data1.length+1, data2.length);
     66 
     67         final UnrecognizedExtraField u3 = new UnrecognizedExtraField();
     68         u3.setHeaderId(new ZipShort(2));
     69         u3.setLocalFileDataData(new byte[] {1});
     70         ze.addExtraField(u3);
     71         result = ze.getExtraFields();
     72         assertEquals("third pass", 3, result.length);
     73 
     74         ze.removeExtraField(ExtraFieldUtilsTest.UNRECOGNIZED_HEADER);
     75         final byte[] data3 = ze.getExtra();
     76         result = ze.getExtraFields();
     77         assertEquals("fourth pass", 2, result.length);
     78         assertSame(a, result[0]);
     79         assertSame(u3, result[1]);
     80         assertEquals("length fourth pass", data2.length, data3.length);
     81 
     82         try {
     83             ze.removeExtraField(ExtraFieldUtilsTest.UNRECOGNIZED_HEADER);
     84             fail("should be no such element");
     85         } catch (final java.util.NoSuchElementException nse) {
     86         }
     87     }
     88 
     89     /**
     90      * test handling of extra fields via central directory
     91      */
     92     @Test
     93     public void testExtraFieldMerging() {
     94         final AsiExtraField a = new AsiExtraField();
     95         a.setDirectory(true);
     96         a.setMode(0755);
     97         final UnrecognizedExtraField u = new UnrecognizedExtraField();
     98         u.setHeaderId(ExtraFieldUtilsTest.UNRECOGNIZED_HEADER);
     99         u.setLocalFileDataData(new byte[0]);
    100 
    101         final ZipArchiveEntry ze = new ZipArchiveEntry("test/");
    102         ze.setExtraFields(new ZipExtraField[] {a, u});
    103 
    104         // merge
    105         // Header-ID 1 + length 1 + one byte of data
    106         final byte[] b = ExtraFieldUtilsTest.UNRECOGNIZED_HEADER.getBytes();
    107         ze.setCentralDirectoryExtra(new byte[] {b[0], b[1], 1, 0, 127});
    108 
    109         ZipExtraField[] result = ze.getExtraFields();
    110         assertEquals("first pass", 2, result.length);
    111         assertSame(a, result[0]);
    112         assertEquals(ExtraFieldUtilsTest.UNRECOGNIZED_HEADER,
    113                      result[1].getHeaderId());
    114         assertEquals(new ZipShort(0), result[1].getLocalFileDataLength());
    115         assertEquals(new ZipShort(1), result[1].getCentralDirectoryLength());
    116 
    117         // add new
    118         // Header-ID 2 + length 0
    119         ze.setCentralDirectoryExtra(new byte[] {2, 0, 0, 0});
    120 
    121         result = ze.getExtraFields();
    122         assertEquals("second pass", 3, result.length);
    123 
    124         // merge
    125         // Header-ID 2 + length 1 + one byte of data
    126         ze.setExtra(new byte[] {2, 0, 1, 0, 127});
    127 
    128         result = ze.getExtraFields();
    129         assertEquals("third pass", 3, result.length);
    130         assertSame(a, result[0]);
    131         assertEquals(new ZipShort(2), result[2].getHeaderId());
    132         assertEquals(new ZipShort(1), result[2].getLocalFileDataLength());
    133         assertEquals(new ZipShort(0), result[2].getCentralDirectoryLength());
    134     }
    135 
    136     /**
    137      * test handling of extra fields
    138      */
    139     @Test
    140     public void testAddAsFirstExtraField() {
    141         final AsiExtraField a = new AsiExtraField();
    142         a.setDirectory(true);
    143         a.setMode(0755);
    144         final UnrecognizedExtraField u = new UnrecognizedExtraField();
    145         u.setHeaderId(ExtraFieldUtilsTest.UNRECOGNIZED_HEADER);
    146         u.setLocalFileDataData(new byte[0]);
    147 
    148         final ZipArchiveEntry ze = new ZipArchiveEntry("test/");
    149         ze.setExtraFields(new ZipExtraField[] {a, u});
    150         final byte[] data1 = ze.getExtra();
    151 
    152         final UnrecognizedExtraField u2 = new UnrecognizedExtraField();
    153         u2.setHeaderId(ExtraFieldUtilsTest.UNRECOGNIZED_HEADER);
    154         u2.setLocalFileDataData(new byte[] {1});
    155 
    156         ze.addAsFirstExtraField(u2);
    157         final byte[] data2 = ze.getExtra();
    158         ZipExtraField[] result = ze.getExtraFields();
    159         assertEquals("second pass", 2, result.length);
    160         assertSame(u2, result[0]);
    161         assertSame(a, result[1]);
    162         assertEquals("length second pass", data1.length + 1, data2.length);
    163 
    164         final UnrecognizedExtraField u3 = new UnrecognizedExtraField();
    165         u3.setHeaderId(new ZipShort(2));
    166         u3.setLocalFileDataData(new byte[] {1});
    167         ze.addAsFirstExtraField(u3);
    168         result = ze.getExtraFields();
    169         assertEquals("third pass", 3, result.length);
    170         assertSame(u3, result[0]);
    171         assertSame(u2, result[1]);
    172         assertSame(a, result[2]);
    173     }
    174 
    175     @Test
    176     public void testUnixMode() {
    177         ZipArchiveEntry ze = new ZipArchiveEntry("foo");
    178         assertEquals(0, ze.getPlatform());
    179         ze.setUnixMode(0755);
    180         assertEquals(3, ze.getPlatform());
    181         assertEquals(0755,
    182                      (ze.getExternalAttributes() >> 16) & 0xFFFF);
    183         assertEquals(0, ze.getExternalAttributes()  & 0xFFFF);
    184 
    185         ze.setUnixMode(0444);
    186         assertEquals(3, ze.getPlatform());
    187         assertEquals(0444,
    188                      (ze.getExternalAttributes() >> 16) & 0xFFFF);
    189         assertEquals(1, ze.getExternalAttributes()  & 0xFFFF);
    190 
    191         ze = new ZipArchiveEntry("foo/");
    192         assertEquals(0, ze.getPlatform());
    193         ze.setUnixMode(0777);
    194         assertEquals(3, ze.getPlatform());
    195         assertEquals(0777,
    196                      (ze.getExternalAttributes() >> 16) & 0xFFFF);
    197         assertEquals(0x10, ze.getExternalAttributes()  & 0xFFFF);
    198 
    199         ze.setUnixMode(0577);
    200         assertEquals(3, ze.getPlatform());
    201         assertEquals(0577,
    202                      (ze.getExternalAttributes() >> 16) & 0xFFFF);
    203         assertEquals(0x11, ze.getExternalAttributes()  & 0xFFFF);
    204     }
    205 
    206     /**
    207      * Test case for
    208      * <a href="https://issues.apache.org/jira/browse/COMPRESS-93"
    209      * >COMPRESS-93</a>.
    210      */
    211     @Test
    212     public void testCompressionMethod() throws Exception {
    213         final ZipArchiveOutputStream zos =
    214             new ZipArchiveOutputStream(new ByteArrayOutputStream());
    215         final ZipArchiveEntry entry = new ZipArchiveEntry("foo");
    216         assertEquals(-1, entry.getMethod());
    217         assertFalse(zos.canWriteEntryData(entry));
    218 
    219         entry.setMethod(ZipEntry.STORED);
    220         assertEquals(ZipEntry.STORED, entry.getMethod());
    221         assertTrue(zos.canWriteEntryData(entry));
    222 
    223         entry.setMethod(ZipEntry.DEFLATED);
    224         assertEquals(ZipEntry.DEFLATED, entry.getMethod());
    225         assertTrue(zos.canWriteEntryData(entry));
    226 
    227         // Test the unsupported "imploded" compression method (6)
    228         entry.setMethod(6);
    229         assertEquals(6, entry.getMethod());
    230         assertFalse(zos.canWriteEntryData(entry));
    231         zos.close();
    232     }
    233 
    234     /**
    235      * Test case for
    236      * <a href="https://issues.apache.org/jira/browse/COMPRESS-94"
    237      * >COMPRESS-94</a>.
    238      */
    239     @Test
    240     public void testNotEquals() {
    241         final ZipArchiveEntry entry1 = new ZipArchiveEntry("foo");
    242         final ZipArchiveEntry entry2 = new ZipArchiveEntry("bar");
    243         assertFalse(entry1.equals(entry2));
    244     }
    245 
    246     /**
    247      * Tests comment's influence on equals comparisons.
    248      * @see "https://issues.apache.org/jira/browse/COMPRESS-187"
    249      */
    250     @Test
    251     public void testNullCommentEqualsEmptyComment() {
    252         final ZipArchiveEntry entry1 = new ZipArchiveEntry("foo");
    253         final ZipArchiveEntry entry2 = new ZipArchiveEntry("foo");
    254         final ZipArchiveEntry entry3 = new ZipArchiveEntry("foo");
    255         entry1.setComment(null);
    256         entry2.setComment("");
    257         entry3.setComment("bar");
    258         assertEquals(entry1, entry2);
    259         assertFalse(entry1.equals(entry3));
    260         assertFalse(entry2.equals(entry3));
    261     }
    262 
    263     @Test
    264     public void testCopyConstructor() throws Exception {
    265         final ZipArchiveEntry archiveEntry = new ZipArchiveEntry("fred");
    266         archiveEntry.setUnixMode(0664);
    267         archiveEntry.setMethod(ZipEntry.DEFLATED);
    268         archiveEntry.getGeneralPurposeBit().useStrongEncryption(true);
    269         final ZipArchiveEntry copy = new ZipArchiveEntry(archiveEntry);
    270         assertEquals(archiveEntry, copy);
    271     }
    272 
    273     /**
    274      * @see "https://issues.apache.org/jira/browse/COMPRESS-379"
    275      */
    276     @Test
    277     public void isUnixSymlinkIsFalseIfMoreThanOneFlagIsSet() throws Exception {
    278         try (ZipFile zf = new ZipFile(getFile("COMPRESS-379.jar"))) {
    279             ZipArchiveEntry ze = zf.getEntry("META-INF/maven/");
    280             assertFalse(ze.isUnixSymlink());
    281         }
    282     }
    283 
    284     @Test
    285     public void testIsUnixSymlink() {
    286         ZipArchiveEntry ze = new ZipArchiveEntry("foo");
    287         ze.setUnixMode(UnixStat.LINK_FLAG);
    288         assertTrue(ze.isUnixSymlink());
    289         ze.setUnixMode(UnixStat.LINK_FLAG | UnixStat.DIR_FLAG);
    290         assertFalse(ze.isUnixSymlink());
    291     }
    292 
    293 }
    294