Lightning/Tests/HTTPTests/PerformanceTests.swift

199 lines
5.5 KiB
Swift

//
// ServerTests.swift
// Edge
//
// Created by Tyler Fleming Cloutier on 10/30/16.
//
//
import Foundation
import XCTest
import PromiseKit
@testable import HTTP
func generateRandomBytes(_ num: Int) -> Data? {
var data = Data(count: num)
let result = data.withUnsafeMutableBytes {
SecRandomCopyBytes(kSecRandomDefault, data.count, $0)
}
if result == errSecSuccess {
return data
} else {
print("Problem generating random bytes")
return nil
}
}
let dataSize = 10_000_000
let oneMBData = generateRandomBytes(dataSize)!
let rootUrl = "http://localhost:3000"
class PerformanceTests: XCTestCase {
struct TestError: Error {
}
private func postData(path: String) -> Promise<()> {
let session = URLSession(configuration: .default)
let urlString = rootUrl + path
let url = URL(string: urlString)!
var req = URLRequest(url: url)
req.httpMethod = "POST"
req.httpBody = oneMBData
return Promise { resolve, reject in
session.dataTask(with: req) { (data, urlResp, err) in
if let err = err {
reject(err)
}
resolve(())
}.resume()
}
}
private func getData(path: String) -> Promise<Data> {
let session = URLSession(configuration: .default)
let urlString = rootUrl + path
let url = URL(string: urlString)!
var req = URLRequest(url: url)
req.httpMethod = "GET"
return Promise { resolve, reject in
session.dataTask(with: req) { (data, urlResp, err) in
if let err = err {
XCTFail("Error on response: \(err)")
reject(err)
}
guard let data = data else {
XCTFail("No data returned")
reject(TestError())
return
}
resolve(data)
}.resume()
}
}
private func emptyGet(path: String) -> Promise<()> {
let session = URLSession(configuration: .default)
let urlString = rootUrl + path
let url = URL(string: urlString)!
var req = URLRequest(url: url)
req.httpMethod = "GET"
return Promise { resolve, reject in
session.dataTask(with: req) { (data, urlResp, err) in
if let err = err {
XCTFail("Error on response: \(err)")
reject(err)
}
resolve(())
}.resume()
}
}
func testPerformanceReceivingData() {
self.measureMetrics(XCTestCase.defaultPerformanceMetrics, automaticallyStartMeasuring: false) {
let app = Router()
app.post("/post") { request -> Response in
let count = request.body.count
XCTAssertEqual(count, dataSize)
return Response()
}
let server = HTTP.Server(delegate: app, reusePort: true)
server.listen(host: "0.0.0.0", port: 3000)
let expectSuccess = expectation(description: "Request was not successful.")
self.startMeasuring()
postData(path: "/post").then {
expectSuccess.fulfill()
}.catch { error in
XCTFail(error.localizedDescription)
}
waitForExpectations(timeout: 5) { error in
self.stopMeasuring()
server.stop()
}
}
}
func testPerformanceSendingData() {
self.measureMetrics(XCTestCase.defaultPerformanceMetrics, automaticallyStartMeasuring: false) {
let app = Router()
app.get("/get") { request -> Response in
return Response(body: oneMBData)
}
let server = HTTP.Server(delegate: app, reusePort: true)
server.listen(host: "0.0.0.0", port: 3000)
let expectSuccess = expectation(description: "Request was not successful.")
self.startMeasuring()
getData(path: "/get").then { data in
expectSuccess.fulfill()
XCTAssertEqual(dataSize, data.count)
}.catch { error in
XCTFail(error.localizedDescription)
}
waitForExpectations(timeout: 5) { error in
self.stopMeasuring()
server.stop()
}
}
}
func testPerformanceConcurrentRequests() {
self.measureMetrics(XCTestCase.defaultPerformanceMetrics, automaticallyStartMeasuring: false) {
let app = Router()
app.get("/get") { request -> Response in
return Response()
}
let server = HTTP.Server(delegate: app, reusePort: true)
server.listen(host: "0.0.0.0", port: 3000)
self.startMeasuring()
for _ in 0..<150 {
let expectSuccess = self.expectation(description: "Request was not successful.")
DispatchQueue.global().async {
self.emptyGet(path: "/get").then {
expectSuccess.fulfill()
}.catch { error in
XCTFail(error.localizedDescription)
}
}
}
waitForExpectations(timeout: 5) { error in
self.stopMeasuring()
server.stop()
}
}
}
}
extension PerformanceTests {
static var allTests = [
("testPerformanceSendingData", testPerformanceSendingData),
]
}