View Javadoc
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.commons.compress.archivers.zip;
19  
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  import static org.junit.jupiter.api.Assertions.assertNull;
22  
23  import java.math.BigInteger;
24  import java.util.zip.ZipException;
25  
26  import org.junit.jupiter.api.Test;
27  
28  public class Zip64ExtendedInformationExtraFieldTest {
29  
30      private static final ZipEightByteInteger SIZE = new ZipEightByteInteger(0x12345678);
31      private static final ZipEightByteInteger CSIZE = new ZipEightByteInteger(0x9ABCDEF);
32      private static final ZipEightByteInteger OFF = new ZipEightByteInteger(BigInteger.valueOf(0xABCDEF091234567L).shiftLeft(4).setBit(3));
33      private static final ZipLong DISK = new ZipLong(0x12);
34  
35      private static void checkDisk(final byte[] b, final int off) {
36          assertEquals(0x12, b[0 + off]);
37          assertEquals(0x00, b[1 + off]);
38          assertEquals(0x00, b[2 + off]);
39          assertEquals(0x00, b[3 + off]);
40      }
41  
42      private static void checkOffset(final byte[] b, final int off) {
43          assertEquals(0x78, b[0 + off]);
44          assertEquals(0x56, b[1 + off]);
45          assertEquals(0x34, b[2 + off]);
46          assertEquals(0x12, b[3 + off]);
47          assertEquals((byte) 0x09, b[4 + off]);
48          assertEquals((byte) 0xEF, b[5 + off]);
49          assertEquals((byte) 0xCD, b[6 + off]);
50          assertEquals((byte) 0xAB, b[7 + off]);
51      }
52  
53      private static void checkSizes(final byte[] b) {
54          assertEquals(0x78, b[0]);
55          assertEquals(0x56, b[1]);
56          assertEquals(0x34, b[2]);
57          assertEquals(0x12, b[3]);
58          assertEquals(0x00, b[4]);
59          assertEquals(0x00, b[5]);
60          assertEquals(0x00, b[6]);
61          assertEquals(0x00, b[7]);
62          assertEquals((byte) 0xEF, b[8]);
63          assertEquals((byte) 0xCD, b[9]);
64          assertEquals((byte) 0xAB, b[10]);
65          assertEquals(0x09, b[11]);
66          assertEquals(0x00, b[12]);
67          assertEquals(0x00, b[13]);
68          assertEquals(0x00, b[14]);
69          assertEquals(0x00, b[15]);
70      }
71  
72      @Test
73      public void testReadCDSizesAndOffset() throws ZipException {
74          final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
75          final byte[] b = new byte[24];
76          System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
77          System.arraycopy(CSIZE.getBytes(), 0, b, 8, 8);
78          System.arraycopy(OFF.getBytes(), 0, b, 16, 8);
79          f.parseFromCentralDirectoryData(b, 0, b.length);
80          assertEquals(SIZE, f.getSize());
81          assertEquals(CSIZE, f.getCompressedSize());
82          assertEquals(OFF, f.getRelativeHeaderOffset());
83          assertNull(f.getDiskStartNumber());
84      }
85  
86      @Test
87      public void testReadCDSizesOffsetAndDisk() throws ZipException {
88          final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
89          final byte[] b = new byte[28];
90          System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
91          System.arraycopy(CSIZE.getBytes(), 0, b, 8, 8);
92          System.arraycopy(OFF.getBytes(), 0, b, 16, 8);
93          System.arraycopy(DISK.getBytes(), 0, b, 24, 4);
94          f.parseFromCentralDirectoryData(b, 0, b.length);
95          assertEquals(SIZE, f.getSize());
96          assertEquals(CSIZE, f.getCompressedSize());
97          assertEquals(OFF, f.getRelativeHeaderOffset());
98          assertEquals(DISK, f.getDiskStartNumber());
99      }
100 
101     @Test
102     public void testReadCDSomethingAndDisk() throws ZipException {
103         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
104         final byte[] b = new byte[12];
105         System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
106         System.arraycopy(DISK.getBytes(), 0, b, 8, 4);
107         f.parseFromCentralDirectoryData(b, 0, b.length);
108         assertNull(f.getSize());
109         assertNull(f.getCompressedSize());
110         assertNull(f.getRelativeHeaderOffset());
111         assertEquals(DISK, f.getDiskStartNumber());
112     }
113 
114     @Test
115     public void testReadLFHSizesAndDisk() throws ZipException {
116         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
117         final byte[] b = new byte[20];
118         System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
119         System.arraycopy(CSIZE.getBytes(), 0, b, 8, 8);
120         System.arraycopy(DISK.getBytes(), 0, b, 16, 4);
121         f.parseFromLocalFileData(b, 0, b.length);
122         assertEquals(SIZE, f.getSize());
123         assertEquals(CSIZE, f.getCompressedSize());
124         assertNull(f.getRelativeHeaderOffset());
125         assertEquals(DISK, f.getDiskStartNumber());
126     }
127 
128     @Test
129     public void testReadLFHSizesAndOffset() throws ZipException {
130         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
131         final byte[] b = new byte[24];
132         System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
133         System.arraycopy(CSIZE.getBytes(), 0, b, 8, 8);
134         System.arraycopy(OFF.getBytes(), 0, b, 16, 8);
135         f.parseFromLocalFileData(b, 0, b.length);
136         assertEquals(SIZE, f.getSize());
137         assertEquals(CSIZE, f.getCompressedSize());
138         assertEquals(OFF, f.getRelativeHeaderOffset());
139         assertNull(f.getDiskStartNumber());
140     }
141 
142     @Test
143     public void testReadLFHSizesOffsetAndDisk() throws ZipException {
144         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
145         final byte[] b = new byte[28];
146         System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
147         System.arraycopy(CSIZE.getBytes(), 0, b, 8, 8);
148         System.arraycopy(OFF.getBytes(), 0, b, 16, 8);
149         System.arraycopy(DISK.getBytes(), 0, b, 24, 4);
150         f.parseFromLocalFileData(b, 0, b.length);
151         assertEquals(SIZE, f.getSize());
152         assertEquals(CSIZE, f.getCompressedSize());
153         assertEquals(OFF, f.getRelativeHeaderOffset());
154         assertEquals(DISK, f.getDiskStartNumber());
155     }
156 
157     @Test
158     public void testReadLFHSizesOnly() throws ZipException {
159         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
160         final byte[] b = new byte[16];
161         System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
162         System.arraycopy(CSIZE.getBytes(), 0, b, 8, 8);
163         f.parseFromLocalFileData(b, 0, b.length);
164         assertEquals(SIZE, f.getSize());
165         assertEquals(CSIZE, f.getCompressedSize());
166         assertNull(f.getRelativeHeaderOffset());
167         assertNull(f.getDiskStartNumber());
168     }
169 
170     @Test
171     public void testReparseCDSingleEightByteData() throws ZipException {
172         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField();
173         final byte[] b = new byte[8];
174         System.arraycopy(SIZE.getBytes(), 0, b, 0, 8);
175         f.parseFromCentralDirectoryData(b, 0, b.length);
176         f.reparseCentralDirectoryData(true, false, false, false);
177         assertEquals(SIZE, f.getSize());
178         assertNull(f.getCompressedSize());
179         assertNull(f.getRelativeHeaderOffset());
180         assertNull(f.getDiskStartNumber());
181         f.setSize(null);
182         f.reparseCentralDirectoryData(false, true, false, false);
183         assertNull(f.getSize());
184         assertEquals(SIZE, f.getCompressedSize());
185         assertNull(f.getRelativeHeaderOffset());
186         assertNull(f.getDiskStartNumber());
187         f.setCompressedSize(null);
188         f.reparseCentralDirectoryData(false, false, true, false);
189         assertNull(f.getSize());
190         assertNull(f.getCompressedSize());
191         assertEquals(SIZE, f.getRelativeHeaderOffset());
192         assertNull(f.getDiskStartNumber());
193     }
194 
195     @Test
196     public void testWriteCDOnlySizes() {
197         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField(SIZE, CSIZE);
198         assertEquals(new ZipShort(16), f.getCentralDirectoryLength());
199         final byte[] b = f.getCentralDirectoryData();
200         assertEquals(16, b.length);
201         checkSizes(b);
202     }
203 
204     @Test
205     public void testWriteCDSizeAndDisk() {
206         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField(SIZE, CSIZE, null, DISK);
207         assertEquals(new ZipShort(20), f.getCentralDirectoryLength());
208         final byte[] b = f.getCentralDirectoryData();
209         assertEquals(20, b.length);
210         checkSizes(b);
211         checkDisk(b, 16);
212     }
213 
214     @Test
215     public void testWriteCDSizeAndOffset() {
216         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField(SIZE, CSIZE, OFF, null);
217         assertEquals(new ZipShort(24), f.getCentralDirectoryLength());
218         final byte[] b = f.getCentralDirectoryData();
219         assertEquals(24, b.length);
220         checkSizes(b);
221         checkOffset(b, 16);
222     }
223 
224     @Test
225     public void testWriteCDSizeOffsetAndDisk() {
226         final Zip64ExtendedInformationExtraField f = new Zip64ExtendedInformationExtraField(SIZE, CSIZE, OFF, DISK);
227         assertEquals(new ZipShort(28), f.getCentralDirectoryLength());
228         final byte[] b = f.getCentralDirectoryData();
229         assertEquals(28, b.length);
230         checkSizes(b);
231         checkOffset(b, 16);
232         checkDisk(b, 24);
233     }
234 }