Skip to content

Commit abd9899

Browse files
Add custom DNS test
1 parent 4982078 commit abd9899

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
@@ -163,4 +163,34 @@ class RelayTests: LoggedInWithTimeUITestCase {
163163
.verifyConnectingToPort("4001")
164164
.tapDisconnectButton()
165165
}
166+
167+
func testCustomDNS() throws {
168+
let dnsServerIPAddress = "8.8.8.8"
169+
let dnsServerProviderName = "GOOGLE"
170+
171+
TunnelControlPage(app)
172+
.tapSecureConnectionButton()
173+
174+
allowAddVPNConfigurations()
175+
176+
HeaderBar(app)
177+
.tapSettingsButton()
178+
179+
SettingsPage(app)
180+
.tapVPNSettingsCell()
181+
182+
VPNSettingsPage(app)
183+
.tapDNSSettingsCell()
184+
185+
DNSSettingsPage(app)
186+
.tapEditButton()
187+
.tapAddAServer()
188+
.tapEnterIPAddressTextField()
189+
.enterText(dnsServerIPAddress)
190+
.dismissKeyboard()
191+
.tapUseCustomDNSSwitch()
192+
.tapDoneButton()
193+
194+
try Networking.verifyDNSServerProvider(dnsServerProviderName, isMullvad: false)
195+
}
166196
}

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)