Skip to content

Commit d06c1e5

Browse files
committed
Merge branch 'development'
* development: update changelog update starscream for spm Fix tests so they don't rely on comparing strings or the order of hashed collections don't bind error when we're not pattern matching Clarify comments to explain why we did the move Added comments to document changes reasons Fixed loosing POST packets on web socket connection failure and engine memory leak on server errors. add test for extraHeaders on objc
2 parents 6564d1a + 2cc47b0 commit d06c1e5

File tree

11 files changed

+280
-144
lines changed

11 files changed

+280
-144
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# v13.2.1
2+
3+
- Fix packets getting lost when WebSocket upgrade fails. [#1033](https://github.com/socketio/socket.io-client-swift/issues/1033)
4+
- Fix bad unit tests. [#794](https://github.com/socketio/socket.io-client-swift/issues/794)
5+
16
# v13.2.0
27

38
- Add ability to bypass Data inspection in emits. [#992]((https://github.com/socketio/socket.io-client-swift/issues/992))

Cartfile.resolved

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
github "daltoniam/Starscream" "3.0.4"
2-
github "daltoniam/common-crypto-spm" "1.1.0"
3-
github "daltoniam/zlib-spm" "1.1.0"
1+
github "daltoniam/Starscream" "3.0.5"

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Source/SocketIO/Ack/SocketAckEmitter.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ public final class SocketAckEmitter : NSObject {
7575

7676
do {
7777
socket.emitAck(ackNum, with: try items.map({ try $0.socketRepresentation() }))
78-
} catch let err {
79-
socket.handleClientEvent(.error, data: [ackNum, items, err])
78+
} catch {
79+
socket.handleClientEvent(.error, data: [ackNum, items, error])
8080
}
8181
}
8282

Source/SocketIO/Client/SocketIOClient.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,11 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
214214
open func emit(_ event: String, _ items: SocketData...) {
215215
do {
216216
try emit(event, with: items.map({ try $0.socketRepresentation() }))
217-
} catch let err {
217+
} catch {
218218
DefaultSocketLogger.Logger.error("Error creating socketRepresentation for emit: \(event), \(items)",
219219
type: logType)
220220

221-
handleClientEvent(.error, data: [event, items, err])
221+
handleClientEvent(.error, data: [event, items, error])
222222
}
223223
}
224224

@@ -253,11 +253,11 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
253253
open func emitWithAck(_ event: String, _ items: SocketData...) -> OnAckCallback {
254254
do {
255255
return emitWithAck(event, with: try items.map({ try $0.socketRepresentation() }))
256-
} catch let err {
256+
} catch {
257257
DefaultSocketLogger.Logger.error("Error creating socketRepresentation for emit: \(event), \(items)",
258258
type: logType)
259259

260-
handleClientEvent(.error, data: [event, items, err])
260+
handleClientEvent(.error, data: [event, items, error])
261261

262262
return OnAckCallback(ackNumber: -1, items: [], socket: self)
263263
}

Source/SocketIO/Client/SocketRawView.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ public final class SocketRawView : NSObject {
4848
public func emit(_ event: String, _ items: SocketData...) {
4949
do {
5050
try emit(event, with: items.map({ try $0.socketRepresentation() }))
51-
} catch let err {
51+
} catch {
5252
DefaultSocketLogger.Logger.error("Error creating socketRepresentation for emit: \(event), \(items)",
5353
type: "SocketIOClient")
5454

55-
socket.handleClientEvent(.error, data: [event, items, err])
55+
socket.handleClientEvent(.error, data: [event, items, error])
5656
}
5757
}
5858

@@ -87,11 +87,11 @@ public final class SocketRawView : NSObject {
8787
public func emitWithAck(_ event: String, _ items: SocketData...) -> OnAckCallback {
8888
do {
8989
return emitWithAck(event, with: try items.map({ try $0.socketRepresentation() }))
90-
} catch let err {
90+
} catch {
9191
DefaultSocketLogger.Logger.error("Error creating socketRepresentation for emit: \(event), \(items)",
9292
type: "SocketIOClient")
9393

94-
socket.handleClientEvent(.error, data: [event, items, err])
94+
socket.handleClientEvent(.error, data: [event, items, error])
9595

9696
return OnAckCallback(ackNumber: -1, items: [], socket: socket)
9797
}
@@ -146,8 +146,8 @@ public final class SocketRawAckView : NSObject {
146146

147147
do {
148148
socket.emit(try items.map({ try $0.socketRepresentation() }), ack: ackNum, binary: false, isAck: true)
149-
} catch let err {
150-
socket.handleClientEvent(.error, data: [ackNum, items, err])
149+
} catch {
150+
socket.handleClientEvent(.error, data: [ackNum, items, error])
151151
}
152152
}
153153

Source/SocketIO/Engine/SocketEngine.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,13 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
371371
fastUpgrade = false
372372
probing = false
373373
flushProbeWait()
374+
375+
// Need to flush postWait to socket since it connected successfully
376+
// moved from flushProbeWait() since it is also called on connected failure, and we don't want to try and send
377+
// packets through WebSockets when WebSockets has failed!
378+
if !postWait.isEmpty {
379+
flushWaitingForPostToWebSocket()
380+
}
374381
}
375382

376383
private func flushProbeWait() {
@@ -381,10 +388,6 @@ open class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePollable, So
381388
}
382389

383390
probeWait.removeAll(keepingCapacity: false)
384-
385-
if postWait.count != 0 {
386-
flushWaitingForPostToWebSocket()
387-
}
388391
}
389392

390393
/// Causes any packets that were waiting for POSTing to be sent through the WebSocket. This happens because when

Source/SocketIO/Manager/SocketManager.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ open class SocketManager : NSObject, SocketManagerSpec, SocketParsable, SocketDa
169169

170170
engine?.engineQueue.sync {
171171
self.engine?.client = nil
172+
173+
// Close old engine so it will not leak because of URLSession if in polling mode
174+
self.engine?.disconnect(reason: "Adding new engine")
172175
}
173176

174177
engine = SocketEngine(client: self, url: socketURL, config: config)

Tests/TestSocketIO/SocketBasicPacketTest.swift

Lines changed: 106 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -9,143 +9,180 @@
99
import XCTest
1010
@testable import SocketIO
1111

12-
class SocketBasicPacketTest: XCTestCase {
13-
let data = "test".data(using: String.Encoding.utf8)!
14-
let data2 = "test2".data(using: String.Encoding.utf8)!
15-
16-
func testEmpyEmit() {
17-
let expectedSendString = "2[\"test\"]"
12+
class SocketBasicPacketTest : XCTestCase {
13+
func testEmptyEmit() {
1814
let sendData = ["test"]
19-
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false)
15+
let packetStr = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false).packetString
16+
let parsed = parser.parseSocketMessage(packetStr)!
2017

21-
XCTAssertEqual(packet.packetString, expectedSendString)
18+
XCTAssertEqual(parsed.type, .event)
19+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData))
2220
}
2321

2422
func testNullEmit() {
25-
let expectedSendString = "2[\"test\",null]"
2623
let sendData: [Any] = ["test", NSNull()]
27-
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false)
24+
let packetStr = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false).packetString
25+
let parsed = parser.parseSocketMessage(packetStr)!
2826

29-
XCTAssertEqual(packet.packetString, expectedSendString)
27+
XCTAssertEqual(parsed.type, .event)
28+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData))
3029
}
3130

