[jboss-cvs] JBossAS SVN: r65115 - trunk/testsuite/src/main/org/jboss/test/web/test.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Sep 5 15:40:30 EDT 2007


Author: bstansberry at jboss.com
Date: 2007-09-05 15:40:30 -0400 (Wed, 05 Sep 2007)
New Revision: 65115

Added:
   trunk/testsuite/src/main/org/jboss/test/web/test/TreeCacheSSOClusterManagerUnitTestCase.java
Log:
[JBAS-4057] Clustered SSO entries not properly cleaned up if a server crashes

Copied: trunk/testsuite/src/main/org/jboss/test/web/test/TreeCacheSSOClusterManagerUnitTestCase.java (from rev 65019, branches/Branch_4_2/testsuite/src/main/org/jboss/test/web/test/TreeCacheSSOClusterManagerUnitTestCase.java)
===================================================================
--- trunk/testsuite/src/main/org/jboss/test/web/test/TreeCacheSSOClusterManagerUnitTestCase.java	                        (rev 0)
+++ trunk/testsuite/src/main/org/jboss/test/web/test/TreeCacheSSOClusterManagerUnitTestCase.java	2007-09-05 19:40:30 UTC (rev 65115)
@@ -0,0 +1,297 @@
+/*
+* JBoss, a division of Red Hat
+* Copyright 2006, Red Hat Middleware, LLC, and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.web.test;
+
+import java.util.Set;
+import java.util.Vector;
+
+import javax.management.MBeanServer;
+import javax.management.MBeanServerFactory;
+import javax.management.ObjectName;
+import javax.transaction.TransactionManager;
+
+import org.apache.catalina.Manager;
+import org.apache.catalina.Session;
+import org.apache.catalina.session.StandardManager;
+import org.apache.catalina.session.StandardSession;
+import org.jboss.cache.CacheImpl;
+import org.jboss.cache.config.Configuration.CacheMode;
+import org.jboss.cache.jmx.CacheJmxWrapper;
+import org.jboss.cache.notifications.event.EventImpl;
+import org.jboss.cache.notifications.event.Event.Type;
+import org.jboss.cache.transaction.BatchModeTransactionManager;
+import org.jboss.cache.transaction.TransactionManagerLookup;
+import org.jboss.test.JBossTestCase;
+import org.jboss.util.threadpool.BasicThreadPool;
+import org.jboss.web.tomcat.service.sso.ClusteredSingleSignOn;
+import org.jboss.web.tomcat.service.sso.TreeCacheSSOClusterManager;
+import org.jgroups.Address;
+import org.jgroups.View;
+import org.jgroups.ViewId;
+import org.jgroups.stack.IpAddress;
+
+/**
+ * Test of the TreeCacheSSOClusterManager class.
+ * 
+ * @author Brian Stansberry
+ */
+public class TreeCacheSSOClusterManagerUnitTestCase extends JBossTestCase
+{
+   private static IpAddress LOCAL_ADDRESS;
+   private static IpAddress REMOTE_ADDRESS;
+   
+   public TreeCacheSSOClusterManagerUnitTestCase(String name)
+   {
+      super(name);
+   }
+   
+   @Override
+   protected void setUp() throws Exception
+   {
+      super.setUp();
+      LOCAL_ADDRESS  = new IpAddress("127.0.0.1", 11111);
+      REMOTE_ADDRESS = new IpAddress("192.168.0.1", 11111);
+   }
+
+   public void testDeadMemberCleanupWithPool() throws Exception
+   {
+      deadMemberCleanupTest(true);
+   }
+   
+   public void testDeadMemberCleanupWithoutPool() throws Exception
+   {
+      deadMemberCleanupTest(false);
+   }
+   
+   private void deadMemberCleanupTest(boolean usePool) throws Exception
+   {
+      log.debug("+++ testDeadMemberCleanup()");
+      
+      MBeanServer mbeanServer = 
+         MBeanServerFactory.createMBeanServer("deadMemberTest");
+      try 
+      {
+         // Register a cache
+         MockTreeCache cache = new MockTreeCache();
+         // JBAS-4097 -- don't use a TransactionManagerLookup that will
+         // bind DummyTransactionManager into JNDI, as that will screw
+         // up other tests
+         cache.setTransactionManagerLookup(new MockTransactionManagerLookup());
+         CacheJmxWrapper wrapper = new CacheJmxWrapper(cache);
+         mbeanServer.registerMBean(wrapper, new ObjectName(TreeCacheSSOClusterManager.DEFAULT_GLOBAL_CACHE_NAME));
+         wrapper.create();
+         wrapper.start();
+         
+         if (usePool)
+         {
+            BasicThreadPool pool = new BasicThreadPool();
+            mbeanServer.registerMBean(pool, new ObjectName(TreeCacheSSOClusterManager.DEFAULT_THREAD_POOL_NAME));
+         }
+         
+         // Build up an SSO infrastructure based on LOCAL_ADDRESS         
+         TreeCacheSSOClusterManager localSSOManager = new TreeCacheSSOClusterManager(mbeanServer);
+         localSSOManager.setCacheName(TreeCacheSSOClusterManager.DEFAULT_GLOBAL_CACHE_NAME);
+         
+         MockSSOValve localValve = new MockSSOValve();
+         localValve.setClusterManager(localSSOManager);
+         localSSOManager.setSingleSignOnValve(localValve);
+         localSSOManager.start();
+         
+         assertEquals("Thread pool usage as expected", usePool, localSSOManager.isUsingThreadPool());
+         
+         //  Build up a second SSO infrastructure based on LOCAL_ADDRESS
+         // It uses the same mock cache, but we change the cache address
+         // so it thinks it's a different address when it starts
+         cache.setOurAddress(REMOTE_ADDRESS);
+         
+         TreeCacheSSOClusterManager remoteSSOManager = new TreeCacheSSOClusterManager(mbeanServer);
+         remoteSSOManager.setCacheName(TreeCacheSSOClusterManager.DEFAULT_GLOBAL_CACHE_NAME);
+         
+         MockSSOValve remoteValve = new MockSSOValve();
+         remoteValve.setClusterManager(remoteSSOManager);
+         remoteSSOManager.setSingleSignOnValve(localValve);
+         remoteSSOManager.start();
+         
+         
+         // Create an SSO that will have sessions from both valves
+         localSSOManager.register("1", "FORM", "Brian", "password");
+         
+         Manager localSessMgr1 = new StandardManager();
+         Session sess1 = new MockSession(localSessMgr1, "1");
+         localSSOManager.addSession("1", sess1);
+         
+         Manager remoteSessMgr1 = new StandardManager();
+         Session sess2 = new MockSession(remoteSessMgr1, "2");
+         remoteSSOManager.addSession("1", sess2);
+         
+         
+         // Create another SSO with sessions only from remote
+         remoteSSOManager.register("2", "FORM", "Brian", "password");
+         
+         Manager remoteSessMgr2 = new StandardManager();
+         Session sess3 = new MockSession(remoteSessMgr2, "3");
+         remoteSSOManager.addSession("2", sess3);
+         
+         Manager remoteSessMgr3 = new StandardManager();
+         Session sess4 = new MockSession(remoteSessMgr3, "4");
+         remoteSSOManager.addSession("2", sess4);
+         
+         
+         // Create a third SSO that will have sessions from both valves
+         localSSOManager.register("3", "FORM", "Brian", "password");
+         
+         Manager localSessMgr2 = new StandardManager();
+         Session sess5 = new MockSession(localSessMgr2, "5");
+         localSSOManager.addSession("3", sess5);
+         
+         Manager remoteSessMgr4 = new StandardManager();
+         Session sess6 = new MockSession(remoteSessMgr4, "6");
+         remoteSSOManager.addSession("3", sess6);
+         
+         
+         // Create a fourth SSO that will have two sessions from local valve
+         localSSOManager.register("4", "FORM", "Brian", "password");
+         
+         Manager localSessMgr3 = new StandardManager();
+         Session sess7 = new MockSession(localSessMgr3, "7");
+         localSSOManager.addSession("4", sess7);
+         
+         Manager localSessMgr4 = new StandardManager();
+         Session sess8 = new MockSession(localSessMgr4, "8");
+         localSSOManager.addSession("4", sess8);
+         
+         // Confirm that data is cached properly
+         assertEquals("SSO 1 has correct number of sessions", 2, localSSOManager.getSessionCount("1"));
+         assertEquals("SSO 1 has correct number of sessions", 2, remoteSSOManager.getSessionCount("1"));
+         assertEquals("SSO 2 has correct number of sessions", 2, localSSOManager.getSessionCount("2"));
+         assertEquals("SSO 2 has correct number of sessions", 2, remoteSSOManager.getSessionCount("2"));
+         assertEquals("SSO 3 has correct number of sessions", 2, localSSOManager.getSessionCount("3"));
+         assertEquals("SSO 3 has correct number of sessions", 2, remoteSSOManager.getSessionCount("3"));
+         assertEquals("SSO 4 has correct number of sessions", 2, localSSOManager.getSessionCount("4"));
+         assertEquals("SSO 4 has correct number of sessions", 2, remoteSSOManager.getSessionCount("4"));
+         
+         // Put in a new view with REMOTE_ADDRESS dead
+         ViewId viewId = new ViewId(LOCAL_ADDRESS, 1);
+         Vector v = new Vector();
+         v.add(LOCAL_ADDRESS);
+         EventImpl event = new EventImpl();
+         event.setNewView(new View(viewId, v));
+         event.setType(Type.VIEW_CHANGED);
+         event.setPre(false);
+         
+         localSSOManager.viewChange(event);
+         
+         // Give the cleanup thread time to finish
+         Thread.sleep(2000);
+         
+         // Confirm that cached data is properly cleaned up
+         assertEquals("SSO 1 has correct number of sessions", 1, localSSOManager.getSessionCount("1"));
+         assertEquals("SSO 2 has correct number of sessions", 0, localSSOManager.getSessionCount("2"));
+         assertEquals("SSO 3 has correct number of sessions", 1, localSSOManager.getSessionCount("3"));
+         assertEquals("SSO 4 has correct number of sessions", 2, localSSOManager.getSessionCount("4"));         
+      }
+      finally
+      {
+         MBeanServerFactory.releaseMBeanServer(mbeanServer);
+      }      
+   }
+   
+   
+   static class MockTreeCache extends CacheImpl
+   {
+      private IpAddress ourAddress = LOCAL_ADDRESS;
+      
+      public MockTreeCache() throws Exception
+      {
+         super();
+         getConfiguration().setCacheMode(CacheMode.LOCAL);
+      }
+
+      @Override
+      public Address getLocalAddress()
+      {
+         return ourAddress;
+      }
+      
+      void setOurAddress(IpAddress address)
+      {
+         ourAddress = address;
+      }
+
+      @Override
+      public Vector getMembers()
+      {
+         Vector v = new Vector();
+         v.add(LOCAL_ADDRESS);
+         v.add(REMOTE_ADDRESS);
+         return v;
+      }      
+      
+   }
+   
+   /**
+    * Override ClusteredSingleSignOn to suppress the empty SSO callbacks
+    */
+   static class MockSSOValve extends ClusteredSingleSignOn
+   {
+      @Override
+      protected void notifySSOEmpty(String ssoId)
+      {
+         // no-op
+      }
+
+      @Override
+      protected void notifySSONotEmpty(String ssoId)
+      {
+         // no-op
+      }      
+   }
+   
+   static class MockSession extends StandardSession
+   {
+      private static final long serialVersionUID = 1L;
+      
+      private String ourId;
+      
+      MockSession(Manager manager, String id)
+      {
+         super(manager);
+         ourId = id;
+      }
+      
+      @Override
+      public String getId()
+      {
+         return ourId;
+      }
+   }
+   
+   static class MockTransactionManagerLookup implements TransactionManagerLookup
+   {
+      public TransactionManager getTransactionManager() throws Exception
+      {
+         return new BatchModeTransactionManager();
+      }
+      
+   }
+
+}




More information about the jboss-cvs-commits mailing list