| /* |
| * 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 libcore.java.net; |
| |
| 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.security.cert.Certificate; |
| import java.util.Arrays; |
| import java.util.HashSet; |
| import java.util.Map; |
| import java.util.jar.Attributes; |
| 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; |
| import tests.support.resource.Support_Resources; |
| |
| public class OldJarURLConnectionTest extends junit.framework.TestCase { |
| |
| JarURLConnection juc; |
| |
| private URL createContent(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); |
| } |
| |
| public void test_getAttributes() throws Exception { |
| URL u = createContent("lf.jar", "swt.dll"); |
| juc = (JarURLConnection) u.openConnection(); |
| java.util.jar.Attributes a = juc.getAttributes(); |
| assertEquals("Returned incorrect Attributes", "SHA MD5", a |
| .get(new java.util.jar.Attributes.Name("Digest-Algorithms"))); |
| URL invURL = createContent("InvalidJar.jar", "Test.class"); |
| |
| JarURLConnection juConn = (JarURLConnection) invURL.openConnection(); |
| try { |
| juConn.getAttributes(); |
| fail("IOException was not thrown."); |
| } catch(java.io.IOException io) { |
| //expected |
| } |
| } |
| |
| public void test_getCertificates() throws Exception { |
| URL u = createContent("TestCodeSigners.jar", "Test.class"); |
| |
| juc = (JarURLConnection) u.openConnection(); |
| assertNull(juc.getCertificates()); |
| |
| JarEntry je = juc.getJarEntry(); |
| JarFile jf = juc.getJarFile(); |
| InputStream is = jf.getInputStream(je); |
| is.skip(je.getSize()); |
| |
| Certificate [] certs = juc.getCertificates(); |
| assertEquals(3, certs.length); |
| |
| URL invURL = createContent("InvalidJar.jar", "Test.class"); |
| |
| JarURLConnection juConn = (JarURLConnection) invURL.openConnection(); |
| try { |
| juConn.getCertificates(); |
| fail("IOException was not thrown."); |
| } catch(java.io.IOException io) { |
| //expected |
| } |
| } |
| |
| public void test_getManifest() throws Exception { |
| URL u = createContent("lf.jar", "swt.dll"); |
| |
| juc = (JarURLConnection) u.openConnection(); |
| Manifest manifest = juc.getManifest(); |
| Map<String, Attributes> attr = manifest.getEntries(); |
| assertEquals(new HashSet<String>(Arrays.asList("plus.bmp", "swt.dll")), |
| attr.keySet()); |
| |
| URL invURL = createContent("InvalidJar.jar", "Test.class"); |
| |
| JarURLConnection juConn = (JarURLConnection) invURL.openConnection(); |
| try { |
| juConn.getManifest(); |
| fail("IOException was not thrown."); |
| } catch(java.io.IOException io) { |
| //expected |
| } |
| } |
| |
| public void test_getEntryName() throws Exception { |
| URL u = createContent("lf.jar", "plus.bmp"); |
| |
| juc = (JarURLConnection) u.openConnection(); |
| assertEquals("Returned incorrect entryName", "plus.bmp", juc |
| .getEntryName()); |
| |
| u = createContent("lf.jar", ""); |
| |
| juc = (JarURLConnection) u.openConnection(); |
| assertNull("Returned incorrect entryName", juc.getEntryName()); |
| |
| // Regression test for harmony-3053 |
| URL url = new URL("jar:file:///bar.jar!/foo.jar!/Bugs/HelloWorld.class"); |
| assertEquals("foo.jar!/Bugs/HelloWorld.class",((JarURLConnection)url.openConnection()).getEntryName()); |
| } |
| |
| public void test_getJarEntry() throws Exception { |
| URL u = createContent("lf.jar", "plus.bmp"); |
| |
| juc = (JarURLConnection) u.openConnection(); |
| assertEquals("Returned incorrect JarEntry", "plus.bmp", juc |
| .getJarEntry().getName()); |
| |
| u = createContent("lf.jar", ""); |
| |
| juc = (JarURLConnection) u.openConnection(); |
| assertNull("Returned incorrect JarEntry", juc.getJarEntry()); |
| |
| URL invURL = createContent("InvalidJar.jar", "Test.class"); |
| |
| JarURLConnection juConn = (JarURLConnection) invURL.openConnection(); |
| try { |
| juConn.getJarEntry(); |
| fail("IOException was not thrown."); |
| } catch(java.io.IOException io) { |
| //expected |
| } |
| } |
| |
| public void test_getJarFile() throws IOException { |
| URL url = createContent("lf.jar", "missing"); |
| |
| JarURLConnection 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 |
| } |
| |
| URL invURL = createContent("InvalidJar.jar", "Test.class"); |
| |
| JarURLConnection juConn = (JarURLConnection) invURL.openConnection(); |
| try { |
| juConn.getJarFile(); |
| fail("IOException was not thrown."); |
| } catch(java.io.IOException io) { |
| //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()); |
| |
| fUrl1 = createContent("lf.jar", ""); |
| |
| con1 = (JarURLConnection) fUrl1.openConnection(); |
| jf1 = con1.getJarFile(); |
| con2 = (JarURLConnection) fUrl1.openConnection(); |
| jf2 = con2.getJarFile(); |
| assertTrue("http: JarFiles not the same", jf1 == jf2); |
| jf1.close(); |
| } |
| |
| 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); |
| connection.getInputStream(); |
| InputStream in = connection.getInputStream(); |
| JarFile jarFile1 = connection.getJarFile(); |
| JarEntry jarEntry1 = connection.getJarEntry(); |
| in.read(); |
| 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 |
| } |
| } |
| |
| public void test_getJarFileURL() throws Exception { |
| URL u = createContent("lf.jar", "plus.bmp"); |
| |
| URL fileURL = new URL(u.getPath().substring(0, u.getPath().indexOf("!"))); |
| |
| juc = (JarURLConnection) u.openConnection(); |
| assertTrue("Returned incorrect file URL", juc.getJarFileURL().equals( |
| fileURL)); |
| |
| URL url = new URL("jar:file:///bar.jar!/foo.jar!/Bugs/HelloWorld.class"); |
| String jarFileUrl = ((JarURLConnection) url.openConnection()).getJarFileURL().toString(); |
| // The RI omits the empty authority "//" but the RFC doesn't say this is necessary |
| assertTrue(jarFileUrl.equals("file:///bar.jar") || jarFileUrl.equals("file:/bar.jar")); |
| } |
| |
| public void test_getMainAttributes() throws Exception { |
| URL u = createContent("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)); |
| |
| URL invURL = createContent("InvalidJar.jar", "Test.class"); |
| |
| JarURLConnection juConn = (JarURLConnection) invURL.openConnection(); |
| try { |
| juConn.getMainAttributes(); |
| fail("IOException was not thrown."); |
| } catch(java.io.IOException io) { |
| //expected |
| } |
| } |
| |
| public void test_getInputStream_DeleteJarFileUsingURLConnection() |
| throws Exception { |
| String entry = "text.txt"; |
| String cts = System.getProperty("java.io.tmpdir"); |
| File tmpDir = new File(cts); |
| File jarFile = File.createTempFile("file", ".jar", tmpDir); |
| String jarFileName = jarFile.getPath(); |
| FileOutputStream jarFileOutputStream = new FileOutputStream(jarFileName); |
| JarOutputStream out = new JarOutputStream(new BufferedOutputStream( |
| jarFileOutputStream)); |
| JarEntry jarEntry = new JarEntry(entry); |
| out.putNextEntry(jarEntry); |
| out.write(new byte[] { 'a', 'b', 'c' }); |
| out.close(); |
| |
| URL url = new URL("jar:file:" + jarFileName + "!/" + entry); |
| URLConnection conn = url.openConnection(); |
| conn.setUseCaches(false); |
| InputStream is = conn.getInputStream(); |
| is.close(); |
| |
| assertTrue(jarFile.delete()); |
| } |
| |
| public void test_Constructor() { |
| try { |
| String jarFileName = "file.jar"; |
| String entry = "text.txt"; |
| URL url = new URL("jar:file:" + jarFileName + "!/" + entry); |
| TestJarURLConnection jarConn = new TestJarURLConnection(url); |
| assertEquals(new URL("file:file.jar"), jarConn.getJarFileURL()); |
| } catch(MalformedURLException me) { |
| fail("MalformedURLException was thrown."); |
| } |
| |
| try { |
| URL [] urls = {new URL("file:file.jar"), |
| new URL("http://foo.com/foo/foo.jar")}; |
| |
| for(URL url : urls) { |
| try { |
| new TestJarURLConnection(url); |
| fail("MalformedURLException was not thrown."); |
| } catch(MalformedURLException me) { |
| //expected |
| } |
| } |
| } catch(MalformedURLException me) { |
| fail("MalformedURLException was thrown."); |
| } |
| } |
| |
| class TestJarURLConnection extends JarURLConnection { |
| |
| protected TestJarURLConnection(URL arg0) throws MalformedURLException { |
| super(arg0); |
| } |
| |
| @Override |
| public JarFile getJarFile() throws IOException { |
| return null; |
| } |
| |
| @Override |
| public void connect() throws IOException { |
| |
| } |
| } |
| } |
| |