View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   https://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  
20  package org.apache.commons.compress.archivers.zip;
21  
22  import static org.junit.jupiter.api.Assertions.assertEquals;
23  import static org.junit.jupiter.api.Assertions.assertNull;
24  
25  import java.math.BigInteger;
26  import java.util.zip.ZipException;
27  
28  import org.junit.jupiter.api.Test;
29  
30  class Zip64ExtendedInformationExtraFieldTest {
31  
32      private static final ZipEightByteInteger SIZE = new ZipEightByteInteger(0x12345678);
33      private static final ZipEightByteInteger CSIZE = new ZipEightByteInteger(0x9ABCDEF);
34      private static final ZipEightByteInteger OFF = new ZipEightByteInteger(BigInteger.valueOf(0xABCDEF091234567L).shiftLeft(4).setBit(3));
35      private static final ZipLong DISK = new ZipLong(0x12);
36  
37      private static void checkDisk(final byte[] b, final int off) {
38          assertEquals(0x12, b[0 + off]);
39          assertEquals(0x00, b[1 + off]);
40          assertEquals(0x00, b[2 + off]);
41          assertEquals(0x00, b[3 + off]);
42      }
43  
44      private static void checkOffset(final byte[] b, final int off) {
45          assertEquals(0x78, b[0 + off]);
46          assertEquals(0x56, b[1 + off]);
47          assertEquals(0x34, b[2 + off]);
48          assertEquals(0x12, b[3 + off]);
49          assertEquals((byte) 0x09, b[4 + off]);
50          assertEquals((byte) 0xEF, b[5 + off]);
51          assertEquals((byte) 0xCD, b[6 + off]);
52          assertEquals((byte) 0xAB, b[7 + off]);
53      }
54  
55      private static void checkSizes(final byte[] b) {
56          assertEquals(0x78, b[0]);
57          assertEquals(0x56, b[1]);
58          assertEquals(0x34, b[2]);
59          assertEquals(0x12, b[3]);
60          assertEquals(0x00, b[4]);
61          assertEquals(0x00, b[5]);
62          assertEquals(0x00, b[6]);
63          assertEquals(0x00, b[7]);
64          assertEquals((byte) 0xEF, b[8]);
65          assertEquals((byte) 0xCD, b[9]);
66          assertEquals((byte) 0xAB, b[10]);
67          assertEquals(0x09, b[11]);
68          assertEquals(0x00, b[12]);
69          assertEquals(0x00, b[13]);
70          assertEquals(0x00, b[14]);
71          assertEquals(0x00, b[15]);
72      }
73  
74      @Test
75      void testReadCDSizesAndOffset() throws ZipException {
76          final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
77          final byte[] b = new byte[24];
78          System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
79          System.arraycopy(CSIZE.getBytes(), 0, b, 8, 8);
80          System.arraycopy(OFF.getBytes(), 0, b, 16, 8);
81          f.parseFromCentralDirectoryData(b, 0, b.length);
82          assertEquals(SIZE, f.getSize());
83          assertEquals(CSIZE, f.getCompressedSize());
84          assertEquals(OFF, f.getRelativeHeaderOffset());
85          assertNull(f.getDiskStartNumber());
86      }
87  
88      @Test
89      void testReadCDSizesOffsetAndDisk() throws ZipException {
90          final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
91          final byte[] b = new byte[28];
92          System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
93          System.arraycopy(CSIZE.getBytes(), 0, b, 8, 8);
94          System.arraycopy(OFF.getBytes(), 0, b, 16, 8);
95          System.arraycopy(DISK.getBytes(), 0, b, 24, 4);
96          f.parseFromCentralDirectoryData(b, 0, b.length);
97          assertEquals(SIZE, f.getSize());
98          assertEquals(CSIZE, f.getCompressedSize());
99          assertEquals(OFF, f.getRelativeHeaderOffset());
100         assertEquals(DISK, f.getDiskStartNumber());
101     }
102 
103     @Test
104     void testReadCDSomethingAndDisk() throws ZipException {
105         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
106         final byte[] b = new byte[12];
107         System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
108         System.arraycopy(DISK.getBytes(), 0, b, 8, 4);
109         f.parseFromCentralDirectoryData(b, 0, b.length);
110         assertNull(f.getSize());
111         assertNull(f.getCompressedSize());
112         assertNull(f.getRelativeHeaderOffset());
113         assertEquals(DISK, f.getDiskStartNumber());
114     }
115 
116     @Test
117     void testReadLFHSizesAndDisk() throws ZipException {
118         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
119         final byte[] b = new byte[20];
120         System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
121         System.arraycopy(CSIZE.getBytes(), 0, b, 8, 8);
122         System.arraycopy(DISK.getBytes(), 0, b, 16, 4);
123         f.parseFromLocalFileData(b, 0, b.length);
124         assertEquals(SIZE, f.getSize());
125         assertEquals(CSIZE, f.getCompressedSize());
126         assertNull(f.getRelativeHeaderOffset());
127         assertEquals(DISK, f.getDiskStartNumber());
128     }
129 
130     @Test
131     void testReadLFHSizesAndOffset() throws ZipException {
132         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
133         final byte[] b = new byte[24];
134         System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
135         System.arraycopy(CSIZE.getBytes(), 0, b, 8, 8);
136         System.arraycopy(OFF.getBytes(), 0, b, 16, 8);
137         f.parseFromLocalFileData(b, 0, b.length);
138         assertEquals(SIZE, f.getSize());
139         assertEquals(CSIZE, f.getCompressedSize());
140         assertEquals(OFF, f.getRelativeHeaderOffset());
141         assertNull(f.getDiskStartNumber());
142     }
143 
144     @Test
145     void testReadLFHSizesOffsetAndDisk() throws ZipException {
146         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
147         final byte[] b = new byte[28];
148         System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
149         System.arraycopy(CSIZE.getBytes(), 0, b, 8, 8);
150         System.arraycopy(OFF.getBytes(), 0, b, 16, 8);
151         System.arraycopy(DISK.getBytes(), 0, b, 24, 4);
152         f.parseFromLocalFileData(b, 0, b.length);
153         assertEquals(SIZE, f.getSize());
154         assertEquals(CSIZE, f.getCompressedSize());
155         assertEquals(OFF, f.getRelativeHeaderOffset());
156         assertEquals(DISK, f.getDiskStartNumber());
157     }
158 
159     @Test
160     void testReadLFHSizesOnly() throws ZipException {
161         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
162         final byte[] b = new byte[16];
163         System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
164         System.arraycopy(CSIZE.getBytes(), 0, b, 8, 8);
165         f.parseFromLocalFileData(b, 0, b.length);
166         assertEquals(SIZE, f.getSize());
167         assertEquals(CSIZE, f.getCompressedSize());
168         assertNull(f.getRelativeHeaderOffset());
169         assertNull(f.getDiskStartNumber());
170     }
171 
172     @Test
173     void testReparseCDSingleEightByteData() throws ZipException {
174         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
175         final byte[] b = new byte[8];
176         System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
177         f.parseFromCentralDirectoryData(b, 0, b.length);
178         f.reparseCentralDirectoryData(true, false, false, false);
179         assertEquals(SIZE, f.getSize());
180         assertNull(f.getCompressedSize());
181         assertNull(f.getRelativeHeaderOffset());
182         assertNull(f.getDiskStartNumber());
183         f.setSize(null);
184         f.reparseCentralDirectoryData(false, true, false, false);
185         assertNull(f.getSize());
186         assertEquals(SIZE, f.getCompressedSize());
187         assertNull(f.getRelativeHeaderOffset());
188         assertNull(f.getDiskStartNumber());
189         f.setCompressedSize(null);
190         f.reparseCentralDirectoryData(false, false, true, false);
191         assertNull(f.getSize());
192         assertNull(f.getCompressedSize());
193         assertEquals(SIZE, f.getRelativeHeaderOffset());
194         assertNull(f.getDiskStartNumber());
195     }
196 
197     @Test
198     void testWriteCDOnlySizes() {
199         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField(SIZE, CSIZE);
200         assertEquals(new ZipShort(16), f.getCentralDirectoryLength());
201         final byte[] b = f.getCentralDirectoryData();
202         assertEquals(16, b.length);
203         checkSizes(b);
204     }
205 
206     @Test
207     void testWriteCDSizeAndDisk() {
208         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField(SIZE, CSIZE, null, DISK);
209         assertEquals(new ZipShort(20), f.getCentralDirectoryLength());
210         final byte[] b = f.getCentralDirectoryData();
211         assertEquals(20, b.length);
212         checkSizes(b);
213         checkDisk(b, 16);
214     }
215 
216     @Test
217     void testWriteCDSizeAndOffset() {
218         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField(SIZE, CSIZE, OFF, null);
219         assertEquals(new ZipShort(24), f.getCentralDirectoryLength());
220         final byte[] b = f.getCentralDirectoryData();
221         assertEquals(24, b.length);
222         checkSizes(b);
223         checkOffset(b, 16);
224     }
225 
226     @Test
227     void testWriteCDSizeOffsetAndDisk() {
228         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField(SIZE, CSIZE, OFF, DISK);
229         assertEquals(new ZipShort(28), f.getCentralDirectoryLength());
230         final byte[] b = f.getCentralDirectoryData();
231         assertEquals(28, b.length);
232         checkSizes(b);
233         checkOffset(b, 16);
234         checkDisk(b, 24);
235     }
236 }