summaryrefslogtreecommitdiffhomepage
path: root/ios/PacketTunnelCoreTests/Mocks/DefaultPathObserverFake.swift
blob: 6a036ee6b08f1163c192754fd64c6d36e2af0db8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//
//  DefaultPathObserverFake.swift
//  PacketTunnelCoreTests
//
//  Created by pronebird on 16/08/2023.
//  Copyright © 2023 Mullvad VPN AB. All rights reserved.
//

import Foundation
import NetworkExtension
import PacketTunnelCore

struct NetworkPathStub: NetworkPath {
    var status: NetworkExtension.NWPathStatus = .satisfied
}

/// Default path observer fake that uses in-memory storage to keep current path and provides a method to simulate path change from tests.
class DefaultPathObserverFake: DefaultPathObserverProtocol, @unchecked Sendable {
    var defaultPath: NetworkPath? {
        return stateLock.withLock { innerPath }
    }

    private var innerPath: NetworkPath = NetworkPathStub()
    private var stateLock = NSLock()
    private var defaultPathHandler: ((NetworkPath) -> Void)?

    public var onStart: (() -> Void)?
    public var onStop: (() -> Void)?

    func start(_ body: @escaping (NetworkPath) -> Void) {
        stateLock.withLock {
            defaultPathHandler = body
            onStart?()
        }
    }

    func stop() {
        stateLock.withLock {
            defaultPathHandler = nil
            onStop?()
        }
    }

    /// Simulate network path update.
    func updatePath(_ newPath: NetworkPath) {
        let pathHandler = stateLock.withLock {
            innerPath = newPath
            return defaultPathHandler
        }
        pathHandler?(newPath)
    }
}