You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by sj...@apache.org on 2010/09/14 11:06:43 UTC

svn commit: r996801 [2/2] - in /harmony/enhanced/java/trunk/classlib/modules/pack200/src: main/java/org/apache/harmony/pack200/ main/java/org/apache/harmony/unpack200/ main/java/org/apache/harmony/unpack200/bytecode/ test/java/org/apache/harmony/pack20...

Added: harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/PackingOptionsTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/PackingOptionsTest.java?rev=996801&view=auto
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/PackingOptionsTest.java (added)
+++ harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/PackingOptionsTest.java Tue Sep 14 09:06:42 2010
@@ -0,0 +1,658 @@
+/*
+ *  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.harmony.pack200.tests;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.URISyntaxException;
+import java.util.Enumeration;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+
+import junit.framework.TestCase;
+
+import org.apache.harmony.pack200.Archive;
+import org.apache.harmony.pack200.Pack200Exception;
+import org.apache.harmony.pack200.PackingOptions;
+
+/**
+ * Test different options for packing a Jar file
+ */
+public class PackingOptionsTest extends TestCase {
+
+    JarFile in;
+    OutputStream out;
+    File file;
+
+    public void testKeepFileOrder() throws Exception {
+        // Test default first
+        PackingOptions options = new PackingOptions();
+        assertTrue(options.isKeepFileOrder());
+        options.setKeepFileOrder(false);
+        assertFalse(options.isKeepFileOrder());
+
+        // Test option works correctly. Test 'True'.
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()));
+        file = File.createTempFile("sql", ".pack");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        options = new PackingOptions();
+        options.setGzip(false);
+        Archive archive = new Archive(in, out, options);
+        archive.pack();
+        in.close();
+        out.close();
+
+        InputStream in2 = new FileInputStream(file);
+        File file2 = File.createTempFile("sql", ".jar");
+        file2.deleteOnExit();
+        JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2));
+        org.apache.harmony.unpack200.Archive u2archive = new org.apache.harmony.unpack200.Archive(
+                in2, out2);
+        u2archive.unpack();
+
+        File compareFile = new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI());
+        JarFile jarFile = new JarFile(file2);
+
+        JarFile jarFile2 = new JarFile(compareFile);
+
+        // Check that both jars have the same entries in the same order
+        Enumeration entries = jarFile.entries();
+        Enumeration entries2 = jarFile2.entries();
+        while (entries.hasMoreElements()) {
+
+            JarEntry entry = (JarEntry) entries.nextElement();
+            assertNotNull(entry);
+            JarEntry entry2 = (JarEntry) entries2.nextElement();
+            String name = entry.getName();
+            String name2 = entry2.getName();
+            assertEquals(name, name2);
+        }
+
+        // Test 'false'
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()));
+        file = File.createTempFile("sql", ".pack");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        options = new PackingOptions();
+        options.setKeepFileOrder(false);
+        options.setGzip(false);
+        archive = new Archive(in, out, options);
+        archive.pack();
+        in.close();
+        out.close();
+
+        in2 = new FileInputStream(file);
+        file2 = File.createTempFile("sql", ".jar");
+        file2.deleteOnExit();
+        out2 = new JarOutputStream(new FileOutputStream(file2));
+        u2archive = new org.apache.harmony.unpack200.Archive(in2, out2);
+        u2archive.unpack();
+
+        compareFile = new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI());
+        jarFile = new JarFile(file2);
+
+        jarFile2 = new JarFile(compareFile);
+        // Check that both jars have the same entries (may be in a different
+        // order)
+        compareJarEntries(jarFile, jarFile2);
+
+        // Check files are not in order this time
+        entries = jarFile.entries();
+        entries2 = jarFile2.entries();
+        boolean inOrder = true;
+        while (entries.hasMoreElements()) {
+            JarEntry entry = (JarEntry) entries.nextElement();
+            assertNotNull(entry);
+            JarEntry entry2 = (JarEntry) entries2.nextElement();
+            String name = entry.getName();
+            String name2 = entry2.getName();
+            if (!name.equals(name2)) {
+                inOrder = false;
+                break;
+            }
+        }
+        assertFalse("Files are not expected to be in order", inOrder);
+    }
+
+    public void testDeflateHint() {
+        // Test default first
+        PackingOptions options = new PackingOptions();
+        assertEquals("keep", options.getDeflateHint());
+        options.setDeflateHint("true");
+        assertEquals("true", options.getDeflateHint());
+        options.setDeflateHint("false");
+        assertEquals("false", options.getDeflateHint());
+        try {
+            options.setDeflateHint("hello");
+            fail("Should throw IllegalArgumentException for incorrect deflate hint");
+        } catch (IllegalArgumentException iae) {
+            // pass
+        }
+    }
+
+    public void testModificationTime() throws Exception {
+        // Test default first
+        PackingOptions options = new PackingOptions();
+        assertEquals("keep", options.getModificationTime());
+        options.setModificationTime("latest");
+        assertEquals("latest", options.getModificationTime());
+        try {
+            options.setModificationTime("true");
+            fail("Should throw IllegalArgumentException for incorrect mod time");
+        } catch (IllegalArgumentException iae) {
+            // pass
+        }
+
+        // Test option works correctly. Test 'keep'.
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()));
+        file = File.createTempFile("sql", ".pack");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        options = new PackingOptions();
+        options.setGzip(false);
+        Archive archive = new Archive(in, out, options);
+        archive.pack();
+        in.close();
+        out.close();
+
+        InputStream in2 = new FileInputStream(file);
+        File file2 = File.createTempFile("sql", ".jar");
+        file2.deleteOnExit();
+        JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2));
+        org.apache.harmony.unpack200.Archive u2archive = new org.apache.harmony.unpack200.Archive(
+                in2, out2);
+        u2archive.unpack();
+
+        File compareFile = new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI());
+        JarFile jarFile = new JarFile(file2);
+
+        JarFile jarFile2 = new JarFile(compareFile);
+
+        // Check that both jars have the same entries in the same order
+        Enumeration entries = jarFile.entries();
+        Enumeration entries2 = jarFile2.entries();
+        while (entries.hasMoreElements()) {
+
+            JarEntry entry = (JarEntry) entries.nextElement();
+            assertNotNull(entry);
+            JarEntry entry2 = (JarEntry) entries2.nextElement();
+            String name = entry.getName();
+            String name2 = entry2.getName();
+            assertEquals(name, name2);
+            assertEquals(entry.getTime(), entry2.getTime());
+        }
+
+        // Test option works correctly. Test 'latest'.
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()));
+        file = File.createTempFile("sql", ".pack");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        options = new PackingOptions();
+        options.setGzip(false);
+        options.setModificationTime("latest");
+        archive = new Archive(in, out, options);
+        archive.pack();
+        in.close();
+        out.close();
+
+        in2 = new FileInputStream(file);
+        file2 = File.createTempFile("sql", ".jar");
+        file2.deleteOnExit();
+        out2 = new JarOutputStream(new FileOutputStream(file2));
+        u2archive = new org.apache.harmony.unpack200.Archive(in2, out2);
+        u2archive.unpack();
+
+        compareFile = new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI());
+        jarFile = new JarFile(file2);
+
+        jarFile2 = new JarFile(compareFile);
+
+        // Check that all modtimes are the same and some are not the same as the
+        // original
+        entries = jarFile.entries();
+        entries2 = jarFile2.entries();
+        long modtime = -1;
+        boolean sameAsOriginal = true;
+        while (entries.hasMoreElements()) {
+            JarEntry entry = (JarEntry) entries.nextElement();
+            assertNotNull(entry);
+            JarEntry entry2 = (JarEntry) entries2.nextElement();
+            String name = entry.getName();
+            if (!name.startsWith("META-INF")) {
+                if (modtime == -1) {
+                    modtime = entry.getTime();
+                } else {
+                    assertEquals(modtime, entry.getTime());
+                }
+            }
+            if (entry2.getTime() != entry.getTime()) {
+                sameAsOriginal = false;
+            }
+        }
+        assertFalse("Some modtimes should have changed", sameAsOriginal);
+    }
+
+    // Test verbose, quiet and log file options.
+    public void testLoggingOptions() throws Exception {
+        // Test defaults
+        PackingOptions options = new PackingOptions();
+        assertFalse(options.isVerbose());
+        assertNull(options.getLogFile());
+        options.setVerbose(true);
+        assertTrue(options.isVerbose());
+        options.setQuiet(true);
+        assertFalse(options.isVerbose());
+
+        File logFile = File.createTempFile("logfile", ".txt");
+        logFile.deleteOnExit();
+        options.setLogFile(logFile.getPath());
+        assertEquals(logFile.getPath(), options.getLogFile());
+
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/hw.jar").toURI()));
+        file = File.createTempFile("helloworld", ".pack.gz");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        new Archive(in, out, options).pack();
+        in.close();
+        out.close();
+
+        // log file should be empty
+        FileReader reader = new FileReader(logFile);
+        assertFalse(reader.ready());
+        reader.close();
+
+        options.setVerbose(true);
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/hw.jar").toURI()));
+        file = File.createTempFile("helloworld", ".pack.gz");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        new Archive(in, out, options).pack();
+        in.close();
+        out.close();
+
+        // log file should not be empty
+        reader = new FileReader(logFile);
+        assertTrue(reader.ready());
+        reader.close();
+    }
+
+    public void testSegmentLimits() throws IOException, Pack200Exception,
+            URISyntaxException {
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/hw.jar").toURI()));
+        file = File.createTempFile("helloworld", ".pack.gz");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        PackingOptions options = new PackingOptions();
+        options.setSegmentLimit(0);
+        Archive archive = new Archive(in, out, options);
+        archive.pack();
+        in.close();
+        out.close();
+
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/hw.jar").toURI()));
+        file = File.createTempFile("helloworld", ".pack.gz");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        options = new PackingOptions();
+        options.setSegmentLimit(-1);
+        archive = new Archive(in, out, options);
+        archive.pack();
+        in.close();
+        out.close();
+
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/hw.jar").toURI()));
+        file = File.createTempFile("helloworld", ".pack.gz");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        options = new PackingOptions();
+        options.setSegmentLimit(5000);
+        archive = new Archive(in, out, options);
+        archive.pack();
+        in.close();
+        out.close();
+    }
+
+    public void testStripDebug() throws IOException, Pack200Exception,
+            URISyntaxException {
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()));
+        file = File.createTempFile("sql", ".pack");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        PackingOptions options = new PackingOptions();
+        options.setGzip(false);
+        options.setStripDebug(true);
+        Archive archive = new Archive(in, out, options);
+        archive.pack();
+        in.close();
+        out.close();
+
+        // now unpack
+        InputStream in2 = new FileInputStream(file);
+        File file2 = File.createTempFile("sqloutNoDebug", ".jar");
+        file2.deleteOnExit();
+        JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2));
+        org.apache.harmony.unpack200.Archive u2archive = new org.apache.harmony.unpack200.Archive(
+                in2, out2);
+        u2archive.unpack();
+
+        File compareFile = new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpackedNoDebug.jar")
+                .toURI());
+        JarFile jarFile = new JarFile(file2);
+        assertTrue(file2.length() < 250000);
+
+        JarFile jarFile2 = new JarFile(compareFile);
+
+        compareFiles(jarFile, jarFile2);
+    }
+
+    public void testPassFiles() throws IOException, URISyntaxException,
+            Pack200Exception {
+        // Don't pass any
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()));
+        File file0 = File.createTempFile("sql", ".pack");
+        file0.deleteOnExit();
+        out = new FileOutputStream(file0);
+        PackingOptions options = new PackingOptions();
+        options.setGzip(false);
+        Archive archive = new Archive(in, out, options);
+        archive.pack();
+        in.close();
+        out.close();
+
+        // Pass one file
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()));
+        file = File.createTempFile("sql", ".pack");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        options = new PackingOptions();
+        options.setGzip(false);
+        options.addPassFile("bin/test/org/apache/harmony/sql/tests/java/sql/DatabaseMetaDataTest.class");
+        assertTrue(options
+                .isPassFile("bin/test/org/apache/harmony/sql/tests/java/sql/DatabaseMetaDataTest.class"));
+        archive = new Archive(in, out, options);
+        archive.pack();
+        in.close();
+        out.close();
+
+        // Pass a whole directory
+        in = new JarFile(new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()));
+        File file2 = File.createTempFile("sql", ".pack");
+        file2.deleteOnExit();
+        out = new FileOutputStream(file2);
+        options = new PackingOptions();
+        options.setGzip(false);
+        options.addPassFile("bin/test/org/apache/harmony/sql/tests/java/sql");
+        assertTrue(options
+                .isPassFile("bin/test/org/apache/harmony/sql/tests/java/sql/DatabaseMetaDataTest.class"));
+        assertFalse(options
+                .isPassFile("bin/test/org/apache/harmony/sql/tests/java/sqldata/SqlData.class"));
+        archive = new Archive(in, out, options);
+        archive.pack();
+        in.close();
+        out.close();
+
+        assertTrue("If files are passed then the pack file should be larger",
+                file.length() > file0.length());
+        assertTrue(
+                "If more files are passed then the pack file should be larger",
+                file2.length() > file.length());
+
+        // now unpack
+        InputStream in2 = new FileInputStream(file);
+        File file3 = File.createTempFile("sql", ".jar");
+        file3.deleteOnExit();
+        JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file3));
+        org.apache.harmony.unpack200.Archive u2archive = new org.apache.harmony.unpack200.Archive(
+                in2, out2);
+        u2archive.unpack();
+
+        File compareFile = new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI());
+        JarFile jarFile = new JarFile(file3);
+
+        JarFile jarFile2 = new JarFile(compareFile);
+        // Check that both jars have the same entries
+        compareJarEntries(jarFile, jarFile2);
+
+        // now unpack the file with lots of passed files
+        InputStream in3 = new FileInputStream(file2);
+        File file4 = File.createTempFile("sql", ".jar");
+        file4.deleteOnExit();
+        JarOutputStream out3 = new JarOutputStream(new FileOutputStream(file4));
+        u2archive = new org.apache.harmony.unpack200.Archive(in3, out3);
+        u2archive.unpack();
+        jarFile = new JarFile(file4);
+        jarFile2 = new JarFile(compareFile);
+        compareJarEntries(jarFile, jarFile2);
+    }
+
+    public void testNewAttributes() throws Exception {
+        in = new JarFile(
+                new File(
+                        Archive.class
+                                .getResource(
+                                        "/org/apache/harmony/pack200/tests/jndiWithUnknownAttributes.jar")
+                                .toURI()));
+        file = File.createTempFile("unknown", ".pack");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        PackingOptions options = new PackingOptions();
+        options.addClassAttributeAction("Pack200", "I");
+        Archive ar = new Archive(in, out, options);
+        ar.pack();
+        in.close();
+        out.close();
+
+        // unpack and check this was done right
+        InputStream in2 = new FileInputStream(file);
+        File file2 = File.createTempFile("unknown", ".jar");
+        file2.deleteOnExit();
+        JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2));
+        org.apache.harmony.unpack200.Archive u2archive = new org.apache.harmony.unpack200.Archive(
+                in2, out2);
+        u2archive.unpack();
+
+        // compare with original
+        File compareFile = new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/jndiWithUnknownAttributes.jar").toURI());
+        JarFile jarFile = new JarFile(file2);
+
+        JarFile jarFile2 = new JarFile(compareFile);
+        assertEquals(jarFile2.size(), jarFile.size());
+        compareJarEntries(jarFile, jarFile2);
+//        compareFiles(jarFile, jarFile2);
+    }
+
+    public void testErrorAttributes() throws Exception {
+        in = new JarFile(
+                new File(
+                        Archive.class
+                                .getResource(
+                                        "/org/apache/harmony/pack200/tests/jndiWithUnknownAttributes.jar")
+                                .toURI()));
+        file = File.createTempFile("unknown", ".pack");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        PackingOptions options = new PackingOptions();
+        options.addClassAttributeAction("Pack200", "error");
+        Archive ar = new Archive(in, out, options);
+        try {
+            ar.pack();
+            in.close();
+            out.close();
+            fail("fail");
+        } catch (Error e) {
+            // pass
+            assertEquals("Attribute Pack200 was found", e.getMessage());
+        }
+    }
+
+    public void testPassAttributes() throws Exception {
+        in = new JarFile(
+                new File(
+                        Archive.class
+                                .getResource(
+                                        "/org/apache/harmony/pack200/tests/jndiWithUnknownAttributes.jar")
+                                .toURI()));
+        file = File.createTempFile("unknown", ".pack");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        PackingOptions options = new PackingOptions();
+        options.addClassAttributeAction("Pack200", "pass");
+        Archive ar = new Archive(in, out, options);
+        ar.pack();
+        in.close();
+        out.close();
+
+        // now unpack
+        InputStream in2 = new FileInputStream(file);
+        File file2 = File.createTempFile("unknown", ".jar");
+        file2.deleteOnExit();
+        JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2));
+        org.apache.harmony.unpack200.Archive u2archive = new org.apache.harmony.unpack200.Archive(
+                in2, out2);
+        u2archive.unpack();
+
+        // compare with original
+        File compareFile = new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/jndiWithUnknownAttributes.jar").toURI());
+        JarFile jarFile = new JarFile(file2);
+
+        JarFile jarFile2 = new JarFile(compareFile);
+        assertEquals(jarFile2.size(), jarFile.size());
+        compareJarEntries(jarFile, jarFile2);
+    }
+
+    public void testE0() throws Pack200Exception, IOException,
+            URISyntaxException {
+        File f1 = new File(Archive.class.getResource(
+                "/org/apache/harmony/pack200/tests/jndi.jar").toURI());
+        in = new JarFile(f1);
+        file = File.createTempFile("jndiE0", ".pack");
+        file.deleteOnExit();
+        out = new FileOutputStream(file);
+        PackingOptions options = new PackingOptions();
+        options.setGzip(false);
+        options.setEffort(0);
+        Archive archive = new Archive(in, out, options);
+        archive.pack();
+        in.close();
+        out.close();
+        compareFiles(new JarFile(f1), new JarFile(file));
+
+    }
+
+    // public void testE0again() throws IOException, Pack200Exception,
+    // URISyntaxException {
+    // JarInputStream inputStream = new
+    // JarInputStream(Archive.class.getResourceAsStream("/org/apache/harmony/pack200/tests/jndi.jar"));
+    // file = File.createTempFile("jndiE0", ".pack");
+    // out = new FileOutputStream(file);
+    // Archive archive = new Archive(inputStream, out, false);
+    // archive.setEffort(0);
+    // archive.pack();
+    // inputStream.close();
+    // out.close();
+    // in = new JarFile(new File(Archive.class.getResource(
+    // "/org/apache/harmony/pack200/tests/jndi.jar").toURI()));
+    // compareFiles(in, new JarFile(file));
+    // }
+
+    private void compareJarEntries(JarFile jarFile, JarFile jarFile2)
+            throws IOException {
+        Enumeration entries = jarFile.entries();
+        while (entries.hasMoreElements()) {
+
+            JarEntry entry = (JarEntry) entries.nextElement();
+            assertNotNull(entry);
+
+            String name = entry.getName();
+            JarEntry entry2 = jarFile2.getJarEntry(name);
+            assertNotNull("Missing Entry: " + name, entry2);
+        }
+    }
+
+    private void compareFiles(JarFile jarFile, JarFile jarFile2)
+            throws IOException {
+        Enumeration entries = jarFile.entries();
+        while (entries.hasMoreElements()) {
+
+            JarEntry entry = (JarEntry) entries.nextElement();
+            assertNotNull(entry);
+
+            String name = entry.getName();
+            JarEntry entry2 = jarFile2.getJarEntry(name);
+            assertNotNull("Missing Entry: " + name, entry2);
+            // assertEquals(entry.getTime(), entry2.getTime());
+            if (!name.equals("META-INF/MANIFEST.MF")) { // Manifests aren't
+                                                        // necessarily
+                                                        // byte-for-byte
+                                                        // identical
+
+                InputStream ours = jarFile.getInputStream(entry);
+                InputStream expected = jarFile2.getInputStream(entry2);
+
+                BufferedReader reader1 = new BufferedReader(
+                        new InputStreamReader(ours));
+                BufferedReader reader2 = new BufferedReader(
+                        new InputStreamReader(expected));
+                String line1 = reader1.readLine();
+                String line2 = reader2.readLine();
+                int i = 1;
+                while (line1 != null || line2 != null) {
+                    assertEquals("Unpacked files differ for " + name, line2,
+                            line1);
+                    line1 = reader1.readLine();
+                    line2 = reader2.readLine();
+                    i++;
+                }
+                reader1.close();
+                reader2.close();
+            }
+        }
+        jarFile.close();
+        jarFile2.close();
+    }
+
+}

