view test/sematest/TestSessionManager.java @ 440:c50cee354f62

merge conflict
author one
date Sat, 11 Sep 2010 18:01:04 +0900
parents 146d91b61b36
children 7f0d4e49eaf9
line wrap: on
line source

package test.sematest;

import java.io.IOException;

import rep.SessionManager;
import rep.channel.REPLogger;
import rep.channel.REPServerSocketChannel;
import rep.gui.SessionManagerEvent;
import rep.gui.SessionManagerGUI;


public class TestSessionManager {
	
	static public REPLogger logger = REPLogger.singleton();
	public int masterPort = 8766;
	public String host = "localhost";
	public SessionManager sessionManagers[];
	public SessionManager slaveSessionManagers[];
	public TestEditor editors[];
	public Runnable finishTest;

	/*
	 * All test is performed in localhost, so all session manager
	 * should have different port number each other.
	 */
	
	/*
	 * Test Pattern List
	 *    Connect port for each editor
	 *    Master/client flag for each editor
	 *    Editor or slave session manager must be started by
	 *      master session managers using syncExec.
	 */
	public int editorPort[] = {masterPort,masterPort,masterPort};
	public boolean editorMaster[] = {true,false,false,false};
	private SessionManagerEvent ev1[] = {
			new SessionManagerEvent() {
				// executed before first select();
				public void exec(SessionManager manager) {	
					for(TestEditor editor:editors) {
						editor.start();
					}
					int i = sessionManagers.length;
					for(SessionManager slave:slaveSessionManagers) {
						i = startSessionManager(slave,i,masterPort + i);
					}
					new Thread(finishTest).start();
				}
			}};
	
	/*
	 * Create all editors, master session managers and slave session 
	 * managers with specified port. All instances are not started yet.
	 */
	
	public TestSessionManager(int sm, int ss, int e) {
		sessionManagers = new SessionManager[sm];
		slaveSessionManagers = new SessionManager[ss];
		editors = new TestEditor[e];
		for(int i=0;i<sm;i++) {
			sessionManagers[i] = new SessionManager(); 	
		}
		for(int i=0;i<ss;i++) {
			slaveSessionManagers[i] = new SessionManager(); 
		}
		for(int i=0;i<e;i++) {
			int port = editorPort[i%editorPort.length];
			boolean master = editorMaster[i%editorMaster.length];
			// TestEditor extends Thread
			editors[i] = new TestEditor("Editor",host,port,master);
		}
	}

	/*
	 * start session manager. sm.init(port,gui) is a mainloop, so
	 * we need Thread here. 
	 */
	public int startSessionManager(final SessionManager sm,int i,int port) {
		final SessionManagerGUI gui = new TestGUI(sm);
		final int port1 = port;
		logger.writeLog("TestSessionManager.startSessionManager() : start SessionManager");
		// syncExec does not wake selector, do this before run().
		sm.setReceivePort(port1);
		setSMEvent(sm,i);
		Runnable start = new Runnable() {
			public void run() {		
				try {
					sm.init(port1,gui);
				} catch (IOException e) {
				} catch (InterruptedException e) {
				}
			}
		};
		new Thread(start).start();
		return i+1;
	}


	public void setSMEvent(SessionManager s,int i) {
		if (i<ev1.length) {
			s.syncExec(ev1[i]);
		}
		return ;
	}

	protected void startTest() {
		int i = 0;
		for(SessionManager master:sessionManagers) {
			i = startSessionManager(master,i, masterPort + i);
		}
	}

	public void finishTest() {
		for(TestEditor editor:editors) {
			try {
				editor.join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		for(SessionManager slave:slaveSessionManagers) {
			slave.serverStop();
		}
		for(SessionManager master:sessionManagers) {
			master.serverStop();
		}
	}
	
	public static void main(String[] args){
		/*
		 * set simulation mode
		 *    isSimulation=true     thread base simulation for PathFinder
		 *    isSimulation=false    socket based communication mode
		 */
		REPServerSocketChannel.isSimulation = true;
		// At least 3 TestEditors are required.
		final TestSessionManager test = new TestSessionManager(1, 0, 3);
		logger.setLogLevel(5);

		test.finishTest = new Runnable() {
			public void run() {		
				test.finishTest();
			}
		};
		test.startTest();
	}


}