1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 }