From 5f609900a01f831f20a0d26e4c4bddb1bcf4d770 Mon Sep 17 00:00:00 2001 From: Naoyuki Kanezawa Date: Sun, 21 Sep 2014 22:42:00 +0900 Subject: [PATCH] compatible with socket.io-client 1.1.0 --- pom.xml | 4 +- .../HasBinary.java} | 14 ++-- .../nkzawa/socketio/client/Manager.java | 5 +- .../github/nkzawa/socketio/client/Socket.java | 6 +- .../nkzawa/hasbinary/HasBinaryTest.java | 73 +++++++++++++++++++ .../hasbinarydata/HasBinaryDataTest.java | 26 ------- .../nkzawa/socketio/client/Connection.java | 2 +- .../socketio/client/ConnectionTest.java | 65 +++++++++++++---- src/test/resources/package.json | 2 +- src/test/resources/server.js | 16 ++++ 10 files changed, 155 insertions(+), 58 deletions(-) rename src/main/java/com/github/nkzawa/{hasbinarydata/HasBinaryData.java => hasbinary/HasBinary.java} (79%) create mode 100644 src/test/java/com/github/nkzawa/hasbinary/HasBinaryTest.java delete mode 100644 src/test/java/com/github/nkzawa/hasbinarydata/HasBinaryDataTest.java diff --git a/pom.xml b/pom.xml index 6f88e59..c2f8f1d 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.github.nkzawa socket.io-client - 0.1.4-SNAPSHOT + 0.2.0-SNAPSHOT jar socket.io-client Socket.IO Client Library for Java @@ -58,7 +58,7 @@ com.github.nkzawa engine.io-client - 0.2.3 + 0.3.0-SNAPSHOT org.json diff --git a/src/main/java/com/github/nkzawa/hasbinarydata/HasBinaryData.java b/src/main/java/com/github/nkzawa/hasbinary/HasBinary.java similarity index 79% rename from src/main/java/com/github/nkzawa/hasbinarydata/HasBinaryData.java rename to src/main/java/com/github/nkzawa/hasbinary/HasBinary.java index f57f3eb..bcd8b93 100644 --- a/src/main/java/com/github/nkzawa/hasbinarydata/HasBinaryData.java +++ b/src/main/java/com/github/nkzawa/hasbinary/HasBinary.java @@ -1,4 +1,4 @@ -package com.github.nkzawa.hasbinarydata; +package com.github.nkzawa.hasbinary; import org.json.JSONArray; import org.json.JSONException; @@ -6,15 +6,15 @@ import org.json.JSONObject; import java.util.Iterator; -public class HasBinaryData { +public class HasBinary { - private HasBinaryData() {} + private HasBinary() {} public static boolean hasBinary(Object data) { - return recursiveCheckForBinary(data); + return _hasBinary(data); } - private static boolean recursiveCheckForBinary(Object obj) { + private static boolean _hasBinary(Object obj) { if (obj == null) return false; if (obj instanceof byte[]) { @@ -31,7 +31,7 @@ public class HasBinaryData { } catch (JSONException e) { return false; } - if (recursiveCheckForBinary(v)) { + if (_hasBinary(v)) { return true; } } @@ -46,7 +46,7 @@ public class HasBinaryData { } catch (JSONException e) { return false; } - if (recursiveCheckForBinary(v)) { + if (_hasBinary(v)) { return true; } } diff --git a/src/main/java/com/github/nkzawa/socketio/client/Manager.java b/src/main/java/com/github/nkzawa/socketio/client/Manager.java index 52745e1..c76dae9 100644 --- a/src/main/java/com/github/nkzawa/socketio/client/Manager.java +++ b/src/main/java/com/github/nkzawa/socketio/client/Manager.java @@ -196,7 +196,8 @@ public class Manager extends Emitter { } private void maybeReconnectOnOpen() { - if (!this.openReconnect && !this.reconnecting && this._reconnection) { + // Only try to reconnect if it's the first time we're connecting + if (!this.openReconnect && !this.reconnecting && this._reconnection && this.attempts == 0) { this.openReconnect = true; this.reconnect(); } @@ -425,7 +426,7 @@ public class Manager extends Emitter { while ((sub = this.subs.poll()) != null) sub.destroy(); } - private void close() { + /*package*/ void close() { this.skipReconnect = true; this.engine.close(); } 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 446cae7..e22dd7a 100644 --- a/src/main/java/com/github/nkzawa/socketio/client/Socket.java +++ b/src/main/java/com/github/nkzawa/socketio/client/Socket.java @@ -1,7 +1,7 @@ package com.github.nkzawa.socketio.client; import com.github.nkzawa.emitter.Emitter; -import com.github.nkzawa.hasbinarydata.HasBinaryData; +import com.github.nkzawa.hasbinary.HasBinary; import com.github.nkzawa.socketio.parser.Packet; import com.github.nkzawa.socketio.parser.Parser; import com.github.nkzawa.thread.EventThread; @@ -173,7 +173,7 @@ public class Socket extends Emitter { jsonArgs.put(arg); } int parserType = Parser.EVENT; - if (HasBinaryData.hasBinary(jsonArgs)) { parserType = Parser.BINARY_EVENT; } + if (HasBinary.hasBinary(jsonArgs)) { parserType = Parser.BINARY_EVENT; } Packet packet = new Packet(parserType, jsonArgs); if (_args.get(_args.size() - 1) instanceof Ack) { @@ -324,7 +324,7 @@ public class Socket extends Emitter { 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 = HasBinary.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/hasbinary/HasBinaryTest.java b/src/test/java/com/github/nkzawa/hasbinary/HasBinaryTest.java new file mode 100644 index 0000000..81b1f1f --- /dev/null +++ b/src/test/java/com/github/nkzawa/hasbinary/HasBinaryTest.java @@ -0,0 +1,73 @@ +package com.github.nkzawa.hasbinary; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.nio.charset.Charset; + +import static org.junit.Assert.assertTrue; + +@RunWith(JUnit4.class) +public class HasBinaryTest { + + @Test + public void byteArray() { + assertTrue(HasBinary.hasBinary(new byte[0])); + } + + @Test + public void anArrayThatDoesNotContainByteArray() throws JSONException { + JSONArray arr = new JSONArray("[1, \"cool\", 2]"); + assertTrue(!HasBinary.hasBinary(arr)); + } + + @Test + public void anArrayContainsByteArray() throws JSONException { + JSONArray arr = new JSONArray("[1, null, 2]"); + arr.put(1, "asdfasdf".getBytes(Charset.forName("UTF-8"))); + assertTrue(HasBinary.hasBinary(arr)); + } + + @Test + public void anObjectThatDoesNotContainByteArray() throws JSONException { + JSONObject ob = new JSONObject("{\"a\": \"a\", \"b\": [], \"c\": 1234}"); + assertTrue(!HasBinary.hasBinary(ob)); + } + + @Test + public void anObjectThatContainsByteArray() throws JSONException { + JSONObject ob = new JSONObject("{\"a\": \"a\", \"b\": null, \"c\": 1234}"); + ob.put("b", "abc".getBytes(Charset.forName("UTF-8"))); + assertTrue(HasBinary.hasBinary(ob)); + } + + @Test + public void testNull() { + assertTrue(!HasBinary.hasBinary(null)); + } + + @Test + public void aComplexObjectThatContainsNoBinary() throws JSONException { + JSONObject ob = new JSONObject(); + ob.put("x", new JSONArray("[\"a\", \"b\", 123]")); + ob.put("y", JSONObject.NULL); + ob.put("z", new JSONObject("{\"a\": \"x\", \"b\": \"y\", \"c\": 3, \"d\": null}")); + ob.put("w", new JSONArray()); + assertTrue(!HasBinary.hasBinary(ob)); + } + + @Test + public void aComplexObjectThatContainsBinary() throws JSONException { + JSONObject ob = new JSONObject(); + ob.put("x", new JSONArray("[\"a\", \"b\", 123]")); + ob.put("y", JSONObject.NULL); + ob.put("z", new JSONObject("{\"a\": \"x\", \"b\": \"y\", \"c\": 3, \"d\": null}")); + ob.put("w", new JSONArray()); + ob.put("bin", "xxx".getBytes(Charset.forName("UTF-8"))); + assertTrue(HasBinary.hasBinary(ob)); + } +} diff --git a/src/test/java/com/github/nkzawa/hasbinarydata/HasBinaryDataTest.java b/src/test/java/com/github/nkzawa/hasbinarydata/HasBinaryDataTest.java deleted file mode 100644 index 98a0ef5..0000000 --- a/src/test/java/com/github/nkzawa/hasbinarydata/HasBinaryDataTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.nkzawa.hasbinarydata; - -import org.json.JSONArray; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -import java.nio.charset.Charset; - -import static org.junit.Assert.assertTrue; - -@RunWith(JUnit4.class) -public class HasBinaryDataTest { - - @Test - public void arrayContainsByteArray() throws Exception { - JSONArray arr = new JSONArray("[1, null, 2]"); - arr.put(1, "asdfasdf".getBytes(Charset.forName("UTF-8"))); - assertTrue(HasBinaryData.hasBinary(arr)); - } - - @Test - public void byteArray() { - assertTrue(HasBinaryData.hasBinary(new byte[0])); - } -} diff --git a/src/test/java/com/github/nkzawa/socketio/client/Connection.java b/src/test/java/com/github/nkzawa/socketio/client/Connection.java index 22dcf56..1cba22e 100644 --- a/src/test/java/com/github/nkzawa/socketio/client/Connection.java +++ b/src/test/java/com/github/nkzawa/socketio/client/Connection.java @@ -11,7 +11,7 @@ import java.util.concurrent.*; public abstract class Connection { - final static int TIMEOUT = 3000; + final static int TIMEOUT = 7000; final static int PORT = 3000; private Process serverProcess; diff --git a/src/test/java/com/github/nkzawa/socketio/client/ConnectionTest.java b/src/test/java/com/github/nkzawa/socketio/client/ConnectionTest.java index ccf42c5..49fd4ad 100644 --- a/src/test/java/com/github/nkzawa/socketio/client/ConnectionTest.java +++ b/src/test/java/com/github/nkzawa/socketio/client/ConnectionTest.java @@ -144,7 +144,6 @@ public class ConnectionTest extends Connection { }; socket = client(); - final int[] i = new int[] {0}; socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { @Override public void call(Object... objects) { @@ -178,8 +177,39 @@ public class ConnectionTest extends Connection { foo.on(Socket.EVENT_CONNECT, new Emitter.Listener() { @Override public void call(Object... args) { - values.offer("done"); foo.close(); + socket.close(); + manager.close(); + values.offer("done"); + } + }); + foo.open(); + } + }); + socket.open(); + values.take(); + } + + @Test(timeout = TIMEOUT) + public void connectToNamespaceAfterConnectionGetsClosed() throws URISyntaxException, InterruptedException { + final BlockingQueue values = new LinkedBlockingQueue(); + final Manager manager = new Manager(new URI(uri())); + socket = manager.socket("/"); + socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { + @Override + public void call(Object... objects) { + socket.close(); + } + }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() { + @Override + public void call(Object... objects) { + final Socket foo = manager.socket("/foo"); + foo.on(Socket.EVENT_CONNECT, new Emitter.Listener() { + @Override + public void call(Object... args) { + foo.close(); + manager.close(); + values.offer("done"); } }); foo.open(); @@ -187,7 +217,6 @@ public class ConnectionTest extends Connection { }); socket.open(); values.take(); - socket.close(); } @Test(timeout = TIMEOUT) @@ -197,6 +226,7 @@ public class ConnectionTest extends Connection { socket.io().on(Manager.EVENT_RECONNECT, new Emitter.Listener() { @Override public void call(Object... objects) { + socket.close(); values.offer("done"); } }); @@ -208,7 +238,6 @@ public class ConnectionTest extends Connection { } }, 500); values.take(); - socket.close(); } @Test(timeout = TIMEOUT) @@ -239,7 +268,7 @@ public class ConnectionTest extends Connection { opts.reconnection = true; opts.reconnectionAttempts = 2; opts.reconnectionDelay = 10; - Manager manager = new Manager(new URI("http://localhost:3940"), opts); + final Manager manager = new Manager(new URI("http://localhost:3940"), opts); socket = manager.socket("/asd"); final int[] reconnects = new int[] {0}; Emitter.Listener cb = new Emitter.Listener() { @@ -254,13 +283,14 @@ public class ConnectionTest extends Connection { manager.on(Manager.EVENT_RECONNECT_FAILED, new Emitter.Listener() { @Override public void call(Object... objects) { + socket.close(); + manager.close(); values.offer(reconnects[0]); } }); socket.open(); assertThat((Integer)values.take(), is(2)); - socket.close(); } @Test(timeout = TIMEOUT) @@ -271,7 +301,7 @@ public class ConnectionTest extends Connection { opts.timeout = 0; opts.reconnectionAttempts = 2; opts.reconnectionDelay = 10; - Manager manager = new Manager(new URI(uri()), opts); + final Manager manager = new Manager(new URI(uri()), opts); final int[] reconnects = new int[] {0}; Emitter.Listener reconnectCb = new Emitter.Listener() { @@ -285,6 +315,8 @@ public class ConnectionTest extends Connection { manager.on(Manager.EVENT_RECONNECT_FAILED, new Emitter.Listener() { @Override public void call(Object... objects) { + socket.close(); + manager.close(); values.offer(reconnects[0]); } }); @@ -292,7 +324,6 @@ public class ConnectionTest extends Connection { socket = manager.socket("/timeout"); socket.open(); assertThat((Integer)values.take(), is(2)); - socket.close(); } @Test(timeout = TIMEOUT) @@ -300,7 +331,7 @@ public class ConnectionTest extends Connection { final BlockingQueue values = new LinkedBlockingQueue(); IO.Options opts = new IO.Options(); opts.reconnection = false; - Manager manager = new Manager(new URI("http://localhost:9823"), opts); + final Manager manager = new Manager(new URI("http://localhost:9823"), opts); Emitter.Listener cb = new Emitter.Listener() { @Override public void call(Object... objects) { @@ -316,6 +347,8 @@ public class ConnectionTest extends Connection { timer.schedule(new TimerTask() { @Override public void run() { + socket.close(); + manager.close(); values.offer("done"); } }, 1000); @@ -325,7 +358,6 @@ public class ConnectionTest extends Connection { socket = manager.socket("/invalid"); socket.open(); values.take(); - socket.close(); } @Test(timeout = TIMEOUT) @@ -337,7 +369,7 @@ public class ConnectionTest extends Connection { opts.timeout = 0; opts.reconnectionAttempts = 2; opts.reconnectionDelay = 10; - Manager manager = new Manager(new URI(uri()), opts); + final Manager manager = new Manager(new URI(uri()), opts); socket = manager.socket("/timeout_socket"); final int[] reconnects = new int[] {0}; @@ -353,13 +385,14 @@ public class ConnectionTest extends Connection { socket.on(Socket.EVENT_RECONNECT_FAILED, new Emitter.Listener() { @Override public void call(Object... objects) { + socket.close(); + manager.close(); values.offer(reconnects[0]); } }); socket.open(); assertThat((Integer)values.take(), is(reconnects[0])); assertThat((Integer)values.take(), is(2)); - socket.close(); } @Test(timeout = TIMEOUT) @@ -371,7 +404,7 @@ public class ConnectionTest extends Connection { opts.timeout = 0; opts.reconnectionAttempts = 2; opts.reconnectionDelay = 10; - Manager manager = new Manager(new URI(uri()), opts); + final Manager manager = new Manager(new URI(uri()), opts); socket = manager.socket("/timeout_socket"); final int[] reconnects = new int[] {0}; @@ -387,13 +420,14 @@ public class ConnectionTest extends Connection { socket.on(Socket.EVENT_RECONNECT_FAILED, new Emitter.Listener() { @Override public void call(Object... objects) { + socket.close(); + manager.close(); values.offer(reconnects[0]); } }); socket.open(); assertThat((Integer)values.take(), is(reconnects[0])); assertThat((Integer)values.take(), is(2)); - socket.close(); } @Test(timeout = TIMEOUT) @@ -407,15 +441,14 @@ public class ConnectionTest extends Connection { socket.on("echoBack", new Emitter.Listener() { @Override public void call(Object... args) { - values.offer(args[0]); socket.close(); + values.offer(args[0]); } }); } }); socket.connect(); assertThat(values.take(), instanceOf(String.class)); - socket.close(); } @Test(timeout = TIMEOUT) diff --git a/src/test/resources/package.json b/src/test/resources/package.json index c9df46b..bbf0269 100644 --- a/src/test/resources/package.json +++ b/src/test/resources/package.json @@ -3,6 +3,6 @@ "version": "0.0.0", "private": true, "dependencies": { - "socket.io": "1.0.6" + "socket.io": "1.1.0" } } diff --git a/src/test/resources/server.js b/src/test/resources/server.js index d8b4ae2..941e426 100644 --- a/src/test/resources/server.js +++ b/src/test/resources/server.js @@ -15,6 +15,22 @@ var port = process.env.PORT || 3000; var nsp = process.argv[2] || '/'; var slice = Array.prototype.slice; +io.of('/foo').on('connection', function() { + // register namespace +}); + +io.of('/timeout_socket').on('connection', function() { + // register namespace +}); + +io.of('/valid').on('connection', function() { + // register namespace +}); + +io.of('/asd').on('connection', function() { + // register namespace +}); + io.of(nsp).on('connection', function(socket) { socket.send('hello client');