package rescuecore2.connection; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import org.junit.Before; import org.junit.Test; import rescuecore2.messages.Message; import rescuecore2.registry.Registry; import rescuecore2.registry.MessageFactory; import rescuecore2.misc.Pair; import java.io.IOException; import java.io.OutputStream; import java.io.InputStream; import java.util.Arrays; public abstract class ConnectionTestCommon { private Connection client; private Connection server; private TestConnectionListener clientListener; private TestConnectionListener serverListener; private TestMessageFactory factory; protected Registry registry; protected static final int DELAY = 1000; protected static final int TIMEOUT = 3000; private static final String MESSAGE_ID_1 = "Test message 1"; private static final String MESSAGE_ID_2 = "Test message 2"; private static final String MESSAGE_ID_3 = "Test message 3"; private final static String FACTORY_1_NAME = "Factory 1"; private final static String FACTORY_2_NAME = "Factory 2"; private final static String FACTORY_3_NAME = "Factory 3"; @Before public void setup() throws IOException { registry = new Registry(); registry.registerMessageFactory(new TestMessageFactory(FACTORY_1_NAME, MESSAGE_ID_1)); Pair<Connection, Connection> connections = makeConnectionPair(); client = connections.first(); server = connections.second(); client.setRegistry(registry); server.setRegistry(registry); clientListener = new TestConnectionListener(); serverListener = new TestConnectionListener(); client.addConnectionListener(clientListener); server.addConnectionListener(serverListener); } /** Get two connection objects that represent the two end-points of a communication channel. */ protected abstract Pair<Connection, Connection> makeConnectionPair() throws IOException; @Test public void testNoMessagesReceivedBeforeStartup() throws IOException, InterruptedException, ConnectionException { // Send a message from the client client.startup(); Message m = new TestMessage(MESSAGE_ID_1); client.sendMessage(m); // Wait a bit Thread.sleep(DELAY); assertEquals(0, serverListener.getMessageCount()); // Start the server connection server.startup(); serverListener.waitForMessages(1, TIMEOUT); assertEquals(1, serverListener.getMessageCount()); } @Test public void testNoMessagesAfterShutdown() throws IOException, InterruptedException, ConnectionException { // Send a message from the client client.startup(); server.startup(); Message m = new TestMessage(MESSAGE_ID_1); client.sendMessage(m); // Wait for a message serverListener.waitForMessages(1, TIMEOUT); assertEquals(1, serverListener.getMessageCount()); // Shutdown the server connection server.shutdown(); // Send another message and check that it didn't arrive try { client.sendMessage(m); } catch (ConnectionException e) { // Could reasonably expect a ConnectionException right now: the server is gone so the client might have shut itself down } Thread.sleep(DELAY); assertEquals(1, serverListener.getMessageCount()); } @Test public void testIsAlive() throws InterruptedException { assertFalse(client.isAlive()); client.startup(); assertTrue(client.isAlive()); client.shutdown(); assertFalse(client.isAlive()); } @Test public void testRemoveConnectionListener() throws IOException, InterruptedException, ConnectionException { client.startup(); server.startup(); // Send a message from the client Message m = new TestMessage(MESSAGE_ID_1); client.sendMessage(m); // Wait for a message serverListener.waitForMessages(1, TIMEOUT); assertEquals(1, serverListener.getMessageCount()); // Remove the listener server.removeConnectionListener(serverListener); // Send another message client.sendMessage(m); // Wait a bit Thread.sleep(DELAY); // Check that the new message didn't arrive assertEquals(1, serverListener.getMessageCount()); } @Test public void testMultipleStartup() throws IOException, InterruptedException, ConnectionException { client.startup(); client.startup(); server.startup(); // Send a message from the client Message m = new TestMessage(MESSAGE_ID_1); client.sendMessage(m); // Wait for a message serverListener.waitForMessages(1, TIMEOUT); assertEquals(1, serverListener.getMessageCount()); client.startup(); client.sendMessage(m); // Wait for a message serverListener.waitForMessages(2, TIMEOUT); assertEquals(2, serverListener.getMessageCount()); } @Test public void testMultipleShutdown() throws IOException, InterruptedException, ConnectionException { client.startup(); server.startup(); // Send a message from the client Message m = new TestMessage(MESSAGE_ID_1); client.sendMessage(m); // Wait for a message serverListener.waitForMessages(1, TIMEOUT); assertEquals(1, serverListener.getMessageCount()); server.shutdown(); // Send another message try { client.sendMessage(m); } catch (ConnectionException e) { // Could reasonably expect a ConnectionException right now: the server is gone so the client might have shut itself down. } // Wait a bit Thread.sleep(DELAY); // Check that the new message didn't arrive assertEquals(1, serverListener.getMessageCount()); server.shutdown(); // Send another message try { client.sendMessage(m); } catch (ConnectionException e) { // Could reasonably expect a ConnectionException right now: the server is gone so the client might have shut itself down. } // Wait a bit Thread.sleep(DELAY); // Check that the new message didn't arrive assertEquals(1, serverListener.getMessageCount()); } @Test public void testSendMessage() throws IOException, InterruptedException, ConnectionException { client.startup(); server.startup(); Message m = new TestMessage(MESSAGE_ID_1); client.sendMessage(m); serverListener.waitForMessages(1, TIMEOUT); assertEquals(1, serverListener.getMessageCount()); assertEquals(m, serverListener.getMessage(0)); } @Test public void testSendMessages() throws InterruptedException, ConnectionException{ client.startup(); server.startup(); Message m1 = new TestMessage(MESSAGE_ID_1, "", 3); Message m2 = new TestMessage(MESSAGE_ID_1, "", 4, 5); client.sendMessages(Arrays.asList(m1, m2)); serverListener.waitForMessages(2, TIMEOUT); assertEquals(2, serverListener.getMessageCount()); assertEquals(m1, serverListener.getMessage(0)); assertEquals(m2, serverListener.getMessage(1)); } @Test(expected=IllegalArgumentException.class) public void testSendNullMessage() throws InterruptedException, ConnectionException { client.startup(); server.startup(); client.sendMessage(null); } @Test(expected=IllegalArgumentException.class) public void testSendNullMessages() throws InterruptedException, ConnectionException { client.startup(); server.startup(); client.sendMessages(null); } @Test(expected=rescuecore2.connection.ConnectionException.class) public void testSendMessageBeforeStartup() throws IOException, InterruptedException, ConnectionException { server.startup(); Message m = new TestMessage(MESSAGE_ID_1); client.sendMessage(m); } @Test(expected=rescuecore2.connection.ConnectionException.class) public void testSendMessageAfterShutdown() throws IOException, InterruptedException, ConnectionException { server.startup(); client.startup(); Message m = new TestMessage(MESSAGE_ID_1); client.sendMessage(m); serverListener.waitForMessages(1, TIMEOUT); assertEquals(1, serverListener.getMessageCount()); client.shutdown(); client.sendMessage(m); } @Test public void testRegisterNewMessageFactory() throws IOException, InterruptedException, ConnectionException { client.startup(); server.startup(); Message m1 = new TestMessage(MESSAGE_ID_1); client.sendMessage(m1); serverListener.waitForMessages(1, TIMEOUT); assertEquals(1, serverListener.getMessageCount()); assertEquals(m1, serverListener.getMessage(0)); assertEquals(FACTORY_1_NAME, ((TestMessage)serverListener.getMessage(0)).getDescription()); registry.registerMessageFactory(new TestMessageFactory(FACTORY_2_NAME, MESSAGE_ID_2)); Message m2 = new TestMessage(MESSAGE_ID_2); client.sendMessage(m2); // Check that the second message was interpreted by the new message factory and that the old message is still OK. serverListener.waitForMessages(2, TIMEOUT); assertEquals(2, serverListener.getMessageCount()); assertEquals(MESSAGE_ID_1, serverListener.getMessage(0).getURN()); assertEquals(MESSAGE_ID_2, serverListener.getMessage(1).getURN()); assertEquals(FACTORY_1_NAME, ((TestMessage)serverListener.getMessage(0)).getDescription()); assertEquals(FACTORY_2_NAME, ((TestMessage)serverListener.getMessage(1)).getDescription()); // Try registering a new message factory that replaces the first one registry.registerMessageFactory(new TestMessageFactory(FACTORY_3_NAME, MESSAGE_ID_1)); Message m3 = new TestMessage(MESSAGE_ID_1); client.sendMessage(m3); // Check that the third message was interpreted by the new message factory and that the old messages are still OK. serverListener.waitForMessages(3, TIMEOUT); assertEquals(3, serverListener.getMessageCount()); assertEquals(MESSAGE_ID_1, serverListener.getMessage(0).getURN()); assertEquals(MESSAGE_ID_2, serverListener.getMessage(1).getURN()); assertEquals(MESSAGE_ID_1, serverListener.getMessage(2).getURN()); assertEquals(FACTORY_1_NAME, ((TestMessage)serverListener.getMessage(0)).getDescription()); assertEquals(FACTORY_2_NAME, ((TestMessage)serverListener.getMessage(1)).getDescription()); assertEquals(FACTORY_3_NAME, ((TestMessage)serverListener.getMessage(2)).getDescription()); } }