fix #8 Ack without params causes MissingFormatArgumentException

This commit is contained in:
Naoyuki Kanezawa
2014-07-13 00:26:54 +09:00
parent dc153a4731
commit d070baa1b6
2 changed files with 51 additions and 13 deletions

View File

@@ -295,15 +295,20 @@ public class Socket extends Emitter {
final boolean[] sent = new boolean[] {false}; final boolean[] sent = new boolean[] {false};
return new Ack() { return new Ack() {
@Override @Override
public synchronized void call(Object... args) { public void call(final Object... args) {
if (sent[0]) return; EventThread.exec(new Runnable() {
sent[0] = true; @Override
logger.fine(String.format("sending ack %s", args)); 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; int type = HasBinaryData.hasBinary(args) ? Parser.BINARY_ACK : Parser.ACK;
Packet<JSONArray> packet = new Packet<JSONArray>(type, new JSONArray(Arrays.asList(args))); Packet<JSONArray> packet = new Packet<JSONArray>(type, new JSONArray(Arrays.asList(args)));
packet.id = id; packet.id = id;
self.packet(packet); self.packet(packet);
}
});
} }
}; };
} }

View File

@@ -9,8 +9,7 @@ import org.junit.runners.JUnit4;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.concurrent.Semaphore; import java.util.concurrent.Semaphore;
import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
@@ -25,12 +24,15 @@ public class ServerConnectionTest extends Connection {
socket = client(); socket = client();
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override @Override
public void call(Object... objects) { public void call(Object... args) {
assertThat(args.length, is(0));
socket.disconnect(); socket.disconnect();
} }
}).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() { }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
@Override @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(); semaphore.release();
} }
}); });
@@ -138,7 +140,7 @@ public class ServerConnectionTest extends Connection {
socket.emit("ack", null, new Ack() { socket.emit("ack", null, new Ack() {
@Override @Override
public void call(Object... args) { public void call(Object... args) {
assertThat(args, is(new Object[] {})); assertThat(args.length, is(0));
socket.disconnect(); socket.disconnect();
semaphore.release(); semaphore.release();
} }
@@ -148,4 +150,35 @@ public class ServerConnectionTest extends Connection {
socket.connect(); socket.connect();
semaphore.acquire(); 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();
}
} }