3231
func testStringEmit() {
33-
let expectedSendString = "2[\"test\",\"foo bar\"]"
3432
let sendData = ["test", "foo bar"]
35-
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false)
33+
let packetStr = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false).packetString
34+
let parsed = parser.parseSocketMessage(packetStr)!
3635

37-
XCTAssertEqual(packet.packetString, expectedSendString)
36+
XCTAssertEqual(parsed.type, .event)
37+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData))
3838
}
3939

4040
func testStringEmitWithQuotes() {
41-
let expectedSendString = "2[\"test\",\"\\\"he\\\"llo world\\\"\"]"
4241
let sendData = ["test", "\"he\"llo world\""]
43-
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false)
42+
let packetStr = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false).packetString
43+
let parsed = parser.parseSocketMessage(packetStr)!
4444

45-
XCTAssertEqual(packet.packetString, expectedSendString)
45+
XCTAssertEqual(parsed.type, .event)
46+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData))
4647
}
4748

4849
func testJSONEmit() {
49-
let expectedSendString = "2[\"test\",{\"null\":null,\"hello\":1,\"test\":\"hello\",\"foobar\":true}]"
5050
let sendData: [Any] = ["test", ["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]]
51-
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false)
51+
let packetStr = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false).packetString
52+
let parsed = parser.parseSocketMessage(packetStr)!
5253

53-
XCTAssertEqual(packet.packetString, expectedSendString)
54+
XCTAssertEqual(parsed.type, .event)
55+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData))
5456
}
5557

