diff options
Diffstat (limited to 'ios')
| -rw-r--r-- | ios/MullvadVPN.xcodeproj/project.pbxproj | 12 | ||||
| -rw-r--r-- | ios/MullvadVPNTests/Mocks/MockTunnelInteractor.swift | 72 | ||||
| -rw-r--r-- | ios/MullvadVPNTests/StartTunnelOperationTests.swift | 102 |
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() + } + } } |
