/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.core;
import static com.sun.org.apache.bcel.internal.Constants.ACC_PUBLIC;
import com.sun.org.apache.bcel.internal.generic.ClassGen;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import org.junit.After;
import org.junit.AfterClass;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Test the PathsClassLoader.
*
* @author mhwood
*/
public class PathsClassLoaderTest
{
private static final String FILENAME_PREFIX = "foo";
private static final String CLASS_FILENAME_SUFFIX = ".class";
private static final String JAR_FILENAME_SUFFIX = ".jar";
private static final ClassLoader parentCL = PathsClassLoaderTest.class.getClassLoader();
/** The test bare class file. */
private static File classFile;
/** The test class file in a JAR. */
private static File jarFile;
/** Name of the test class in the file. */
private static String className;
/** Name of the test class in the JAR. */
private static String jarClassName;
public PathsClassLoaderTest()
{
}
@BeforeClass
public static void setUpClass()
{
// Create a name for a temporary class file.
try {
classFile = File.createTempFile(FILENAME_PREFIX, CLASS_FILENAME_SUFFIX);
classFile.deleteOnExit();
} catch (IOException e) {
System.err.println(e.getMessage());
System.exit(1);
}
String classFileName = classFile.getName();
className = classFileName.substring(0,
classFileName.length() - CLASS_FILENAME_SUFFIX.length());
// Create an empty class.
ClassGen cg = new ClassGen(className, "java.lang.Object",
"<generated>", ACC_PUBLIC, null);
cg.addEmptyConstructor(ACC_PUBLIC);
// Create a class file from the empty class.
try {
cg.getJavaClass().dump(classFile);
} catch (IOException e) {
System.err.println(e.getMessage());
System.exit(1);
}
// Create a JAR containing the empty class.
JarOutputStream jar;
try {
jarFile = File.createTempFile(FILENAME_PREFIX, JAR_FILENAME_SUFFIX);
jarFile.deleteOnExit();
String jarFileName = jarFile.getName();
jarClassName = jarFileName.substring(0,
jarFileName.length() - JAR_FILENAME_SUFFIX.length());
cg = new ClassGen(jarClassName, "java.lang.Object",
"<generated>", ACC_PUBLIC, null);
cg.addEmptyConstructor(ACC_PUBLIC);
jar = new JarOutputStream(new FileOutputStream(jarFile));
JarEntry entry = new JarEntry(jarClassName + ".class");
jar.putNextEntry(entry);
jar.write(cg.getJavaClass().getBytes());
jar.close();
} catch (IOException e) {
System.err.println(e.getMessage());
System.exit(1);
}
}
@AfterClass
public static void tearDownClass()
{
}
@Before
public void setUp()
{
}
@After
public void tearDown()
{
}
/**
* Test of findClass method, of class PathsClassLoader.
* @throws java.lang.Exception
*/
@Test
public void testFindClass()
throws Exception
{
System.out.println("findClass");
String[] classpath = { classFile.getParent(),
jarFile.getCanonicalPath() };
PathsClassLoader instance = new PathsClassLoader(parentCL, classpath);
Class result = instance.findClass(className);
assertTrue("Should return a Class from file", result instanceof Class);
classpath[0] = jarFile.getCanonicalPath();
instance = new PathsClassLoader(parentCL, classpath);
result = instance.findClass(jarClassName);
assertTrue("Should return a Class from JAR", result instanceof Class);
}
}