diff options
author | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2009-11-10 19:20:03 +0000 |
---|---|---|
committer | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2009-11-10 19:20:03 +0000 |
commit | 836328ea2ca7c6780307abf258503201c91e5a96 (patch) | |
tree | 1bb1b4a3af18e95389780d65ece875ba5ae93aff /sdo-java/branches/sdo-1.1.1-incubating/impl/src/test/java/org/apache/tuscany/sdo/test/osgi/ClassLoaderTestCase.java | |
parent | 2a444004802173fa97afbc389fc4a6600b6d3f88 (diff) |
moving SDO branches
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@834615 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sdo-java/branches/sdo-1.1.1-incubating/impl/src/test/java/org/apache/tuscany/sdo/test/osgi/ClassLoaderTestCase.java')
-rw-r--r-- | sdo-java/branches/sdo-1.1.1-incubating/impl/src/test/java/org/apache/tuscany/sdo/test/osgi/ClassLoaderTestCase.java | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/sdo-java/branches/sdo-1.1.1-incubating/impl/src/test/java/org/apache/tuscany/sdo/test/osgi/ClassLoaderTestCase.java b/sdo-java/branches/sdo-1.1.1-incubating/impl/src/test/java/org/apache/tuscany/sdo/test/osgi/ClassLoaderTestCase.java new file mode 100644 index 0000000000..8fbd74ac0d --- /dev/null +++ b/sdo-java/branches/sdo-1.1.1-incubating/impl/src/test/java/org/apache/tuscany/sdo/test/osgi/ClassLoaderTestCase.java @@ -0,0 +1,192 @@ +/** + * + * 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.tuscany.sdo.test.osgi; + + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.HashSet; + +import org.apache.tuscany.sdo.test.AllTests; +import commonj.sdo.impl.HelperProvider; + +import junit.framework.Assert; +import junit.framework.TestCase; +import junit.framework.TestResult; +import junit.framework.TestSuite; + +/* + * This test runs the SDO implementation test suite in a multi-classloader environment + */ +public class ClassLoaderTestCase extends TestCase { + + private ClassLoader contextClassLoader; + + protected void setUp() throws Exception { + + contextClassLoader = Thread.currentThread().getContextClassLoader(); + super.setUp(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + Thread.currentThread().setContextClassLoader(contextClassLoader); + } + + // Load the test class using a separate test classloader which + // loads SDO API, LIB and IMPL using different classloaders + // Run the SDO test suite under this multi-classloader environment + // Third party libraries and test classes/resources are available + // on the thread context classloader when this test is run + public void test() throws Exception { + ClassLoader testClassLoader = createTestClassLoader(); + + Class testClass = testClassLoader.loadClass(this.getClass().getName()); + Method testMethod = testClass.getMethod("runSDOTest", null); + Object testObj = testClass.newInstance(); + testMethod.invoke(testObj, null); + + + } + + + public void runSDOTest() throws Exception { + + HelperProvider.setDefaultInstance(this.getClass().getClassLoader()); + + TestSuite allTests = AllTests.suite(); + TestResult testResult = new TestResult(); + allTests.run(testResult); + Assert.assertEquals(0, testResult.errorCount()); + } + + + // Get all the URLs for a classloader, remove these from dependentJars + private URL[] getClassLoaderURLs( + URL[] classPathEntries, + HashSet dependentJars, + String[] jarList) + throws IOException { + + String pathSeparator = "/"; + HashSet classPathEntrySet; + + classPathEntrySet = new HashSet(); + + for (int i = 0; i < classPathEntries.length; i++) { + + URL classPathEntry = classPathEntries[i]; + String classPathEntryStr = classPathEntry.getPath(); + if (jarList != null) { + for (int k = 0; k < jarList.length; k++) { + String jarName = "tuscany-" + jarList[k]; + String alternateJarName = "tuscany-sdo-" + jarList[k]; + String folderName = pathSeparator + jarList[k] + pathSeparator; + if (classPathEntryStr.indexOf(jarName) >= 0 || + classPathEntryStr.indexOf(alternateJarName) >=0 || + classPathEntryStr.indexOf(folderName) >=0) { + + classPathEntrySet.add(classPathEntry); + dependentJars.remove(classPathEntry); + } + } + } + } + return (URL [])classPathEntrySet.toArray(new URL[classPathEntrySet.size()]); + } + + + // Create the test classloader. It uses separate classloaders to load SDO API, SDO LIB, + // SDO IMPL and 3rd part libraries + private ClassLoader createTestClassLoader() throws Exception { + + String[] sdoApiJars = {"sdo-api"}; + String[] sdoLibJars = {"lib"}; + String[] sdoImplJars = {"impl"}; + + URL[] sdoApiUrls; + URL[] sdoLibUrls; + URL[] sdoImplUrls; + URL[] dependencyUrls; + + if (!(this.getClass().getClassLoader() instanceof URLClassLoader)) + return this.getClass().getClassLoader(); + + HashSet dependentJars = new HashSet(); + URL[] classPathEntries = ((URLClassLoader)this.getClass().getClassLoader()).getURLs(); + for (int i = 0; i < classPathEntries.length; i++) { + dependentJars.add(classPathEntries[i]); + } + sdoApiUrls = getClassLoaderURLs(classPathEntries, dependentJars, sdoApiJars); + sdoLibUrls = getClassLoaderURLs(classPathEntries, dependentJars, sdoLibJars); + sdoImplUrls = getClassLoaderURLs(classPathEntries, dependentJars, sdoImplJars); + dependencyUrls = (URL [])dependentJars.toArray(new URL[dependentJars.size()]); + + ClassLoader dependencyLoader = new URLClassLoader(dependencyUrls, null); + ClassLoader sdoApiLoader = new URLClassLoader(sdoApiUrls, dependencyLoader); + ClassLoader sdoLibClassLoader = new URLClassLoader(sdoLibUrls, sdoApiLoader); + ClassLoader sdoImplClassLoader = new URLClassLoader(sdoImplUrls, sdoLibClassLoader); + + + TestClassLoader testClassLoader = new TestClassLoader( + new ClassLoader[] {sdoApiLoader, sdoLibClassLoader, sdoImplClassLoader, dependencyLoader} + ); + + + // Test classes and 3rd party libraries should be on the context classloader + URL testUrl = new File("./target/test-classes").toURL(); + ClassLoader contextClassLoader = new URLClassLoader(new URL[]{testUrl}, dependencyLoader); + Thread.currentThread().setContextClassLoader(contextClassLoader); + + return testClassLoader; + } + + + + private class TestClassLoader extends ClassLoader { + + ClassLoader[] parentLoaders; + + private TestClassLoader(ClassLoader[] parentLoaders) { + this.parentLoaders = parentLoaders; + } + + public Class loadClass(String className) throws ClassNotFoundException { + + Class clazz = findLoadedClass(className); + if (clazz != null) + return clazz; + + for (int i = 0; i < parentLoaders.length; i++) { + try { + return parentLoaders[i].loadClass(className); + } catch (Exception e) { + // speculative load using parent class loader failed, but that's OK + } + } + return super.loadClass(className); + } + + + } +} |