/* * 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.jboss.as.test.integration.management.cli.extensions; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import javax.inject.Inject; import org.jboss.as.cli.CommandHandlerProvider; import org.jboss.as.controller.Extension; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.client.ModelControllerClient; import org.jboss.as.controller.descriptions.ModelDescriptionConstants; import org.jboss.as.controller.operations.common.Util; import org.jboss.as.model.test.ModelTestUtils; import org.jboss.as.test.integration.management.cli.CliProcessWrapper; import org.jboss.as.test.module.util.TestModule; import org.jboss.dmr.ModelNode; import org.jboss.shrinkwrap.api.ArchivePath; import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.asset.Asset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.wildfly.core.testrunner.ManagementClient; import org.wildfly.core.testrunner.WildflyTestRunner; /** * @author Petr Kremensky pkremens@redhat.com */ @RunWith(WildflyTestRunner.class) public class DuplicateExtCommandTestCase { private static final String MODULE_NAME = "test.cli.extension.duplicate"; @Inject protected static ManagementClient client; @Inject protected static ModelControllerClient controllerClient; private static TestModule testModule; @BeforeClass public static void setupServer() throws Exception { createTestModule(); setupServerWithExtension(); } @AfterClass public static void tearDownServer() throws Exception { try { ModelNode subsystemResult = controllerClient.execute(Util.createRemoveOperation(PathAddress.pathAddress(DuplicateExtCommandSubsystemResourceDescription.PATH))); ModelNode extensionResult = controllerClient.execute(Util.createRemoveOperation(PathAddress.pathAddress(ModelDescriptionConstants.EXTENSION, MODULE_NAME))); ModelTestUtils.checkOutcome(subsystemResult); ModelTestUtils.checkOutcome(extensionResult); } finally { // cannot remove test module on running server on Windows due to file locks testModule.remove(); } } @Test public void testExtensionCommandCollision() throws Exception { CliProcessWrapper cli = new CliProcessWrapper() .addCliArgument("--connect") .addCliArgument("--controller=" + client.getMgmtAddress() + ":" + client.getMgmtPort()) .addCliArgument("extension-commands --errors"); cli.executeNonInteractive(); assertEquals(0, cli.getProcessExitValue()); assertTrue(cli.getOutput().trim().endsWith(DuplicateExtCommandHandler.NAME)); } private static void createTestModule() throws Exception { final File moduleXml = new File(DuplicateExtCommandTestCase.class.getResource(DuplicateExtCommandTestCase.class.getSimpleName() + "-module.xml").toURI()); testModule = new TestModule(MODULE_NAME, moduleXml); final JavaArchive archive = testModule.addResource("test-cli-duplicate-commands-module.jar") .addClass(DuplicateExtCommandHandler.class) .addClass(DuplicateExtCommandHandlerProvider.class) .addClass(DuplicateExtCommandsExtension.class) .addClass(CliExtCommandsParser.class) .addClass(DuplicateExtCommandSubsystemResourceDescription.class); ArchivePath services = ArchivePaths.create("/"); services = ArchivePaths.create(services, "services"); final ArchivePath extService = ArchivePaths.create(services, Extension.class.getName()); archive.addAsManifestResource(getResource(DuplicateExtCommandsExtension.class), extService); final ArchivePath cliCmdService = ArchivePaths.create(services, CommandHandlerProvider.class.getName()); archive.addAsManifestResource(getResource(DuplicateExtCommandHandlerProvider.class), cliCmdService); testModule.create(true); } private static Asset getResource(Class clazz) { return new Asset() { @Override public InputStream openStream() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { baos.write(clazz.getName().getBytes(StandardCharsets.UTF_8)); } catch (IOException e) { e.printStackTrace(); } return new ByteArrayInputStream(baos.toByteArray()); } }; } private static void setupServerWithExtension() throws Exception { //Add the extension final ModelNode addExtension = Util.createAddOperation(PathAddress.pathAddress(ModelDescriptionConstants.EXTENSION, MODULE_NAME)); ModelTestUtils.checkOutcome(controllerClient.execute(addExtension)); final ModelNode addSubsystem = Util.createAddOperation(PathAddress.pathAddress(DuplicateExtCommandSubsystemResourceDescription.PATH)); ModelTestUtils.checkOutcome(controllerClient.execute(addSubsystem)); } }