summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadVPNTests/MullvadSettings/IPOverrideTests.swift
blob: bbdf3d4e42caf4ba8dbc3b1f0f8b8e1da8514abe (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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//
//  IPOverrideTests.swift
//  MullvadVPNTests
//
//  Created by Jon Petersson on 2024-01-30.
//  Copyright © 2025 Mullvad VPN AB. All rights reserved.
//

import MullvadTypes
import XCTest

@testable import MullvadSettings

final class IPOverrideTests: XCTestCase {
    let repository = IPOverrideRepository()

    func testCanParseOverrides() throws {
        XCTAssertNoThrow(try parseData(from: overrides))
    }

    func testCanParseOverrideToInternalType() throws {
        let overrides = try parseData(from: overrides)
        overrides.forEach { override in
            if let ipv4Address = override.ipv4Address {
                XCTAssertNotNil(AnyIPAddress(ipv4Address.debugDescription))
            }
            if let ipv6Address = override.ipv6Address {
                XCTAssertNotNil(AnyIPAddress(ipv6Address.debugDescription))
            }
        }
    }

    func testFailedToParseOverridesWithUnsupportedKeys() throws {
        XCTAssertThrowsError(try parseData(from: overridesWithUnsupportedKeys))
    }

    func testFailedToParseOverridesWithMalformedValues() throws {
        XCTAssertThrowsError(try parseData(from: overridesWithMalformedValues))
    }

    func testCreateOverrideWithOneAddress() throws {
        XCTAssertNoThrow(try IPOverride(hostname: "Host 1", ipv4Address: .any, ipv6Address: nil))
        XCTAssertNoThrow(try IPOverride(hostname: "Host 1", ipv4Address: nil, ipv6Address: .any))
    }

    func testFailedToCreateOverrideWithNoAddresses() throws {
        XCTAssertThrowsError(try IPOverride(hostname: "Host 1", ipv4Address: nil, ipv6Address: nil))
    }
}

extension IPOverrideTests {
    private func parseData(from overrideString: String) throws -> [IPOverride] {
        let data = overrideString.data(using: .utf8)!
        let overrides = try repository.parse(data: data)

        return overrides
    }
}

extension IPOverrideTests {
    private var overrides: String {
        return """
            {
                "relay_overrides": [
                    {
                        "hostname": "Host 1",
                        "ipv4_addr_in": "127.0.0.1",
                        "ipv6_addr_in": "::"
                    },
                    {
                        "hostname": "Host 2",
                        "ipv4_addr_in": "127.0.0.2",
                        "ipv6_addr_in": "::1"
                    }
                ]
            }
            """
    }

    private var overridesWithUnsupportedKeys: String {
        return """
            "{
                "relay_overrides": [{
                    "name": "Host 1",
                    "hostname": "Host 1",
                    "ipv4_addr_in": "127.0.0.1",
                    "ipv6_addr_in": "::"
                }]
            }
            """
    }

    private var overridesWithMalformedValues: String {
        return """
            "{
                "relay_overrides": [{
                    "hostname": "Host 1",
                    "ipv4_addr_in": "127.0.0",
                    "ipv6_addr_in": "::"
                }]
            }
            """
    }
}