From 224c660e4c33e047db14f4ad5cd68f14bbffc1a4 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Fri, 24 Jul 2015 19:55:35 +0200 Subject: [PATCH 01/25] basic test structure / tests --- .../project.pbxproj | 26 +++++++++ SocketIO-iOSTests/SocketIO_iOSTests.swift | 54 +++++++++++++++---- 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index a54247f..acac5a0 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -39,6 +39,19 @@ 5764DFA01B51F254004FF46E /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 5764DFA11B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 5764DFA21B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; + 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; + 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */; }; + 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7E1B51F254004FF46E /* SocketEngine.swift */; }; + 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7F1B51F254004FF46E /* SocketEngineClient.swift */; }; + 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF801B51F254004FF46E /* SocketEventHandler.swift */; }; + 945B653A1B5FCEEA0081E995 /* SocketFixUTF8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF811B51F254004FF46E /* SocketFixUTF8.swift */; }; + 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF821B51F254004FF46E /* SocketIOClient.swift */; }; + 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF831B51F254004FF46E /* SocketLogger.swift */; }; + 945B653D1B5FCEEA0081E995 /* SocketPacket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF841B51F254004FF46E /* SocketPacket.swift */; }; + 945B653E1B5FCEEA0081E995 /* SocketParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF851B51F254004FF46E /* SocketParser.swift */; }; + 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF861B51F254004FF46E /* SocketTypes.swift */; }; + 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; + 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -424,7 +437,20 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 945B653E1B5FCEEA0081E995 /* SocketParser.swift in Sources */, + 945B653D1B5FCEEA0081E995 /* SocketPacket.swift in Sources */, + 945B653A1B5FCEEA0081E995 /* SocketFixUTF8.swift in Sources */, + 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */, + 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, + 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, + 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, 572EF22C1B51F16C00EEBB58 /* SocketIO_iOSTests.swift in Sources */, + 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, + 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */, + 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */, + 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */, + 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */, + 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/SocketIO-iOSTests/SocketIO_iOSTests.swift b/SocketIO-iOSTests/SocketIO_iOSTests.swift index 8e9aad8..d1914ec 100644 --- a/SocketIO-iOSTests/SocketIO_iOSTests.swift +++ b/SocketIO-iOSTests/SocketIO_iOSTests.swift @@ -10,27 +10,63 @@ import UIKit import XCTest class SocketIO_iOSTests: XCTestCase { + var socketClient:SocketIOClient! override func setUp() { super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. + self.socketClient = SocketIOClient(socketURL: "localhost:8080") + openConnection() } override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. super.tearDown() } - func testExample() { - // This is an example of a functional test case. - XCTAssert(true, "Pass") + func testConnectionStatus() { + XCTAssertTrue(socketClient.connected) + XCTAssertFalse(socketClient.connecting) + XCTAssertFalse(socketClient.reconnecting) + XCTAssertFalse(socketClient.closed) } - func testPerformanceExample() { - // This is an example of a performance test case. - self.measureBlock() { - // Put the code you want to measure the time of here. + func testeventWithAcknowledgements() { + let sendedValue = 15; + let expection = self.expectationWithDescription("AcknowledgementTestIncomming") + func didGetEmit(result:NSArray?) { + let resultValue = result?.firstObject as! Int + XCTAssertEqual(sendedValue + 20, resultValue) + expection.fulfill() } + socketClient.emitWithAck("AcknowledgementTestIncomming", sendedValue)(timeout: 0, callback: didGetEmit) + waitForExpectationsWithTimeout(10, handler: nil) + } + + func testoutGoingEmit() { + let sendedValue = 15; + let expection = self.expectationWithDescription("firstEmitTestIncomming") + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + let resultValue = result?.firstObject as! Int + XCTAssertEqual(sendedValue + 10, resultValue) + expection.fulfill() + } + socketClient.on("firstEmitTestOutGoing", callback: didGetEmit) + socketClient.emit("firstEmitTestIncomming", sendedValue) + waitForExpectationsWithTimeout(10, handler: nil) + } + + func openConnection() { + let expection = self.expectationWithDescription("connect") + socketClient.on("connect") {data, ack in + expection.fulfill() + } + socketClient.connect() + XCTAssertTrue(socketClient.connecting) + waitForExpectationsWithTimeout(10, handler: nil) + } + + func testCloseConnection() { + socketClient.close(fast: false) + XCTAssertTrue(socketClient.closed) } } From 4b9db85a49dbbf55b645c2e43d47582f66668a21 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Fri, 24 Jul 2015 20:11:47 +0200 Subject: [PATCH 02/25] update api --- SocketIO-iOSTests/SocketIO_iOSTests.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SocketIO-iOSTests/SocketIO_iOSTests.swift b/SocketIO-iOSTests/SocketIO_iOSTests.swift index d1914ec..c91a0de 100644 --- a/SocketIO-iOSTests/SocketIO_iOSTests.swift +++ b/SocketIO-iOSTests/SocketIO_iOSTests.swift @@ -27,6 +27,7 @@ class SocketIO_iOSTests: XCTestCase { XCTAssertFalse(socketClient.connecting) XCTAssertFalse(socketClient.reconnecting) XCTAssertFalse(socketClient.closed) + XCTAssertFalse(socketClient.secure) } func testeventWithAcknowledgements() { @@ -37,7 +38,7 @@ class SocketIO_iOSTests: XCTestCase { XCTAssertEqual(sendedValue + 20, resultValue) expection.fulfill() } - socketClient.emitWithAck("AcknowledgementTestIncomming", sendedValue)(timeout: 0, callback: didGetEmit) + socketClient.emitWithAck("AcknowledgementTestIncomming", sendedValue)(timeoutAfter: 0, callback: didGetEmit) waitForExpectationsWithTimeout(10, handler: nil) } From a07916fb2f437ff3f18392ae2bb70461a5843fd7 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sat, 25 Jul 2015 18:45:41 +0200 Subject: [PATCH 03/25] basic emit tests --- .../project.pbxproj | 4 + SocketIO-iOSTests/ConvertedSocketTest.swift | 190 ++++++++++++++++++ 2 files changed, 194 insertions(+) create mode 100644 SocketIO-iOSTests/ConvertedSocketTest.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index acac5a0..01c833d 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -52,6 +52,7 @@ 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF861B51F254004FF46E /* SocketTypes.swift */; }; 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; + 945B65431B63D9DB0081E995 /* ConvertedSocketTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -97,6 +98,7 @@ 5764DF861B51F254004FF46E /* SocketTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketTypes.swift; path = SocketIOClientSwift/SocketTypes.swift; sourceTree = ""; }; 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = ""; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = ""; }; + 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConvertedSocketTest.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -176,6 +178,7 @@ 572EF2281B51F16C00EEBB58 /* SocketIO-iOSTests */ = { isa = PBXGroup; children = ( + 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */, 572EF22B1B51F16C00EEBB58 /* SocketIO_iOSTests.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); @@ -443,6 +446,7 @@ 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */, 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, + 945B65431B63D9DB0081E995 /* ConvertedSocketTest.swift in Sources */, 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, 572EF22C1B51F16C00EEBB58 /* SocketIO_iOSTests.swift in Sources */, 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, diff --git a/SocketIO-iOSTests/ConvertedSocketTest.swift b/SocketIO-iOSTests/ConvertedSocketTest.swift new file mode 100644 index 0000000..fed9352 --- /dev/null +++ b/SocketIO-iOSTests/ConvertedSocketTest.swift @@ -0,0 +1,190 @@ +// +// ConvertedSocketTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 25.07.15. +// +// + +import XCTest +import Foundation + +class ConvertedSocketTest: XCTestCase { + + var socket:SocketIOClient! + + + let headers = ["testing": "blah", "testing2": "b/:lah"] + let testCytube = false + + override func setUp() { + super.setUp() + if testCytube { + socket = SocketIOClient(socketURL: "https://cytu.be:10443", opts: [ + "forcePolling": false, + "forceWebsockets": false, + "log": true + ]) + } else { + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "nsp": "/swift", + "path": "", + "extraHeaders": headers, + // "connectParams": [ + // "test": 2.1, + // "d": "{}" + // ], + //"cookies": cookieArray + ]) + } + openConnection() + } + + override func tearDown() { + + super.tearDown() + } + + func openConnection() { + let expection = self.expectationWithDescription("connect") + socket.on("connect") {data, ack in + expection.fulfill() + } + socket.connect() + XCTAssertTrue(socket.connecting) + waitForExpectationsWithTimeout(5, handler: nil) + } + + func testConnectionStatus() { + XCTAssertTrue(socket.connected) + XCTAssertFalse(socket.connecting) + XCTAssertFalse(socket.reconnecting) + XCTAssertFalse(socket.closed) + XCTAssertFalse(socket.secure) + } + + func testEmit() { + let testName = "testEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + + } + abstractSocketEmitTest(testName, emitData: nil, callback: didGetEmit) + } + + func testEmitNull() { + let testName = "testEmitNull" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let _ = result?.firstObject as? NSNull { + + }else + { + XCTFail("Should have NSNull as result") + } + } + abstractSocketEmitTest(testName, emitData: NSNull(), callback: didGetEmit) + } + + func testEmitBinary() { + let testName = "testEmitBinary" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let data = result?.firstObject as? NSData { + let string = NSString(data: data, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSData as result") + } + } + let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! + abstractSocketEmitTest(testName, emitData: data, callback: didGetEmit) + } + + func testArrayEmit() { + let testName = "testEmitArray" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let array = result?.firstObject as? NSArray { + XCTAssertEqual(array.count, 2) + XCTAssertEqual(array.firstObject! as! String, "test3") + }else { + XCTFail("Should have NSArray as result") + } + } + abstractSocketEmitTest(testName, emitData: ["test1", "test2"], callback: didGetEmit) + } + + func testStringEmit() { + let testName = "testStringEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let string = result?.firstObject as? String { + XCTAssertEqual(string, "polo") + }else { + XCTFail("Should have String as result") + } + } + abstractSocketEmitTest(testName, emitData: "marco", callback: didGetEmit) + } + + func testBoolEmit() { + let testName = "testBoolEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let bool = result?.firstObject as? NSNumber { + XCTAssertTrue(bool.boolValue) + }else { + XCTFail("Should have Boolean as result") + } + } + abstractSocketEmitTest(testName, emitData: false, callback: didGetEmit) + } + + func testIntegerEmit() { + let testName = "testIntegerEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let integer = result?.firstObject as? Int { + XCTAssertEqual(integer, 20) + }else { + XCTFail("Should have Integer as result") + } + } + abstractSocketEmitTest(testName, emitData: 10, callback: didGetEmit) + } + + func testDoubleEmit() { + let testName = "testDoubleEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let double = result?.firstObject as? NSNumber { + XCTAssertEqual(double.floatValue, 1.2) + }else { + XCTFail("Should have String as result") + } + } + abstractSocketEmitTest(testName, emitData: 1.1, callback: didGetEmit) + } + + + func abstractSocketEmitTest(testName:String, emitData:AnyObject?, callback:NormalCallback){ + let expection = self.expectationWithDescription(testName) + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + callback(result, ack) + expection.fulfill() + } + + socket.on(testName + "Return", callback: didGetEmit) + if let emitData = emitData { + socket.emit(testName, emitData) + } else { + socket.emit(testName) + } + + waitForExpectationsWithTimeout(5, handler: nil) + } + + func testCloseConnection() { +// socket.close(fast: false) +// XCTAssertTrue(socket.closed) + } + +} From aa6db7c837ccc32eeff817b50b18119ccf8f7980 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 26 Jul 2015 12:42:18 +0200 Subject: [PATCH 04/25] remove old files --- .../project.pbxproj | 4 - SocketIO-iOSTests/SocketIO_iOSTests.swift | 73 ------------------- 2 files changed, 77 deletions(-) delete mode 100644 SocketIO-iOSTests/SocketIO_iOSTests.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 01c833d..053773a 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* Begin PBXBuildFile section */ 572EF21F1B51F16C00EEBB58 /* SocketIO-iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 572EF2251B51F16C00EEBB58 /* SocketIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572EF2191B51F16C00EEBB58 /* SocketIO.framework */; }; - 572EF22C1B51F16C00EEBB58 /* SocketIO_iOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 572EF22B1B51F16C00EEBB58 /* SocketIO_iOSTests.swift */; }; 572EF23D1B51F18A00EEBB58 /* SocketIO-Mac.h in Headers */ = {isa = PBXBuildFile; fileRef = 572EF23C1B51F18A00EEBB58 /* SocketIO-Mac.h */; settings = {ATTRIBUTES = (Public, ); }; }; 572EF2431B51F18A00EEBB58 /* SocketIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572EF2381B51F18A00EEBB58 /* SocketIO.framework */; }; 572EF24A1B51F18A00EEBB58 /* SocketIO_MacTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 572EF2491B51F18A00EEBB58 /* SocketIO_MacTests.swift */; }; @@ -78,7 +77,6 @@ 572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SocketIO-iOS.h"; sourceTree = ""; }; 572EF2241B51F16C00EEBB58 /* SocketIO-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SocketIO-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 572EF22A1B51F16C00EEBB58 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 572EF22B1B51F16C00EEBB58 /* SocketIO_iOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocketIO_iOSTests.swift; sourceTree = ""; }; 572EF2381B51F18A00EEBB58 /* SocketIO.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SocketIO.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 572EF23B1B51F18A00EEBB58 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 572EF23C1B51F18A00EEBB58 /* SocketIO-Mac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SocketIO-Mac.h"; sourceTree = ""; }; @@ -179,7 +177,6 @@ isa = PBXGroup; children = ( 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */, - 572EF22B1B51F16C00EEBB58 /* SocketIO_iOSTests.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; @@ -448,7 +445,6 @@ 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, 945B65431B63D9DB0081E995 /* ConvertedSocketTest.swift in Sources */, 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, - 572EF22C1B51F16C00EEBB58 /* SocketIO_iOSTests.swift in Sources */, 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */, 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */, diff --git a/SocketIO-iOSTests/SocketIO_iOSTests.swift b/SocketIO-iOSTests/SocketIO_iOSTests.swift deleted file mode 100644 index c91a0de..0000000 --- a/SocketIO-iOSTests/SocketIO_iOSTests.swift +++ /dev/null @@ -1,73 +0,0 @@ -// -// SocketIO_iOSTests.swift -// SocketIO-iOSTests -// -// Created by Nacho Soto on 7/11/15. -// -// - -import UIKit -import XCTest - -class SocketIO_iOSTests: XCTestCase { - var socketClient:SocketIOClient! - - override func setUp() { - super.setUp() - self.socketClient = SocketIOClient(socketURL: "localhost:8080") - openConnection() - } - - override func tearDown() { - super.tearDown() - } - - func testConnectionStatus() { - XCTAssertTrue(socketClient.connected) - XCTAssertFalse(socketClient.connecting) - XCTAssertFalse(socketClient.reconnecting) - XCTAssertFalse(socketClient.closed) - XCTAssertFalse(socketClient.secure) - } - - func testeventWithAcknowledgements() { - let sendedValue = 15; - let expection = self.expectationWithDescription("AcknowledgementTestIncomming") - func didGetEmit(result:NSArray?) { - let resultValue = result?.firstObject as! Int - XCTAssertEqual(sendedValue + 20, resultValue) - expection.fulfill() - } - socketClient.emitWithAck("AcknowledgementTestIncomming", sendedValue)(timeoutAfter: 0, callback: didGetEmit) - waitForExpectationsWithTimeout(10, handler: nil) - } - - func testoutGoingEmit() { - let sendedValue = 15; - let expection = self.expectationWithDescription("firstEmitTestIncomming") - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - let resultValue = result?.firstObject as! Int - XCTAssertEqual(sendedValue + 10, resultValue) - expection.fulfill() - } - socketClient.on("firstEmitTestOutGoing", callback: didGetEmit) - socketClient.emit("firstEmitTestIncomming", sendedValue) - waitForExpectationsWithTimeout(10, handler: nil) - } - - func openConnection() { - let expection = self.expectationWithDescription("connect") - socketClient.on("connect") {data, ack in - expection.fulfill() - } - socketClient.connect() - XCTAssertTrue(socketClient.connecting) - waitForExpectationsWithTimeout(10, handler: nil) - } - - func testCloseConnection() { - socketClient.close(fast: false) - XCTAssertTrue(socketClient.closed) - } - -} From a1af98e1731de939c4b464ad95596e7b6f9f0e8f Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 26 Jul 2015 16:58:08 +0200 Subject: [PATCH 05/25] refactor --- .../project.pbxproj | 8 +- ...dSocketTest.swift => SocketEmitTest.swift} | 97 +++++++++++++++---- 2 files changed, 84 insertions(+), 21 deletions(-) rename SocketIO-iOSTests/{ConvertedSocketTest.swift => SocketEmitTest.swift} (60%) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 053773a..75f5ac1 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -51,7 +51,7 @@ 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF861B51F254004FF46E /* SocketTypes.swift */; }; 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; - 945B65431B63D9DB0081E995 /* ConvertedSocketTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */; }; + 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -96,7 +96,7 @@ 5764DF861B51F254004FF46E /* SocketTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketTypes.swift; path = SocketIOClientSwift/SocketTypes.swift; sourceTree = ""; }; 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = ""; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = ""; }; - 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConvertedSocketTest.swift; sourceTree = ""; }; + 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -176,7 +176,7 @@ 572EF2281B51F16C00EEBB58 /* SocketIO-iOSTests */ = { isa = PBXGroup; children = ( - 945B65421B63D9DB0081E995 /* ConvertedSocketTest.swift */, + 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; @@ -443,7 +443,7 @@ 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */, 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, - 945B65431B63D9DB0081E995 /* ConvertedSocketTest.swift in Sources */, + 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */, 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */, diff --git a/SocketIO-iOSTests/ConvertedSocketTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift similarity index 60% rename from SocketIO-iOSTests/ConvertedSocketTest.swift rename to SocketIO-iOSTests/SocketEmitTest.swift index fed9352..d2866d6 100644 --- a/SocketIO-iOSTests/ConvertedSocketTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -9,8 +9,8 @@ import XCTest import Foundation -class ConvertedSocketTest: XCTestCase { - +class SocketEmitTest: XCTestCase { + private static let TEST_TIMEOUT = 20.0 var socket:SocketIOClient! @@ -32,15 +32,8 @@ class ConvertedSocketTest: XCTestCase { "reconnectWait": 5, // default 10 "forcePolling": false, "forceWebsockets": false,// default false - "nsp": "/swift", "path": "", - "extraHeaders": headers, - // "connectParams": [ - // "test": 2.1, - // "d": "{}" - // ], - //"cookies": cookieArray - ]) + "extraHeaders": headers]) } openConnection() } @@ -158,11 +151,86 @@ class ConvertedSocketTest: XCTestCase { if let double = result?.firstObject as? NSNumber { XCTAssertEqual(double.floatValue, 1.2) }else { - XCTFail("Should have String as result") + XCTFail("Should have Double as result") } } abstractSocketEmitTest(testName, emitData: 1.1, callback: didGetEmit) } + + func testJSONEmit() { + let testName = "testJSONEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let json = result?.firstObject as? NSDictionary { + XCTAssertEqual(json.valueForKey("testString")! as! String, "test") + XCTAssertEqual(json.valueForKey("testNumber")! as! Int, 15) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).count, 2) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as! Int, 1) + let string = NSString(data: (json.valueForKey("testArray")! as! Array).first! as! NSData, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSDictionary as result") + } + } + let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] + + abstractSocketEmitTest(testName, emitData: json, callback: didGetEmit) + } + + func testUnicodeEmit() { + let testName = "testUnicodeEmit" + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + if let unicode = result?.firstObject as? String { + XCTAssertEqual(unicode, "🚄") + }else { + XCTFail("Should have String as result") + } + } + abstractSocketEmitTest(testName, emitData: "🚀", callback: didGetEmit) + } + + func testMultipleItemsEmit() { + let testName = "testMultipleItemsEmit" + let expection = self.expectationWithDescription(testName) + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + XCTAssertEqual(result!.count, 5) + if let array = result?.firstObject as? Array { + XCTAssertEqual(array.last! as! Int, 2) + let string = NSString(data: array.first! as! NSData, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have Array as result") + } + if let dict = result?[1] as? NSDictionary { + XCTAssertEqual(dict.valueForKey("test") as! String, "bob") + + }else { + XCTFail("Should have NSDictionary as result") + } + if let number = result?[2] as? Int { + XCTAssertEqual(number, 25) + + }else { + XCTFail("Should have Integer as result") + } + if let string = result?[3] as? String { + XCTAssertEqual(string, "polo") + + }else { + XCTFail("Should have Integer as result") + } + if let data = result?[4] as? NSData { + let string = NSString(data: data, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSData as result") + } + expection.fulfill() + } + let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! + socket.emit(testName, withItems: [["test1", "test2"], ["test": "test"], 15, "marco", data]) + socket.on(testName + "Return", callback: didGetEmit) + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } func abstractSocketEmitTest(testName:String, emitData:AnyObject?, callback:NormalCallback){ @@ -179,12 +247,7 @@ class ConvertedSocketTest: XCTestCase { socket.emit(testName) } - waitForExpectationsWithTimeout(5, handler: nil) - } - - func testCloseConnection() { -// socket.close(fast: false) -// XCTAssertTrue(socket.closed) + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) } } From a4988e6404510e7d6945a776b1623137ab379e98 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 26 Jul 2015 17:14:21 +0200 Subject: [PATCH 06/25] namespace tests --- .../project.pbxproj | 4 + SocketIO-iOSTests/SocketEmitTest.swift | 2 +- .../SocketNamespaceEmitTest.swift | 89 +++++++++++++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 SocketIO-iOSTests/SocketNamespaceEmitTest.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 75f5ac1..041d1bb 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -52,6 +52,7 @@ 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */; }; + 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -97,6 +98,7 @@ 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = ""; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = ""; }; 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = ""; }; + 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -178,6 +180,7 @@ children = ( 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, + 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, ); path = "SocketIO-iOSTests"; sourceTree = ""; @@ -450,6 +453,7 @@ 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */, 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */, 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */, + 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */, 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index d2866d6..d669070 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -39,7 +39,7 @@ class SocketEmitTest: XCTestCase { } override func tearDown() { - + socket.close(fast: false) super.tearDown() } diff --git a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift new file mode 100644 index 0000000..8e50c11 --- /dev/null +++ b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift @@ -0,0 +1,89 @@ +// +// SocketNamespaceEmitTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 26.07.15. +// +// + +import XCTest + +class SocketNamespaceEmitTest: SocketEmitTest { + + override func setUp() { + super.setUp() + if testCytube { + socket = SocketIOClient(socketURL: "https://cytu.be:10443", opts: [ + "forcePolling": false, + "forceWebsockets": false, + "log": true + ]) + } else { + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": "", + "nsp": "/swift", + "extraHeaders": headers]) + } + openConnection() + + } + + override func tearDown() { + socket.close(fast: false) + super.tearDown() + } + + override func testConnectionStatus() { + super.testConnectionStatus() + } + + override func testEmit() { + super.testEmit() + } + + override func testEmitNull() { + super.testEmitNull() + } + + override func testEmitBinary() { + super.testEmitBinary() + } + + override func testArrayEmit() { + super.testArrayEmit() + } + + override func testStringEmit() { + super.testStringEmit() + } + + override func testBoolEmit() { + super.testBoolEmit() + } + + override func testIntegerEmit() { + super.testIntegerEmit() + } + + override func testDoubleEmit() { + super.testDoubleEmit() + } + + override func testJSONEmit() { + super.testJSONEmit() + } + + override func testUnicodeEmit() { + super.testUnicodeEmit() + } + + override func testMultipleItemsEmit() { + super.testMultipleItemsEmit() + } + +} From 252181b0c5428d3357bcff6856a4d7adb4129994 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Mon, 27 Jul 2015 11:33:41 +0200 Subject: [PATCH 07/25] clean up --- .../project.pbxproj | 2 +- SocketIO-iOSTests/SocketEmitTest.swift | 25 ++++++------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 041d1bb..c3dc8fc 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -179,8 +179,8 @@ isa = PBXGroup; children = ( 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */, - 572EF2291B51F16C00EEBB58 /* Supporting Files */, 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, + 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; sourceTree = ""; diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index d669070..1e599c5 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -15,26 +15,17 @@ class SocketEmitTest: XCTestCase { let headers = ["testing": "blah", "testing2": "b/:lah"] - let testCytube = false override func setUp() { super.setUp() - if testCytube { - socket = SocketIOClient(socketURL: "https://cytu.be:10443", opts: [ - "forcePolling": false, - "forceWebsockets": false, - "log": true - ]) - } else { - socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ - "reconnects": true, // default true - "reconnectAttempts": -1, // default -1 - "reconnectWait": 5, // default 10 - "forcePolling": false, - "forceWebsockets": false,// default false - "path": "", - "extraHeaders": headers]) - } + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": "", + "extraHeaders": headers]) openConnection() } From 3c9c473e7087ad764c77f524aee0983845f93f2e Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 27 Jul 2015 17:12:57 -0400 Subject: [PATCH 08/25] clean up socketpacket --- SocketIOClientSwift/SocketPacket.swift | 62 ++++++++++++++------------ 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 1287f3b..9ce91bb 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -73,22 +73,6 @@ struct SocketPacket { self.binary = binary } - static func packetFromEmitWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { - let (parsedData, binary) = deconstructData(data) - let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData, - id: id, nsp: nsp, placeholders: -1, binary: binary) - - return packet - } - - static func packetFromEmitAckWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { - let (parsedData, binary) = deconstructData(data) - let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData, - id: id, nsp: nsp, placeholders: -1, binary: binary) - - return packet - } - mutating func addData(data:NSData) -> Bool { if placeholders == currentPlace { return true @@ -144,7 +128,7 @@ struct SocketPacket { } func createAck() -> String { - var msg:String + let msg:String if type == PacketType.ACK { if nsp == "/" { @@ -242,6 +226,23 @@ struct SocketPacket { } } + func getEvent() -> String { + return data[0] as! String + } + + func getArgs() -> [AnyObject]? { + var arr = data + + if data.count == 0 { + return nil + } else { + arr.removeAtIndex(0) + return arr + } + } +} + +extension SocketPacket { private static func findType(binCount:Int, ack:Bool) -> PacketType { switch binCount { case 0 where !ack: @@ -257,21 +258,24 @@ struct SocketPacket { } } - func getEvent() -> String { - return data[0] as! String - } - - func getArgs() -> [AnyObject]? { - var arr = data + static func packetFromEmitWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { + let (parsedData, binary) = deconstructData(data) + let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData, + id: id, nsp: nsp, placeholders: -1, binary: binary) - if data.count == 0 { - return nil - } else { - arr.removeAtIndex(0) - return arr - } + return packet } + static func packetFromEmitAckWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { + let (parsedData, binary) = deconstructData(data) + let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData, + id: id, nsp: nsp, placeholders: -1, binary: binary) + + return packet + } +} + +extension SocketPacket { private static func shred(data:AnyObject, inout binary:[NSData]) -> AnyObject { if let bin = data as? NSData { let placeholder = ["_placeholder" :true, "num": binary.count] From e7920062452711093eecfac3864f8a0187b27e86 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 27 Jul 2015 18:50:12 -0400 Subject: [PATCH 09/25] change to default session config --- SocketIOClientSwift/SocketEngine.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 86f4b5c..f26f050 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -99,7 +99,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { public init(client:SocketEngineClient, sessionDelegate:NSURLSessionDelegate?) { self.client = client - self.session = NSURLSession(configuration: NSURLSessionConfiguration.ephemeralSessionConfiguration(), + self.session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: sessionDelegate, delegateQueue: workQueue) } From b1b9a7edaf273ad28fbde9748b5a714aed48beef Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Tue, 28 Jul 2015 14:25:15 +0200 Subject: [PATCH 10/25] more tests --- .../project.pbxproj | 8 ++ .../SocketAcknowledgementTest.swift | 93 +++++++++++++++++++ SocketIO-iOSTests/SocketEmitTest.swift | 37 ++++---- .../SocketNamespaceEmitTest.swift | 9 -- SocketIO-iOSTests/TestKind.swift | 13 +++ 5 files changed, 133 insertions(+), 27 deletions(-) create mode 100644 SocketIO-iOSTests/SocketAcknowledgementTest.swift create mode 100644 SocketIO-iOSTests/TestKind.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index c3dc8fc..03e8493 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -38,6 +38,7 @@ 5764DFA01B51F254004FF46E /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 5764DFA11B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 5764DFA21B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; + 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941A4AB91B67A56C00C42318 /* TestKind.swift */; }; 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */; }; 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7E1B51F254004FF46E /* SocketEngine.swift */; }; @@ -53,6 +54,7 @@ 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */; }; 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; }; + 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -97,8 +99,10 @@ 5764DF861B51F254004FF46E /* SocketTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketTypes.swift; path = SocketIOClientSwift/SocketTypes.swift; sourceTree = ""; }; 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = ""; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = ""; }; + 941A4AB91B67A56C00C42318 /* TestKind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestKind.swift; sourceTree = ""; }; 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = ""; }; 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = ""; }; + 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAcknowledgementTest.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -180,7 +184,9 @@ children = ( 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */, 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, + 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, + 941A4AB91B67A56C00C42318 /* TestKind.swift */, ); path = "SocketIO-iOSTests"; sourceTree = ""; @@ -446,11 +452,13 @@ 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */, 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, + 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */, 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */, 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */, 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */, + 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */, 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */, 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */, 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */, diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift new file mode 100644 index 0000000..e8f6633 --- /dev/null +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -0,0 +1,93 @@ +// +// SocketAcknowledgementTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 27.07.15. +// +// + +import XCTest + +class SocketAcknowledgementTest: SocketEmitTest { + override func setUp() { + super.setUp() + testKind = TestKind.Acknowledgement + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": "", + "nsp": "/swift", + "extraHeaders": headers]) + openConnection() + } + + override func testConnectionStatus() { + super.testConnectionStatus() + } + + override func testEmit() { + super.testEmit() + } + + override func testEmitNull() { + super.testEmitNull() + } + + override func testEmitBinary() { + super.testEmitBinary() + } + + override func testArrayEmit() { + super.testArrayEmit() + } + + override func testStringEmit() { + super.testStringEmit() + } + + override func testBoolEmit() { + super.testBoolEmit() + } + + override func testIntegerEmit() { + super.testIntegerEmit() + } + + override func testDoubleEmit() { + super.testDoubleEmit() + } + + override func testJSONEmit() { + super.testJSONEmit() + } + + override func testUnicodeEmit() { + super.testUnicodeEmit() + } + + override func testMultipleItemsEmit() { + super.testMultipleItemsEmit() + } + + override func abstractSocketEmitTest(testName:String, emitData:AnyObject?, callback:NormalCallback){ + let finalTestname = testName + testKind.rawValue + let expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?) { + callback(result, nil) + expection.fulfill() + } + var ack:OnAckCallback! + if let emitData = emitData { + ack = socket.emitWithAck(finalTestname, emitData) + } else { + ack = socket.emitWithAck(finalTestname) + } + ack(timeoutAfter: 20, callback: didGetEmit) + + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + +} diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index 1e599c5..f6a16d2 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -10,11 +10,10 @@ import XCTest import Foundation class SocketEmitTest: XCTestCase { - private static let TEST_TIMEOUT = 20.0 + static let TEST_TIMEOUT = 5.0 var socket:SocketIOClient! - - let headers = ["testing": "blah", "testing2": "b/:lah"] + var testKind = TestKind.Emit override func setUp() { super.setUp() @@ -53,7 +52,7 @@ class SocketEmitTest: XCTestCase { } func testEmit() { - let testName = "testEmit" + let testName = "basicTest" func didGetEmit(result:NSArray?, ack:AckEmitter?) { } @@ -61,7 +60,7 @@ class SocketEmitTest: XCTestCase { } func testEmitNull() { - let testName = "testEmitNull" + let testName = "testNull" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let _ = result?.firstObject as? NSNull { @@ -74,7 +73,7 @@ class SocketEmitTest: XCTestCase { } func testEmitBinary() { - let testName = "testEmitBinary" + let testName = "testBinary" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let data = result?.firstObject as? NSData { let string = NSString(data: data, encoding: NSUTF8StringEncoding)! @@ -88,11 +87,12 @@ class SocketEmitTest: XCTestCase { } func testArrayEmit() { - let testName = "testEmitArray" + let testName = "testArray" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let array = result?.firstObject as? NSArray { XCTAssertEqual(array.count, 2) XCTAssertEqual(array.firstObject! as! String, "test3") + XCTAssertEqual(array.lastObject! as! String, "test4") }else { XCTFail("Should have NSArray as result") } @@ -101,7 +101,7 @@ class SocketEmitTest: XCTestCase { } func testStringEmit() { - let testName = "testStringEmit" + let testName = "testString" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let string = result?.firstObject as? String { XCTAssertEqual(string, "polo") @@ -113,7 +113,7 @@ class SocketEmitTest: XCTestCase { } func testBoolEmit() { - let testName = "testBoolEmit" + let testName = "testBool" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let bool = result?.firstObject as? NSNumber { XCTAssertTrue(bool.boolValue) @@ -125,7 +125,7 @@ class SocketEmitTest: XCTestCase { } func testIntegerEmit() { - let testName = "testIntegerEmit" + let testName = "testInteger" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let integer = result?.firstObject as? Int { XCTAssertEqual(integer, 20) @@ -137,7 +137,7 @@ class SocketEmitTest: XCTestCase { } func testDoubleEmit() { - let testName = "testDoubleEmit" + let testName = "testDouble" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let double = result?.firstObject as? NSNumber { XCTAssertEqual(double.floatValue, 1.2) @@ -149,7 +149,7 @@ class SocketEmitTest: XCTestCase { } func testJSONEmit() { - let testName = "testJSONEmit" + let testName = "testJSON" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let json = result?.firstObject as? NSDictionary { XCTAssertEqual(json.valueForKey("testString")! as! String, "test") @@ -168,7 +168,7 @@ class SocketEmitTest: XCTestCase { } func testUnicodeEmit() { - let testName = "testUnicodeEmit" + let testName = "testUnicode" func didGetEmit(result:NSArray?, ack:AckEmitter?) { if let unicode = result?.firstObject as? String { XCTAssertEqual(unicode, "🚄") @@ -180,7 +180,7 @@ class SocketEmitTest: XCTestCase { } func testMultipleItemsEmit() { - let testName = "testMultipleItemsEmit" + let testName = "testMultipleItems" let expection = self.expectationWithDescription(testName) func didGetEmit(result:NSArray?, ack:AckEmitter?) { XCTAssertEqual(result!.count, 5) @@ -225,17 +225,18 @@ class SocketEmitTest: XCTestCase { func abstractSocketEmitTest(testName:String, emitData:AnyObject?, callback:NormalCallback){ - let expection = self.expectationWithDescription(testName) + let finalTestname = testName + testKind.rawValue + let expection = self.expectationWithDescription(finalTestname) func didGetEmit(result:NSArray?, ack:AckEmitter?) { callback(result, ack) expection.fulfill() } - socket.on(testName + "Return", callback: didGetEmit) + socket.on(finalTestname + "Return", callback: didGetEmit) if let emitData = emitData { - socket.emit(testName, emitData) + socket.emit(finalTestname, emitData) } else { - socket.emit(testName) + socket.emit(finalTestname) } waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) diff --git a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift index 8e50c11..945a242 100644 --- a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift @@ -12,13 +12,6 @@ class SocketNamespaceEmitTest: SocketEmitTest { override func setUp() { super.setUp() - if testCytube { - socket = SocketIOClient(socketURL: "https://cytu.be:10443", opts: [ - "forcePolling": false, - "forceWebsockets": false, - "log": true - ]) - } else { socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ "reconnects": true, // default true "reconnectAttempts": -1, // default -1 @@ -28,9 +21,7 @@ class SocketNamespaceEmitTest: SocketEmitTest { "path": "", "nsp": "/swift", "extraHeaders": headers]) - } openConnection() - } override func tearDown() { diff --git a/SocketIO-iOSTests/TestKind.swift b/SocketIO-iOSTests/TestKind.swift new file mode 100644 index 0000000..d83c59b --- /dev/null +++ b/SocketIO-iOSTests/TestKind.swift @@ -0,0 +1,13 @@ +// +// TestKind.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 28.07.15. +// +// + +import Foundation + +enum TestKind: String { + case Emit, Acknowledgement +} \ No newline at end of file From 30cf2bb67a53fe0783b1e271981f6d5fdd2b0b8a Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Tue, 28 Jul 2015 14:46:30 +0200 Subject: [PATCH 11/25] namespace tests --- .../project.pbxproj | 8 +- .../SocketAcknowledgementTest.swift | 3 +- SocketIO-iOSTests/SocketEmitTest.swift | 47 +++++---- .../SocketNamespaceAcknowledgementTest.swift | 95 +++++++++++++++++++ 4 files changed, 133 insertions(+), 20 deletions(-) create mode 100644 SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 03e8493..de8ab5f 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -39,6 +39,7 @@ 5764DFA11B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 5764DFA21B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941A4AB91B67A56C00C42318 /* TestKind.swift */; }; + 94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */; }; 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */; }; 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7E1B51F254004FF46E /* SocketEngine.swift */; }; @@ -100,6 +101,7 @@ 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = ""; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = ""; }; 941A4AB91B67A56C00C42318 /* TestKind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestKind.swift; sourceTree = ""; }; + 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceAcknowledgementTest.swift; sourceTree = ""; }; 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = ""; }; 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = ""; }; 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAcknowledgementTest.swift; sourceTree = ""; }; @@ -183,10 +185,11 @@ isa = PBXGroup; children = ( 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */, - 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */, - 572EF2291B51F16C00EEBB58 /* Supporting Files */, + 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, + 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */, 941A4AB91B67A56C00C42318 /* TestKind.swift */, + 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; sourceTree = ""; @@ -463,6 +466,7 @@ 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */, 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */, 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */, + 94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift index e8f6633..81247d9 100644 --- a/SocketIO-iOSTests/SocketAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -19,7 +19,6 @@ class SocketAcknowledgementTest: SocketEmitTest { "forcePolling": false, "forceWebsockets": false,// default false "path": "", - "nsp": "/swift", "extraHeaders": headers]) openConnection() } @@ -72,7 +71,7 @@ class SocketAcknowledgementTest: SocketEmitTest { super.testMultipleItemsEmit() } - override func abstractSocketEmitTest(testName:String, emitData:AnyObject?, callback:NormalCallback){ + override func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ let finalTestname = testName + testKind.rawValue let expection = self.expectationWithDescription(finalTestname) func didGetEmit(result:NSArray?) { diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index f6a16d2..7516224 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -56,7 +56,7 @@ class SocketEmitTest: XCTestCase { func didGetEmit(result:NSArray?, ack:AckEmitter?) { } - abstractSocketEmitTest(testName, emitData: nil, callback: didGetEmit) + abstractSocketEmit(testName, emitData: nil, callback: didGetEmit) } func testEmitNull() { @@ -69,7 +69,7 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have NSNull as result") } } - abstractSocketEmitTest(testName, emitData: NSNull(), callback: didGetEmit) + abstractSocketEmit(testName, emitData: NSNull(), callback: didGetEmit) } func testEmitBinary() { @@ -83,7 +83,7 @@ class SocketEmitTest: XCTestCase { } } let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! - abstractSocketEmitTest(testName, emitData: data, callback: didGetEmit) + abstractSocketEmit(testName, emitData: data, callback: didGetEmit) } func testArrayEmit() { @@ -97,7 +97,7 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have NSArray as result") } } - abstractSocketEmitTest(testName, emitData: ["test1", "test2"], callback: didGetEmit) + abstractSocketEmit(testName, emitData: ["test1", "test2"], callback: didGetEmit) } func testStringEmit() { @@ -109,7 +109,7 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have String as result") } } - abstractSocketEmitTest(testName, emitData: "marco", callback: didGetEmit) + abstractSocketEmit(testName, emitData: "marco", callback: didGetEmit) } func testBoolEmit() { @@ -121,7 +121,7 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have Boolean as result") } } - abstractSocketEmitTest(testName, emitData: false, callback: didGetEmit) + abstractSocketEmit(testName, emitData: false, callback: didGetEmit) } func testIntegerEmit() { @@ -133,7 +133,7 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have Integer as result") } } - abstractSocketEmitTest(testName, emitData: 10, callback: didGetEmit) + abstractSocketEmit(testName, emitData: 10, callback: didGetEmit) } func testDoubleEmit() { @@ -145,7 +145,7 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have Double as result") } } - abstractSocketEmitTest(testName, emitData: 1.1, callback: didGetEmit) + abstractSocketEmit(testName, emitData: 1.1, callback: didGetEmit) } func testJSONEmit() { @@ -164,7 +164,7 @@ class SocketEmitTest: XCTestCase { } let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] - abstractSocketEmitTest(testName, emitData: json, callback: didGetEmit) + abstractSocketEmit(testName, emitData: json, callback: didGetEmit) } func testUnicodeEmit() { @@ -176,12 +176,11 @@ class SocketEmitTest: XCTestCase { XCTFail("Should have String as result") } } - abstractSocketEmitTest(testName, emitData: "🚀", callback: didGetEmit) + abstractSocketEmit(testName, emitData: "🚀", callback: didGetEmit) } func testMultipleItemsEmit() { let testName = "testMultipleItems" - let expection = self.expectationWithDescription(testName) func didGetEmit(result:NSArray?, ack:AckEmitter?) { XCTAssertEqual(result!.count, 5) if let array = result?.firstObject as? Array { @@ -215,17 +214,33 @@ class SocketEmitTest: XCTestCase { }else { XCTFail("Should have NSData as result") } - expection.fulfill() } let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! - socket.emit(testName, withItems: [["test1", "test2"], ["test": "test"], 15, "marco", data]) - socket.on(testName + "Return", callback: didGetEmit) + let emitArray = [["test1", "test2"], ["test": "test"], 15, "marco", data] + abstractSocketMultipleEmit(testName, emitData: emitArray, callback: didGetEmit) + } + + func generateTestName(rawTestName:String) ->String { + return rawTestName + testKind.rawValue + } + + func abstractSocketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + let expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + callback(result, ack) + expection.fulfill() + } + + socket.emit(finalTestname, withItems: emitData) + socket.on(finalTestname + "Return", callback: didGetEmit) waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } - func abstractSocketEmitTest(testName:String, emitData:AnyObject?, callback:NormalCallback){ - let finalTestname = testName + testKind.rawValue + func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ + let finalTestname = generateTestName(testName) let expection = self.expectationWithDescription(finalTestname) func didGetEmit(result:NSArray?, ack:AckEmitter?) { callback(result, ack) diff --git a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift new file mode 100644 index 0000000..318ba76 --- /dev/null +++ b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift @@ -0,0 +1,95 @@ +// +// SocketNamespaceAcknowledgementTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 28.07.15. +// +// + +import XCTest + +class SocketNamespaceAcknowledgementTest: SocketEmitTest { + + override func setUp() { + super.setUp() + testKind = TestKind.Acknowledgement + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": "", + "nsp": "/swift", + "extraHeaders": headers]) + openConnection() + } + + override func testConnectionStatus() { + super.testConnectionStatus() + } + + override func testEmit() { + super.testEmit() + } + + override func testEmitNull() { + super.testEmitNull() + } + + override func testEmitBinary() { + super.testEmitBinary() + } + + override func testArrayEmit() { + super.testArrayEmit() + } + + override func testStringEmit() { + super.testStringEmit() + } + + override func testBoolEmit() { + super.testBoolEmit() + } + + override func testIntegerEmit() { + super.testIntegerEmit() + } + + override func testDoubleEmit() { + super.testDoubleEmit() + } + + override func testJSONEmit() { + super.testJSONEmit() + } + + override func testUnicodeEmit() { + super.testUnicodeEmit() + } + + override func testMultipleItemsEmit() { + super.testMultipleItemsEmit() + } + + override func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ + let finalTestname = testName + testKind.rawValue + let expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?) { + callback(result, nil) + expection.fulfill() + } + var ack:OnAckCallback! + if let emitData = emitData { + ack = socket.emitWithAck(finalTestname, emitData) + } else { + ack = socket.emitWithAck(finalTestname) + } + ack(timeoutAfter: 20, callback: didGetEmit) + + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + + +} From 79848b1ce07a4a8825657a521b813cac78c203f6 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Tue, 28 Jul 2015 16:15:12 +0200 Subject: [PATCH 12/25] cleanup --- .../SocketAcknowledgementTest.swift | 13 +++++++++++ SocketIO-iOSTests/SocketEmitTest.swift | 5 ++--- .../SocketNamespaceAcknowledgementTest.swift | 22 +------------------ 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift index 81247d9..733ef74 100644 --- a/SocketIO-iOSTests/SocketAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -71,6 +71,19 @@ class SocketAcknowledgementTest: SocketEmitTest { super.testMultipleItemsEmit() } + override func abstractSocketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + let expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?) { + callback(result, nil) + expection.fulfill() + } + + socket.emitWithAck(finalTestname, withItems: emitData)(timeoutAfter: 5, callback: didGetEmit) + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + + } + override func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ let finalTestname = testName + testKind.rawValue let expection = self.expectationWithDescription(finalTestname) diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index 7516224..48a43f7 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -10,7 +10,7 @@ import XCTest import Foundation class SocketEmitTest: XCTestCase { - static let TEST_TIMEOUT = 5.0 + static let TEST_TIMEOUT = 15.0 var socket:SocketIOClient! let headers = ["testing": "blah", "testing2": "b/:lah"] var testKind = TestKind.Emit @@ -185,8 +185,7 @@ class SocketEmitTest: XCTestCase { XCTAssertEqual(result!.count, 5) if let array = result?.firstObject as? Array { XCTAssertEqual(array.last! as! Int, 2) - let string = NSString(data: array.first! as! NSData, encoding: NSUTF8StringEncoding)! - XCTAssertEqual(string, "gakgakgak2") + XCTAssertEqual(array.first! as! Int, 1) }else { XCTFail("Should have Array as result") } diff --git a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift index 318ba76..a8d715e 100644 --- a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift @@ -8,7 +8,7 @@ import XCTest -class SocketNamespaceAcknowledgementTest: SocketEmitTest { +class SocketNamespaceAcknowledgementTest: SocketAcknowledgementTest { override func setUp() { super.setUp() @@ -72,24 +72,4 @@ class SocketNamespaceAcknowledgementTest: SocketEmitTest { override func testMultipleItemsEmit() { super.testMultipleItemsEmit() } - - override func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ - let finalTestname = testName + testKind.rawValue - let expection = self.expectationWithDescription(finalTestname) - func didGetEmit(result:NSArray?) { - callback(result, nil) - expection.fulfill() - } - var ack:OnAckCallback! - if let emitData = emitData { - ack = socket.emitWithAck(finalTestname, emitData) - } else { - ack = socket.emitWithAck(finalTestname) - } - ack(timeoutAfter: 20, callback: didGetEmit) - - waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) - } - - } From a0e30528933d4680db8205761af07d100925697a Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Tue, 28 Jul 2015 17:02:44 +0200 Subject: [PATCH 13/25] test server --- .gitignore | 2 + Socket.IO-Test-Server/TestCases.js | 78 +++++++++++++++++++ .../acknowledgementEvents.js | 10 +++ Socket.IO-Test-Server/emitEvents.js | 20 +++++ Socket.IO-Test-Server/main.js | 13 ++++ Socket.IO-Test-Server/package.json | 15 ++++ Socket.IO-Test-Server/socketEventRegister.js | 13 ++++ 7 files changed, 151 insertions(+) create mode 100644 Socket.IO-Test-Server/TestCases.js create mode 100644 Socket.IO-Test-Server/acknowledgementEvents.js create mode 100644 Socket.IO-Test-Server/emitEvents.js create mode 100644 Socket.IO-Test-Server/main.js create mode 100644 Socket.IO-Test-Server/package.json create mode 100644 Socket.IO-Test-Server/socketEventRegister.js diff --git a/.gitignore b/.gitignore index 8fcf4d1..2f7122e 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,5 @@ DerivedData *.hmap *.ipa *.xcuserstate + +Socket.IO-Test-Server/node_modules/* diff --git a/Socket.IO-Test-Server/TestCases.js b/Socket.IO-Test-Server/TestCases.js new file mode 100644 index 0000000..f0fa660 --- /dev/null +++ b/Socket.IO-Test-Server/TestCases.js @@ -0,0 +1,78 @@ +var assert = require("assert") + +module.exports = { + basicTest: { + assert: function(inputData) { + + }, + returnData: [] + }, + testNull: { + assert: function(inputData) { + assert(!inputData) + }, + returnData: [null] + }, + testBinary: { + assert: function(inputData) { + assert.equal(inputData.toString(), "gakgakgak2") + }, + returnData: [new Buffer("gakgakgak2", "utf-8")] + }, + testArray: { + assert: function(inputData) { + assert.equal(inputData.length, 2) + assert.equal(inputData[0], "test1") + assert.equal(inputData[1], "test2") + }, + returnData: [["test3", "test4"]] + }, + testString: { + assert: function(inputData) { + assert.equal(inputData, "marco") + }, + returnData: ["polo"] + }, + testBool: { + assert: function(inputData) { + assert(!inputData) + }, + returnData: [true] + }, + testInteger: { + assert: function(inputData) { + assert.equal(inputData, 10) + }, + returnData: [20] + }, + testDouble: { + assert: function(inputData) { + assert.equal(inputData, 1.1) + }, + returnData: [1.2] + }, + testJSON: { + assert: function(inputData) { + assert.equal(inputData.name, "test") + assert.equal(inputData.nestedTest.test, "test") + assert.equal(inputData.testArray.length, 1) + }, + returnData: [{testString: "test", testNumber: 15, nestedTest: {test: "test"}, testArray: [new Buffer("gakgakgak2", "utf-8"), 1]}] + },testUnicode: { + assert: function(inputData) { + assert.equal(inputData, "🚀") + }, + returnData: ["🚄"] + },testMultipleItems: { + assert: function(array, object, number, string, binary) { + assert.equal(array.length, 2) + assert.equal(array[0], "test1") + assert.equal(array[1], "test2") + assert.equal(number, 15) + assert.equal(string, "marco") + assert.equal(binary.toString(), "gakgakgak2") + + }, + returnData: [[1, 2], {test: "bob"}, 25, "polo", new Buffer("gakgakgak2")] + }, +} \ No newline at end of file diff --git a/Socket.IO-Test-Server/acknowledgementEvents.js b/Socket.IO-Test-Server/acknowledgementEvents.js new file mode 100644 index 0000000..a4c2c9d --- /dev/null +++ b/Socket.IO-Test-Server/acknowledgementEvents.js @@ -0,0 +1,10 @@ +function socketCallback(testKey, socket, testCase) { + return function() { + testCase.assert.apply(undefined , arguments) + var emitArguments = testCase.returnData; + var ack = arguments[arguments.length - 1] + ack.apply(socket, emitArguments) + } +} + +module.exports.socketCallback = socketCallback diff --git a/Socket.IO-Test-Server/emitEvents.js b/Socket.IO-Test-Server/emitEvents.js new file mode 100644 index 0000000..14f9ce5 --- /dev/null +++ b/Socket.IO-Test-Server/emitEvents.js @@ -0,0 +1,20 @@ +function socketCallback(testKey, socket, testCase) { + return function() { + testCase.assert.apply(undefined , arguments) + + var emitArguments = addArrays([testKey + "EmitReturn"], testCase.returnData) + socket.emit.apply(socket, emitArguments) + } +} + +function addArrays(firstArray, secondArray) { + var length = secondArray.length + var i; + for(i = 0; i < length; i++) { + firstArray.push(secondArray[i]) + } + + return firstArray; +} + +module.exports.socketCallback = socketCallback \ No newline at end of file diff --git a/Socket.IO-Test-Server/main.js b/Socket.IO-Test-Server/main.js new file mode 100644 index 0000000..ae83f97 --- /dev/null +++ b/Socket.IO-Test-Server/main.js @@ -0,0 +1,13 @@ +var app = require('express')() +var server = app.listen(8080) +var io = require('socket.io')(server) +var acknowledgementsEvents = require("./acknowledgementEvents.js") +var emitEvents = require("./emitEvents.js") +var socketEventRegister = require("./socketEventRegister.js") + +socketEventRegister.register(io, emitEvents.socketCallback, "Emit") +socketEventRegister.register(io, acknowledgementsEvents.socketCallback, "Acknowledgement") + +var nsp = io.of("/swift") +socketEventRegister.register(nsp, emitEvents.socketCallback, "Emit") +socketEventRegister.register(nsp, acknowledgementsEvents.socketCallback, "Acknowledgement") diff --git a/Socket.IO-Test-Server/package.json b/Socket.IO-Test-Server/package.json new file mode 100644 index 0000000..a62aa0b --- /dev/null +++ b/Socket.IO-Test-Server/package.json @@ -0,0 +1,15 @@ +{ + "name": "socket.io-client-swift-test-server", + "version": "0.0.1", + "description": "A simple server to test aginst", + "main": "main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Lukas Schmidt", + "license": "MIT", + "dependencies": { + "express": "^4.13.1", + "socket.io": "^1.3.6" + } +} diff --git a/Socket.IO-Test-Server/socketEventRegister.js b/Socket.IO-Test-Server/socketEventRegister.js new file mode 100644 index 0000000..9e0c208 --- /dev/null +++ b/Socket.IO-Test-Server/socketEventRegister.js @@ -0,0 +1,13 @@ +var testCases = require("./TestCases.js") + +function registerSocketForEvents(ioSocket, socketCallback, testKind) { + ioSocket.on('connection', function(socket) { + var testCase; + for(testKey in testCases) { + testCase = testCases[testKey] + socket.on((testKey + testKind), socketCallback(testKey, socket, testCase)) + } + }) +} + +module.exports.register = registerSocketForEvents \ No newline at end of file From feea80a2f9db30c8b47a414e1e63f7361dd7614c Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 31 Jul 2015 16:05:33 -0400 Subject: [PATCH 14/25] use immutable values --- SocketIOClientSwift/SocketPacket.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 9ce91bb..5adccf6 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -27,6 +27,8 @@ import Foundation struct SocketPacket { let nsp:String let id:Int + let placeholders:Int + let type:PacketType enum PacketType:Int { case CONNECT = 0 @@ -49,8 +51,6 @@ struct SocketPacket { var currentPlace = 0 var binary:[NSData] var data:[AnyObject] - var placeholders:Int - var type:PacketType var description:String { var better = "SocketPacket {type: ~~0; data: ~~1; " + "id: ~~2; placeholders: ~~3;}" From 4086ce7d75a30e011749e04efb065632d3e4b0c7 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 2 Aug 2015 15:07:05 +0200 Subject: [PATCH 15/25] relocate test cases for better understanding --- .../project.pbxproj | 4 + Socket.IO-Test-Server/TestCases.js | 8 + .../SocketAcknowledgementTest.swift | 4 + SocketIO-iOSTests/SocketEmitTest.swift | 3 +- SocketIO-iOSTests/SocketTestCases.swift | 201 ++++++++++++++++++ 5 files changed, 219 insertions(+), 1 deletion(-) create mode 100644 SocketIO-iOSTests/SocketTestCases.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index de8ab5f..05ec9e0 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -56,6 +56,7 @@ 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */; }; 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; }; 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */; }; + 94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -105,6 +106,7 @@ 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = ""; }; 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = ""; }; 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAcknowledgementTest.swift; sourceTree = ""; }; + 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketTestCases.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -189,6 +191,7 @@ 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */, 941A4AB91B67A56C00C42318 /* TestKind.swift */, + 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; @@ -453,6 +456,7 @@ 945B653D1B5FCEEA0081E995 /* SocketPacket.swift in Sources */, 945B653A1B5FCEEA0081E995 /* SocketFixUTF8.swift in Sources */, 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */, + 94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */, 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */, diff --git a/Socket.IO-Test-Server/TestCases.js b/Socket.IO-Test-Server/TestCases.js index f0fa660..c40ab2f 100644 --- a/Socket.IO-Test-Server/TestCases.js +++ b/Socket.IO-Test-Server/TestCases.js @@ -51,6 +51,14 @@ module.exports = { }, returnData: [1.2] }, + testJSONWithoutBuffer: { + assert: function(inputData) { + assert.equal(inputData.name, "test") + assert.equal(inputData.nestedTest.test, "test") + assert.equal(inputData.testArray.length, 1) + }, + returnData: [{testString: "test", testNumber: 15, nestedTest: {test: "test"}, testArray: [1, 1]}] + }, testJSON: { assert: function(inputData) { assert.equal(inputData.name, "test") diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift index 733ef74..7c27622 100644 --- a/SocketIO-iOSTests/SocketAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -63,6 +63,10 @@ class SocketAcknowledgementTest: SocketEmitTest { super.testJSONEmit() } + func testJSONWithoutBuffer() { + SocketTestCases.testJSONEmit(abstractSocketEmit, testKind: self.testKind) + } + override func testUnicodeEmit() { super.testUnicodeEmit() } diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index 48a43f7..cbdaeff 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -24,7 +24,8 @@ class SocketEmitTest: XCTestCase { "forcePolling": false, "forceWebsockets": false,// default false "path": "", - "extraHeaders": headers]) + "extraHeaders": headers] + ) openConnection() } diff --git a/SocketIO-iOSTests/SocketTestCases.swift b/SocketIO-iOSTests/SocketTestCases.swift new file mode 100644 index 0000000..53c4489 --- /dev/null +++ b/SocketIO-iOSTests/SocketTestCases.swift @@ -0,0 +1,201 @@ +// +// SocketTestCases.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 02.08.15. +// +// + +import XCTest +import Foundation + +class SocketTestCases: NSObject { + typealias SocketSendFunction = (testName:String, emitData:AnyObject?, callback:NormalCallback)->() + + static func testBasic(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "basicTest" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + + } + abstractSocketSend(testName: testName, emitData: nil, callback: didGetResult) + } + + static func testNull(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testNull" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let _ = result?.firstObject as? NSNull { + + }else + { + XCTFail("Should have NSNull as result") + } + } + abstractSocketSend(testName: testName, emitData: NSNull(), callback: didGetResult) + } + + static func testBinary(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testBinary" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let data = result?.firstObject as? NSData { + let string = NSString(data: data, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSData as result") + } + } + let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! + abstractSocketSend(testName: testName, emitData: data, callback: didGetResult) + } + + static func testArray(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testArray" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let array = result?.firstObject as? NSArray { + XCTAssertEqual(array.count, 2) + XCTAssertEqual(array.firstObject! as! String, "test3") + XCTAssertEqual(array.lastObject! as! String, "test4") + }else { + XCTFail("Should have NSArray as result") + } + } + abstractSocketSend(testName: testName, emitData: ["test1", "test2"], callback: didGetResult) + } + + static func testString(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testString" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let string = result?.firstObject as? String { + XCTAssertEqual(string, "polo") + }else { + XCTFail("Should have String as result") + } + } + abstractSocketSend(testName: testName, emitData: "marco", callback: didGetResult) + } + + static func testBool(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testBool" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let bool = result?.firstObject as? NSNumber { + XCTAssertTrue(bool.boolValue) + }else { + XCTFail("Should have Boolean as result") + } + } + abstractSocketSend(testName: testName, emitData: false, callback: didGetResult) + } + + static func testInteger(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testInteger" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let integer = result?.firstObject as? Int { + XCTAssertEqual(integer, 20) + }else { + XCTFail("Should have Integer as result") + } + } + abstractSocketSend(testName: testName, emitData: 10, callback: didGetResult) + } + + static func testDouble(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testDouble" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let double = result?.firstObject as? NSNumber { + XCTAssertEqual(double.floatValue, 1.2) + }else { + XCTFail("Should have Double as result") + } + } + abstractSocketSend(testName: testName, emitData: 1.1, callback: didGetResult) + } + + static func testJSON(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testJSON" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let json = result?.firstObject as? NSDictionary { + XCTAssertEqual(json.valueForKey("testString")! as! String, "test") + XCTAssertEqual(json.valueForKey("testNumber")! as! Int, 15) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).count, 2) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as! Int, 1) + let string = NSString(data: (json.valueForKey("testArray")! as! Array).first! as! NSData, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSDictionary as result") + } + } + let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] + + abstractSocketSend(testName: testName, emitData: json, callback: didGetResult) + } + + static func testJSONWithoutBuffer(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testJSONWithoutBuffer" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let json = result?.firstObject as? NSDictionary { + XCTAssertEqual(json.valueForKey("testString")! as! String, "test") + XCTAssertEqual(json.valueForKey("testNumber")! as! Int, 15) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).count, 2) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).first! as! Int, 1) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as! Int, 1) + + }else { + XCTFail("Should have NSDictionary as result") + } + } + let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] + + abstractSocketSend(testName: testName, emitData: json, callback: didGetResult) + } + + static func testUnicode(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + let testName = "testUnicode" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let unicode = result?.firstObject as? String { + XCTAssertEqual(unicode, "🚄") + }else { + XCTFail("Should have String as result") + } + } + abstractSocketSend(testName: testName, emitData: "🚀", callback: didGetResult) + } + + static func testMultipleItems(abstractSocketMultipleSend:(testName:String, emitData:Array, callback:NormalCallback)->(), testKind:TestKind) { + let testName = "testMultipleItems" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + XCTAssertEqual(result!.count, 5) + if let array = result?.firstObject as? Array { + XCTAssertEqual(array.last! as! Int, 2) + XCTAssertEqual(array.first! as! Int, 1) + }else { + XCTFail("Should have Array as result") + } + if let dict = result?[1] as? NSDictionary { + XCTAssertEqual(dict.valueForKey("test") as! String, "bob") + + }else { + XCTFail("Should have NSDictionary as result") + } + if let number = result?[2] as? Int { + XCTAssertEqual(number, 25) + + }else { + XCTFail("Should have Integer as result") + } + if let string = result?[3] as? String { + XCTAssertEqual(string, "polo") + + }else { + XCTFail("Should have Integer as result") + } + if let data = result?[4] as? NSData { + let string = NSString(data: data, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSData as result") + } + } + let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! + let emitArray = [["test1", "test2"], ["test": "test"], 15, "marco", data] + abstractSocketMultipleSend(testName: testName, emitData: emitArray, callback: didGetResult) + } +} From bf3e28df81e523276d8ba528a3c1d4e7d177347e Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 2 Aug 2015 17:28:09 +0200 Subject: [PATCH 16/25] improve tests on server --- Socket.IO-Test-Server/TestCases.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Socket.IO-Test-Server/TestCases.js b/Socket.IO-Test-Server/TestCases.js index c40ab2f..1f7511f 100644 --- a/Socket.IO-Test-Server/TestCases.js +++ b/Socket.IO-Test-Server/TestCases.js @@ -51,7 +51,7 @@ module.exports = { }, returnData: [1.2] }, - testJSONWithoutBuffer: { + testJSON: { assert: function(inputData) { assert.equal(inputData.name, "test") assert.equal(inputData.nestedTest.test, "test") @@ -59,7 +59,7 @@ module.exports = { }, returnData: [{testString: "test", testNumber: 15, nestedTest: {test: "test"}, testArray: [1, 1]}] }, - testJSON: { + testJSONWithBuffer: { assert: function(inputData) { assert.equal(inputData.name, "test") assert.equal(inputData.nestedTest.test, "test") @@ -72,6 +72,16 @@ module.exports = { }, returnData: ["🚄"] },testMultipleItems: { + assert: function(array, object, number, string, bool) { + assert.equal(array.length, 2) + assert.equal(array[0], "test1") + assert.equal(array[1], "test2") + assert.equal(number, 15) + assert.equal(string, "marco") + assert.equal(bool, false) + }, + returnData: [[1, 2], {test: "bob"}, 25, "polo", false] + },testMultipleItemsWithBuffer: { assert: function(array, object, number, string, binary) { assert.equal(array.length, 2) assert.equal(array[0], "test1") @@ -79,8 +89,7 @@ module.exports = { assert.equal(number, 15) assert.equal(string, "marco") assert.equal(binary.toString(), "gakgakgak2") - }, returnData: [[1, 2], {test: "bob"}, 25, "polo", new Buffer("gakgakgak2")] - }, + } } \ No newline at end of file From 1b08411ed4b14f75351a6608be4a7606706c5e91 Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 2 Aug 2015 17:29:16 +0200 Subject: [PATCH 17/25] refactored iOS testcases Add test cases for complex data structure (JSON, multiple data emit) without binary Buffer attached --- .../project.pbxproj | 4 + SocketIO-iOSTests/AbstractSocketTest.swift | 104 ++++++++ .../SocketAcknowledgementTest.swift | 89 +++---- SocketIO-iOSTests/SocketEmitTest.swift | 232 +++--------------- .../SocketNamespaceAcknowledgementTest.swift | 61 +++-- .../SocketNamespaceEmitTest.swift | 77 +++--- SocketIO-iOSTests/SocketTestCases.swift | 75 ++++-- 7 files changed, 303 insertions(+), 339 deletions(-) create mode 100644 SocketIO-iOSTests/AbstractSocketTest.swift diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 05ec9e0..653762f 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -57,6 +57,7 @@ 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; }; 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */; }; 94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */; }; + 94CB8F0D1B6E66E60019ED53 /* AbstractSocketTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -107,6 +108,7 @@ 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = ""; }; 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAcknowledgementTest.swift; sourceTree = ""; }; 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketTestCases.swift; sourceTree = ""; }; + 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AbstractSocketTest.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -192,6 +194,7 @@ 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */, 941A4AB91B67A56C00C42318 /* TestKind.swift */, 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */, + 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; @@ -460,6 +463,7 @@ 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */, + 94CB8F0D1B6E66E60019ED53 /* AbstractSocketTest.swift in Sources */, 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */, 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, diff --git a/SocketIO-iOSTests/AbstractSocketTest.swift b/SocketIO-iOSTests/AbstractSocketTest.swift new file mode 100644 index 0000000..ee1e335 --- /dev/null +++ b/SocketIO-iOSTests/AbstractSocketTest.swift @@ -0,0 +1,104 @@ +// +// AbstractSocketTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 02.08.15. +// +// + +import XCTest + +class AbstractSocketTest: XCTestCase { + static let TEST_TIMEOUT = 4.0 + var socket:SocketIOClient! + var testKind:TestKind? + + override func tearDown() { + super.tearDown() + socket.close(fast: false) + } + + func openConnection() { + let expection = self.expectationWithDescription("connect") + socket.on("connect") {data, ack in + expection.fulfill() + } + socket.connect() + XCTAssertTrue(socket.connecting) + waitForExpectationsWithTimeout(5, handler: nil) + } + + func generateTestName(rawTestName:String) ->String { + return rawTestName + testKind!.rawValue + } + + func checkConnectionStatus() { + XCTAssertTrue(socket.connected) + XCTAssertFalse(socket.connecting) + XCTAssertFalse(socket.reconnecting) + XCTAssertFalse(socket.closed) + XCTAssertFalse(socket.secure) + } + + func socketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + let expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + callback(result, ack) + expection.fulfill() + } + + socket.emit(finalTestname, withItems: emitData) + socket.on(finalTestname + "Return", callback: didGetEmit) + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + + + func socketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + let expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + callback(result, ack) + expection.fulfill() + } + + socket.on(finalTestname + "Return", callback: didGetEmit) + if let emitData = emitData { + socket.emit(finalTestname, emitData) + } else { + socket.emit(finalTestname) + } + + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + + func socketAcknwoledgeMultiple(testName:String, Data:Array, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + let expection = self.expectationWithDescription(finalTestname) + func didGetResult(result:NSArray?) { + callback(result, nil) + expection.fulfill() + } + + socket.emitWithAck(finalTestname, withItems: Data)(timeoutAfter: 5, callback: didGetResult) + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + + func socketAcknwoledge(testName:String, Data:AnyObject?, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + let expection = self.expectationWithDescription(finalTestname) + func didGet(result:NSArray?) { + callback(result, nil) + expection.fulfill() + } + var ack:OnAckCallback! + if let Data = Data { + ack = socket.emitWithAck(finalTestname, Data) + } else { + ack = socket.emitWithAck(finalTestname) + } + ack(timeoutAfter: 20, callback: didGet) + + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } +} diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift index 7c27622..801e852 100644 --- a/SocketIO-iOSTests/SocketAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -8,7 +8,8 @@ import XCTest -class SocketAcknowledgementTest: SocketEmitTest { +class SocketAcknowledgementTest: AbstractSocketTest { + override func setUp() { super.setUp() testKind = TestKind.Acknowledgement @@ -18,92 +19,64 @@ class SocketAcknowledgementTest: SocketEmitTest { "reconnectWait": 5, // default 10 "forcePolling": false, "forceWebsockets": false,// default false - "path": "", - "extraHeaders": headers]) + "path": ""]) openConnection() } - override func testConnectionStatus() { - super.testConnectionStatus() + func testConnectionStatus() { + super.checkConnectionStatus() } - override func testEmit() { - super.testEmit() + func testBasic() { + SocketTestCases.testBasic(socketAcknwoledge) } - override func testEmitNull() { - super.testEmitNull() + func testNull() { + SocketTestCases.testNull(socketAcknwoledge) } - override func testEmitBinary() { - super.testEmitBinary() + func testBinary() { + SocketTestCases.testBinary(socketAcknwoledge) } - override func testArrayEmit() { - super.testArrayEmit() + func testArray() { + SocketTestCases.testArray(socketAcknwoledge) } - override func testStringEmit() { - super.testStringEmit() + func testString() { + SocketTestCases.testString(socketAcknwoledge) } - override func testBoolEmit() { - super.testBoolEmit() + func testBool() { + SocketTestCases.testBool(socketAcknwoledge) } - override func testIntegerEmit() { - super.testIntegerEmit() + func testInteger() { + SocketTestCases.testInteger(socketAcknwoledge) } - override func testDoubleEmit() { - super.testDoubleEmit() + func testDouble() { + SocketTestCases.testDouble(socketAcknwoledge) } - override func testJSONEmit() { - super.testJSONEmit() + func testJSON() { + SocketTestCases.testJSON(socketAcknwoledge) } - func testJSONWithoutBuffer() { - SocketTestCases.testJSONEmit(abstractSocketEmit, testKind: self.testKind) + func testJSONWithBuffer() { + SocketTestCases.testJSONWithBuffer(socketAcknwoledge) } - override func testUnicodeEmit() { - super.testUnicodeEmit() + func testUnicode() { + SocketTestCases.testUnicode(socketAcknwoledge) } - override func testMultipleItemsEmit() { - super.testMultipleItemsEmit() + func testMultipleItems() { + SocketTestCases.testMultipleItems(socketAcknwoledgeMultiple) } - override func abstractSocketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ - let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) - func didGetEmit(result:NSArray?) { - callback(result, nil) - expection.fulfill() - } - - socket.emitWithAck(finalTestname, withItems: emitData)(timeoutAfter: 5, callback: didGetEmit) - waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) - - } - - override func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ - let finalTestname = testName + testKind.rawValue - let expection = self.expectationWithDescription(finalTestname) - func didGetEmit(result:NSArray?) { - callback(result, nil) - expection.fulfill() - } - var ack:OnAckCallback! - if let emitData = emitData { - ack = socket.emitWithAck(finalTestname, emitData) - } else { - ack = socket.emitWithAck(finalTestname) - } - ack(timeoutAfter: 20, callback: didGetEmit) - - waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + func testMultipleWithBuffer() { + SocketTestCases.testMultipleItemsWithBuffer(socketAcknwoledgeMultiple) } } diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index cbdaeff..a970444 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -9,22 +9,17 @@ import XCTest import Foundation -class SocketEmitTest: XCTestCase { - static let TEST_TIMEOUT = 15.0 - var socket:SocketIOClient! - let headers = ["testing": "blah", "testing2": "b/:lah"] - var testKind = TestKind.Emit - +class SocketEmitTest: AbstractSocketTest { override func setUp() { super.setUp() + testKind = TestKind.Emit socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ "reconnects": true, // default true "reconnectAttempts": -1, // default -1 "reconnectWait": 5, // default 10 "forcePolling": false, "forceWebsockets": false,// default false - "path": "", - "extraHeaders": headers] + "path": ""] ) openConnection() } @@ -34,227 +29,60 @@ class SocketEmitTest: XCTestCase { super.tearDown() } - func openConnection() { - let expection = self.expectationWithDescription("connect") - socket.on("connect") {data, ack in - expection.fulfill() - } - socket.connect() - XCTAssertTrue(socket.connecting) - waitForExpectationsWithTimeout(5, handler: nil) - } - func testConnectionStatus() { - XCTAssertTrue(socket.connected) - XCTAssertFalse(socket.connecting) - XCTAssertFalse(socket.reconnecting) - XCTAssertFalse(socket.closed) - XCTAssertFalse(socket.secure) + super.checkConnectionStatus() } - func testEmit() { - let testName = "basicTest" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - - } - abstractSocketEmit(testName, emitData: nil, callback: didGetEmit) + func testBasic() { + SocketTestCases.testBasic(socketEmit) } - func testEmitNull() { - let testName = "testNull" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let _ = result?.firstObject as? NSNull { - - }else - { - XCTFail("Should have NSNull as result") - } - } - abstractSocketEmit(testName, emitData: NSNull(), callback: didGetEmit) + func testNull() { + SocketTestCases.testNull(socketEmit) } - func testEmitBinary() { - let testName = "testBinary" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let data = result?.firstObject as? NSData { - let string = NSString(data: data, encoding: NSUTF8StringEncoding)! - XCTAssertEqual(string, "gakgakgak2") - }else { - XCTFail("Should have NSData as result") - } - } - let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! - abstractSocketEmit(testName, emitData: data, callback: didGetEmit) + func testBinary() { + SocketTestCases.testBinary(socketEmit) } - func testArrayEmit() { - let testName = "testArray" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let array = result?.firstObject as? NSArray { - XCTAssertEqual(array.count, 2) - XCTAssertEqual(array.firstObject! as! String, "test3") - XCTAssertEqual(array.lastObject! as! String, "test4") - }else { - XCTFail("Should have NSArray as result") - } - } - abstractSocketEmit(testName, emitData: ["test1", "test2"], callback: didGetEmit) + func testArray() { + SocketTestCases.testArray(socketEmit) } - func testStringEmit() { - let testName = "testString" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let string = result?.firstObject as? String { - XCTAssertEqual(string, "polo") - }else { - XCTFail("Should have String as result") - } - } - abstractSocketEmit(testName, emitData: "marco", callback: didGetEmit) + func testString() { + SocketTestCases.testString(socketEmit) } - func testBoolEmit() { - let testName = "testBool" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let bool = result?.firstObject as? NSNumber { - XCTAssertTrue(bool.boolValue) - }else { - XCTFail("Should have Boolean as result") - } - } - abstractSocketEmit(testName, emitData: false, callback: didGetEmit) + func testBool() { + SocketTestCases.testBool(socketEmit) } - func testIntegerEmit() { - let testName = "testInteger" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let integer = result?.firstObject as? Int { - XCTAssertEqual(integer, 20) - }else { - XCTFail("Should have Integer as result") - } - } - abstractSocketEmit(testName, emitData: 10, callback: didGetEmit) + func testInteger() { + SocketTestCases.testInteger(socketEmit) } - func testDoubleEmit() { - let testName = "testDouble" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let double = result?.firstObject as? NSNumber { - XCTAssertEqual(double.floatValue, 1.2) - }else { - XCTFail("Should have Double as result") - } - } - abstractSocketEmit(testName, emitData: 1.1, callback: didGetEmit) + func testDouble() { + SocketTestCases.testDouble(socketEmit) } - func testJSONEmit() { - let testName = "testJSON" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let json = result?.firstObject as? NSDictionary { - XCTAssertEqual(json.valueForKey("testString")! as! String, "test") - XCTAssertEqual(json.valueForKey("testNumber")! as! Int, 15) - XCTAssertEqual((json.valueForKey("testArray")! as! Array).count, 2) - XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as! Int, 1) - let string = NSString(data: (json.valueForKey("testArray")! as! Array).first! as! NSData, encoding: NSUTF8StringEncoding)! - XCTAssertEqual(string, "gakgakgak2") - }else { - XCTFail("Should have NSDictionary as result") - } - } - let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] - - abstractSocketEmit(testName, emitData: json, callback: didGetEmit) + func testJSON() { + SocketTestCases.testJSON(socketEmit) } - func testUnicodeEmit() { - let testName = "testUnicode" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - if let unicode = result?.firstObject as? String { - XCTAssertEqual(unicode, "🚄") - }else { - XCTFail("Should have String as result") - } - } - abstractSocketEmit(testName, emitData: "🚀", callback: didGetEmit) + func testJSONWithBuffer() { + SocketTestCases.testJSONWithBuffer(socketEmit) } - func testMultipleItemsEmit() { - let testName = "testMultipleItems" - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - XCTAssertEqual(result!.count, 5) - if let array = result?.firstObject as? Array { - XCTAssertEqual(array.last! as! Int, 2) - XCTAssertEqual(array.first! as! Int, 1) - }else { - XCTFail("Should have Array as result") - } - if let dict = result?[1] as? NSDictionary { - XCTAssertEqual(dict.valueForKey("test") as! String, "bob") - - }else { - XCTFail("Should have NSDictionary as result") - } - if let number = result?[2] as? Int { - XCTAssertEqual(number, 25) - - }else { - XCTFail("Should have Integer as result") - } - if let string = result?[3] as? String { - XCTAssertEqual(string, "polo") - - }else { - XCTFail("Should have Integer as result") - } - if let data = result?[4] as? NSData { - let string = NSString(data: data, encoding: NSUTF8StringEncoding)! - XCTAssertEqual(string, "gakgakgak2") - }else { - XCTFail("Should have NSData as result") - } - } - let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! - let emitArray = [["test1", "test2"], ["test": "test"], 15, "marco", data] - abstractSocketMultipleEmit(testName, emitData: emitArray, callback: didGetEmit) + func testUnicode() { + SocketTestCases.testUnicode(socketEmit) } - func generateTestName(rawTestName:String) ->String { - return rawTestName + testKind.rawValue + func testMultipleItems() { + SocketTestCases.testMultipleItems(socketMultipleEmit) } - func abstractSocketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ - let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - callback(result, ack) - expection.fulfill() - } - - socket.emit(finalTestname, withItems: emitData) - socket.on(finalTestname + "Return", callback: didGetEmit) - waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) - - } - - - func abstractSocketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ - let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) - func didGetEmit(result:NSArray?, ack:AckEmitter?) { - callback(result, ack) - expection.fulfill() - } - - socket.on(finalTestname + "Return", callback: didGetEmit) - if let emitData = emitData { - socket.emit(finalTestname, emitData) - } else { - socket.emit(finalTestname) - } - - waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + func testMultipleWithBuffer() { + SocketTestCases.testMultipleItemsWithBuffer(socketMultipleEmit) } } diff --git a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift index a8d715e..d25fecf 100644 --- a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift @@ -8,7 +8,7 @@ import XCTest -class SocketNamespaceAcknowledgementTest: SocketAcknowledgementTest { +class SocketNamespaceAcknowledgementTest: AbstractSocketTest { override func setUp() { super.setUp() @@ -20,56 +20,63 @@ class SocketNamespaceAcknowledgementTest: SocketAcknowledgementTest { "forcePolling": false, "forceWebsockets": false,// default false "path": "", - "nsp": "/swift", - "extraHeaders": headers]) + "nsp": "/swift"]) openConnection() } - override func testConnectionStatus() { - super.testConnectionStatus() + func testConnectionStatus() { + super.checkConnectionStatus() } - override func testEmit() { - super.testEmit() + func testBasic() { + SocketTestCases.testBasic(socketAcknwoledge) } - override func testEmitNull() { - super.testEmitNull() + func testNull() { + SocketTestCases.testNull(socketAcknwoledge) } - override func testEmitBinary() { - super.testEmitBinary() + func testBinary() { + SocketTestCases.testBinary(socketAcknwoledge) } - override func testArrayEmit() { - super.testArrayEmit() + func testArray() { + SocketTestCases.testArray(socketAcknwoledge) } - override func testStringEmit() { - super.testStringEmit() + func testString() { + SocketTestCases.testString(socketAcknwoledge) } - override func testBoolEmit() { - super.testBoolEmit() + func testBool() { + SocketTestCases.testBool(socketAcknwoledge) } - override func testIntegerEmit() { - super.testIntegerEmit() + func testInteger() { + SocketTestCases.testInteger(socketAcknwoledge) } - override func testDoubleEmit() { - super.testDoubleEmit() + func testDouble() { + SocketTestCases.testDouble(socketAcknwoledge) } - override func testJSONEmit() { - super.testJSONEmit() + func testJSON() { + SocketTestCases.testJSON(socketAcknwoledge) } - override func testUnicodeEmit() { - super.testUnicodeEmit() + func testJSONWithBuffer() { + SocketTestCases.testJSONWithBuffer(socketAcknwoledge) } - override func testMultipleItemsEmit() { - super.testMultipleItemsEmit() + func testUnicode() { + SocketTestCases.testUnicode(socketAcknwoledge) + } + + func testMultipleItems() { + SocketTestCases.testMultipleItems(socketAcknwoledgeMultiple) + } + + func testMultipleWithBuffer() { + SocketTestCases.testMultipleItemsWithBuffer(socketAcknwoledgeMultiple) } } diff --git a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift index 945a242..057fcc1 100644 --- a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift @@ -8,73 +8,76 @@ import XCTest -class SocketNamespaceEmitTest: SocketEmitTest { +class SocketNamespaceEmitTest: AbstractSocketTest { override func setUp() { super.setUp() - socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ - "reconnects": true, // default true - "reconnectAttempts": -1, // default -1 - "reconnectWait": 5, // default 10 - "forcePolling": false, - "forceWebsockets": false,// default false - "path": "", - "nsp": "/swift", - "extraHeaders": headers]) + testKind = TestKind.Emit + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": "", + "nsp": "/swift"]) openConnection() } - override func tearDown() { - socket.close(fast: false) - super.tearDown() + func testConnectionStatus() { + super.checkConnectionStatus() } - override func testConnectionStatus() { - super.testConnectionStatus() + func testBasic() { + SocketTestCases.testBasic(socketEmit) } - override func testEmit() { - super.testEmit() + func testNull() { + SocketTestCases.testNull(socketEmit) } - override func testEmitNull() { - super.testEmitNull() + func testBinary() { + SocketTestCases.testBinary(socketEmit) } - override func testEmitBinary() { - super.testEmitBinary() + func testArray() { + SocketTestCases.testArray(socketEmit) } - override func testArrayEmit() { - super.testArrayEmit() + func testString() { + SocketTestCases.testString(socketEmit) } - override func testStringEmit() { - super.testStringEmit() + func testBool() { + SocketTestCases.testBool(socketEmit) } - override func testBoolEmit() { - super.testBoolEmit() + func testInteger() { + SocketTestCases.testInteger(socketEmit) } - override func testIntegerEmit() { - super.testIntegerEmit() + func testDouble() { + SocketTestCases.testDouble(socketEmit) } - override func testDoubleEmit() { - super.testDoubleEmit() + func testJSON() { + SocketTestCases.testJSON(socketEmit) } - override func testJSONEmit() { - super.testJSONEmit() + func testJSONWithBuffer() { + SocketTestCases.testJSONWithBuffer(socketEmit) } - override func testUnicodeEmit() { - super.testUnicodeEmit() + func testUnicode() { + SocketTestCases.testUnicode(socketEmit) } - override func testMultipleItemsEmit() { - super.testMultipleItemsEmit() + func testMultipleItems() { + SocketTestCases.testMultipleItems(socketMultipleEmit) + } + + func testMultipleWithBuffer() { + SocketTestCases.testMultipleItemsWithBuffer(socketMultipleEmit) } } diff --git a/SocketIO-iOSTests/SocketTestCases.swift b/SocketIO-iOSTests/SocketTestCases.swift index 53c4489..e17718e 100644 --- a/SocketIO-iOSTests/SocketTestCases.swift +++ b/SocketIO-iOSTests/SocketTestCases.swift @@ -12,7 +12,7 @@ import Foundation class SocketTestCases: NSObject { typealias SocketSendFunction = (testName:String, emitData:AnyObject?, callback:NormalCallback)->() - static func testBasic(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testBasic(abstractSocketSend:SocketSendFunction) { let testName = "basicTest" func didGetResult(result:NSArray?, ack:AckEmitter?) { @@ -20,7 +20,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: nil, callback: didGetResult) } - static func testNull(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testNull(abstractSocketSend:SocketSendFunction) { let testName = "testNull" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let _ = result?.firstObject as? NSNull { @@ -33,7 +33,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: NSNull(), callback: didGetResult) } - static func testBinary(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testBinary(abstractSocketSend:SocketSendFunction) { let testName = "testBinary" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let data = result?.firstObject as? NSData { @@ -47,7 +47,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: data, callback: didGetResult) } - static func testArray(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testArray(abstractSocketSend:SocketSendFunction) { let testName = "testArray" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let array = result?.firstObject as? NSArray { @@ -61,7 +61,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: ["test1", "test2"], callback: didGetResult) } - static func testString(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testString(abstractSocketSend:SocketSendFunction) { let testName = "testString" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let string = result?.firstObject as? String { @@ -73,7 +73,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: "marco", callback: didGetResult) } - static func testBool(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testBool(abstractSocketSend:SocketSendFunction) { let testName = "testBool" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let bool = result?.firstObject as? NSNumber { @@ -85,7 +85,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: false, callback: didGetResult) } - static func testInteger(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testInteger(abstractSocketSend:SocketSendFunction) { let testName = "testInteger" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let integer = result?.firstObject as? Int { @@ -97,7 +97,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: 10, callback: didGetResult) } - static func testDouble(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testDouble(abstractSocketSend:SocketSendFunction) { let testName = "testDouble" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let double = result?.firstObject as? NSNumber { @@ -109,8 +109,8 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: 1.1, callback: didGetResult) } - static func testJSON(abstractSocketSend:SocketSendFunction, testKind:TestKind) { - let testName = "testJSON" + static func testJSONWithBuffer(abstractSocketSend:SocketSendFunction) { + let testName = "testJSONWithBuffer" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let json = result?.firstObject as? NSDictionary { XCTAssertEqual(json.valueForKey("testString")! as! String, "test") @@ -128,8 +128,8 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: json, callback: didGetResult) } - static func testJSONWithoutBuffer(abstractSocketSend:SocketSendFunction, testKind:TestKind) { - let testName = "testJSONWithoutBuffer" + static func testJSON(abstractSocketSend:SocketSendFunction) { + let testName = "testJSON" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let json = result?.firstObject as? NSDictionary { XCTAssertEqual(json.valueForKey("testString")! as! String, "test") @@ -147,7 +147,7 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: json, callback: didGetResult) } - static func testUnicode(abstractSocketSend:SocketSendFunction, testKind:TestKind) { + static func testUnicode(abstractSocketSend:SocketSendFunction) { let testName = "testUnicode" func didGetResult(result:NSArray?, ack:AckEmitter?) { if let unicode = result?.firstObject as? String { @@ -159,10 +159,14 @@ class SocketTestCases: NSObject { abstractSocketSend(testName: testName, emitData: "🚀", callback: didGetResult) } - static func testMultipleItems(abstractSocketMultipleSend:(testName:String, emitData:Array, callback:NormalCallback)->(), testKind:TestKind) { - let testName = "testMultipleItems" + static func testMultipleItemsWithBuffer(abstractSocketMultipleSend:(testName:String, emitData:Array, callback:NormalCallback)->()) { + let testName = "testMultipleItemsWithBuffer" func didGetResult(result:NSArray?, ack:AckEmitter?) { XCTAssertEqual(result!.count, 5) + if result!.count != 5 { + XCTFail("Fatal Fail. Lost some Data") + return + } if let array = result?.firstObject as? Array { XCTAssertEqual(array.last! as! Int, 2) XCTAssertEqual(array.first! as! Int, 1) @@ -198,4 +202,45 @@ class SocketTestCases: NSObject { let emitArray = [["test1", "test2"], ["test": "test"], 15, "marco", data] abstractSocketMultipleSend(testName: testName, emitData: emitArray, callback: didGetResult) } + + static func testMultipleItems(abstractSocketMultipleSend:(testName:String, emitData:Array, callback:NormalCallback)->()) { + let testName = "testMultipleItems" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + XCTAssertEqual(result!.count, 5) + if result!.count != 5 { + XCTFail("Fatal Fail. Lost some Data") + return + } + if let array = result?.firstObject as? Array { + XCTAssertEqual(array.last! as! Int, 2) + XCTAssertEqual(array.first! as! Int, 1) + }else { + XCTFail("Should have Array as result") + } + if let dict = result?[1] as? NSDictionary { + XCTAssertEqual(dict.valueForKey("test") as! String, "bob") + + }else { + XCTFail("Should have NSDictionary as result") + } + if let number = result?[2] as? Int { + XCTAssertEqual(number, 25) + + }else { + XCTFail("Should have Integer as result") + } + if let string = result?[3] as? String { + XCTAssertEqual(string, "polo") + }else { + XCTFail("Should have Integer as result") + } + if let bool = result?[4] as? NSNumber { + XCTAssertFalse(bool.boolValue) + }else { + XCTFail("Should have NSNumber as result") + } + } + let emitArray = [["test1", "test2"], ["test": "test"], 15, "marco", false] + abstractSocketMultipleSend(testName: testName, emitData: emitArray, callback: didGetResult) + } } From f0b4f077d41cf78e75fab05039d0ddc5e6c02dac Mon Sep 17 00:00:00 2001 From: Lukas Schmidt Date: Sun, 2 Aug 2015 17:44:06 +0200 Subject: [PATCH 18/25] fix crash --- .../xcschemes/SocketIO-iOS.xcscheme | 10 +++++-- SocketIO-iOSTests/AbstractSocketTest.swift | 29 ++++++++++++------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme index e9b0653..baf02a7 100644 --- a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme +++ b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme @@ -37,10 +37,11 @@ + codeCoverageEnabled = "YES"> @@ -62,15 +63,18 @@ ReferencedContainer = "container:Socket.IO-Client-Swift.xcodeproj"> + + String { @@ -42,10 +42,12 @@ class AbstractSocketTest: XCTestCase { func socketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) + weak var expection = self.expectationWithDescription(finalTestname) func didGetEmit(result:NSArray?, ack:AckEmitter?) { callback(result, ack) - expection.fulfill() + if let expection = expection { + expection.fulfill() + } } socket.emit(finalTestname, withItems: emitData) @@ -56,10 +58,13 @@ class AbstractSocketTest: XCTestCase { func socketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) + weak var expection = self.expectationWithDescription(finalTestname) func didGetEmit(result:NSArray?, ack:AckEmitter?) { callback(result, ack) - expection.fulfill() + if let expection = expection { + expection.fulfill() + } + } socket.on(finalTestname + "Return", callback: didGetEmit) @@ -74,10 +79,12 @@ class AbstractSocketTest: XCTestCase { func socketAcknwoledgeMultiple(testName:String, Data:Array, callback:NormalCallback){ let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) + weak var expection = self.expectationWithDescription(finalTestname) func didGetResult(result:NSArray?) { callback(result, nil) - expection.fulfill() + if let expection = expection { + expection.fulfill() + } } socket.emitWithAck(finalTestname, withItems: Data)(timeoutAfter: 5, callback: didGetResult) @@ -86,10 +93,12 @@ class AbstractSocketTest: XCTestCase { func socketAcknwoledge(testName:String, Data:AnyObject?, callback:NormalCallback){ let finalTestname = generateTestName(testName) - let expection = self.expectationWithDescription(finalTestname) + weak var expection = self.expectationWithDescription(finalTestname) func didGet(result:NSArray?) { callback(result, nil) - expection.fulfill() + if let expection = expection { + expection.fulfill() + } } var ack:OnAckCallback! if let Data = Data { From f0a45e13e2ff34619edeaf6ac05476df6656b91c Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 2 Aug 2015 13:09:18 -0400 Subject: [PATCH 19/25] clean up --- SocketIOClientSwift/SocketPacket.swift | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 5adccf6..1d59940 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -98,16 +98,15 @@ struct SocketPacket { for arg in data { if arg is NSDictionary || arg is [AnyObject] { - let jsonSend: NSData? do { - jsonSend = try NSJSONSerialization.dataWithJSONObject(arg, + let jsonSend = try NSJSONSerialization.dataWithJSONObject(arg, options: NSJSONWritingOptions(rawValue: 0)) + let jsonString = NSString(data: jsonSend, encoding: NSUTF8StringEncoding) + + message += jsonString! as String + "," } catch { - jsonSend = nil + print("Error creating JSON object in SocketPacket.completeMessage") } - let jsonString = NSString(data: jsonSend!, encoding: NSUTF8StringEncoding) - - message += jsonString! as String + "," } else if var str = arg as? String { str = str["\n"] ~= "\\\\n" str = str["\r"] ~= "\\\\r" From 150e26aefd8cc8b5b2bbfba8311bfd9862bb1927 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 2 Aug 2015 13:40:45 -0400 Subject: [PATCH 20/25] fix getting args for ack and binary-ack --- SocketIOClientSwift/SocketPacket.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 1d59940..510bb92 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -231,12 +231,16 @@ struct SocketPacket { func getArgs() -> [AnyObject]? { var arr = data - + if data.count == 0 { return nil } else { - arr.removeAtIndex(0) - return arr + if type == PacketType.EVENT || type == PacketType.BINARY_EVENT { + arr.removeAtIndex(0) + return arr + } else { + return arr + } } } } From 2579c04f67798e3603df8fcf0c4a6711c2c6beb4 Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 3 Aug 2015 10:07:59 -0400 Subject: [PATCH 21/25] better swift style --- SocketIOClientSwift/SocketAckManager.swift | 20 ++--- SocketIOClientSwift/SocketAnyEvent.swift | 6 +- SocketIOClientSwift/SocketEngine.swift | 78 ++++++++++---------- SocketIOClientSwift/SocketEngineClient.swift | 14 ++-- SocketIOClientSwift/SocketEventHandler.swift | 14 ++-- SocketIOClientSwift/SocketFixUTF8.swift | 4 +- SocketIOClientSwift/SocketIOClient.swift | 73 +++++++++--------- SocketIOClientSwift/SocketLogger.swift | 10 +-- SocketIOClientSwift/SocketPacket.swift | 46 ++++++------ SocketIOClientSwift/SocketParser.swift | 29 ++++---- SocketIOClientSwift/SocketTypes.swift | 2 +- 11 files changed, 145 insertions(+), 151 deletions(-) diff --git a/SocketIOClientSwift/SocketAckManager.swift b/SocketIOClientSwift/SocketAckManager.swift index a68d247..c206109 100644 --- a/SocketIOClientSwift/SocketAckManager.swift +++ b/SocketIOClientSwift/SocketAckManager.swift @@ -25,38 +25,38 @@ import Foundation private struct SocketAck: Hashable, Equatable { - let ack:Int - var callback:AckCallback! - var hashValue:Int { + let ack: Int + var callback: AckCallback! + var hashValue: Int { return ack.hashValue } - init(ack:Int) { + init(ack: Int) { self.ack = ack } - init(ack:Int, callback:AckCallback) { + init(ack: Int, callback: AckCallback) { self.ack = ack self.callback = callback } } -private func <(lhs:SocketAck, rhs:SocketAck) -> Bool { +private func <(lhs: SocketAck, rhs: SocketAck) -> Bool { return lhs.ack < rhs.ack } -private func ==(lhs:SocketAck, rhs:SocketAck) -> Bool { +private func ==(lhs: SocketAck, rhs: SocketAck) -> Bool { return lhs.ack == rhs.ack } struct SocketAckManager { private var acks = Set(minimumCapacity: 1) - mutating func addAck(ack:Int, callback:AckCallback) { + mutating func addAck(ack: Int, callback: AckCallback) { acks.insert(SocketAck(ack: ack, callback: callback)) } - mutating func executeAck(ack:Int, items:[AnyObject]?) { + mutating func executeAck(ack: Int, items: [AnyObject]?) { let callback = acks.remove(SocketAck(ack: ack)) dispatch_async(dispatch_get_main_queue()) { @@ -64,7 +64,7 @@ struct SocketAckManager { } } - mutating func timeoutAck(ack:Int) { + mutating func timeoutAck(ack: Int) { let callback = acks.remove(SocketAck(ack: ack)) dispatch_async(dispatch_get_main_queue()) { diff --git a/SocketIOClientSwift/SocketAnyEvent.swift b/SocketIOClientSwift/SocketAnyEvent.swift index 9926bc5..3b3e97e 100644 --- a/SocketIOClientSwift/SocketAnyEvent.swift +++ b/SocketIOClientSwift/SocketAnyEvent.swift @@ -25,10 +25,10 @@ import Foundation public final class SocketAnyEvent: NSObject { - public let event:String! - public let items:NSArray? + public let event: String! + public let items: NSArray? - init(event:String, items:NSArray?) { + init(event: String, items: NSArray?) { self.event = event self.items = items } diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index c321833..92e873c 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -25,7 +25,7 @@ import Foundation public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { - private typealias Probe = (msg:String, type:PacketType, data:[NSData]?) + private typealias Probe = (msg: String, type: PacketType, data: [NSData]?) private typealias ProbeWaitQueue = [Probe] private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet @@ -37,12 +37,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private var closed = false private var _connected = false - private var extraHeaders:[String: String]? + private var extraHeaders: [String: String]? private var fastUpgrade = false private var forcePolling = false private var forceWebsockets = false - private var pingInterval:Double? - private var pingTimer:NSTimer? + private var pingInterval: Double? + private var pingTimer: NSTimer? private var pingTimeout = 0.0 { didSet { pongsMissedMax = Int(pingTimeout / (pingInterval ?? 25)) @@ -61,25 +61,25 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { let logType = "SocketEngine" - var connected:Bool { + var connected: Bool { return _connected } - weak var client:SocketEngineClient? - var cookies:[NSHTTPCookie]? + weak var client: SocketEngineClient? + var cookies: [NSHTTPCookie]? var log = false - var polling:Bool { + var polling: Bool { return _polling } var sid = "" var socketPath = "" - var urlPolling:String? - var urlWebSocket:String? - var websocket:Bool { + var urlPolling: String? + var urlWebSocket: String? + var websocket: Bool { return _websocket } var ws:WebSocket? - public enum PacketType:Int { + public enum PacketType: Int { case OPEN = 0 case CLOSE = 1 case PING = 2 @@ -88,7 +88,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { case UPGRADE = 5 case NOOP = 6 - init?(str:String?) { + init?(str: String?) { if let value = Int(str ?? ""), raw = PacketType(rawValue: value) { self = raw } else { @@ -97,13 +97,13 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - public init(client:SocketEngineClient, sessionDelegate:NSURLSessionDelegate?) { + public init(client: SocketEngineClient, sessionDelegate: NSURLSessionDelegate?) { self.client = client self.session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: sessionDelegate, delegateQueue: workQueue) } - public convenience init(client:SocketEngineClient, opts:NSDictionary?) { + public convenience init(client: SocketEngineClient, opts: NSDictionary?) { self.init(client: client, sessionDelegate: opts?["sessionDelegate"] as? NSURLSessionDelegate) forceWebsockets = opts?["forceWebsockets"] as? Bool ?? false forcePolling = opts?["forcePolling"] as? Bool ?? false @@ -117,7 +117,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { SocketLogger.log("Engine is being deinit", client: self) } - public func close(fast fast:Bool) { + public func close(fast fast: Bool) { SocketLogger.log("Engine is being closed. Fast: %@", client: self, args: fast) pingTimer?.invalidate() @@ -133,7 +133,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { stopPolling() } - private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) { + private func createBinaryDataForSend(data: NSData) -> (NSData?, String?) { if websocket { var byteArray = [UInt8](count: 1, repeatedValue: 0x0) byteArray[0] = 4 @@ -151,7 +151,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func createURLs(params:[String: AnyObject]?) -> (String?, String?) { + private func createURLs(params: [String: AnyObject]?) -> (String?, String?) { if client == nil { return (nil, nil) } @@ -159,8 +159,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { let path = socketPath == "" ? "/socket.io" : socketPath let url = "\(client!.socketURL)\(path)/?transport=" - var urlPolling:String - var urlWebSocket:String + var urlPolling: String + var urlWebSocket: String if client!.secure { urlPolling = "https://" + url + "polling" @@ -193,7 +193,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { return (urlPolling, urlWebSocket) } - private func createWebsocket(andConnect connect:Bool) { + private func createWebsocket(andConnect connect: Bool) { let wsUrl = urlWebSocket! + (sid == "" ? "" : "&sid=\(sid)") ws = WebSocket(url: NSURL(string: wsUrl)!, @@ -249,7 +249,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { doRequest(req) } - private func doRequest(req:NSMutableURLRequest) { + private func doRequest(req: NSMutableURLRequest) { if !polling { return } @@ -380,7 +380,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func checkIfMessageIsBase64Binary(var message:String) { + private func checkIfMessageIsBase64Binary(var message: String) { if message.hasPrefix("b4") { // binary in base64 string message.removeRange(Range(start: message.startIndex, @@ -395,7 +395,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func handleMessage(message:String) { + private func handleMessage(message: String) { if let client = client { dispatch_async(client.handleQueue) {[weak client] in client?.parseSocketMessage(message) @@ -407,7 +407,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { doPoll() } - private func handleOpen(openData:String) { + private func handleOpen(openData: String) { let mesData = openData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! do { @@ -437,7 +437,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func handlePong(pongMessage:String) { + private func handlePong(pongMessage: String) { pongsMissed = 0 // We should upgrade @@ -447,7 +447,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } // A poll failed, tell the client about it - private func handlePollingFailed(reason:String) { + private func handlePollingFailed(reason: String) { _connected = false ws?.disconnect() pingTimer?.invalidate() @@ -465,7 +465,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - public func open(opts:[String: AnyObject]? = nil) { + public func open(opts: [String: AnyObject]? = nil) { if connected { SocketLogger.err("Tried to open while connected", client: self) client?.didError("Tried to open while connected") @@ -504,7 +504,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } // Translatation of engine.io-parser#decodePayload - private func parsePollingMessage(str:String) { + private func parsePollingMessage(str: String) { if str.characters.count == 1 { return } @@ -557,7 +557,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func parseEngineData(data:NSData) { + private func parseEngineData(data: NSData) { if let client = client { dispatch_async(client.handleQueue) {[weak self] in self?.client?.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1))) @@ -565,7 +565,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func parseEngineMessage(var message:String, fromPolling:Bool) { + private func parseEngineMessage(var message: String, fromPolling: Bool) { SocketLogger.log("Got message: %@", client: self, args: message) if fromPolling { @@ -602,7 +602,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } /// Send an engine message (4) - public func send(msg:String, withData datas:[NSData]?) { + public func send(msg: String, withData datas: [NSData]?) { if probing { probeWait.append((msg, PacketType.MESSAGE, datas)) } else { @@ -624,7 +624,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /// Send polling message. /// Only call on emitQueue - private func sendPollMessage(var msg:String, withType type:PacketType, + private func sendPollMessage(var msg: String, withType type: PacketType, datas:[NSData]? = nil) { SocketLogger.log("Sending poll: %@ as type: %@", client: self, args: msg, type.rawValue) @@ -648,7 +648,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /// Send message on WebSockets /// Only call on emitQueue - private func sendWebSocketMessage(str:String, withType type:PacketType, + private func sendWebSocketMessage(str: String, withType type: PacketType, datas:[NSData]? = nil) { SocketLogger.log("Sending ws: %@ as type: %@", client: self, args: str, type.rawValue) @@ -696,7 +696,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /** Write a message, independent of transport. */ - public func write(msg:String, withType type:PacketType, withData data:[NSData]?) { + public func write(msg: String, withType type: PacketType, withData data: [NSData]?) { dispatch_async(emitQueue) {[weak self] in if let this = self where this.connected { if this.websocket { @@ -715,7 +715,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /** Write a message, independent of transport. For Objective-C. withData should be an NSArray of NSData */ - public func writeObjc(msg:String, withType type:Int, withData data:NSArray?) { + public func writeObjc(msg: String, withType type: Int, withData data: NSArray?) { if let pType = PacketType(rawValue: type) { var arr = [NSData]() @@ -744,7 +744,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - public func websocketDidDisconnect(socket:WebSocket, error:NSError?) { + public func websocketDidDisconnect(socket: WebSocket, error: NSError?) { websocketConnected = false probing = false @@ -770,11 +770,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - public func websocketDidReceiveMessage(socket:WebSocket, text:String) { + public func websocketDidReceiveMessage(socket: WebSocket, text: String) { parseEngineMessage(text, fromPolling: false) } - public func websocketDidReceiveData(socket:WebSocket, data:NSData) { + public func websocketDidReceiveData(socket: WebSocket, data: NSData) { parseEngineData(data) } } diff --git a/SocketIOClientSwift/SocketEngineClient.swift b/SocketIOClientSwift/SocketEngineClient.swift index 3824722..fe16367 100644 --- a/SocketIOClientSwift/SocketEngineClient.swift +++ b/SocketIOClientSwift/SocketEngineClient.swift @@ -26,12 +26,12 @@ import Foundation @objc public protocol SocketEngineClient { - var handleQueue:dispatch_queue_t! {get} - var socketURL:String {get} - var secure:Bool {get} + var handleQueue: dispatch_queue_t! {get} + var socketURL: String {get} + var secure: Bool {get} - func didError(reason:AnyObject) - func engineDidClose(reason:String) - func parseSocketMessage(msg:String) - func parseBinaryData(data:NSData) + func didError(reason: AnyObject) + func engineDidClose(reason: String) + func parseSocketMessage(msg: String) + func parseBinaryData(data: NSData) } diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index 7b2d92b..5b74cf4 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -24,22 +24,22 @@ import Foundation -private func emitAckCallback(socket:SocketIOClient?, num:Int?) - (items:AnyObject...) -> Void { +private func emitAckCallback(socket: SocketIOClient?, num: Int?) + (items: AnyObject...) -> Void { socket?.emitAck(num ?? -1, withData: items) } struct SocketEventHandler { - let event:String - let callback:NormalCallback + let event: String + let callback: NormalCallback - init(event:String, callback:NormalCallback) { + init(event: String, callback: NormalCallback) { self.event = event self.callback = callback } - func executeCallback(items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil, - withSocket socket:SocketIOClient? = nil) { + func executeCallback(items: NSArray? = nil, withAck ack: Int? = nil, withAckType type: Int? = nil, + withSocket socket: SocketIOClient? = nil) { dispatch_async(dispatch_get_main_queue()) { self.callback(items, emitAckCallback(socket, num: ack)) } diff --git a/SocketIOClientSwift/SocketFixUTF8.swift b/SocketIOClientSwift/SocketFixUTF8.swift index c8ea8ef..4061303 100644 --- a/SocketIOClientSwift/SocketFixUTF8.swift +++ b/SocketIOClientSwift/SocketFixUTF8.swift @@ -25,13 +25,13 @@ import Foundation -func fixDoubleUTF8(inout name:String) { +func fixDoubleUTF8(inout name: String) { let utf8 = name.dataUsingEncoding(NSISOLatin1StringEncoding)! let latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding)! name = latin1 as String } -func doubleEncodeUTF8(inout str:String) { +func doubleEncodeUTF8(inout str: String) { let latin1 = str.dataUsingEncoding(NSUTF8StringEncoding)! let utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding)! str = utf8 as String diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 2660092..7ced5d0 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -31,51 +31,50 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient private var _connecting = false private var currentReconnectAttempt = 0 private var handlers = ContiguousArray() - private var connectParams:[String: AnyObject]? + private var connectParams: [String: AnyObject]? private var _secure = false private var _reconnecting = false - private var reconnectTimer:NSTimer? + private var reconnectTimer: NSTimer? - let reconnectAttempts:Int! + let reconnectAttempts: Int! let logType = "SocketClient" var ackHandlers = SocketAckManager() var currentAck = -1 var log = false var waitingData = [SocketPacket]() - var sessionDelegate:NSURLSessionDelegate? - public let socketURL:String + public let socketURL: String public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL) public let handleQueue = dispatch_queue_create("handleQueue", DISPATCH_QUEUE_SERIAL) public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) - public var closed:Bool { + public var closed: Bool { return _closed } - public var connected:Bool { + public var connected: Bool { return _connected } - public var connecting:Bool { + public var connecting: Bool { return _connecting } public var engine:SocketEngine? public var nsp = "/" - public var opts:[String: AnyObject]? + public var opts: [String: AnyObject]? public var reconnects = true - public var reconnecting:Bool { + public var reconnecting: Bool { return _reconnecting } public var reconnectWait = 10 - public var secure:Bool { + public var secure: Bool { return _secure } - public var sid:String? { + public var sid: String? { return engine?.sid } /** Create a new SocketIOClient. opts can be omitted */ - public init(var socketURL:String, opts:[String: AnyObject]? = nil) { + public init(var socketURL: String, opts: [String: AnyObject]? = nil) { if socketURL["https://"].matches().count != 0 { self._secure = true } @@ -86,11 +85,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient self.socketURL = socketURL self.opts = opts - // Set options - if let sessionDelegate = opts?["sessionDelegate"] as? NSURLSessionDelegate { - self.sessionDelegate = sessionDelegate - } - if let connectParams = opts?["connectParams"] as? [String: AnyObject] { self.connectParams = connectParams } @@ -141,7 +135,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Will turn off automatic reconnects. Pass true to fast if you're closing from a background task */ - public func close(fast fast:Bool) { + public func close(fast fast: Bool) { SocketLogger.log("Closing socket", client: self) reconnects = false @@ -162,7 +156,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Connect to the server. If we aren't connected after timeoutAfter, call handler */ - public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { + public func connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?) { if closed { SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self) _closed = false @@ -191,7 +185,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } } - private func createOnAck(event:String, items:[AnyObject]) -> OnAckCallback { + private func createOnAck(event: String, items: [AnyObject]) -> OnAckCallback { return {[weak self, ack = ++currentAck] timeout, callback in if let this = self { this.ackHandlers.addAck(ack, callback: callback) @@ -226,7 +220,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient handleEvent("connect", data: nil, isInternalMessage: false) } - func didDisconnect(reason:String) { + func didDisconnect(reason: String) { if closed { return } @@ -245,7 +239,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } /// error - public func didError(reason:AnyObject) { + public func didError(reason: AnyObject) { SocketLogger.err("%@", client: self, args: reason) handleEvent("error", data: reason as? [AnyObject] ?? [reason], @@ -255,14 +249,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Same as close */ - public func disconnect(fast fast:Bool) { + public func disconnect(fast fast: Bool) { close(fast: fast) } /** Send a message to the server */ - public func emit(event:String, _ items:AnyObject...) { + public func emit(event:String, _ items: AnyObject...) { if !connected { return } @@ -275,7 +269,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Same as emit, but meant for Objective-C */ - public func emit(event:String, withItems items:[AnyObject]) { + public func emit(event: String, withItems items: [AnyObject]) { if !connected { return } @@ -289,7 +283,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add an ack. */ - public func emitWithAck(event:String, _ items:AnyObject...) -> OnAckCallback { + public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback { if !connected { return createOnAck(event, items: items) } @@ -300,7 +294,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Same as emitWithAck, but for Objective-C */ - public func emitWithAck(event:String, withItems items:[AnyObject]) -> OnAckCallback { + public func emitWithAck(event: String, withItems items: [AnyObject]) -> OnAckCallback { if !connected { return createOnAck(event, items: items) } @@ -308,7 +302,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient return createOnAck(event, items: items) } - private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { + private func _emit(event: String, _ args: [AnyObject], ack: Int? = nil) { if !connected { return } @@ -326,7 +320,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } // If the server wants to know that the client received data - func emitAck(ack:Int, withData args:[AnyObject]) { + func emitAck(ack: Int, withData args: [AnyObject]) { dispatch_async(emitQueue) {[weak self] in if let this = self where this.connected { let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp) @@ -344,7 +338,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } } - public func engineDidClose(reason:String) { + public func engineDidClose(reason: String) { _connected = false _connecting = false @@ -357,7 +351,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } // Called when the socket gets an ack for something it sent - func handleAck(ack:Int, data:AnyObject?) { + func handleAck(ack: Int, data: AnyObject?) { SocketLogger.log("Handling ack: %@ with data: %@", client: self, args: ack, data ?? "") @@ -368,8 +362,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Causes an event to be handled. Only use if you know what you're doing. */ - public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false, - wantsAck ack:Int? = nil) { + public func handleEvent(event: String, data: [AnyObject]?, isInternalMessage: Bool = false, + wantsAck ack: Int? = nil) { // println("Should do event: \(event) with data: \(data)") if !connected && !isInternalMessage { return @@ -417,7 +411,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Removes handler(s) */ - public func off(event:String) { + public func off(event: String) { SocketLogger.log("Removing handler for event: %@", client: self, args: event) handlers = ContiguousArray(handlers.filter {!($0.event == event)}) @@ -426,7 +420,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Adds a handler for an event. */ - public func on(event:String, callback:NormalCallback) { + public func on(event: String, callback: NormalCallback) { SocketLogger.log("Adding handler for event: %@", client: self, args: event) let handler = SocketEventHandler(event: event, callback: callback) @@ -444,7 +438,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Adds a handler that will be called on every event. */ - public func onAny(handler:(SocketAnyEvent) -> Void) { + public func onAny(handler: (SocketAnyEvent) -> Void) { anyHandler = handler } @@ -455,11 +449,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient connect() } - public func parseSocketMessage(msg:String) { + public func parseSocketMessage(msg: String) { SocketParser.parseSocketMessage(msg, socket: self) } - public func parseBinaryData(data:NSData) { + public func parseBinaryData(data: NSData) { SocketParser.parseBinaryData(data, socket: self) } @@ -475,7 +469,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient tryReconnect() } - // We lost connection and should attempt to reestablish @objc private func tryReconnect() { if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { clearReconnectTimer() diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index 3f524bf..65f1156 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -25,18 +25,18 @@ import Foundation protocol SocketLogClient { - var log:Bool {get set} - var logType:String {get} + var log: Bool {get set} + var logType: String {get} } final class SocketLogger { private static let printQueue = dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL) - private static func toCVArgType(item:AnyObject) -> CVarArgType { + private static func toCVArgType(item: AnyObject) -> CVarArgType { return String(item) } - static func log(message:String, client:SocketLogClient, altType:String? = nil, args:AnyObject...) { + static func log(message: String, client: SocketLogClient, altType: String? = nil, args: AnyObject...) { if !client.log { return } @@ -49,7 +49,7 @@ final class SocketLogger { } } - static func err(message:String, client:SocketLogClient, altType:String? = nil, args:AnyObject...) { + static func err(message: String, client: SocketLogClient, altType: String? = nil, args: AnyObject...) { if !client.log { return } diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 510bb92..a127143 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -25,12 +25,12 @@ import Foundation struct SocketPacket { - let nsp:String - let id:Int - let placeholders:Int - let type:PacketType + let nsp: String + let id: Int + let placeholders: Int + let type: PacketType - enum PacketType:Int { + enum PacketType: Int { case CONNECT = 0 case DISCONNECT = 1 case EVENT = 2 @@ -39,7 +39,7 @@ struct SocketPacket { case BINARY_EVENT = 5 case BINARY_ACK = 6 - init?(str:String) { + init?(str: String) { if let int = Int(str), raw = PacketType(rawValue: int) { self = raw } else { @@ -49,9 +49,9 @@ struct SocketPacket { } var currentPlace = 0 - var binary:[NSData] - var data:[AnyObject] - var description:String { + var binary: [NSData] + var data: [AnyObject] + var description: String { var better = "SocketPacket {type: ~~0; data: ~~1; " + "id: ~~2; placeholders: ~~3;}" @@ -63,8 +63,8 @@ struct SocketPacket { return better } - init(type:SocketPacket.PacketType, data:[AnyObject] = [AnyObject](), id:Int = -1, - nsp:String, placeholders:Int = 0, binary:[NSData] = [NSData]()) { + init(type: SocketPacket.PacketType, data: [AnyObject] = [AnyObject](), id: Int = -1, + nsp: String, placeholders: Int = 0, binary: [NSData] = [NSData]()) { self.data = data self.id = id self.nsp = nsp @@ -73,7 +73,7 @@ struct SocketPacket { self.binary = binary } - mutating func addData(data:NSData) -> Bool { + mutating func addData(data: NSData) -> Bool { if placeholders == currentPlace { return true } @@ -89,7 +89,7 @@ struct SocketPacket { } } - private func completeMessage(var message:String, ack:Bool = false) -> String { + private func completeMessage(var message: String, ack: Bool) -> String { if data.count == 0 { return message + "]" } else if !ack { @@ -127,7 +127,7 @@ struct SocketPacket { } func createAck() -> String { - let msg:String + let msg: String if type == PacketType.ACK { if nsp == "/" { @@ -147,8 +147,8 @@ struct SocketPacket { } - func createMessageForEvent(event:String) -> String { - let message:String + func createMessageForEvent(event: String) -> String { + let message: String if type == PacketType.EVENT { if nsp == "/" { @@ -180,7 +180,7 @@ struct SocketPacket { } } - return completeMessage(message) + return completeMessage(message, ack: false) } mutating func fillInPlaceholders() { @@ -197,7 +197,7 @@ struct SocketPacket { data = newArr as [AnyObject] } - private mutating func _fillInPlaceholders(data:AnyObject) -> AnyObject { + private mutating func _fillInPlaceholders(data: AnyObject) -> AnyObject { if let str = data as? String { if let num = str["~~(\\d)"].groups() { return binary[Int(num[1])!] @@ -246,7 +246,7 @@ struct SocketPacket { } extension SocketPacket { - private static func findType(binCount:Int, ack:Bool) -> PacketType { + private static func findType(binCount: Int, ack: Bool) -> PacketType { switch binCount { case 0 where !ack: return PacketType.EVENT @@ -261,7 +261,7 @@ extension SocketPacket { } } - static func packetFromEmitWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { + static func packetFromEmitWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket { let (parsedData, binary) = deconstructData(data) let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData, id: id, nsp: nsp, placeholders: -1, binary: binary) @@ -269,7 +269,7 @@ extension SocketPacket { return packet } - static func packetFromEmitAckWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { + static func packetFromEmitAckWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket { let (parsedData, binary) = deconstructData(data) let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData, id: id, nsp: nsp, placeholders: -1, binary: binary) @@ -279,7 +279,7 @@ extension SocketPacket { } extension SocketPacket { - private static func shred(data:AnyObject, inout binary:[NSData]) -> AnyObject { + private static func shred(data: AnyObject, inout binary: [NSData]) -> AnyObject { if let bin = data as? NSData { let placeholder = ["_placeholder" :true, "num": binary.count] @@ -307,7 +307,7 @@ extension SocketPacket { } } - private static func deconstructData(var data:[AnyObject]) -> ([AnyObject], [NSData]) { + private static func deconstructData(var data: [AnyObject]) -> ([AnyObject], [NSData]) { var binary = [NSData]() for i in 0.. Bool { + private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool { return nsp == socket.nsp } - private static func handleAck(p:SocketPacket, socket:SocketIOClient) { + private static func handleAck(p: SocketPacket, socket: SocketIOClient) { if !isCorrectNamespace(p.nsp, socket) { return } @@ -35,7 +35,7 @@ class SocketParser { socket.handleAck(p.id, data: p.data) } - private static func handleBinaryAck(p:SocketPacket, socket:SocketIOClient) { + private static func handleBinaryAck(p: SocketPacket, socket: SocketIOClient) { if !isCorrectNamespace(p.nsp, socket) { return } @@ -43,7 +43,7 @@ class SocketParser { socket.waitingData.append(p) } - private static func handleBinaryEvent(p:SocketPacket, socket:SocketIOClient) { + private static func handleBinaryEvent(p: SocketPacket, socket: SocketIOClient) { if !isCorrectNamespace(p.nsp, socket) { return } @@ -51,7 +51,7 @@ class SocketParser { socket.waitingData.append(p) } - private static func handleConnect(p:SocketPacket, socket:SocketIOClient) { + private static func handleConnect(p: SocketPacket, socket: SocketIOClient) { if p.nsp == "/" && socket.nsp != "/" { socket.joinNamespace() } else if p.nsp != "/" && socket.nsp == "/" { @@ -61,7 +61,7 @@ class SocketParser { } } - private static func handleEvent(p:SocketPacket, socket:SocketIOClient) { + private static func handleEvent(p: SocketPacket, socket: SocketIOClient) { if !isCorrectNamespace(p.nsp, socket) { return } @@ -71,7 +71,7 @@ class SocketParser { } // Translation of socket.io-client#decodeString - static func parseString(str:String) -> SocketPacket? { + static func parseString(str: String) -> SocketPacket? { let arr = Array(str.characters) let type = String(arr[0]) @@ -79,7 +79,7 @@ class SocketParser { return SocketPacket(type: SocketPacket.PacketType(str: type)!, nsp: "/") } - var id = nil as Int? + var id: Int? var nsp:String? var i = 0 var placeholders = -1 @@ -150,10 +150,11 @@ class SocketParser { } // Parses data for events - static func parseData(data:String) -> AnyObject? { - var err:NSError? + static func parseData(data: String) -> AnyObject? { + var err: NSError? let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) - let parsed:AnyObject? + let parsed: AnyObject? + do { parsed = try NSJSONSerialization.JSONObjectWithData(stringData!, options: NSJSONReadingOptions.MutableContainers) @@ -171,14 +172,14 @@ class SocketParser { } // Parses messages recieved - static func parseSocketMessage(stringMessage:String, socket:SocketIOClient) { + static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) { if stringMessage == "" { return } SocketLogger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage) - let p:SocketPacket + let p: SocketPacket if let pack = parseString(stringMessage) { p = pack @@ -207,7 +208,7 @@ class SocketParser { } } - static func parseBinaryData(data:NSData, socket:SocketIOClient) { + static func parseBinaryData(data: NSData, socket: SocketIOClient) { if socket.waitingData.count == 0 { SocketLogger.err("Got data when not remaking packet", client: socket, altType: "SocketParser") return diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index e5198f9..674e699 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -27,4 +27,4 @@ import Foundation public typealias AckCallback = (NSArray?) -> Void public typealias AckEmitter = (AnyObject...) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void -public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void +public typealias OnAckCallback = (timeoutAfter: UInt64, callback: AckCallback) -> Void From 06e2311accc4c88834472384a4d0bd2c0a015acc Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 3 Aug 2015 12:41:14 -0400 Subject: [PATCH 22/25] fix socketio/socket.io-client-swift#133 can't expose variadics to objective-c --- SocketIOClientSwift/SocketEventHandler.swift | 21 +++++++++++++++++--- SocketIOClientSwift/SocketIOClient.swift | 7 +++++++ SocketIOClientSwift/SocketTypes.swift | 2 ++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index 5b74cf4..f145600 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -29,19 +29,34 @@ private func emitAckCallback(socket: SocketIOClient?, num: Int?) socket?.emitAck(num ?? -1, withData: items) } +private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?) + (items: NSArray) -> Void { + socket?.emitAck(num ?? -1, withData: items as [AnyObject]) +} + struct SocketEventHandler { let event: String - let callback: NormalCallback + let callback: NormalCallback? + let callBackObjectiveC: NormalCallbackObjectiveC? init(event: String, callback: NormalCallback) { self.event = event self.callback = callback + self.callBackObjectiveC = nil } - func executeCallback(items: NSArray? = nil, withAck ack: Int? = nil, withAckType type: Int? = nil, + init(event: String, callback: NormalCallbackObjectiveC) { + self.event = event + self.callback = nil + self.callBackObjectiveC = callback + } + + func executeCallback(items: [AnyObject]? = nil, withAck ack: Int? = nil, withAckType type: Int? = nil, withSocket socket: SocketIOClient? = nil) { dispatch_async(dispatch_get_main_queue()) { - self.callback(items, emitAckCallback(socket, num: ack)) + self.callback != nil ? + self.callback?(items, emitAckCallback(socket, num: ack)) + : self.callBackObjectiveC?(items, emitAckCallbackObjectiveC(socket, num: ack)) } } } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 7ced5d0..e664193 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -426,6 +426,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient let handler = SocketEventHandler(event: event, callback: callback) handlers.append(handler) } + + public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) { + SocketLogger.log("Adding handler for event: %@", client: self, args: event) + + let handler = SocketEventHandler(event: event, callback: callback) + handlers.append(handler) + } /** Removes all handlers. diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 674e699..342564c 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -26,5 +26,7 @@ import Foundation public typealias AckCallback = (NSArray?) -> Void public typealias AckEmitter = (AnyObject...) -> Void +public typealias AckEmitterObjectiveC = (NSArray) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void +public typealias NormalCallbackObjectiveC = (NSArray?, AckEmitterObjectiveC?) -> Void public typealias OnAckCallback = (timeoutAfter: UInt64, callback: AckCallback) -> Void From dd71d4954d64e45117d5142dbc170363bed5fffd Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 3 Aug 2015 13:41:58 -0400 Subject: [PATCH 23/25] update readme --- README.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 776c43a..cf03197 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,11 @@ socket.connect() ```objective-c SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" options:nil]; -[socket on:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { +[socket onObjectiveC:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { NSLog(@"socket connected"); }]; -[socket on:@"currentAmount" callback:^(NSArray* data, void (^ack)(NSArray*)) { +[socket onObjectiveC:@"currentAmount" callback:^(NSArray* data, void (^ack)(NSArray*)) { double cur = [[data objectAtIndex:0] floatValue]; [socket emitWithAck:@"canUpdate" withItems:@[@(cur)]](0, ^(NSArray* data) { @@ -126,17 +126,18 @@ Options Methods ------- 1. `on(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. -2. `onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. -3. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items. -4. `emit(event:String, withItems items:[AnyObject])` - `emit` for Objective-C -5. `emitWithAck(event:String, _ items:AnyObject...) -> (timeoutAfter:UInt64, callback:(NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. -6. `emitWithAck(event:String, withItems items:[AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. -7. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. -8. `connect(#timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. -9. `close(#fast:Bool)` - Closes the socket. Once a socket is closed it should not be reopened. Pass true to fast if you're closing from a background task. -10. `reconnect()` - Causes the client to reconnect to the server. -11. `joinNamespace()` - Causes the client to join nsp. Shouldn't need to be called unless you change nsp manually. -12. `leaveNamespace()` - Causes the client to leave the nsp and go back to / +2. `onObjectiveC(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. +3. `onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. +4. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items. +5. `emit(event:String, withItems items:[AnyObject])` - `emit` for Objective-C +6. `emitWithAck(event:String, _ items:AnyObject...) -> (timeoutAfter:UInt64, callback:(NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. +7. `emitWithAck(event:String, withItems items:[AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. +8. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. +9. `connect(#timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. +10. `close(#fast:Bool)` - Closes the socket. Once a socket is closed it should not be reopened. Pass true to fast if you're closing from a background task. +11. `reconnect()` - Causes the client to reconnect to the server. +12. `joinNamespace()` - Causes the client to join nsp. Shouldn't need to be called unless you change nsp manually. +13. `leaveNamespace()` - Causes the client to leave the nsp and go back to / Client Events ------ From 80ea42c91f776e51a5bd4866a43906cf7dea7f50 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 5 Aug 2015 06:03:06 -0400 Subject: [PATCH 24/25] document objc method --- SocketIOClientSwift/SocketIOClient.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index e664193..459771e 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -427,6 +427,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient handlers.append(handler) } + /** + Adds a handler for an event. + */ public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) { SocketLogger.log("Adding handler for event: %@", client: self, args: event) From ffbe1e4ec4b59021cbc7ee8682c2813f85948520 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 5 Aug 2015 06:09:24 -0400 Subject: [PATCH 25/25] add option for handle queue --- README.md | 1 + SocketIOClientSwift/SocketEventHandler.swift | 4 +-- SocketIOClientSwift/SocketIOClient.swift | 34 +++++++++++++------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index bc30ccd..a66216b 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,7 @@ Options - `sessionDelegate: NSURLSessionDelegate` Sets an NSURLSessionDelegate for the underlying engine. Useful if you need to handle self-signed certs. Default is nil. - `path: String` - If the server uses a custom path. ex: `"/swift"`. Default is `""` - `extraHeaders: [String: String]?` - Adds custom headers to the initial request. Default is nil. +- `handleQueue: dispatch_queue_t` - The dispatch queue that handlers are run on. Default is the main queue. Methods ------- diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index cef0d4d..9559532 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -40,8 +40,6 @@ final class SocketEventHandler { func executeCallback(_ items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil, withSocket socket:SocketIOClient? = nil) { - dispatch_async(dispatch_get_main_queue()) {[weak self] in - self?.callback?(items, ack != nil ? emitAckCallback(socket!, ack!) : nil) - } + self.callback?(items, ack != nil ? emitAckCallback(socket!, ack!) : nil) } } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 0dffd87..d7ff0c5 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -46,7 +46,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient public let socketURL:String public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL) - public let handleQueue = dispatch_queue_create("handleQueue", DISPATCH_QUEUE_SERIAL) + public let handleQueue: dispatch_queue_t! public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) public var closed:Bool { return _closed @@ -121,6 +121,12 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient self.reconnectWait = abs(reconnectWait) } + if let handleQueue = opts?["handleQueue"] as? dispatch_queue_t { + self.handleQueue = handleQueue + } else { + self.handleQueue = dispatch_get_main_queue() + } + super.init() } @@ -393,7 +399,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient args: event, data ?? "") if anyHandler != nil { - dispatch_async(dispatch_get_main_queue()) {[weak self] in + dispatch_async(handleQueue) {[weak self] in self?.anyHandler?(SocketAnyEvent(event: event, items: data)) } } @@ -401,9 +407,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient for handler in handlers { if handler.event == event { if ack != nil { - handler.executeCallback(data, withAck: ack!, withSocket: self) + dispatch_async(handleQueue) {[weak self] in + handler.executeCallback(data, withAck: ack!, withSocket: self) + } } else { - handler.executeCallback(data) + dispatch_async(handleQueue) {[weak self] in + handler.executeCallback(data) + } } } } @@ -448,14 +458,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient let handler = SocketEventHandler(event: event, callback: callback) handlers.append(handler) } - - /** - Removes all handlers. - Can be used after disconnecting to break any potential remaining retain cycles. - */ - public func removeAllHandlers() { - handlers.removeAll(keepCapacity: false) - } + + /** + Removes all handlers. + Can be used after disconnecting to break any potential remaining retain cycles. + */ + public func removeAllHandlers() { + handlers.removeAll(keepCapacity: false) + } /** Adds a handler that will be called on every event.