@@ -15,6 +15,11 @@ enum NetworkingError: Error {
15
15
case internalError( reason: String )
16
16
}
17
17
18
+ struct DNSServerEntry : Decodable {
19
+ let organization : String
20
+ let mullvad_dns : Bool
21
+ }
22
+
18
23
/// Class with methods for verifying network connectivity
19
24
class Networking {
20
25
/// Get IP address of the iOS device under test
@@ -165,4 +170,60 @@ class Networking {
165
170
public static func verifyCannotReachAdServingDomain( ) throws {
166
171
XCTAssertFalse ( try Self . canConnectSocket ( host: try Self . getAdServingDomain ( ) , port: " 80 " ) )
167
172
}
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
+ }
168
229
}
0 commit comments