blob: 1ce819f05f749ae492111a2e10c7ad6608556f79 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.commons.compress.archivers.zip;
import static org.junit.Assert.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import org.junit.Before;
import org.junit.Test;
public class ZipUtilTest {
private Date time;
private ZipLong zl;
@Before
public void setUp() throws Exception {
time = new Date();
final Calendar cal = Calendar.getInstance();
cal.setTime(time);
final int year = cal.get(Calendar.YEAR);
final int month = cal.get(Calendar.MONTH) + 1;
final long value = ((year - 1980) << 25)
| (month << 21)
| (cal.get(Calendar.DAY_OF_MONTH) << 16)
| (cal.get(Calendar.HOUR_OF_DAY) << 11)
| (cal.get(Calendar.MINUTE) << 5)
| (cal.get(Calendar.SECOND) >> 1);
final byte[] result = new byte[4];
result[0] = (byte) ((value & 0xFF));
result[1] = (byte) ((value & 0xFF00) >> 8);
result[2] = (byte) ((value & 0xFF0000) >> 16);
result[3] = (byte) ((value & 0xFF000000L) >> 24);
zl = new ZipLong(result);
}
@Test
public void testZipLong() throws Exception {
final ZipLong test = ZipUtil.toDosTime(time);
assertEquals(test.getValue(), zl.getValue());
}
@Test
public void testAdjustToLong() {
assertEquals(Integer.MAX_VALUE,
ZipUtil.adjustToLong(Integer.MAX_VALUE));
assertEquals(((long) Integer.MAX_VALUE) + 1,
ZipUtil.adjustToLong(Integer.MAX_VALUE + 1));
assertEquals(2 * ((long) Integer.MAX_VALUE),
ZipUtil.adjustToLong(2 * Integer.MAX_VALUE));
}
@Test
public void testMinTime(){
final byte[] b1 = ZipUtil.toDosTime(0);
final byte b10 = b1[0]; // Save the first byte
b1[0]++; // change it
final byte[] b2 = ZipUtil.toDosTime(0); // get the same time
assertEquals(b10,b2[0]); // first byte should still be the same
}
@Test
public void testOutsideCalendar(){
final byte[] b1 = ZipUtil.toDosTime(160441200000L); // 1.1..1975
assertEquals(0, b1[0]);
assertEquals(33, b1[1]);
assertEquals(0, b1[2]);
assertEquals(0, b1[3]);
}
@Test
public void testInsideCalendar(){
final TimeZone tz = TimeZone.getDefault();
final long date = 476096400000L; // 1.1.1985, 10:00 am GMT
final byte[] b1 = ZipUtil.toDosTime(date - tz.getOffset(date));
assertEquals(0, b1[0]);
assertEquals(72, b1[1]);
assertEquals(65, b1[2]);
assertEquals(10, b1[3]);
}
@Test
public void testReverse() {
final byte[][] bTest = new byte[6][];
bTest[0] = new byte[]{};
bTest[1] = new byte[]{1};
bTest[2] = new byte[]{1, 2};
bTest[3] = new byte[]{1, 2, 3};
bTest[4] = new byte[]{1, 2, 3, 4};
bTest[5] = new byte[]{1, 2, 3, 4, 5};
final byte[][] rTest = new byte[6][];
rTest[0] = new byte[]{};
rTest[1] = new byte[]{1};
rTest[2] = new byte[]{2, 1};
rTest[3] = new byte[]{3, 2, 1};
rTest[4] = new byte[]{4, 3, 2, 1};
rTest[5] = new byte[]{5, 4, 3, 2, 1};
assertEquals("test and result arrays are same length", bTest.length, rTest.length);
for (int i = 0; i < bTest.length; i++) {
final byte[] result = ZipUtil.reverse(bTest[i]);
assertTrue("reverse mutates in-place", bTest[i] == result);
assertTrue("reverse actually reverses", Arrays.equals(rTest[i], result));
}
}
@Test
public void testBigToLong() {
final BigInteger big1 = BigInteger.valueOf(1);
final BigInteger big2 = BigInteger.valueOf(Long.MAX_VALUE);
final BigInteger big3 = BigInteger.valueOf(Long.MIN_VALUE);
assertEquals(1L, ZipUtil.bigToLong(big1));
assertEquals(Long.MAX_VALUE, ZipUtil.bigToLong(big2));
assertEquals(Long.MIN_VALUE, ZipUtil.bigToLong(big3));
final BigInteger big4 = big2.add(big1);
try {
ZipUtil.bigToLong(big4);
fail("Should have thrown IllegalArgumentException");
} catch (final IllegalArgumentException iae) {
// All is good.
}
final BigInteger big5 = big3.subtract(big1);
try {
ZipUtil.bigToLong(big5);
fail("ZipUtil.bigToLong(BigInteger) should have thrown IllegalArgumentException");
} catch (final IllegalArgumentException iae) {
// All is good.
}
}
@Test
public void testLongToBig() {
final long l0 = 0;
final long l1 = 1;
final long l2 = -1;
final long l3 = Integer.MIN_VALUE;
final long l4 = Long.MAX_VALUE;
final long l5 = Long.MIN_VALUE;
final BigInteger big0 = ZipUtil.longToBig(l0);
final BigInteger big1 = ZipUtil.longToBig(l1);
final BigInteger big2 = ZipUtil.longToBig(l2);
final BigInteger big3 = ZipUtil.longToBig(l3);
final BigInteger big4 = ZipUtil.longToBig(l4);
assertEquals(0, big0.longValue());
assertEquals(1, big1.longValue());
assertEquals(0xFFFFFFFFL, big2.longValue());
assertEquals(0x80000000L, big3.longValue());
assertEquals(Long.MAX_VALUE, big4.longValue());
try {
ZipUtil.longToBig(l5);
fail("ZipUtil.longToBig(long) should have thrown IllegalArgumentException");
} catch (final IllegalArgumentException iae) {
}
}
@Test
public void testSignedByteToUnsignedInt() {
// Yay, we can completely test all possible input values in this case!
int expectedVal = 128;
for (int i = Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++) {
final byte b = (byte) i;
assertEquals(expectedVal, ZipUtil.signedByteToUnsignedInt(b));
expectedVal++;
if (expectedVal == 256) {
expectedVal = 0;
}
}
}
@Test
public void testUnsignedIntToSignedByte() {
int unsignedVal = 128;
for (int i = Byte.MIN_VALUE; i <= Byte.MAX_VALUE; i++) {
final byte expectedVal = (byte) i;
assertEquals(expectedVal, ZipUtil.unsignedIntToSignedByte(unsignedVal));
unsignedVal++;
if (unsignedVal == 256) {
unsignedVal = 0;
}
}
try {
ZipUtil.unsignedIntToSignedByte(-1);
fail("ZipUtil.unsignedIntToSignedByte(-1) should have thrown IllegalArgumentException");
} catch (final IllegalArgumentException iae) {
// All is good.
}
try {
ZipUtil.unsignedIntToSignedByte(256);
fail("ZipUtil.unsignedIntToSignedByte(256) should have thrown IllegalArgumentException");
} catch (final IllegalArgumentException iae) {
// All is good.
}
}
}