5658
func testArrayEmit() {
57-
let expectedSendString = "2[\"test\",[\"hello\",1,{\"test\":\"test\"}]]"
5859
let sendData: [Any] = ["test", ["hello", 1, ["test": "test"]]]
59-
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false)
60+
let packetStr = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false).packetString
61+
let parsed = parser.parseSocketMessage(packetStr)!
6062

61-
XCTAssertEqual(packet.packetString, expectedSendString)
63+
XCTAssertEqual(parsed.type, .event)
64+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData))
6265
}
6366

6467
func testBinaryEmit() {
65-
let expectedSendString = "51-[\"test\",{\"_placeholder\":true,\"num\":0}]"
6668
let sendData: [Any] = ["test", data]
6769
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false)
70+
let parsed = parser.parseSocketMessage(packet.packetString)!
6871

69-
XCTAssertEqual(packet.packetString, expectedSendString)
72+
XCTAssertEqual(parsed.type, .binaryEvent)
7073
XCTAssertEqual(packet.binary, [data])
74+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: [
75+
"test",
76+
["_placeholder": true, "num": 0]
77+
]))
7178
}
7279

7380
func testMultipleBinaryEmit() {
74-
let expectedSendString = "52-[\"test\",{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]"
7581
let sendData: [Any] = ["test", ["data1": data, "data2": data2] as NSDictionary]
7682
let packet = SocketPacket.packetFromEmit(sendData, id: -1, nsp: "/", ack: false)
83+
let parsed = parser.parseSocketMessage(packet.packetString)!
84+
85+
XCTAssertEqual(parsed.type, .binaryEvent)
86+
87+
let binaryObj = parsed.data[1] as! [String: Any]
88+
let data1Loc = (binaryObj["data1"] as! [String: Any])["num"] as! Int
89+
let data2Loc = (binaryObj["data2"] as! [String: Any])["num"] as! Int
7790

78-
XCTAssertEqual(packet.packetString, expectedSendString)
79-
XCTAssertEqual(packet.binary, [data2, data])
91+
XCTAssertEqual(packet.binary[data1Loc], data)
92+
XCTAssertEqual(packet.binary[data2Loc], data2)
8093
}
8194

8295
func testEmitWithAck() {
83-
let expectedSendString = "20[\"test\"]"
8496
let sendData = ["test"]
85-
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false)
86-
87-
XCTAssertEqual(packet.packetString,
97+
let packetStr = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false).packetString
98+
let parsed = parser.parseSocketMessage(packetStr)!
8899

89-
expectedSendString)
100+
XCTAssertEqual(parsed.type, .event)
101+
XCTAssertEqual(parsed.id, 0)
102+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData))
90103
}
91104

92105
func testEmitDataWithAck() {
93-
let expectedSendString = "51-0[\"test\",{\"_placeholder\":true,\"num\":0}]"
94106
let sendData: [Any] = ["test", data]
95107
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: false)
96-
97-
XCTAssertEqual(packet.packetString, expectedSendString)
108+
let parsed = parser.parseSocketMessage(packet.packetString)!
109+
110+
XCTAssertEqual(parsed.type, .binaryEvent)
111+
XCTAssertEqual(parsed.id, 0)
112+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: [
113+
"test",
114+
["_placeholder": true, "num": 0]
115+
]))
98116
XCTAssertEqual(packet.binary, [data])
99117
}
100118

101119
// Acks
102120
func testEmptyAck() {
103-
let expectedSendString = "30[]"
104-
let packet = SocketPacket.packetFromEmit([], id: 0, nsp: "/", ack: true)
121+
let packetStr = SocketPacket.packetFromEmit([], id: 0, nsp: "/", ack: true).packetString
122+
let parsed = parser.parseSocketMessage(packetStr)!
105123

106-
XCTAssertEqual(packet.packetString, expectedSendString)
124+
XCTAssertEqual(parsed.type, .ack)
125+
XCTAssertEqual(parsed.id, 0)
126+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: []))
107127
}
108128

