/* * 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; } }