/*
* 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.simpleweb.test;
import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import junit.framework.Test;
import org.apache.catalina.Context;
import org.jboss.cache.pojo.PojoCache;
import org.jboss.logging.Logger;
import org.jboss.metadata.web.jboss.JBossWebMetaData;
import org.jboss.metadata.web.jboss.ReplicationGranularity;
import org.jboss.metadata.web.jboss.ReplicationTrigger;
import org.jboss.test.JBossTestCase;
import org.jboss.test.cluster.testutil.CacheConfigTestSetup;
import org.jboss.test.cluster.testutil.SessionTestUtil;
import org.jboss.test.cluster.web.mocks.BasicRequestHandler;
import org.jboss.test.cluster.web.mocks.InvalidateSessionRequestHandler;
import org.jboss.test.cluster.web.mocks.RemoveAttributesRequestHandler;
import org.jboss.test.cluster.web.mocks.SetAttributesRequestHandler;
import org.jboss.test.cluster.web.notification.MockClusteredSessionNotificationPolicy;
import org.jboss.test.cluster.web.notification.MockHttpSessionAttributeListener;
import org.jboss.test.cluster.web.notification.MockHttpSessionListener;
import org.jboss.test.cluster.web.notification.SessionSpecListenerAttribute;
import org.jboss.web.tomcat.service.session.JBossCacheManager;
/**
* Tests of handling of servlet spec notifications.
*
* @author Brian Stansberry
*/
public class ClusteredSessionNotificationPolicyTestCase extends JBossTestCase
{
protected static PojoCache[] pojoCaches = new PojoCache[2];
protected static long testId = System.currentTimeMillis();
protected static boolean useBuddyRepl = Boolean.valueOf(System.getProperty("jbosstest.cluster.web.cache.br")).booleanValue();
protected Logger log = Logger.getLogger(getClass());
protected Set<JBossCacheManager> managers = new HashSet<JBossCacheManager>();
protected Map<String, Object> allAttributes;
protected Map<String, Object> immutables;
protected Map<String, Object> mutables;
protected Map<String, Object> attributes;
protected SessionSpecListenerAttribute attribute = new SessionSpecListenerAttribute();
protected Map<String, Object> newAttributes;
protected SessionSpecListenerAttribute newAttribute = new SessionSpecListenerAttribute();
protected String origNotificationPolicy;
public ClusteredSessionNotificationPolicyTestCase(String name)
{
super(name);
}
public static Test suite() throws Exception
{
File tmpDir = new File(System.getProperty("java.io.tmpdir"));
File root = new File(tmpDir, ClusteredSessionNotificationPolicyTestCase.class.getSimpleName());
root.mkdirs();
root.deleteOnExit();
return CacheConfigTestSetup.getTestSetup(ClusteredSessionNotificationPolicyTestCase.class, pojoCaches, false, root.getAbsolutePath(), !useBuddyRepl, false);
}
@Override
protected void setUp() throws Exception
{
super.setUp();
origNotificationPolicy = System.getProperty("jboss.web.clustered.session.notification.policy");
System.setProperty("jboss.web.clustered.session.notification.policy", MockClusteredSessionNotificationPolicy.class.getName());
attributes = new HashMap<String, Object>();
attributes.put("KEY", attribute);
attributes = Collections.unmodifiableMap(attributes);
newAttributes = new HashMap<String, Object>();
newAttributes.put("KEY", newAttribute);
newAttributes = Collections.unmodifiableMap(newAttributes);
}
@Override
protected void tearDown() throws Exception
{
super.tearDown();
if (origNotificationPolicy != null)
{
System.setProperty("jboss.web.clustered.session.notification.policy", origNotificationPolicy);
}
else
{
System.clearProperty("jboss.web.clustered.session.notification.policy");
}
for (JBossCacheManager manager : managers)
{
try
{
manager.stop();
}
catch (RuntimeException ignored)
{
log.debug("tearDown(): Caught exception cleaning up manager -- " + ignored.getLocalizedMessage());
}
}
managers.clear();
SessionSpecListenerAttribute.invocations.clear();
}
protected ReplicationGranularity getReplicationGranularity()
{
return ReplicationGranularity.SESSION;
}
protected ReplicationTrigger getReplicationTrigger()
{
return ReplicationTrigger.SET_AND_NON_PRIMITIVE_GET;
}
public void testSessionLifecycleWithNotifications() throws Exception
{
log.info("++++ Starting testSessionLifecycleWithNotifications ++++");
sessionLifecycleTest(true);
}
public void testSessionLifecycleWithoutNotifications() throws Exception
{
log.info("++++ Starting testSessionLifecycleWithoutNotifications ++++");
sessionLifecycleTest(false);
}
private void sessionLifecycleTest(boolean notify) throws Exception
{
String warname = String.valueOf(++testId);
// A war with a maxInactive of 30 mins maxUnreplicated of 0
JBossCacheManager[] mgrs = getCacheManagers(warname, 1800, 1);
JBossCacheManager jbcm0 = mgrs[0];
JBossCacheManager jbcm1 = mgrs[1];
assertTrue(jbcm0.getNotificationPolicy() instanceof MockClusteredSessionNotificationPolicy);
MockClusteredSessionNotificationPolicy mcsnp0 = (MockClusteredSessionNotificationPolicy) jbcm0.getNotificationPolicy();
assertNotNull("capability set", mcsnp0.getClusteredSessionNotificationCapability());
mcsnp0.setResponse(notify);
assertTrue(jbcm1.getNotificationPolicy() instanceof MockClusteredSessionNotificationPolicy);
MockClusteredSessionNotificationPolicy mcsnp1 = (MockClusteredSessionNotificationPolicy) jbcm1.getNotificationPolicy();
assertNotNull("capability set", mcsnp1.getClusteredSessionNotificationCapability());
mcsnp1.setResponse(notify);
MockHttpSessionListener hsl0 = new MockHttpSessionListener();
MockHttpSessionAttributeListener hsal0 = new MockHttpSessionAttributeListener();
Context ctx = (Context) jbcm0.getContainer();
ctx.setApplicationLifecycleListeners(new Object[]{ hsl0 });
ctx.setApplicationEventListeners(new Object[]{ hsal0 });
MockHttpSessionListener hsl1 = new MockHttpSessionListener();
MockHttpSessionAttributeListener hsal1 = new MockHttpSessionAttributeListener();
ctx = (Context) jbcm1.getContainer();
ctx.setApplicationLifecycleListeners(new Object[]{ hsl1 });
ctx.setApplicationEventListeners(new Object[]{ hsal1 });
// Initial request
SetAttributesRequestHandler setHandler = new SetAttributesRequestHandler(attributes, false);
SessionTestUtil.invokeRequest(jbcm0, setHandler, null);
validateNewSession(setHandler);
String sessionId = setHandler.getSessionId();
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(1, hsl0.invocations.size());
assertEquals(MockHttpSessionListener.Type.CREATED, hsl0.invocations.get(0));
assertEquals(1, hsal0.invocations.size());
assertEquals(MockHttpSessionAttributeListener.Type.ADDED, hsal0.invocations.get(0));
assertEquals(2, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.BOUND, SessionSpecListenerAttribute.invocations.get(0));
assertEquals(SessionSpecListenerAttribute.Type.PASSIVATED, SessionSpecListenerAttribute.invocations.get(1));
validateNoNotifications(null, null, hsl1, hsal1, null);
clearNotifications(hsl0, hsal0, null, null, SessionSpecListenerAttribute.invocations);
}
// Modify attribute request
setHandler = new SetAttributesRequestHandler(newAttributes, false);
SessionTestUtil.invokeRequest(jbcm0, setHandler, sessionId);
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(1, hsal0.invocations.size());
assertEquals(MockHttpSessionAttributeListener.Type.REPLACED, hsal0.invocations.get(0));
assertEquals(4, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.ACTIVATING, SessionSpecListenerAttribute.invocations.get(0));
assertEquals(SessionSpecListenerAttribute.Type.BOUND, SessionSpecListenerAttribute.invocations.get(1));
assertEquals(SessionSpecListenerAttribute.Type.UNBOUND, SessionSpecListenerAttribute.invocations.get(2));
assertEquals(SessionSpecListenerAttribute.Type.PASSIVATED, SessionSpecListenerAttribute.invocations.get(3));
validateNoNotifications(hsl0, null, hsl1, hsal1, null);
clearNotifications(null, hsal0, null, null, SessionSpecListenerAttribute.invocations);
}
// Passivate
Thread.sleep(1100);
jbcm0.backgroundProcess();
jbcm1.backgroundProcess();
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(1, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.PASSIVATED, SessionSpecListenerAttribute.invocations.get(0));
validateNoNotifications(hsl0, hsal0, hsl1, hsal1, null);
clearNotifications(null, null, null, null, SessionSpecListenerAttribute.invocations);
}
// Remove attribute request
RemoveAttributesRequestHandler removeHandler = new RemoveAttributesRequestHandler(newAttributes.keySet(), false);
SessionTestUtil.invokeRequest(jbcm0, removeHandler, sessionId);
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(1, hsal0.invocations.size());
assertEquals(MockHttpSessionAttributeListener.Type.REMOVED, hsal0.invocations.get(0));
assertEquals(3, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.ACTIVATING, SessionSpecListenerAttribute.invocations.get(0));
assertEquals(SessionSpecListenerAttribute.Type.ACTIVATING, SessionSpecListenerAttribute.invocations.get(1));
assertEquals(SessionSpecListenerAttribute.Type.UNBOUND, SessionSpecListenerAttribute.invocations.get(2));
validateNoNotifications(hsl0, null, hsl1, hsal1, null);
clearNotifications(null, hsal0, null, null, SessionSpecListenerAttribute.invocations);
}
// Failover request
setHandler = new SetAttributesRequestHandler(attributes, false);
SessionTestUtil.invokeRequest(jbcm1, setHandler, sessionId);
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(1, hsl1.invocations.size());
assertEquals(MockHttpSessionListener.Type.CREATED, hsl1.invocations.get(0));
assertEquals(1, hsal1.invocations.size());
assertEquals(MockHttpSessionAttributeListener.Type.ADDED, hsal1.invocations.get(0));
assertEquals(2, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.BOUND, SessionSpecListenerAttribute.invocations.get(0));
assertEquals(SessionSpecListenerAttribute.Type.PASSIVATED, SessionSpecListenerAttribute.invocations.get(1));
validateNoNotifications(hsl0, hsal0, null, null, null);
clearNotifications(null, null, hsl1, hsal1, SessionSpecListenerAttribute.invocations);
}
// Passivate
Thread.sleep(1100);
jbcm0.backgroundProcess();
jbcm1.backgroundProcess();
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(1, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.PASSIVATED, SessionSpecListenerAttribute.invocations.get(0));
validateNoNotifications(hsl0, hsal0, hsl1, hsal1, null);
clearNotifications(null, null, null, null, SessionSpecListenerAttribute.invocations);
}
// Fail back and invalidate session after changing attribute
InvalidateSessionRequestHandler invalidateHandler = new InvalidateSessionRequestHandler(newAttributes.keySet(), false);
SessionTestUtil.invokeRequest(jbcm0, invalidateHandler, sessionId);
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(1, hsl0.invocations.size());
assertEquals(MockHttpSessionListener.Type.DESTROYED, hsl0.invocations.get(0));
assertEquals(1, hsal0.invocations.size());
assertEquals(MockHttpSessionAttributeListener.Type.REMOVED, hsal0.invocations.get(0));
assertEquals(3, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.ACTIVATING, SessionSpecListenerAttribute.invocations.get(0));
assertEquals(SessionSpecListenerAttribute.Type.ACTIVATING, SessionSpecListenerAttribute.invocations.get(1));
assertEquals(SessionSpecListenerAttribute.Type.UNBOUND, SessionSpecListenerAttribute.invocations.get(2));
validateNoNotifications(null, null, hsl1, hsal1, null);
clearNotifications(hsl0, hsal0, null, null, SessionSpecListenerAttribute.invocations);
}
}
public void testSessionExpirationWithNotifications() throws Exception
{
log.info("++++ Starting testSessionExpirationWithNotifications ++++");
sessionExpirationTest(true);
}
public void testSessionExpirationWithoutNotifications() throws Exception
{
log.info("++++ Starting testSessionExpirationWithoutNotifications ++++");
sessionExpirationTest(false);
}
private void sessionExpirationTest(boolean notify) throws Exception
{
String warname = String.valueOf(++testId);
// A war with a maxInactive of 2 secs and a maxIdle of 1
JBossCacheManager[] mgrs = getCacheManagers(warname, 2, 1);
JBossCacheManager jbcm0 = mgrs[0];
JBossCacheManager jbcm1 = mgrs[1];
assertTrue(jbcm0.getNotificationPolicy() instanceof MockClusteredSessionNotificationPolicy);
MockClusteredSessionNotificationPolicy mcsnp0 = (MockClusteredSessionNotificationPolicy) jbcm0.getNotificationPolicy();
assertNotNull("capability set", mcsnp0.getClusteredSessionNotificationCapability());
mcsnp0.setResponse(notify);
assertTrue(jbcm1.getNotificationPolicy() instanceof MockClusteredSessionNotificationPolicy);
MockClusteredSessionNotificationPolicy mcsnp1 = (MockClusteredSessionNotificationPolicy) jbcm1.getNotificationPolicy();
assertNotNull("capability set", mcsnp1.getClusteredSessionNotificationCapability());
mcsnp1.setResponse(notify);
MockHttpSessionListener hsl0 = new MockHttpSessionListener();
MockHttpSessionAttributeListener hsal0 = new MockHttpSessionAttributeListener();
Context ctx = (Context) jbcm0.getContainer();
ctx.setApplicationLifecycleListeners(new Object[]{ hsl0 });
ctx.setApplicationEventListeners(new Object[]{ hsal0 });
MockHttpSessionListener hsl1 = new MockHttpSessionListener();
MockHttpSessionAttributeListener hsal1 = new MockHttpSessionAttributeListener();
ctx = (Context) jbcm1.getContainer();
ctx.setApplicationLifecycleListeners(new Object[]{ hsl1 });
ctx.setApplicationEventListeners(new Object[]{ hsal1 });
// Initial request
SetAttributesRequestHandler setHandler = new SetAttributesRequestHandler(attributes, false);
SessionTestUtil.invokeRequest(jbcm0, setHandler, null);
validateNewSession(setHandler);
String sessionId = setHandler.getSessionId();
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(1, hsl0.invocations.size());
assertEquals(MockHttpSessionListener.Type.CREATED, hsl0.invocations.get(0));
assertEquals(1, hsal0.invocations.size());
assertEquals(MockHttpSessionAttributeListener.Type.ADDED, hsal0.invocations.get(0));
assertEquals(2, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.BOUND, SessionSpecListenerAttribute.invocations.get(0));
assertEquals(SessionSpecListenerAttribute.Type.PASSIVATED, SessionSpecListenerAttribute.invocations.get(1));
validateNoNotifications(null, null, hsl1, hsal1, null);
clearNotifications(hsl0, hsal0, null, null, SessionSpecListenerAttribute.invocations);
}
// Failover request
setHandler = new SetAttributesRequestHandler(newAttributes, false);
SessionTestUtil.invokeRequest(jbcm1, setHandler, sessionId);
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(1, hsl1.invocations.size());
assertEquals(MockHttpSessionListener.Type.CREATED, hsl1.invocations.get(0));
assertEquals(1, hsal1.invocations.size());
assertEquals(MockHttpSessionAttributeListener.Type.REPLACED, hsal1.invocations.get(0));
assertEquals(4, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.ACTIVATING, SessionSpecListenerAttribute.invocations.get(0));
assertEquals(SessionSpecListenerAttribute.Type.BOUND, SessionSpecListenerAttribute.invocations.get(1));
assertEquals(SessionSpecListenerAttribute.Type.UNBOUND, SessionSpecListenerAttribute.invocations.get(2));
assertEquals(SessionSpecListenerAttribute.Type.PASSIVATED, SessionSpecListenerAttribute.invocations.get(3));
validateNoNotifications(hsl0, hsal0, null, null, null);
clearNotifications(null, null, hsl1, hsal1, SessionSpecListenerAttribute.invocations);
}
// Passivate
Thread.sleep(1100);
jbcm0.backgroundProcess();
jbcm1.backgroundProcess();
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(2, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.PASSIVATED, SessionSpecListenerAttribute.invocations.get(0));
assertEquals(SessionSpecListenerAttribute.Type.PASSIVATED, SessionSpecListenerAttribute.invocations.get(1));
validateNoNotifications(hsl0, hsal0, hsl1, hsal1, null);
clearNotifications(null, null, null, null, SessionSpecListenerAttribute.invocations);
}
// Expire
Thread.sleep(1000);
jbcm0.backgroundProcess();
jbcm1.backgroundProcess();
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(1, hsl0.invocations.size());
assertEquals(MockHttpSessionListener.Type.DESTROYED, hsl0.invocations.get(0));
assertEquals(1, hsl1.invocations.size());
assertEquals(MockHttpSessionListener.Type.DESTROYED, hsl1.invocations.get(0));
assertEquals(1, hsal0.invocations.size());
assertEquals(MockHttpSessionAttributeListener.Type.REMOVED, hsal0.invocations.get(0));
assertEquals(1, hsal1.invocations.size());
assertEquals(MockHttpSessionAttributeListener.Type.REMOVED, hsal1.invocations.get(0));
assertEquals(4, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.ACTIVATING, SessionSpecListenerAttribute.invocations.get(0));
assertEquals(SessionSpecListenerAttribute.Type.UNBOUND, SessionSpecListenerAttribute.invocations.get(1));
assertEquals(SessionSpecListenerAttribute.Type.ACTIVATING, SessionSpecListenerAttribute.invocations.get(2));
assertEquals(SessionSpecListenerAttribute.Type.UNBOUND, SessionSpecListenerAttribute.invocations.get(3));
validateNoNotifications(null, null, null, null, null);
clearNotifications(hsl0, hsal0, hsl1, hsal1, SessionSpecListenerAttribute.invocations);
}
}
public void testUndeployWithNotifications() throws Exception
{
log.info("++++ Starting testUndeployWithNotifications ++++");
undeployTest(true);
}
public void testUndeployWithoutNotifications() throws Exception
{
log.info("++++ Starting testUndeployWithoutNotifications ++++");
undeployTest(false);
}
private void undeployTest(boolean notify) throws Exception
{
String warname = String.valueOf(++testId);
// A war with a maxInactive of 30 mins and no maxIdle
JBossCacheManager[] mgrs = getCacheManagers(warname, 1800, -1);
JBossCacheManager jbcm0 = mgrs[0];
JBossCacheManager jbcm1 = mgrs[1];
assertTrue(jbcm0.getNotificationPolicy() instanceof MockClusteredSessionNotificationPolicy);
MockClusteredSessionNotificationPolicy mcsnp0 = (MockClusteredSessionNotificationPolicy) jbcm0.getNotificationPolicy();
assertNotNull("capability set", mcsnp0.getClusteredSessionNotificationCapability());
mcsnp0.setResponse(notify);
assertTrue(jbcm1.getNotificationPolicy() instanceof MockClusteredSessionNotificationPolicy);
MockClusteredSessionNotificationPolicy mcsnp1 = (MockClusteredSessionNotificationPolicy) jbcm1.getNotificationPolicy();
assertNotNull("capability set", mcsnp1.getClusteredSessionNotificationCapability());
mcsnp1.setResponse(notify);
MockHttpSessionListener hsl0 = new MockHttpSessionListener();
MockHttpSessionAttributeListener hsal0 = new MockHttpSessionAttributeListener();
Context ctx = (Context) jbcm0.getContainer();
ctx.setApplicationLifecycleListeners(new Object[]{ hsl0 });
ctx.setApplicationEventListeners(new Object[]{ hsal0 });
MockHttpSessionListener hsl1 = new MockHttpSessionListener();
MockHttpSessionAttributeListener hsal1 = new MockHttpSessionAttributeListener();
ctx = (Context) jbcm1.getContainer();
ctx.setApplicationLifecycleListeners(new Object[]{ hsl1 });
ctx.setApplicationEventListeners(new Object[]{ hsal1 });
// Initial request
SetAttributesRequestHandler setHandler = new SetAttributesRequestHandler(attributes, false);
SessionTestUtil.invokeRequest(jbcm0, setHandler, null);
validateNewSession(setHandler);
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(1, hsl0.invocations.size());
assertEquals(MockHttpSessionListener.Type.CREATED, hsl0.invocations.get(0));
assertEquals(1, hsal0.invocations.size());
assertEquals(MockHttpSessionAttributeListener.Type.ADDED, hsal0.invocations.get(0));
assertEquals(2, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.BOUND, SessionSpecListenerAttribute.invocations.get(0));
assertEquals(SessionSpecListenerAttribute.Type.PASSIVATED, SessionSpecListenerAttribute.invocations.get(1));
validateNoNotifications(null, null, hsl1, hsal1, null);
clearNotifications(hsl0, hsal0, null, null, SessionSpecListenerAttribute.invocations);
}
jbcm0.stop();
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
assertEquals(1, hsl0.invocations.size());
assertEquals(MockHttpSessionListener.Type.DESTROYED, hsl0.invocations.get(0));
assertEquals(1, hsal0.invocations.size());
assertEquals(MockHttpSessionAttributeListener.Type.REMOVED, hsal0.invocations.get(0));
assertEquals(1, SessionSpecListenerAttribute.invocations.size());
assertEquals(SessionSpecListenerAttribute.Type.UNBOUND, SessionSpecListenerAttribute.invocations.get(0));
validateNoNotifications(null, null, hsl1, hsal1, null);
clearNotifications(hsl0, hsal0, null, null, SessionSpecListenerAttribute.invocations);
}
jbcm1.stop();
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
}
private void validateNoNotifications(MockHttpSessionListener hsl0, MockHttpSessionAttributeListener hsal0,
MockHttpSessionListener hsl1, MockHttpSessionAttributeListener hsal1)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1, SessionSpecListenerAttribute.invocations);
}
private void validateNoNotifications(MockHttpSessionListener hsl0, MockHttpSessionAttributeListener hsal0,
MockHttpSessionListener hsl1, MockHttpSessionAttributeListener hsal1, List<SessionSpecListenerAttribute.Type> sspalis)
{
if (hsl0 != null)
{
assertEquals(0, hsl0.invocations.size());
}
if (hsal0 != null)
{
assertEquals(0, hsal0.invocations.size());
}
if (hsl1 != null)
{
assertEquals(0, hsl1.invocations.size());
}
if (hsal1 != null)
{
assertEquals(0, hsal1.invocations.size());
}
if (sspalis != null)
{
assertEquals(0, sspalis.size());
}
clearNotifications(hsl0, hsal0, hsl1, hsal1, sspalis);
}
private void clearNotifications(MockHttpSessionListener hsl0, MockHttpSessionAttributeListener hsal0,
MockHttpSessionListener hsl1, MockHttpSessionAttributeListener hsal1, List<SessionSpecListenerAttribute.Type> sspalis)
{
if (hsl0 != null)
{
hsl0.invocations.clear();
}
if (hsal0 != null)
{
hsal0.invocations.clear();
}
if (hsl1 != null)
{
hsl1.invocations.clear();
}
if (hsal1 != null)
{
hsal1.invocations.clear();
}
if (sspalis != null)
{
sspalis.clear();
}
}
protected JBossCacheManager[] getCacheManagers(String warname, int maxInactive, int maxIdle)
throws Exception
{
JBossCacheManager jbcm0 = SessionTestUtil.createManager(warname, maxInactive, pojoCaches[0], null);
JBossWebMetaData metadata = SessionTestUtil.createWebMetaData(getReplicationGranularity(), getReplicationTrigger(), -1, maxIdle > 0, maxIdle, -1 ,false, 0);
metadata.getReplicationConfig().setSessionNotificationPolicy(MockClusteredSessionNotificationPolicy.class.getName());
jbcm0.init(warname, metadata);
this.managers.add(jbcm0);
jbcm0.start();
JBossCacheManager jbcm1 = SessionTestUtil.createManager(warname, maxInactive, pojoCaches[1], null);
metadata = SessionTestUtil.createWebMetaData(getReplicationGranularity(), getReplicationTrigger(), -1, true, maxIdle, -1 ,false, 0);
metadata.getReplicationConfig().setSessionNotificationPolicy(MockClusteredSessionNotificationPolicy.class.getName());
jbcm1.init(warname, metadata);
this.managers.add(jbcm1);
jbcm1.start();
return new JBossCacheManager[]{jbcm0, jbcm1};
}
protected void validateExpectedAttributes(Map<String, Object> expected, BasicRequestHandler handler)
{
assertFalse(handler.isNewSession());
if (handler.isCheckAttributeNames())
{
assertEquals(expected.size(), handler.getAttributeNames().size());
}
Map<String, Object> checked = handler.getCheckedAttributes();
assertEquals(expected.size(), checked.size());
for (Map.Entry<String, Object> entry : checked.entrySet())
assertEquals(entry.getKey(), expected.get(entry.getKey()), entry.getValue());
}
protected void validateNewSession(BasicRequestHandler handler)
{
assertTrue(handler.isNewSession());
assertEquals(handler.getCreationTime(), handler.getLastAccessedTime());
if (handler.isCheckAttributeNames())
{
assertEquals(0, handler.getAttributeNames().size());
}
Map<String, Object> checked = handler.getCheckedAttributes();
for (Map.Entry<String, Object> entry : checked.entrySet())
assertNull(entry.getKey(), entry.getValue());
}
}