217 lines
7.0 KiB
Swift
217 lines
7.0 KiB
Swift
//
|
|
// SocketEngineTest.swift
|
|
// Socket.IO-Client-Swift
|
|
//
|
|
// Created by Erik Little on 10/15/15.
|
|
//
|
|
//
|
|
|
|
import XCTest
|
|
@testable import SocketIO
|
|
|
|
class SocketEngineTest: XCTestCase {
|
|
func testBasicPollingMessage() {
|
|
let expect = expectation(description: "Basic polling test")
|
|
socket.on("blankTest") {data, ack in
|
|
expect.fulfill()
|
|
}
|
|
|
|
engine.parsePollingMessage("15:42[\"blankTest\"]")
|
|
waitForExpectations(timeout: 3, handler: nil)
|
|
}
|
|
|
|
func testTwoPacketsInOnePollTest() {
|
|
let finalExpectation = expectation(description: "Final packet in poll test")
|
|
var gotBlank = false
|
|
|
|
socket.on("blankTest") {data, ack in
|
|
gotBlank = true
|
|
}
|
|
|
|
socket.on("stringTest") {data, ack in
|
|
if let str = data[0] as? String, gotBlank {
|
|
if str == "hello" {
|
|
finalExpectation.fulfill()
|
|
}
|
|
}
|
|
}
|
|
|
|
engine.parsePollingMessage("15:42[\"blankTest\"]24:42[\"stringTest\",\"hello\"]")
|
|
waitForExpectations(timeout: 3, handler: nil)
|
|
}
|
|
|
|
func testEngineDoesErrorOnUnknownTransport() {
|
|
let finalExpectation = expectation(description: "Unknown Transport")
|
|
|
|
socket.on("error") {data, ack in
|
|
if let error = data[0] as? String, error == "Unknown transport" {
|
|
finalExpectation.fulfill()
|
|
}
|
|
}
|
|
|
|
engine.parseEngineMessage("{\"code\": 0, \"message\": \"Unknown transport\"}")
|
|
waitForExpectations(timeout: 3, handler: nil)
|
|
}
|
|
|
|
func testEngineDoesErrorOnUnknownMessage() {
|
|
let finalExpectation = expectation(description: "Engine Errors")
|
|
|
|
socket.on("error") {data, ack in
|
|
finalExpectation.fulfill()
|
|
}
|
|
|
|
engine.parseEngineMessage("afafafda")
|
|
waitForExpectations(timeout: 3, handler: nil)
|
|
}
|
|
|
|
func testEngineDecodesUTF8Properly() {
|
|
let expect = expectation(description: "Engine Decodes utf8")
|
|
|
|
socket.on("stringTest") {data, ack in
|
|
XCTAssertEqual(data[0] as? String, "lïne one\nlīne \rtwo𦅙𦅛", "Failed string test")
|
|
expect.fulfill()
|
|
}
|
|
|
|
let stringMessage = "42[\"stringTest\",\"lïne one\\nlīne \\rtwo𦅙𦅛\"]"
|
|
|
|
engine.parsePollingMessage("\(stringMessage.utf16.count):\(stringMessage)")
|
|
waitForExpectations(timeout: 3, handler: nil)
|
|
}
|
|
|
|
func testEncodeURLProperly() {
|
|
engine.connectParams = [
|
|
"created": "2016-05-04T18:31:15+0200"
|
|
]
|
|
|
|
XCTAssertEqual(engine.urlPolling.query, "transport=polling&b64=1&created=2016-05-04T18%3A31%3A15%2B0200")
|
|
XCTAssertEqual(engine.urlWebSocket.query, "transport=websocket&created=2016-05-04T18%3A31%3A15%2B0200")
|
|
|
|
engine.connectParams = [
|
|
"forbidden": "!*'();:@&=+$,/?%#[]\" {}"
|
|
]
|
|
|
|
XCTAssertEqual(engine.urlPolling.query, "transport=polling&b64=1&forbidden=%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D%22%20%7B%7D")
|
|
XCTAssertEqual(engine.urlWebSocket.query, "transport=websocket&forbidden=%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D%22%20%7B%7D")
|
|
}
|
|
|
|
func testBase64Data() {
|
|
let expect = expectation(description: "Engine Decodes base64 data")
|
|
let b64String = "b4aGVsbG8NCg=="
|
|
let packetString = "451-[\"test\",{\"test\":{\"_placeholder\":true,\"num\":0}}]"
|
|
|
|
socket.on("test") {data, ack in
|
|
if let data = data[0] as? Data, let string = String(data: data, encoding: .utf8) {
|
|
XCTAssertEqual(string, "hello")
|
|
}
|
|
|
|
expect.fulfill()
|
|
}
|
|
|
|
engine.parseEngineMessage(packetString)
|
|
engine.parseEngineMessage(b64String)
|
|
|
|
waitForExpectations(timeout: 3, handler: nil)
|
|
}
|
|
|
|
func testSettingExtraHeadersBeforeConnectSetsEngineExtraHeaders() {
|
|
let newValue = ["hello": "world"]
|
|
|
|
manager.engine = engine
|
|
manager.setTestStatus(.notConnected)
|
|
manager.config = [.extraHeaders(["new": "value"])]
|
|
manager.config.insert(.extraHeaders(newValue), replacing: true)
|
|
|
|
XCTAssertEqual(2, manager.config.count)
|
|
XCTAssertEqual(manager.engine!.extraHeaders!, newValue)
|
|
|
|
for config in manager.config {
|
|
switch config {
|
|
case let .extraHeaders(headers):
|
|
XCTAssertTrue(headers.keys.contains("hello"), "It should contain hello header key")
|
|
XCTAssertFalse(headers.keys.contains("new"), "It should not contain old data")
|
|
case .path:
|
|
continue
|
|
default:
|
|
XCTFail("It should only have two configs")
|
|
}
|
|
}
|
|
}
|
|
|
|
func testSettingExtraHeadersAfterConnectDoesNotIgnoreChanges() {
|
|
let newValue = ["hello": "world"]
|
|
|
|
manager.engine = engine
|
|
manager.setTestStatus(.connected)
|
|
engine.setConnected(true)
|
|
manager.config = [.extraHeaders(["new": "value"])]
|
|
manager.config.insert(.extraHeaders(["hello": "world"]), replacing: true)
|
|
|
|
XCTAssertEqual(2, manager.config.count)
|
|
XCTAssertEqual(manager.engine!.extraHeaders!, newValue)
|
|
}
|
|
|
|
func testSettingPathAfterConnectDoesNotIgnoreChanges() {
|
|
let newValue = "/newpath/"
|
|
|
|
manager.engine = engine
|
|
manager.setTestStatus(.connected)
|
|
engine.setConnected(true)
|
|
manager.config.insert(.path(newValue))
|
|
|
|
XCTAssertEqual(1, manager.config.count)
|
|
XCTAssertEqual(manager.engine!.socketPath, newValue)
|
|
}
|
|
|
|
func testSettingCompressAfterConnectDoesNotIgnoreChanges() {
|
|
manager.engine = engine
|
|
manager.setTestStatus(.connected)
|
|
engine.setConnected(true)
|
|
manager.config.insert(.compress)
|
|
|
|
XCTAssertEqual(2, manager.config.count)
|
|
XCTAssertTrue(manager.engine!.compress)
|
|
}
|
|
|
|
func testSettingForcePollingAfterConnectDoesNotIgnoreChanges() {
|
|
manager.engine = engine
|
|
manager.setTestStatus(.connected)
|
|
engine.setConnected(true)
|
|
manager.config.insert(.forcePolling(true))
|
|
|
|
XCTAssertEqual(2, manager.config.count)
|
|
XCTAssertTrue(manager.engine!.forcePolling)
|
|
}
|
|
|
|
func testSettingForceWebSocketsAfterConnectDoesNotIgnoreChanges() {
|
|
manager.engine = engine
|
|
manager.setTestStatus(.connected)
|
|
engine.setConnected(true)
|
|
manager.config.insert(.forceWebsockets(true))
|
|
|
|
XCTAssertEqual(2, manager.config.count)
|
|
XCTAssertTrue(manager.engine!.forceWebsockets)
|
|
}
|
|
|
|
func testChangingEngineHeadersAfterInit() {
|
|
engine.extraHeaders = ["Hello": "World"]
|
|
|
|
let req = engine.createRequestForPostWithPostWait()
|
|
|
|
XCTAssertEqual("World", req.allHTTPHeaderFields?["Hello"])
|
|
}
|
|
|
|
var manager: SocketManager!
|
|
var socket: SocketIOClient!
|
|
var engine: SocketEngine!
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
|
|
manager = SocketManager(socketURL: URL(string: "http://localhost")!)
|
|
socket = manager.defaultSocket
|
|
engine = SocketEngine(client: manager, url: URL(string: "http://localhost")!, options: nil)
|
|
|
|
socket.setTestable()
|
|
}
|
|
}
|