/* * JBoss, Home of Professional Open Source. * Copyright 2014, 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.deploy.runtime; import java.net.URL; import java.util.List; import java.util.concurrent.TimeUnit; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.client.ModelControllerClient; import org.jboss.as.controller.client.helpers.Operations; import org.jboss.as.controller.descriptions.ModelDescriptionConstants; import org.jboss.as.test.integration.common.HttpRequest; import org.jboss.as.test.integration.management.deploy.runtime.jaxrs.HelloApplication; import org.jboss.as.test.integration.management.deploy.runtime.jaxrs.HelloResource; import org.jboss.as.test.integration.management.deploy.runtime.jaxrs.SubHelloResource; import org.jboss.as.test.shared.TestSuiteEnvironment; import org.jboss.dmr.ModelNode; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.junit.runner.RunWith; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DEPLOYMENT; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_RESOURCE_OPERATION; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM; import static org.jboss.as.jaxrs.DeploymentRestResourcesDefintion.CONSUMES; import static org.jboss.as.jaxrs.DeploymentRestResourcesDefintion.JAVA_METHOD; import static org.jboss.as.jaxrs.DeploymentRestResourcesDefintion.PRODUCES; import static org.jboss.as.jaxrs.DeploymentRestResourcesDefintion.RESOURCE_CLASS; import static org.jboss.as.jaxrs.DeploymentRestResourcesDefintion.RESOURCE_METHODS; import static org.jboss.as.jaxrs.DeploymentRestResourcesDefintion.RESOURCE_PATH; import static org.jboss.as.jaxrs.DeploymentRestResourcesDefintion.RESOURCE_PATHS; import static org.jboss.as.jaxrs.DeploymentRestResourcesDefintion.REST_RESOURCE_NAME; import static org.jboss.as.jaxrs.DeploymentRestResourcesDefintion.SUB_RESOURCE_LOCATORS; import static org.junit.Assert.assertThat; import org.hamcrest.CoreMatchers; import org.jboss.as.controller.operations.common.Util; import org.jboss.as.jaxrs.JaxrsDeploymentDefinition; import org.jboss.as.jaxrs.JaxrsExtension; @RunWith(Arquillian.class) @RunAsClient public class JaxrsRuntimeNameTestCase extends AbstractRuntimeTestCase { private static final String DEPLOYMENT_NAME = "hello-rs.war"; private static final ModelControllerClient controllerClient = TestSuiteEnvironment.getModelControllerClient(); @ArquillianResource private URL url; @Deployment(testable = false) public static Archive<?> deploy() { WebArchive war = ShrinkWrap.create(WebArchive.class, DEPLOYMENT_NAME); war.addClass(HelloApplication.class); war.addClass(HelloResource.class); war.addClass(SubHelloResource.class); return war; } private String performCall(String urlPattern) throws Exception { return HttpRequest.get(url + urlPattern, 10, TimeUnit.SECONDS); } @Test public void testSubResource() throws Exception { assertThat(performCall("hello"), is("Hello World!")); } @Test public void testStepByStep() throws Exception { PathAddress deploymentAddress = PathAddress.pathAddress(DEPLOYMENT, DEPLOYMENT_NAME); ModelNode readResource = Util.createOperation(READ_RESOURCE_OPERATION, deploymentAddress); ModelNode result = controllerClient.execute(readResource); assertThat("Failed to list resources: " + result, Operations.isSuccessfulOutcome(result), is(true)); PathAddress subsystemAddress = deploymentAddress.append(SUBSYSTEM, "jaxrs"); readResource = Util.createOperation(READ_RESOURCE_OPERATION, subsystemAddress); result = controllerClient.execute(readResource); assertThat("Failed to list resources: " + result, Operations.isSuccessfulOutcome(result), is(true)); readResource = Util.createOperation(JaxrsDeploymentDefinition.SHOW_RESOURCES, subsystemAddress); result = controllerClient.execute(readResource); assertThat("Failed to list resources: " + result, Operations.isSuccessfulOutcome(result), is(true)); List<ModelNode> jaxrsResources = Operations.readResult(result).asList(); assertThat(jaxrsResources, is(notNullValue())); assertThat(jaxrsResources.size(), is(4)); for (ModelNode jaxrsResource : jaxrsResources) { assertThat(jaxrsResource.toString(), jaxrsResource.get(JaxrsDeploymentDefinition.CLASSNAME.getName()).asString(), is(HelloResource.class.getName())); String path = jaxrsResource.get(JaxrsDeploymentDefinition.PATH.getName()).asString(); switch (path) { case "/update": assertThat(jaxrsResource.toString(), jaxrsResource.get(JaxrsDeploymentDefinition.METHODS.getName()).asList().get(0).asString(), is("PUT /hello-rs/hello/update - org.jboss.as.test.integration.management.deploy.runtime.jaxrs.HelloResource.updateMessage(...)")); break; case "/json": assertThat(jaxrsResource.toString(), jaxrsResource.get(JaxrsDeploymentDefinition.METHODS.getName()).asList().get(0).asString(), is("GET /hello-rs/hello/json - org.jboss.as.test.integration.management.deploy.runtime.jaxrs.HelloResource.getHelloWorldJSON()")); break; case "/xml": assertThat(jaxrsResource.toString(), jaxrsResource.get(JaxrsDeploymentDefinition.METHODS.getName()).asList().get(0).asString(), is("GET /hello-rs/hello/xml - org.jboss.as.test.integration.management.deploy.runtime.jaxrs.HelloResource.getHelloWorldXML()")); break; case "/": assertThat(jaxrsResource.toString(), jaxrsResource.get(JaxrsDeploymentDefinition.METHODS.getName()).asList().get(0).asString(), is("GET /hello-rs/hello/ - org.jboss.as.test.integration.management.deploy.runtime.jaxrs.HelloResource.getHelloWorld()")); break; default: assertThat(jaxrsResource.toString(), false, is(true)); } } } @Test public void testReadRestResource() throws Exception { ModelNode removeResource = Util.createRemoveOperation(PathAddress.pathAddress(DEPLOYMENT, DEPLOYMENT_NAME).append(SUBSYSTEM, JaxrsExtension.SUBSYSTEM_NAME)); assertThat(Operations.getFailureDescription(controllerClient.execute(removeResource)).asString(), CoreMatchers.containsString("WFLYCTL0031")); ModelNode readResource = Util.createOperation(READ_RESOURCE_OPERATION, PathAddress.pathAddress(DEPLOYMENT, DEPLOYMENT_NAME) .append(SUBSYSTEM, JaxrsExtension.SUBSYSTEM_NAME) .append(REST_RESOURCE_NAME, HelloResource.class.getCanonicalName())); readResource.get(ModelDescriptionConstants.INCLUDE_RUNTIME).set(true); ModelNode result = controllerClient.execute(readResource); assertThat("Failed to list resources: " + result, Operations.isSuccessfulOutcome(result), is(true)); ModelNode res = Operations.readResult(result); assertThat(res.isDefined(), is(true)); assertThat(res.get(RESOURCE_CLASS.getName()).asString(), is(HelloResource.class.getCanonicalName())); List<ModelNode> subResList = res.get(RESOURCE_PATHS.getName()).asList(); assertThat(subResList.size(), is(4)); ModelNode rootRes = subResList.get(0); // '/' assertThat(rootRes.get(RESOURCE_PATH.getName()).asString(), is("/")); assertThat(rootRes.get(JAVA_METHOD.getName()).asString(), is("java.lang.String " + HelloResource.class.getCanonicalName() + ".getHelloWorld()")); assertThat(rootRes.get(CONSUMES.getName()).isDefined(), is(false)); assertThat(rootRes.get(PRODUCES.getName()).asList().size(), is(1)); assertThat(rootRes.get(PRODUCES.getName()).asList().get(0).asString(), is("text/plain")); assertThat(rootRes.get(RESOURCE_METHODS.getName()).asList().size(), is(1)); assertThat(rootRes.get(RESOURCE_METHODS.getName()).asList().get(0).asString(), is("GET /hello-rs/hello/")); ModelNode jsonRes = subResList.get(1);// '/json' assertThat(jsonRes.get(RESOURCE_PATH.getName()).asString(), is("/json")); assertThat(jsonRes.get(JAVA_METHOD.getName()).asString(), is("javax.json.JsonObject " + HelloResource.class.getCanonicalName() + ".getHelloWorldJSON()")); assertThat(jsonRes.get(CONSUMES.getName()).isDefined(), is(false)); assertThat(jsonRes.get(PRODUCES.getName()).asList().size(), is(1)); assertThat(jsonRes.get(PRODUCES.getName()).asList().get(0).asString(), is("application/json")); assertThat(jsonRes.get(RESOURCE_METHODS.getName()).asList().size(), is(1)); assertThat(jsonRes.get(RESOURCE_METHODS.getName()).asList().get(0).asString(), is("GET /hello-rs/hello/json")); ModelNode updateRes = subResList.get(2);// '/update' assertThat(updateRes.get(RESOURCE_PATH.getName()).asString(), is("/update")); assertThat(updateRes.get(JAVA_METHOD.getName()).asString(), is("void " + HelloResource.class.getCanonicalName() + ".updateMessage(@QueryParam java.lang.String content = 'Hello')")); assertThat(updateRes.get(PRODUCES.getName()).isDefined(), is(false)); assertThat(updateRes.get(CONSUMES.getName()).asList().size(), is(1)); assertThat(updateRes.get(CONSUMES.getName()).asList().get(0).asString(), is("text/plain")); assertThat(updateRes.get(RESOURCE_METHODS.getName()).asList().size(), is(1)); assertThat(updateRes.get(RESOURCE_METHODS.getName()).asList().get(0).asString(), is("PUT /hello-rs/hello/update")); ModelNode xmlRes = subResList.get(3);// '/xml' assertThat(xmlRes.get(RESOURCE_PATH.getName()).asString(), is("/xml")); assertThat(xmlRes.get(JAVA_METHOD.getName()).asString(), is("java.lang.String " + HelloResource.class.getCanonicalName() + ".getHelloWorldXML()")); assertThat(xmlRes.get(CONSUMES.getName()).isDefined(), is(false)); assertThat(xmlRes.get(PRODUCES.getName()).asList().size(), is(1)); assertThat(xmlRes.get(PRODUCES.getName()).asList().get(0).asString(), is("application/xml")); assertThat(xmlRes.get(RESOURCE_METHODS.getName()).asList().size(), is(1)); assertThat(xmlRes.get(RESOURCE_METHODS.getName()).asList().get(0).asString(), is("GET /hello-rs/hello/xml")); List<ModelNode> subLocatorList = res.get(SUB_RESOURCE_LOCATORS.getName()).asList(); assertThat(subLocatorList.size(), is(1)); ModelNode subLocatorRes = subLocatorList.get(0); assertThat(subLocatorRes.get(RESOURCE_CLASS.getName()).asString(), is(SubHelloResource.class.getCanonicalName())); List<ModelNode> subResInsideSubLocator = subLocatorRes.get(RESOURCE_PATHS.getName()).asList(); assertThat(subResInsideSubLocator.size(), is(2)); ModelNode subRootHi = subResInsideSubLocator.get(0); assertThat(subRootHi.get(RESOURCE_PATH.getName()).asString(), is("/sub/")); assertThat(subRootHi.get(JAVA_METHOD.getName()).asString(), is("java.lang.String " + SubHelloResource.class.getCanonicalName() + ".hi()")); assertThat(subRootHi.get(CONSUMES.getName()).isDefined(), is(false)); assertThat(subRootHi.get(PRODUCES.getName()).asList().size(), is(1)); assertThat(subRootHi.get(PRODUCES.getName()).asList().get(0).asString(), is("text/plain")); assertThat(subRootHi.get(RESOURCE_METHODS.getName()).asList().size(), is(1)); assertThat(subRootHi.get(RESOURCE_METHODS.getName()).asList().get(0).asString(), is("GET /hello-rs/hello/sub/")); ModelNode pingNode = subResInsideSubLocator.get(1); assertThat(pingNode.get(RESOURCE_PATH.getName()).asString(), is("/sub/ping/{name}")); assertThat(pingNode.get(JAVA_METHOD.getName()).asString(), is("java.lang.String " + SubHelloResource.class.getCanonicalName() + ".ping(@PathParam java.lang.String name = 'JBoss')")); assertThat(pingNode.get(CONSUMES.getName()).isDefined(), is(false)); assertThat(pingNode.get(PRODUCES.getName()).asList().size(), is(1)); assertThat(pingNode.get(PRODUCES.getName()).asList().get(0).asString(), is("text/plain")); assertThat(pingNode.get(RESOURCE_METHODS.getName()).asList().size(), is(1)); assertThat(pingNode.get(RESOURCE_METHODS.getName()).asList().get(0).asString(), is("GET /hello-rs/hello/sub/ping/{name}")); } @Test public void testRecursive() throws Exception { ModelNode readResource = Util.createOperation(READ_RESOURCE_OPERATION, PathAddress.pathAddress(DEPLOYMENT, DEPLOYMENT_NAME)); readResource.get(ModelDescriptionConstants.INCLUDE_RUNTIME).set(true); readResource.get(ModelDescriptionConstants.RECURSIVE).set(true); ModelNode result = controllerClient.execute(readResource); assertThat("Failed to list resources: " + result, Operations.isSuccessfulOutcome(result), is(true)); } }