/*
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.*;
import microsoft.aspnet.signalr.client.Action;
import microsoft.aspnet.signalr.client.NullLogger;
import microsoft.aspnet.signalr.client.hubs.HubConnection;
import microsoft.aspnet.signalr.client.hubs.HubProxy;
import microsoft.aspnet.signalr.client.hubs.Subscription;
import microsoft.aspnet.signalr.client.hubs.SubscriptionHandler2;
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 org.junit.Test;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
public class HubConnectionTests {
private static final String SERVER_URL = "http://myUrl.com/";
@Test
public void testConnectionDefaultUrl() throws Exception {
HubConnection connection = new HubConnection(SERVER_URL, "", true, new NullLogger());
assertEquals(SERVER_URL + "signalr/", connection.getUrl());
}
@Test
public void testConnectionData() throws Exception {
HubConnection connection = new HubConnection(SERVER_URL, "", true, new NullLogger());
connection.createHubProxy("myProxy1");
connection.createHubProxy("myProxy2");
assertEquals(connection.getConnectionData(), "[{\"name\":\"myproxy1\"},{\"name\":\"myproxy2\"}]");
}
@Test
public void testInvoke() throws Exception {
MockClientTransport transport = new MockClientTransport();
HubConnection connection = new HubConnection(SERVER_URL, "", true, new NullLogger());
HubProxy proxy = connection.createHubProxy("myProxy1");
connection.start(transport);
transport.negotiationFuture.setResult(Utils.getDefaultNegotiationResponse());
transport.startOperation.future.setResult(null);
transport.startOperation.callback.onData("{\"S\":1}");
final MultiResult multiResult = new MultiResult();
multiResult.booleanResult = false;
String method = "myMethod";
final String arg1 = "arg1";
final int arg2 = 2;
InvocationResult arg = new InvocationResult();
arg.prop1 = arg1;
arg.prop2 = arg2;
proxy.invoke(InvocationResult.class, method, arg).done(new Action<InvocationResult>() {
@Override
public void run(InvocationResult result) throws Exception {
multiResult.booleanResult = true;
assertEquals(arg1, result.prop1);
assertEquals(arg2, result.prop2);
}
});
transport.sendOperation.future.setResult(null);
JsonObject expectedSendData = new JsonObject();
expectedSendData.addProperty("I", "0");
expectedSendData.addProperty("H", "myProxy1");
expectedSendData.addProperty("M", method);
JsonArray sentArguments = new JsonArray();
JsonObject jsonArg1 = new JsonObject();
jsonArg1.addProperty("prop1", arg1);
jsonArg1.addProperty("prop2", arg2);
sentArguments.add(jsonArg1);
expectedSendData.add("A", sentArguments);
assertEquals(expectedSendData.toString(), transport.sendOperation.data.toString());
JsonObject jsonResult = new JsonObject();
jsonResult.addProperty("I", "0");
jsonResult.add("R", jsonArg1);
transport.startOperation.callback.onData(jsonResult.toString());
assertTrue(multiResult.booleanResult);
}
@Test
public void testDynamicSubscriptionHandler() throws Exception {
MockClientTransport transport = new MockClientTransport();
HubConnection connection = new HubConnection(SERVER_URL, "", true, new NullLogger());
HubProxy proxy = connection.createHubProxy("myProxy1");
final MultiResult multiResult = new MultiResult();
final String pString = "p1";
final int pInt = 1;
proxy.subscribe(new Object() {
@SuppressWarnings("unused")
public void message1(String arg1, int arg2) {
assertEquals(pString, arg1);
assertEquals(pInt, arg2);
multiResult.listResult.add(1);
}
@SuppressWarnings("unused")
public void message2(int arg1, String arg2) {
assertEquals(pInt, arg1);
assertEquals(pString, arg2);
multiResult.listResult.add(2);
}
});
connection.start(transport);
transport.negotiationFuture.setResult(Utils.getDefaultNegotiationResponse());
transport.startOperation.future.setResult(null);
JsonObject message = new JsonObject();
// message1
JsonObject hubMessage1 = new JsonObject();
hubMessage1.addProperty("H", "myproxy1");
hubMessage1.addProperty("M", "message1");
JsonArray jsonArgs = new JsonArray();
jsonArgs.add(new JsonPrimitive(pString));
jsonArgs.add(new JsonPrimitive(1));
hubMessage1.add("A", jsonArgs);
JsonArray messageArray = new JsonArray();
messageArray.add(hubMessage1);
// message2
JsonObject hubMessage2 = new JsonObject();
hubMessage2.addProperty("H", "myproxy1");
hubMessage2.addProperty("M", "message2");
jsonArgs = new JsonArray();
jsonArgs.add(new JsonPrimitive(1));
jsonArgs.add(new JsonPrimitive(pString));
hubMessage2.add("A", jsonArgs);
messageArray.add(hubMessage2);
message.add("M", messageArray);
transport.startOperation.callback.onData(message.toString());
assertEquals(2, multiResult.listResult.size());
assertEquals(1, multiResult.listResult.get(0));
assertEquals(2, multiResult.listResult.get(1));
}
@Test
public void testOnSubscriptionHandler() throws Exception {
MockClientTransport transport = new MockClientTransport();
HubConnection connection = new HubConnection(SERVER_URL, "", true, new NullLogger());
HubProxy proxy = connection.createHubProxy("myProxy1");
final MultiResult multiResult = new MultiResult();
final String pString = "p1";
final int pInt = 1;
proxy.on("message1", new SubscriptionHandler2<String, Integer>() {
@Override
public void run(String arg1, Integer arg2) {
assertEquals(pString, arg1);
assertEquals(pInt, (int) arg2);
multiResult.listResult.add(1);
}
}, String.class, Integer.class);
proxy.on("message2", new SubscriptionHandler2<Integer, String>() {
@Override
public void run(Integer arg1, String arg2) {
assertEquals(pInt, (int) arg1);
assertEquals(pString, arg2);
multiResult.listResult.add(2);
}
}, Integer.class, String.class);
connection.start(transport);
transport.negotiationFuture.setResult(Utils.getDefaultNegotiationResponse());
transport.startOperation.future.setResult(null);
JsonObject message = new JsonObject();
// message1
JsonObject hubMessage1 = new JsonObject();
hubMessage1.addProperty("H", "myproxy1");
hubMessage1.addProperty("M", "message1");
JsonArray jsonArgs = new JsonArray();
jsonArgs.add(new JsonPrimitive(pString));
jsonArgs.add(new JsonPrimitive(1));
hubMessage1.add("A", jsonArgs);
JsonArray messageArray = new JsonArray();
messageArray.add(hubMessage1);
// message2
JsonObject hubMessage2 = new JsonObject();
hubMessage2.addProperty("H", "myproxy1");
hubMessage2.addProperty("M", "message2");
jsonArgs = new JsonArray();
jsonArgs.add(new JsonPrimitive(1));
jsonArgs.add(new JsonPrimitive(pString));
hubMessage2.add("A", jsonArgs);
messageArray.add(hubMessage2);
message.add("M", messageArray);
transport.startOperation.callback.onData(message.toString());
assertEquals(2, multiResult.listResult.size());
assertEquals(1, multiResult.listResult.get(0));
assertEquals(2, multiResult.listResult.get(1));
}
@Test
public void testSubscription() throws Exception {
MockClientTransport transport = new MockClientTransport();
HubConnection connection = new HubConnection(SERVER_URL, "", true, new NullLogger());
HubProxy proxy = connection.createHubProxy("myProxy1");
final MultiResult multiResult = new MultiResult();
final String pString = "p1";
final int pInt = 1;
Subscription sub1 = proxy.subscribe("message1");
sub1.addReceivedHandler(new Action<JsonElement[]>() {
@Override
public void run(JsonElement[] obj) throws Exception {
assertEquals(pString, obj[0].getAsString());
assertEquals(pInt, obj[1].getAsInt());
multiResult.listResult.add(1);
}
});
Subscription sub2 = proxy.subscribe("message2");
sub2.addReceivedHandler(new Action<JsonElement[]>() {
@Override
public void run(JsonElement[] obj) throws Exception {
assertEquals(pInt, obj[0].getAsInt());
assertEquals(pString, obj[1].getAsString());
multiResult.listResult.add(2);
}
});
connection.start(transport);
transport.negotiationFuture.setResult(Utils.getDefaultNegotiationResponse());
transport.startOperation.future.setResult(null);
JsonObject message = new JsonObject();
// message1
JsonObject hubMessage1 = new JsonObject();
hubMessage1.addProperty("H", "myproxy1");
hubMessage1.addProperty("M", "message1");
JsonArray jsonArgs = new JsonArray();
jsonArgs.add(new JsonPrimitive(pString));
jsonArgs.add(new JsonPrimitive(1));
hubMessage1.add("A", jsonArgs);
JsonArray messageArray = new JsonArray();
messageArray.add(hubMessage1);
// message2
JsonObject hubMessage2 = new JsonObject();
hubMessage2.addProperty("H", "myproxy1");
hubMessage2.addProperty("M", "message2");
jsonArgs = new JsonArray();
jsonArgs.add(new JsonPrimitive(1));
jsonArgs.add(new JsonPrimitive(pString));
hubMessage2.add("A", jsonArgs);
messageArray.add(hubMessage2);
message.add("M", messageArray);
transport.startOperation.callback.onData(message.toString());
assertEquals(2, multiResult.listResult.size());
assertEquals(1, multiResult.listResult.get(0));
assertEquals(2, multiResult.listResult.get(1));
}
@Test
public void setHubConnectionHeaders(){
HubConnection connection = new HubConnection(SERVER_URL, "", true, new NullLogger());
connection.getHeaders().put("key", "value");
assertEquals(1, connection.getHeaders().values().size());
assertEquals("value", connection.getHeaders().get("key"));
}
@Test
public void testMultipleSubscriptionForEvent() throws Exception {
MockClientTransport transport = new MockClientTransport();
HubConnection connection = new HubConnection(SERVER_URL, "", true, new NullLogger());
HubProxy proxy = connection.createHubProxy("myProxy1");
final MultiResult multiResult = new MultiResult();
final String pString = "p1";
proxy.subscribe(new Object() {
@SuppressWarnings("unused")
public void message1(String arg1, int arg2) {
multiResult.listResult.add(1);
}
});
proxy.subscribe(new Object() {
@SuppressWarnings("unused")
public void message1(String arg1, int arg2) {
multiResult.listResult.add(1);
}
});
connection.start(transport);
transport.negotiationFuture.setResult(Utils.getDefaultNegotiationResponse());
transport.startOperation.future.setResult(null);
JsonObject message = new JsonObject();
// message1
JsonObject hubMessage1 = new JsonObject();
hubMessage1.addProperty("H", "myproxy1");
hubMessage1.addProperty("M", "message1");
JsonArray jsonArgs = new JsonArray();
jsonArgs.add(new JsonPrimitive(pString));
jsonArgs.add(new JsonPrimitive(1));
hubMessage1.add("A", jsonArgs);
JsonArray messageArray = new JsonArray();
messageArray.add(hubMessage1);
message.add("M", messageArray);
transport.startOperation.callback.onData(message.toString());
assertEquals(2, multiResult.listResult.size());
}
public class InvocationResult {
public String prop1;
public int prop2;
}
}