/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: SessionTest.java,v 1.1 2005/02/28 13:26:25 rampil Exp $
 */
package org.logical_paradox.common.session;

import junit.framework.TestCase;

/**
 * セッションのテストコード
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.1 $
 */
public class SessionTest extends TestCase {

	/**
	 * Constructor for SessionTest.
	 * @param arg0
	 */
	public SessionTest(String arg0) {
		super(arg0);
	}
	/**
	 * セッションが除去される際に登録しているリスナーが呼ばれるかどうかの試験
	 */
	public void testSessionUnbound() throws IllegalSessionStateException {
		Session session = new Session("session-id");
		SessionBindingListenerImpl listener = new SessionBindingListenerImpl();
		session.setSessionBindingListener(listener);

		assertEquals(false, listener.isDoSomething());
		// セッション除去
		session.unbound();

		assertEquals(true, listener.isDoSomething());
	}
	/**
	 * イベントが発生しない状態でセッションが除去されるかどうか
	 */
	public void testSessionUnboundWithoutEvent() throws IllegalSessionStateException {
		Session session = new Session("session-id");
		SessionBindingListenerImpl listener = new SessionBindingListenerImpl();
		session.setSessionBindingListener(listener);

		assertEquals(false, listener.isDoSomething());
		// リスナーを削除
		session.removeSessionBindingListener();

		// セッション除去
		session.unbound();

		// 登録したリスナーは削除されているので，イベントハンドラは呼ばれない
		assertEquals(false, listener.isDoSomething());
	}
	/**
	 * セッションタイムアウトのテスト
	 */
	public void testSessionTimeout() throws InterruptedException, IllegalSessionStateException {
		Session session = new Session("sid", 1000);
		// 5ms待つ
		Thread.sleep(5);
		assertEquals(true, session.isActive());
		// 1000ms待つ
		Thread.sleep(1000);
		assertEquals(false, session.isActive());

		// touchする
		session.setAttribute("something", "something");
		assertEquals(true, session.isActive());
	}
	class SessionBindingListenerImpl implements SessionBindingListener {
		private boolean doSomething = false;
		public void onUnBound() {
			doSomething = true;
		}
		public boolean isDoSomething() {
			return doSomething;
		}
	}
}
