[jboss-cvs] JBossAS SVN: r65336 - trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/simpleweb/test.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Sep 12 11:54:35 EDT 2007


Author: bstansberry at jboss.com
Date: 2007-09-12 11:54:35 -0400 (Wed, 12 Sep 2007)
New Revision: 65336

Added:
   trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/simpleweb/test/TreeCacheSSOClusterManagerUnitTestCase.java
Log:
Move TreeCacheSSOClusterManagerUnitTestCase to cluster test package
Add a couple tests of config handling

Copied: trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/simpleweb/test/TreeCacheSSOClusterManagerUnitTestCase.java (from rev 65263, trunk/testsuite/src/main/org/jboss/test/web/test/TreeCacheSSOClusterManagerUnitTestCase.java)
===================================================================
--- trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/simpleweb/test/TreeCacheSSOClusterManagerUnitTestCase.java	                        (rev 0)
+++ trunk/testsuite/src/main/org/jboss/test/cluster/defaultcfg/simpleweb/test/TreeCacheSSOClusterManagerUnitTestCase.java	2007-09-12 15:54:35 UTC (rev 65336)
@@ -0,0 +1,433 @@
+/*
+* 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.cluster.defaultcfg.simpleweb.test;
+
+import java.util.Vector;
+
+import javax.management.MBeanServer;
+import javax.management.MBeanServerFactory;
+import javax.management.ObjectName;
+
+import org.apache.catalina.LifecycleException;
+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.buddyreplication.NextMemberBuddyLocatorConfig;
+import org.jboss.cache.config.BuddyReplicationConfig;
+import org.jboss.cache.config.BuddyReplicationConfig.BuddyLocatorConfig;
+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.pojo.jmx.PojoCacheJmxWrapper;
+import org.jboss.test.JBossTestCase;
+import org.jboss.test.cluster.testutil.MockTransactionManagerLookup;
+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 testPojoCacheIntegration() throws Exception
+   {
+      log.debug("+++ testPojoCacheIntegration()");
+      
+      MBeanServer mbeanServer = 
+         MBeanServerFactory.createMBeanServer("pojoCacheTest");
+      PojoCacheJmxWrapper wrapper = null;
+      try 
+      {
+         // Register a cache
+         wrapper = new PojoCacheJmxWrapper();
+         // JBAS-4097 -- don't use a TransactionManagerLookup that will
+         // bind DummyTransactionManager into JNDI, as that will screw
+         // up other tests
+         wrapper.setTransactionManagerLookupClass(MockTransactionManagerLookup.class.getName());
+         wrapper.setCacheMode("REPL_SYNC");
+         mbeanServer.registerMBean(wrapper, new ObjectName(TreeCacheSSOClusterManager.DEFAULT_GLOBAL_CACHE_NAME));
+         wrapper.create();
+         wrapper.start();
+         
+         // 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();
+         
+         // Create an SSO that will have two sessions from local valve
+         localSSOManager.register("1", "FORM", "Brian", "password");
+         
+         Manager localSessMgr1 = new StandardManager();
+         Session sess1 = new MockSession(localSessMgr1, "1");
+         localSSOManager.addSession("1", sess1);
+         
+         Manager localSessMgr2 = new StandardManager();
+         Session sess2 = new MockSession(localSessMgr2, "2");
+         localSSOManager.addSession("1", sess2);
+         
+         // Confirm that data is cached properly
+         assertEquals("SSO 1 has correct number of sessions", 2, localSSOManager.getSessionCount("1"));   
+      }
+      finally
+      {
+         try
+         {
+            if (wrapper != null)
+            {
+               wrapper.stop();
+               wrapper.destroy();
+            }
+         }
+         catch (Exception ignored)
+         {            
+         }
+         finally
+         {
+            MBeanServerFactory.releaseMBeanServer(mbeanServer);
+         }
+      }
+   }
+   
+   public void testDisallowBuddyReplication() throws Exception
+   {
+      log.debug("+++ testDisallowBuddyReplication()");
+      buddyReplicationConfigTest(true);
+      buddyReplicationConfigTest(false);
+   }
+   
+   private void buddyReplicationConfigTest(boolean enabled) throws Exception
+   {
+      MBeanServer mbeanServer = 
+         MBeanServerFactory.createMBeanServer("brTest");
+      CacheJmxWrapper wrapper = null;
+      try 
+      {
+         // Register a cache
+         wrapper = new CacheJmxWrapper();
+         // JBAS-4097 -- don't use a TransactionManagerLookup that will
+         // bind DummyTransactionManager into JNDI, as that will screw
+         // up other tests
+         wrapper.setTransactionManagerLookupClass(MockTransactionManagerLookup.class.getName());
+         wrapper.setCacheMode("REPL_SYNC");
+         // Configure buddy replication
+         BuddyReplicationConfig brc = new BuddyReplicationConfig();
+         brc.setEnabled(enabled);
+         brc.setBuddyPoolName("clusteredsso");
+         BuddyLocatorConfig blc = new NextMemberBuddyLocatorConfig();
+         brc.setBuddyLocatorConfig(blc);
+         wrapper.getConfiguration().setBuddyReplicationConfig(brc);
+         
+         mbeanServer.registerMBean(wrapper, new ObjectName(TreeCacheSSOClusterManager.DEFAULT_GLOBAL_CACHE_NAME));
+         wrapper.create();
+         wrapper.start();
+         
+         // 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);
+         
+         try
+         {
+            localSSOManager.start();
+            if (enabled)
+            {
+               fail("TreeCacheSSOClusterManager should not start with buddy replication enabled");
+            }
+         }
+         catch (LifecycleException le)
+         {
+            if (!enabled)
+            {
+               String msg = "Caught exception starting with BR disabled " + le.getLocalizedMessage();
+               log.error(msg, le);
+               fail(msg);
+            }
+            // else we shouldn't start
+         }
+      }
+      finally
+      {
+         try
+         {
+            if (wrapper != null)
+            {
+               wrapper.stop();
+               wrapper.destroy();
+            }
+         }
+         catch (Exception ignored)
+         {            
+         }
+         finally
+         {
+            MBeanServerFactory.releaseMBeanServer(mbeanServer);
+         }
+      }
+   }
+
+   public void testDeadMemberCleanupWithPool() throws Exception
+   {
+      log.debug("+++ testDeadMemberCleanupWithPool()");
+      deadMemberCleanupTest(true);
+   }
+   
+   public void testDeadMemberCleanupWithoutPool() throws Exception
+   {
+      log.debug("+++ testDeadMemberCleanupWithoutPool()");
+      deadMemberCleanupTest(false);
+   }
+   
+   private void deadMemberCleanupTest(boolean usePool) throws Exception
+   {       
+      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;
+      }
+   }
+
+}




More information about the jboss-cvs-commits mailing list