package org.jacorb.test.orb.factory;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
import javax.net.ssl.SSLSocket;
import junit.framework.TestCase;
import org.jacorb.config.Configurable;
import org.jacorb.orb.factory.SocketFactory;
import org.junit.Before;
import org.junit.Test;
import org.omg.CORBA.TIMEOUT;
/**
* @author Alphonse Bendt
*/
public abstract class AbstractSocketFactoryTestCase extends TestCase
{
protected final byte[] sent = new byte[] {'a', 'b', 'c', 'd'};
protected final byte[] received = new byte[sent.length];
protected ServerSocket serverSocket;
protected SocketFactory objectUnderTest;
private Thread thread;
protected String hostname;
protected int serverPort;
private boolean socketClosed;
private Exception socketException;
@Override
@Before
public void setUp() throws Exception
{
objectUnderTest = newObjectUnderTest();
if (objectUnderTest instanceof Configurable)
{
configureObjectUnderTest(getName(), (Configurable)objectUnderTest);
}
serverSocket = new ServerSocket();
serverSocket.bind(null);
assertFalse(serverSocket.isClosed());
assertTrue(serverSocket.isBound());
thread = new Thread()
{
@Override
public void run()
{
try
{
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
int x;
int pos = 0;
while( (x = in.read()) != -1)
{
received[pos++] = (byte) x;
}
if ( ! (socket instanceof SSLSocket) && ! socket.isClosed ())
{
socket.shutdownOutput ();
}
socket.close ();
}
catch (Exception e)
{
if (!socketClosed)
{
socketException = e;
}
}
}
};
thread.start();
InetAddress address = serverSocket.getInetAddress();
hostname = address.getHostName();
serverPort = serverSocket.getLocalPort();
}
protected void configureObjectUnderTest(String name, Configurable configurable) throws Exception
{
}
protected abstract SocketFactory newObjectUnderTest() throws Exception;
@Override
protected final void tearDown() throws Exception
{
Thread.sleep(2000);
try
{
assertNull(socketException);
}
finally
{
socketClosed = true;
serverSocket.close();
thread.interrupt();
}
}
protected void checkSocketIsConnected(Socket socket) throws IOException, InterruptedException
{
OutputStream outputStream = socket.getOutputStream();
outputStream.write(sent);
outputStream.flush();
outputStream.close();
Thread.sleep(1000);
assertTrue(new String(sent) + " != " + new String(received), Arrays.equals(sent, received));
}
@Test
public void testConnect() throws Exception
{
Socket socket = objectUnderTest.createSocket(hostname, serverPort);
checkSocketIsConnected(socket);
}
@Test
public void testConnectWithTimeout() throws Exception
{
Socket socket = objectUnderTest.createSocket(hostname, serverPort, 100);
checkSocketIsConnected(socket);
}
@Test
public void testConnectToNonExistentPortWithTimeout() throws Exception
{
try
{
// NOTE we expect the connection to the specified host
// to timeout! if this is not the case the test will
// fail and another host/port combination must be used.
objectUnderTest.createSocket("10.1.0.222", 45000, 1);
}
catch (TIMEOUT e)
{
// expected
}
catch (ConnectException e)
{
// if a firewall has blocked it, ignore this test.
}
}
}