/* * 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.tests.java.net; import tests.support.resource.Support_Resources; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class JarURLConnectionTest extends junit.framework.TestCase { private JarURLConnection juc; private URL copyAndOpenResourceStream(String jarFile, String inFile) throws MalformedURLException { File resources = Support_Resources.createTempFolder(); Support_Resources.copyFile(resources, "net", jarFile); File file = new File(resources.toString() + "/net/" + jarFile); return new URL("jar:file:" + file.getPath() + "!/" + inFile); } /** * java.net.JarURLConnection#getAttributes() */ public void test_getAttributes() throws Exception { URL u = copyAndOpenResourceStream("lf.jar", "swt.dll"); juc = (JarURLConnection) u.openConnection(); java.util.jar.Attributes a = juc.getJarEntry().getAttributes(); assertEquals("Returned incorrect Attributes", "SHA MD5", a .get(new java.util.jar.Attributes.Name("Digest-Algorithms"))); } /** * @throws Exception * java.net.JarURLConnection#getEntryName() */ public void test_getEntryName() throws Exception { URL u = copyAndOpenResourceStream("lf.jar", "plus.bmp"); juc = (JarURLConnection) u.openConnection(); assertEquals("Returned incorrect entryName", "plus.bmp", juc .getEntryName()); u = copyAndOpenResourceStream("lf.jar", ""); juc = (JarURLConnection) u.openConnection(); assertNull("Returned incorrect entryName", juc.getEntryName()); // Regression test for harmony-3053 URL url = copyAndOpenResourceStream("lf.jar", "foo.jar!/Bugs/HelloWorld.class"); assertEquals("foo.jar!/Bugs/HelloWorld.class", ((JarURLConnection) url.openConnection()).getEntryName()); } /** * java.net.JarURLConnection#getJarEntry() */ public void test_getJarEntry() throws Exception { URL u = copyAndOpenResourceStream("lf.jar", "plus.bmp"); juc = (JarURLConnection) u.openConnection(); assertEquals("Returned incorrect JarEntry", "plus.bmp", juc .getJarEntry().getName()); u = copyAndOpenResourceStream("lf.jar", ""); juc = (JarURLConnection) u.openConnection(); assertNull("Returned incorrect JarEntry", juc.getJarEntry()); } /** * java.net.JarURLConnection#getJarFile() */ public void test_getJarFile() throws MalformedURLException, IOException { URL url = copyAndOpenResourceStream("lf.jar", "missing"); JarURLConnection connection = null; connection = (JarURLConnection) url.openConnection(); try { connection.connect(); fail("Did not throw exception on connect"); } catch (IOException e) { // expected } try { connection.getJarFile(); fail("Did not throw exception after connect"); } catch (IOException e) { // expected } File resources = Support_Resources.createTempFolder(); Support_Resources.copyFile(resources, null, "hyts_att.jar"); File file = new File(resources.toString() + "/hyts_att.jar"); URL fUrl1 = new URL("jar:file:" + file.getPath() + "!/"); JarURLConnection con1 = (JarURLConnection) fUrl1.openConnection(); ZipFile jf1 = con1.getJarFile(); JarURLConnection con2 = (JarURLConnection) fUrl1.openConnection(); ZipFile jf2 = con2.getJarFile(); assertTrue("file: JarFiles not the same", jf1 == jf2); jf1.close(); assertTrue("File should exist", file.exists()); con1 = (JarURLConnection) fUrl1.openConnection(); jf1 = con1.getJarFile(); con2 = (JarURLConnection) fUrl1.openConnection(); jf2 = con2.getJarFile(); assertTrue("http: JarFiles not the same", jf1 == jf2); jf1.close(); } /** * java.net.JarURLConnection.getJarFile() * <p/> * Regression test for HARMONY-29 */ public void test_getJarFile29() throws Exception { File jarFile = File.createTempFile("1+2 3", "test.jar"); jarFile.deleteOnExit(); JarOutputStream out = new JarOutputStream(new FileOutputStream(jarFile)); out.putNextEntry(new ZipEntry("test")); out.closeEntry(); out.close(); JarURLConnection conn = (JarURLConnection) new URL("jar:file:" + jarFile.getAbsolutePath().replaceAll(" ", "%20") + "!/") .openConnection(); conn.getJarFile().entries(); } //Regression for HARMONY-3436 public void test_setUseCaches() throws Exception { File resources = Support_Resources.createTempFolder(); Support_Resources.copyFile(resources, null, "hyts_att.jar"); File file = new File(resources.toString() + "/hyts_att.jar"); URL url = new URL("jar:file:" + file.getPath() + "!/HasAttributes.txt"); JarURLConnection connection = (JarURLConnection) url.openConnection(); connection.setUseCaches(false); InputStream in = connection.getInputStream(); JarFile jarFile1 = connection.getJarFile(); JarEntry jarEntry1 = connection.getJarEntry(); byte[] data = new byte[1024]; while (in.read(data) >= 0) ; in.close(); JarFile jarFile2 = connection.getJarFile(); JarEntry jarEntry2 = connection.getJarEntry(); assertSame(jarFile1, jarFile2); assertSame(jarEntry1, jarEntry2); try { connection.getInputStream(); fail("should throw IllegalStateException"); } catch (IllegalStateException e) { // expected } } /** * java.net.JarURLConnection#getJarFileURL() */ public void test_getJarFileURL() throws Exception { // Regression test for harmony-3053 URL url = new URL("jar:file:///bar.jar!/foo.jar!/Bugs/HelloWorld.class"); assertEquals("file:///bar.jar", ((JarURLConnection) url.openConnection()).getJarFileURL().toString()); } /** * java.net.JarURLConnection#getMainAttributes() */ public void test_getMainAttributes() throws Exception { URL u = copyAndOpenResourceStream("lf.jar", "swt.dll"); juc = (JarURLConnection) u.openConnection(); java.util.jar.Attributes a = juc.getMainAttributes(); assertEquals("Returned incorrect Attributes", "1.0", a .get(java.util.jar.Attributes.Name.MANIFEST_VERSION)); } /** * java.net.JarURLConnection#getInputStream() */ public void test_getInputStream_DeleteJarFileUsingURLConnection() throws Exception { File file = File.createTempFile("JarUrlConnectionTest", "jar"); FileOutputStream jarFile = new FileOutputStream(file); JarOutputStream out = new JarOutputStream(new BufferedOutputStream( jarFile)); JarEntry jarEntry = new JarEntry("entry.txt"); out.putNextEntry(jarEntry); out.write(new byte[] { 'a', 'b', 'c' }); out.close(); URL url = new URL("jar:file:" + file.getAbsolutePath() + "!/entry.txt"); URLConnection conn = url.openConnection(); conn.setUseCaches(false); InputStream is = conn.getInputStream(); is.close(); assertTrue(file.delete()); } /** * java.net.JarURLConnection#getManifest() */ public void test_getManifest() throws Exception { URL u = copyAndOpenResourceStream("lf.jar", "plus.bmp"); juc = (JarURLConnection) u.openConnection(); Manifest mf = juc.getManifest(); assertNotNull(mf); // equal but not same manifest assertEquals(mf, juc.getManifest()); assertNotSame(mf, juc.getManifest()); // same main attributes assertEquals(juc.getMainAttributes(), mf.getMainAttributes()); } /** * java.net.JarURLConnection#getCertificates() */ public void test_getCertificates() throws Exception { URL u = copyAndOpenResourceStream("lf.jar", "plus.bmp"); juc = (JarURLConnection) u.openConnection(); // read incomplete, shall return null assertNull(juc.getCertificates()); assertEquals("Returned incorrect JarEntry", "plus.bmp", juc .getJarEntry().getName()); // read them all InputStream is = juc.getInputStream(); byte[] buf = new byte[80]; while (is.read(buf) > 0) ; // still return null for this type of file assertNull(juc.getCertificates()); URL fileURL = copyAndOpenResourceStream("lf.jar", ""); juc = (JarURLConnection) fileURL.openConnection(); is = juc.getJarFileURL().openStream(); while (is.read(buf) > 0) ; // null for this jar file assertNull(juc.getCertificates()); } /** * java.net.JarURLConnection#getContentLength() * Regression test for HARMONY-3665 */ public void test_getContentLength() throws Exception { // check length for jar file itself URL u = copyAndOpenResourceStream("lf.jar", ""); assertEquals("Returned incorrect size for jar file", 33095, u.openConnection().getContentLength()); // check length for jar entry u = copyAndOpenResourceStream("lf.jar", "plus.bmp"); assertEquals("Returned incorrect size for the entry", 190, u.openConnection().getContentLength()); } /** * java.net.JarURLConnection#getContentType() * Regression test for HARMONY-3665 */ public void test_getContentType() throws Exception { // check type for jar file itself URL u = copyAndOpenResourceStream("lf.jar", ""); assertEquals("Returned incorrect type for jar file", "x-java/jar", u.openConnection().getContentType()); // check type for jar entry with known type u = copyAndOpenResourceStream("lf.jar", "plus.bmp"); assertEquals("Returned incorrect type for the entry with known type", "image/x-ms-bmp", u.openConnection().getContentType()); // check type for jar entry with unknown type u = copyAndOpenResourceStream("lf.jar", "Manifest.mf"); assertEquals("Returned incorrect type for the entry with known type", "content/unknown", u.openConnection().getContentType()); } public void test_getURLEncodedEntry() throws IOException { URL url = copyAndOpenResourceStream("url-test.jar", "test%20folder%20for%20url%20test/test"); if (url != null) { // Force existence check InputStream is = url.openStream(); is.close(); } } }