package org.marketcetera.util.ws.stateful; import java.util.Locale; import org.apache.log4j.Level; import org.junit.Before; import org.junit.Test; import org.marketcetera.util.log.ActiveLocale; import org.marketcetera.util.test.TestCaseBase; import org.marketcetera.util.ws.stateless.StatelessClientContext; import org.marketcetera.util.ws.tags.NodeId; import org.marketcetera.util.ws.tags.SessionId; import static org.junit.Assert.*; /** * @author tlerios@marketcetera.com * @since 1.0.0 * @version $Id: SessionManagerTest.java 16154 2012-07-14 16:34:05Z colin $ */ /* $License$ */ public class SessionManagerTest extends TestCaseBase { private static final long TEST_LIFESPAN= 500; private static final NodeId TEST_SERVER_ID= NodeId.generate(); private static final SessionId TEST_SESSION_ID= SessionId.generate(); private static final SessionId TEST_SESSION_ID_D= SessionId.generate(); private static final String TEST_USER= "metc"; private static final StatelessClientContext TEST_CONTEXT= new StatelessClientContext(); private static final Integer TEST_SESSION= new Integer(1); private static final Integer TEST_SESSION_D= new Integer(2); private static final String TEST_CATEGORY= SessionManager.Reaper.class.getName(); private static class TestFactory implements SessionFactory<Integer> { private SessionId mLastSessionId; private Integer mLastRemovedSession; public void setLastSessionId (SessionId lastSessionId) { mLastSessionId=lastSessionId; } public SessionId getLastSessionId() { return mLastSessionId; } public void setLastRemovedSession (Integer lastRemovedSession) { mLastRemovedSession=lastRemovedSession; } public Object getLastRemovedSession() { return mLastRemovedSession; } @Override public Integer createSession (StatelessClientContext context, String user, SessionId id) { assertEquals(TEST_CONTEXT,context); assertEquals(TEST_USER,user); setLastSessionId(id); if (id==TEST_SESSION_ID) { return TEST_SESSION; } return TEST_SESSION_D; } @Override public void removedSession(Integer session) { setLastRemovedSession(session); } } @Before public void setupSessionManagerTest() { ActiveLocale.setProcessLocale(Locale.ROOT); setLevel(TEST_CATEGORY,Level.INFO); } @Test public void basics() throws Exception { TestFactory f=new TestFactory(); SessionManager<Integer> s=new SessionManager<Integer>(f); assertSame(f,s.getSessionFactory()); assertEquals(SessionManager.INFINITE_SESSION_LIFESPAN,s.getLifespan()); assertNull(s.getServerId()); s.setServerId(TEST_SERVER_ID); assertEquals(TEST_SERVER_ID,s.getServerId()); s.setServerId(null); assertNull(s.getServerId()); assertNull(s.get(TEST_SESSION_ID)); SessionHolder<Integer> hD= new SessionHolder<Integer>(TEST_USER,TEST_CONTEXT); long time=hD.getLastAccess(); Thread.sleep(100); s.put(TEST_SESSION_ID,hD); assertTrue(hD.getLastAccess()>time); assertEquals(TEST_SESSION_ID,f.getLastSessionId()); time=hD.getLastAccess(); Thread.sleep(100); assertSame(hD,s.get(TEST_SESSION_ID)); assertTrue(hD.getLastAccess()>time); SessionHolder<Integer> h= new SessionHolder<Integer>(TEST_USER,TEST_CONTEXT); s.put(TEST_SESSION_ID,h); assertSame(h,s.get(TEST_SESSION_ID)); assertNull(s.get(TEST_SESSION_ID_D)); s.put(TEST_SESSION_ID_D,hD); assertSame(hD,s.get(TEST_SESSION_ID_D)); assertSame(h,s.get(TEST_SESSION_ID)); assertEquals(TEST_SESSION_ID_D,f.getLastSessionId()); s.remove(TEST_SESSION_ID); assertNull(s.get(TEST_SESSION_ID)); assertSame(hD,s.get(TEST_SESSION_ID_D)); assertEquals(TEST_SESSION,f.getLastRemovedSession()); // Removal of nonexistent session ID. s.remove(TEST_SESSION_ID); } @Test public void basicsNoFactory() throws Exception { SessionManager<Integer> s=new SessionManager<Integer>(); assertEquals(SessionManager.INFINITE_SESSION_LIFESPAN,s.getLifespan()); SessionHolder<Integer> h= new SessionHolder<Integer>(TEST_USER,TEST_CONTEXT); s.put(TEST_SESSION_ID,h); assertSame(h,s.get(TEST_SESSION_ID)); s.remove(TEST_SESSION_ID); assertNull(s.get(TEST_SESSION_ID)); // Removal of nonexistent session ID. s.remove(TEST_SESSION_ID); } @Test public void timeout() throws Exception { TestFactory f=new TestFactory(); SessionManager<Integer> s=new SessionManager<Integer>(f,TEST_LIFESPAN); assertEquals(TEST_LIFESPAN,s.getLifespan()); SessionHolder<Integer> h= new SessionHolder<Integer>(TEST_USER,TEST_CONTEXT); s.put(TEST_SESSION_ID,h); assertSame(h,s.get(TEST_SESSION_ID)); assertEquals(TEST_SESSION_ID,f.getLastSessionId()); for (int i=0;i<10;i++) { Thread.sleep(TEST_LIFESPAN/2); assertSame(h,s.get(TEST_SESSION_ID)); } Thread.sleep(TEST_LIFESPAN*2); assertSingleEvent (Level.INFO,TEST_CATEGORY, "Session "+TEST_SESSION_ID.toString()+ " has expired; creation context: "+TEST_CONTEXT.toString(), TEST_CATEGORY); assertNull(s.get(TEST_SESSION_ID)); assertEquals(TEST_SESSION,f.getLastRemovedSession()); } @Test public void timeoutNoFactory() throws Exception { SessionManager<Integer> s=new SessionManager<Integer>(TEST_LIFESPAN); assertEquals(TEST_LIFESPAN,s.getLifespan()); SessionHolder<Integer> h= new SessionHolder<Integer>(TEST_USER,TEST_CONTEXT); s.put(TEST_SESSION_ID,h); assertSame(h,s.get(TEST_SESSION_ID)); for (int i=0;i<10;i++) { Thread.sleep(TEST_LIFESPAN/2); assertSame(h,s.get(TEST_SESSION_ID)); } Thread.sleep(TEST_LIFESPAN*2); assertSingleEvent (Level.INFO,TEST_CATEGORY, "Session "+TEST_SESSION_ID.toString()+ " has expired; creation context: "+TEST_CONTEXT.toString(), TEST_CATEGORY); assertNull(s.get(TEST_SESSION_ID)); } @Test public void termination() throws Exception { ThreadGroup group=new ThreadGroup("group"); Thread t=new Thread(group,"testThread") { @Override public void run() { (new SessionManager<Integer>(TEST_LIFESPAN)).setServerId (TEST_SERVER_ID); } }; t.start(); Thread.sleep(TEST_LIFESPAN); assertEquals(1,group.activeCount()); group.interrupt(); Thread.sleep(TEST_LIFESPAN*2); assertEquals(0,group.activeCount()); assertSingleEvent (Level.INFO,TEST_CATEGORY, "Reaper for server "+TEST_SERVER_ID.toString()+" was terminated", TEST_CATEGORY); } }