MockServer.swift 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. //////////////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // MockServer.swift
  4. // Starscream
  5. //
  6. // Created by Dalton Cherry on 1/29/19.
  7. // Copyright © 2019 Vluxe. All rights reserved.
  8. //
  9. // Licensed under the Apache License, Version 2.0 (the "License");
  10. // you may not use this file except in compliance with the License.
  11. // You may obtain a copy of the License at
  12. //
  13. // http://www.apache.org/licenses/LICENSE-2.0
  14. //
  15. // Unless required by applicable law or agreed to in writing, software
  16. // distributed under the License is distributed on an "AS IS" BASIS,
  17. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18. // See the License for the specific language governing permissions and
  19. // limitations under the License.
  20. //
  21. //////////////////////////////////////////////////////////////////////////////////////////////////
  22. import Foundation
  23. @testable import Starscream
  24. public class MockConnection: Connection, HTTPServerDelegate, FramerEventClient, FrameCollectorDelegate {
  25. let transport: MockTransport
  26. private let httpHandler = FoundationHTTPServerHandler()
  27. private let framer = WSFramer(isServer: true)
  28. private let frameHandler = FrameCollector()
  29. private var didUpgrade = false
  30. public var onEvent: ((ConnectionEvent) -> Void)?
  31. fileprivate weak var delegate: ConnectionDelegate?
  32. init(transport: MockTransport) {
  33. self.transport = transport
  34. httpHandler.register(delegate: self)
  35. framer.register(delegate: self)
  36. frameHandler.delegate = self
  37. }
  38. func add(data: Data) {
  39. if !didUpgrade {
  40. httpHandler.parse(data: data)
  41. } else {
  42. framer.add(data: data)
  43. }
  44. }
  45. public func write(data: Data, opcode: FrameOpCode) {
  46. let wsData = framer.createWriteFrame(opcode: opcode, payload: data, isCompressed: false)
  47. transport.received(data: wsData)
  48. }
  49. /// MARK: - HTTPServerDelegate
  50. public func didReceive(event: HTTPEvent) {
  51. switch event {
  52. case .success(let headers):
  53. didUpgrade = true
  54. //TODO: add headers and key check?
  55. let response = httpHandler.createResponse(headers: [:])
  56. transport.received(data: response)
  57. delegate?.didReceive(event: .connected(self, headers))
  58. onEvent?(.connected(headers))
  59. case .failure(let error):
  60. onEvent?(.error(error))
  61. }
  62. }
  63. /// MARK: - FrameCollectorDelegate
  64. public func frameProcessed(event: FrameEvent) {
  65. switch event {
  66. case .frame(let frame):
  67. frameHandler.add(frame: frame)
  68. case .error(let error):
  69. onEvent?(.error(error))
  70. }
  71. }
  72. public func didForm(event: FrameCollector.Event) {
  73. switch event {
  74. case .text(let string):
  75. delegate?.didReceive(event: .text(self, string))
  76. onEvent?(.text(string))
  77. case .binary(let data):
  78. delegate?.didReceive(event: .binary(self, data))
  79. onEvent?(.binary(data))
  80. case .pong(let data):
  81. delegate?.didReceive(event: .pong(self, data))
  82. onEvent?(.pong(data))
  83. case .ping(let data):
  84. delegate?.didReceive(event: .ping(self, data))
  85. onEvent?(.ping(data))
  86. case .closed(let reason, let code):
  87. delegate?.didReceive(event: .disconnected(self, reason, code))
  88. onEvent?(.disconnected(reason, code))
  89. case .error(let error):
  90. onEvent?(.error(error))
  91. }
  92. }
  93. public func decompress(data: Data, isFinal: Bool) -> Data? {
  94. return nil
  95. }
  96. }
  97. public class MockServer: Server, ConnectionDelegate {
  98. fileprivate var connections = [String: MockConnection]()
  99. public var onEvent: ((ServerEvent) -> Void)?
  100. public func start(address: String, port: UInt16) -> Error? {
  101. return nil
  102. }
  103. public func connect(transport: MockTransport) {
  104. let conn = MockConnection(transport: transport)
  105. conn.delegate = self
  106. connections[transport.uuid] = conn
  107. }
  108. public func disconnect(uuid: String) {
  109. // guard let conn = connections[uuid] else {
  110. // return
  111. // }
  112. //TODO: force disconnect
  113. connections.removeValue(forKey: uuid)
  114. }
  115. public func write(data: Data, uuid: String) {
  116. guard let conn = connections[uuid] else {
  117. return
  118. }
  119. conn.add(data: data)
  120. }
  121. /// MARK: - MockConnectionDelegate
  122. public func didReceive(event: ServerEvent) {
  123. onEvent?(event)
  124. }
  125. }