mirror of
https://github.com/confirmedcode/Lockdown-iOS.git
synced 2025-12-16 12:00:16 +01:00
73 lines
2.4 KiB
Swift
73 lines
2.4 KiB
Swift
//
|
|
// SpeedTest.swift
|
|
// Lockdown
|
|
//
|
|
//
|
|
// Copyright © 2018 Confirmed, Inc. All rights reserved.
|
|
//
|
|
// Original: https://github.com/rldaulton/connectedness
|
|
|
|
import Foundation
|
|
import SystemConfiguration
|
|
import CoreTelephony
|
|
import CocoaLumberjackSwift
|
|
import PromiseKit
|
|
|
|
public class SpeedTest: NSObject, URLSessionDelegate, URLSessionDataDelegate {
|
|
|
|
var startTime: CFAbsoluteTime!
|
|
var stopTime: CFAbsoluteTime!
|
|
var bytesReceived: Int!
|
|
|
|
var fileName = "10MB.bin"
|
|
var fileSizeBytes:Double = 10485760
|
|
|
|
public func testDownloadSpeedWithTimeout(timeout: TimeInterval) -> Promise<Double> {
|
|
if let r = reachability, r.connection == .wifi {
|
|
fileName = "50MB.bin"
|
|
fileSizeBytes = 52428800
|
|
} else {
|
|
fileName = "10MB.bin"
|
|
fileSizeBytes = 10485760
|
|
}
|
|
|
|
return firstly {
|
|
Client.getSpeedTestBucket()
|
|
}
|
|
.then { speedTestBucket -> Promise<(data: Data, response: URLResponse)> in
|
|
DDLogInfo("Bucket \(speedTestBucket.bucket)")
|
|
self.startTime = CFAbsoluteTimeGetCurrent()
|
|
self.stopTime = self.startTime
|
|
self.bytesReceived = 0
|
|
let configuration = URLSessionConfiguration.ephemeral
|
|
configuration.timeoutIntervalForResource = timeout
|
|
let session = URLSession(configuration: configuration)
|
|
return session.dataTask(.promise,
|
|
with: try self.makeDownloadRequest(urlString: "https://\(speedTestBucket.bucket).s3-accelerate.amazonaws.com/\(self.fileName)"))
|
|
.validate()
|
|
}
|
|
.map { data, response -> Double in
|
|
self.stopTime = CFAbsoluteTimeGetCurrent()
|
|
let elapsed = self.stopTime - self.startTime
|
|
if elapsed == 0 {
|
|
throw "File download failed: no time elapsed."
|
|
}
|
|
else {
|
|
return self.fileSizeBytes / elapsed / 1024.0 / 1024.0
|
|
}
|
|
}
|
|
}
|
|
|
|
func makeDownloadRequest(urlString: String) throws -> URLRequest {
|
|
if let url = URL(string: urlString) {
|
|
var rq = URLRequest(url: url)
|
|
rq.cachePolicy = .reloadIgnoringLocalAndRemoteCacheData
|
|
rq.httpMethod = "GET"
|
|
return rq
|
|
}
|
|
else {
|
|
throw "Invalid URL string: \(urlString)"
|
|
}
|
|
}
|
|
}
|