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