From d07441e7fa4c2b5fdc25582198a9ba38f451747b Mon Sep 17 00:00:00 2001 From: Erik Little Date: Tue, 5 Jun 2018 10:41:39 -0400 Subject: [PATCH 1/8] add test for extraHeaders on objc --- Tests/TestSocketIOObjc/ManagerObjectiveCTest.m | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Tests/TestSocketIOObjc/ManagerObjectiveCTest.m b/Tests/TestSocketIOObjc/ManagerObjectiveCTest.m index 7455ab9..393da4f 100644 --- a/Tests/TestSocketIOObjc/ManagerObjectiveCTest.m +++ b/Tests/TestSocketIOObjc/ManagerObjectiveCTest.m @@ -13,9 +13,18 @@ - (void)testSettingConfig { NSURL* url = [[NSURL alloc] initWithString:@"http://localhost"]; - self.manager = [[TestManager alloc] initWithSocketURL:url config:@{@"forceNew": @YES}]; + NSDictionary* headers = @{@"My Header": @"Some Value"}; + + self.manager = [[TestManager alloc] initWithSocketURL:url config:@{ + @"forceNew": @YES, + @"extraHeaders": headers + }]; + + [self.manager connect]; XCTAssertTrue(self.manager.forceNew); + XCTAssertTrue([self.manager.engine.extraHeaders isEqualToDictionary:headers]); + } - (void)testManagerProperties { From b258a937501e5853d31574b4edafd594da4ccf04 Mon Sep 17 00:00:00 2001 From: Erasov Ivan Date: Thu, 7 Jun 2018 13:13:44 +0300 Subject: [PATCH 2/8] Fixed loosing POST packets on web socket connection failure and engine memory leak on server errors. --- Source/SocketIO/Engine/SocketEngine.swift | 7 +++---- Source/SocketIO/Manager/SocketManager.swift | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/SocketIO/Engine/SocketEngine.swift b/Source/SocketIO/Engine/SocketEngine.swift index 4904ee5..0000de2 100644 --- a/Source/SocketIO/Engine/SocketEngine.swift +++ b/Source/SocketIO/Engine/SocketEngine.swift @@ -371,6 +371,9 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So fastUpgrade = false probing = false flushProbeWait() + if postWait.count != 0 { + flushWaitingForPostToWebSocket() + } } private func flushProbeWait() { @@ -381,10 +384,6 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So } probeWait.removeAll(keepingCapacity: false) - - if postWait.count != 0 { - flushWaitingForPostToWebSocket() - } } /// Causes any packets that were waiting for POSTing to be sent through the WebSocket. This happens because when diff --git a/Source/SocketIO/Manager/SocketManager.swift b/Source/SocketIO/Manager/SocketManager.swift index 7434ec7..571bf8d 100644 --- a/Source/SocketIO/Manager/SocketManager.swift +++ b/Source/SocketIO/Manager/SocketManager.swift @@ -169,6 +169,7 @@ open class SocketManager : NSObject, SocketManagerSpec, SocketParsable, SocketDa engine?.engineQueue.sync { self.engine?.client = nil + self.engine?.disconnect(reason: "Adding new engine") } engine = SocketEngine(client: self, url: socketURL, config: config) From feb476c76bd9dcf67dde754bf27c0073d7259366 Mon Sep 17 00:00:00 2001 From: Erasov Ivan Date: Thu, 7 Jun 2018 13:42:13 +0300 Subject: [PATCH 3/8] Added comments to document changes reasons --- Source/SocketIO/Engine/SocketEngine.swift | 6 +++++- Source/SocketIO/Manager/SocketManager.swift | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Source/SocketIO/Engine/SocketEngine.swift b/Source/SocketIO/Engine/SocketEngine.swift index 0000de2..bca0944 100644 --- a/Source/SocketIO/Engine/SocketEngine.swift +++ b/Source/SocketIO/Engine/SocketEngine.swift @@ -359,6 +359,7 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So /// /// **You shouldn't call this directly** open func doFastUpgrade() { + if waitingForPoll { DefaultSocketLogger.Logger.error("Outstanding poll when switched to WebSockets," + "we'll probably disconnect soon. You should report this.", type: SocketEngine.logType) @@ -371,7 +372,10 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So fastUpgrade = false probing = false flushProbeWait() - if postWait.count != 0 { + + // Need to flush postWait to socket since it connected successfully + // (moved from flushProbeWait() since it is also called on connected failure) + if !postWait.isEmpty { flushWaitingForPostToWebSocket() } } diff --git a/Source/SocketIO/Manager/SocketManager.swift b/Source/SocketIO/Manager/SocketManager.swift index 571bf8d..830bf93 100644 --- a/Source/SocketIO/Manager/SocketManager.swift +++ b/Source/SocketIO/Manager/SocketManager.swift @@ -168,7 +168,10 @@ open class SocketManager : NSObject, SocketManagerSpec, SocketParsable, SocketDa DefaultSocketLogger.Logger.log("Adding engine", type: SocketManager.logType) engine?.engineQueue.sync { + self.engine?.client = nil + + // Close old engine so it will not leak because of URLSession if in polling mode self.engine?.disconnect(reason: "Adding new engine") } From 5fdff65281ae9ff61c81e76a20b268494edc96f3 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 7 Jun 2018 07:15:43 -0400 Subject: [PATCH 4/8] Clarify comments to explain why we did the move --- Source/SocketIO/Engine/SocketEngine.swift | 6 +++--- Source/SocketIO/Manager/SocketManager.swift | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Source/SocketIO/Engine/SocketEngine.swift b/Source/SocketIO/Engine/SocketEngine.swift index bca0944..a1a80a1 100644 --- a/Source/SocketIO/Engine/SocketEngine.swift +++ b/Source/SocketIO/Engine/SocketEngine.swift @@ -359,7 +359,6 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So /// /// **You shouldn't call this directly** open func doFastUpgrade() { - if waitingForPoll { DefaultSocketLogger.Logger.error("Outstanding poll when switched to WebSockets," + "we'll probably disconnect soon. You should report this.", type: SocketEngine.logType) @@ -372,9 +371,10 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So fastUpgrade = false probing = false flushProbeWait() - + // Need to flush postWait to socket since it connected successfully - // (moved from flushProbeWait() since it is also called on connected failure) + // moved from flushProbeWait() since it is also called on connected failure, and we don't want to try and send + // packets through WebSockets when WebSockets has failed! if !postWait.isEmpty { flushWaitingForPostToWebSocket() } diff --git a/Source/SocketIO/Manager/SocketManager.swift b/Source/SocketIO/Manager/SocketManager.swift index 830bf93..cf88240 100644 --- a/Source/SocketIO/Manager/SocketManager.swift +++ b/Source/SocketIO/Manager/SocketManager.swift @@ -168,9 +168,8 @@ open class SocketManager : NSObject, SocketManagerSpec, SocketParsable, SocketDa DefaultSocketLogger.Logger.log("Adding engine", type: SocketManager.logType) engine?.engineQueue.sync { - self.engine?.client = nil - + // Close old engine so it will not leak because of URLSession if in polling mode self.engine?.disconnect(reason: "Adding new engine") } From 0a7e1f4185ece53efd82e2066979befbcb1dfcd0 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 7 Jun 2018 07:58:11 -0400 Subject: [PATCH 5/8] don't bind error when we're not pattern matching --- Source/SocketIO/Ack/SocketAckEmitter.swift | 4 ++-- Source/SocketIO/Client/SocketIOClient.swift | 8 ++++---- Source/SocketIO/Client/SocketRawView.swift | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Source/SocketIO/Ack/SocketAckEmitter.swift b/Source/SocketIO/Ack/SocketAckEmitter.swift index 417fe94..de45a39 100644 --- a/Source/SocketIO/Ack/SocketAckEmitter.swift +++ b/Source/SocketIO/Ack/SocketAckEmitter.swift @@ -75,8 +75,8 @@ public final class SocketAckEmitter : NSObject { do { socket.emitAck(ackNum, with: try items.map({ try $0.socketRepresentation() })) - } catch let err { - socket.handleClientEvent(.error, data: [ackNum, items, err]) + } catch { + socket.handleClientEvent(.error, data: [ackNum, items, error]) } } diff --git a/Source/SocketIO/Client/SocketIOClient.swift b/Source/SocketIO/Client/SocketIOClient.swift index 04f35a5..501fe30 100644 --- a/Source/SocketIO/Client/SocketIOClient.swift +++ b/Source/SocketIO/Client/SocketIOClient.swift @@ -214,11 +214,11 @@ open class SocketIOClient : NSObject, SocketIOClientSpec { open func emit(_ event: String, _ items: SocketData...) { do { try emit(event, with: items.map({ try $0.socketRepresentation() })) - } catch let err { + } catch { DefaultSocketLogger.Logger.error("Error creating socketRepresentation for emit: \(event), \(items)", type: logType) - handleClientEvent(.error, data: [event, items, err]) + handleClientEvent(.error, data: [event, items, error]) } } @@ -253,11 +253,11 @@ open class SocketIOClient : NSObject, SocketIOClientSpec { open func emitWithAck(_ event: String, _ items: SocketData...) -> OnAckCallback { do { return emitWithAck(event, with: try items.map({ try $0.socketRepresentation() })) - } catch let err { + } catch { DefaultSocketLogger.Logger.error("Error creating socketRepresentation for emit: \(event), \(items)", type: logType) - handleClientEvent(.error, data: [event, items, err]) + handleClientEvent(.error, data: [event, items, error]) return OnAckCallback(ackNumber: -1, items: [], socket: self) } diff --git a/Source/SocketIO/Client/SocketRawView.swift b/Source/SocketIO/Client/SocketRawView.swift index 73fe080..e348ade 100644 --- a/Source/SocketIO/Client/SocketRawView.swift +++ b/Source/SocketIO/Client/SocketRawView.swift @@ -48,11 +48,11 @@ public final class SocketRawView : NSObject { public func emit(_ event: String, _ items: SocketData...) { do { try emit(event, with: items.map({ try $0.socketRepresentation() })) - } catch let err { + } catch { DefaultSocketLogger.Logger.error("Error creating socketRepresentation for emit: \(event), \(items)", type: "SocketIOClient") - socket.handleClientEvent(.error, data: [event, items, err]) + socket.handleClientEvent(.error, data: [event, items, error]) } } @@ -87,11 +87,11 @@ public final class SocketRawView : NSObject { public func emitWithAck(_ event: String, _ items: SocketData...) -> OnAckCallback { do { return emitWithAck(event, with: try items.map({ try $0.socketRepresentation() })) - } catch let err { + } catch { DefaultSocketLogger.Logger.error("Error creating socketRepresentation for emit: \(event), \(items)", type: "SocketIOClient") - socket.handleClientEvent(.error, data: [event, items, err]) + socket.handleClientEvent(.error, data: [event, items, error]) return OnAckCallback(ackNumber: -1, items: [], socket: socket) } @@ -146,8 +146,8 @@ public final class SocketRawAckView : NSObject { do { socket.emit(try items.map({ try $0.socketRepresentation() }), ack: ackNum, binary: false, isAck: true) - } catch let err { - socket.handleClientEvent(.error, data: [ackNum, items, err]) + } catch { + socket.handleClientEvent(.error, data: [ackNum, items, error]) } } From 2629449436017d880e456747a797a49bfb970c7b Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 7 Jun 2018 09:25:34 -0400 Subject: [PATCH 6/8] Fix tests so they don't rely on comparing strings or the order of hashed collections --- Cartfile.resolved | 4 +- .../TestSocketIO/SocketBasicPacketTest.swift | 157 +++++++++----- .../SocketNamespacePacketTest.swift | 203 ++++++++++++------ 3 files changed, 240 insertions(+), 124 deletions(-) diff --git a/Cartfile.resolved b/Cartfile.resolved index 0bff474..c433ad3 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,3 +1 @@ -github "daltoniam/Starscream" "3.0.4" -github "daltoniam/common-crypto-spm" "1.1.0" -github "daltoniam/zlib-spm" "1.1.0" +github "daltoniam/Starscream" "3.0.5" diff --git a/Tests/TestSocketIO/SocketBasicPacketTest.swift b/Tests/TestSocketIO/SocketBasicPacketTest.swift index b1c36ad..e833d61 100644 --- a/Tests/TestSocketIO/SocketBasicPacketTest.swift +++ b/Tests/TestSocketIO/SocketBasicPacketTest.swift @@ -9,143 +9,180 @@ import XCTest @testable import SocketIO -class SocketBasicPacketTest: XCTestCase { - let data = "test".data(using: String.Encoding.utf8)! - let data2 = "test2".data(using: String.Encoding.utf8)! - - func testEmpyEmit() { - let expectedSendString = "2[\"test\"]" +class SocketBasicPacketTest : XCTestCase { + func testEmptyEmit() { let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packetStr = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false).packetString + let parsed = parser.parseSocketMessage(packetStr)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .event) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } func testNullEmit() { - let expectedSendString = "2[\"test\",null]" let sendData: [Any] = ["test", NSNull()] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packetStr = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false).packetString + let parsed = parser.parseSocketMessage(packetStr)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .event) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } func testStringEmit() { - let expectedSendString = "2[\"test\",\"foo bar\"]" let sendData = ["test", "foo bar"] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packetStr = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false).packetString + let parsed = parser.parseSocketMessage(packetStr)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .event) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } func testStringEmitWithQuotes() { - let expectedSendString = "2[\"test\",\"\\\"he\\\"llo world\\\"\"]" let sendData = ["test", "\"he\"llo world\""] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packetStr = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false).packetString + let parsed = parser.parseSocketMessage(packetStr)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .event) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } func testJSONEmit() { - let expectedSendString = "2[\"test\",{\"null\":null,\"hello\":1,\"test\":\"hello\",\"foobar\":true}]" let sendData: [Any] = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packetStr = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false).packetString + let parsed = parser.parseSocketMessage(packetStr)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .event) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } func testArrayEmit() { - let expectedSendString = "2[\"test\",[\"hello\",1,{\"test\":\"test\"}]]" let sendData: [Any] = ["test", ["hello", 1, ["test": "test"]]] - let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let packetStr = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false).packetString + let parsed = parser.parseSocketMessage(packetStr)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .event) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } func testBinaryEmit() { - let expectedSendString = "51-[\"test\",{\"_placeholder\":true,\"num\":0}]" let sendData: [Any] = ["test", data] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let parsed = parser.parseSocketMessage(packet.packetString)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .binaryEvent) XCTAssertEqual(packet.binary, [data]) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: [ + "test", + ["_placeholder": true, "num": 0] + ])) } func testMultipleBinaryEmit() { - let expectedSendString = "52-[\"test\",{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]" let sendData: [Any] = ["test", ["data1": data, "data2": data2] as NSDictionary] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false) + let parsed = parser.parseSocketMessage(packet.packetString)! - XCTAssertEqual(packet.packetString, expectedSendString) - XCTAssertEqual(packet.binary, [data2, data]) + XCTAssertEqual(parsed.type, .binaryEvent) + + let binaryObj = parsed.data[1] as! [String: Any] + let data1Loc = (binaryObj["data1"] as! [String: Any])["num"] as! Int + let data2Loc = (binaryObj["data2"] as! [String: Any])["num"] as! Int + + XCTAssertEqual(packet.binary[data1Loc], data) + XCTAssertEqual(packet.binary[data2Loc], data2) } func testEmitWithAck() { - let expectedSendString = "20[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false) + let packetStr = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false).packetString + let parsed = parser.parseSocketMessage(packetStr)! - XCTAssertEqual(packet.packetString, - - expectedSendString) + XCTAssertEqual(parsed.type, .event) + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } func testEmitDataWithAck() { - let expectedSendString = "51-0[\"test\",{\"_placeholder\":true,\"num\":0}]" let sendData: [Any] = ["test", data] let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false) + let parsed = parser.parseSocketMessage(packet.packetString)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .binaryEvent) + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: [ + "test", + ["_placeholder": true, "num": 0] + ])) XCTAssertEqual(packet.binary, [data]) } // Acks func testEmptyAck() { - let expectedSendString = "30[]" - let packet = SocketPacket.packetFromEmit([], id: 0, nsp: "/", ack: true) + let packetStr = SocketPacket.packetFromEmit([], id: 0, nsp: "/", ack: true).packetString + let parsed = parser.parseSocketMessage(packetStr)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .ack) + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: [])) } func testNullAck() { - let expectedSendString = "30[null]" let sendData = [NSNull()] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let packetStr = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true).packetString + let parsed = parser.parseSocketMessage(packetStr)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .ack) + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } func testStringAck() { - let expectedSendString = "30[\"test\"]" let sendData = ["test"] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let packetStr = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true).packetString + let parsed = parser.parseSocketMessage(packetStr)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .ack) + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } func testJSONAck() { - let expectedSendString = "30[{\"null\":null,\"hello\":1,\"test\":\"hello\",\"foobar\":true}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] - let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let packetStr = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true).packetString + let parsed = parser.parseSocketMessage(packetStr)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .ack) + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } func testBinaryAck() { - let expectedSendString = "61-0[{\"_placeholder\":true,\"num\":0}]" let sendData = [data] let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let parsed = parser.parseSocketMessage(packet.packetString)! - XCTAssertEqual(packet.packetString, expectedSendString) + XCTAssertEqual(parsed.type, .binaryAck) XCTAssertEqual(packet.binary, [data]) + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: [ + ["_placeholder": true, "num": 0] + ])) } func testMultipleBinaryAck() { - let expectedSendString = "62-0[{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]" let sendData = [["data1": data, "data2": data2]] let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true) + let parsed = parser.parseSocketMessage(packet.packetString)! - XCTAssertEqual(packet.packetString, expectedSendString) - XCTAssertEqual(packet.binary, [data2, data]) + XCTAssertEqual(parsed.id, 0) + XCTAssertEqual(parsed.type, .binaryAck) + + let binaryObj = parsed.data[0] as! [String: Any] + let data1Loc = (binaryObj["data1"] as! [String: Any])["num"] as! Int + let data2Loc = (binaryObj["data2"] as! [String: Any])["num"] as! Int + + XCTAssertEqual(packet.binary[data1Loc], data) + XCTAssertEqual(packet.binary[data2Loc], data2) } func testBinaryStringPlaceholderInMessage() { @@ -159,4 +196,20 @@ class SocketBasicPacketTest: XCTestCase { _ = packet.addData(data2) XCTAssertEqual(packet.args[0] as? String, "~~0") } + + private func compareAnyArray(input: [Any], expected: [Any]) -> Bool { + guard input.count == expected.count else { return false } + + return (input as NSArray).isEqual(to: expected) + } + + let data = "test".data(using: String.Encoding.utf8)! + let data2 = "test2".data(using: String.Encoding.utf8)! + var parser: SocketParsable! + + override func setUp() { + super.setUp() + + parser = SocketManager(socketURL: URL(string: "http://localhost")!) + } } diff --git a/Tests/TestSocketIO/SocketNamespacePacketTest.swift b/Tests/TestSocketIO/SocketNamespacePacketTest.swift index 51a7ba4..d257453 100644 --- a/Tests/TestSocketIO/SocketNamespacePacketTest.swift +++ b/Tests/TestSocketIO/SocketNamespacePacketTest.swift @@ -9,133 +9,198 @@ import XCTest @testable import SocketIO -class SocketNamespacePacketTest: XCTestCase { - let data = "test".data(using: String.Encoding.utf8)! - let data2 = "test2".data(using: String.Encoding.utf8)! - - func testEmpyEmit() { - let expectedSendString = "2/swift,[\"test\"]" +class SocketNamespacePacketTest : XCTestCase { + func testEmptyEmit() { let sendData: [Any] = ["test"] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) - - XCTAssertEqual(packet.packetString, expectedSendString) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .event) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } - + func testNullEmit() { - let expectedSendString = "2/swift,[\"test\",null]" let sendData: [Any] = ["test", NSNull()] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) - - XCTAssertEqual(packet.packetString, expectedSendString) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .event) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } - + func testStringEmit() { - let expectedSendString = "2/swift,[\"test\",\"foo bar\"]" let sendData: [Any] = ["test", "foo bar"] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) - - XCTAssertEqual(packet.packetString, expectedSendString) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .event) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } - + func testJSONEmit() { - let expectedSendString = "2/swift,[\"test\",{\"null\":null,\"test\":\"hello\",\"hello\":1,\"foobar\":true}]" let sendData: [Any] = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()] as NSDictionary] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) - - XCTAssertEqual(packet.packetString, expectedSendString) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .event) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } - + func testArrayEmit() { - let expectedSendString = "2/swift,[\"test\",[\"hello\",1,{\"test\":\"test\"},true]]" let sendData: [Any] = ["test", ["hello", 1, ["test": "test"], true]] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) - - - XCTAssertEqual(packet.packetString, expectedSendString) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .event) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } - + func testBinaryEmit() { - let expectedSendString = "51-/swift,[\"test\",{\"_placeholder\":true,\"num\":0}]" let sendData: [Any] = ["test", data] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) - - XCTAssertEqual(packet.packetString, expectedSendString) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .binaryEvent) + XCTAssertEqual(parsed.nsp, "/swift") XCTAssertEqual(packet.binary, [data]) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: [ + "test", + ["_placeholder": true, "num": 0] + ])) } - + func testMultipleBinaryEmit() { - let expectedSendString = "52-/swift,[\"test\",{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]" let sendData: [Any] = ["test", ["data1": data, "data2": data2] as NSDictionary] let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/swift", ack: false) - - XCTAssertEqual(packet.packetString, expectedSendString) - XCTAssertEqual(packet.binary, [data2, data]) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .binaryEvent) + XCTAssertEqual(parsed.nsp, "/swift") + + let binaryObj = parsed.data[1] as! [String: Any] + let data1Loc = (binaryObj["data1"] as! [String: Any])["num"] as! Int + let data2Loc = (binaryObj["data2"] as! [String: Any])["num"] as! Int + + XCTAssertEqual(packet.binary[data1Loc], data) + XCTAssertEqual(packet.binary[data2Loc], data2) } - + func testEmitWithAck() { - let expectedSendString = "2/swift,0[\"test\"]" let sendData = ["test"] let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: false) - - XCTAssertEqual(packet.packetString, expectedSendString) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .event) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } - + func testEmitDataWithAck() { - let expectedSendString = "51-/swift,0[\"test\",{\"_placeholder\":true,\"num\":0}]" let sendData: [Any] = ["test", data] let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: false) - - XCTAssertEqual(packet.packetString, expectedSendString) - XCTAssertEqual(packet.binary, [data]) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .binaryEvent) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: [ + "test", + ["_placeholder": true, "num": 0] + ])) } - + // Acks func testEmptyAck() { - let expectedSendString = "3/swift,0[]" let packet = SocketPacket.packetFromEmit([], id: 0, nsp: "/swift", ack: true) - - XCTAssertEqual(packet.packetString, expectedSendString) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .ack) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertEqual(parsed.id, 0) } - + func testNullAck() { - let expectedSendString = "3/swift,0[null]" let sendData = [NSNull()] let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) - - XCTAssertEqual(packet.packetString, expectedSendString) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .ack) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } - + func testStringAck() { - let expectedSendString = "3/swift,0[\"test\"]" let sendData = ["test"] let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) - - XCTAssertEqual(packet.packetString, expectedSendString) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .ack) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } - + func testJSONAck() { - let expectedSendString = "3/swift,0[{\"null\":null,\"hello\":1,\"test\":\"hello\",\"foobar\":true}]" let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]] let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) - - XCTAssertEqual(packet.packetString, expectedSendString) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .ack) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData)) } - + func testBinaryAck() { - let expectedSendString = "61-/swift,0[{\"_placeholder\":true,\"num\":0}]" let sendData = [data] let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) - - XCTAssertEqual(packet.packetString, expectedSendString) - XCTAssertEqual(packet.binary, [data]) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .binaryAck) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertEqual(parsed.id, 0) + XCTAssertTrue(compareAnyArray(input: parsed.data, expected: [ + ["_placeholder": true, "num": 0] + ])) } - + func testMultipleBinaryAck() { - let expectedSendString = "62-/swift,0[{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]" let sendData = [["data1": data, "data2": data2]] let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/swift", ack: true) - - XCTAssertEqual(packet.packetString, expectedSendString) - XCTAssertEqual(packet.binary, [data2, data]) + let parsed = parser.parseSocketMessage(packet.packetString)! + + XCTAssertEqual(parsed.type, .binaryAck) + XCTAssertEqual(parsed.nsp, "/swift") + XCTAssertEqual(parsed.id, 0) + + let binaryObj = parsed.data[0] as! [String: Any] + let data1Loc = (binaryObj["data1"] as! [String: Any])["num"] as! Int + let data2Loc = (binaryObj["data2"] as! [String: Any])["num"] as! Int + + XCTAssertEqual(packet.binary[data1Loc], data) + XCTAssertEqual(packet.binary[data2Loc], data2) + } + + let data = "test".data(using: String.Encoding.utf8)! + let data2 = "test2".data(using: String.Encoding.utf8)! + var parser: SocketParsable! + + private func compareAnyArray(input: [Any], expected: [Any]) -> Bool { + guard input.count == expected.count else { return false } + + return (input as NSArray).isEqual(to: expected) + } + + override func setUp() { + super.setUp() + + parser = SocketManager(socketURL: URL(string: "http://localhost")!) } } From 884cc6f8f101b71d66cff1a4c0d9176f0449d0c3 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 7 Jun 2018 09:31:52 -0400 Subject: [PATCH 7/8] update starscream for spm --- Package.resolved | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.resolved b/Package.resolved index 88064dd..0c163c0 100644 --- a/Package.resolved +++ b/Package.resolved @@ -15,8 +15,8 @@ "repositoryURL": "https://github.com/daltoniam/Starscream", "state": { "branch": null, - "revision": "6cb1c474e09b0a3aa60bcdc7553b570336d6a61a", - "version": "3.0.3" + "revision": "114e5df9b6251970a069e8f1c0cbb5802759f0a9", + "version": "3.0.5" } }, { From 2cc47b01175f7e7bcd58059e7e3f955c0f27f249 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 7 Jun 2018 09:49:04 -0400 Subject: [PATCH 8/8] update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7a3dc9..5575ba3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# v13.2.1 + +- Fix packets getting lost when WebSocket upgrade fails. [#1033](https://github.com/socketio/socket.io-client-swift/issues/1033) +- Fix bad unit tests. [#794](https://github.com/socketio/socket.io-client-swift/issues/794) + # v13.2.0 - Add ability to bypass Data inspection in emits. [#992]((https://github.com/socketio/socket.io-client-swift/issues/992))