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