blob: b18fcff99e53c936345181e2e019cddc692c8daa [file] [log] [blame]
Ben Schwartzded1b702017-10-25 14:41:02 -04001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "dns_tls_test"
18
19#include <gtest/gtest.h>
20
21#include "dns/DnsTlsDispatcher.h"
Ben Schwartz33860762017-10-25 14:41:02 -040022#include "dns/DnsTlsQueryMap.h"
Ben Schwartzded1b702017-10-25 14:41:02 -040023#include "dns/DnsTlsServer.h"
24#include "dns/DnsTlsSessionCache.h"
25#include "dns/DnsTlsSocket.h"
26#include "dns/DnsTlsTransport.h"
27#include "dns/IDnsTlsSocket.h"
28#include "dns/IDnsTlsSocketFactory.h"
Ben Schwartz33860762017-10-25 14:41:02 -040029#include "dns/IDnsTlsSocketObserver.h"
Ben Schwartzded1b702017-10-25 14:41:02 -040030
31#include <chrono>
32#include <arpa/inet.h>
33#include <android-base/macros.h>
34#include <netdutils/Slice.h>
35
36#include "log/log.h"
37
38namespace android {
39namespace net {
40
41using netdutils::Slice;
42using netdutils::makeSlice;
43
44typedef std::vector<uint8_t> bytevec;
45
46static void parseServer(const char* server, in_port_t port, sockaddr_storage* parsed) {
47 sockaddr_in* sin = reinterpret_cast<sockaddr_in*>(parsed);
48 if (inet_pton(AF_INET, server, &(sin->sin_addr)) == 1) {
49 // IPv4 parse succeeded, so it's IPv4
50 sin->sin_family = AF_INET;
51 sin->sin_port = htons(port);
52 return;
53 }
54 sockaddr_in6* sin6 = reinterpret_cast<sockaddr_in6*>(parsed);
55 if (inet_pton(AF_INET6, server, &(sin6->sin6_addr)) == 1){
56 // IPv6 parse succeeded, so it's IPv6.
57 sin6->sin6_family = AF_INET6;
58 sin6->sin6_port = htons(port);
59 return;
60 }
61 ALOGE("Failed to parse server address: %s", server);
62}
63
64bytevec FINGERPRINT1 = { 1 };
Ben Schwartze5595152017-10-25 14:41:02 -040065bytevec FINGERPRINT2 = { 2 };
Ben Schwartzded1b702017-10-25 14:41:02 -040066
67std::string SERVERNAME1 = "dns.example.com";
Ben Schwartze5595152017-10-25 14:41:02 -040068std::string SERVERNAME2 = "dns.example.org";
Ben Schwartzded1b702017-10-25 14:41:02 -040069
70// BaseTest just provides constants that are useful for the tests.
71class BaseTest : public ::testing::Test {
Erik Klineab999f12018-07-04 11:29:31 +090072 protected:
Ben Schwartzded1b702017-10-25 14:41:02 -040073 BaseTest() {
74 parseServer("192.0.2.1", 853, &V4ADDR1);
75 parseServer("192.0.2.2", 853, &V4ADDR2);
Ben Schwartze5595152017-10-25 14:41:02 -040076 parseServer("2001:db8::1", 853, &V6ADDR1);
77 parseServer("2001:db8::2", 853, &V6ADDR2);
Ben Schwartzded1b702017-10-25 14:41:02 -040078
79 SERVER1 = DnsTlsServer(V4ADDR1);
80 SERVER1.fingerprints.insert(FINGERPRINT1);
81 SERVER1.name = SERVERNAME1;
82 }
83
84 sockaddr_storage V4ADDR1;
85 sockaddr_storage V4ADDR2;
Ben Schwartze5595152017-10-25 14:41:02 -040086 sockaddr_storage V6ADDR1;
87 sockaddr_storage V6ADDR2;
Ben Schwartzded1b702017-10-25 14:41:02 -040088
89 DnsTlsServer SERVER1;
90};
91
92bytevec make_query(uint16_t id, size_t size) {
93 bytevec vec(size);
94 vec[0] = id >> 8;
95 vec[1] = id;
96 // Arbitrarily fill the query body with unique data.
97 for (size_t i = 2; i < size; ++i) {
98 vec[i] = id + i;
99 }
100 return vec;
101}
102
103// Query constants
104const unsigned MARK = 123;
105const uint16_t ID = 52;
106const uint16_t SIZE = 22;
107const bytevec QUERY = make_query(ID, SIZE);
108
109template <class T>
110class FakeSocketFactory : public IDnsTlsSocketFactory {
Erik Klineab999f12018-07-04 11:29:31 +0900111 public:
Ben Schwartzded1b702017-10-25 14:41:02 -0400112 FakeSocketFactory() {}
113 std::unique_ptr<IDnsTlsSocket> createDnsTlsSocket(
114 const DnsTlsServer& server ATTRIBUTE_UNUSED,
115 unsigned mark ATTRIBUTE_UNUSED,
Ben Schwartz33860762017-10-25 14:41:02 -0400116 IDnsTlsSocketObserver* observer,
Ben Schwartzded1b702017-10-25 14:41:02 -0400117 DnsTlsSessionCache* cache ATTRIBUTE_UNUSED) override {
Ben Schwartz33860762017-10-25 14:41:02 -0400118 return std::make_unique<T>(observer);
Ben Schwartzded1b702017-10-25 14:41:02 -0400119 }
120};
121
122bytevec make_echo(uint16_t id, const Slice query) {
123 bytevec response(query.size() + 2);
124 response[0] = id >> 8;
125 response[1] = id;
126 // Echo the query as the fake response.
127 memcpy(response.data() + 2, query.base(), query.size());
128 return response;
129}
130
131// Simplest possible fake server. This just echoes the query as the response.
132class FakeSocketEcho : public IDnsTlsSocket {
Erik Klineab999f12018-07-04 11:29:31 +0900133 public:
134 explicit FakeSocketEcho(IDnsTlsSocketObserver* observer) : mObserver(observer) {}
Ben Schwartz33860762017-10-25 14:41:02 -0400135 bool query(uint16_t id, const Slice query) override {
136 // Return the response immediately (asynchronously).
137 std::thread(&IDnsTlsSocketObserver::onResponse, mObserver, make_echo(id, query)).detach();
Bernie Innocenti0f167432018-05-17 22:25:54 +0900138 return true;
Ben Schwartzded1b702017-10-25 14:41:02 -0400139 }
Erik Klineab999f12018-07-04 11:29:31 +0900140
141 private:
Ben Schwartz33860762017-10-25 14:41:02 -0400142 IDnsTlsSocketObserver* const mObserver;
Ben Schwartzded1b702017-10-25 14:41:02 -0400143};
144
145class TransportTest : public BaseTest {};
146
147TEST_F(TransportTest, Query) {
148 FakeSocketFactory<FakeSocketEcho> factory;
149 DnsTlsTransport transport(SERVER1, MARK, &factory);
Ben Schwartz33860762017-10-25 14:41:02 -0400150 auto r = transport.query(makeSlice(QUERY)).get();
Ben Schwartzded1b702017-10-25 14:41:02 -0400151
152 EXPECT_EQ(DnsTlsTransport::Response::success, r.code);
153 EXPECT_EQ(QUERY, r.response);
154}
155
Ben Schwartzaac6cac2018-07-24 12:20:56 -0400156// Fake Socket that echoes the observed query ID as the response body.
157class FakeSocketId : public IDnsTlsSocket {
158 public:
159 explicit FakeSocketId(IDnsTlsSocketObserver* observer) : mObserver(observer) {}
160 bool query(uint16_t id, const Slice query ATTRIBUTE_UNUSED) override {
161 // Return the response immediately (asynchronously).
162 bytevec response(4);
163 // Echo the ID in the header to match the response to the query.
164 // This will be overwritten by DnsTlsQueryMap.
165 response[0] = id >> 8;
166 response[1] = id;
167 // Echo the ID in the body, so that the test can verify which ID was used by
168 // DnsTlsQueryMap.
169 response[2] = id >> 8;
170 response[3] = id;
171 std::thread(&IDnsTlsSocketObserver::onResponse, mObserver, response).detach();
172 return true;
173 }
Ben Schwartzded1b702017-10-25 14:41:02 -0400174
Ben Schwartzaac6cac2018-07-24 12:20:56 -0400175 private:
176 IDnsTlsSocketObserver* const mObserver;
177};
178
179// Test that IDs are properly reused
180TEST_F(TransportTest, IdReuse) {
181 FakeSocketFactory<FakeSocketId> factory;
182 DnsTlsTransport transport(SERVER1, MARK, &factory);
183 for (int i = 0; i < 100; ++i) {
184 // Send a query.
185 std::future<DnsTlsServer::Result> f = transport.query(makeSlice(QUERY));
186 // Wait for the response.
187 DnsTlsServer::Result r = f.get();
Ben Schwartzded1b702017-10-25 14:41:02 -0400188 EXPECT_EQ(DnsTlsTransport::Response::success, r.code);
Ben Schwartzaac6cac2018-07-24 12:20:56 -0400189
190 // All queries should have an observed ID of zero, because it is returned to the ID pool
191 // after each use.
192 EXPECT_EQ(0, (r.response[2] << 8) | r.response[3]);
Ben Schwartzded1b702017-10-25 14:41:02 -0400193 }
194}
195
Ben Schwartz33860762017-10-25 14:41:02 -0400196// These queries might be handled in serial or parallel as they race the
197// responses.
198TEST_F(TransportTest, RacingQueries_10000) {
199 FakeSocketFactory<FakeSocketEcho> factory;
200 DnsTlsTransport transport(SERVER1, MARK, &factory);
201 std::vector<std::future<DnsTlsTransport::Result>> results;
202 // Fewer than 65536 queries to avoid ID exhaustion.
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900203 const int num_queries = 10000;
204 results.reserve(num_queries);
205 for (int i = 0; i < num_queries; ++i) {
Ben Schwartz33860762017-10-25 14:41:02 -0400206 results.push_back(transport.query(makeSlice(QUERY)));
207 }
208 for (auto& result : results) {
209 auto r = result.get();
210 EXPECT_EQ(DnsTlsTransport::Response::success, r.code);
211 EXPECT_EQ(QUERY, r.response);
212 }
213}
214
215// A server that waits until sDelay queries are queued before responding.
216class FakeSocketDelay : public IDnsTlsSocket {
Erik Klineab999f12018-07-04 11:29:31 +0900217 public:
218 explicit FakeSocketDelay(IDnsTlsSocketObserver* observer) : mObserver(observer) {}
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900219 ~FakeSocketDelay() { std::lock_guard guard(mLock); }
Ben Schwartz33860762017-10-25 14:41:02 -0400220 static size_t sDelay;
221 static bool sReverse;
222
223 bool query(uint16_t id, const Slice query) override {
224 ALOGD("FakeSocketDelay got query with ID %d", int(id));
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900225 std::lock_guard guard(mLock);
Ben Schwartz33860762017-10-25 14:41:02 -0400226 // Check for duplicate IDs.
227 EXPECT_EQ(0U, mIds.count(id));
228 mIds.insert(id);
229
230 // Store response.
231 mResponses.push_back(make_echo(id, query));
232
233 ALOGD("Up to %zu out of %zu queries", mResponses.size(), sDelay);
234 if (mResponses.size() == sDelay) {
235 std::thread(&FakeSocketDelay::sendResponses, this).detach();
236 }
237 return true;
238 }
Erik Klineab999f12018-07-04 11:29:31 +0900239
240 private:
Ben Schwartz33860762017-10-25 14:41:02 -0400241 void sendResponses() {
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900242 std::lock_guard guard(mLock);
Ben Schwartz33860762017-10-25 14:41:02 -0400243 if (sReverse) {
244 std::reverse(std::begin(mResponses), std::end(mResponses));
245 }
246 for (auto& response : mResponses) {
247 mObserver->onResponse(response);
248 }
249 mIds.clear();
250 mResponses.clear();
251 }
252
253 std::mutex mLock;
254 IDnsTlsSocketObserver* const mObserver;
255 std::set<uint16_t> mIds GUARDED_BY(mLock);
256 std::vector<bytevec> mResponses GUARDED_BY(mLock);
257};
258
259size_t FakeSocketDelay::sDelay;
260bool FakeSocketDelay::sReverse;
261
262TEST_F(TransportTest, ParallelColliding) {
263 FakeSocketDelay::sDelay = 10;
264 FakeSocketDelay::sReverse = false;
265 FakeSocketFactory<FakeSocketDelay> factory;
266 DnsTlsTransport transport(SERVER1, MARK, &factory);
267 std::vector<std::future<DnsTlsTransport::Result>> results;
268 // Fewer than 65536 queries to avoid ID exhaustion.
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900269 results.reserve(FakeSocketDelay::sDelay);
Ben Schwartz33860762017-10-25 14:41:02 -0400270 for (size_t i = 0; i < FakeSocketDelay::sDelay; ++i) {
271 results.push_back(transport.query(makeSlice(QUERY)));
272 }
273 for (auto& result : results) {
274 auto r = result.get();
275 EXPECT_EQ(DnsTlsTransport::Response::success, r.code);
276 EXPECT_EQ(QUERY, r.response);
277 }
278}
279
280TEST_F(TransportTest, ParallelColliding_Max) {
281 FakeSocketDelay::sDelay = 65536;
282 FakeSocketDelay::sReverse = false;
283 FakeSocketFactory<FakeSocketDelay> factory;
284 DnsTlsTransport transport(SERVER1, MARK, &factory);
285 std::vector<std::future<DnsTlsTransport::Result>> results;
286 // Exactly 65536 queries should still be possible in parallel,
287 // even if they all have the same original ID.
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900288 results.reserve(FakeSocketDelay::sDelay);
Ben Schwartz33860762017-10-25 14:41:02 -0400289 for (size_t i = 0; i < FakeSocketDelay::sDelay; ++i) {
290 results.push_back(transport.query(makeSlice(QUERY)));
291 }
292 for (auto& result : results) {
293 auto r = result.get();
294 EXPECT_EQ(DnsTlsTransport::Response::success, r.code);
295 EXPECT_EQ(QUERY, r.response);
296 }
297}
298
299TEST_F(TransportTest, ParallelUnique) {
300 FakeSocketDelay::sDelay = 10;
301 FakeSocketDelay::sReverse = false;
302 FakeSocketFactory<FakeSocketDelay> factory;
303 DnsTlsTransport transport(SERVER1, MARK, &factory);
304 std::vector<bytevec> queries(FakeSocketDelay::sDelay);
305 std::vector<std::future<DnsTlsTransport::Result>> results;
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900306 results.reserve(FakeSocketDelay::sDelay);
Ben Schwartz33860762017-10-25 14:41:02 -0400307 for (size_t i = 0; i < FakeSocketDelay::sDelay; ++i) {
308 queries[i] = make_query(i, SIZE);
309 results.push_back(transport.query(makeSlice(queries[i])));
310 }
311 for (size_t i = 0 ; i < FakeSocketDelay::sDelay; ++i) {
312 auto r = results[i].get();
313 EXPECT_EQ(DnsTlsTransport::Response::success, r.code);
314 EXPECT_EQ(queries[i], r.response);
315 }
316}
317
318TEST_F(TransportTest, ParallelUnique_Max) {
319 FakeSocketDelay::sDelay = 65536;
320 FakeSocketDelay::sReverse = false;
321 FakeSocketFactory<FakeSocketDelay> factory;
322 DnsTlsTransport transport(SERVER1, MARK, &factory);
323 std::vector<bytevec> queries(FakeSocketDelay::sDelay);
324 std::vector<std::future<DnsTlsTransport::Result>> results;
325 // Exactly 65536 queries should still be possible in parallel,
326 // and they should all be mapped correctly back to the original ID.
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900327 results.reserve(FakeSocketDelay::sDelay);
Ben Schwartz33860762017-10-25 14:41:02 -0400328 for (size_t i = 0; i < FakeSocketDelay::sDelay; ++i) {
329 queries[i] = make_query(i, SIZE);
330 results.push_back(transport.query(makeSlice(queries[i])));
331 }
332 for (size_t i = 0 ; i < FakeSocketDelay::sDelay; ++i) {
333 auto r = results[i].get();
334 EXPECT_EQ(DnsTlsTransport::Response::success, r.code);
335 EXPECT_EQ(queries[i], r.response);
336 }
337}
338
339TEST_F(TransportTest, IdExhaustion) {
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900340 const int num_queries = 65536;
Ben Schwartz33860762017-10-25 14:41:02 -0400341 // A delay of 65537 is unreachable, because the maximum number
342 // of outstanding queries is 65536.
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900343 FakeSocketDelay::sDelay = num_queries + 1;
Ben Schwartz33860762017-10-25 14:41:02 -0400344 FakeSocketDelay::sReverse = false;
345 FakeSocketFactory<FakeSocketDelay> factory;
346 DnsTlsTransport transport(SERVER1, MARK, &factory);
347 std::vector<std::future<DnsTlsTransport::Result>> results;
348 // Issue the maximum number of queries.
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900349 results.reserve(num_queries);
350 for (int i = 0; i < num_queries; ++i) {
Ben Schwartz33860762017-10-25 14:41:02 -0400351 results.push_back(transport.query(makeSlice(QUERY)));
352 }
353
354 // The ID space is now full, so subsequent queries should fail immediately.
355 auto r = transport.query(makeSlice(QUERY)).get();
356 EXPECT_EQ(DnsTlsTransport::Response::internal_error, r.code);
357 EXPECT_TRUE(r.response.empty());
358
359 for (auto& result : results) {
360 // All other queries should remain outstanding.
361 EXPECT_EQ(std::future_status::timeout,
362 result.wait_for(std::chrono::duration<int>::zero()));
363 }
364}
365
366// Responses can come back from the server in any order. This should have no
367// effect on Transport's observed behavior.
368TEST_F(TransportTest, ReverseOrder) {
369 FakeSocketDelay::sDelay = 10;
370 FakeSocketDelay::sReverse = true;
371 FakeSocketFactory<FakeSocketDelay> factory;
372 DnsTlsTransport transport(SERVER1, MARK, &factory);
373 std::vector<bytevec> queries(FakeSocketDelay::sDelay);
374 std::vector<std::future<DnsTlsTransport::Result>> results;
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900375 results.reserve(FakeSocketDelay::sDelay);
Ben Schwartz33860762017-10-25 14:41:02 -0400376 for (size_t i = 0; i < FakeSocketDelay::sDelay; ++i) {
377 queries[i] = make_query(i, SIZE);
378 results.push_back(transport.query(makeSlice(queries[i])));
379 }
380 for (size_t i = 0 ; i < FakeSocketDelay::sDelay; ++i) {
381 auto r = results[i].get();
382 EXPECT_EQ(DnsTlsTransport::Response::success, r.code);
383 EXPECT_EQ(queries[i], r.response);
384 }
385}
386
387TEST_F(TransportTest, ReverseOrder_Max) {
388 FakeSocketDelay::sDelay = 65536;
389 FakeSocketDelay::sReverse = true;
390 FakeSocketFactory<FakeSocketDelay> factory;
391 DnsTlsTransport transport(SERVER1, MARK, &factory);
392 std::vector<bytevec> queries(FakeSocketDelay::sDelay);
393 std::vector<std::future<DnsTlsTransport::Result>> results;
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900394 results.reserve(FakeSocketDelay::sDelay);
Ben Schwartz33860762017-10-25 14:41:02 -0400395 for (size_t i = 0; i < FakeSocketDelay::sDelay; ++i) {
396 queries[i] = make_query(i, SIZE);
397 results.push_back(transport.query(makeSlice(queries[i])));
398 }
399 for (size_t i = 0 ; i < FakeSocketDelay::sDelay; ++i) {
400 auto r = results[i].get();
401 EXPECT_EQ(DnsTlsTransport::Response::success, r.code);
402 EXPECT_EQ(queries[i], r.response);
403 }
404}
405
Ben Schwartzded1b702017-10-25 14:41:02 -0400406// Returning null from the factory indicates a connection failure.
407class NullSocketFactory : public IDnsTlsSocketFactory {
Erik Klineab999f12018-07-04 11:29:31 +0900408 public:
Ben Schwartzded1b702017-10-25 14:41:02 -0400409 NullSocketFactory() {}
410 std::unique_ptr<IDnsTlsSocket> createDnsTlsSocket(
411 const DnsTlsServer& server ATTRIBUTE_UNUSED,
412 unsigned mark ATTRIBUTE_UNUSED,
Ben Schwartz33860762017-10-25 14:41:02 -0400413 IDnsTlsSocketObserver* observer ATTRIBUTE_UNUSED,
Ben Schwartzded1b702017-10-25 14:41:02 -0400414 DnsTlsSessionCache* cache ATTRIBUTE_UNUSED) override {
415 return nullptr;
416 }
417};
418
419TEST_F(TransportTest, ConnectFail) {
420 NullSocketFactory factory;
421 DnsTlsTransport transport(SERVER1, MARK, &factory);
Ben Schwartz33860762017-10-25 14:41:02 -0400422 auto r = transport.query(makeSlice(QUERY)).get();
Ben Schwartzded1b702017-10-25 14:41:02 -0400423
424 EXPECT_EQ(DnsTlsTransport::Response::network_error, r.code);
425 EXPECT_TRUE(r.response.empty());
426}
427
Ben Schwartz33860762017-10-25 14:41:02 -0400428// Simulate a socket that connects but then immediately receives a server
429// close notification.
430class FakeSocketClose : public IDnsTlsSocket {
Erik Klineab999f12018-07-04 11:29:31 +0900431 public:
432 explicit FakeSocketClose(IDnsTlsSocketObserver* observer)
433 : mCloser(&IDnsTlsSocketObserver::onClosed, observer) {}
Ben Schwartz33860762017-10-25 14:41:02 -0400434 ~FakeSocketClose() { mCloser.join(); }
435 bool query(uint16_t id ATTRIBUTE_UNUSED,
436 const Slice query ATTRIBUTE_UNUSED) override {
437 return true;
438 }
Erik Klineab999f12018-07-04 11:29:31 +0900439
440 private:
Ben Schwartz33860762017-10-25 14:41:02 -0400441 std::thread mCloser;
442};
443
444TEST_F(TransportTest, CloseRetryFail) {
445 FakeSocketFactory<FakeSocketClose> factory;
446 DnsTlsTransport transport(SERVER1, MARK, &factory);
447 auto r = transport.query(makeSlice(QUERY)).get();
448
449 EXPECT_EQ(DnsTlsTransport::Response::network_error, r.code);
450 EXPECT_TRUE(r.response.empty());
451}
452
453// Simulate a server that occasionally closes the connection and silently
454// drops some queries.
455class FakeSocketLimited : public IDnsTlsSocket {
Erik Klineab999f12018-07-04 11:29:31 +0900456 public:
Ben Schwartz33860762017-10-25 14:41:02 -0400457 static int sLimit; // Number of queries to answer per socket.
458 static size_t sMaxSize; // Silently discard queries greater than this size.
Erik Klineab999f12018-07-04 11:29:31 +0900459 explicit FakeSocketLimited(IDnsTlsSocketObserver* observer)
460 : mObserver(observer), mQueries(0) {}
Ben Schwartz33860762017-10-25 14:41:02 -0400461 ~FakeSocketLimited() {
462 {
463 ALOGD("~FakeSocketLimited acquiring mLock");
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900464 std::lock_guard guard(mLock);
Ben Schwartz33860762017-10-25 14:41:02 -0400465 ALOGD("~FakeSocketLimited acquired mLock");
466 for (auto& thread : mThreads) {
467 ALOGD("~FakeSocketLimited joining response thread");
468 thread.join();
469 ALOGD("~FakeSocketLimited joined response thread");
470 }
471 mThreads.clear();
472 }
473
474 if (mCloser) {
475 ALOGD("~FakeSocketLimited joining closer thread");
476 mCloser->join();
477 ALOGD("~FakeSocketLimited joined closer thread");
478 }
479 }
480 bool query(uint16_t id, const Slice query) override {
481 ALOGD("FakeSocketLimited::query acquiring mLock");
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900482 std::lock_guard guard(mLock);
Ben Schwartz33860762017-10-25 14:41:02 -0400483 ALOGD("FakeSocketLimited::query acquired mLock");
484 ++mQueries;
485
486 if (mQueries <= sLimit) {
487 ALOGD("size %zu vs. limit of %zu", query.size(), sMaxSize);
488 if (query.size() <= sMaxSize) {
489 // Return the response immediately (asynchronously).
490 mThreads.emplace_back(&IDnsTlsSocketObserver::onResponse, mObserver, make_echo(id, query));
491 }
492 }
493 if (mQueries == sLimit) {
494 mCloser = std::make_unique<std::thread>(&FakeSocketLimited::sendClose, this);
495 }
496 return mQueries <= sLimit;
497 }
Erik Klineab999f12018-07-04 11:29:31 +0900498
499 private:
Ben Schwartz33860762017-10-25 14:41:02 -0400500 void sendClose() {
501 {
502 ALOGD("FakeSocketLimited::sendClose acquiring mLock");
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900503 std::lock_guard guard(mLock);
Ben Schwartz33860762017-10-25 14:41:02 -0400504 ALOGD("FakeSocketLimited::sendClose acquired mLock");
505 for (auto& thread : mThreads) {
506 ALOGD("FakeSocketLimited::sendClose joining response thread");
507 thread.join();
508 ALOGD("FakeSocketLimited::sendClose joined response thread");
509 }
510 mThreads.clear();
511 }
512 mObserver->onClosed();
513 }
514 std::mutex mLock;
515 IDnsTlsSocketObserver* const mObserver;
516 int mQueries GUARDED_BY(mLock);
517 std::vector<std::thread> mThreads GUARDED_BY(mLock);
518 std::unique_ptr<std::thread> mCloser GUARDED_BY(mLock);
519};
520
521int FakeSocketLimited::sLimit;
522size_t FakeSocketLimited::sMaxSize;
523
524TEST_F(TransportTest, SilentDrop) {
525 FakeSocketLimited::sLimit = 10; // Close the socket after 10 queries.
526 FakeSocketLimited::sMaxSize = 0; // Silently drop all queries
527 FakeSocketFactory<FakeSocketLimited> factory;
528 DnsTlsTransport transport(SERVER1, MARK, &factory);
529
530 // Queue up 10 queries. They will all be ignored, and after the 10th,
531 // the socket will close. Transport will retry them all, until they
532 // all hit the retry limit and expire.
533 std::vector<std::future<DnsTlsTransport::Result>> results;
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900534 results.reserve(FakeSocketLimited::sLimit);
Ben Schwartz33860762017-10-25 14:41:02 -0400535 for (int i = 0; i < FakeSocketLimited::sLimit; ++i) {
536 results.push_back(transport.query(makeSlice(QUERY)));
537 }
538 for (auto& result : results) {
539 auto r = result.get();
540 EXPECT_EQ(DnsTlsTransport::Response::network_error, r.code);
541 EXPECT_TRUE(r.response.empty());
542 }
543}
544
545TEST_F(TransportTest, PartialDrop) {
546 FakeSocketLimited::sLimit = 10; // Close the socket after 10 queries.
547 FakeSocketLimited::sMaxSize = SIZE - 2; // Silently drop "long" queries
548 FakeSocketFactory<FakeSocketLimited> factory;
549 DnsTlsTransport transport(SERVER1, MARK, &factory);
550
551 // Queue up 100 queries, alternating "short" which will be served and "long"
552 // which will be dropped.
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900553 const int num_queries = 10 * FakeSocketLimited::sLimit;
Ben Schwartz33860762017-10-25 14:41:02 -0400554 std::vector<bytevec> queries(num_queries);
555 std::vector<std::future<DnsTlsTransport::Result>> results;
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900556 results.reserve(num_queries);
Ben Schwartz33860762017-10-25 14:41:02 -0400557 for (int i = 0; i < num_queries; ++i) {
558 queries[i] = make_query(i, SIZE + (i % 2));
559 results.push_back(transport.query(makeSlice(queries[i])));
560 }
561 // Just check the short queries, which are at the even indices.
562 for (int i = 0; i < num_queries; i += 2) {
563 auto r = results[i].get();
564 EXPECT_EQ(DnsTlsTransport::Response::success, r.code);
565 EXPECT_EQ(queries[i], r.response);
566 }
567}
568
569// Simulate a malfunctioning server that injects extra miscellaneous
570// responses to queries that were not asked. This will cause wrong answers but
571// must not crash the Transport.
572class FakeSocketGarbage : public IDnsTlsSocket {
Erik Klineab999f12018-07-04 11:29:31 +0900573 public:
574 explicit FakeSocketGarbage(IDnsTlsSocketObserver* observer) : mObserver(observer) {
Ben Schwartz33860762017-10-25 14:41:02 -0400575 // Inject a garbage event.
576 mThreads.emplace_back(&IDnsTlsSocketObserver::onResponse, mObserver, make_query(ID + 1, SIZE));
577 }
578 ~FakeSocketGarbage() {
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900579 std::lock_guard guard(mLock);
Ben Schwartz33860762017-10-25 14:41:02 -0400580 for (auto& thread : mThreads) {
581 thread.join();
582 }
583 }
584 bool query(uint16_t id, const Slice query) override {
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900585 std::lock_guard guard(mLock);
Ben Schwartz33860762017-10-25 14:41:02 -0400586 // Return the response twice.
587 auto echo = make_echo(id, query);
588 mThreads.emplace_back(&IDnsTlsSocketObserver::onResponse, mObserver, echo);
589 mThreads.emplace_back(&IDnsTlsSocketObserver::onResponse, mObserver, echo);
590 // Also return some other garbage
591 mThreads.emplace_back(&IDnsTlsSocketObserver::onResponse, mObserver, make_query(id + 1, query.size() + 2));
592 return true;
593 }
Erik Klineab999f12018-07-04 11:29:31 +0900594
595 private:
Ben Schwartz33860762017-10-25 14:41:02 -0400596 std::mutex mLock;
597 std::vector<std::thread> mThreads GUARDED_BY(mLock);
598 IDnsTlsSocketObserver* const mObserver;
599};
600
601TEST_F(TransportTest, IgnoringGarbage) {
602 FakeSocketFactory<FakeSocketGarbage> factory;
603 DnsTlsTransport transport(SERVER1, MARK, &factory);
604 for (int i = 0; i < 10; ++i) {
605 auto r = transport.query(makeSlice(QUERY)).get();
606
607 EXPECT_EQ(DnsTlsTransport::Response::success, r.code);
608 // Don't check the response because this server is malfunctioning.
609 }
610}
611
Ben Schwartzded1b702017-10-25 14:41:02 -0400612// Dispatcher tests
613class DispatcherTest : public BaseTest {};
614
615TEST_F(DispatcherTest, Query) {
616 bytevec ans(4096);
617 int resplen = 0;
618
619 auto factory = std::make_unique<FakeSocketFactory<FakeSocketEcho>>();
620 DnsTlsDispatcher dispatcher(std::move(factory));
621 auto r = dispatcher.query(SERVER1, MARK, makeSlice(QUERY),
622 makeSlice(ans), &resplen);
623
624 EXPECT_EQ(DnsTlsTransport::Response::success, r);
625 EXPECT_EQ(int(QUERY.size()), resplen);
626 ans.resize(resplen);
627 EXPECT_EQ(QUERY, ans);
628}
629
630TEST_F(DispatcherTest, AnswerTooLarge) {
631 bytevec ans(SIZE - 1); // Too small to hold the answer
632 int resplen = 0;
633
634 auto factory = std::make_unique<FakeSocketFactory<FakeSocketEcho>>();
635 DnsTlsDispatcher dispatcher(std::move(factory));
636 auto r = dispatcher.query(SERVER1, MARK, makeSlice(QUERY),
637 makeSlice(ans), &resplen);
638
639 EXPECT_EQ(DnsTlsTransport::Response::limit_error, r);
640}
641
642template<class T>
643class TrackingFakeSocketFactory : public IDnsTlsSocketFactory {
Erik Klineab999f12018-07-04 11:29:31 +0900644 public:
Ben Schwartzded1b702017-10-25 14:41:02 -0400645 TrackingFakeSocketFactory() {}
646 std::unique_ptr<IDnsTlsSocket> createDnsTlsSocket(
647 const DnsTlsServer& server,
648 unsigned mark,
Ben Schwartz33860762017-10-25 14:41:02 -0400649 IDnsTlsSocketObserver* observer,
Ben Schwartzded1b702017-10-25 14:41:02 -0400650 DnsTlsSessionCache* cache ATTRIBUTE_UNUSED) override {
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900651 std::lock_guard guard(mLock);
Ben Schwartzded1b702017-10-25 14:41:02 -0400652 keys.emplace(mark, server);
Ben Schwartz33860762017-10-25 14:41:02 -0400653 return std::make_unique<T>(observer);
Ben Schwartzded1b702017-10-25 14:41:02 -0400654 }
655 std::multiset<std::pair<unsigned, DnsTlsServer>> keys;
Erik Klineab999f12018-07-04 11:29:31 +0900656
657 private:
Ben Schwartzded1b702017-10-25 14:41:02 -0400658 std::mutex mLock;
659};
660
661TEST_F(DispatcherTest, Dispatching) {
Ben Schwartz33860762017-10-25 14:41:02 -0400662 FakeSocketDelay::sDelay = 5;
663 FakeSocketDelay::sReverse = true;
664 auto factory = std::make_unique<TrackingFakeSocketFactory<FakeSocketDelay>>();
Ben Schwartzded1b702017-10-25 14:41:02 -0400665 auto* weak_factory = factory.get(); // Valid as long as dispatcher is in scope.
666 DnsTlsDispatcher dispatcher(std::move(factory));
667
668 // Populate a vector of two servers and two socket marks, four combinations
669 // in total.
670 std::vector<std::pair<unsigned, DnsTlsServer>> keys;
671 keys.emplace_back(MARK, SERVER1);
672 keys.emplace_back(MARK + 1, SERVER1);
673 keys.emplace_back(MARK, V4ADDR2);
674 keys.emplace_back(MARK + 1, V4ADDR2);
675
Ben Schwartz33860762017-10-25 14:41:02 -0400676 // Do several queries on each server. They should all succeed.
Ben Schwartzded1b702017-10-25 14:41:02 -0400677 std::vector<std::thread> threads;
Ben Schwartz33860762017-10-25 14:41:02 -0400678 for (size_t i = 0; i < FakeSocketDelay::sDelay * keys.size(); ++i) {
Ben Schwartzded1b702017-10-25 14:41:02 -0400679 auto key = keys[i % keys.size()];
680 threads.emplace_back([key, i] (DnsTlsDispatcher* dispatcher) {
681 auto q = make_query(i, SIZE);
682 bytevec ans(4096);
683 int resplen = 0;
684 unsigned mark = key.first;
685 const DnsTlsServer& server = key.second;
686 auto r = dispatcher->query(server, mark, makeSlice(q),
687 makeSlice(ans), &resplen);
688 EXPECT_EQ(DnsTlsTransport::Response::success, r);
689 EXPECT_EQ(int(q.size()), resplen);
690 ans.resize(resplen);
691 EXPECT_EQ(q, ans);
692 }, &dispatcher);
693 }
694 for (auto& thread : threads) {
695 thread.join();
696 }
697 // We expect that the factory created one socket for each key.
698 EXPECT_EQ(keys.size(), weak_factory->keys.size());
699 for (auto& key : keys) {
700 EXPECT_EQ(1U, weak_factory->keys.count(key));
701 }
702}
703
Ben Schwartze5595152017-10-25 14:41:02 -0400704// Check DnsTlsServer's comparison logic.
705AddressComparator ADDRESS_COMPARATOR;
706bool isAddressEqual(const DnsTlsServer& s1, const DnsTlsServer& s2) {
707 bool cmp1 = ADDRESS_COMPARATOR(s1, s2);
708 bool cmp2 = ADDRESS_COMPARATOR(s2, s1);
709 EXPECT_FALSE(cmp1 && cmp2);
710 return !cmp1 && !cmp2;
711}
712
713void checkUnequal(const DnsTlsServer& s1, const DnsTlsServer& s2) {
714 EXPECT_TRUE(s1 == s1);
715 EXPECT_TRUE(s2 == s2);
716 EXPECT_TRUE(isAddressEqual(s1, s1));
717 EXPECT_TRUE(isAddressEqual(s2, s2));
718
719 EXPECT_TRUE(s1 < s2 ^ s2 < s1);
720 EXPECT_FALSE(s1 == s2);
721 EXPECT_FALSE(s2 == s1);
722}
723
724class ServerTest : public BaseTest {};
725
726TEST_F(ServerTest, IPv4) {
727 checkUnequal(V4ADDR1, V4ADDR2);
728 EXPECT_FALSE(isAddressEqual(V4ADDR1, V4ADDR2));
729}
730
731TEST_F(ServerTest, IPv6) {
732 checkUnequal(V6ADDR1, V6ADDR2);
733 EXPECT_FALSE(isAddressEqual(V6ADDR1, V6ADDR2));
734}
735
736TEST_F(ServerTest, MixedAddressFamily) {
737 checkUnequal(V6ADDR1, V4ADDR1);
738 EXPECT_FALSE(isAddressEqual(V6ADDR1, V4ADDR1));
739}
740
741TEST_F(ServerTest, IPv6ScopeId) {
742 DnsTlsServer s1(V6ADDR1), s2(V6ADDR1);
743 sockaddr_in6* addr1 = reinterpret_cast<sockaddr_in6*>(&s1.ss);
744 addr1->sin6_scope_id = 1;
745 sockaddr_in6* addr2 = reinterpret_cast<sockaddr_in6*>(&s2.ss);
746 addr2->sin6_scope_id = 2;
747 checkUnequal(s1, s2);
748 EXPECT_FALSE(isAddressEqual(s1, s2));
Erik Kline1564d482018-03-07 17:09:35 +0900749
750 EXPECT_FALSE(s1.wasExplicitlyConfigured());
751 EXPECT_FALSE(s2.wasExplicitlyConfigured());
Ben Schwartze5595152017-10-25 14:41:02 -0400752}
753
754TEST_F(ServerTest, IPv6FlowInfo) {
755 DnsTlsServer s1(V6ADDR1), s2(V6ADDR1);
756 sockaddr_in6* addr1 = reinterpret_cast<sockaddr_in6*>(&s1.ss);
757 addr1->sin6_flowinfo = 1;
758 sockaddr_in6* addr2 = reinterpret_cast<sockaddr_in6*>(&s2.ss);
759 addr2->sin6_flowinfo = 2;
760 // All comparisons ignore flowinfo.
761 EXPECT_EQ(s1, s2);
762 EXPECT_TRUE(isAddressEqual(s1, s2));
Erik Kline1564d482018-03-07 17:09:35 +0900763
764 EXPECT_FALSE(s1.wasExplicitlyConfigured());
765 EXPECT_FALSE(s2.wasExplicitlyConfigured());
Ben Schwartze5595152017-10-25 14:41:02 -0400766}
767
768TEST_F(ServerTest, Port) {
769 DnsTlsServer s1, s2;
770 parseServer("192.0.2.1", 853, &s1.ss);
771 parseServer("192.0.2.1", 854, &s2.ss);
772 checkUnequal(s1, s2);
773 EXPECT_TRUE(isAddressEqual(s1, s2));
774
775 DnsTlsServer s3, s4;
776 parseServer("2001:db8::1", 853, &s3.ss);
777 parseServer("2001:db8::1", 852, &s4.ss);
778 checkUnequal(s3, s4);
779 EXPECT_TRUE(isAddressEqual(s3, s4));
Erik Kline1564d482018-03-07 17:09:35 +0900780
781 EXPECT_FALSE(s1.wasExplicitlyConfigured());
782 EXPECT_FALSE(s2.wasExplicitlyConfigured());
Ben Schwartze5595152017-10-25 14:41:02 -0400783}
784
785TEST_F(ServerTest, Name) {
786 DnsTlsServer s1(V4ADDR1), s2(V4ADDR1);
787 s1.name = SERVERNAME1;
788 checkUnequal(s1, s2);
789 s2.name = SERVERNAME2;
790 checkUnequal(s1, s2);
791 EXPECT_TRUE(isAddressEqual(s1, s2));
Erik Kline1564d482018-03-07 17:09:35 +0900792
793 EXPECT_TRUE(s1.wasExplicitlyConfigured());
794 EXPECT_TRUE(s2.wasExplicitlyConfigured());
Ben Schwartze5595152017-10-25 14:41:02 -0400795}
796
797TEST_F(ServerTest, Fingerprint) {
798 DnsTlsServer s1(V4ADDR1), s2(V4ADDR1);
799
800 s1.fingerprints.insert(FINGERPRINT1);
801 checkUnequal(s1, s2);
802 EXPECT_TRUE(isAddressEqual(s1, s2));
803
804 s2.fingerprints.insert(FINGERPRINT2);
805 checkUnequal(s1, s2);
806 EXPECT_TRUE(isAddressEqual(s1, s2));
807
808 s2.fingerprints.insert(FINGERPRINT1);
809 checkUnequal(s1, s2);
810 EXPECT_TRUE(isAddressEqual(s1, s2));
811
812 s1.fingerprints.insert(FINGERPRINT2);
813 EXPECT_EQ(s1, s2);
814 EXPECT_TRUE(isAddressEqual(s1, s2));
Erik Kline1564d482018-03-07 17:09:35 +0900815
816 EXPECT_TRUE(s1.wasExplicitlyConfigured());
817 EXPECT_TRUE(s2.wasExplicitlyConfigured());
Ben Schwartze5595152017-10-25 14:41:02 -0400818}
819
Ben Schwartz33860762017-10-25 14:41:02 -0400820TEST(QueryMapTest, Basic) {
821 DnsTlsQueryMap map;
822
823 EXPECT_TRUE(map.empty());
824
825 bytevec q0 = make_query(999, SIZE);
826 bytevec q1 = make_query(888, SIZE);
827 bytevec q2 = make_query(777, SIZE);
828
829 auto f0 = map.recordQuery(makeSlice(q0));
830 auto f1 = map.recordQuery(makeSlice(q1));
831 auto f2 = map.recordQuery(makeSlice(q2));
832
833 // Check return values of recordQuery
834 EXPECT_EQ(0, f0->query.newId);
835 EXPECT_EQ(1, f1->query.newId);
836 EXPECT_EQ(2, f2->query.newId);
837
838 // Check side effects of recordQuery
839 EXPECT_FALSE(map.empty());
840
841 auto all = map.getAll();
842 EXPECT_EQ(3U, all.size());
843
844 EXPECT_EQ(0, all[0].newId);
845 EXPECT_EQ(1, all[1].newId);
846 EXPECT_EQ(2, all[2].newId);
847
848 EXPECT_EQ(makeSlice(q0), all[0].query);
849 EXPECT_EQ(makeSlice(q1), all[1].query);
850 EXPECT_EQ(makeSlice(q2), all[2].query);
851
852 bytevec a0 = make_query(0, SIZE);
853 bytevec a1 = make_query(1, SIZE);
854 bytevec a2 = make_query(2, SIZE);
855
856 // Return responses out of order
857 map.onResponse(a2);
858 map.onResponse(a0);
859 map.onResponse(a1);
860
861 EXPECT_TRUE(map.empty());
862
863 auto r0 = f0->result.get();
864 auto r1 = f1->result.get();
865 auto r2 = f2->result.get();
866
867 EXPECT_EQ(DnsTlsQueryMap::Response::success, r0.code);
868 EXPECT_EQ(DnsTlsQueryMap::Response::success, r1.code);
869 EXPECT_EQ(DnsTlsQueryMap::Response::success, r2.code);
870
871 const bytevec& d0 = r0.response;
872 const bytevec& d1 = r1.response;
873 const bytevec& d2 = r2.response;
874
875 // The ID should match the query
876 EXPECT_EQ(999, d0[0] << 8 | d0[1]);
877 EXPECT_EQ(888, d1[0] << 8 | d1[1]);
878 EXPECT_EQ(777, d2[0] << 8 | d2[1]);
879 // The body should match the answer
880 EXPECT_EQ(bytevec(a0.begin() + 2, a0.end()), bytevec(d0.begin() + 2, d0.end()));
881 EXPECT_EQ(bytevec(a1.begin() + 2, a1.end()), bytevec(d1.begin() + 2, d1.end()));
882 EXPECT_EQ(bytevec(a2.begin() + 2, a2.end()), bytevec(d2.begin() + 2, d2.end()));
883}
884
885TEST(QueryMapTest, FillHole) {
886 DnsTlsQueryMap map;
887 std::vector<std::unique_ptr<DnsTlsQueryMap::QueryFuture>> futures(UINT16_MAX + 1);
888 for (uint32_t i = 0; i <= UINT16_MAX; ++i) {
889 futures[i] = map.recordQuery(makeSlice(QUERY));
890 ASSERT_TRUE(futures[i]); // answers[i] should be nonnull.
891 EXPECT_EQ(i, futures[i]->query.newId);
892 }
893
894 // The map should now be full.
895 EXPECT_EQ(size_t(UINT16_MAX + 1), map.getAll().size());
896
897 // Trying to add another query should fail because the map is full.
898 EXPECT_FALSE(map.recordQuery(makeSlice(QUERY)));
899
900 // Send an answer to query 40000
901 auto answer = make_query(40000, SIZE);
902 map.onResponse(answer);
903 auto result = futures[40000]->result.get();
904 EXPECT_EQ(DnsTlsQueryMap::Response::success, result.code);
905 EXPECT_EQ(ID, result.response[0] << 8 | result.response[1]);
906 EXPECT_EQ(bytevec(answer.begin() + 2, answer.end()),
907 bytevec(result.response.begin() + 2, result.response.end()));
908
909 // There should now be room in the map.
910 EXPECT_EQ(size_t(UINT16_MAX), map.getAll().size());
911 auto f = map.recordQuery(makeSlice(QUERY));
912 ASSERT_TRUE(f);
913 EXPECT_EQ(40000, f->query.newId);
914
915 // The map should now be full again.
916 EXPECT_EQ(size_t(UINT16_MAX + 1), map.getAll().size());
917 EXPECT_FALSE(map.recordQuery(makeSlice(QUERY)));
918}
919
Ben Schwartzded1b702017-10-25 14:41:02 -0400920} // end of namespace net
921} // end of namespace android