109129
func testNullAck() {
110-
let expectedSendString = "30[null]"
111130
let sendData = [NSNull()]
112-
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true)
131+
let packetStr = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true).packetString
132+
let parsed = parser.parseSocketMessage(packetStr)!
113133

114-
XCTAssertEqual(packet.packetString, expectedSendString)
134+
XCTAssertEqual(parsed.type, .ack)
135+
XCTAssertEqual(parsed.id, 0)
136+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData))
115137
}
116138

117139
func testStringAck() {
118-
let expectedSendString = "30[\"test\"]"
119140
let sendData = ["test"]
120-
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true)
141+
let packetStr = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true).packetString
142+
let parsed = parser.parseSocketMessage(packetStr)!
121143

122-
XCTAssertEqual(packet.packetString, expectedSendString)
144+
XCTAssertEqual(parsed.type, .ack)
145+
XCTAssertEqual(parsed.id, 0)
146+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData))
123147
}
124148

125149
func testJSONAck() {
126-
let expectedSendString = "30[{\"null\":null,\"hello\":1,\"test\":\"hello\",\"foobar\":true}]"
127150
let sendData = [["foobar": true, "hello": 1, "test": "hello", "null": NSNull()]]
128-
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true)
151+
let packetStr = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true).packetString
152+
let parsed = parser.parseSocketMessage(packetStr)!
129153

130-
XCTAssertEqual(packet.packetString, expectedSendString)
154+
XCTAssertEqual(parsed.type, .ack)
155+
XCTAssertEqual(parsed.id, 0)
156+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: sendData))
131157
}
132158

133159
func testBinaryAck() {
134-
let expectedSendString = "61-0[{\"_placeholder\":true,\"num\":0}]"
135160
let sendData = [data]
136161
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true)
162+
let parsed = parser.parseSocketMessage(packet.packetString)!
137163

138-
XCTAssertEqual(packet.packetString, expectedSendString)
164+
XCTAssertEqual(parsed.type, .binaryAck)
139165
XCTAssertEqual(packet.binary, [data])
166+
XCTAssertEqual(parsed.id, 0)
167+
XCTAssertTrue(compareAnyArray(input: parsed.data, expected: [
168+
["_placeholder": true, "num": 0]
169+
]))
140170
}
141171

142172
func testMultipleBinaryAck() {
143-
let expectedSendString = "62-0[{\"data2\":{\"_placeholder\":true,\"num\":0},\"data1\":{\"_placeholder\":true,\"num\":1}}]"
144173
let sendData = [["data1": data, "data2": data2]]
145174
let packet = SocketPacket.packetFromEmit(sendData, id: 0, nsp: "/", ack: true)
175+
let parsed = parser.parseSocketMessage(packet.packetString)!
176+
177+
XCTAssertEqual(parsed.id, 0)
178+
XCTAssertEqual(parsed.type, .binaryAck)
146179

147-
XCTAssertEqual(packet.packetString, expectedSendString)
148-
XCTAssertEqual(packet.binary, [data2, data])
180+
let binaryObj = parsed.data[0] as! [String: Any]
181+
let data1Loc = (binaryObj["data1"] as! [String: Any])["num"] as! Int
182+
let data2Loc = (binaryObj["data2"] as! [String: Any])["num"] as! Int
183+
184+
XCTAssertEqual(packet.binary[data1Loc], data)
185+
XCTAssertEqual(packet.binary[data2Loc], data2)
149186
}
150187

151188
func testBinaryStringPlaceholderInMessage() {
@@ -159,4 +196,20 @@ class SocketBasicPacketTest: XCTestCase {
159196
_ = packet.addData(data2)
160197
XCTAssertEqual(packet.args[0] as? String, "~~0")
161198
}
199+
200+
private func compareAnyArray(input: [Any], expected: [Any]) -> Bool {
201+
guard input.count == expected.count else { return false }
202+
203+
return (input as NSArray).isEqual(to: expected)
204+
}
205+
206+
let data = "test".data(using: String.Encoding.utf8)!
207+
let data2 = "test2".data(using: String.Encoding.utf8)!
208+
var parser: SocketParsable!
209+
210+
override func setUp() {
211+
super.setUp()
212+
213+
parser = SocketManager(socketURL: URL(string: "http://localhost")!)
214+
}
162215
}

0 commit comments

Comments
 (0)