blob: c6f07dece5fd6913cc962a57ce70aba9fbab5690 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.harmony.archive.tests.java.util.jar;
import dalvik.annotation.KnownFailure;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargetNew;
import tests.support.Support_Exec;
import tests.support.resource.Support_Resources;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
*
* tests for various cases of java -jar ... execution with .zip files as args
* some tests are just copy of JarExecTest ones
*/
@TestTargetClass(ZipOutputStream.class)
public class ZipExecTest extends junit.framework.TestCase {
@TestTargetNew(
level = TestLevel.ADDITIONAL,
notes = "Regression functional test. Exception checking missed.",
method = "putNextEntry",
args = {java.util.zip.ZipEntry.class}
)
@KnownFailure("Maybe not a failure, but dalvikvm -jar is not supported (, as yet).")
public void test_1562() throws Exception {
Manifest man = new Manifest();
Attributes att = man.getMainAttributes();
att.put(Attributes.Name.MANIFEST_VERSION, "1.0");
att.put(Attributes.Name.MAIN_CLASS, "foo.bar.execjartest.Foo");
File outputZip = File.createTempFile("hyts_", ".zip");
outputZip.deleteOnExit();
ZipOutputStream zout = new ZipOutputStream(new FileOutputStream(
outputZip));
File resources = Support_Resources.createTempFolder();
for (String zipClass : new String[] {"Foo", "Bar"}) {
zout.putNextEntry(new ZipEntry("foo/bar/execjartest/" + zipClass
+ ".class"));
zout.write(getResource(resources, "hyts_" + zipClass + ".ser"));
}
zout.putNextEntry(new ZipEntry("META-INF/MANIFEST.MF"));
man.write(zout);
zout.close();
// set up the VM parameters
String[] args = new String[] {"-jar", outputZip.getAbsolutePath()};
// execute the JAR and read the result
String res = Support_Exec.execJava(args, null, false);
assertTrue("Error executing ZIP : result returned was incorrect.", res
.startsWith("FOOBAR"));
}
/**
* tests Class-Path entry in manifest
*
* @throws Exception in case of troubles
*/
@TestTargetNew(
level = TestLevel.ADDITIONAL,
notes = "Functional test.",
method = "ZipOutputStream",
args = {java.io.OutputStream.class}
)
@KnownFailure("Maybe not a failure, but dalvikvm -jar is not supported (, as yet).")
public void test_zip_class_path() throws Exception {
File fooZip = File.createTempFile("hyts_", ".zip");
File barZip = File.createTempFile("hyts_", ".zip");
fooZip.deleteOnExit();
barZip.deleteOnExit();
// create the manifest
Manifest man = new Manifest();
Attributes att = man.getMainAttributes();
att.put(Attributes.Name.MANIFEST_VERSION, "1.0");
att.put(Attributes.Name.MAIN_CLASS, "foo.bar.execjartest.Foo");
att.put(Attributes.Name.CLASS_PATH, barZip.getName());
File resources = Support_Resources.createTempFolder();
ZipOutputStream zoutFoo = new ZipOutputStream(new FileOutputStream(
fooZip));
zoutFoo.putNextEntry(new ZipEntry("META-INF/MANIFEST.MF"));
man.write(zoutFoo);
zoutFoo.putNextEntry(new ZipEntry("foo/bar/execjartest/Foo.class"));
zoutFoo.write(getResource(resources, "hyts_Foo.ser"));
zoutFoo.close();
ZipOutputStream zoutBar = new ZipOutputStream(new FileOutputStream(
barZip));
zoutBar.putNextEntry(new ZipEntry("foo/bar/execjartest/Bar.class"));
zoutBar.write(getResource(resources, "hyts_Bar.ser"));
zoutBar.close();
String[] args = new String[] {"-jar", fooZip.getAbsolutePath()};
// execute the JAR and read the result
String res = Support_Exec.execJava(args, null, false);
assertTrue("Error executing JAR : result returned was incorrect.", res
.startsWith("FOOBAR"));
// rewrite manifest so it contains not only reference to bar but useless
// entries as well
att.put(Attributes.Name.CLASS_PATH, "xx yy zz " + barZip.getName());
zoutFoo = new ZipOutputStream(new FileOutputStream(fooZip));
zoutFoo.putNextEntry(new ZipEntry("META-INF/MANIFEST.MF"));
man.write(zoutFoo);
zoutFoo.putNextEntry(new ZipEntry("foo/bar/execjartest/Foo.class"));
zoutFoo.write(getResource(resources, "hyts_Foo.ser"));
zoutFoo.close();
// execute the JAR and read the result
res = Support_Exec.execJava(args, null, false);
assertTrue("Error executing JAR : result returned was incorrect.", res
.startsWith("FOOBAR"));
// play with relative file names - put relative path as ../<parent dir
// name>/xx.zip
att.put(Attributes.Name.CLASS_PATH, ".." + File.separator
+ barZip.getParentFile().getName() + File.separator
+ barZip.getName());
zoutFoo = new ZipOutputStream(new FileOutputStream(fooZip));
zoutFoo.putNextEntry(new ZipEntry("META-INF/MANIFEST.MF"));
man.write(zoutFoo);
zoutFoo.putNextEntry(new ZipEntry("foo/bar/execjartest/Foo.class"));
zoutFoo.write(getResource(resources, "hyts_Foo.ser"));
zoutFoo.close();
// execute the ZIP and read the result
res = Support_Exec.execJava(args, null, false);
assertTrue("Error executing JAR : result returned was incorrect.", res
.startsWith("FOOBAR"));
}
@TestTargetNew(
level = TestLevel.ADDITIONAL,
notes = "Functional test.",
method = "ZipOutputStream",
args = {java.io.OutputStream.class}
)
@KnownFailure("Maybe not a failure, but dalvikvm -jar is not supported (, as yet).")
public void test_zip_jar_mix() throws Exception {
File fooJar = File.createTempFile("hyts_", ".jar");
File barZip = File.createTempFile("hyts_", ".zip");
fooJar.deleteOnExit();
barZip.deleteOnExit();
// create the manifest
Manifest man = new Manifest();
Attributes att = man.getMainAttributes();
att.put(Attributes.Name.MANIFEST_VERSION, "1.0");
att.put(Attributes.Name.MAIN_CLASS, "foo.bar.execjartest.Foo");
att.put(Attributes.Name.CLASS_PATH, barZip.getName());
File resources = Support_Resources.createTempFolder();
JarOutputStream joutFoo = new JarOutputStream(new FileOutputStream(
fooJar), man);
joutFoo.putNextEntry(new JarEntry("foo/bar/execjartest/Foo.class"));
joutFoo.write(getResource(resources, "hyts_Foo.ser"));
joutFoo.close();
ZipOutputStream zoutBar = new ZipOutputStream(new FileOutputStream(
barZip));
zoutBar.putNextEntry(new ZipEntry("foo/bar/execjartest/Bar.class"));
zoutBar.write(getResource(resources, "hyts_Bar.ser"));
zoutBar.close();
String[] args = new String[] {"-jar", fooJar.getAbsolutePath()};
// execute the JAR and read the result
String res = Support_Exec.execJava(args, null, false);
assertTrue("Error executing JAR : result returned was incorrect.", res
.startsWith("FOOBAR"));
}
@TestTargetNew(
level = TestLevel.ADDITIONAL,
notes = "Functional test.",
method = "ZipOutputStream",
args = {java.io.OutputStream.class}
)
@KnownFailure("Maybe not a failure, but dalvikvm -jar is not supported (, as yet).")
public void test_zip_jar_mix_1() throws Exception {
File fooZip = File.createTempFile("hyts_", ".zip");
File barJar = File.createTempFile("hyts_", ".jar");
fooZip.deleteOnExit();
barJar.deleteOnExit();
// create the manifest
Manifest man = new Manifest();
Attributes att = man.getMainAttributes();
att.put(Attributes.Name.MANIFEST_VERSION, "1.0");
att.put(Attributes.Name.MAIN_CLASS, "foo.bar.execjartest.Foo");
att.put(Attributes.Name.CLASS_PATH, barJar.getName());
File resources = Support_Resources.createTempFolder();
ZipOutputStream zoutFoo = new ZipOutputStream(new FileOutputStream(
fooZip));
zoutFoo.putNextEntry(new ZipEntry("META-INF/MANIFEST.MF"));
man.write(zoutFoo);
zoutFoo.putNextEntry(new ZipEntry("foo/bar/execjartest/Foo.class"));
zoutFoo.write(getResource(resources, "hyts_Foo.ser"));
zoutFoo.close();
JarOutputStream joutBar = new JarOutputStream(new FileOutputStream(
barJar));
joutBar.putNextEntry(new ZipEntry("foo/bar/execjartest/Bar.class"));
joutBar.write(getResource(resources, "hyts_Bar.ser"));
joutBar.close();
String[] args = new String[] {"-jar", fooZip.getAbsolutePath()};
// execute the JAR and read the result
String res = Support_Exec.execJava(args, null, false);
assertTrue("Error executing ZIP : result returned was incorrect.", res
.startsWith("FOOBAR"));
}
/**
* tests case when Main-Class is not in the zip launched but in another zip
* referenced by Class-Path
*
* @throws Exception in case of troubles
*/
@TestTargetNew(
level = TestLevel.ADDITIONAL,
notes = "Functional test.",
method = "ZipOutputStream",
args = {java.io.OutputStream.class}
)
@KnownFailure("Maybe not a failure, but dalvikvm -jar is not supported (, as yet).")
public void test_main_class_in_another_zip() throws Exception {
File fooZip = File.createTempFile("hyts_", ".zip");
File barZip = File.createTempFile("hyts_", ".zip");
fooZip.deleteOnExit();
barZip.deleteOnExit();
// create the manifest
Manifest man = new Manifest();
Attributes att = man.getMainAttributes();
att.put(Attributes.Name.MANIFEST_VERSION, "1.0");
att.put(Attributes.Name.MAIN_CLASS, "foo.bar.execjartest.Foo");
att.put(Attributes.Name.CLASS_PATH, fooZip.getName());
File resources = Support_Resources.createTempFolder();
ZipOutputStream zoutFoo = new ZipOutputStream(new FileOutputStream(
fooZip));
zoutFoo.putNextEntry(new ZipEntry("foo/bar/execjartest/Foo.class"));
zoutFoo.write(getResource(resources, "hyts_Foo.ser"));
zoutFoo.close();
ZipOutputStream zoutBar = new ZipOutputStream(new FileOutputStream(
barZip));
zoutBar.putNextEntry(new ZipEntry("META-INF/MANIFEST.MF"));
man.write(zoutBar);
zoutBar.putNextEntry(new ZipEntry("foo/bar/execjartest/Bar.class"));
zoutBar.write(getResource(resources, "hyts_Bar.ser"));
zoutBar.close();
String[] args = new String[] {"-jar", barZip.getAbsolutePath()};
// execute the JAR and read the result
String res = Support_Exec.execJava(args, null, false);
assertTrue("Error executing JAR : result returned was incorrect.", res
.startsWith("FOOBAR"));
}
private static byte[] getResource(File tempDir, String resourceName)
throws IOException {
Support_Resources.copyFile(tempDir, null, resourceName);
File resourceFile = new File(tempDir, resourceName);
resourceFile.deleteOnExit();
// read whole resource data into memory
byte[] resourceBody = new byte[(int) resourceFile.length()];
FileInputStream fis = new FileInputStream(resourceFile);
fis.read(resourceBody);
fis.close();
return resourceBody;
}
}