blob: a77e6ec9593729be414bae341c20a9aac41774d0 [file] [log] [blame]
Luke Huang403c0442019-02-25 15:33:42 +08001/*
2 * Copyright 2019 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.
Luke Huang403c0442019-02-25 15:33:42 +080015 */
16
Luke Huang9b80e6c2019-04-09 17:54:09 +080017#ifdef NDEBUG
18#undef NDEBUG
19#endif
20
Bernie Innocentibb74c582019-05-20 16:34:16 +090021#include <netdb.h>
Luke Huang403c0442019-02-25 15:33:42 +080022
Bernie Innocentibb74c582019-05-20 16:34:16 +090023#include <iostream>
24#include <vector>
Luke Huang7b26b202019-03-28 14:09:24 +080025
Luke Huang403c0442019-02-25 15:33:42 +080026#include <android-base/strings.h>
27#include <android/net/IDnsResolver.h>
Hungming Chena32c8c12019-01-25 10:47:40 +080028#include <binder/IPCThreadState.h>
Luke Huang403c0442019-02-25 15:33:42 +080029#include <binder/IServiceManager.h>
Luke Huang7b26b202019-03-28 14:09:24 +080030#include <gmock/gmock-matchers.h>
Luke Huang403c0442019-02-25 15:33:42 +080031#include <gtest/gtest.h>
Luke Huang579ddc72019-06-14 00:59:39 +080032#include <netdutils/NetworkConstants.h> // SHA256_SIZE
Mike Yu40ea2ad2019-03-13 17:15:48 +080033#include <netdutils/Stopwatch.h>
Bernie Innocentibb74c582019-05-20 16:34:16 +090034#include <openssl/base64.h>
Hungming Chene8f970c2019-04-10 17:34:06 +080035
36#include "tests/dns_metrics_listener/base_metrics_listener.h"
37#include "tests/dns_metrics_listener/test_metrics.h"
Luke Huang403c0442019-02-25 15:33:42 +080038
Luke Huang7b26b202019-03-28 14:09:24 +080039#include "ResolverStats.h"
Hungming Chena32c8c12019-01-25 10:47:40 +080040#include "dns_responder.h"
41#include "dns_responder_client.h"
Luke Huang403c0442019-02-25 15:33:42 +080042
Luke Huang7b26b202019-03-28 14:09:24 +080043namespace binder = android::binder;
44
Luke Huang403c0442019-02-25 15:33:42 +080045using android::IBinder;
46using android::IServiceManager;
Hungming Chena32c8c12019-01-25 10:47:40 +080047using android::ProcessState;
Luke Huang403c0442019-02-25 15:33:42 +080048using android::sp;
49using android::String16;
Luke Huang7b26b202019-03-28 14:09:24 +080050using android::String8;
Luke Huang403c0442019-02-25 15:33:42 +080051using android::net::IDnsResolver;
waynema37255182019-03-18 13:22:56 +080052using android::net::ResolverParamsParcel;
Luke Huang7b26b202019-03-28 14:09:24 +080053using android::net::ResolverStats;
Hungming Chena32c8c12019-01-25 10:47:40 +080054using android::net::metrics::INetdEventListener;
55using android::net::metrics::TestOnDnsEvent;
Mike Yu40ea2ad2019-03-13 17:15:48 +080056using android::netdutils::Stopwatch;
Hungming Chena32c8c12019-01-25 10:47:40 +080057
58// TODO: make this dynamic and stop depending on implementation details.
59// Sync from TEST_NETID in dns_responder_client.cpp as resolver_test.cpp does.
Luke Huang9b80e6c2019-04-09 17:54:09 +080060constexpr int TEST_NETID = 30;
Luke Huang403c0442019-02-25 15:33:42 +080061
62class DnsResolverBinderTest : public ::testing::Test {
63 public:
64 DnsResolverBinderTest() {
65 sp<IServiceManager> sm = android::defaultServiceManager();
66 sp<IBinder> binder = sm->getService(String16("dnsresolver"));
67 if (binder != nullptr) {
68 mDnsResolver = android::interface_cast<IDnsResolver>(binder);
69 }
Bernie Innocenti45d9baa2019-06-19 16:28:05 +090070 // This could happen when the test isn't running as root, or if netd isn't running.
Luke Huang9b80e6c2019-04-09 17:54:09 +080071 assert(nullptr != mDnsResolver.get());
72 // Create cache for test
73 mDnsResolver->createNetworkCache(TEST_NETID);
Luke Huang403c0442019-02-25 15:33:42 +080074 }
75
Luke Huang9b80e6c2019-04-09 17:54:09 +080076 ~DnsResolverBinderTest() {
77 // Destroy cache for test
78 mDnsResolver->destroyNetworkCache(TEST_NETID);
79 }
Luke Huang403c0442019-02-25 15:33:42 +080080
81 protected:
82 sp<IDnsResolver> mDnsResolver;
83};
84
85class TimedOperation : public Stopwatch {
86 public:
87 explicit TimedOperation(const std::string& name) : mName(name) {}
Bernie Innocentibb74c582019-05-20 16:34:16 +090088 virtual ~TimedOperation() {
89 std::cerr << " " << mName << ": " << timeTakenUs() << "us" << std::endl;
90 }
Luke Huang403c0442019-02-25 15:33:42 +080091
92 private:
93 std::string mName;
94};
95
Luke Huang7b26b202019-03-28 14:09:24 +080096namespace {
97
98std::string base64Encode(const std::vector<uint8_t>& input) {
99 size_t out_len;
100 EXPECT_EQ(1, EVP_EncodedLength(&out_len, input.size()));
101 // out_len includes the trailing NULL.
102 uint8_t output_bytes[out_len];
103 EXPECT_EQ(out_len - 1, EVP_EncodeBlock(output_bytes, input.data(), input.size()));
104 return std::string(reinterpret_cast<char*>(output_bytes));
waynema37255182019-03-18 13:22:56 +0800105}
106
107// TODO: Convert tests to ResolverParamsParcel and delete this stub.
108ResolverParamsParcel makeResolverParamsParcel(int netId, const std::vector<int>& params,
109 const std::vector<std::string>& servers,
110 const std::vector<std::string>& domains,
111 const std::string& tlsHostname,
112 const std::vector<std::string>& tlsServers,
113 const std::vector<std::string>& tlsFingerprints) {
114 using android::net::IDnsResolver;
115 ResolverParamsParcel paramsParcel;
116
117 paramsParcel.netId = netId;
118 paramsParcel.sampleValiditySeconds = params[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY];
119 paramsParcel.successThreshold = params[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD];
120 paramsParcel.minSamples = params[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES];
121 paramsParcel.maxSamples = params[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES];
122 if (params.size() > IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC) {
123 paramsParcel.baseTimeoutMsec = params[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC];
124 } else {
125 paramsParcel.baseTimeoutMsec = 0;
126 }
127 if (params.size() > IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT) {
128 paramsParcel.retryCount = params[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT];
129 } else {
130 paramsParcel.retryCount = 0;
131 }
132 paramsParcel.servers = servers;
133 paramsParcel.domains = domains;
134 paramsParcel.tlsName = tlsHostname;
135 paramsParcel.tlsServers = tlsServers;
136 paramsParcel.tlsFingerprints = tlsFingerprints;
137
138 return paramsParcel;
139}
Luke Huang7b26b202019-03-28 14:09:24 +0800140
141} // namespace
142
Luke Huang403c0442019-02-25 15:33:42 +0800143TEST_F(DnsResolverBinderTest, IsAlive) {
144 TimedOperation t("isAlive RPC");
145 bool isAlive = false;
146 mDnsResolver->isAlive(&isAlive);
147 ASSERT_TRUE(isAlive);
Hungming Chena32c8c12019-01-25 10:47:40 +0800148}
149
Hungming Chen01dcb412019-05-31 17:46:49 +0800150TEST_F(DnsResolverBinderTest, RegisterEventListener_NullListener) {
151 android::binder::Status status = mDnsResolver->registerEventListener(
152 android::interface_cast<INetdEventListener>(nullptr));
153 ASSERT_FALSE(status.isOk());
154 ASSERT_EQ(EINVAL, status.serviceSpecificErrorCode());
155}
156
157TEST_F(DnsResolverBinderTest, RegisterEventListener_DuplicateSubscription) {
Hungming Chene8f970c2019-04-10 17:34:06 +0800158 class DummyListener : public android::net::metrics::BaseMetricsListener {};
Hungming Chen01dcb412019-05-31 17:46:49 +0800159
160 // Expect to subscribe successfully.
161 android::sp<DummyListener> dummyListener = new DummyListener();
162 android::binder::Status status = mDnsResolver->registerEventListener(
163 android::interface_cast<INetdEventListener>(dummyListener));
164 ASSERT_TRUE(status.isOk()) << status.exceptionMessage();
165
166 // Expect to subscribe failed with registered listener instance.
167 status = mDnsResolver->registerEventListener(
168 android::interface_cast<INetdEventListener>(dummyListener));
169 ASSERT_FALSE(status.isOk());
170 ASSERT_EQ(EEXIST, status.serviceSpecificErrorCode());
171}
172
Luke Huang9b80e6c2019-04-09 17:54:09 +0800173// TODO: Move this test to resolver_test.cpp
Hungming Chen01dcb412019-05-31 17:46:49 +0800174TEST_F(DnsResolverBinderTest, RegisterEventListener_onDnsEvent) {
Hungming Chena32c8c12019-01-25 10:47:40 +0800175 // The test configs are used to trigger expected events. The expected results are defined in
176 // expectedResults.
177 static const struct TestConfig {
178 std::string hostname;
179 int returnCode;
180 } testConfigs[] = {
181 {"hi", 0 /*success*/},
182 {"nonexistent", EAI_NODATA},
183 };
184
185 // The expected results define expected event content for test verification.
186 static const std::vector<TestOnDnsEvent::TestResult> expectedResults = {
187 {TEST_NETID, INetdEventListener::EVENT_GETADDRINFO, 0 /*success*/, 1, "hi", "1.2.3.4"},
188 {TEST_NETID, INetdEventListener::EVENT_GETADDRINFO, EAI_NODATA, 0, "nonexistent", ""},
189 };
190
191 // Start the Binder thread pool.
192 // TODO: Consider doing this once if there has another event listener unit test.
193 android::ProcessState::self()->startThreadPool();
194
195 // Setup network.
196 // TODO: Setup device configuration and DNS responser server as resolver test does.
197 // Currently, leave DNS related configuration in this test because only it needs DNS
198 // client-server testing environment.
199 DnsResponderClient dnsClient;
200 dnsClient.SetUp();
201
202 // Setup DNS responder server.
203 constexpr char listen_addr[] = "127.0.0.3";
204 constexpr char listen_srv[] = "53";
Mike Yufc125e42019-05-15 20:41:28 +0800205 test::DNSResponder dns(listen_addr, listen_srv, ns_rcode::ns_r_servfail);
Hungming Chena32c8c12019-01-25 10:47:40 +0800206 dns.addMapping("hi.example.com.", ns_type::ns_t_a, "1.2.3.4");
207 ASSERT_TRUE(dns.startServer());
208
209 // Setup DNS configuration.
210 const std::vector<std::string> test_servers = {listen_addr};
211 std::vector<std::string> test_domains = {"example.com"};
212 std::vector<int> test_params = {300 /*sample_validity*/, 25 /*success_threshold*/,
213 8 /*min_samples*/, 8 /*max_samples*/};
Luke Huang9b80e6c2019-04-09 17:54:09 +0800214
Hungming Chena32c8c12019-01-25 10:47:40 +0800215 ASSERT_TRUE(dnsClient.SetResolversForNetwork(test_servers, test_domains, test_params));
216 dns.clearQueries();
217
218 // Register event listener.
Hungming Chenfbfa1ce2019-03-26 17:46:46 +0800219 android::sp<TestOnDnsEvent> testOnDnsEvent = new TestOnDnsEvent(expectedResults);
Hungming Chena32c8c12019-01-25 10:47:40 +0800220 android::binder::Status status = mDnsResolver->registerEventListener(
221 android::interface_cast<INetdEventListener>(testOnDnsEvent));
222 ASSERT_TRUE(status.isOk()) << status.exceptionMessage();
223
224 // DNS queries.
Hungming Chenfbfa1ce2019-03-26 17:46:46 +0800225 // Once all expected events of expectedResults are received by the listener, the unit test will
226 // be notified. Otherwise, notified with a timeout expired failure.
Hungming Chena32c8c12019-01-25 10:47:40 +0800227 auto& cv = testOnDnsEvent->getCv();
228 auto& cvMutex = testOnDnsEvent->getCvMutex();
229 {
230 std::unique_lock lock(cvMutex);
231
232 for (const auto& config : testConfigs) {
233 SCOPED_TRACE(config.hostname);
234
235 addrinfo* result = nullptr;
236 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
237 int status = getaddrinfo(config.hostname.c_str(), nullptr, &hints, &result);
238 EXPECT_EQ(config.returnCode, status);
239
240 if (result) freeaddrinfo(result);
241 }
242
243 // Wait for receiving expected events.
244 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lock, std::chrono::seconds(2)));
245 }
246
247 // Verify that all testcases are passed.
248 EXPECT_TRUE(testOnDnsEvent->isVerified());
249
250 dnsClient.TearDown();
Luke Huang7b26b202019-03-28 14:09:24 +0800251}
252
253TEST_F(DnsResolverBinderTest, SetResolverConfiguration_Tls) {
254 const std::vector<std::string> LOCALLY_ASSIGNED_DNS{"8.8.8.8", "2001:4860:4860::8888"};
Luke Huang579ddc72019-06-14 00:59:39 +0800255 std::vector<uint8_t> fp(android::netdutils::SHA256_SIZE);
Luke Huang7b26b202019-03-28 14:09:24 +0800256 std::vector<uint8_t> short_fp(1);
Luke Huang579ddc72019-06-14 00:59:39 +0800257 std::vector<uint8_t> long_fp(android::netdutils::SHA256_SIZE + 1);
Luke Huang7b26b202019-03-28 14:09:24 +0800258 std::vector<std::string> test_domains;
259 std::vector<int> test_params = {300, 25, 8, 8};
Luke Huang7b26b202019-03-28 14:09:24 +0800260 static const struct TestData {
261 const std::vector<std::string> servers;
262 const std::string tlsName;
263 const std::vector<std::vector<uint8_t>> tlsFingerprints;
264 const int expectedReturnCode;
265 } kTlsTestData[] = {
266 {{"192.0.2.1"}, "", {}, 0},
267 {{"2001:db8::2"}, "host.name", {}, 0},
268 {{"192.0.2.3"}, "@@@@", {fp}, 0},
269 {{"2001:db8::4"}, "", {fp}, 0},
270 {{}, "", {}, 0},
271 {{""}, "", {}, EINVAL},
272 {{"192.0.*.5"}, "", {}, EINVAL},
273 {{"2001:dg8::6"}, "", {}, EINVAL},
274 {{"2001:db8::c"}, "", {short_fp}, EINVAL},
275 {{"192.0.2.12"}, "", {long_fp}, EINVAL},
276 {{"2001:db8::e"}, "", {fp, fp, fp}, 0},
277 {{"192.0.2.14"}, "", {fp, short_fp}, EINVAL},
278 };
279
280 for (size_t i = 0; i < std::size(kTlsTestData); i++) {
281 const auto& td = kTlsTestData[i];
282
283 std::vector<std::string> fingerprints;
284 for (const auto& fingerprint : td.tlsFingerprints) {
285 fingerprints.push_back(base64Encode(fingerprint));
286 }
waynema37255182019-03-18 13:22:56 +0800287 const auto resolverParams =
288 makeResolverParamsParcel(TEST_NETID, test_params, LOCALLY_ASSIGNED_DNS,
289 test_domains, td.tlsName, td.servers, fingerprints);
290 binder::Status status = mDnsResolver->setResolverConfiguration(resolverParams);
Luke Huang7b26b202019-03-28 14:09:24 +0800291
292 if (td.expectedReturnCode == 0) {
293 SCOPED_TRACE(String8::format("test case %zu should have passed", i));
294 SCOPED_TRACE(status.toString8());
295 EXPECT_EQ(0, status.exceptionCode());
296 } else {
297 SCOPED_TRACE(String8::format("test case %zu should have failed", i));
298 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
299 EXPECT_EQ(td.expectedReturnCode, status.serviceSpecificErrorCode());
300 }
301 }
Luke Huang7b26b202019-03-28 14:09:24 +0800302}
303
304TEST_F(DnsResolverBinderTest, GetResolverInfo) {
305 std::vector<std::string> servers = {"127.0.0.1", "127.0.0.2"};
306 std::vector<std::string> domains = {"example.com"};
307 std::vector<int> testParams = {
308 300, // sample validity in seconds
309 25, // success threshod in percent
310 8, 8, // {MIN,MAX}_SAMPLES
311 100, // BASE_TIMEOUT_MSEC
Mike Yuf7da78c2019-04-09 15:40:26 +0800312 3, // retry count
Luke Huang7b26b202019-03-28 14:09:24 +0800313 };
waynema37255182019-03-18 13:22:56 +0800314 const auto resolverParams =
315 makeResolverParamsParcel(TEST_NETID, testParams, servers, domains, "", {}, {});
316 binder::Status status = mDnsResolver->setResolverConfiguration(resolverParams);
Luke Huang7b26b202019-03-28 14:09:24 +0800317 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
318
319 std::vector<std::string> res_servers;
320 std::vector<std::string> res_domains;
321 std::vector<std::string> res_tls_servers;
322 std::vector<int32_t> params32;
323 std::vector<int32_t> stats32;
324 std::vector<int32_t> wait_for_pending_req_timeout_count32{0};
325 status = mDnsResolver->getResolverInfo(TEST_NETID, &res_servers, &res_domains, &res_tls_servers,
326 &params32, &stats32,
327 &wait_for_pending_req_timeout_count32);
328
329 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
330 EXPECT_EQ(servers.size(), res_servers.size());
331 EXPECT_EQ(domains.size(), res_domains.size());
332 EXPECT_EQ(0U, res_tls_servers.size());
333 ASSERT_EQ(static_cast<size_t>(IDnsResolver::RESOLVER_PARAMS_COUNT), testParams.size());
334 EXPECT_EQ(testParams[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY],
335 params32[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY]);
336 EXPECT_EQ(testParams[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
337 params32[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD]);
338 EXPECT_EQ(testParams[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES],
339 params32[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES]);
340 EXPECT_EQ(testParams[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES],
341 params32[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES]);
342 EXPECT_EQ(testParams[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
343 params32[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC]);
Mike Yuf7da78c2019-04-09 15:40:26 +0800344 EXPECT_EQ(testParams[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT],
345 params32[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT]);
Luke Huang7b26b202019-03-28 14:09:24 +0800346
347 std::vector<ResolverStats> stats;
348 ResolverStats::decodeAll(stats32, &stats);
349
350 EXPECT_EQ(servers.size(), stats.size());
351
352 EXPECT_THAT(res_servers, testing::UnorderedElementsAreArray(servers));
353 EXPECT_THAT(res_domains, testing::UnorderedElementsAreArray(domains));
Luke Huang9b80e6c2019-04-09 17:54:09 +0800354}
Mike Yu72e359d2019-04-09 15:12:48 +0800355
Luke Huang9b80e6c2019-04-09 17:54:09 +0800356TEST_F(DnsResolverBinderTest, CreateDestroyNetworkCache) {
357 // Must not be the same as TEST_NETID
358 const int ANOTHER_TEST_NETID = TEST_NETID + 1;
359
360 // Create a new network cache.
361 EXPECT_TRUE(mDnsResolver->createNetworkCache(ANOTHER_TEST_NETID).isOk());
362
363 // create it again, expect a EEXIST.
364 EXPECT_EQ(EEXIST,
365 mDnsResolver->createNetworkCache(ANOTHER_TEST_NETID).serviceSpecificErrorCode());
366
367 // destroy it.
368 EXPECT_TRUE(mDnsResolver->destroyNetworkCache(ANOTHER_TEST_NETID).isOk());
369
370 // re-create it
371 EXPECT_TRUE(mDnsResolver->createNetworkCache(ANOTHER_TEST_NETID).isOk());
372
373 // destroy it.
374 EXPECT_TRUE(mDnsResolver->destroyNetworkCache(ANOTHER_TEST_NETID).isOk());
375
376 // re-destroy it
377 EXPECT_TRUE(mDnsResolver->destroyNetworkCache(ANOTHER_TEST_NETID).isOk());
Mike Yu40ea2ad2019-03-13 17:15:48 +0800378}
Ken Chend99022c2019-02-20 21:34:14 +0800379
380TEST_F(DnsResolverBinderTest, setLogSeverity) {
381 // Expect fail
382 EXPECT_EQ(EINVAL, mDnsResolver->setLogSeverity(-1).serviceSpecificErrorCode());
383
384 // Test set different log level
385 EXPECT_TRUE(mDnsResolver->setLogSeverity(IDnsResolver::DNS_RESOLVER_LOG_VERBOSE).isOk());
386
387 EXPECT_TRUE(mDnsResolver->setLogSeverity(IDnsResolver::DNS_RESOLVER_LOG_DEBUG).isOk());
388
389 EXPECT_TRUE(mDnsResolver->setLogSeverity(IDnsResolver::DNS_RESOLVER_LOG_INFO).isOk());
390
391 EXPECT_TRUE(mDnsResolver->setLogSeverity(IDnsResolver::DNS_RESOLVER_LOG_WARNING).isOk());
392
393 EXPECT_TRUE(mDnsResolver->setLogSeverity(IDnsResolver::DNS_RESOLVER_LOG_ERROR).isOk());
394
395 // Set back to default
396 EXPECT_TRUE(mDnsResolver->setLogSeverity(IDnsResolver::DNS_RESOLVER_LOG_WARNING).isOk());
397}