Propchange: harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/PackingOptionsTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/ArchiveTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/ArchiveTest.java?rev=996801&r1=996800&r2=996801&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/ArchiveTest.java (original)
+++ harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/ArchiveTest.java Tue Sep 14 09:06:42 2010
@@ -19,6 +19,7 @@ package org.apache.harmony.unpack200.tes
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -65,11 +66,11 @@ public class ArchiveTest extends TestCas
         in = Archive.class
                 .getResourceAsStream("/org/apache/harmony/pack200/tests/sql.pack.gz");
         file = File.createTempFile("sql", ".jar");
+        file.deleteOnExit();
         out = new JarOutputStream(new FileOutputStream(file));
         Archive archive = new Archive(in, out);
         archive.unpack();
         JarFile jarFile = new JarFile(file);
-        file.deleteOnExit();
 
         File compareFile = new File(Archive.class.getResource(
                 "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI());
@@ -172,6 +173,7 @@ public class ArchiveTest extends TestCas
         in = Archive.class
                 .getResourceAsStream("/org/apache/harmony/pack200/tests/LargeClass.pack.gz");
         file = File.createTempFile("largeClass", ".jar");
+        file.deleteOnExit();
         out = new JarOutputStream(new FileOutputStream(file));
         Archive archive = new Archive(in, out);
         archive.unpack();
@@ -196,4 +198,60 @@ public class ArchiveTest extends TestCas
         file.delete();
     }
 
+    // Test verbose, quiet and log file options.
+    public void testLoggingOptions() throws Exception {
+        // test default option, which is quiet (no output at all)
+        in = Archive.class
+                .getResourceAsStream("/org/apache/harmony/pack200/tests/sql.pack.gz");
+        file = File.createTempFile("logtest", ".jar");
+        file.deleteOnExit();
+        out = new JarOutputStream(new FileOutputStream(file));
+        Archive archive = new Archive(in, out);
+        File logFile = File.createTempFile("logfile", ".txt");
+        logFile.deleteOnExit();
+        archive.setLogFile(logFile.getPath());
+        archive.unpack();
+
+        // log file should be empty
+        FileReader reader = new FileReader(logFile);
+        assertFalse(reader.ready());
+        reader.close();
+
+        // test verbose
+        in = Archive.class
+                .getResourceAsStream("/org/apache/harmony/pack200/tests/sql.pack.gz");
+        file = File.createTempFile("logtest", ".jar");
+        file.deleteOnExit();
+        out = new JarOutputStream(new FileOutputStream(file));
+        archive = new Archive(in, out);
+        logFile = File.createTempFile("logfile", ".txt");
+        logFile.deleteOnExit();
+        archive.setLogFile(logFile.getPath());
+        archive.setVerbose(true);
+        archive.unpack();
+
+        // log file should not be empty
+        reader = new FileReader(logFile);
+        assertTrue(reader.ready());
+        reader.close();
+
+        // test setting quiet explicitly
+        in = Archive.class
+                .getResourceAsStream("/org/apache/harmony/pack200/tests/sql.pack.gz");
+        file = File.createTempFile("logtest", ".jar");
+        file.deleteOnExit();
+        out = new JarOutputStream(new FileOutputStream(file));
+        archive = new Archive(in, out);
+        logFile = File.createTempFile("logfile", ".txt");
+        logFile.deleteOnExit();
+        archive.setLogFile(logFile.getPath());
+        archive.setQuiet(true);
+        archive.unpack();
+
+        // log file should be empty
+        reader = new FileReader(logFile);
+        assertFalse(reader.ready());
+        reader.close();
+    }
+
 }
