package org.productivity.java.syslog4j.test.net;

import java.net.SocketAddress;

import junit.framework.TestCase;

import org.productivity.java.syslog4j.Syslog;
import org.productivity.java.syslog4j.SyslogIF;
import org.productivity.java.syslog4j.impl.net.tcp.TCPNetSyslogConfig;
import org.productivity.java.syslog4j.impl.net.tcp.TCPNetSyslogConfigIF;
import org.productivity.java.syslog4j.server.SyslogServer;
import org.productivity.java.syslog4j.server.SyslogServerEventIF;
import org.productivity.java.syslog4j.server.SyslogServerIF;
import org.productivity.java.syslog4j.server.SyslogServerSessionlessEventHandlerIF;
import org.productivity.java.syslog4j.server.impl.net.tcp.TCPNetSyslogServerConfig;
import org.productivity.java.syslog4j.server.impl.net.tcp.TCPNetSyslogServerConfigIF;
import org.productivity.java.syslog4j.util.SyslogUtility;

public class MaxActiveSocketsTest extends TestCase {
	public class Counter implements SyslogServerSessionlessEventHandlerIF {
		private static final long serialVersionUID = 3262828090646744251L;
		
		public int counter = 0;

		public void initialize(SyslogServerIF syslogServer) {
			//			
		}

		public void event(SyslogServerIF syslogServer, SocketAddress socketAddress, SyslogServerEventIF event) {
			counter++;
		}

		public void exception(SyslogServerIF syslogServer, SocketAddress socketAddress, Exception exception) {
			//
		}
		
		public void destroy(SyslogServerIF syslogServer) {
			//			
		}
	}
	
	protected int _testMaxActiveSockets(TCPNetSyslogServerConfigIF serverConfig) {
		Counter c = new Counter();
		
		serverConfig.setMaxActiveSockets(2);
		serverConfig.addEventHandler(c);
		
		SyslogServer.createThreadedInstance("tcp_maxactivesockets",serverConfig);
		
		TCPNetSyslogConfigIF config = new TCPNetSyslogConfig();
		config.setPort(8888);
			
		SyslogIF syslog1 = Syslog.createInstance("tcp_maxactivesockets1",config);
		syslog1.info("test1");
		syslog1.flush();
		SyslogUtility.sleep(200);
		
		SyslogIF syslog2 = Syslog.createInstance("tcp_maxactivesockets2",config);
		syslog2.info("test2");
		syslog2.flush();
		SyslogUtility.sleep(200);
		
		SyslogIF syslog3 = Syslog.createInstance("tcp_maxactivesockets3",config);
		syslog3.info("test3");
		syslog3.flush();
		SyslogUtility.sleep(200);

		syslog1.shutdown();
		SyslogUtility.sleep(200);

		Syslog.destroyInstance("tcp_maxactivesockets1");
		Syslog.destroyInstance("tcp_maxactivesockets2");
		Syslog.destroyInstance("tcp_maxactivesockets3");
		
		SyslogServer.destroyInstance("tcp_maxactivesockets");
		
		return c.counter;
	}

	public void testMaxActiveSocketsWithBlock() {
		TCPNetSyslogServerConfigIF serverConfig = new TCPNetSyslogServerConfig(8888);
		serverConfig.setMaxActiveSocketsBehavior(TCPNetSyslogServerConfigIF.MAX_ACTIVE_SOCKETS_BEHAVIOR_BLOCK);
		int count = _testMaxActiveSockets(serverConfig);
		
		assertEquals(3,count);
	}

	public void testMaxActiveSocketsWithReject() {
		TCPNetSyslogServerConfigIF serverConfig = new TCPNetSyslogServerConfig(8888);
		serverConfig.setMaxActiveSocketsBehavior(TCPNetSyslogServerConfigIF.MAX_ACTIVE_SOCKETS_BEHAVIOR_REJECT);
		int count = _testMaxActiveSockets(serverConfig);		

		assertEquals(2,count);
	}
}