git-svn-id: https://svn.apache.org/repos/asf/harmony/enhanced/java/trunk@996801 13f79535-47bb-0310-9956-ffa450edef68master
parent
fcc17bda44
commit
930ffc504e
@ -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(); |
||||
} |
||||
|
||||
} |
@ -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; |
||||
} |
||||
} |
||||
} |
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue