package org.jboss.as.test.integration.web.response;
import java.io.IOException;
import java.net.URI;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.jboss.arquillian.container.test.api.Deployer;
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.arquillian.api.ContainerResource;
import org.jboss.as.arquillian.container.ManagementClient;
import org.jboss.as.test.integration.management.base.ContainerResourceMgmtTestBase;
import org.jboss.as.test.integration.management.util.MgmtOperationException;
import org.jboss.as.test.integration.management.util.ModelUtil;
import org.jboss.as.test.shared.ServerReload;
import org.jboss.dmr.ModelNode;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* @author Tomas Hofman (thofman@redhat.com)
*/
@RunWith(Arquillian.class)
@RunAsClient
public class RewriteLocationByDeplomentTestCase extends ContainerResourceMgmtTestBase {
@ArquillianResource
Deployer deployer;
@SuppressWarnings("WeakerAccess")
@ContainerResource
ManagementClient managementClient;
@Deployment(name = "app", managed = false)
public static WebArchive deployment() {
WebArchive war = ShrinkWrap.create(WebArchive.class, DefaultResponseCodeTestCase.class.getSimpleName() + ".war");
war.addClasses(SimpleRootServlet.class);
war.addAsWebInfResource(new StringAsset("<jboss-web><context-root>/test</context-root></jboss-web>"),
"jboss-web.xml");
return war;
}
@Test
public void testDeploymentOverLocation() throws IOException, MgmtOperationException {
// check that "/test" path returns 404
HttpResponse response = getResponse("/test");
Assert.assertEquals(404, response.getStatusLine().getStatusCode());
// create location "/test" serving welcome-content
ModelNode op = ModelUtil.createOpNode("subsystem=undertow/server=default-server/host=default-host", "add");
op.get("address").add("location", "/test");
op.get("handler").set("welcome-content");
executeOperation(op);
try {
ServerReload.executeReloadAndWaitForCompletion(getModelControllerClient());
response = getResponse("/test");
Assert.assertEquals(200, response.getStatusLine().getStatusCode());
Assert.assertTrue("Expected to receive welcome page, but content length is 0",
response.getEntity().getContentLength() > 0);
// deploy an app at the same location and check it's accessible
deployer.deploy("app");
response = getResponse("/test");
Assert.assertEquals(200, response.getStatusLine().getStatusCode());
Assert.assertTrue("Expected to receive servlet response without any content",
response.getEntity().getContentLength() == 0);
// undeploy app and check that welcome-content is accessible again
deployer.undeploy("app");
response = getResponse("/test");
Assert.assertEquals(200, response.getStatusLine().getStatusCode());
Assert.assertTrue("Expected to receive welcome page, but content length is 0",
response.getEntity().getContentLength() > 0);
} finally {
op = ModelUtil.createOpNode("subsystem=undertow/server=default-server/host=default-host", "remove");
op.get("address").add("location", "/test");
//noinspection ThrowFromFinallyBlock
executeOperation(op);
ServerReload.executeReloadAndWaitForCompletion(getModelControllerClient());
//noinspection ThrowFromFinallyBlock
response = getResponse("/test");
Assert.assertEquals(404, response.getStatusLine().getStatusCode());
}
}
private HttpResponse getResponse(String path) throws IOException {
URI webUri = managementClient.getWebUri();
HttpGet httpGet = new HttpGet(webUri.resolve(path));
return HttpClientBuilder.create().build().execute(httpGet);
}
}