You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by mu...@apache.org on 2007/07/12 22:06:13 UTC

svn commit: r555739 - in /xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig: AppA.java AppB.java ClassLoaderTest.java

Author: mullan
Date: Thu Jul 12 13:06:12 2007
New Revision: 555739

URL: http://svn.apache.org/viewvc?view=rev&rev=555739
Log:
Regression test for bug 42820: ClassLoader issue causing NoSuchAlgorithmException loading Provider Implementation

Added:
    xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/AppA.java
    xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/AppB.java
Modified:
    xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/ClassLoaderTest.java

Added: xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/AppA.java
URL: http://svn.apache.org/viewvc/xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/AppA.java?view=auto&rev=555739
==============================================================================
--- xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/AppA.java (added)
+++ xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/AppA.java Thu Jul 12 13:06:12 2007
@@ -0,0 +1,14 @@
+package javax.xml.crypto.test.dsig;
+
+import java.security.Security;
+
+/**
+ * Used by ClassLoaderTest
+ */
+public class AppA {
+
+    public void dsig() throws Exception {
+
+	Security.addProvider(new org.jcp.xml.dsig.internal.dom.XMLDSigRI());
+    }
+}

Added: xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/AppB.java
URL: http://svn.apache.org/viewvc/xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/AppB.java?view=auto&rev=555739
==============================================================================
--- xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/AppB.java (added)
+++ xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/AppB.java Thu Jul 12 13:06:12 2007
@@ -0,0 +1,18 @@
+package javax.xml.crypto.test.dsig;
+
+import java.security.Provider;
+import java.security.Security;
+import javax.xml.crypto.dsig.Transform;
+import javax.xml.crypto.dsig.TransformService;
+
+/**
+ * Used by ClassLoaderTest
+ */
+public class AppB {
+
+    public void dsig() throws Exception {
+
+	Provider p = Security.getProvider("XMLDSig");
+	TransformService ts = TransformService.getInstance(Transform.XPATH, "DOM", p);
+    }
+}

Modified: xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/ClassLoaderTest.java
URL: http://svn.apache.org/viewvc/xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/ClassLoaderTest.java?view=diff&rev=555739&r1=555738&r2=555739
==============================================================================
--- xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/ClassLoaderTest.java (original)
+++ xml/security/trunk/src_unitTests/javax/xml/crypto/test/dsig/ClassLoaderTest.java Thu Jul 12 13:06:12 2007
@@ -4,6 +4,12 @@
 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.*;
 
@@ -32,6 +38,70 @@
 
         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);