Skip to content

Commit daa31da

Browse files
niklasberglundbuggmagnet
authored andcommitted
Add custom DNS test
1 parent 4c8730b commit daa31da

File tree

3 files changed

+91
-1
lines changed

3 files changed

+91
-1
lines changed

ios/MullvadVPNUITests/Networking/Networking.swift

+61
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
@@ -165,4 +170,60 @@ class Networking {
165170
public static func verifyCannotReachAdServingDomain() throws {
166171
XCTAssertFalse(try Self.canConnectSocket(host: try Self.getAdServingDomain(), port: "80"))
167172
}
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+
}
168229
}

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
}

ios/MullvadVPNUITests/Test base classes/BaseUITestCase.swift

-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ class BaseUITestCase: XCTestCase {
129129

130130
func logoutIfLoggedIn() {
131131
if isLoggedIn() {
132-
// First dismiss settings modal if presented
133132
if isPresentingSettings() {
134133
SettingsPage(app)
135134
.swipeDownToDismissModal()

0 commit comments

Comments
 (0)