commit
6cdacefdec
@ -43,6 +43,8 @@
|
|||||||
74781D5C1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */; };
|
74781D5C1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */; };
|
||||||
74781D5D1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */; };
|
74781D5D1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74781D591B7E83930042CACA /* SocketIOClientStatus.swift */; };
|
||||||
941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941A4AB91B67A56C00C42318 /* TestKind.swift */; };
|
941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941A4AB91B67A56C00C42318 /* TestKind.swift */; };
|
||||||
|
9421F5D01B9DBF5900D625BB /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9421F5CF1B9DBF5900D625BB /* SocketGenericParser.swift */; settings = {ASSET_TAGS = (); }; };
|
||||||
|
9421F5D11B9DBF5900D625BB /* SocketGenericParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9421F5CF1B9DBF5900D625BB /* SocketGenericParser.swift */; settings = {ASSET_TAGS = (); }; };
|
||||||
94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */; };
|
94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */; };
|
||||||
945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; };
|
945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; };
|
||||||
945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */; };
|
945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */; };
|
||||||
@ -58,6 +60,8 @@
|
|||||||
945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; };
|
945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; };
|
||||||
945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; };
|
945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; };
|
||||||
945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* SocketEmitTest.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 */; };
|
94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; };
|
||||||
94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */; };
|
94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */; };
|
||||||
94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */; };
|
94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */; };
|
||||||
@ -108,8 +112,11 @@
|
|||||||
5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = "<group>"; };
|
5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = "<group>"; };
|
||||||
74781D591B7E83930042CACA /* SocketIOClientStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketIOClientStatus.swift; path = SocketIOClientSwift/SocketIOClientStatus.swift; sourceTree = "<group>"; };
|
74781D591B7E83930042CACA /* SocketIOClientStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketIOClientStatus.swift; path = SocketIOClientSwift/SocketIOClientStatus.swift; sourceTree = "<group>"; };
|
||||||
941A4AB91B67A56C00C42318 /* TestKind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestKind.swift; sourceTree = "<group>"; };
|
941A4AB91B67A56C00C42318 /* TestKind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestKind.swift; sourceTree = "<group>"; };
|
||||||
|
9421F5CF1B9DBF5900D625BB /* SocketGenericParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketGenericParser.swift; sourceTree = "<group>"; };
|
||||||
94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceAcknowledgementTest.swift; sourceTree = "<group>"; };
|
94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceAcknowledgementTest.swift; sourceTree = "<group>"; };
|
||||||
945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = "<group>"; };
|
945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = "<group>"; };
|
||||||
|
949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketParserTest.swift; sourceTree = "<group>"; };
|
||||||
|
94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAckManagerTest.swift; sourceTree = "<group>"; };
|
||||||
94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = "<group>"; };
|
94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = "<group>"; };
|
||||||
94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAcknowledgementTest.swift; sourceTree = "<group>"; };
|
94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAcknowledgementTest.swift; sourceTree = "<group>"; };
|
||||||
94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketTestCases.swift; sourceTree = "<group>"; };
|
94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketTestCases.swift; sourceTree = "<group>"; };
|
||||||
@ -200,7 +207,9 @@
|
|||||||
941A4AB91B67A56C00C42318 /* TestKind.swift */,
|
941A4AB91B67A56C00C42318 /* TestKind.swift */,
|
||||||
94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */,
|
94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */,
|
||||||
94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */,
|
94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */,
|
||||||
|
94A20D601B99E22F00BF9E44 /* SocketAckManagerTest.swift */,
|
||||||
572EF2291B51F16C00EEBB58 /* Supporting Files */,
|
572EF2291B51F16C00EEBB58 /* Supporting Files */,
|
||||||
|
949FAE8C1B9B94E600073BE9 /* SocketParserTest.swift */,
|
||||||
);
|
);
|
||||||
path = "SocketIO-iOSTests";
|
path = "SocketIO-iOSTests";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -261,6 +270,7 @@
|
|||||||
5764DF831B51F254004FF46E /* SocketLogger.swift */,
|
5764DF831B51F254004FF46E /* SocketLogger.swift */,
|
||||||
5764DF841B51F254004FF46E /* SocketPacket.swift */,
|
5764DF841B51F254004FF46E /* SocketPacket.swift */,
|
||||||
5764DF851B51F254004FF46E /* SocketParser.swift */,
|
5764DF851B51F254004FF46E /* SocketParser.swift */,
|
||||||
|
9421F5CF1B9DBF5900D625BB /* SocketGenericParser.swift */,
|
||||||
5764DF861B51F254004FF46E /* SocketTypes.swift */,
|
5764DF861B51F254004FF46E /* SocketTypes.swift */,
|
||||||
5764DF871B51F254004FF46E /* SwiftRegex.swift */,
|
5764DF871B51F254004FF46E /* SwiftRegex.swift */,
|
||||||
5764DF881B51F254004FF46E /* WebSocket.swift */,
|
5764DF881B51F254004FF46E /* WebSocket.swift */,
|
||||||
@ -448,6 +458,7 @@
|
|||||||
5764DF911B51F254004FF46E /* SocketEventHandler.swift in Sources */,
|
5764DF911B51F254004FF46E /* SocketEventHandler.swift in Sources */,
|
||||||
5764DF931B51F254004FF46E /* SocketFixUTF8.swift in Sources */,
|
5764DF931B51F254004FF46E /* SocketFixUTF8.swift in Sources */,
|
||||||
5764DF951B51F254004FF46E /* SocketIOClient.swift in Sources */,
|
5764DF951B51F254004FF46E /* SocketIOClient.swift in Sources */,
|
||||||
|
9421F5D01B9DBF5900D625BB /* SocketGenericParser.swift in Sources */,
|
||||||
5764DF8B1B51F254004FF46E /* SocketAnyEvent.swift in Sources */,
|
5764DF8B1B51F254004FF46E /* SocketAnyEvent.swift in Sources */,
|
||||||
5764DF971B51F254004FF46E /* SocketLogger.swift in Sources */,
|
5764DF971B51F254004FF46E /* SocketLogger.swift in Sources */,
|
||||||
74781D5A1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */,
|
74781D5A1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */,
|
||||||
@ -469,17 +480,20 @@
|
|||||||
94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */,
|
94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */,
|
||||||
945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */,
|
945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */,
|
||||||
945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */,
|
945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */,
|
||||||
|
9421F5D11B9DBF5900D625BB /* SocketGenericParser.swift in Sources */,
|
||||||
941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */,
|
941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */,
|
||||||
94CB8F0D1B6E66E60019ED53 /* AbstractSocketTest.swift in Sources */,
|
94CB8F0D1B6E66E60019ED53 /* AbstractSocketTest.swift in Sources */,
|
||||||
945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */,
|
945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */,
|
||||||
945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */,
|
945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */,
|
||||||
945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */,
|
945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */,
|
||||||
|
94A20D611B99E22F00BF9E44 /* SocketAckManagerTest.swift in Sources */,
|
||||||
945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */,
|
945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */,
|
||||||
945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */,
|
945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */,
|
||||||
94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */,
|
94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */,
|
||||||
945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */,
|
945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */,
|
||||||
74781D5B1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */,
|
74781D5B1B7E83930042CACA /* SocketIOClientStatus.swift in Sources */,
|
||||||
945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */,
|
945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */,
|
||||||
|
949FAE8D1B9B94E600073BE9 /* SocketParserTest.swift in Sources */,
|
||||||
94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */,
|
94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */,
|
||||||
945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */,
|
945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */,
|
||||||
94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */,
|
94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */,
|
||||||
|
|||||||
52
SocketGenericParser.swift
Normal file
52
SocketGenericParser.swift
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
//
|
||||||
|
// GenericSocketParser.swift
|
||||||
|
// Socket.IO-Client-Swift
|
||||||
|
//
|
||||||
|
// Created by Lukas Schmidt on 07.09.15.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
struct SocketGenericParser {
|
||||||
|
let message: String
|
||||||
|
var currentIndex: Int
|
||||||
|
var messageCharacters: [Character] {
|
||||||
|
get {
|
||||||
|
return Array(message.characters)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var currentCharacter: String? {
|
||||||
|
get{
|
||||||
|
if currentIndex >= messageCharacters.count {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return String(messageCharacters[currentIndex])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mutating func read(characterLength:Int) -> String? {
|
||||||
|
let startIndex = message.startIndex.advancedBy(currentIndex)
|
||||||
|
let range = Range<String.Index>(start: startIndex, end: startIndex.advancedBy(characterLength))
|
||||||
|
currentIndex = currentIndex + characterLength
|
||||||
|
|
||||||
|
return message.substringWithRange(range)
|
||||||
|
}
|
||||||
|
|
||||||
|
mutating func readUntilStringOccurence(string:String) -> String? {
|
||||||
|
let startIndex = message.startIndex.advancedBy(currentIndex)
|
||||||
|
let range = Range<String.Index>(start: startIndex, end: message.endIndex)
|
||||||
|
let subString = message.substringWithRange(range) as NSString
|
||||||
|
let foundRange = subString.rangeOfString(string)
|
||||||
|
if foundRange.location == Int.max {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
currentIndex = currentIndex + foundRange.location
|
||||||
|
|
||||||
|
return subString.substringToIndex(foundRange.location)
|
||||||
|
}
|
||||||
|
|
||||||
|
mutating func readUntilEnd() ->String {
|
||||||
|
return read(messageCharacters.count - currentIndex)!
|
||||||
|
}
|
||||||
|
}
|
||||||
26
SocketIO-iOSTests/SocketAckManagerTest.swift
Normal file
26
SocketIO-iOSTests/SocketAckManagerTest.swift
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
//
|
||||||
|
// SocketAckManagerTest.swift
|
||||||
|
// Socket.IO-Client-Swift
|
||||||
|
//
|
||||||
|
// Created by Lukas Schmidt on 04.09.15.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
import XCTest
|
||||||
|
|
||||||
|
class SocketAckManagerTest: XCTestCase {
|
||||||
|
var ackManager = SocketAckManager()
|
||||||
|
|
||||||
|
func testAddAcks() {
|
||||||
|
let callbackExpection = self.expectationWithDescription("callbackExpection")
|
||||||
|
let itemsArray = ["Hi", "ho"]
|
||||||
|
func callback(items: NSArray?) {
|
||||||
|
callbackExpection.fulfill()
|
||||||
|
items?.isEqualToArray(itemsArray)
|
||||||
|
}
|
||||||
|
ackManager.addAck(1, callback: callback)
|
||||||
|
ackManager.executeAck(1, items: itemsArray)
|
||||||
|
waitForExpectationsWithTimeout(3.0, handler: nil)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -21,11 +21,12 @@ class SocketAcknowledgementTest: AbstractSocketTest {
|
|||||||
"forcePolling": false,
|
"forcePolling": false,
|
||||||
"forceWebsockets": false,// default false
|
"forceWebsockets": false,// default false
|
||||||
"path": ""])
|
"path": ""])
|
||||||
|
openConnection()
|
||||||
}else {
|
}else {
|
||||||
AbstractSocketTest.socket.leaveNamespace()
|
AbstractSocketTest.socket.leaveNamespace()
|
||||||
}
|
}
|
||||||
|
|
||||||
openConnection()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func testConnectionStatus() {
|
func testConnectionStatus() {
|
||||||
|
|||||||
@ -22,11 +22,12 @@ class SocketEmitTest: AbstractSocketTest {
|
|||||||
"forceWebsockets": false,// default false
|
"forceWebsockets": false,// default false
|
||||||
"path": ""]
|
"path": ""]
|
||||||
)
|
)
|
||||||
|
openConnection()
|
||||||
}else {
|
}else {
|
||||||
AbstractSocketTest.socket.leaveNamespace()
|
AbstractSocketTest.socket.leaveNamespace()
|
||||||
}
|
}
|
||||||
|
|
||||||
openConnection()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override func tearDown() {
|
override func tearDown() {
|
||||||
|
|||||||
@ -22,11 +22,12 @@ class SocketNamespaceAcknowledgementTest: AbstractSocketTest {
|
|||||||
"forceWebsockets": false,// default false
|
"forceWebsockets": false,// default false
|
||||||
"path": "",
|
"path": "",
|
||||||
"nsp": "/swift"])
|
"nsp": "/swift"])
|
||||||
|
openConnection()
|
||||||
}else {
|
}else {
|
||||||
AbstractSocketTest.socket.joinNamespace("/swift")
|
AbstractSocketTest.socket.joinNamespace("/swift")
|
||||||
}
|
}
|
||||||
|
|
||||||
openConnection()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func testConnectionStatus() {
|
func testConnectionStatus() {
|
||||||
|
|||||||
@ -22,13 +22,12 @@ class SocketNamespaceEmitTest: AbstractSocketTest {
|
|||||||
"forceWebsockets": false,// default false
|
"forceWebsockets": false,// default false
|
||||||
"path": "",
|
"path": "",
|
||||||
"nsp": "/swift"])
|
"nsp": "/swift"])
|
||||||
|
openConnection()
|
||||||
}else {
|
}else {
|
||||||
AbstractSocketTest.socket.joinNamespace("/swift")
|
AbstractSocketTest.socket.joinNamespace("/swift")
|
||||||
}
|
}
|
||||||
|
|
||||||
openConnection()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func testConnectionStatus() {
|
func testConnectionStatus() {
|
||||||
super.checkConnectionStatus()
|
super.checkConnectionStatus()
|
||||||
}
|
}
|
||||||
|
|||||||
105
SocketIO-iOSTests/SocketParserTest.swift
Normal file
105
SocketIO-iOSTests/SocketParserTest.swift
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
//
|
||||||
|
// 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<String, (String, [AnyObject], [NSData], Int)> = [
|
||||||
|
"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,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", [ [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], 19),
|
||||||
|
"4/swift,": ("/swift", [], [], -1),
|
||||||
|
"0/swift": ("/swift", [], [], -1),
|
||||||
|
"1/swift": ("/swift", [], [], -1)]
|
||||||
|
|
||||||
|
func testDisconnect() {
|
||||||
|
let message = "1"
|
||||||
|
validateParseResult(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testConnect() {
|
||||||
|
let message = "0"
|
||||||
|
validateParseResult(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testDisconnectNameSpace() {
|
||||||
|
let message = "1/swift"
|
||||||
|
validateParseResult(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testConnecttNameSpace() {
|
||||||
|
let message = "0/swift"
|
||||||
|
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,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]"
|
||||||
|
validateParseResult(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testNamespaceErrorParse() {
|
||||||
|
let message = "4/swift,"
|
||||||
|
validateParseResult(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testInvalidInput() {
|
||||||
|
let message = "8"
|
||||||
|
XCTAssertNil(SocketParser.parseString(message))
|
||||||
|
}
|
||||||
|
|
||||||
|
func testGenericParser() {
|
||||||
|
var parser = SocketGenericParser(message: "61-/swift,", currentIndex: 0)
|
||||||
|
XCTAssertEqual(parser.read(1), "6")
|
||||||
|
XCTAssertEqual(parser.currentCharacter, "1")
|
||||||
|
XCTAssertEqual(parser.readUntilStringOccurence("-"), "1")
|
||||||
|
XCTAssertEqual(parser.currentCharacter, "-")
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateParseResult(message:String) {
|
||||||
|
let validValues = SocketParserTest.packetTypes[message]!
|
||||||
|
let packet = SocketParser.parseString(message)
|
||||||
|
let type = message.substringWithRange(Range<String.Index>(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() {
|
||||||
|
let keys = Array(SocketParserTest.packetTypes.keys)
|
||||||
|
measureBlock({
|
||||||
|
for item in keys.enumerate() {
|
||||||
|
SocketParser.parseString(item.element)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -62,15 +62,7 @@ struct SocketPacket {
|
|||||||
var binary: [NSData]
|
var binary: [NSData]
|
||||||
var data: [AnyObject]
|
var data: [AnyObject]
|
||||||
var description: String {
|
var description: String {
|
||||||
var better = "SocketPacket {type: ~~0; data: ~~1; " +
|
return "SocketPacket {type: \(String(type.rawValue)); data: \(String(data)); id: \(id); placeholders: \(placeholders);}"
|
||||||
"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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var event: String {
|
var event: String {
|
||||||
|
|||||||
@ -23,30 +23,25 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
class SocketParser {
|
class SocketParser {
|
||||||
|
|
||||||
private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool {
|
private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool {
|
||||||
return nsp == socket.nsp
|
return nsp == socket.nsp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static func handleEvent(p: SocketPacket, socket: SocketIOClient) {
|
||||||
|
guard isCorrectNamespace(p.nsp, socket) else { return }
|
||||||
|
socket.handleEvent(p.event, data: p.args,
|
||||||
|
isInternalMessage: false, wantsAck: p.id)
|
||||||
|
}
|
||||||
|
|
||||||
private static func handleAck(p: SocketPacket, socket: SocketIOClient) {
|
private static func handleAck(p: SocketPacket, socket: SocketIOClient) {
|
||||||
if !isCorrectNamespace(p.nsp, socket) {
|
guard isCorrectNamespace(p.nsp, socket) else { return }
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
socket.handleAck(p.id, data: p.data)
|
socket.handleAck(p.id, data: p.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func handleBinaryAck(p: SocketPacket, socket: SocketIOClient) {
|
private static func handleBinary(p: SocketPacket, socket: SocketIOClient) {
|
||||||
if !isCorrectNamespace(p.nsp, socket) {
|
guard isCorrectNamespace(p.nsp, socket) else { return }
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
socket.waitingData.append(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
private static func handleBinaryEvent(p: SocketPacket, socket: SocketIOClient) {
|
|
||||||
if !isCorrectNamespace(p.nsp, socket) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
socket.waitingData.append(p)
|
socket.waitingData.append(p)
|
||||||
}
|
}
|
||||||
@ -61,169 +56,113 @@ class SocketParser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func handleEvent(p: SocketPacket, socket: SocketIOClient) {
|
|
||||||
if !isCorrectNamespace(p.nsp, socket) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
socket.handleEvent(p.event, data: p.args,
|
|
||||||
isInternalMessage: false, wantsAck: p.id)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Translation of socket.io-client#decodeString
|
// Translation of socket.io-client#decodeString
|
||||||
static func parseString(str: String) -> SocketPacket? {
|
static func parseString(message: String) -> SocketPacket? {
|
||||||
let arr = Array(str.characters)
|
var parser = SocketGenericParser(message: message, currentIndex: 0)
|
||||||
let type = String(arr[0])
|
guard let typeString = parser.read(1),
|
||||||
|
let type = SocketPacket.PacketType(str: typeString) else {
|
||||||
if arr.count == 1 {
|
return nil
|
||||||
return SocketPacket(type: SocketPacket.PacketType(str: type)!, nsp: "/")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var id: Int?
|
if parser.messageCharacters.count == 1 {
|
||||||
var nsp:String?
|
return SocketPacket(type: type, nsp: "/")
|
||||||
var i = 0
|
}
|
||||||
|
|
||||||
|
var namespace: String?
|
||||||
var placeholders = -1
|
var placeholders = -1
|
||||||
|
|
||||||
if type == "5" || type == "6" {
|
if type == .BinaryEvent || type == .BinaryAck {
|
||||||
var buf = ""
|
if let buffer = parser.readUntilStringOccurence("-"), let holders = Int(buffer)
|
||||||
|
where parser.read(1)! == "-" {
|
||||||
while arr[++i] != "-" {
|
|
||||||
buf += String(arr[i])
|
|
||||||
if i == arr.count {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let holders = Int(buf) where arr[i] == "-" {
|
|
||||||
placeholders = holders
|
placeholders = holders
|
||||||
} else {
|
} else {
|
||||||
NSLog("Error parsing \(str)")
|
return nil
|
||||||
return nil
|
}
|
||||||
|
}
|
||||||
|
if parser.currentCharacter == "/" {
|
||||||
|
namespace = parser.readUntilStringOccurence(",") ?? parser.readUntilEnd()
|
||||||
|
parser.currentIndex++
|
||||||
|
}
|
||||||
|
|
||||||
|
if parser.currentIndex >= parser.messageCharacters.count {
|
||||||
|
return SocketPacket(type: type, id: -1,
|
||||||
|
nsp: namespace ?? "/", placeholders: placeholders)
|
||||||
|
}
|
||||||
|
|
||||||
|
var idString = ""
|
||||||
|
while parser.currentIndex < parser.messageCharacters.count {
|
||||||
|
if let next = parser.read(1), let int = Int(next) {
|
||||||
|
idString += String(int)
|
||||||
|
} else {
|
||||||
|
parser.currentIndex -= 2
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if arr[i + 1] == "/" {
|
let d = message[message.startIndex.advancedBy(parser.currentIndex + 1)...message.startIndex.advancedBy(message.characters.count - 1)]
|
||||||
nsp = ""
|
let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\""
|
||||||
|
let data = parseData(noPlaceholders) as? [AnyObject] ?? [noPlaceholders]
|
||||||
while ++i < arr.count {
|
|
||||||
let c = arr[i]
|
|
||||||
|
|
||||||
if c == "," {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
nsp! += String(c)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if i + 1 >= arr.count {
|
return SocketPacket(type: type, data: data, id: Int(idString) ?? -1,
|
||||||
return SocketPacket(type: SocketPacket.PacketType(str: type)!, id: id ?? -1,
|
nsp: namespace ?? "/", placeholders: placeholders)
|
||||||
nsp: nsp ?? "/", placeholders: placeholders)
|
|
||||||
}
|
|
||||||
|
|
||||||
let next = String(arr[i + 1])
|
|
||||||
|
|
||||||
if Int(next) != nil {
|
|
||||||
var c = ""
|
|
||||||
while ++i < arr.count {
|
|
||||||
if let int = Int(String(arr[i])) {
|
|
||||||
c += String(int)
|
|
||||||
} else {
|
|
||||||
--i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
id = Int(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
if ++i < arr.count {
|
|
||||||
let d = str[str.startIndex.advancedBy(i)...str.startIndex.advancedBy(str.characters.count-1)]
|
|
||||||
let noPlaceholders = d["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] ~= "\"~~$2\""
|
|
||||||
let data = SocketParser.parseData(noPlaceholders) as? [AnyObject] ?? [noPlaceholders]
|
|
||||||
|
|
||||||
return SocketPacket(type: SocketPacket.PacketType(str: type)!, data: data, id: id ?? -1,
|
|
||||||
nsp: nsp ?? "/", placeholders: placeholders)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parses data for events
|
// Parses data for events
|
||||||
static func parseData(data: String) -> AnyObject? {
|
static func parseData(data: String) -> AnyObject? {
|
||||||
var err: NSError?
|
|
||||||
let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
|
let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
|
||||||
let parsed: AnyObject?
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
parsed = try NSJSONSerialization.JSONObjectWithData(stringData!,
|
return try NSJSONSerialization.JSONObjectWithData(stringData!,
|
||||||
options: NSJSONReadingOptions.MutableContainers)
|
options: NSJSONReadingOptions.MutableContainers)
|
||||||
} catch let error as NSError {
|
} catch {
|
||||||
err = error
|
Logger.error("Parsing JSON: %@", type: "SocketParser", args: data)
|
||||||
parsed = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
// println(err)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return parsed
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parses messages recieved
|
// Parses messages recieved
|
||||||
static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) {
|
static func parseSocketMessage(message: String, socket: SocketIOClient) {
|
||||||
if stringMessage == "" {
|
guard !message.isEmpty else { return }
|
||||||
|
|
||||||
|
Logger.log("Parsing %@", type: "SocketParser", args: message)
|
||||||
|
|
||||||
|
guard let pack = parseString(message) else {
|
||||||
|
Logger.error("Parsing message", type: "SocketParser", args: message)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Logger.log("Decoded packet as: %@", type: "SocketParser", args: pack.description)
|
||||||
|
|
||||||
Logger.log("Parsing %@", type: "SocketParser", args: stringMessage)
|
switch pack.type {
|
||||||
|
case .Event:
|
||||||
let p: SocketPacket
|
handleEvent(pack, socket: socket)
|
||||||
|
case .Ack:
|
||||||
if let pack = parseString(stringMessage) {
|
handleAck(pack, socket: socket)
|
||||||
p = pack
|
case .BinaryEvent:
|
||||||
} else {
|
handleBinary(pack, socket: socket)
|
||||||
socket.didError("Error parsing packet")
|
case .BinaryAck:
|
||||||
return
|
handleBinary(pack, socket: socket)
|
||||||
}
|
case .Connect:
|
||||||
|
handleConnect(pack, socket: socket)
|
||||||
Logger.log("Decoded packet as: %@", type: "SocketParser", args: p.description)
|
case .Disconnect:
|
||||||
|
|
||||||
switch p.type {
|
|
||||||
case SocketPacket.PacketType.Event:
|
|
||||||
handleEvent(p, socket: socket)
|
|
||||||
case SocketPacket.PacketType.Ack:
|
|
||||||
handleAck(p, socket: socket)
|
|
||||||
case SocketPacket.PacketType.BinaryEvent:
|
|
||||||
handleBinaryEvent(p, socket: socket)
|
|
||||||
case SocketPacket.PacketType.BinaryAck:
|
|
||||||
handleBinaryAck(p, socket: socket)
|
|
||||||
case SocketPacket.PacketType.Connect:
|
|
||||||
handleConnect(p, socket: socket)
|
|
||||||
case SocketPacket.PacketType.Disconnect:
|
|
||||||
socket.didDisconnect("Got Disconnect")
|
socket.didDisconnect("Got Disconnect")
|
||||||
case SocketPacket.PacketType.Error:
|
case .Error:
|
||||||
socket.didError("Error: \(p.data)")
|
socket.didError("Error: \(pack.data)")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static func parseBinaryData(data: NSData, socket: SocketIOClient) {
|
static func parseBinaryData(data: NSData, socket: SocketIOClient) {
|
||||||
if socket.waitingData.count == 0 {
|
guard !socket.waitingData.isEmpty else {
|
||||||
Logger.error("Got data when not remaking packet", type: "SocketParser")
|
Logger.error("Got data when not remaking packet", type: "SocketParser")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let shouldExecute = socket.waitingData[0].addData(data)
|
let shouldExecute = socket.waitingData[0].addData(data)
|
||||||
|
guard shouldExecute else { return }
|
||||||
if !shouldExecute {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var packet = socket.waitingData.removeAtIndex(0)
|
var packet = socket.waitingData.removeAtIndex(0)
|
||||||
packet.fillInPlaceholders()
|
packet.fillInPlaceholders()
|
||||||
|
|
||||||
if packet.type != SocketPacket.PacketType.BinaryAck {
|
if packet.type != .BinaryAck {
|
||||||
socket.handleEvent(packet.event, data: packet.args,
|
socket.handleEvent(packet.event, data: packet.args,
|
||||||
isInternalMessage: false, wantsAck: packet.id)
|
isInternalMessage: false, wantsAck: packet.id)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user