/* * 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.defaultcfg.web.test; import java.io.IOException; import junit.framework.Test; import org.apache.commons.httpclient.HttpClient; import org.jboss.test.cluster.testutil.SessionTestUtil; import org.jboss.test.cluster.testutil.WebTestBase; import org.jboss.test.cluster.web.JBossClusteredWebTestCase; /** * Tests handling of the session timestamp. * * @author Ben Wang * @author Brian Stansberry * @version $Revision: 1.0 */ public class SessionTimestampTestCase extends WebTestBase { public SessionTimestampTestCase(String name) { super(name); } public static Test suite() throws Exception { return JBossClusteredWebTestCase.getDeploySetup(SessionTimestampTestCase.class, "http-sr.war"); } /** * Tests that sessions time out properly and that activity * on one cluster node prevents timeout on another. * * The session is configured by testsessionreplication.jsp to expire * after 10 seconds. It is configured by jboss-web.xml with a * maxUnreplicatedInterval of 8 secs. */ public void testSessionTimeout() throws Exception { getLog().debug("Enter testSessionTimeout"); String setURLName = "/http-sr/testsessionreplication.jsp"; String getURLName = "/http-sr/getattribute.jsp"; getLog().debug(setURLName + ":::::::" + getURLName); // Create first session on server0 HttpClient clientA = new HttpClient(); makeGet(clientA, baseURL0_ +setURLName); sleepThread(3000); // Update the first session to ensure timestamp replication occurs makeGetWithState(clientA, baseURL0_ +setURLName); // Get the Attribute set by testsessionreplication.jsp String attrA0 = makeGetWithState(clientA, baseURL0_ +getURLName); assertNotNull("Http session get", attrA0); sleepThread(1100); // Create a 2nd session HttpClient clientB = new HttpClient(); makeGet(clientB, baseURL0_ +setURLName); // Get the Attribute set by testsessionreplication.jsp String attrB0 = makeGetWithState(clientB, baseURL0_ +getURLName); assertNotNull("Http session get", attrB0); // Sleep 7 secs. This plus the previous 1.1+3 secs is enough to expire // first session on server1 if replication failed to keep it alive sleepThread(7000); // Switch to the other server and check if 1st session is alive // This session has a create time > 8 secs ago, so this will trigger // replication of the timestamp SessionTestUtil.setCookieDomainToThisServer(clientA, servers_[1]); String attrA1 = makeGetWithState(clientA, baseURL1_ +getURLName); assertEquals("Http session replication attributes retrieved from both servers ", attrA0, attrA1); // Switch to the other server and check if 2nd session is alive // This session has a create time < 8 secs ago, so this should not // trigger replication of the timestamp SessionTestUtil.setCookieDomainToThisServer(clientB, servers_[1]); String attrB1 = makeGetWithState(clientB, baseURL1_ +getURLName); assertEquals("Http session replication attributes retrieved from both servers ", attrB0, attrB1); getLog().debug("Replication has kept the sessions alive"); // sleep 2 more seconds so 1st session will expire on server0 if the // get didn't replicate the timestamp sleepThread(2000); // Confirm first session is alive on node 0 SessionTestUtil.setCookieDomainToThisServer(clientA, servers_[0]); attrA0 = makeGetWithState(clientA, baseURL0_ +getURLName); assertTrue("Original session A is present", attrA1.equals(attrA0)); // sleep 1.1 more secs. Last activity for second session on server 0 // will have been 1.1 + 2 + 7 = 10.1 secs ago, so it should be expired // on server 0 sleepThread(1100); // Confirm 2nd session is not alive on node 0 SessionTestUtil.setCookieDomainToThisServer(clientB, servers_[0]); attrB0 = makeGetWithState(clientB, baseURL0_ +getURLName); assertFalse("Original session B not alive", attrB1.equals(attrB0)); getLog().debug("Exit testSessionTimeout"); } /** * Tests that a request before maxUnreplicatedInterval has passed doesn't * trigger replication. */ public void testMaxUnreplicatedInterval() throws IOException { getLog().debug("Enter testMaxUnreplicatedInterval"); String setURLName = "/http-sr/testsessionreplication.jsp"; String getURLName = "/http-sr/getattribute.jsp"; String versionURLName = "/http-sr/version.jsp"; // Create an instance of HttpClient. HttpClient client = new HttpClient(); // Set the session attribute first makeGet(client, baseURL0_ +setURLName); // Get the Attribute set by testsessionreplication.jsp String attr = makeGetWithState(client, baseURL0_ +getURLName); // Sleep a bit, but less than the 16 sec maxUnreplicatedInterval sleepThread(500); // Access the session without touching any attribute String ver = makeGetWithState(client, baseURL0_ +versionURLName); // Sleep some more, long enough for the session replication to complete // if the last request incorrectly caused replication sleepThread(2000); // Switch servers SessionTestUtil.setCookieDomainToThisServer(client, servers_[1]); String ver1 = makeGetWithState(client, baseURL1_ +versionURLName); assertEquals("Session version count unchanged", ver, ver1); // Get the Attribute set by testsessionreplication.jsp String attr1 = makeGetWithState(client, baseURL1_ +getURLName); assertEquals("Session still present", attr, attr1); } }