\ No newline at end of file

Added: harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/NewAttributeBandsTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/NewAttributeBandsTest.java?rev=996801&view=auto
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/NewAttributeBandsTest.java (added)
+++ harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/NewAttributeBandsTest.java Tue Sep 14 09:06:42 2010
@@ -0,0 +1,256 @@
+/*
+ *  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.harmony.unpack200.tests;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.harmony.pack200.Pack200Exception;
+import org.apache.harmony.unpack200.AttributeLayout;
+import org.apache.harmony.unpack200.NewAttributeBands;
+import org.apache.harmony.unpack200.NewAttributeBands.Call;
+import org.apache.harmony.unpack200.NewAttributeBands.Callable;
+import org.apache.harmony.unpack200.NewAttributeBands.Integral;
+import org.apache.harmony.unpack200.NewAttributeBands.Reference;
+import org.apache.harmony.unpack200.NewAttributeBands.Replication;
+import org.apache.harmony.unpack200.NewAttributeBands.Union;
+import org.apache.harmony.unpack200.NewAttributeBands.UnionCase;
+import org.apache.harmony.unpack200.Segment;
+
+/**
+ * Tests for unpack200 support for non-predefined attributes
+ */
+public class NewAttributeBandsTest extends AbstractBandsTestCase {
+
+    public void testEmptyLayout() throws IOException, Pack200Exception {
+        MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(
+                new MockSegment(), new AttributeLayout("test",
+                        AttributeLayout.CONTEXT_CLASS, "", 25));
+        List layoutElements = newAttributeBands.getLayoutElements();
+        assertEquals(0, layoutElements.size());
+    }
+
+    public void testIntegralLayout() throws IOException, Pack200Exception {
+        tryIntegral("B");
+        tryIntegral("FB");
+        tryIntegral("SB");
+        tryIntegral("H");
+        tryIntegral("FH");
+        tryIntegral("SH");
+        tryIntegral("I");
+        tryIntegral("FI");
+        tryIntegral("SI");
+        tryIntegral("PB");
+        tryIntegral("OB");
+        tryIntegral("OSB");
+        tryIntegral("POB");
+        tryIntegral("PH");
+        tryIntegral("OH");
+        tryIntegral("OSH");
+        tryIntegral("POH");
+        tryIntegral("PI");
+        tryIntegral("OI");
+        tryIntegral("OSI");
+        tryIntegral("POI");
+    }
+
+    public void tryIntegral(String layout) throws IOException, Pack200Exception {
+        MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(
+                new MockSegment(), new AttributeLayout("test",
+                        AttributeLayout.CONTEXT_CLASS, layout, 25));
+        List layoutElements = newAttributeBands.getLayoutElements();
+        assertEquals(1, layoutElements.size());
+        Integral element = (Integral) layoutElements.get(0);
+        assertEquals(layout, element.getTag());
+    }
+
+    public void testReplicationLayout() throws IOException, Pack200Exception {
+        MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(
+                new MockSegment(), new AttributeLayout("test",
+                        AttributeLayout.CONTEXT_CLASS, "NH[PHOHRUHRSHH]", 25));
+        List layoutElements = newAttributeBands.getLayoutElements();
+        assertEquals(1, layoutElements.size());
+        Replication element = (Replication) layoutElements.get(0);
+        Integral countElement = element.getCountElement();
+        assertEquals("H", countElement.getTag());
+        List replicatedElements = element.getLayoutElements();
+        assertEquals(5, replicatedElements.size());
+        Integral firstElement = (Integral) replicatedElements.get(0);
+        assertEquals("PH", firstElement.getTag());
+        Integral secondElement = (Integral) replicatedElements.get(1);
+        assertEquals("OH", secondElement.getTag());
+        Reference thirdElement = (Reference) replicatedElements.get(2);
+        assertEquals("RUH", thirdElement.getTag());
+        Reference fourthElement = (Reference) replicatedElements.get(3);
+        assertEquals("RSH", fourthElement.getTag());
+        Integral fifthElement = (Integral) replicatedElements.get(4);
+        assertEquals("H", fifthElement.getTag());
+    }
+
+    public void testReferenceLayouts() throws IOException, Pack200Exception {
+        tryReference("KIB");
+        tryReference("KIH");
+        tryReference("KII");
+        tryReference("KINH");
+        tryReference("KJH");
+        tryReference("KDH");
+        tryReference("KSH");
+        tryReference("KQH");
+        tryReference("RCH");
+        tryReference("RSH");
+        tryReference("RDH");
+        tryReference("RFH");
+        tryReference("RMH");
+        tryReference("RIH");
+        tryReference("RUH");
+        tryReference("RQH");
+        tryReference("RQNH");
+        tryReference("RQNI");
+    }
+
+    private void tryReference(String layout) throws IOException,
+            Pack200Exception {
+        MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(
+                new MockSegment(), new AttributeLayout("test",
+                        AttributeLayout.CONTEXT_CODE, layout, 26));
+        List layoutElements = newAttributeBands.getLayoutElements();
+        assertEquals(1, layoutElements.size());
+        Reference element = (Reference) layoutElements.get(0);
+        assertEquals(layout, element.getTag());
+    }
+
+    public void testUnionLayout() throws IOException, Pack200Exception {
+        MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(
+                new MockSegment(), new AttributeLayout("test",
+                        AttributeLayout.CONTEXT_CODE,
+                        "TB(55)[FH](23)[]()[RSH]", 26));
+        List layoutElements = newAttributeBands.getLayoutElements();
+        assertEquals(1, layoutElements.size());
+        Union element = (Union) layoutElements.get(0);
+        Integral tag = element.getUnionTag();
+        assertEquals("B", tag.getTag());
+        List unionCases = element.getUnionCases();
+        assertEquals(2, unionCases.size());
+        UnionCase firstCase = (UnionCase) unionCases.get(0);
+        assertTrue(firstCase.hasTag(55));
+        assertFalse(firstCase.hasTag(23));
+        List body = firstCase.getBody();
+        assertEquals(1, body.size());
+        Integral bodyElement = (Integral) body.get(0);
+        assertEquals("FH", bodyElement.getTag());
+        UnionCase secondCase = (UnionCase) unionCases.get(1);
+        assertTrue(secondCase.hasTag(23));
+        assertFalse(secondCase.hasTag(55));
+        body = secondCase.getBody();
+        assertEquals(0, body.size());
+        List defaultBody = element.getDefaultCaseBody();
+        assertEquals(1, defaultBody.size());
+        Reference ref = (Reference) defaultBody.get(0);
+        assertEquals("RSH", ref.getTag());
+    }
+
+    public void testLayoutWithCalls() throws IOException, Pack200Exception {
+        MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(
+                new MockSegment(),
+                new AttributeLayout(
+                        "test",
+                        AttributeLayout.CONTEXT_FIELD,
+                        "[NH[(1)]][RSH NH[RUH(1)]][TB(66,67,73,83,90)[KIH](68)[KDH](70)[KFH](74)[KJH](99)[RSH](101)[RSH RUH](115)[RUH](91)[NH[(0)]](64)[RSH[RUH(0)]]()[]]",
+                        26));
+        List layoutElements = newAttributeBands.getLayoutElements();
+        assertEquals(3, layoutElements.size());
+        Callable firstCallable = (Callable) layoutElements.get(0);
+        Callable secondCallable = (Callable) layoutElements.get(1);
+        Callable thirdCallable = (Callable) layoutElements.get(2);
+        List firstBody = firstCallable.getBody();
+        assertEquals(1, firstBody.size());
+        Replication rep = (Replication) firstBody.get(0);
+        List repBody = rep.getLayoutElements();
+        assertEquals(1, repBody.size());
+        Call call = (Call) repBody.get(0);
+        assertEquals(1, call.getCallableIndex());
+        assertEquals(secondCallable, call.getCallable());
+        assertFalse(firstCallable.isBackwardsCallable());
+        assertFalse(secondCallable.isBackwardsCallable());
+        assertFalse(thirdCallable.isBackwardsCallable());
+    }
+
+    public void testLayoutWithBackwardsCall() throws IOException,
+            Pack200Exception {
+        MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(
+                new MockSegment(), new AttributeLayout("test",
+                        AttributeLayout.CONTEXT_METHOD, "[NH[(1)]][KIH][(-1)]",
+                        20));
+        List layoutElements = newAttributeBands.getLayoutElements();
+        assertEquals(3, layoutElements.size());
+        Callable firstCallable = (Callable) layoutElements.get(0);
+        Callable secondCallable = (Callable) layoutElements.get(1);
+        Callable thirdCallable = (Callable) layoutElements.get(2);
+        List thirdBody = thirdCallable.getBody();
+        assertEquals(1, thirdBody.size());
+        Call call = (Call) thirdBody.get(0);
+        assertEquals(secondCallable, call.getCallable());
+        assertTrue(secondCallable.isBackwardsCallable());
+        assertFalse(firstCallable.isBackwardsCallable());
+        assertFalse(thirdCallable.isBackwardsCallable());
+
+        newAttributeBands = new MockNewAttributeBands(new MockSegment(),
+                new AttributeLayout("test", AttributeLayout.CONTEXT_METHOD,
+                        "[NH[(1)]][KIH][(-2)]", 20));
+        layoutElements = newAttributeBands.getLayoutElements();
+        assertEquals(3, layoutElements.size());
+        firstCallable = (Callable) layoutElements.get(0);
+        secondCallable = (Callable) layoutElements.get(1);
+        thirdCallable = (Callable) layoutElements.get(2);
+        thirdBody = thirdCallable.getBody();
+        assertEquals(1, thirdBody.size());
+        call = (Call) thirdBody.get(0);
+        assertEquals(firstCallable, call.getCallable());
+        assertTrue(firstCallable.isBackwardsCallable());
+        assertFalse(secondCallable.isBackwardsCallable());
+        assertFalse(thirdCallable.isBackwardsCallable());
+
+        newAttributeBands = new MockNewAttributeBands(new MockSegment(),
+                new AttributeLayout("test", AttributeLayout.CONTEXT_METHOD,
+                        "[NH[(1)]][KIH][(0)]", 20));
+        layoutElements = newAttributeBands.getLayoutElements();
+        assertEquals(3, layoutElements.size());
+        firstCallable = (Callable) layoutElements.get(0);
+        secondCallable = (Callable) layoutElements.get(1);
+        thirdCallable = (Callable) layoutElements.get(2);
+        thirdBody = thirdCallable.getBody();
+        assertEquals(1, thirdBody.size());
+        call = (Call) thirdBody.get(0);
+        assertEquals(thirdCallable, call.getCallable());
+        assertTrue(thirdCallable.isBackwardsCallable());
+        assertFalse(firstCallable.isBackwardsCallable());
+        assertFalse(secondCallable.isBackwardsCallable());
+        assertFalse(firstCallable.isBackwardsCallable());
+    }
+
+    private class MockNewAttributeBands extends NewAttributeBands {
+
+        public MockNewAttributeBands(Segment segment, AttributeLayout layout)
+                throws IOException {
+            super(segment, layout);
+        }
+
+        public List getLayoutElements() {
+            return attributeLayoutElements;
+        }
+    }
+}

Propchange: harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/java/org/apache/harmony/unpack200/tests/NewAttributeBandsTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/resources/org/apache/harmony/pack200/tests/annotationsRI.jar
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/resources/org/apache/harmony/pack200/tests/annotationsRI.jar?rev=996801&view=auto
==============================================================================
Binary file - no diff available.

Propchange: harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/resources/org/apache/harmony/pack200/tests/annotationsRI.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/resources/org/apache/harmony/pack200/tests/jndiWithUnknownAttributes.jar
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/resources/org/apache/harmony/pack200/tests/jndiWithUnknownAttributes.jar?rev=996801&view=auto
==============================================================================
Binary file - no diff available.

Propchange: harmony/enhanced/java/trunk/classlib/modules/pack200/src/test/resources/org/apache/harmony/pack200/tests/jndiWithUnknownAttributes.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream