Files

174 lines
5.5 KiB
Swift

//
// ViewController.swift
// Autobahn
//
// Created by Dalton Cherry on 7/24/15.
// Copyright (c) 2015 vluxe. All rights reserved.
//
import UIKit
import Starscream
class ViewController: UIViewController {
let host = "localhost:9001"
var socketArray = [WebSocket]()
var caseCount = 320 //starting cases
override func viewDidLoad() {
super.viewDidLoad()
getCaseCount()
//getTestInfo(1)
//runTest(1)
}
func removeSocket(_ s: WebSocket?) {
socketArray = socketArray.filter{$0 != s}
}
func getCaseCount() {
let s = WebSocket(url: URL(string: "ws://\(host)/getCaseCount")!, protocols: [], stream: FoundationStream()) //NetworkStream
socketArray.append(s)
s.onText = { [weak self] (text: String) in
if let c = Int(text) {
print("number of cases is: \(c)")
self?.caseCount = c
}
}
s.onDisconnect = { [weak self, weak s] (error: Error?) in
self?.getTestInfo(1)
self?.removeSocket(s)
}
s.connect()
}
func getTestInfo(_ caseNum: Int) {
let s = createSocket("getCaseInfo",caseNum)
socketArray.append(s)
s.onText = { (text: String) in
// let data = text.dataUsingEncoding(NSUTF8StringEncoding)
// do {
// let resp: AnyObject? = try NSJSONSerialization.JSONObjectWithData(data!,
// options: NSJSONReadingOptions())
// if let dict = resp as? Dictionary<String,String> {
// let num = dict["id"]
// let summary = dict["description"]
// if let n = num, let sum = summary {
// print("running case:\(caseNum) id:\(n) summary: \(sum)")
// }
// }
// } catch {
// print("error parsing the json")
// }
}
var once = false
s.onDisconnect = { [weak self, weak s] (error: Error?) in
if !once {
once = true
self?.runTest(caseNum)
}
self?.removeSocket(s)
}
s.connect()
}
func runTest(_ caseNum: Int) {
let s = createSocket("runCase",caseNum)
self.socketArray.append(s)
s.onText = { [weak s] (text: String) in
s?.write(string: text)
}
s.onData = { [weak s] (data: Data) in
s?.write(data: data)
}
var once = false
s.onDisconnect = {[weak self, weak s] (error: Error?) in
if !once {
once = true
print("case:\(caseNum) finished")
//self?.verifyTest(caseNum) //disabled since it slows down the tests
let nextCase = caseNum+1
if nextCase <= (self?.caseCount)! {
self?.runTest(nextCase)
//self?.getTestInfo(nextCase) //disabled since it slows down the tests
} else {
self?.finishReports()
}
self?.removeSocket(s)
}
}
s.connect()
//timeout
DispatchQueue.main.asyncAfter(deadline: .now() + 480, execute: {
if !once {
s.disconnect(forceTimeout: 0, closeCode: CloseCode.normal.rawValue)
}
})
}
func verifyTest(_ caseNum: Int) {
let s = createSocket("getCaseStatus",caseNum)
self.socketArray.append(s)
s.onText = { (text: String) in
let data = text.data(using: String.Encoding.utf8)
do {
let resp: Any? = try JSONSerialization.jsonObject(with: data!,
options: JSONSerialization.ReadingOptions())
if let dict = resp as? Dictionary<String,String> {
if let status = dict["behavior"] {
if status == "OK" {
print("SUCCESS: \(caseNum)")
return
}
}
print("FAILURE: \(caseNum)")
}
} catch {
print("error parsing the json")
}
}
var once = false
s.onDisconnect = { [weak self, weak s] (error: Error?) in
if !once {
once = true
let nextCase = caseNum+1
print("next test is: \(nextCase)")
if nextCase <= (self?.caseCount)! {
self?.getTestInfo(nextCase)
} else {
self?.finishReports()
}
}
self?.removeSocket(s)
}
s.connect()
}
func finishReports() {
let s = createSocket("updateReports",0)
self.socketArray.append(s)
s.onDisconnect = { [weak self, weak s] (error: Error?) in
print("finished all the tests!")
self?.removeSocket(s)
}
s.connect()
}
func createSocket(_ cmd: String, _ caseNum: Int) -> WebSocket {
return WebSocket(url: URL(string: "ws://\(host)\(buildPath(cmd,caseNum))")!, protocols: [], stream: FoundationStream()) //NetworkStream
}
func buildPath(_ cmd: String, _ caseNum: Int) -> String {
return "/\(cmd)?case=\(caseNum)&agent=Starscream"
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}