summaryrefslogtreecommitdiffhomepage
path: root/ios
diff options
context:
space:
mode:
authorAndrew Bulhak <andrew.bulhak@mullvad.net>2024-02-02 15:04:10 +0100
committerBug Magnet <marco.nikic@mullvad.net>2024-02-07 15:13:22 +0100
commitb625e73ff217cf117b4c4ef2dda646d843d2009d (patch)
tree0dd6e6f1bdd1a3a656df4bd8031c7e728b092187 /ios
parent6a579a015f5ec8aff4b1550fb7c72d92aae492c3 (diff)
downloadmullvadvpn-b625e73ff217cf117b4c4ef2dda646d843d2009d.tar.xz
mullvadvpn-b625e73ff217cf117b4c4ef2dda646d843d2009d.zip
Initial tests for StartTunnelOperation, testing non-logged-in state and transition from disconnecting to reconnecting
Diffstat (limited to 'ios')
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj12
-rw-r--r--ios/MullvadVPNTests/Mocks/MockTunnelInteractor.swift72
-rw-r--r--ios/MullvadVPNTests/StartTunnelOperationTests.swift102
3 files changed, 125 insertions, 61 deletions
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj
index 2b5da62ba8..57997591c4 100644
--- a/ios/MullvadVPN.xcodeproj/project.pbxproj
+++ b/ios/MullvadVPN.xcodeproj/project.pbxproj
@@ -39,6 +39,7 @@
0697D6E728F01513007A9E99 /* TransportMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0697D6E628F01513007A9E99 /* TransportMonitor.swift */; };
06AC116228F94C450037AF9A /* ApplicationConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BFA5CB22A7CE1F00A6173D /* ApplicationConfiguration.swift */; };
44DD7D242B6CFFD70005F67F /* StartTunnelOperationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44DD7D232B6CFFD70005F67F /* StartTunnelOperationTests.swift */; };
+ 44DD7D272B6D18FB0005F67F /* MockTunnelInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44DD7D262B6D18FB0005F67F /* MockTunnelInteractor.swift */; };
5803B4B02940A47300C23744 /* TunnelConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5803B4AF2940A47300C23744 /* TunnelConfiguration.swift */; };
5803B4B22940A48700C23744 /* TunnelStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5803B4B12940A48700C23744 /* TunnelStore.swift */; };
5807E2C02432038B00F5FF30 /* String+Split.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5807E2BF2432038B00F5FF30 /* String+Split.swift */; };
@@ -1240,6 +1241,7 @@
06FAE67B28F83CA50033DD93 /* REST.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = REST.swift; sourceTree = "<group>"; };
06FAE67D28F83CA50033DD93 /* RESTTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RESTTransport.swift; sourceTree = "<group>"; };
44DD7D232B6CFFD70005F67F /* StartTunnelOperationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartTunnelOperationTests.swift; sourceTree = "<group>"; };
+ 44DD7D262B6D18FB0005F67F /* MockTunnelInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTunnelInteractor.swift; sourceTree = "<group>"; };
5802EBC42A8E44AC00E5CE4C /* AppRoutes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRoutes.swift; sourceTree = "<group>"; };
5802EBC62A8E457A00E5CE4C /* AppRouteProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRouteProtocol.swift; sourceTree = "<group>"; };
5802EBC82A8E45BA00E5CE4C /* ApplicationRouterDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationRouterDelegate.swift; sourceTree = "<group>"; };
@@ -2096,6 +2098,14 @@
path = MullvadREST;
sourceTree = "<group>";
};
+ 44DD7D252B6D18E90005F67F /* Mocks */ = {
+ isa = PBXGroup;
+ children = (
+ 44DD7D262B6D18FB0005F67F /* MockTunnelInteractor.swift */,
+ );
+ path = Mocks;
+ sourceTree = "<group>";
+ };
5802EBC32A8E447000E5CE4C /* Router */ = {
isa = PBXGroup;
children = (
@@ -2739,6 +2749,7 @@
58B0A2A1238EE67E00BC001D /* MullvadVPNTests */ = {
isa = PBXGroup;
children = (
+ 44DD7D252B6D18E90005F67F /* Mocks */,
A900E9BF2ACC661900C95F67 /* AccessTokenManager+Stubs.swift */,
7A6F2FA42AFA3CB2006D0856 /* AccountExpiryTests.swift */,
A900E9B72ACC5C2B00C95F67 /* AccountsProxy+Stubs.swift */,
@@ -4527,6 +4538,7 @@
A9A5FA3D2ACB05D90083449F /* DeviceCheck.swift in Sources */,
A900E9B82ACC5C2B00C95F67 /* AccountsProxy+Stubs.swift in Sources */,
A9A5FA3E2ACB05D90083449F /* DeviceCheckOperation.swift in Sources */,
+ 44DD7D272B6D18FB0005F67F /* MockTunnelInteractor.swift in Sources */,
A9A5FA3F2ACB05D90083449F /* DeviceCheckRemoteService.swift in Sources */,
A9A5FA402ACB05D90083449F /* DeviceCheckRemoteServiceProtocol.swift in Sources */,
A9A5FA412ACB05D90083449F /* DeviceStateAccessor.swift in Sources */,
diff --git a/ios/MullvadVPNTests/Mocks/MockTunnelInteractor.swift b/ios/MullvadVPNTests/Mocks/MockTunnelInteractor.swift
new file mode 100644
index 0000000000..e2d1d5996b
--- /dev/null
+++ b/ios/MullvadVPNTests/Mocks/MockTunnelInteractor.swift
@@ -0,0 +1,72 @@
+//
+// MockTunnelInteractor.swift
+// MullvadVPNTests
+//
+// Created by Andrew Bulhak on 2024-02-02.
+// Copyright © 2024 Mullvad VPN AB. All rights reserved.
+//
+
+import Foundation
+import MullvadSettings
+import PacketTunnelCore
+
+// this is still very minimal, and will be fleshed out as needed.
+struct MockTunnelInteractor: TunnelInteractor {
+ var onUpdateTunnelStatus: ((TunnelStatus)->Void)?
+
+
+ var tunnel: (TunnelProtocol)?
+
+ func getPersistentTunnels() -> [TunnelProtocol] {
+ return []
+ }
+
+ func createNewTunnel() -> TunnelProtocol {
+ fatalError()
+ }
+
+ func setTunnel(_ tunnel: (TunnelProtocol)?, shouldRefreshTunnelState: Bool) {
+
+ }
+
+ var tunnelStatus: TunnelStatus =
+ TunnelStatus()
+
+ func updateTunnelStatus(_ block: (inout TunnelStatus) -> Void) -> TunnelStatus {
+ var tunnelStatus = self.tunnelStatus
+ block(&tunnelStatus)
+ onUpdateTunnelStatus?(tunnelStatus)
+ return tunnelStatus
+ }
+
+ var isConfigurationLoaded: Bool
+
+ var settings: MullvadSettings.LatestTunnelSettings
+
+ var deviceState: MullvadSettings.DeviceState
+
+ func setConfigurationLoaded() {
+ }
+
+ func setSettings(_ settings: MullvadSettings.LatestTunnelSettings, persist: Bool) {
+ }
+
+ func setDeviceState(_ deviceState: MullvadSettings.DeviceState, persist: Bool) {
+ }
+
+ func removeLastUsedAccount() {
+ }
+
+ func handleRestError(_ error: Error) {
+ }
+
+ func startTunnel() {
+ }
+
+ func prepareForVPNConfigurationDeletion() {
+ }
+
+ func selectRelay() throws -> PacketTunnelCore.SelectedRelay {
+ fatalError()
+ }
+}
diff --git a/ios/MullvadVPNTests/StartTunnelOperationTests.swift b/ios/MullvadVPNTests/StartTunnelOperationTests.swift
index 31d32b3310..b4310ff6f8 100644
--- a/ios/MullvadVPNTests/StartTunnelOperationTests.swift
+++ b/ios/MullvadVPNTests/StartTunnelOperationTests.swift
@@ -9,66 +9,13 @@
import XCTest
import MullvadSettings
import Operations
-import PacketTunnelCore
+import Network
+import WireGuardKitTypes
-struct MockTunnelInteractor: TunnelInteractor {
- var tunnel: (TunnelProtocol)?
-
- func getPersistentTunnels() -> [TunnelProtocol] {
- return []
- }
-
- func createNewTunnel() -> TunnelProtocol {
- fatalError()
- }
-
- func setTunnel(_ tunnel: (TunnelProtocol)?, shouldRefreshTunnelState: Bool) {
-
- }
-
- var tunnelStatus: TunnelStatus {
- TunnelStatus()
- }
-
- func updateTunnelStatus(_ block: (inout TunnelStatus) -> Void) -> TunnelStatus {
- TunnelStatus()
- }
-
- var isConfigurationLoaded: Bool
-
- var settings: MullvadSettings.LatestTunnelSettings
-
- var deviceState: MullvadSettings.DeviceState
-
- func setConfigurationLoaded() {
- }
-
- func setSettings(_ settings: MullvadSettings.LatestTunnelSettings, persist: Bool) {
- }
-
- func setDeviceState(_ deviceState: MullvadSettings.DeviceState, persist: Bool) {
- }
-
- func removeLastUsedAccount() {
- }
-
- func handleRestError(_ error: Error) {
- }
-
- func startTunnel() {
- }
-
- func prepareForVPNConfigurationDeletion() {
- }
-
- func selectRelay() throws -> PacketTunnelCore.SelectedRelay {
- fatalError()
- }
-
-
-}
final class StartTunnelOperationTests: XCTestCase {
+
+ let testQueue = DispatchQueue(label: "StartTunnelOperationTests.testQueue")
override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
@@ -80,24 +27,57 @@ final class StartTunnelOperationTests: XCTestCase {
func testFailsIfNotLoggedIn() throws {
let operationQueue = AsyncOperationQueue()
- let testQueue = DispatchQueue(label: "StartTunnelOperationTests.testQueue")
let settings = LatestTunnelSettings()
let expectation = XCTestExpectation(description:"")
let operation = StartTunnelOperation(
dispatchQueue: testQueue,
interactor: MockTunnelInteractor(isConfigurationLoaded: true, settings: settings, deviceState: .loggedOut)) { result in
- guard case let .failure(err) = result else {
+ guard case .failure(_) = result else {
XCTFail("Operation returned \(result), not failure")
return
}
-
expectation.fulfill()
-
}
operationQueue.addOperation(operation)
wait(for: [expectation], timeout: 10.0)
}
+
+ func testSetsReconnectIfDisconnecting() {
+ let settings = LatestTunnelSettings()
+ var interactor = MockTunnelInteractor(
+ isConfigurationLoaded: true,
+ settings: settings,
+ deviceState: .loggedIn(
+ StoredAccountData(
+ identifier: "",
+ number: "",
+ expiry: .distantFuture
+ ),
+ StoredDeviceData(
+ creationDate: Date(),
+ identifier: "",
+ name: "",
+ hijackDNS: false,
+ ipv4Address: IPAddressRange(from: "127.0.0.1/32")!,
+ ipv6Address: IPAddressRange(from: "::ff/64")!,
+ wgKeyData: StoredWgKeyData(creationDate: Date(), privateKey: PrivateKey())
+ )
+ )
+ )
+ var tunnelStatus = TunnelStatus()
+ tunnelStatus.state = .disconnecting(.nothing)
+ interactor.tunnelStatus = tunnelStatus
+ interactor.onUpdateTunnelStatus = { status in tunnelStatus = status }
+ let expectation = XCTestExpectation(description:"")
+
+ let operation = StartTunnelOperation(
+ dispatchQueue: testQueue,
+ interactor: interactor) { result in
+ XCTAssertEqual(tunnelStatus.state, .disconnecting(.reconnect))
+ expectation.fulfill()
+ }
+ }
}