diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index f4c7536..7eb4cd2 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -58,6 +58,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 */; }; + 949FAE8D1B9B94E600073BE9 /* SocketParserTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */; settings = {ASSET_TAGS = (); }; }; 94A20D611B99E22F00BF9E44 /* SocketAckManagerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */; settings = {ASSET_TAGS = (); }; }; 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; }; 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */; }; @@ -111,6 +112,7 @@ 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 = ""; }; + 949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketParserTest.swift; sourceTree = ""; }; 94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAckManagerTest.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 = ""; }; @@ -202,8 +204,9 @@ 941A4AB91B67A56C00C42318 /* TestKind.swift */, 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */, 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */, - 572EF2291B51F16C00EEBB58 /* Supporting Files */, 94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */, + 572EF2291B51F16C00EEBB58 /* Supporting Files */, + 949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */, ); path = "SocketIO-iOSTests"; sourceTree = ""; @@ -484,6 +487,7 @@ 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */, 74781D5B1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */, 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */, + 949FAE8D1B9B94E600073BE9 /* SocketParserTest.swift in Sources */, 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */, 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */, 94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */, diff --git a/SocketIO-iOSTests/SocketParserTest.swift b/SocketIO-iOSTests/SocketParserTest.swift new file mode 100644 index 0000000..948efb8 --- /dev/null +++ b/SocketIO-iOSTests/SocketParserTest.swift @@ -0,0 +1,81 @@ +// +// SocketParserTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 05.09.15. +// +// + +import XCTest + +class SocketParserTest: XCTestCase { + + //Format key: message; namespace-data-binary-id + static let packetTypes: Dictionary = [ + "0": ("/", [], [], -1), "1": ("/", [], [], -1), + "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]": ("/swift", ["testArrayEmitReturn", ["test3", "test4"]], [], -1), + "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", ["testMultipleItemsWithBufferEmitReturn", [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], -1), + "3/swift,0[[\"test3\",\"test4\"]]": ("/swift", [["test3", "test4"]], [], 0), + "61-/swift,9[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", [ [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], 9), + "4/swift": ("/swift", [], [], -1), + "10": ("/swift", [], [], -1)] + + func testDisconnect() { + let message = "1" + validateParseResult(message) + } + + func testConnect() { + let message = "0" + validateParseResult(message) + } + + func testNameSpaceArrayParse() { + let message = "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]" + validateParseResult(message) + } + + func testNameSpaceArrayAckParse() { + let message = "3/swift,0[[\"test3\",\"test4\"]]" + validateParseResult(message) + } + + func testNameSpaceBinaryEventParse() { + let message = "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]" + validateParseResult(message) + } + + func testNameSpaceBinaryAckParse() { + let message = "61-/swift,9[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]" + validateParseResult(message) + } + + func testNamespaceErrorParse() { + let message = "4/swift" + validateParseResult(message) + } + + func testInvalidInput() { + let message = "10" + validateParseResult(message) + } + + func validateParseResult(message:String) { + let validValues = SocketParserTest.packetTypes[message]! + let packet = SocketParser.parseString(message) + let type = message.substringWithRange(Range(start: message.startIndex, end: message.startIndex.advancedBy(1))) + if let packet = packet { + XCTAssertEqual(packet.type, SocketPacket.PacketType(str:type)!) + XCTAssertEqual(packet.nsp, validValues.0) + XCTAssertTrue((packet.data as NSArray).isEqualToArray(validValues.1)) + XCTAssertTrue((packet.binary as NSArray).isEqualToArray(validValues.2)) + XCTAssertEqual(packet.id, validValues.3) + }else { + XCTFail() + } + } + +// func testParsePerformance() { +// +// } +} diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index e25bd9d..e2f6f85 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -62,15 +62,7 @@ struct SocketPacket { var binary: [NSData] var data: [AnyObject] var description: String { - var better = "SocketPacket {type: ~~0; data: ~~1; " + - "id: ~~2; placeholders: ~~3;}" - - better = better["~~0"] ~= String(type.rawValue) - better = better["~~1"] ~= String(data) - better = better["~~2"] ~= String(id) - better = better["~~3"] ~= String(placeholders) - - return better + return "SocketPacket {type: \(String(type.rawValue)); data: \(String(data)); id: \(id); placeholders: \(placeholders);}" } var event: String { diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index e06681d..d37f8f2 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -173,38 +173,33 @@ class SocketParser { // Parses messages recieved static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) { - if stringMessage == "" { - return - } + guard !stringMessage.isEmpty else { return } + print(stringMessage) Logger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage) - let p: SocketPacket - - if let pack = parseString(stringMessage) { - p = pack - } else { + guard let pack = parseString(stringMessage) else { socket.didError("Error parsing packet") return } - Logger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: p.description) + Logger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: pack.description) - switch p.type { + switch pack.type { case SocketPacket.PacketType.Event: - handleEvent(p, socket: socket) + handleEvent(pack, socket: socket) case SocketPacket.PacketType.Ack: - handleAck(p, socket: socket) + handleAck(pack, socket: socket) case SocketPacket.PacketType.BinaryEvent: - handleBinaryEvent(p, socket: socket) + handleBinaryEvent(pack, socket: socket) case SocketPacket.PacketType.BinaryAck: - handleBinaryAck(p, socket: socket) + handleBinaryAck(pack, socket: socket) case SocketPacket.PacketType.Connect: - handleConnect(p, socket: socket) + handleConnect(pack, socket: socket) case SocketPacket.PacketType.Disconnect: socket.didDisconnect("Got Disconnect") case SocketPacket.PacketType.Error: - socket.didError("Error: \(p.data)") + socket.didError("Error: \(pack.data)") } }