From d070baa1b628304165d09db403a5205c06453e32 Mon Sep 17 00:00:00 2001 From: Naoyuki Kanezawa Date: Sun, 13 Jul 2014 00:26:54 +0900 Subject: [PATCH] fix #8 Ack without params causes MissingFormatArgumentException --- .../github/nkzawa/socketio/client/Socket.java | 21 +++++---- .../socketio/client/ServerConnectionTest.java | 43 ++++++++++++++++--- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/github/nkzawa/socketio/client/Socket.java b/src/main/java/com/github/nkzawa/socketio/client/Socket.java index c1c0088..2848221 100644 --- a/src/main/java/com/github/nkzawa/socketio/client/Socket.java +++ b/src/main/java/com/github/nkzawa/socketio/client/Socket.java @@ -295,15 +295,20 @@ public class Socket extends Emitter { final boolean[] sent = new boolean[] {false}; return new Ack() { @Override - public synchronized void call(Object... args) { - if (sent[0]) return; - sent[0] = true; - logger.fine(String.format("sending ack %s", args)); + public void call(final Object... args) { + EventThread.exec(new Runnable() { + @Override + public void run() { + if (sent[0]) return; + sent[0] = true; + logger.fine(String.format("sending ack %s", args.length != 0 ? args : null)); - int type = HasBinaryData.hasBinary(args) ? Parser.BINARY_ACK : Parser.ACK; - Packet packet = new Packet(type, new JSONArray(Arrays.asList(args))); - packet.id = id; - self.packet(packet); + int type = HasBinaryData.hasBinary(args) ? Parser.BINARY_ACK : Parser.ACK; + Packet packet = new Packet(type, new JSONArray(Arrays.asList(args))); + packet.id = id; + self.packet(packet); + } + }); } }; } diff --git a/src/test/java/com/github/nkzawa/socketio/client/ServerConnectionTest.java b/src/test/java/com/github/nkzawa/socketio/client/ServerConnectionTest.java index 5867b22..76b10c6 100644 --- a/src/test/java/com/github/nkzawa/socketio/client/ServerConnectionTest.java +++ b/src/test/java/com/github/nkzawa/socketio/client/ServerConnectionTest.java @@ -9,8 +9,7 @@ import org.junit.runners.JUnit4; import java.net.URISyntaxException; import java.util.concurrent.Semaphore; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) @@ -25,12 +24,15 @@ public class ServerConnectionTest extends Connection { socket = client(); socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { @Override - public void call(Object... objects) { + public void call(Object... args) { + assertThat(args.length, is(0)); socket.disconnect(); } }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() { @Override - public void call(Object... objects) { + public void call(Object... args) { + assertThat(args.length, is(1)); + assertThat(args[0], is(instanceOf(String.class))); semaphore.release(); } }); @@ -138,7 +140,7 @@ public class ServerConnectionTest extends Connection { socket.emit("ack", null, new Ack() { @Override public void call(Object... args) { - assertThat(args, is(new Object[] {})); + assertThat(args.length, is(0)); socket.disconnect(); semaphore.release(); } @@ -148,4 +150,35 @@ public class ServerConnectionTest extends Connection { socket.connect(); semaphore.acquire(); } + + @Test(timeout = TIMEOUT) + public void ackWithoutArgsFromClient() throws URISyntaxException, InterruptedException { + final Semaphore semaphore = new Semaphore(0); + + socket = client(); + socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { + @Override + public void call(Object... objects) { + socket.on("ack", new Emitter.Listener() { + @Override + public void call(Object... args) { + assertThat(args.length, is(1)); + assertThat(args[0], is(instanceOf(Ack.class))); + Ack ack = (Ack)args[0]; + ack.call(); + } + }).on("ackBack", new Emitter.Listener() { + @Override + public void call(Object... args) { + assertThat(args.length, is(0)); + socket.disconnect(); + semaphore.release(); + } + }); + socket.emit("callAck"); + } + }); + socket.connect(); + semaphore.acquire(); + } }