/jboss-as-7.1.1.Final/testsuite/integration/clust/src/test/java/org/jboss/as/test/clustering/cluster/web/ClusteredWebFailoverTestCase.java
Java | 285 lines | 165 code | 41 blank | 79 comment | 2 complexity | 640cc22eed83051148a1b83c6b438b69 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0
- /*
- * JBoss, Home of Professional Open Source.
- * Copyright 2011, 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.clustering.cluster.web;
- import java.io.IOException;
- import java.net.URL;
- import java.util.Properties;
- import java.util.concurrent.ExecutionException;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.http.HttpResponse;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.DefaultHttpClient;
- import org.jboss.arquillian.container.test.api.ContainerController;
- import org.jboss.arquillian.container.test.api.Deployer;
- import org.jboss.arquillian.container.test.api.OperateOnDeployment;
- import org.jboss.arquillian.container.test.api.RunAsClient;
- import org.jboss.arquillian.junit.Arquillian;
- import org.jboss.arquillian.junit.InSequence;
- import org.jboss.arquillian.test.api.ArquillianResource;
- import org.jboss.as.test.clustering.single.web.SimpleServlet;
- import org.jboss.as.test.http.util.HttpClientUtils;
- import org.junit.Assert;
- import org.junit.BeforeClass;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import static org.jboss.as.test.clustering.ClusteringTestConstants.CONTAINER_1;
- import static org.jboss.as.test.clustering.ClusteringTestConstants.CONTAINER_2;
- import static org.jboss.as.test.clustering.ClusteringTestConstants.DEPLOYMENT_1;
- import static org.jboss.as.test.clustering.ClusteringTestConstants.DEPLOYMENT_2;
- import static org.jboss.as.test.clustering.ClusteringTestConstants.GRACE_TIME_TO_MEMBERSHIP_CHANGE;
- /**
- * Test that failover and undeploy works.
- *
- * @author Radoslav Husar
- */
- @RunWith(Arquillian.class)
- @RunAsClient
- public abstract class ClusteredWebFailoverTestCase {
- /** Controller for testing failover and undeploy **/
- @ArquillianResource
- private ContainerController controller;
- @ArquillianResource
- private Deployer deployer;
- @BeforeClass
- public static void printSysProps() {
- Properties sysprops = System.getProperties();
- System.out.println("System properties:\n" + sysprops);
- }
- /**
- * Workaround for Arquillian so that you can use "@ArquillianResource(C.class) @OperateOnDeployment(D)" because the
- * containers need to be started beforehand.
- */
- @Test
- @InSequence(1)
- public void testStartContainersAndDeployments() {
- // Container is unmanaged, need to start manually.
- controller.start(CONTAINER_1);
- deployer.deploy(DEPLOYMENT_1);
- controller.start(CONTAINER_2);
- deployer.deploy(DEPLOYMENT_2);
- }
- /**
- * Test simple graceful shutdown failover:
- *
- * 1/ Start 2 containers and deploy <distributable/> webapp.
- * 2/ Query first container creating a web session.
- * 3/ Shutdown first container.
- * 4/ Query second container verifying sessions got replicated.
- * 5/ Bring up the first container.
- * 6/ Query first container verifying that updated sessions replicated back.
- *
- * @throws IOException
- * @throws InterruptedException
- */
- @Test
- @InSequence(2)
- public void testGracefulSimpleFailover(
- @ArquillianResource(SimpleServlet.class) @OperateOnDeployment(DEPLOYMENT_1) URL baseURL1,
- @ArquillianResource(SimpleServlet.class) @OperateOnDeployment(DEPLOYMENT_2) URL baseURL2)
- throws IOException, InterruptedException, ExecutionException {
- DefaultHttpClient client = HttpClientUtils.relaxedCookieHttpClient();
- String url1 = baseURL1.toString() + "simple";
- String url2 = baseURL2.toString() + "simple";
- try {
- HttpResponse response = tryGet(client, url1);
- System.out.println("Requested " + url1 + ", got " + response.getFirstHeader("value").getValue() + ".");
- Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
- Assert.assertEquals(1, Integer.parseInt(response.getFirstHeader("value").getValue()));
- response.getEntity().getContent().close();
- // Lets do this twice to have more debug info if failover is slow.
- response = client.execute(new HttpGet(url1));
- System.out.println("Requested " + url1 + ", got " + response.getFirstHeader("value").getValue() + ".");
- Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
- Assert.assertEquals(2, Integer.parseInt(response.getFirstHeader("value").getValue()));
- response.getEntity().getContent().close();
- // Gracefully shutdown the 1st container.
- controller.stop(CONTAINER_1);
- // Now check on the 2nd server
- // Note that this DOES rely on the fact that both servers are running on the "same" domain,
- // which is '127.0.0.0'. Otherwise you will have to spoof cookies. @Rado
- response = tryGet(client, url2);
- System.out.println("Requested " + url2 + ", got " + response.getFirstHeader("value").getValue() + ".");
- Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
- Assert.assertEquals("Session failed to replicate after container 1 was shutdown.", 3, Integer.parseInt(response.getFirstHeader("value").getValue()));
- response.getEntity().getContent().close();
- // Lets do one more check.
- response = client.execute(new HttpGet(url2));
- System.out.println("Requested " + url2 + ", got " + response.getFirstHeader("value").getValue() + ".");
- Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
- Assert.assertEquals(4, Integer.parseInt(response.getFirstHeader("value").getValue()));
- response.getEntity().getContent().close();
- controller.start(CONTAINER_1);
- // Lets wait for the cluster to update membership and tranfer state.
- response = tryGet(client, url1);
- System.out.println("Requested " + url1 + ", got " + response.getFirstHeader("value").getValue() + ".");
- Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
- Assert.assertEquals("Session failed to replicate after container 1 was brough up.", 5, Integer.parseInt(response.getFirstHeader("value").getValue()));
- response.getEntity().getContent().close();
- // Lets do this twice to have more debug info if failover is slow.
- response = client.execute(new HttpGet(url1));
- System.out.println("Requested " + url1 + ", got " + response.getFirstHeader("value").getValue() + ".");
- Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
- Assert.assertEquals(6, Integer.parseInt(response.getFirstHeader("value").getValue()));
- response.getEntity().getContent().close();
- } finally {
- client.getConnectionManager().shutdown();
- }
- // Is would be done automatically, keep for 2nd test is added
- deployer.undeploy(DEPLOYMENT_1);
- controller.stop(CONTAINER_1);
- deployer.undeploy(DEPLOYMENT_2);
- controller.stop(CONTAINER_2);
- // Assert.fail("Show me the logs please!");
- }
- @Test
- @InSequence(3)
- public void testStartContainersAndDeploymentsForUndeployFailover() {
- // Container is unmanaged, need to start manually.
- controller.start(CONTAINER_1);
- deployer.deploy(DEPLOYMENT_1);
- controller.start(CONTAINER_2);
- deployer.deploy(DEPLOYMENT_2);
- }
- /**
- * Test simple undeploy failover:
- *
- * 1/ Start 2 containers and deploy <distributable/> webapp.
- * 2/ Query first container creating a web session.
- * 3/ Undeploy application from the first container.
- * 4/ Query second container verifying sessions got replicated.
- * 5/ Redeploy application to the first container.
- * 6/ Query first container verifying that updated sessions replicated back.
- *
- * @throws IOException
- * @throws InterruptedException
- */
- @Test
- @InSequence(4)
- public void testGracefulUndeployFailover(
- @ArquillianResource(SimpleServlet.class) @OperateOnDeployment(DEPLOYMENT_1) URL baseURL1,
- @ArquillianResource(SimpleServlet.class) @OperateOnDeployment(DEPLOYMENT_2) URL baseURL2)
- throws IOException, InterruptedException {
- DefaultHttpClient client = HttpClientUtils.relaxedCookieHttpClient();
- String url1 = baseURL1.toString() + "simple";
- String url2 = baseURL2.toString() + "simple";
- try {
- HttpResponse response = tryGet(client, url1);
- System.out.println("Requested " + url1 + ", got " + response.getFirstHeader("value").getValue() + ".");
- Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
- Assert.assertEquals(1, Integer.parseInt(response.getFirstHeader("value").getValue()));
- response.getEntity().getContent().close();
- // Lets do this twice to have more debug info if failover is slow.
- response = client.execute(new HttpGet(url1));
- System.out.println("Requested " + url1 + ", got " + response.getFirstHeader("value").getValue() + ".");
- Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
- Assert.assertEquals(2, Integer.parseInt(response.getFirstHeader("value").getValue()));
- response.getEntity().getContent().close();
- // Gracefully undeploy from the 1st container.
- deployer.undeploy(DEPLOYMENT_1);
- // Now check on the 2nd server
- // Note that this DOES rely on the fact that both servers are running on the "same" domain,
- // which is '127.0.0.1'. Otherwise you will have to spoof cookies. @Rado
- response = tryGet(client, url2);
- System.out.println("Requested " + url2 + ", got " + response.getFirstHeader("value").getValue() + ".");
- Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
- Assert.assertEquals("Session failed to replicate after container 1 was shutdown.", 3, Integer.parseInt(response.getFirstHeader("value").getValue()));
- response.getEntity().getContent().close();
- // Lets do one more check.
- response = tryGet(client, url2);
- System.out.println("Requested " + url2 + ", got " + response.getFirstHeader("value").getValue() + ".");
- Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
- Assert.assertEquals(4, Integer.parseInt(response.getFirstHeader("value").getValue()));
- response.getEntity().getContent().close();
- // Redeploy
- deployer.deploy(DEPLOYMENT_1);
- response = tryGet(client, url1);
- System.out.println("Requested " + url1 + ", got " + response.getFirstHeader("value").getValue() + ".");
- Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
- Assert.assertEquals("Session failed to replicate after container 1 was brough up.", 5, Integer.parseInt(response.getFirstHeader("value").getValue()));
- response.getEntity().getContent().close();
- // Lets do this twice to have more debug info if failover is slow.
- response = client.execute(new HttpGet(url1));
- System.out.println("Requested " + url1 + ", got " + response.getFirstHeader("value").getValue() + ".");
- Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
- Assert.assertEquals(6, Integer.parseInt(response.getFirstHeader("value").getValue()));
- response.getEntity().getContent().close();
- } finally {
- client.getConnectionManager().shutdown();
- }
- // Is would be done automatically, keep for when 3nd test is added
- deployer.undeploy(DEPLOYMENT_1);
- controller.stop(CONTAINER_1);
- deployer.undeploy(DEPLOYMENT_2);
- controller.stop(CONTAINER_2);
- // Assert.fail("Show me the logs please!");
- }
- private HttpResponse tryGet(final DefaultHttpClient client, final String url1) throws IOException {
- final long startTime;
- HttpResponse response = client.execute(new HttpGet(url1));
- startTime = System.currentTimeMillis();
- while(response.getStatusLine().getStatusCode() != HttpServletResponse.SC_OK && startTime + GRACE_TIME_TO_MEMBERSHIP_CHANGE > System.currentTimeMillis()) {
- response = client.execute(new HttpGet(url1));
- }
- return response;
- }
- }