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