/*
* 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.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.logging.Logger;
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.DBSetupDelegate;
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.test.cluster.web.persistent.PersistentSessionTestUtil;
import org.jboss.test.cluster.web.persistent.SimplePersistentStoreTestSetup;
import org.jboss.web.tomcat.service.session.persistent.DataSourcePersistentManager;
/**
* Tests of handling of servlet spec notifications.
*
* @author Brian Stansberry
*/
public class PersistentStoreSessionNotificationPolicyTestCase extends JBossTestCase
{
protected static long testId = System.currentTimeMillis();
protected Logger log = Logger.getLogger(getClass());
protected Set<DataSourcePersistentManager> managers = new HashSet<DataSourcePersistentManager>();
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 PersistentStoreSessionNotificationPolicyTestCase(String name)
{
super(name);
}
public static Test suite() throws Exception
{
String dbAddress = System.getProperty(DBSetupDelegate.DBADDRESS_PROPERTY, DBSetupDelegate.DEFAULT_ADDRESS);
return SimplePersistentStoreTestSetup.getDeploySetup(PersistentStoreSessionNotificationPolicyTestCase.class, dbAddress, DBSetupDelegate.DEFAULT_PORT);
}
@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 (DataSourcePersistentManager 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
DataSourcePersistentManager[] mgrs = getCacheManagers(warname, 1800, 1);
DataSourcePersistentManager mgr0 = mgrs[0];
DataSourcePersistentManager mgr1 = mgrs[1];
assertTrue(mgr0.getNotificationPolicy() instanceof MockClusteredSessionNotificationPolicy);
MockClusteredSessionNotificationPolicy mcsnp0 = (MockClusteredSessionNotificationPolicy) mgr0.getNotificationPolicy();
assertNotNull("capability set", mcsnp0.getClusteredSessionNotificationCapability());
mcsnp0.setResponse(notify);
assertTrue(mgr1.getNotificationPolicy() instanceof MockClusteredSessionNotificationPolicy);
MockClusteredSessionNotificationPolicy mcsnp1 = (MockClusteredSessionNotificationPolicy) mgr1.getNotificationPolicy();
assertNotNull("capability set", mcsnp1.getClusteredSessionNotificationCapability());
mcsnp1.setResponse(notify);
MockHttpSessionListener hsl0 = new MockHttpSessionListener();
MockHttpSessionAttributeListener hsal0 = new MockHttpSessionAttributeListener();
Context ctx = (Context) mgr0.getContainer();
ctx.setApplicationLifecycleListeners(new Object[]{ hsl0 });
ctx.setApplicationEventListeners(new Object[]{ hsal0 });
MockHttpSessionListener hsl1 = new MockHttpSessionListener();
MockHttpSessionAttributeListener hsal1 = new MockHttpSessionAttributeListener();
ctx = (Context) mgr1.getContainer();
ctx.setApplicationLifecycleListeners(new Object[]{ hsl1 });
ctx.setApplicationEventListeners(new Object[]{ hsal1 });
// Initial request
SetAttributesRequestHandler setHandler = new SetAttributesRequestHandler(attributes, false);
SessionTestUtil.invokeRequest(mgr0, 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(mgr0, 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);
mgr0.backgroundProcess();
mgr1.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(mgr0, 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(mgr1, 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);
mgr0.backgroundProcess();
mgr1.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(mgr0, 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
DataSourcePersistentManager[] mgrs = getCacheManagers(warname, 2, 1);
DataSourcePersistentManager mgr0 = mgrs[0];
DataSourcePersistentManager mgr1 = mgrs[1];
assertTrue(mgr0.getNotificationPolicy() instanceof MockClusteredSessionNotificationPolicy);
MockClusteredSessionNotificationPolicy mcsnp0 = (MockClusteredSessionNotificationPolicy) mgr0.getNotificationPolicy();
assertNotNull("capability set", mcsnp0.getClusteredSessionNotificationCapability());
mcsnp0.setResponse(notify);
assertTrue(mgr1.getNotificationPolicy() instanceof MockClusteredSessionNotificationPolicy);
MockClusteredSessionNotificationPolicy mcsnp1 = (MockClusteredSessionNotificationPolicy) mgr1.getNotificationPolicy();
assertNotNull("capability set", mcsnp1.getClusteredSessionNotificationCapability());
mcsnp1.setResponse(notify);
MockHttpSessionListener hsl0 = new MockHttpSessionListener();
MockHttpSessionAttributeListener hsal0 = new MockHttpSessionAttributeListener();
Context ctx = (Context) mgr0.getContainer();
ctx.setApplicationLifecycleListeners(new Object[]{ hsl0 });
ctx.setApplicationEventListeners(new Object[]{ hsal0 });
MockHttpSessionListener hsl1 = new MockHttpSessionListener();
MockHttpSessionAttributeListener hsal1 = new MockHttpSessionAttributeListener();
ctx = (Context) mgr1.getContainer();
ctx.setApplicationLifecycleListeners(new Object[]{ hsl1 });
ctx.setApplicationEventListeners(new Object[]{ hsal1 });
// Initial request
SetAttributesRequestHandler setHandler = new SetAttributesRequestHandler(attributes, false);
SessionTestUtil.invokeRequest(mgr0, 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(mgr1, 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);
log.info("passivating mgr0");
mgr0.backgroundProcess();
log.info("passivating mgr1");
mgr1.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);
log.info("expiring mgr0");
mgr0.backgroundProcess();
log.info("expiring mgr1");
mgr1.backgroundProcess();
if (!notify)
{
validateNoNotifications(hsl0, hsal0, hsl1, hsal1);
}
else
{
// BES 2009/07/15 -- following is no longer true, as expiration no longer == db removal
// // With a persistent manager we don't expect invocations from
// // mgr1. When mgr0 invalidates the session, it is gone from the
// // DB, which prevents mgr1 "activating" it to issue notifications.
assertEquals(1, hsl0.invocations.size());
assertEquals(MockHttpSessionListener.Type.DESTROYED, hsl0.invocations.get(0));
// assertEquals(0, hsl1.invocations.size());
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(0, hsal1.invocations.size());
assertEquals(1, hsal1.invocations.size());
assertEquals(MockHttpSessionAttributeListener.Type.REMOVED, hsal1.invocations.get(0));
assertEquals(4, SessionSpecListenerAttribute.invocations.size());
// assertEquals(2, 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
DataSourcePersistentManager[] mgrs = getCacheManagers(warname, 1800, -1);
DataSourcePersistentManager mgr0 = mgrs[0];
DataSourcePersistentManager mgr1 = mgrs[1];
assertTrue(mgr0.getNotificationPolicy() instanceof MockClusteredSessionNotificationPolicy);
MockClusteredSessionNotificationPolicy mcsnp0 = (MockClusteredSessionNotificationPolicy) mgr0.getNotificationPolicy();
assertNotNull("capability set", mcsnp0.getClusteredSessionNotificationCapability());
mcsnp0.setResponse(notify);
assertTrue(mgr1.getNotificationPolicy() instanceof MockClusteredSessionNotificationPolicy);
MockClusteredSessionNotificationPolicy mcsnp1 = (MockClusteredSessionNotificationPolicy) mgr1.getNotificationPolicy();
assertNotNull("capability set", mcsnp1.getClusteredSessionNotificationCapability());
mcsnp1.setResponse(notify);
MockHttpSessionListener hsl0 = new MockHttpSessionListener();
MockHttpSessionAttributeListener hsal0 = new MockHttpSessionAttributeListener();
Context ctx = (Context) mgr0.getContainer();
ctx.setApplicationLifecycleListeners(new Object[]{ hsl0 });
ctx.setApplicationEventListeners(new Object[]{ hsal0 });
MockHttpSessionListener hsl1 = new MockHttpSessionListener();
MockHttpSessionAttributeListener hsal1 = new MockHttpSessionAttributeListener();
ctx = (Context) mgr1.getContainer();
ctx.setApplicationLifecycleListeners(new Object[]{ hsl1 });
ctx.setApplicationEventListeners(new Object[]{ hsal1 });
// Initial request
SetAttributesRequestHandler setHandler = new SetAttributesRequestHandler(attributes, false);
SessionTestUtil.invokeRequest(mgr0, 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);
}
mgr0.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);
}
mgr1.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 DataSourcePersistentManager[] getCacheManagers(String warname, int maxInactive, int maxIdle)
throws Exception
{
DataSourcePersistentManager mgr0 = PersistentSessionTestUtil.createManager(warname, maxInactive, null);
PersistentSessionTestUtil.configureManager(mgr0, getReplicationGranularity(), getReplicationTrigger(), -1, maxIdle > 0, maxIdle, -1 ,false, 0);
mgr0.setSessionNotificationPolicyClass(MockClusteredSessionNotificationPolicy.class.getName());
this.managers.add(mgr0);
mgr0.start();
DataSourcePersistentManager mgr1 = PersistentSessionTestUtil.createManager(warname, maxInactive, null);
PersistentSessionTestUtil.configureManager(mgr1, getReplicationGranularity(), getReplicationTrigger(), -1, true, maxIdle, -1 ,false, 0);
mgr1.setSessionNotificationPolicyClass(MockClusteredSessionNotificationPolicy.class.getName());
this.managers.add(mgr1);
mgr1.start();
return new DataSourcePersistentManager[]{mgr0, mgr1};
}
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());
}
}