/* * JBoss, Home of Professional Open Source. * Copyright 2015, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.wildfly.core.test.standalone.mgmt.api.core; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.operations.common.Util; import org.jboss.dmr.ModelNode; import org.jboss.modules.DependencySpec; import org.jboss.modules.LocalModuleLoader; import org.jboss.modules.Module; import org.jboss.modules.ModuleDependencySpec; import org.jboss.modules.ModuleIdentifier; import org.jboss.modules.ModuleLoadException; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.wildfly.core.test.standalone.base.ContainerResourceMgmtTestBase; import org.wildfly.core.testrunner.WildflyTestRunner; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.CORE_SERVICE; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.MODULE_LOADING; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NAME; import static org.jboss.as.test.integration.domain.management.util.DomainTestSupport.validateResponse; /** * Tests of the core-service=module-loading:module-info command. * * @author <a href="mailto:msimka@redhat.com">Martin Simka</a> (c) 2015 Red Hat, inc. */ @RunWith(WildflyTestRunner.class) public class ModuleInfoTestCase extends ContainerResourceMgmtTestBase { private static final PathAddress RESOURCE = PathAddress.pathAddress(PathElement.pathElement(CORE_SERVICE, MODULE_LOADING)); private static final String TARGET_MODULE_NAME = "org.jboss.logmanager"; private static final String MODULES_DIR = System.getProperty("jboss.home") + File.separator + "modules"; private static final String LAYERS_BASE = MODULES_DIR + File.separator + "system" + File.separator + "layers" + File.separator + "base"; @Test public void testModuleInfo() throws Exception { /*[standalone@localhost:9990 /] /core-service=module-loading:module-info(name=org.jboss.logmanager) { "outcome" => "success", "result" => { "name" => "org.jboss.logmanager:main", "main-class" => undefined, "fallback-loader" => undefined, "dependencies" => [ { "dependency-name" => "ModuleDependency", "module-name" => "javax.api:main", "export-filter" => "Reject", "import-filter" => "multi-path filter {exclude children of \"META-INF/\", exclude equals \"META-INF\", default accept}", "optional" => false }, { "dependency-name" => "ModuleDependency", "module-name" => "org.jboss.modules:main", "export-filter" => "Reject", "import-filter" => "multi-path filter {exclude children of \"META-INF/\", exclude equals \"META-INF\", default accept}", "optional" => false } ], "local-loader-class" => undefined, "resource-loaders" => [ { "type" => "org.jboss.modules.JarFileResourceLoader", "paths" => [ "", "org/jboss/logmanager", "META-INF/services", "org", "META-INF/maven/org.jboss.logmanager/jboss-logmanager", "org/jboss", "org/jboss/logmanager/errormanager", "org/jboss/logmanager/formatters", "META-INF", "org/jboss/logmanager/filters", "org/jboss/logmanager/config", "META-INF/maven", "org/jboss/logmanager/handlers", "META-INF/maven/org.jboss.logmanager" ] }, { "type" => "org.jboss.modules.NativeLibraryResourceLoader", "paths" => undefined } ] }*/ // load module.xml ModuleIdentifier identifier = ModuleIdentifier.fromString(TARGET_MODULE_NAME + ":main"); Module module = loadModule(identifier); // run module-info operation ModelNode op = Util.createEmptyOperation("module-info", RESOURCE); op.get(NAME).set(TARGET_MODULE_NAME); ModelNode response = getModelControllerClient().execute(op); ModelNode result = validateResponse(response); // compare module name Assert.assertEquals("Unexpected name", TARGET_MODULE_NAME + ":main", result.get(NAME).asString()); // compare dependencies List<ModelNode> dependencies = result.get("dependencies").asList(); DependencySpec[] xmlDependencies = module.getDependencies(); Map<String, ModuleDependencySpec> moduleDependencies = new HashMap<>(); for (DependencySpec d : xmlDependencies) { if (d instanceof ModuleDependencySpec) { ModuleDependencySpec mds = (ModuleDependencySpec) d; moduleDependencies.put(mds.getIdentifier().getName() + ":" + mds.getIdentifier().getSlot(), mds); } } int foundDependencies = 0; for (ModelNode d : dependencies) { String dependencyName = d.get("module-name").asString(); Assert.assertTrue("Expected dependency", moduleDependencies.containsKey(dependencyName)); foundDependencies++; } Assert.assertEquals("# of dependencies in module.xml != # of dependencies in module-info output", moduleDependencies.size(), foundDependencies); // compare local paths List<ModelNode> resourceLoaders = result.get("resource-loaders").asList(); // there should be only one jar loader in org.jboss.logmanager module List<String> paths = new ArrayList<>(); for (ModelNode n : resourceLoaders) { if (n.get("type").asString().equals("org.jboss.modules.JarFileResourceLoader")) { for (ModelNode node : n.get("paths").asList()) { paths.add(node.asString()); } break; } } Assert.assertTrue(module.getClassLoader().getLocalPaths().containsAll(paths)); } private Module loadModule(ModuleIdentifier identifier) throws IOException, ModuleLoadException { File[] roots = new File[]{new File(LAYERS_BASE)}; LocalModuleLoader moduleLoader = new LocalModuleLoader(roots); return moduleLoader.loadModule(identifier); } }