Fix mock VPN implementation (#285)
This commit is contained in:
parent
080ee35e61
commit
192f4643c2
|
@ -28,59 +28,83 @@ import NetworkExtension
|
||||||
|
|
||||||
/// Simulates a VPN provider.
|
/// Simulates a VPN provider.
|
||||||
public class MockVPN: VPN {
|
public class MockVPN: VPN {
|
||||||
public init() {
|
private var tunnelBundleIdentifier: String?
|
||||||
|
|
||||||
|
private var currentIsEnabled = false
|
||||||
|
|
||||||
|
private let delayNanoseconds: UInt64
|
||||||
|
|
||||||
|
public init(delay: Int = 1) {
|
||||||
|
delayNanoseconds = DispatchTimeInterval.seconds(delay).nanoseconds
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: VPN
|
// MARK: VPN
|
||||||
|
|
||||||
public func prepare() {
|
public func prepare() {
|
||||||
notifyReinstall(false)
|
|
||||||
notifyStatus(.disconnected)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public func install(
|
public func install(
|
||||||
_ tunnelBundleIdentifier: String,
|
_ tunnelBundleIdentifier: String,
|
||||||
configuration: NetworkExtensionConfiguration,
|
configuration: NetworkExtensionConfiguration,
|
||||||
extra: Data?
|
extra: NetworkExtensionExtra?
|
||||||
) {
|
) {
|
||||||
|
self.tunnelBundleIdentifier = tunnelBundleIdentifier
|
||||||
notifyReinstall(true)
|
notifyReinstall(true)
|
||||||
notifyStatus(.disconnected)
|
notifyStatus(.disconnected)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func reconnect(after: DispatchTimeInterval) async throws {
|
public func reconnect(after: DispatchTimeInterval) async throws {
|
||||||
|
await delay()
|
||||||
notifyStatus(.connected)
|
notifyStatus(.connected)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func reconnect(
|
public func reconnect(
|
||||||
_ tunnelBundleIdentifier: String,
|
_ tunnelBundleIdentifier: String,
|
||||||
configuration: NetworkExtensionConfiguration,
|
configuration: NetworkExtensionConfiguration,
|
||||||
extra: Data?,
|
extra: NetworkExtensionExtra?,
|
||||||
after: DispatchTimeInterval
|
after: DispatchTimeInterval
|
||||||
) {
|
) async throws {
|
||||||
|
self.tunnelBundleIdentifier = tunnelBundleIdentifier
|
||||||
notifyReinstall(true)
|
notifyReinstall(true)
|
||||||
|
await delay()
|
||||||
|
notifyStatus(.connecting)
|
||||||
|
await delay()
|
||||||
notifyStatus(.connected)
|
notifyStatus(.connected)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func disconnect() {
|
public func disconnect() async {
|
||||||
notifyReinstall(false)
|
notifyReinstall(false)
|
||||||
|
await delay()
|
||||||
|
notifyStatus(.disconnecting)
|
||||||
|
await delay()
|
||||||
notifyStatus(.disconnected)
|
notifyStatus(.disconnected)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func uninstall() {
|
public func uninstall() async {
|
||||||
|
await delay()
|
||||||
notifyReinstall(false)
|
notifyReinstall(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: Helpers
|
// MARK: Helpers
|
||||||
|
|
||||||
private func notifyReinstall(_ isEnabled: Bool) {
|
private func notifyReinstall(_ isEnabled: Bool) {
|
||||||
|
currentIsEnabled = isEnabled
|
||||||
|
|
||||||
var notification = Notification(name: VPNNotification.didReinstall)
|
var notification = Notification(name: VPNNotification.didReinstall)
|
||||||
|
notification.vpnBundleIdentifier = tunnelBundleIdentifier
|
||||||
notification.vpnIsEnabled = isEnabled
|
notification.vpnIsEnabled = isEnabled
|
||||||
NotificationCenter.default.post(notification)
|
NotificationCenter.default.post(notification)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func notifyStatus(_ status: VPNStatus) {
|
private func notifyStatus(_ status: VPNStatus) {
|
||||||
var notification = Notification(name: VPNNotification.didChangeStatus)
|
var notification = Notification(name: VPNNotification.didChangeStatus)
|
||||||
|
notification.vpnBundleIdentifier = tunnelBundleIdentifier
|
||||||
|
notification.vpnIsEnabled = currentIsEnabled
|
||||||
notification.vpnStatus = status
|
notification.vpnStatus = status
|
||||||
NotificationCenter.default.post(notification)
|
NotificationCenter.default.post(notification)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func delay() async {
|
||||||
|
try? await Task.sleep(nanoseconds: delayNanoseconds)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue