/* Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved See License.txt in the project root for license information. */ package microsoft.aspnet.signalr.client.tests.mocktransport; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.UUID; import microsoft.aspnet.signalr.client.Action; import microsoft.aspnet.signalr.client.ConnectionState; import microsoft.aspnet.signalr.client.MessageReceivedHandler; import microsoft.aspnet.signalr.client.NullLogger; import microsoft.aspnet.signalr.client.Connection; import microsoft.aspnet.signalr.client.SignalRFuture; import microsoft.aspnet.signalr.client.tests.util.MockClientTransport; import microsoft.aspnet.signalr.client.tests.util.MultiResult; import microsoft.aspnet.signalr.client.tests.util.Utils; import microsoft.aspnet.signalr.client.transport.NegotiationResponse; import org.junit.Test; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; public class ConnectionTests { private static final String SERVER_URL = "http://myUrl.com/signalr/"; private static final String CONNECTION_QUERYSTRING = "myVal=1"; @Test public void testStart() throws Exception { Connection connection = new Connection(SERVER_URL, CONNECTION_QUERYSTRING, new NullLogger()); MockClientTransport transport = new MockClientTransport(); SignalRFuture<Void> startFuture = connection.start(transport); transport.negotiationFuture.setResult(Utils.getDefaultNegotiationResponse()); assertEquals(ConnectionState.Connecting, connection.getState()); transport.startOperation.future.setResult(null); assertEquals(ConnectionState.Connected, connection.getState()); assertTrue(startFuture.isDone()); } @Test public void testMessageReceived() throws Exception { Connection connection = new Connection(SERVER_URL, CONNECTION_QUERYSTRING, new NullLogger()); final MultiResult result = new MultiResult(); Utils.addResultHandlersToConnection(connection, result, true); MockClientTransport transport = new MockClientTransport(); connection.start(transport); transport.negotiationFuture.setResult(Utils.getDefaultNegotiationResponse()); transport.startOperation.future.setResult(null); connection.received(new MessageReceivedHandler() { @Override public void onMessageReceived(JsonElement json) { result.listResult.add(json); } }); JsonObject initMessage = new JsonObject(); initMessage.addProperty("S", "1"); transport.startOperation.callback.onData(initMessage.toString()); JsonObject message1 = new JsonObject(); message1.addProperty("I", "Hello World"); transport.startOperation.callback.onData(message1.toString()); JsonObject responseJson = new JsonObject(); String groupsToken = UUID.randomUUID().toString(); responseJson.addProperty("G", groupsToken); transport.startOperation.callback.onData(responseJson.toString()); responseJson = new JsonObject(); String messageId = "10"; responseJson.addProperty("C", messageId); JsonArray messages = new JsonArray(); JsonObject message2 = new JsonObject(); message2.addProperty("name", "my dummy message"); messages.add(message2); responseJson.add("M", messages); transport.startOperation.callback.onData(responseJson.toString()); assertEquals(message1.toString(), result.listResult.get(0).toString()); assertEquals(groupsToken, connection.getGroupsToken()); assertEquals(messageId, connection.getMessageId()); assertEquals(message2.toString(), result.listResult.get(1).toString()); } @Test public void testDisconnectReceived() throws Exception { Connection connection = new Connection(SERVER_URL, CONNECTION_QUERYSTRING, new NullLogger()); MockClientTransport transport = new MockClientTransport(); connection.start(transport); transport.negotiationFuture.setResult(Utils.getDefaultNegotiationResponse()); transport.startOperation.future.setResult(null); transport.startOperation.callback.onData("{\"S\":1}"); assertEquals(ConnectionState.Connected, connection.getState()); JsonObject disconnectMessage = new JsonObject(); disconnectMessage.addProperty("D", 1); transport.startOperation.callback.onData(disconnectMessage.toString()); assertEquals(ConnectionState.Disconnected, connection.getState()); } @Test public void testReconnectReceived() throws Exception { Connection connection = new Connection(SERVER_URL, CONNECTION_QUERYSTRING, new NullLogger()); MockClientTransport transport = new MockClientTransport(); final MultiResult result = new MultiResult(); Utils.addResultHandlersToConnection(connection, result, true); connection.start(transport); transport.negotiationFuture.setResult(Utils.getDefaultNegotiationResponse()); transport.startOperation.future.setResult(null); transport.startOperation.callback.onData("{\"S\":1}"); JsonObject reconnectMessage = new JsonObject(); reconnectMessage.addProperty("T", 1); transport.startOperation.callback.onData(reconnectMessage.toString()); transport.startOperation.future.setResult(null); assertEquals(ConnectionState.Connected, result.statesResult.get(0)); assertEquals(ConnectionState.Reconnecting, result.statesResult.get(1)); assertEquals(ConnectionState.Connected, connection.getState()); } @Test public void testSendMessage() throws Exception { Connection connection = new Connection(SERVER_URL, CONNECTION_QUERYSTRING, new NullLogger()); MockClientTransport transport = new MockClientTransport(); final MultiResult result = new MultiResult(); Utils.addResultHandlersToConnection(connection, result, true); connection.start(transport); transport.negotiationFuture.setResult(Utils.getDefaultNegotiationResponse()); transport.startOperation.future.setResult(null); transport.startOperation.callback.onData("{\"S\":1}"); String dataToSend = "My data"; connection.send("My data").done(new Action<Void>() { @Override public void run(Void obj) throws Exception { result.booleanResult = true; } }); transport.sendOperation.future.setResult(null); assertEquals(dataToSend, transport.sendOperation.data); } @Test public void testStop() throws Exception { Connection connection = new Connection(SERVER_URL, CONNECTION_QUERYSTRING, new NullLogger()); MockClientTransport transport = new MockClientTransport(); final MultiResult result = new MultiResult(); connection.start(transport); transport.negotiationFuture.setResult(Utils.getDefaultNegotiationResponse()); transport.startOperation.future.setResult(null); transport.startOperation.callback.onData("{\"S\":1}"); assertEquals(ConnectionState.Connected, connection.getState()); connection.closed(new Runnable() { @Override public void run() { result.intResult++; } }); connection.stop(); transport.abortFuture.setResult(null); assertEquals(ConnectionState.Disconnected, connection.getState()); assertEquals(1, result.intResult); assertEquals(1, transport.getAbortInvocations()); } @Test public void testDisconnect() throws Exception { Connection connection = new Connection(SERVER_URL, CONNECTION_QUERYSTRING, new NullLogger()); MockClientTransport transport = new MockClientTransport(); final MultiResult result = new MultiResult(); connection.start(transport); transport.negotiationFuture.setResult(Utils.getDefaultNegotiationResponse()); transport.startOperation.future.setResult(null); transport.startOperation.callback.onData("{\"S\":1}"); assertEquals(ConnectionState.Connected, connection.getState()); connection.closed(new Runnable() { @Override public void run() { result.intResult++; } }); connection.disconnect(); assertEquals(ConnectionState.Disconnected, connection.getState()); assertEquals(1, result.intResult); assertEquals(0, transport.getAbortInvocations()); } @Test public void testConnectionSlowAndTimeOut() throws Exception { Connection connection = new Connection(SERVER_URL, CONNECTION_QUERYSTRING, new NullLogger()); MockClientTransport transport = new MockClientTransport(); transport.setSupportKeepAlive(true); final MultiResult result = new MultiResult(); connection.start(transport); NegotiationResponse negotiation = Utils.getDefaultNegotiationResponse(); negotiation.setKeepAliveTimeout(1); negotiation.setDisconnectTimeout(2); transport.negotiationFuture.setResult(negotiation); transport.startOperation.future.setResult(null); transport.startOperation.callback.onData("{\"S\":1}"); assertEquals(ConnectionState.Connected, connection.getState()); connection.connectionSlow(new Runnable() { @Override public void run() { result.intResult++; } }); Thread.sleep((long) ((negotiation.getDisconnectTimeout() + 1) * 1000)); assertEquals(1, result.intResult); assertEquals(ConnectionState.Reconnecting, connection.getState()); } }