10 TEST_F(DefaultChannelTest, GetServers) {
11 std::vector<std::string> servers = GetNameServers(channel_);
13 for (const std::string& server : servers) {
14 std::cerr << "Nameserver: " << server << std::endl;
19 TEST_F(DefaultChannelTest, GetServersFailures) {
20 EXPECT_EQ(ARES_SUCCESS,
21 ares_set_servers_csv(channel_, "1.2.3.4,2.3.4.5"));
22 struct ares_addr_node* servers = nullptr;
24 EXPECT_EQ(ARES_ENOMEM, ares_get_servers(channel_, &servers));
26 EXPECT_EQ(ARES_ENOMEM, ares_get_servers(channel_, &servers));
27 EXPECT_EQ(ARES_ENODATA, ares_get_servers(nullptr, &servers));
30 TEST_F(DefaultChannelTest, SetServers) {
31 EXPECT_EQ(ARES_SUCCESS, ares_set_servers(channel_, nullptr));
32 std::vector<std::string> empty;
33 EXPECT_EQ(empty, GetNameServers(channel_));
35 struct ares_addr_node server1;
36 struct ares_addr_node server2;
37 server1.next = &server2;
38 server1.family = AF_INET;
39 server1.addr.addr4.s_addr = htonl(0x01020304);
40 server2.next = nullptr;
41 server2.family = AF_INET;
42 server2.addr.addr4.s_addr = htonl(0x02030405);
43 EXPECT_EQ(ARES_ENODATA, ares_set_servers(nullptr, &server1));
45 EXPECT_EQ(ARES_SUCCESS, ares_set_servers(channel_, &server1));
46 std::vector<std::string> expected = {"1.2.3.4", "2.3.4.5"};
47 EXPECT_EQ(expected, GetNameServers(channel_));
50 TEST_F(DefaultChannelTest, SetServersPorts) {
51 EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports(channel_, nullptr));
52 std::vector<std::string> empty;
53 EXPECT_EQ(empty, GetNameServers(channel_));
55 struct ares_addr_port_node server1;
56 struct ares_addr_port_node server2;
57 server1.next = &server2;
58 server1.family = AF_INET;
59 server1.addr.addr4.s_addr = htonl(0x01020304);
60 server1.udp_port = 111;
61 server1.tcp_port = 111;
62 server2.next = nullptr;
63 server2.family = AF_INET;
64 server2.addr.addr4.s_addr = htonl(0x02030405);
66 server2.tcp_port = 0;;
67 EXPECT_EQ(ARES_ENODATA, ares_set_servers_ports(nullptr, &server1));
69 EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports(channel_, &server1));
70 std::vector<std::string> expected = {"1.2.3.4:111", "2.3.4.5"};
71 EXPECT_EQ(expected, GetNameServers(channel_));
74 TEST_F(DefaultChannelTest, SetServersCSV) {
75 EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "1.2.3.4"));
76 EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "xyzzy,plugh"));
77 EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "256.1.2.3"));
78 EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "1.2.3.4.5"));
79 EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "1:2:3:4:5"));
81 EXPECT_EQ(ARES_SUCCESS,
82 ares_set_servers_csv(channel_, "1.2.3.4,0102:0304:0506:0708:0910:1112:1314:1516,2.3.4.5"));
83 std::vector<std::string> expected = {"1.2.3.4", "0102:0304:0506:0708:0910:1112:1314:1516", "2.3.4.5"};
84 EXPECT_EQ(expected, GetNameServers(channel_));
87 EXPECT_EQ(ARES_EBADSTR,
88 ares_set_servers_csv(channel_, "1.2.3.4 , 0102:0304:0506:0708:0910:1112:1314:1516, 2.3.4.5"));
91 EXPECT_EQ(ARES_SUCCESS,
92 ares_set_servers_csv(channel_, "1.2.3.4:54,[0102:0304:0506:0708:0910:1112:1314:1516]:80,2.3.4.5:55"));
93 EXPECT_EQ(expected, GetNameServers(channel_));
94 EXPECT_EQ(ARES_SUCCESS,
95 ares_set_servers_ports_csv(channel_, "1.2.3.4:54,[0102:0304:0506:0708:0910:1112:1314:1516]:80,2.3.4.5:55"));
96 std::vector<std::string> expected2 = {"1.2.3.4:54", "[0102:0304:0506:0708:0910:1112:1314:1516]:80", "2.3.4.5:55"};
97 EXPECT_EQ(expected2, GetNameServers(channel_));
99 // Should survive duplication
100 ares_channel channel2;
101 EXPECT_EQ(ARES_SUCCESS, ares_dup(&channel2, channel_));
102 EXPECT_EQ(expected2, GetNameServers(channel2));
103 ares_destroy(channel2);
105 // Allocation failure cases
106 for (int fail = 1; fail <= 5; fail++) {
108 EXPECT_EQ(ARES_ENOMEM,
109 ares_set_servers_csv(channel_, "1.2.3.4,0102:0304:0506:0708:0910:1112:1314:1516,2.3.4.5"));
113 EXPECT_EQ(ARES_SUCCESS, ares_set_servers_csv(channel_, ""));
114 std::vector<std::string> none;
115 EXPECT_EQ(none, GetNameServers(channel_));
117 EXPECT_EQ(ARES_EBADSTR, ares_set_servers_csv(channel_, "2.3.4.5,1.2.3.4:,3.4.5.6"));
118 EXPECT_EQ(ARES_EBADSTR, ares_set_servers_csv(channel_, "2.3.4.5,1.2.3.4:Z,3.4.5.6"));
121 TEST_F(DefaultChannelTest, TimeoutValue) {
122 struct timeval tinfo;
130 // No timers => get max back.
131 pt = ares_timeout(channel_, &tmax, &tinfo);
132 EXPECT_EQ(&tmax, pt);
133 EXPECT_EQ(0, pt->tv_sec);
134 EXPECT_EQ(10, pt->tv_usec);
136 pt = ares_timeout(channel_, nullptr, &tinfo);
137 EXPECT_EQ(nullptr, pt);
140 ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
142 // Now there's a timer running.
143 pt = ares_timeout(channel_, &tmax, &tinfo);
144 EXPECT_EQ(&tmax, pt);
145 EXPECT_EQ(0, pt->tv_sec);
146 EXPECT_EQ(10, pt->tv_usec);
149 pt = ares_timeout(channel_, &tmax, &tinfo);
150 EXPECT_EQ(&tinfo, pt);
152 pt = ares_timeout(channel_, nullptr, &tinfo);
153 EXPECT_EQ(&tinfo, pt);
158 TEST_F(LibraryTest, InetNtoP) {
160 addr.s_addr = htonl(0x01020304);
162 EXPECT_EQ(buffer, ares_inet_ntop(AF_INET, &addr, buffer, sizeof(buffer)));
163 EXPECT_EQ("1.2.3.4", std::string(buffer));
166 TEST_F(LibraryTest, Mkquery) {
169 ares_mkquery("example.com", ns_c_in, ns_t_a, 0x1234, 0, &p, &len);
170 std::vector<byte> data(p, p + len);
173 std::string actual = PacketToString(data);
175 pkt.set_qid(0x1234).add_question(new DNSQuestion("example.com", ns_t_a));
176 std::string expected = PacketToString(pkt.data());
177 EXPECT_EQ(expected, actual);
180 TEST_F(LibraryTest, CreateQuery) {
183 EXPECT_EQ(ARES_SUCCESS,
184 ares_create_query("exam\\@le.com", ns_c_in, ns_t_a, 0x1234, 0,
186 std::vector<byte> data(p, p + len);
189 std::string actual = PacketToString(data);
191 pkt.set_qid(0x1234).add_question(new DNSQuestion("exam@le.com", ns_t_a));
192 std::string expected = PacketToString(pkt.data());
193 EXPECT_EQ(expected, actual);
196 TEST_F(LibraryTest, CreateQueryTrailingEscapedDot) {
199 EXPECT_EQ(ARES_SUCCESS,
200 ares_create_query("example.com\\.", ns_c_in, ns_t_a, 0x1234, 0,
202 std::vector<byte> data(p, p + len);
205 std::string actual = PacketToString(data);
206 EXPECT_EQ("REQ QRY Q:{'example.com\\.' IN A}", actual);
209 TEST_F(LibraryTest, CreateQueryNameTooLong) {
212 EXPECT_EQ(ARES_EBADNAME,
214 "a1234567890123456789.b1234567890123456789.c1234567890123456789.d1234567890123456789."
215 "a1234567890123456789.b1234567890123456789.c1234567890123456789.d1234567890123456789."
216 "a1234567890123456789.b1234567890123456789.c1234567890123456789.d1234567890123456789."
217 "x1234567890123456789.y1234567890123456789.",
218 ns_c_in, ns_t_a, 0x1234, 0, &p, &len, 0));
221 TEST_F(LibraryTest, CreateQueryFailures) {
224 // RC1035 has a 255 byte limit on names.
225 std::string longname;
226 for (int ii = 0; ii < 17; ii++) {
227 longname += "fedcba9876543210";
230 EXPECT_EQ(ARES_EBADNAME,
231 ares_create_query(longname.c_str(), ns_c_in, ns_t_a, 0x1234, 0,
233 if (p) ares_free_string(p);
238 EXPECT_EQ(ARES_ENOMEM,
239 ares_create_query("example.com", ns_c_in, ns_t_a, 0x1234, 0,
241 if (p) ares_free_string(p);
243 // 63-char limit on a single label
244 std::string longlabel = "a.a123456789b123456789c123456789d123456789e123456789f123456789g123456789.org";
246 EXPECT_EQ(ARES_EBADNAME,
247 ares_create_query(longlabel.c_str(), ns_c_in, ns_t_a, 0x1234, 0,
249 if (p) ares_free_string(p);
251 // Empty non-terminal label
253 EXPECT_EQ(ARES_EBADNAME,
254 ares_create_query("example..com", ns_c_in, ns_t_a, 0x1234, 0,
256 if (p) ares_free_string(p);
259 TEST_F(LibraryTest, CreateQueryOnionDomain) {
262 EXPECT_EQ(ARES_ENOTFOUND,
263 ares_create_query("dontleak.onion", ns_c_in, ns_t_a, 0x1234, 0,
267 TEST_F(DefaultChannelTest, HostByNameOnionDomain) {
269 ares_gethostbyname(channel_, "dontleak.onion", AF_INET, HostCallback, &result);
270 EXPECT_TRUE(result.done_);
271 EXPECT_EQ(ARES_ENOTFOUND, result.status_);
274 TEST_F(DefaultChannelTest, HostByNameFileOnionDomain) {
276 EXPECT_EQ(ARES_ENOTFOUND,
277 ares_gethostbyname_file(channel_, "dontleak.onion", AF_INET, &h));
280 TEST_F(DefaultChannelTest, GetAddrinfoOnionDomain) {
281 AddrInfoResult result;
282 struct ares_addrinfo_hints hints = {};
283 hints.ai_family = AF_UNSPEC;
284 ares_getaddrinfo(channel_, "dontleak.onion", NULL, &hints, AddrInfoCallback, &result);
285 EXPECT_TRUE(result.done_);
286 EXPECT_EQ(ARES_ENOTFOUND, result.status_);
289 // Interesting question: should tacking on a search domain let the query
290 // through? It seems safer to reject it because "supersecret.onion.search"
291 // still leaks information about the query to malicious resolvers.
292 TEST_F(DefaultChannelTest, SearchOnionDomain) {
294 ares_search(channel_, "dontleak.onion", ns_c_in, ns_t_a,
295 SearchCallback, &result);
296 EXPECT_TRUE(result.done_);
297 EXPECT_EQ(ARES_ENOTFOUND, result.status_);
300 TEST_F(DefaultChannelTest, SendFailure) {
301 unsigned char buf[2];
303 ares_send(channel_, buf, sizeof(buf), SearchCallback, &result);
304 EXPECT_TRUE(result.done_);
305 EXPECT_EQ(ARES_EBADQUERY, result.status_);
308 std::string ExpandName(const std::vector<byte>& data, int offset,
310 char *name = nullptr;
311 int rc = ares_expand_name(data.data() + offset, data.data(), data.size(),
313 EXPECT_EQ(ARES_SUCCESS, rc);
315 if (rc == ARES_SUCCESS) {
320 ares_free_string(name);
324 TEST_F(LibraryTest, ExpandName) {
326 std::vector<byte> data1 = {1, 'a', 2, 'b', 'c', 3, 'd', 'e', 'f', 0};
327 EXPECT_EQ("a.bc.def", ExpandName(data1, 0, &enclen));
328 EXPECT_EQ(data1.size(), enclen);
330 std::vector<byte> data2 = {0};
331 EXPECT_EQ("", ExpandName(data2, 0, &enclen));
332 EXPECT_EQ(1, enclen);
334 // Complete name indirection
335 std::vector<byte> data3 = {0x12, 0x23,
338 EXPECT_EQ("def", ExpandName(data3, 2, &enclen));
339 EXPECT_EQ(5, enclen);
340 EXPECT_EQ("def", ExpandName(data3, 7, &enclen));
341 EXPECT_EQ(2, enclen);
343 // One label then indirection
344 std::vector<byte> data4 = {0x12, 0x23,
347 EXPECT_EQ("def", ExpandName(data4, 2, &enclen));
348 EXPECT_EQ(5, enclen);
349 EXPECT_EQ("a.def", ExpandName(data4, 7, &enclen));
350 EXPECT_EQ(4, enclen);
352 // Two labels then indirection
353 std::vector<byte> data5 = {0x12, 0x23,
355 1, 'a', 1, 'b', 0xC0, 2};
356 EXPECT_EQ("def", ExpandName(data5, 2, &enclen));
357 EXPECT_EQ(5, enclen);
358 EXPECT_EQ("a.b.def", ExpandName(data5, 7, &enclen));
359 EXPECT_EQ(6, enclen);
361 // Empty name, indirection to empty name
362 std::vector<byte> data6 = {0x12, 0x23,
365 EXPECT_EQ("", ExpandName(data6, 2, &enclen));
366 EXPECT_EQ(1, enclen);
367 EXPECT_EQ("", ExpandName(data6, 3, &enclen));
368 EXPECT_EQ(2, enclen);
371 TEST_F(LibraryTest, ExpandNameFailure) {
372 std::vector<byte> data1 = {0x03, 'c', 'o', 'm', 0x00};
373 char *name = nullptr;
376 EXPECT_EQ(ARES_ENOMEM,
377 ares_expand_name(data1.data(), data1.data(), data1.size(),
381 EXPECT_EQ(ARES_EBADNAME,
382 ares_expand_name(data1.data(), data1.data(), 0, &name, &enclen));
384 // Start beyond enclosing data
385 EXPECT_EQ(ARES_EBADNAME,
386 ares_expand_name(data1.data() + data1.size(), data1.data(), data1.size(),
389 // Length beyond size of enclosing data
390 std::vector<byte> data2a = {0x13, 'c', 'o', 'm', 0x00};
391 EXPECT_EQ(ARES_EBADNAME,
392 ares_expand_name(data2a.data(), data2a.data(), data2a.size(),
394 std::vector<byte> data2b = {0x1};
395 EXPECT_EQ(ARES_EBADNAME,
396 ares_expand_name(data2b.data(), data2b.data(), data2b.size(),
398 std::vector<byte> data2c = {0xC0};
399 EXPECT_EQ(ARES_EBADNAME,
400 ares_expand_name(data2c.data(), data2c.data(), data2c.size(),
403 // Indirection beyond enclosing data
404 std::vector<byte> data3a = {0xC0, 0x02};
405 EXPECT_EQ(ARES_EBADNAME,
406 ares_expand_name(data3a.data(), data3a.data(), data3a.size(),
408 std::vector<byte> data3b = {0xC0, 0x0A, 'c', 'o', 'm', 0x00};
409 EXPECT_EQ(ARES_EBADNAME,
410 ares_expand_name(data3b.data(), data3b.data(), data3b.size(),
413 // Invalid top bits in label length
414 std::vector<byte> data4 = {0x03, 'c', 'o', 'm', 0x00, 0x80, 0x00};
415 EXPECT_EQ(ARES_EBADNAME,
416 ares_expand_name(data4.data() + 5, data4.data(), data4.size(),
419 // Label too long: 64-byte label, with invalid top 2 bits of length (01).
420 std::vector<byte> data5 = {0x40,
421 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
422 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
423 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
424 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
426 EXPECT_EQ(ARES_EBADNAME,
427 ares_expand_name(data5.data(), data5.data(), data5.size(),
428 &name, &enclen)) << name;
430 // Incomplete indirect length
431 std::vector<byte> data6 = {0x03, 'c', 'o', 'm', 0x00, 0xC0};
432 EXPECT_EQ(ARES_EBADNAME,
433 ares_expand_name(data6.data() + 5, data6.data(), data6.size(),
437 std::vector<byte> data7 = {0xC0, 0x02, 0xC0, 0x00};
438 EXPECT_EQ(ARES_EBADNAME,
439 ares_expand_name(data7.data(), data7.data(), data7.size(),
441 std::vector<byte> data8 = {3, 'd', 'e', 'f', 0xC0, 0x08, 0x00, 0x00,
442 3, 'a', 'b', 'c', 0xC0, 0x00};
443 EXPECT_EQ(ARES_EBADNAME,
444 ares_expand_name(data8.data(), data8.data(), data8.size(),
446 std::vector<byte> data9 = {0x12, 0x23, // start 2 bytes in
447 3, 'd', 'e', 'f', 0xC0, 0x02};
448 EXPECT_EQ(ARES_EBADNAME,
449 ares_expand_name(data9.data() + 2, data9.data(), data9.size(),
453 TEST_F(LibraryTest, CreateEDNSQuery) {
456 EXPECT_EQ(ARES_SUCCESS,
457 ares_create_query("example.com", ns_c_in, ns_t_a, 0x1234, 0,
459 std::vector<byte> data(p, p + len);
462 std::string actual = PacketToString(data);
464 pkt.set_qid(0x1234).add_question(new DNSQuestion("example.com", ns_t_a))
465 .add_additional(new DNSOptRR(0, 1280));
466 std::string expected = PacketToString(pkt.data());
467 EXPECT_EQ(expected, actual);
470 TEST_F(LibraryTest, CreateRootQuery) {
473 ares_create_query(".", ns_c_in, ns_t_a, 0x1234, 0, &p, &len, 0);
474 std::vector<byte> data(p, p + len);
477 std::string actual = PacketToString(data);
479 pkt.set_qid(0x1234).add_question(new DNSQuestion("", ns_t_a));
480 std::string expected = PacketToString(pkt.data());
481 EXPECT_EQ(expected, actual);
484 TEST_F(LibraryTest, Version) {
485 // Assume linked to same version
486 EXPECT_EQ(std::string(ARES_VERSION_STR),
487 std::string(ares_version(nullptr)));
489 ares_version(&version);
490 EXPECT_EQ(ARES_VERSION, version);
493 TEST_F(LibraryTest, Strerror) {
494 EXPECT_EQ("Successful completion",
495 std::string(ares_strerror(ARES_SUCCESS)));
496 EXPECT_EQ("DNS query cancelled",
497 std::string(ares_strerror(ARES_ECANCELLED)));
499 std::string(ares_strerror(99)));
502 TEST_F(LibraryTest, ExpandString) {
503 std::vector<byte> s1 = { 3, 'a', 'b', 'c'};
504 char* result = nullptr;
506 EXPECT_EQ(ARES_SUCCESS,
507 ares_expand_string(s1.data(), s1.data(), s1.size(),
508 (unsigned char**)&result, &len));
509 EXPECT_EQ("abc", std::string(result));
510 EXPECT_EQ(1 + 3, len); // amount of data consumed includes 1 byte len
511 ares_free_string(result);
513 EXPECT_EQ(ARES_EBADSTR,
514 ares_expand_string(s1.data() + 1, s1.data(), s1.size(),
515 (unsigned char**)&result, &len));
516 EXPECT_EQ(ARES_EBADSTR,
517 ares_expand_string(s1.data() + 4, s1.data(), s1.size(),
518 (unsigned char**)&result, &len));
519 SetAllocSizeFail(3 + 1);
520 EXPECT_EQ(ARES_ENOMEM,
521 ares_expand_string(s1.data(), s1.data(), s1.size(),
522 (unsigned char**)&result, &len));