Package org.jboss.test.cluster.apache_tomcat

Source Code of org.jboss.test.cluster.apache_tomcat.HttpSessionReplicationTestCase

/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, 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.test.cluster.apache_tomcat;

import java.io.IOException;
import java.net.HttpURLConnection;

import junit.framework.Test;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpRecoverableException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.jboss.test.JBossClusteredTestCase;
import org.jboss.test.JBossRMIAdaptorHelper;

import javax.management.ObjectName;
import javax.management.MBeanInfo;

/**
* This testcase is written to test HttpSessionReplication with one apache webserver
* loadbalancing multiple tomcat/JBoss instances.
*
* @author <a href="mailto:anil.saldhana@jboss.com">Anil Saldhana</a>.
* @version $Revision: 1.0
* @see org.jboss.test.cluster.apache_tomcat.HttpSessionReplicationTestCase
*/
public class HttpSessionReplicationTestCase
   extends JBossClusteredTestCase
{
   private String apacheurl = null;

   public HttpSessionReplicationTestCase(String name)
   {
      super(name);
/* try{
           this.getPropertiesFile();
           String numin = prop.getProperty("NumOfInstances");
       numInstances = Integer.parseInt( numin );
       if( numInstances < 2 ) fail( "Atleast two nodes needed");
             this.getLog().debug("Number of nodes="+numInstances);

       //Lets build up the jndi server urls now
       //this.setServerNames(servernames);
      }catch( Exception e){
        fail( e.getMessage());
      }  */
   }

   public static Test suite() throws Exception
   {
      Test t1 = JBossClusteredTestCase.getDeploySetup(HttpSessionReplicationTestCase.class,
         "http-sr.war");
      return t1;
   }

   /**
    * Tests connection to the Apache Server.
    * Note: We deal with just one Apache Server. We can bounce the different
    * JBoss/Tomcat servers and Apache will loadbalance.
    *
    * @throws Exception
    */
   public void testApacheConnection()
      throws Exception
   {
      getLog().debug("Enter testApacheConnection");
      try
      {
         /*String apacheurl =  prop.getProperty("ApacheUrl");
       getLog().debug(apacheurl);
assertTrue("Apache Up?", this.checkURL(apacheurl));*/
         apacheurl = System.getProperty("apache.url");
         getLog().debug(apacheurl);
         assertTrue("Apache Up?", this.checkURL(apacheurl));
      }
      catch (Exception e)
      {
         getLog().debug(e.getMessage());
      }
      getLog().debug("Exit testApacheConnection");
   }

   /**
    * Main method that deals with the Http Session Replication Test
    *
    * @throws Exception
    */
   public void testHttpSessionReplication()
      throws Exception
   {
      String attr = "";
      getLog().debug("Enter testHttpSessionReplication");

      apacheurl = System.getProperty("apache.url");
      String urlname = apacheurl + System.getProperty("apache.set.url");
      String geturlname = apacheurl + System.getProperty("apache.get.url");

      getLog().debug(urlname + ":::::::" + geturlname);

// Create an instance of HttpClient.
      HttpClient client = new HttpClient();

// Create a method instance.
      HttpMethod method = new GetMethod(geturlname);

//    Get the Attribute set by testsessionreplication.jsp
      attr = makeGet(client, method);

//    Shut down the first tomcat instance
      this.shutDownTomcatInstance(1);
      getLog().debug("Brought down the first tomcat instance");

      String[] httpURLs = super.getHttpURLs();
      String httpurl = httpURLs[0];
      String tmsg = "Is 1st Tomcat really down?Tomcat Up(" + httpurl + ")=";
      getLog().debug(tmsg + checkURL(httpurl));

//Give 30 seconds for things to stabilize.
      sleepThread(30);

//    Make connection
      method = new GetMethod(geturlname);
      String attr2 = makeGet(client, method);
      this.sleepThread(10);
      getLog().debug("Will Start the Tomcat MBean back");
      this.startTomcatInstance(1);
      this.sleepThread(10);
      getLog().debug("Tomcat Up=" + checkURL(httpurl));
      String tstr = "attr1=" + attr + " and attr2=" + attr2;
      if (!attr2.equals(attr)) fail("Http Session Replication failed with " + tstr);
      getLog().debug("Http Session Replication has happened");
      getLog().debug("Exit testHttpSessionReplication");
   }


   /**
    * Starts the Tomcat MBean running on a particular node
    *
    * @param instancenum Instance Number of the node
    * @throws Exception
    */
   private void startTomcatInstance(int instancenum)
      throws Exception
   {
      String jndi = getJNDIUrl(instancenum);
      getLog().debug("JNDI URL Obtained=  " + jndi);
      JBossRMIAdaptorHelper server = new JBossRMIAdaptorHelper(jndi);
      //Get the MBeanInfo for the Tomcat MBean
      ObjectName name = new ObjectName("jboss.web:service=WebServer");
      MBeanInfo info = server.getMBeanInfo(name);
      System.out.println("Tomcat MBean:" + info.getClassName());

      getLog().debug("Going to start tomcat  ");
      //Going to stop the Tomcat Instance
      server.invokeOperation(name, "start", null, null);
      this.sleepThread(10);
      server.invokeOperation(name, "startConnectors", null, null);
   }

   /**
    * Shuts down the Tomcat MBean running on a particular node
    *
    * @param instancenum Instance Number of the node
    * @throws Exception
    */
   private void shutDownTomcatInstance(int instancenum)
      throws Exception
   {
      String jndi = getJNDIUrl(instancenum);
      getLog().debug("JNDI URL Obtained=  " + jndi);
      JBossRMIAdaptorHelper server = new JBossRMIAdaptorHelper(jndi);
      //Get the MBeanInfo for the Tomcat MBean
      ObjectName name = new ObjectName("jboss.web:service=WebServer");
      MBeanInfo info = server.getMBeanInfo(name);
      System.out.println("Tomcat MBean:" + info.getClassName());

      getLog().debug("Going to stop tomcat  ");
      //Going to stop the Tomcat Instance
      server.invokeOperation(name, "stop", null, null);
   }


   /**
    * Generate the JNDI Url for the JBoss Instance with instance number
    *
    * @param instancenum
    * @return
    */
   private String getJNDIUrl(int instancenum)
   {
      String jndi = "";
      try
      {
         int num = instancenum - 1; //node0,node1 etc
         String key = "node" + num + ".jndi.url"; // node0.jndiurl
         jndi = System.getProperty(key);
      }
      catch (Exception e)
      {
         fail("getJNDIUrl Failed with:" + e.getMessage());
      }

      return jndi;
   }

   /**
    * Sleep for specified time
    *
    * @param secs
    * @throws Exception
    */
   private void sleepThread(long secs)
      throws Exception
   {
      Thread.sleep(1000 * secs);
   }


   /**
    * Makes a http call to the jsp that retrieves the attribute stored on the
    * session. When the attribute values mathes with the one retrieved earlier,
    * we have HttpSessionReplication.
    * Makes use of commons-httpclient library of Apache
    *
    * @param client
    * @param method
    * @return session attribute
    */
   private String makeGet(HttpClient client, HttpMethod method)
      throws IOException
   {
      try
      {
         client.executeMethod(method);
      }
      catch (HttpRecoverableException e)
      {
         log.debug("A recoverable exception occurred, retrying." +
            e.getMessage());
      }
      catch (IOException e)
      {
         log.debug(e);
         e.printStackTrace();
         System.exit(-1);
      }

      // Read the response body.
      byte[] responseBody = method.getResponseBody();

      // Release the connection.
      method.releaseConnection();

      // Deal with the response.
      // Use caution: ensure correct character encoding and is not binary data
      return new String(responseBody);
   }

   /**
    * Checks whether the url is valid or not
    *
    * @param url The URL which should be checked
    * @return whether the url is up or not
    */
   private boolean checkURL(String url)
   {
      boolean ok = false;
      if (url != null) url = url.trim();
      try
      {
         HttpClient httpConn = new HttpClient();
         GetMethod g = new GetMethod(url);
         int responseCode = httpConn.executeMethod(g);
         log.debug("Response Code for " + url + " is=" + responseCode);
         ok = responseCode == HttpURLConnection.HTTP_OK;
      }
      catch (Exception e)
      {
         log.debug("Exception for checking url=" + url);
         log.debug(e);
         ok = false;
      }
      return ok;
   }

}
TOP

Related Classes of org.jboss.test.cluster.apache_tomcat.HttpSessionReplicationTestCase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.