/* * JBoss, Home of Professional Open Source. * Copyright 2014 Red Hat, Inc., and individual contributors * as indicated by the @author tags. * * 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.modules; import org.jboss.modules.filter.MultiplePathFilterBuilder; import org.jboss.modules.filter.PathFilters; import org.jboss.modules.test.ImportedClass; import org.jboss.modules.test.ImportedInterface; import org.jboss.modules.test.TestClass; import org.jboss.modules.util.TestModuleLoader; import org.jboss.modules.util.TestResourceLoader; import org.junit.Before; import org.junit.Test; import java.net.URL; import java.util.Enumeration; import java.util.List; import static org.jboss.modules.util.Util.toList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; /** * Test to verify module functionality. * * @author John Bailey * @author <a href="mailto:flavia.rainone@jboss.com">Flavia Rainone</a> */ public class ModuleClassLoaderTest extends AbstractModuleTestCase { private static final ModuleIdentifier MODULE_WITH_CONTENT_ID = ModuleIdentifier.fromString("test-with-content"); private static final ModuleIdentifier MODULE_WITH_RESOURCE_ID = ModuleIdentifier.fromString("test-with-resource"); private static final ModuleIdentifier MODULE_TO_IMPORT_ID = ModuleIdentifier.fromString("test-to-import"); private static final ModuleIdentifier MODULE_WITH_EXPORT_ID = ModuleIdentifier.fromString("test-with-export"); private static final ModuleIdentifier MODULE_WITH_DOUBLE_EXPORT_ID = ModuleIdentifier.fromString("test-with-double-export"); private static final ModuleIdentifier MODULE_WITH_INVERTED_DOUBLE_EXPORT_ID = ModuleIdentifier.fromString("test-with-inverted-double-export"); private static final ModuleIdentifier MODULE_WITH_FILTERED_EXPORT_ID = ModuleIdentifier.fromString("test-with-filtered-export"); private static final ModuleIdentifier MODULE_WITH_FILTERED_IMPORT_ID = ModuleIdentifier.fromString("test-with-filtered-import"); private static final ModuleIdentifier MODULE_WITH_FILTERED_DOUBLE_EXPORT_ID = ModuleIdentifier.fromString("test-with-filtered-double-export"); private TestModuleLoader moduleLoader; @Before public void setupModuleLoader() throws Exception { moduleLoader = new TestModuleLoader(); final ModuleSpec.Builder moduleWithContentBuilder = ModuleSpec.build(MODULE_WITH_CONTENT_ID); moduleWithContentBuilder.addResourceRoot(ResourceLoaderSpec.createResourceLoaderSpec( TestResourceLoader.build() .addClass(TestClass.class) .addResources(getResource("test/modulecontentloader/rootOne")) .create() )); moduleWithContentBuilder.addDependency(DependencySpec.createModuleDependencySpec(MODULE_TO_IMPORT_ID)); moduleWithContentBuilder.addDependency(DependencySpec.createLocalDependencySpec()); moduleLoader.addModuleSpec(moduleWithContentBuilder.create()); final ModuleSpec.Builder moduleWithResourceBuilder = ModuleSpec.build(MODULE_WITH_RESOURCE_ID); moduleWithResourceBuilder.addResourceRoot(ResourceLoaderSpec.createResourceLoaderSpec( TestResourceLoader.build() .addClass(TestClass.class) .addResources(getResource("class-resources")) .create() )); moduleWithResourceBuilder.addDependency(DependencySpec.createModuleDependencySpec(MODULE_TO_IMPORT_ID)); moduleWithResourceBuilder.addDependency(DependencySpec.createLocalDependencySpec()); moduleLoader.addModuleSpec(moduleWithResourceBuilder.create()); final ModuleSpec.Builder moduleToImportBuilder = ModuleSpec.build(MODULE_TO_IMPORT_ID); moduleToImportBuilder.addResourceRoot(ResourceLoaderSpec.createResourceLoaderSpec( TestResourceLoader.build() .addClass(ImportedClass.class) .addClass(ImportedInterface.class) .addResources(getResource("test/modulecontentloader/rootTwo")) .create() )); moduleToImportBuilder.addDependency(DependencySpec.createLocalDependencySpec()); moduleLoader.addModuleSpec(moduleToImportBuilder.create()); final ModuleSpec.Builder moduleWithExportBuilder = ModuleSpec.build(MODULE_WITH_EXPORT_ID); moduleWithExportBuilder.addDependency(DependencySpec.createModuleDependencySpec(MODULE_TO_IMPORT_ID, true, false)); moduleWithExportBuilder.addDependency(DependencySpec.createLocalDependencySpec()); moduleLoader.addModuleSpec(moduleWithExportBuilder.create()); final MultiplePathFilterBuilder nestedAndOrgJBossExcludingBuilder = PathFilters.multiplePathFilterBuilder(true); nestedAndOrgJBossExcludingBuilder.addFilter(PathFilters.match("org/jboss/**"), false); nestedAndOrgJBossExcludingBuilder.addFilter(PathFilters.match("nested"), false); final ModuleSpec.Builder moduleWithExportFilterBuilder = ModuleSpec.build(MODULE_WITH_FILTERED_EXPORT_ID); moduleWithExportFilterBuilder.addDependency(DependencySpec.createModuleDependencySpec(nestedAndOrgJBossExcludingBuilder.create(), null, MODULE_TO_IMPORT_ID, false)); moduleWithExportFilterBuilder.addDependency(DependencySpec.createLocalDependencySpec()); moduleLoader.addModuleSpec(moduleWithExportFilterBuilder.create()); final ModuleSpec.Builder moduleWithImportFilterBuilder = ModuleSpec.build(MODULE_WITH_FILTERED_IMPORT_ID); moduleWithImportFilterBuilder.addDependency(DependencySpec.createModuleDependencySpec(nestedAndOrgJBossExcludingBuilder.create(), PathFilters.rejectAll(), null, MODULE_TO_IMPORT_ID, false)); moduleWithImportFilterBuilder.addDependency(DependencySpec.createLocalDependencySpec()); moduleLoader.addModuleSpec(moduleWithImportFilterBuilder.create()); final ModuleSpec.Builder moduleWithDoubleExportBuilder = ModuleSpec.build(MODULE_WITH_DOUBLE_EXPORT_ID); moduleWithDoubleExportBuilder.addDependency(DependencySpec.createModuleDependencySpec(MODULE_TO_IMPORT_ID, true)); moduleWithDoubleExportBuilder.addDependency(DependencySpec.createModuleDependencySpec(MODULE_WITH_CONTENT_ID, true)); moduleWithDoubleExportBuilder.addDependency(DependencySpec.createLocalDependencySpec()); moduleLoader.addModuleSpec(moduleWithDoubleExportBuilder.create()); final ModuleSpec.Builder moduleWithInvertedDoubleExportBuilder = ModuleSpec.build(MODULE_WITH_INVERTED_DOUBLE_EXPORT_ID); moduleWithInvertedDoubleExportBuilder.addDependency(DependencySpec.createModuleDependencySpec(MODULE_WITH_CONTENT_ID, true)); moduleWithInvertedDoubleExportBuilder.addDependency(DependencySpec.createModuleDependencySpec(MODULE_TO_IMPORT_ID, true)); moduleWithInvertedDoubleExportBuilder.addDependency(DependencySpec.createLocalDependencySpec()); moduleLoader.addModuleSpec(moduleWithInvertedDoubleExportBuilder.create()); final ModuleSpec.Builder moduleWithFilteredDoubleExportBuilder = ModuleSpec.build(MODULE_WITH_FILTERED_DOUBLE_EXPORT_ID); moduleWithFilteredDoubleExportBuilder.addDependency(DependencySpec.createModuleDependencySpec(PathFilters.not(PathFilters.match("nested")), PathFilters.acceptAll(), null, MODULE_TO_IMPORT_ID, false)); moduleWithFilteredDoubleExportBuilder.addDependency(DependencySpec.createModuleDependencySpec(MODULE_WITH_EXPORT_ID, true)); moduleWithFilteredDoubleExportBuilder.addDependency(DependencySpec.createLocalDependencySpec()); moduleLoader.addModuleSpec(moduleWithFilteredDoubleExportBuilder.create()); } @Test public void testLocalClassLoad() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_CONTENT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); try { Class<?> testClass = classLoader.loadClass("org.jboss.modules.test.TestClass"); assertNotNull(testClass); } catch (ClassNotFoundException e) { fail("Should have loaded local class"); } } @Test public void testResourceLoad() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_RESOURCE_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); try { Class<?> testClass = classLoader.loadClass("org.jboss.modules.test.TestClass"); // direct assertNotNull(testClass.getResource("/file1.txt")); // translates to /file1.txt assertNotNull(testClass.getResource("file2.txt")); // translates to /org/jboss/modules/test/file2.txt // relative assertNotNull(testClass.getResource("../../../../file1.txt")); // should translate to /file1.txt assertNotNull(testClass.getResource("test/../file2.txt")); // should translate to /org/jboss/modules/test/file2.txt } catch (ClassNotFoundException e) { e.printStackTrace(); fail("Should have loaded local class"); } } @Test public void testLocalClassLoadNotFound() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_CONTENT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); try { classLoader.loadClass("org.jboss.modules.test.BogusClass"); fail("Should have thrown ClassNotFoundException"); } catch (ClassNotFoundException expected) { } } @Test public void testImportClassLoad() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_CONTENT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); try { Class<?> testClass = classLoader.loadClass("org.jboss.modules.test.ImportedClass"); assertNotNull(testClass); } catch (ClassNotFoundException e) { fail("Should have loaded imported class"); } } @Test public void testFilteredImportClassLoad() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_FILTERED_IMPORT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); try { classLoader.loadClass("org.jboss.modules.test.ImportedClass"); fail("Should have thrown ClassNotFoundException"); } catch (ClassNotFoundException expected) { } } @Test public void testDoubleExportCLassLoad() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_DOUBLE_EXPORT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); Class<?> testClass = classLoader.loadExportedClass("org.jboss.modules.test.ImportedClass"); assertNotNull(testClass); testClass = classLoader.loadExportedClass("org.jboss.modules.test.TestClass"); assertNotNull(testClass); } @Test public void testInvertedDoubleExportCLassLoad() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_INVERTED_DOUBLE_EXPORT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); Class<?> testClass = classLoader.loadExportedClass("org.jboss.modules.test.ImportedClass"); assertNotNull(testClass); testClass = classLoader.loadExportedClass("org.jboss.modules.test.TestClass"); assertNotNull(testClass); } @Test public void testFilteredDoubleExportCLassLoad() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_FILTERED_DOUBLE_EXPORT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); Class<?> testClass = classLoader.loadExportedClass("org.jboss.modules.test.ImportedClass"); assertNotNull(testClass); } @Test public void testLocalResourceRetrieval() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_CONTENT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); final URL resUrl = classLoader.getResource("test.txt"); assertNotNull(resUrl); } @Test public void testLocalResourceRetrievalNotFound() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_CONTENT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); final URL resUrl = classLoader.getResource("bogus.txt"); assertNull(resUrl); } @Test public void testImportResourceRetrieval() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_CONTENT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); final URL resUrl = classLoader.getResource("testTwo.txt"); assertNotNull(resUrl); } @Test public void testFilteredImportResourceRetrieval() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_FILTERED_IMPORT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); URL resUrl = classLoader.getResource("nested/nested.txt"); assertNull(resUrl); } @Test public void testLocalResourcesRetrieval() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_CONTENT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); final Enumeration<URL> resUrls = classLoader.getResources("test.txt"); assertNotNull(resUrls); final List<URL> resUrlList = toList(resUrls); assertEquals(1, resUrlList.size()); assertTrue(resUrlList.get(0).getPath().contains("rootOne")); } @Test public void testLocalResourcesRetrievalNotFound() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_CONTENT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); final Enumeration<URL> resUrls = classLoader.getResources("bogus.txt"); assertNotNull(resUrls); final List<URL> resUrlList = toList(resUrls); assertTrue(resUrlList.isEmpty()); } @Test public void testImportResourcesRetrieval() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_CONTENT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); final Enumeration<URL> resUrls = classLoader.getResources("testTwo.txt"); assertNotNull(resUrls); final List<URL> resUrlList = toList(resUrls); assertEquals(1, resUrlList.size()); assertTrue(resUrlList.get(0).getPath().contains("rootTwo")); } @Test public void testLocalAndImportResourcesRetrieval() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_CONTENT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); final Enumeration<URL> resUrls = classLoader.getResources("nested/nested.txt"); assertNotNull(resUrls); final List<URL> resUrlList = toList(resUrls); assertEquals(2, resUrlList.size()); boolean rootOne = false; boolean rootTwo = false; for(URL resUrl : resUrlList) { if(!rootOne) rootOne = resUrl.getPath().contains("rootOne"); if(!rootTwo) rootTwo = resUrl.getPath().contains("rootTwo"); } assertTrue(rootOne); assertTrue(rootTwo); } @Test public void testFilteredImportResourcesRetrieval() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_FILTERED_IMPORT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); Enumeration<URL> resUrls = classLoader.getResources("nested/nested.txt"); List<URL> resUrlList = toList(resUrls); assertTrue(resUrlList.isEmpty()); } @Test public void testManifest() throws Exception { final Module testModule = moduleLoader.loadModule(MODULE_WITH_CONTENT_ID); final ModuleClassLoader classLoader = testModule.getClassLoader(); final Class<?> testClass = classLoader.loadClass("org.jboss.modules.test.TestClass"); System.out.println(testClass.getClassLoader()); final Package pkg = testClass.getPackage(); assertEquals("JBoss Modules Test Classes", pkg.getSpecificationTitle()); } }