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

import junit.framework.TestCase;

/**
 * 期限切れのセッションを削除するためのGC
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.1 $
 */
public class SessionUnbounderTest extends TestCase {

	/**
	 * Constructor for SessionUnbounderTest.
	 * @param arg0
	 */
	public SessionUnbounderTest(String arg0) {
		super(arg0);
	}
	/**
	 * 有効期限切れの全てのセッションが削除されるかどうかをテスト
	 *
	 */
	public void testDestroyAllSessions() throws InterruptedException, IllegalSessionStateException {
		// GC起動間隔は0.25sec, セッションの有効期限は1sec
		SessionManager man = new SessionManager(250, 1000);
		Session[] sessions = new Session[12];
		
		// 適当にセッションを作成する
		for(int i = 0; i < sessions.length; i++) {
			sessions[i] = man.getSession();
		}

		// 2秒待つ
		Thread.sleep(2000);

		// 作成したセッションが全滅しているかどうか判定する
		for(int i = 0; i < sessions.length; i++) {
			assertTrue(null == man.getSession(sessions[i].getSessionId(), false));
			try {
				sessions[i].setAttribute("logical-paradox.org", "あああ");
				fail();
			} catch(IllegalSessionStateException se) {
				// 正常
			}
		}
	}
	/**
	 * 有効期限切れでないいくつかのセッションを除いた全てのセッションが除外されるかどうかのテスト
	 */
	public void testDestroySessionsWithoutSomeOfThem() throws Exception {
		// GC起動間隔は0.1sec, セッションの有効期限は1.5sec
		SessionManager man = new SessionManager(100, 1500);
		Session[] sessions = new Session[12];
		
		// 適当にセッションを作成する
		for(int i = 0; i < sessions.length; i++) {
			sessions[i] = man.getSession();
		}

		// 1秒待つ
		Thread.sleep(1000);

		// 3番目のセッションにタッチ
		sessions[2].touch();
		// 10番目のセッションにタッチ
		sessions[9].touch();

		// 0.7秒待つ
		Thread.sleep(700);

		// 作成したセッションが全滅しているかどうか判定する
		for(int i = 0; i < sessions.length; i++) {
			if(i == 2 || i == 9) {
				// 3番目と10番目は存在するはず
				assertTrue(null != man.getSession(sessions[i].getSessionId(), false));
				sessions[i].setAttribute("logical-paradox.org", "あああ");
			} else {
				// それ以外は全滅しているはず
				assertTrue(null == man.getSession(sessions[i].getSessionId(), false));
				try {
					sessions[i].setAttribute("logical-paradox.org", "あああ");
					fail();
				} catch(IllegalSessionStateException se) {
					// 正常
				}
			}
		}
	}
}
