From 04e443acbeeefc1c2a1354999750a9b27a7629d7 Mon Sep 17 00:00:00 2001 From: Peter Donald Date: Sat, 2 Feb 2002 07:39:53 +0000 Subject: [PATCH] Move across Stefans zip unit tests git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271065 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/aut/zip/AsiExtraFieldTest.java | 165 ++++++++++++++++++ .../apache/aut/zip/ExtraFieldUtilsTest.java | 114 ++++++++++++ .../test/org/apache/aut/zip/ZipEntryTest.java | 94 ++++++++++ .../test/org/apache/aut/zip/ZipLongTest.java | 79 +++++++++ .../test/org/apache/aut/zip/ZipShortTest.java | 75 ++++++++ .../org/apache/aut/zip/AsiExtraFieldTest.java | 165 ++++++++++++++++++ .../apache/aut/zip/ExtraFieldUtilsTest.java | 114 ++++++++++++ .../org/apache/aut/zip/ZipEntryTest.java | 94 ++++++++++ .../org/apache/aut/zip/ZipLongTest.java | 79 +++++++++ .../org/apache/aut/zip/ZipShortTest.java | 75 ++++++++ 10 files changed, 1054 insertions(+) create mode 100644 proposal/myrmidon/src/test/org/apache/aut/zip/AsiExtraFieldTest.java create mode 100644 proposal/myrmidon/src/test/org/apache/aut/zip/ExtraFieldUtilsTest.java create mode 100644 proposal/myrmidon/src/test/org/apache/aut/zip/ZipEntryTest.java create mode 100644 proposal/myrmidon/src/test/org/apache/aut/zip/ZipLongTest.java create mode 100644 proposal/myrmidon/src/test/org/apache/aut/zip/ZipShortTest.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/zip/AsiExtraFieldTest.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/zip/ExtraFieldUtilsTest.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/zip/ZipEntryTest.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/zip/ZipLongTest.java create mode 100644 proposal/myrmidon/src/testcases/org/apache/aut/zip/ZipShortTest.java diff --git a/proposal/myrmidon/src/test/org/apache/aut/zip/AsiExtraFieldTest.java b/proposal/myrmidon/src/test/org/apache/aut/zip/AsiExtraFieldTest.java new file mode 100644 index 000000000..246ca1b76 --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/aut/zip/AsiExtraFieldTest.java @@ -0,0 +1,165 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.aut.zip; + +import java.util.zip.ZipException; +import junit.framework.TestCase; + +/** + * JUnit testcases AsiExtraField. + * + * @author Stefan Bodewig + */ +public class AsiExtraFieldTest + extends TestCase + implements UnixStat +{ + public AsiExtraFieldTest( final String name ) + { + super( name ); + } + + /** + * Test file mode magic. + */ + public void testModes() + { + final AsiExtraField field = new AsiExtraField(); + field.setMode( 0123 ); + assertEquals( "plain file", 0100123, field.getMode() ); + field.setDirectory( true ); + assertEquals( "directory", 040123, field.getMode() ); + field.setLinkedFile( "test" ); + assertEquals( "symbolic link", 0120123, field.getMode() ); + } + + private AsiExtraField createField() + { + final AsiExtraField field = new AsiExtraField(); + field.setMode( 0123 ); + field.setUserId( 5 ); + field.setGroupId( 6 ); + return field; + } + + public void testContent1() + { + final AsiExtraField field = createField(); + final byte[] data = field.getLocalFileDataData(); + + // CRC manually calculated, sorry + final byte[] expect = {(byte)0xC6, 0x02, 0x78, (byte)0xB6, // CRC + 0123, (byte)0x80, // mode + 0, 0, 0, 0, // link length + 5, 0, 6, 0}; // uid, gid + assertEquals( "no link", expect.length, data.length ); + for( int i = 0; i < expect.length; i++ ) + { + assertEquals( "no link, byte " + i, expect[ i ], data[ i ] ); + } + + field.setLinkedFile( "test" ); + } + + public void testContent2() + { + final AsiExtraField field = createField(); + field.setLinkedFile( "test" ); + + final byte[] data = field.getLocalFileDataData(); + final byte[] expect = new byte[]{0x75, (byte)0x8E, 0x41, (byte)0xFD, // CRC + 0123, (byte)0xA0, // mode + 4, 0, 0, 0, // link length + 5, 0, 6, 0, // uid, gid + (byte)'t', (byte)'e', (byte)'s', (byte)'t'}; + assertEquals( "no link", expect.length, data.length ); + for( int i = 0; i < expect.length; i++ ) + { + assertEquals( "no link, byte " + i, expect[ i ], data[ i ] ); + } + + } + + public void testReparse1() + throws ZipException + { + // CRC manually calculated, sorry + final byte[] data = {(byte)0xC6, 0x02, 0x78, (byte)0xB6, // CRC + 0123, (byte)0x80, // mode + 0, 0, 0, 0, // link length + 5, 0, 6, 0}; // uid, gid + final AsiExtraField field = new AsiExtraField(); + field.parseFromLocalFileData( data, 0, data.length ); + + assertEquals( "length plain file", data.length, + field.getLocalFileDataLength().getValue() ); + assertTrue( "plain file, no link", !field.isLink() ); + assertTrue( "plain file, no dir", !field.isDirectory() ); + assertEquals( "mode plain file", FILE_FLAG | 0123, field.getMode() ); + assertEquals( "uid plain file", 5, field.getUserId() ); + assertEquals( "gid plain file", 6, field.getGroupId() ); + } + + public void testReparse2() + throws ZipException + { + final byte[] data = new byte[]{0x75, (byte)0x8E, 0x41, (byte)0xFD, // CRC + 0123, (byte)0xA0, // mode + 4, 0, 0, 0, // link length + 5, 0, 6, 0, // uid, gid + (byte)'t', (byte)'e', (byte)'s', (byte)'t'}; + final AsiExtraField field = new AsiExtraField(); + field.parseFromLocalFileData( data, 0, data.length ); + assertEquals( "length link", data.length, + field.getLocalFileDataLength().getValue() ); + assertTrue( "link, is link", field.isLink() ); + assertTrue( "link, no dir", !field.isDirectory() ); + assertEquals( "mode link", LINK_FLAG | 0123, field.getMode() ); + assertEquals( "uid link", 5, field.getUserId() ); + assertEquals( "gid link", 6, field.getGroupId() ); + assertEquals( "test", field.getLinkedFile() ); + } + + public void testReparse3() + throws ZipException + { + final byte[] data = new byte[]{(byte)0x8E, 0x01, (byte)0xBF, (byte)0x0E, // CRC + 0123, (byte)0x40, // mode + 0, 0, 0, 0, // link + 5, 0, 6, 0}; // uid, gid + final AsiExtraField field = new AsiExtraField(); + field.parseFromLocalFileData( data, 0, data.length ); + assertEquals( "length dir", data.length, + field.getLocalFileDataLength().getValue() ); + assertTrue( "dir, no link", !field.isLink() ); + assertTrue( "dir, is dir", field.isDirectory() ); + assertEquals( "mode dir", DIR_FLAG | 0123, field.getMode() ); + assertEquals( "uid dir", 5, field.getUserId() ); + assertEquals( "gid dir", 6, field.getGroupId() ); + } + + public void testReparse4() + throws Exception + { + final byte[] data = new byte[]{0, 0, 0, 0, // bad CRC + 0123, (byte)0x40, // mode + 0, 0, 0, 0, // link + 5, 0, 6, 0}; // uid, gid + final AsiExtraField field = new AsiExtraField(); + try + { + field.parseFromLocalFileData( data, 0, data.length ); + fail( "should raise bad CRC exception" ); + } + catch( Exception e ) + { + assertEquals( "bad CRC checksum 0 instead of ebf018e", + e.getMessage() ); + } + } +} diff --git a/proposal/myrmidon/src/test/org/apache/aut/zip/ExtraFieldUtilsTest.java b/proposal/myrmidon/src/test/org/apache/aut/zip/ExtraFieldUtilsTest.java new file mode 100644 index 000000000..6e2be5d4d --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/aut/zip/ExtraFieldUtilsTest.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.aut.zip; + +import junit.framework.TestCase; + +/** + * JUnit testcases ExtraFieldUtils. + * + * @author Stefan Bodewig + */ +public class ExtraFieldUtilsTest + extends TestCase + implements UnixStat +{ + private AsiExtraField m_field; + private UnrecognizedExtraField m_dummy; + private byte[] m_data; + private byte[] m_local; + + public ExtraFieldUtilsTest( final String name ) + { + super( name ); + } + + public void setUp() + { + m_field = new AsiExtraField(); + m_field.setMode( 0755 ); + m_field.setDirectory( true ); + m_dummy = new UnrecognizedExtraField(); + m_dummy.setHeaderId( new ZipShort( 1 ) ); + m_dummy.setLocalFileDataData( new byte[ 0 ] ); + m_dummy.setCentralDirectoryData( new byte[]{0} ); + + m_local = m_field.getLocalFileDataData(); + final byte[] dummyLocal = m_dummy.getLocalFileDataData(); + m_data = new byte[ 4 + m_local.length + 4 + dummyLocal.length ]; + System.arraycopy( m_field.getHeaderId().getBytes(), 0, m_data, 0, 2 ); + System.arraycopy( m_field.getLocalFileDataLength().getBytes(), 0, m_data, 2, 2 ); + System.arraycopy( m_local, 0, m_data, 4, m_local.length ); + System.arraycopy( m_dummy.getHeaderId().getBytes(), 0, m_data, + 4 + m_local.length, 2 ); + System.arraycopy( m_dummy.getLocalFileDataLength().getBytes(), 0, m_data, + 4 + m_local.length + 2, 2 ); + System.arraycopy( dummyLocal, 0, m_data, + 4 + m_local.length + 4, dummyLocal.length ); + + } + + /** + * test parser. + */ + public void testParse() throws Exception + { + final ZipExtraField[] extraField = ExtraFieldUtils.parse( m_data ); + assertEquals( "number of fields", 2, extraField.length ); + assertTrue( "type field 1", extraField[ 0 ] instanceof AsiExtraField ); + assertEquals( "mode field 1", 040755, + ( (AsiExtraField)extraField[ 0 ] ).getMode() ); + assertTrue( "type field 2", extraField[ 1 ] instanceof UnrecognizedExtraField ); + assertEquals( "data length field 2", 0, + extraField[ 1 ].getLocalFileDataLength().getValue() ); + + final byte[] data2 = new byte[ m_data.length - 1 ]; + System.arraycopy( m_data, 0, data2, 0, data2.length ); + try + { + ExtraFieldUtils.parse( data2 ); + fail( "data should be invalid" ); + } + catch( Exception e ) + { + assertEquals( "message", + "data starting at " + ( 4 + m_local.length ) + " is in unknown format", + e.getMessage() ); + } + } + + /** + * Test merge methods + */ + public void testMerge() + { + final byte[] local = + ExtraFieldUtils.mergeLocalFileDataData( new ZipExtraField[]{m_field, m_dummy} ); + assertEquals( "local length", m_data.length, local.length ); + for( int i = 0; i < local.length; i++ ) + { + assertEquals( "local byte " + i, m_data[ i ], local[ i ] ); + } + + final byte[] dummyCentral = m_dummy.getCentralDirectoryData(); + final byte[] data2 = new byte[ 4 + m_local.length + 4 + dummyCentral.length ]; + System.arraycopy( m_data, 0, data2, 0, 4 + m_local.length + 2 ); + System.arraycopy( m_dummy.getCentralDirectoryLength().getBytes(), 0, + data2, 4 + m_local.length + 2, 2 ); + System.arraycopy( dummyCentral, 0, data2, + 4 + m_local.length + 4, dummyCentral.length ); + + final byte[] central = + ExtraFieldUtils.mergeCentralDirectoryData( new ZipExtraField[]{m_field, m_dummy} ); + assertEquals( "central length", data2.length, central.length ); + for( int i = 0; i < central.length; i++ ) + { + assertEquals( "central byte " + i, data2[ i ], central[ i ] ); + } + } +} diff --git a/proposal/myrmidon/src/test/org/apache/aut/zip/ZipEntryTest.java b/proposal/myrmidon/src/test/org/apache/aut/zip/ZipEntryTest.java new file mode 100644 index 000000000..68f4a2e0c --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/aut/zip/ZipEntryTest.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.aut.zip; + +import junit.framework.TestCase; +import java.util.NoSuchElementException; + +/** + * JUnit testcases ZipEntry. + * + * @author Stefan Bodewig + */ +public class ZipEntryTest + extends TestCase +{ + public ZipEntryTest( final String name ) + { + super( name ); + } + + /** + * test handling of extra fields + */ + public void testExtraFields() + { + final AsiExtraField field = createField(); + final UnrecognizedExtraField extraField = createExtraField(); + + final ZipEntry entry = new ZipEntry( "test/" ); + entry.setExtraFields( new ZipExtraField[]{field, extraField} ); + final byte[] data1 = entry.getExtra(); + ZipExtraField[] result = entry.getExtraFields(); + assertEquals( "first pass", 2, result.length ); + assertSame( field, result[ 0 ] ); + assertSame( extraField, result[ 1 ] ); + + UnrecognizedExtraField u2 = new UnrecognizedExtraField(); + u2.setHeaderId( new ZipShort( 1 ) ); + u2.setLocalFileDataData( new byte[]{1} ); + + entry.addExtraField( u2 ); + byte[] data2 = entry.getExtra(); + result = entry.getExtraFields(); + assertEquals( "second pass", 2, result.length ); + assertSame( field, result[ 0 ] ); + assertSame( u2, result[ 1 ] ); + assertEquals( "length second pass", data1.length + 1, data2.length ); + + UnrecognizedExtraField u3 = new UnrecognizedExtraField(); + u3.setHeaderId( new ZipShort( 2 ) ); + u3.setLocalFileDataData( new byte[]{1} ); + entry.addExtraField( u3 ); + result = entry.getExtraFields(); + assertEquals( "third pass", 3, result.length ); + + entry.removeExtraField( new ZipShort( 1 ) ); + byte[] data3 = entry.getExtra(); + result = entry.getExtraFields(); + assertEquals( "fourth pass", 2, result.length ); + assertSame( field, result[ 0 ] ); + assertSame( u3, result[ 1 ] ); + assertEquals( "length fourth pass", data2.length, data3.length ); + + try + { + entry.removeExtraField( new ZipShort( 1 ) ); + fail( "should be no such element" ); + } + catch( final NoSuchElementException nse ) + { + } + } + + private UnrecognizedExtraField createExtraField() + { + UnrecognizedExtraField extraField = new UnrecognizedExtraField(); + extraField.setHeaderId( new ZipShort( 1 ) ); + extraField.setLocalFileDataData( new byte[ 0 ] ); + return extraField; + } + + private AsiExtraField createField() + { + final AsiExtraField field = new AsiExtraField(); + field.setDirectory( true ); + field.setMode( 0755 ); + return field; + } +} diff --git a/proposal/myrmidon/src/test/org/apache/aut/zip/ZipLongTest.java b/proposal/myrmidon/src/test/org/apache/aut/zip/ZipLongTest.java new file mode 100644 index 000000000..e73f02d53 --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/aut/zip/ZipLongTest.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.aut.zip; + +import junit.framework.TestCase; + +/** + * JUnit 3 testcases for org.apache.tools.zip.ZipLong. + * + * @author Stefan Bodewig + */ +public class ZipLongTest + extends TestCase +{ + + public ZipLongTest( final String name ) + { + super( name ); + } + + /** + * Test conversion to bytes. + */ + public void testToBytes() + { + final ZipLong zipLong = new ZipLong( 0x12345678 ); + final byte[] result = zipLong.getBytes(); + assertEquals( "length getBytes", 4, result.length ); + assertEquals( "first byte getBytes", 0x78, result[ 0 ] ); + assertEquals( "second byte getBytes", 0x56, result[ 1 ] ); + assertEquals( "third byte getBytes", 0x34, result[ 2 ] ); + assertEquals( "fourth byte getBytes", 0x12, result[ 3 ] ); + } + + /** + * Test conversion from bytes. + */ + public void testFromBytes() + { + final byte[] value = new byte[]{0x78, 0x56, 0x34, 0x12}; + final ZipLong zipLong = new ZipLong( value ); + assertEquals( "value from bytes", 0x12345678, zipLong.getValue() ); + } + + /** + * Test the contract of the equals method. + */ + public void testEquals() + { + final ZipLong zipLong1 = new ZipLong( 0x12345678 ); + final ZipLong zipLong2 = new ZipLong( 0x12345678 ); + final ZipLong zipLong3 = new ZipLong( 0x87654321 ); + + assertTrue( "reflexive", zipLong1.equals( zipLong1 ) ); + + assertTrue( "works", zipLong1.equals( zipLong2 ) ); + assertTrue( "works, part two", !zipLong1.equals( zipLong3 ) ); + + assertTrue( "symmetric", zipLong2.equals( zipLong1 ) ); + + assertTrue( "null handling", !zipLong1.equals( null ) ); + assertTrue( "non ZipLong handling", !zipLong1.equals( new Integer( 0x1234 ) ) ); + } + + /** + * Test sign handling. + */ + public void testSign() + { + final ZipLong zipLong = + new ZipLong( new byte[]{(byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF} ); + assertEquals( 0x00000000FFFFFFFFl, zipLong.getValue() ); + } +} diff --git a/proposal/myrmidon/src/test/org/apache/aut/zip/ZipShortTest.java b/proposal/myrmidon/src/test/org/apache/aut/zip/ZipShortTest.java new file mode 100644 index 000000000..ba9c459fb --- /dev/null +++ b/proposal/myrmidon/src/test/org/apache/aut/zip/ZipShortTest.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.aut.zip; + +import junit.framework.TestCase; + +/** + * JUnit 3 testcases for org.apache.tools.zip.ZipShort. + * + * @author Stefan Bodewig + */ +public class ZipShortTest + extends TestCase +{ + public ZipShortTest( String name ) + { + super( name ); + } + + /** + * Test conversion to bytes. + */ + public void testToBytes() + { + final ZipShort zipShort = new ZipShort( 0x1234 ); + byte[] result = zipShort.getBytes(); + assertEquals( "length getBytes", 2, result.length ); + assertEquals( "first byte getBytes", 0x34, result[ 0 ] ); + assertEquals( "second byte getBytes", 0x12, result[ 1 ] ); + } + + /** + * Test conversion from bytes. + */ + public void testFromBytes() + { + byte[] val = new byte[]{0x34, 0x12}; + final ZipShort zipShort = new ZipShort( val ); + assertEquals( "value from bytes", 0x1234, zipShort.getValue() ); + } + + /** + * Test the contract of the equals method. + */ + public void testEquals() + { + final ZipShort zipShort = new ZipShort( 0x1234 ); + final ZipShort zipShort2 = new ZipShort( 0x1234 ); + final ZipShort zipShort3 = new ZipShort( 0x5678 ); + + assertTrue( "reflexive", zipShort.equals( zipShort ) ); + + assertTrue( "works", zipShort.equals( zipShort2 ) ); + assertTrue( "works, part two", !zipShort.equals( zipShort3 ) ); + + assertTrue( "symmetric", zipShort2.equals( zipShort ) ); + + assertTrue( "null handling", !zipShort.equals( null ) ); + assertTrue( "non ZipShort handling", !zipShort.equals( new Integer( 0x1234 ) ) ); + } + + /** + * Test sign handling. + */ + public void testSign() + { + final ZipShort zipShort = new ZipShort( new byte[]{(byte)0xFF, (byte)0xFF} ); + assertEquals( 0x0000FFFF, zipShort.getValue() ); + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/zip/AsiExtraFieldTest.java b/proposal/myrmidon/src/testcases/org/apache/aut/zip/AsiExtraFieldTest.java new file mode 100644 index 000000000..246ca1b76 --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/aut/zip/AsiExtraFieldTest.java @@ -0,0 +1,165 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.aut.zip; + +import java.util.zip.ZipException; +import junit.framework.TestCase; + +/** + * JUnit testcases AsiExtraField. + * + * @author Stefan Bodewig + */ +public class AsiExtraFieldTest + extends TestCase + implements UnixStat +{ + public AsiExtraFieldTest( final String name ) + { + super( name ); + } + + /** + * Test file mode magic. + */ + public void testModes() + { + final AsiExtraField field = new AsiExtraField(); + field.setMode( 0123 ); + assertEquals( "plain file", 0100123, field.getMode() ); + field.setDirectory( true ); + assertEquals( "directory", 040123, field.getMode() ); + field.setLinkedFile( "test" ); + assertEquals( "symbolic link", 0120123, field.getMode() ); + } + + private AsiExtraField createField() + { + final AsiExtraField field = new AsiExtraField(); + field.setMode( 0123 ); + field.setUserId( 5 ); + field.setGroupId( 6 ); + return field; + } + + public void testContent1() + { + final AsiExtraField field = createField(); + final byte[] data = field.getLocalFileDataData(); + + // CRC manually calculated, sorry + final byte[] expect = {(byte)0xC6, 0x02, 0x78, (byte)0xB6, // CRC + 0123, (byte)0x80, // mode + 0, 0, 0, 0, // link length + 5, 0, 6, 0}; // uid, gid + assertEquals( "no link", expect.length, data.length ); + for( int i = 0; i < expect.length; i++ ) + { + assertEquals( "no link, byte " + i, expect[ i ], data[ i ] ); + } + + field.setLinkedFile( "test" ); + } + + public void testContent2() + { + final AsiExtraField field = createField(); + field.setLinkedFile( "test" ); + + final byte[] data = field.getLocalFileDataData(); + final byte[] expect = new byte[]{0x75, (byte)0x8E, 0x41, (byte)0xFD, // CRC + 0123, (byte)0xA0, // mode + 4, 0, 0, 0, // link length + 5, 0, 6, 0, // uid, gid + (byte)'t', (byte)'e', (byte)'s', (byte)'t'}; + assertEquals( "no link", expect.length, data.length ); + for( int i = 0; i < expect.length; i++ ) + { + assertEquals( "no link, byte " + i, expect[ i ], data[ i ] ); + } + + } + + public void testReparse1() + throws ZipException + { + // CRC manually calculated, sorry + final byte[] data = {(byte)0xC6, 0x02, 0x78, (byte)0xB6, // CRC + 0123, (byte)0x80, // mode + 0, 0, 0, 0, // link length + 5, 0, 6, 0}; // uid, gid + final AsiExtraField field = new AsiExtraField(); + field.parseFromLocalFileData( data, 0, data.length ); + + assertEquals( "length plain file", data.length, + field.getLocalFileDataLength().getValue() ); + assertTrue( "plain file, no link", !field.isLink() ); + assertTrue( "plain file, no dir", !field.isDirectory() ); + assertEquals( "mode plain file", FILE_FLAG | 0123, field.getMode() ); + assertEquals( "uid plain file", 5, field.getUserId() ); + assertEquals( "gid plain file", 6, field.getGroupId() ); + } + + public void testReparse2() + throws ZipException + { + final byte[] data = new byte[]{0x75, (byte)0x8E, 0x41, (byte)0xFD, // CRC + 0123, (byte)0xA0, // mode + 4, 0, 0, 0, // link length + 5, 0, 6, 0, // uid, gid + (byte)'t', (byte)'e', (byte)'s', (byte)'t'}; + final AsiExtraField field = new AsiExtraField(); + field.parseFromLocalFileData( data, 0, data.length ); + assertEquals( "length link", data.length, + field.getLocalFileDataLength().getValue() ); + assertTrue( "link, is link", field.isLink() ); + assertTrue( "link, no dir", !field.isDirectory() ); + assertEquals( "mode link", LINK_FLAG | 0123, field.getMode() ); + assertEquals( "uid link", 5, field.getUserId() ); + assertEquals( "gid link", 6, field.getGroupId() ); + assertEquals( "test", field.getLinkedFile() ); + } + + public void testReparse3() + throws ZipException + { + final byte[] data = new byte[]{(byte)0x8E, 0x01, (byte)0xBF, (byte)0x0E, // CRC + 0123, (byte)0x40, // mode + 0, 0, 0, 0, // link + 5, 0, 6, 0}; // uid, gid + final AsiExtraField field = new AsiExtraField(); + field.parseFromLocalFileData( data, 0, data.length ); + assertEquals( "length dir", data.length, + field.getLocalFileDataLength().getValue() ); + assertTrue( "dir, no link", !field.isLink() ); + assertTrue( "dir, is dir", field.isDirectory() ); + assertEquals( "mode dir", DIR_FLAG | 0123, field.getMode() ); + assertEquals( "uid dir", 5, field.getUserId() ); + assertEquals( "gid dir", 6, field.getGroupId() ); + } + + public void testReparse4() + throws Exception + { + final byte[] data = new byte[]{0, 0, 0, 0, // bad CRC + 0123, (byte)0x40, // mode + 0, 0, 0, 0, // link + 5, 0, 6, 0}; // uid, gid + final AsiExtraField field = new AsiExtraField(); + try + { + field.parseFromLocalFileData( data, 0, data.length ); + fail( "should raise bad CRC exception" ); + } + catch( Exception e ) + { + assertEquals( "bad CRC checksum 0 instead of ebf018e", + e.getMessage() ); + } + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/zip/ExtraFieldUtilsTest.java b/proposal/myrmidon/src/testcases/org/apache/aut/zip/ExtraFieldUtilsTest.java new file mode 100644 index 000000000..6e2be5d4d --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/aut/zip/ExtraFieldUtilsTest.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.aut.zip; + +import junit.framework.TestCase; + +/** + * JUnit testcases ExtraFieldUtils. + * + * @author Stefan Bodewig + */ +public class ExtraFieldUtilsTest + extends TestCase + implements UnixStat +{ + private AsiExtraField m_field; + private UnrecognizedExtraField m_dummy; + private byte[] m_data; + private byte[] m_local; + + public ExtraFieldUtilsTest( final String name ) + { + super( name ); + } + + public void setUp() + { + m_field = new AsiExtraField(); + m_field.setMode( 0755 ); + m_field.setDirectory( true ); + m_dummy = new UnrecognizedExtraField(); + m_dummy.setHeaderId( new ZipShort( 1 ) ); + m_dummy.setLocalFileDataData( new byte[ 0 ] ); + m_dummy.setCentralDirectoryData( new byte[]{0} ); + + m_local = m_field.getLocalFileDataData(); + final byte[] dummyLocal = m_dummy.getLocalFileDataData(); + m_data = new byte[ 4 + m_local.length + 4 + dummyLocal.length ]; + System.arraycopy( m_field.getHeaderId().getBytes(), 0, m_data, 0, 2 ); + System.arraycopy( m_field.getLocalFileDataLength().getBytes(), 0, m_data, 2, 2 ); + System.arraycopy( m_local, 0, m_data, 4, m_local.length ); + System.arraycopy( m_dummy.getHeaderId().getBytes(), 0, m_data, + 4 + m_local.length, 2 ); + System.arraycopy( m_dummy.getLocalFileDataLength().getBytes(), 0, m_data, + 4 + m_local.length + 2, 2 ); + System.arraycopy( dummyLocal, 0, m_data, + 4 + m_local.length + 4, dummyLocal.length ); + + } + + /** + * test parser. + */ + public void testParse() throws Exception + { + final ZipExtraField[] extraField = ExtraFieldUtils.parse( m_data ); + assertEquals( "number of fields", 2, extraField.length ); + assertTrue( "type field 1", extraField[ 0 ] instanceof AsiExtraField ); + assertEquals( "mode field 1", 040755, + ( (AsiExtraField)extraField[ 0 ] ).getMode() ); + assertTrue( "type field 2", extraField[ 1 ] instanceof UnrecognizedExtraField ); + assertEquals( "data length field 2", 0, + extraField[ 1 ].getLocalFileDataLength().getValue() ); + + final byte[] data2 = new byte[ m_data.length - 1 ]; + System.arraycopy( m_data, 0, data2, 0, data2.length ); + try + { + ExtraFieldUtils.parse( data2 ); + fail( "data should be invalid" ); + } + catch( Exception e ) + { + assertEquals( "message", + "data starting at " + ( 4 + m_local.length ) + " is in unknown format", + e.getMessage() ); + } + } + + /** + * Test merge methods + */ + public void testMerge() + { + final byte[] local = + ExtraFieldUtils.mergeLocalFileDataData( new ZipExtraField[]{m_field, m_dummy} ); + assertEquals( "local length", m_data.length, local.length ); + for( int i = 0; i < local.length; i++ ) + { + assertEquals( "local byte " + i, m_data[ i ], local[ i ] ); + } + + final byte[] dummyCentral = m_dummy.getCentralDirectoryData(); + final byte[] data2 = new byte[ 4 + m_local.length + 4 + dummyCentral.length ]; + System.arraycopy( m_data, 0, data2, 0, 4 + m_local.length + 2 ); + System.arraycopy( m_dummy.getCentralDirectoryLength().getBytes(), 0, + data2, 4 + m_local.length + 2, 2 ); + System.arraycopy( dummyCentral, 0, data2, + 4 + m_local.length + 4, dummyCentral.length ); + + final byte[] central = + ExtraFieldUtils.mergeCentralDirectoryData( new ZipExtraField[]{m_field, m_dummy} ); + assertEquals( "central length", data2.length, central.length ); + for( int i = 0; i < central.length; i++ ) + { + assertEquals( "central byte " + i, data2[ i ], central[ i ] ); + } + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/zip/ZipEntryTest.java b/proposal/myrmidon/src/testcases/org/apache/aut/zip/ZipEntryTest.java new file mode 100644 index 000000000..68f4a2e0c --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/aut/zip/ZipEntryTest.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.aut.zip; + +import junit.framework.TestCase; +import java.util.NoSuchElementException; + +/** + * JUnit testcases ZipEntry. + * + * @author Stefan Bodewig + */ +public class ZipEntryTest + extends TestCase +{ + public ZipEntryTest( final String name ) + { + super( name ); + } + + /** + * test handling of extra fields + */ + public void testExtraFields() + { + final AsiExtraField field = createField(); + final UnrecognizedExtraField extraField = createExtraField(); + + final ZipEntry entry = new ZipEntry( "test/" ); + entry.setExtraFields( new ZipExtraField[]{field, extraField} ); + final byte[] data1 = entry.getExtra(); + ZipExtraField[] result = entry.getExtraFields(); + assertEquals( "first pass", 2, result.length ); + assertSame( field, result[ 0 ] ); + assertSame( extraField, result[ 1 ] ); + + UnrecognizedExtraField u2 = new UnrecognizedExtraField(); + u2.setHeaderId( new ZipShort( 1 ) ); + u2.setLocalFileDataData( new byte[]{1} ); + + entry.addExtraField( u2 ); + byte[] data2 = entry.getExtra(); + result = entry.getExtraFields(); + assertEquals( "second pass", 2, result.length ); + assertSame( field, result[ 0 ] ); + assertSame( u2, result[ 1 ] ); + assertEquals( "length second pass", data1.length + 1, data2.length ); + + UnrecognizedExtraField u3 = new UnrecognizedExtraField(); + u3.setHeaderId( new ZipShort( 2 ) ); + u3.setLocalFileDataData( new byte[]{1} ); + entry.addExtraField( u3 ); + result = entry.getExtraFields(); + assertEquals( "third pass", 3, result.length ); + + entry.removeExtraField( new ZipShort( 1 ) ); + byte[] data3 = entry.getExtra(); + result = entry.getExtraFields(); + assertEquals( "fourth pass", 2, result.length ); + assertSame( field, result[ 0 ] ); + assertSame( u3, result[ 1 ] ); + assertEquals( "length fourth pass", data2.length, data3.length ); + + try + { + entry.removeExtraField( new ZipShort( 1 ) ); + fail( "should be no such element" ); + } + catch( final NoSuchElementException nse ) + { + } + } + + private UnrecognizedExtraField createExtraField() + { + UnrecognizedExtraField extraField = new UnrecognizedExtraField(); + extraField.setHeaderId( new ZipShort( 1 ) ); + extraField.setLocalFileDataData( new byte[ 0 ] ); + return extraField; + } + + private AsiExtraField createField() + { + final AsiExtraField field = new AsiExtraField(); + field.setDirectory( true ); + field.setMode( 0755 ); + return field; + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/zip/ZipLongTest.java b/proposal/myrmidon/src/testcases/org/apache/aut/zip/ZipLongTest.java new file mode 100644 index 000000000..e73f02d53 --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/aut/zip/ZipLongTest.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.aut.zip; + +import junit.framework.TestCase; + +/** + * JUnit 3 testcases for org.apache.tools.zip.ZipLong. + * + * @author Stefan Bodewig + */ +public class ZipLongTest + extends TestCase +{ + + public ZipLongTest( final String name ) + { + super( name ); + } + + /** + * Test conversion to bytes. + */ + public void testToBytes() + { + final ZipLong zipLong = new ZipLong( 0x12345678 ); + final byte[] result = zipLong.getBytes(); + assertEquals( "length getBytes", 4, result.length ); + assertEquals( "first byte getBytes", 0x78, result[ 0 ] ); + assertEquals( "second byte getBytes", 0x56, result[ 1 ] ); + assertEquals( "third byte getBytes", 0x34, result[ 2 ] ); + assertEquals( "fourth byte getBytes", 0x12, result[ 3 ] ); + } + + /** + * Test conversion from bytes. + */ + public void testFromBytes() + { + final byte[] value = new byte[]{0x78, 0x56, 0x34, 0x12}; + final ZipLong zipLong = new ZipLong( value ); + assertEquals( "value from bytes", 0x12345678, zipLong.getValue() ); + } + + /** + * Test the contract of the equals method. + */ + public void testEquals() + { + final ZipLong zipLong1 = new ZipLong( 0x12345678 ); + final ZipLong zipLong2 = new ZipLong( 0x12345678 ); + final ZipLong zipLong3 = new ZipLong( 0x87654321 ); + + assertTrue( "reflexive", zipLong1.equals( zipLong1 ) ); + + assertTrue( "works", zipLong1.equals( zipLong2 ) ); + assertTrue( "works, part two", !zipLong1.equals( zipLong3 ) ); + + assertTrue( "symmetric", zipLong2.equals( zipLong1 ) ); + + assertTrue( "null handling", !zipLong1.equals( null ) ); + assertTrue( "non ZipLong handling", !zipLong1.equals( new Integer( 0x1234 ) ) ); + } + + /** + * Test sign handling. + */ + public void testSign() + { + final ZipLong zipLong = + new ZipLong( new byte[]{(byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF} ); + assertEquals( 0x00000000FFFFFFFFl, zipLong.getValue() ); + } +} diff --git a/proposal/myrmidon/src/testcases/org/apache/aut/zip/ZipShortTest.java b/proposal/myrmidon/src/testcases/org/apache/aut/zip/ZipShortTest.java new file mode 100644 index 000000000..ba9c459fb --- /dev/null +++ b/proposal/myrmidon/src/testcases/org/apache/aut/zip/ZipShortTest.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.aut.zip; + +import junit.framework.TestCase; + +/** + * JUnit 3 testcases for org.apache.tools.zip.ZipShort. + * + * @author Stefan Bodewig + */ +public class ZipShortTest + extends TestCase +{ + public ZipShortTest( String name ) + { + super( name ); + } + + /** + * Test conversion to bytes. + */ + public void testToBytes() + { + final ZipShort zipShort = new ZipShort( 0x1234 ); + byte[] result = zipShort.getBytes(); + assertEquals( "length getBytes", 2, result.length ); + assertEquals( "first byte getBytes", 0x34, result[ 0 ] ); + assertEquals( "second byte getBytes", 0x12, result[ 1 ] ); + } + + /** + * Test conversion from bytes. + */ + public void testFromBytes() + { + byte[] val = new byte[]{0x34, 0x12}; + final ZipShort zipShort = new ZipShort( val ); + assertEquals( "value from bytes", 0x1234, zipShort.getValue() ); + } + + /** + * Test the contract of the equals method. + */ + public void testEquals() + { + final ZipShort zipShort = new ZipShort( 0x1234 ); + final ZipShort zipShort2 = new ZipShort( 0x1234 ); + final ZipShort zipShort3 = new ZipShort( 0x5678 ); + + assertTrue( "reflexive", zipShort.equals( zipShort ) ); + + assertTrue( "works", zipShort.equals( zipShort2 ) ); + assertTrue( "works, part two", !zipShort.equals( zipShort3 ) ); + + assertTrue( "symmetric", zipShort2.equals( zipShort ) ); + + assertTrue( "null handling", !zipShort.equals( null ) ); + assertTrue( "non ZipShort handling", !zipShort.equals( new Integer( 0x1234 ) ) ); + } + + /** + * Test sign handling. + */ + public void testSign() + { + final ZipShort zipShort = new ZipShort( new byte[]{(byte)0xFF, (byte)0xFF} ); + assertEquals( 0x0000FFFF, zipShort.getValue() ); + } +}