package com.koushikdutta.async.test;
import android.util.Log;
import com.koushikdutta.async.AsyncServer;
import com.koushikdutta.async.future.SimpleFuture;
import com.koushikdutta.async.http.AsyncHttpClient;
import com.koushikdutta.async.http.socketio.Acknowledge;
import com.koushikdutta.async.http.socketio.ConnectCallback;
import com.koushikdutta.async.http.socketio.DisconnectCallback;
import com.koushikdutta.async.http.socketio.EventCallback;
import com.koushikdutta.async.http.socketio.JSONCallback;
import com.koushikdutta.async.http.socketio.ReconnectCallback;
import com.koushikdutta.async.http.socketio.SocketIOClient;
import com.koushikdutta.async.http.socketio.SocketIORequest;
import com.koushikdutta.async.http.socketio.StringCallback;
import junit.framework.TestCase;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.concurrent.TimeUnit;
public class SocketIOTests extends TestCase {
public static final long TIMEOUT = 10000L;
@Override
protected void tearDown() throws Exception {
super.tearDown();
AsyncServer.getDefault().stop();
}
class TriggerFuture extends SimpleFuture<Boolean> {
public void trigger(boolean val) {
setComplete(val);
}
}
public void testAcknowledge() throws Exception {
final TriggerFuture trigger = new TriggerFuture();
SocketIOClient client = SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), "http://koush.clockworkmod.com:8080/", null).get();
client.emit("hello", new Acknowledge() {
@Override
public void acknowledge(JSONArray arguments) {
trigger.trigger("hello".equals(arguments.optString(0)));
}
});
assertTrue(trigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
}
public void testSendAcknowledge() throws Exception {
final TriggerFuture trigger = new TriggerFuture();
SocketIOClient client = SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), "http://koush.clockworkmod.com:8080/", null).get();
client.setStringCallback(new StringCallback() {
boolean isEcho = true;
@Override
public void onString(String string, Acknowledge acknowledge) {
if (!isEcho) {
trigger.trigger("hello".equals(string));
return;
}
assertNotNull(acknowledge);
isEcho = false;
acknowledge.acknowledge(new JSONArray().put(string));
}
});
client.emit("hello");
assertTrue(trigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
}
public void testEndpoint() throws Exception {
final TriggerFuture trigger = new TriggerFuture();
SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), new SocketIORequest("http://koush.clockworkmod.com:8080/", "/chat"), new ConnectCallback() {
@Override
public void onConnectCompleted(Exception ex, SocketIOClient client) {
assertNull(ex);
client.setStringCallback(new StringCallback() {
@Override
public void onString(String string, Acknowledge acknowledge) {
trigger.trigger("hello".equals(string));
}
});
client.emit("hello");
}
});
assertTrue(trigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
}
public void testEchoServer() throws Exception {
final TriggerFuture trigger1 = new TriggerFuture();
final TriggerFuture trigger2 = new TriggerFuture();
final TriggerFuture trigger3 = new TriggerFuture();
SocketIORequest req = new SocketIORequest("http://koush.clockworkmod.com:8080");
req.setLogging("Socket.IO", Log.VERBOSE);
SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), req, new ConnectCallback() {
@Override
public void onConnectCompleted(Exception ex, SocketIOClient client) {
assertNull(ex);
client.setStringCallback(new StringCallback() {
@Override
public void onString(String string, Acknowledge acknowledge) {
trigger1.trigger("hello".equals(string));
}
});
client.on("pong", new EventCallback() {
@Override
public void onEvent(JSONArray arguments, Acknowledge acknowledge) {
trigger2.trigger(arguments.length() == 3);
}
});
client.setJSONCallback(new JSONCallback() {
@Override
public void onJSON(JSONObject json, Acknowledge acknowledge) {
trigger3.trigger("world".equals(json.optString("hello")));
}
});
try {
client.emit("hello");
client.emit(new JSONObject("{\"hello\":\"world\"}"));
client.emit("ping", new JSONArray("[2,3,4]"));
}
catch (JSONException e) {
}
}
});
assertTrue(trigger1.get(TIMEOUT, TimeUnit.MILLISECONDS));
assertTrue(trigger2.get(TIMEOUT, TimeUnit.MILLISECONDS));
assertTrue(trigger3.get(TIMEOUT, TimeUnit.MILLISECONDS));
}
public void testReconnect() throws Exception {
final TriggerFuture disconnectTrigger = new TriggerFuture();
final TriggerFuture reconnectTrigger = new TriggerFuture();
final TriggerFuture endpointReconnectTrigger = new TriggerFuture();
final TriggerFuture echoTrigger = new TriggerFuture();
SocketIORequest req = new SocketIORequest("http://koush.clockworkmod.com:8080");
req.setLogging("socket.io", Log.VERBOSE);
SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), req, new ConnectCallback() {
@Override
public void onConnectCompleted(Exception ex, final SocketIOClient client) {
assertNull(ex);
client.of("/chat", new ConnectCallback() {
@Override
public void onConnectCompleted(Exception ex, final SocketIOClient client) {
client.setReconnectCallback(new ReconnectCallback() {
@Override
public void onReconnect() {
client.emit("hello");
endpointReconnectTrigger.trigger(true);
}
});
client.setStringCallback(new StringCallback() {
@Override
public void onString(String string, Acknowledge acknowledge) {
echoTrigger.trigger("hello".equals(string));
}
});
AsyncServer.getDefault().postDelayed(new Runnable() {
@Override
public void run() {
// this will trigger a reconnect
client.getTransport().disconnect();
}
}, 200);
}
});
client.setDisconnectCallback(new DisconnectCallback() {
@Override
public void onDisconnect(Exception e) {
disconnectTrigger.trigger(true);
}
});
client.setReconnectCallback(new ReconnectCallback() {
@Override
public void onReconnect() {
reconnectTrigger.trigger(true);
}
});
}
});
assertTrue(disconnectTrigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
assertTrue(reconnectTrigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
assertTrue(endpointReconnectTrigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
assertTrue(echoTrigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
}
public void testEventAck() throws Exception {
final TriggerFuture trigger = new TriggerFuture();
SocketIOClient client = SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), "http://koush.clockworkmod.com:8080/", null).get();
final JSONArray args = new JSONArray();
args.put("echo");
client.on("scoop", new EventCallback() {
@Override
public void onEvent(JSONArray argument, Acknowledge acknowledge) {
acknowledge.acknowledge(args);
}
});
client.on("ack", new EventCallback() {
@Override
public void onEvent(JSONArray argument, Acknowledge acknowledge) {
trigger.trigger(args.optString(0, null).equals("echo"));
}
});
client.emit("poop", args);
assertTrue(trigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
}
}