blob: 775222317d67689af2e720629be2cc424d3f54d9 [file] [log] [blame]
package javax.xml.crypto.test.dsig;
import java.lang.reflect.Method;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.AccessController;
import java.security.Provider;
import java.security.Security;
import javax.xml.crypto.dsig.CanonicalizationMethod;
import org.jcp.xml.dsig.internal.dom.XMLDSigRI;
import junit.framework.*;
/**
* This test uses more than one classloader to load a class (Driver) that
* invokes the XMLSignature API. It tests that there are not provider class
* loading issues with more than one classloader (see 6380953).
*/
public class ClassLoaderTest extends TestCase {
public ClassLoaderTest(String name) {
super(name);
}
public void test_multiple_loaders() throws Exception {
String baseDir = System.getProperty("basedir");
String fs = System.getProperty("file.separator");
File file0 = new File(baseDir + fs + "build" + fs + "classes" + fs);
File file1 = new File(baseDir + fs + "build" + fs + "test" + fs);
URL[] urls = new URL[2];
urls[0] = file0.toURL();
urls[1] = file1.toURL();
URLClassLoader uc1 = new URLClassLoader(urls, null);
URLClassLoader uc2 = new URLClassLoader(urls, null);
Class c1 = uc1.loadClass("javax.xml.crypto.test.dsig.Driver");
Class c2 = uc2.loadClass("javax.xml.crypto.test.dsig.Driver");
Object o1 = c1.newInstance();
Object o2 = c2.newInstance();
Method m1 = c1.getMethod("dsig", (Class[]) null);
Method m2 = c2.getMethod("dsig", (Class[]) null);
m1.invoke(o1, (Object[]) null);
m2.invoke(o2, (Object[]) null);
}
public void test_provider_multiple_loaders() throws Exception {
String baseDir = System.getProperty("basedir");
String fs = System.getProperty("file.separator");
File file0 = new File(baseDir + fs + "build" + fs + "classes" + fs);
File file1 = new File(baseDir + fs + "build" + fs + "test" + fs);
URL[] urls = new URL[2];
urls[0] = file0.toURL();
urls[1] = file1.toURL();
URLClassLoader uc1 = new URLClassLoader(urls, null);
//load security provider using current class loader
final Provider provider = new XMLDSigRI();
AccessController.doPrivileged(new java.security.PrivilegedAction() {
public Object run() {
Security.addProvider(provider);
return null;
}
});
// get the provider from java.security.Security using URLClassLoader.
// Need to use introspection to invoke methods to avoid using the
// current class loader
String factoryName = "javax.xml.crypto.dsig.XMLSignatureFactory";
Class factoryClass = uc1.loadClass(factoryName);
Method factoryMethod = factoryClass.getDeclaredMethod
("getInstance", new Class[]{String.class});
Class methodParameterClass = uc1.loadClass
("javax.xml.crypto.dsig.spec.C14NMethodParameterSpec");
Method canonicalizationMethod = factoryClass.getDeclaredMethod
("newCanonicalizationMethod",
new Class[]{String.class,methodParameterClass});
Object factory = factoryMethod.invoke(null, new Object[]{"DOM"});
long start = System.currentTimeMillis();
for (int i=0; i<100; i++) {
canonicalizationMethod.invoke
(factory, new Object[]{CanonicalizationMethod.EXCLUSIVE,null});
}
long end = System.currentTimeMillis();
long elapsed = end-start;
System.out.println("Elapsed:"+elapsed);
System.out.println("dsig succeeded");
}
public void test_provider_multiple_loaders_two() throws Exception {
String baseDir = System.getProperty("basedir");
String fs = System.getProperty("file.separator");
File file0 = new File(baseDir + fs + "build" + fs + "classes" + fs);
File file1 = new File(baseDir + fs + "build" + fs + "test" + fs);
URL[] urls = new URL[2];
urls[0] = file0.toURL();
urls[1] = file1.toURL();
URLClassLoader uc1 = new URLClassLoader(urls, null);
URLClassLoader uc2 = new URLClassLoader(urls, null);
Class c1 = uc1.loadClass("javax.xml.crypto.test.dsig.AppA");
Class c2 = uc2.loadClass("javax.xml.crypto.test.dsig.AppB");
Object o1 = c1.newInstance();
Object o2 = c2.newInstance();
Method m1 = c1.getMethod("dsig", (Class[]) null);
Method m2 = c2.getMethod("dsig", (Class[]) null);
m1.invoke(o1, (Object[]) null);
m2.invoke(o2, (Object[]) null);
}
}