/*
* JBoss, Home of Professional Open Source
* Copyright 2006, JBoss Inc., and individual contributors as indicated
* by the @authors tag.
*
* Licensed 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.jboss.test.vfs;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.concurrent.Executors;
import junit.framework.Test;
import org.jboss.vfs.TempFileProvider;
import org.jboss.vfs.VFS;
import org.jboss.vfs.VFSUtils;
import org.jboss.vfs.VirtualFile;
import org.jboss.vfs.protocol.FileURLConnection;
import org.jboss.vfs.protocol.VfsUrlStreamHandlerFactory;
/**
* Basic tests of URL connection
*
* @author ales.jutin@jboss.org
*/
public class URLConnectionUnitTestCase extends AbstractVFSTest {
static {
URL.setURLStreamHandlerFactory(new VfsUrlStreamHandlerFactory());
}
public URLConnectionUnitTestCase(String name) {
super(name);
}
public static Test suite() {
return suite(URLConnectionUnitTestCase.class);
}
protected String getFileName() {
return "outer.jar";
}
protected VirtualFile getFile() throws Exception {
VirtualFile root = getVirtualFile("/vfs/test/");
VirtualFile file = root.getChild(getFileName());
assertNotNull(file);
return file;
}
protected URL getURLAndAssertProtocol(VirtualFile file) throws Exception {
URL url = file.toURL();
assertEquals(VFSUtils.VFS_PROTOCOL, url.getProtocol());
return url;
}
/**
* Test url connection content.
*
* @throws Exception for any error
*/
public void testContent() throws Exception {
VirtualFile file = getFile();
URL url = getURLAndAssertProtocol(file);
URLConnection conn = url.openConnection();
assertEquals(file, conn.getContent());
}
/**
* Test url connection content lenght.
*
* @throws Exception for any error
*/
public void testContentLenght() throws Exception {
VirtualFile file = getFile();
URL url = getURLAndAssertProtocol(file);
URLConnection conn = url.openConnection();
assertEquals(file.getSize(), conn.getContentLength());
}
/**
* Test url connection last modified.
*
* @throws Exception for any error
*/
public void testLastModified() throws Exception {
VirtualFile file = getFile();
URL url = getURLAndAssertProtocol(file);
URLConnection conn = url.openConnection();
assertEquals(file.getLastModified(), conn.getLastModified());
}
/**
* Test url connection input stream.
*
* @throws Exception for any error
*/
public void testInputStream() throws Exception {
VirtualFile file = getFile();
URL url = getURLAndAssertProtocol(file);
URLConnection conn = url.openConnection();
assertTrue(Arrays.equals(readBytes(file.openStream()), readBytes(conn.getInputStream())));
}
public void testPathWithSpaces() throws Exception {
VirtualFile root = getVirtualFile("/vfs/test/");
VirtualFile file = root.getChild("path with spaces/spaces.ear");
File real = file.getPhysicalFile();
assertTrue(real.exists());
URL url = getURLAndAssertProtocol(file);
URLConnection conn = url.openConnection();
assertTrue(Arrays.equals(readBytes(conn.getInputStream()), readBytes(file.openStream())));
}
public void testTempPath() throws Exception {
File temp = File.createTempFile("123", ".tmp");
temp.deleteOnExit();
VirtualFile file = VFS.getChild(temp.toURI());
assertTrue(file.exists());
URL url = getURLAndAssertProtocol(file);
URLConnection conn = url.openConnection();
assertEquals(file.getLastModified(), conn.getLastModified());
}
public void testVfsUrlContentType() throws Exception {
URL url = getResource("/vfs/test/test-web.xml");
VirtualFile xml = VFS.getChild(url);
URLConnection conn = xml.toURL().openConnection();
String contentType = conn.getContentType();
assertNotNull(contentType);
assertEquals("application/xml", contentType);
}
public void testOutsideUrl() throws Exception {
URL url = getResource("/vfs/test/outer.jar");
File file = new File(url.toURI());
url = new URL(VFSUtils.VFS_PROTOCOL, url.getHost(), url.getPort(), url.getFile());
URLConnection conn = url.openConnection();
assertEquals(file.lastModified(), conn.getLastModified());
}
public void testFileUrl() throws Exception {
// Hack to ensure VFS.init has been called and has taken over the file: protocol
VFS.getChild("");
URL resourceUrl = getResource("/vfs/test/outer.jar");
// Hack to ensure the URL handler is not passed down by the parent URL context
URL url = new URL("file", resourceUrl.getHost(), resourceUrl.getFile());
// Make sure we are using our handler
URLConnection urlConn = url.openConnection();
assertTrue(urlConn instanceof FileURLConnection);
File file = new File(url.toURI());
assertNotNull(file);
VirtualFile vf = VFS.getChild(url);
assertTrue(vf.isFile());
// Mount a temp dir over the jar location in VFS
TempFileProvider provider = null;
Closeable handle = null;
try {
provider = TempFileProvider.create("temp", Executors.newSingleThreadScheduledExecutor());
handle = VFS.mountTemp(vf, provider);
assertTrue(vf.isDirectory());
File vfsDerivedFile = vf.getPhysicalFile();
File urlDerivedFile = (File) url.getContent();
// Make sure the file returned by the file: URL is not the VFS File (In other words, make sure it does not use the mounts)
assertTrue(urlDerivedFile.isFile());
assertFalse(vfsDerivedFile.equals(urlDerivedFile));
} finally {
VFSUtils.safeClose(handle, provider);
}
}
public void testFileUrlContentType() throws Exception {
VFS.getChild("");
URL url = getResource("/vfs/test/test-web.xml");
url = new URL("file", url.getHost(), url.getFile());
URLConnection conn = url.openConnection();
String contentType = conn.getContentType();
assertNotNull(contentType);
assertEquals("application/xml", contentType);
}
public void testHeaderFields() throws Exception {
VFS.getChild("");
URL url = getResource("/vfs/test/test-web.xml");
url = new URL("file", url.getHost(), url.getFile());
URLConnection conn = url.openConnection();
int contentLength = conn.getContentLength();
assertTrue(contentLength > 0);
String contentLengthHeader = conn.getHeaderField("content-length");
assertEquals(String.valueOf(contentLength), contentLengthHeader);
assertTrue(conn.getLastModified() > 0);
String lastModifiedHeader = conn.getHeaderField("last-modified");
assertNotNull(lastModifiedHeader);
}
protected static byte[] readBytes(InputStream inputStream) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read = 0;
byte[] bytes = new byte[1024];
try {
while (read >= 0) {
read = inputStream.read(bytes);
baos.write(bytes);
}
} finally {
try {
inputStream.close();
} catch (IOException ignored) {
}
}
return baos.toByteArray();
}
}