Fix mock VPN implementation (#285)

This commit is contained in:
Davide De Rosa 2022-10-12 22:35:02 +02:00 committed by GitHub
parent 080ee35e61
commit 192f4643c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 36 additions and 12 deletions

View File

@ -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)
}
} }