/*
 * Copyright 1999,2005 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.apache.catalina.cluster.session;

import junit.framework.TestCase;

import org.apache.catalina.Manager;

/**
 * @author Peter Rossbach
 * 
 * @version $Revision$ $Date$
 */
public class DeltaSessionTest extends TestCase {

    public void testPrimarySessionisValid() {
        DeltaManager manager = new DeltaManager() { public DeltaSession getNewDeltaSession() { return new MockSession(this) ; } } ;
        manager.setMaxInactiveInterval(1);
        MockSession session = (MockSession)manager.createSession("hello",false);
        assertTrue(session.isPrimarySession());
        assertTrue(session.isValid()) ;
        assertEquals(1,session.getMaxInactiveInterval());
        try {
            Thread.sleep(2000);
        } catch (Exception sleep) {
        }
        long timeNow = System.currentTimeMillis();
        int timeIdle = (int) ((timeNow - session.getLastAccessedTimeInternal()) / 1000L);
        assertEquals(2,timeIdle);
        assertTrue(timeIdle > session.getMaxInactiveInterval());
        assertFalse(session.isValid()) ;
        assertEquals(1,session.expireNotifyCalled);
        assertEquals(1,session.expireNotifyClusterCalled);
    }
 
    public void testBackupSessionisValid() {
        DeltaManager manager = new DeltaManager() { public DeltaSession getNewDeltaSession() { return new MockSession(this) ; } } ;
        manager.setMaxInactiveInterval(1);
        MockSession session = (MockSession)manager.createSession("hello",false);
        session.setPrimarySession(false);
        try {
            Thread.sleep(1000);
        } catch (Exception sleep) {
        }
        assertTrue(session.isValid()) ;
        assertEquals(0,session.expireNotifyCalled);
        assertEquals(0,session.expireNotifyClusterCalled);
        try {
            Thread.sleep(2000);
        } catch (Exception sleep) {
        }
        assertFalse(session.isValid()) ;
        assertEquals(1,session.expireNotifyCalled);
        // no cluster notification
        assertEquals(0,session.expireNotifyClusterCalled);
    }
    
    class MockSession extends DeltaSession {

        long expireCalled = 0 ;
        long expireNotifyCalled = 0 ;
        long expireNotifyClusterCalled = 0 ;
        
        
        /**
         * @param manager
         */
        public MockSession(Manager manager) {
            super(manager);
        }
      
        /* (non-Javadoc)
         * @see org.apache.catalina.cluster.session.DeltaSession#expire(boolean, boolean)
         */
        public void expire(boolean notify, boolean notifyCluster) {
            expireCalled++ ;
            if(notify)
                expireNotifyCalled++ ;
            if(notifyCluster)
                expireNotifyClusterCalled++ ;
            isValid = false ;
        }
    }
}
