Skip to content

Commit 6868d3c

Browse files
committed
Merge branch 'test-custom-dns-ios-437'
2 parents d7bd774 + daa31da commit 6868d3c

File tree

3 files changed

+103
-1
lines changed

3 files changed

+103
-1
lines changed

.github/workflows/ios-end-to-end-tests.yml

-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ jobs:
3333
toolchain: stable
3434
override: true
3535
target: aarch64-apple-ios
36-
3736
- name: Checkout repository
3837
uses: actions/checkout@v4
3938

ios/MullvadVPNUITests/Networking/Networking.swift

+73
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ enum NetworkingError: Error {
1515
case internalError(reason: String)
1616
}
1717

18+
struct DNSServerEntry: Decodable {
19+
let organization: String
20+
let mullvad_dns: Bool
21+
}
22+
1823
/// Class with methods for verifying network connectivity
1924
class Networking {
2025
/// Get IP address of the iOS device under test
@@ -63,6 +68,18 @@ class Networking {
6368
throw NetworkingError.internalError(reason: "Failed to determine device's IP address")
6469
}
6570

71+
/// Get configured ad serving domain as URL object
72+
private static func getAdServingDomainURL() -> URL? {
73+
guard let adServingDomain = Bundle(for: BaseUITestCase.self)
74+
.infoDictionary?["AdServingDomain"] as? String,
75+
let adServingDomainURL = URL(string: adServingDomain) else {
76+
XCTFail("Ad serving domain not configured")
77+
return nil
78+
}
79+
80+
return adServingDomainURL
81+
}
82+
6683
/// Get configured ad serving domain
6784
private static func getAdServingDomain() throws -> String {
6885
guard let adServingDomain = Bundle(for: Networking.self)
@@ -153,4 +170,60 @@ class Networking {
153170
public static func verifyCannotReachAdServingDomain() throws {
154171
XCTAssertFalse(try Self.canConnectSocket(host: try Self.getAdServingDomain(), port: "80"))
155172
}
173+
174+
/// Verify that the expected DNS server is used by verifying provider name and whether it is a Mullvad DNS server or not
175+
public static func verifyDNSServerProvider(_ providerName: String, isMullvad: Bool) throws {
176+
guard let mullvadDNSLeakURL = URL(string: "https://am.i.mullvad.net/dnsleak") else {
177+
throw NetworkingError.internalError(reason: "Failed to create URL object")
178+
}
179+
180+
var request = URLRequest(url: mullvadDNSLeakURL)
181+
request.setValue("application/json", forHTTPHeaderField: "accept")
182+
183+
var requestData: Data?
184+
var requestResponse: URLResponse?
185+
var requestError: Error?
186+
let completionHandlerInvokedExpectation = XCTestExpectation(
187+
description: "Completion handler for the request is invoked"
188+
)
189+
190+
do {
191+
let dataTask = URLSession.shared.dataTask(with: request) { data, response, error in
192+
requestData = data
193+
requestResponse = response
194+
requestError = error
195+
completionHandlerInvokedExpectation.fulfill()
196+
}
197+
198+
dataTask.resume()
199+
200+
let waitResult = XCTWaiter.wait(for: [completionHandlerInvokedExpectation], timeout: 30)
201+
202+
if waitResult != .completed {
203+
XCTFail("Failed to verify DNS server provider - timeout")
204+
} else {
205+
if let response = requestResponse as? HTTPURLResponse {
206+
if response.statusCode != 200 {
207+
XCTFail("Failed to verify DNS server provider - unexpected server response")
208+
}
209+
}
210+
211+
if let error = requestError {
212+
XCTFail("Failed to verify DNS server provider - encountered error \(error.localizedDescription)")
213+
}
214+
215+
if let requestData = requestData {
216+
let dnsServerEntries = try JSONDecoder().decode([DNSServerEntry].self, from: requestData)
217+
XCTAssertGreaterThanOrEqual(dnsServerEntries.count, 1)
218+
219+
for dnsServerEntry in dnsServerEntries {
220+
XCTAssertEqual(dnsServerEntry.organization, providerName)
221+
XCTAssertEqual(dnsServerEntry.mullvad_dns, isMullvad)
222+
}
223+
}
224+
}
225+
} catch {
226+
XCTFail("Failed to verify DNS server provider - couldn't serialize JSON")
227+
}
228+
}
156229
}

ios/MullvadVPNUITests/RelayTests.swift

+30
Original file line numberDiff line numberDiff line change
@@ -197,4 +197,34 @@ class RelayTests: LoggedInWithTimeUITestCase {
197197

198198
return relayIPAddress
199199
}
200+
201+
func testCustomDNS() throws {
202+
let dnsServerIPAddress = "8.8.8.8"
203+
let dnsServerProviderName = "GOOGLE"
204+
205+
TunnelControlPage(app)
206+
.tapSecureConnectionButton()
207+
208+
allowAddVPNConfigurations()
209+
210+
HeaderBar(app)
211+
.tapSettingsButton()
212+
213+
SettingsPage(app)
214+
.tapVPNSettingsCell()
215+
216+
VPNSettingsPage(app)
217+
.tapDNSSettingsCell()
218+
219+
DNSSettingsPage(app)
220+
.tapEditButton()
221+
.tapAddAServer()
222+
.tapEnterIPAddressTextField()
223+
.enterText(dnsServerIPAddress)
224+
.dismissKeyboard()
225+
.tapUseCustomDNSSwitch()
226+
.tapDoneButton()
227+
228+
try Networking.verifyDNSServerProvider(dnsServerProviderName, isMullvad: false)
229+
}
200230
}

0 commit comments

Comments
 (0)