// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the CPL Common Public License version 1.0.
package fitnesse.socketservice;
import static fitnesse.socketservice.SocketServer.StreamUtility.GetBufferedReader;
import static fitnesse.socketservice.SocketServer.StreamUtility.GetPrintStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import junit.framework.TestCase;
public class SocketServiceTest extends TestCase {
private int connections = 0;
private SocketServer connectionCounter;
private SocketService ss;
private final static int portNumber = 1999;
public SocketServiceTest() {
connectionCounter = new SocketServer() {
public void serve(Socket s) {
connections++;
}
};
}
public void setUp() throws Exception {
connections = 0;
}
public void tearDown() throws Exception {
}
public void testNoConnections() throws Exception {
ss = new SocketService(portNumber, connectionCounter);
ss.close();
assertEquals(0, connections);
}
public void testOneConnection() throws Exception {
ss = new SocketService(portNumber, connectionCounter);
connect(portNumber);
ss.close();
assertEquals(1, connections);
}
public void testManyConnections() throws Exception {
ss = new SocketService(portNumber, connectionCounter);
for (int i = 0; i < 10; i++)
connect(portNumber);
ss.close();
assertEquals(10, connections);
}
public void testSendMessage() throws Exception {
ss = new SocketService(portNumber, new HelloService());
Socket s = new Socket("localhost", portNumber);
BufferedReader br = GetBufferedReader(s);
String answer = br.readLine();
s.close();
ss.close();
assertEquals("Hello", answer);
}
public void testReceiveMessage() throws Exception {
ss = new SocketService(portNumber, new EchoService());
Socket s = new Socket("localhost", portNumber);
BufferedReader br = GetBufferedReader(s);
PrintStream ps = GetPrintStream(s);
ps.println("MyMessage");
String answer = br.readLine();
s.close();
ss.close();
assertEquals("MyMessage", answer);
}
public void testMultiThreaded() throws Exception {
ss = new SocketService(portNumber, new EchoService());
Socket s = new Socket("localhost", portNumber);
BufferedReader br = GetBufferedReader(s);
PrintStream ps = GetPrintStream(s);
Socket s2 = new Socket("localhost", portNumber);
BufferedReader br2 = GetBufferedReader(s2);
PrintStream ps2 = GetPrintStream(s2);
ps2.println("MyMessage2");
String answer2 = br2.readLine();
s2.close();
ps.println("MyMessage1");
String answer = br.readLine();
s.close();
ss.close();
assertEquals("MyMessage2", answer2);
assertEquals("MyMessage1", answer);
}
private void connect(int port) {
try {
Socket s = new Socket("localhost", port);
sleep(30);
s.close();
}
catch (IOException e) {
fail("could not connect");
}
}
private void sleep(int ms) {
try {
Thread.sleep(ms);
}
catch (InterruptedException e) {
}
}
}
class HelloService implements SocketServer {
public void serve(Socket s) {
try {
PrintStream ps = GetPrintStream(s);
ps.println("Hello");
}
catch (IOException e) {
}
}
}
class EchoService implements SocketServer {
public void serve(Socket s) {
try {
PrintStream ps = GetPrintStream(s);
BufferedReader br = GetBufferedReader(s);
String token = br.readLine();
ps.println(token);
}
catch (IOException e) {
}
}
}