blob: 5e5bc0bb0d9ade790a31e68aad51d10fef5b22d4 [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001#include "ares-test.h"
2#include "dns-proto.h"
3
4#include <string>
5#include <vector>
6
7namespace ares {
8namespace test {
9
10TEST_F(DefaultChannelTest, GetServers) {
11 std::vector<std::string> servers = GetNameServers(channel_);
12 if (verbose) {
13 for (const std::string& server : servers) {
14 std::cerr << "Nameserver: " << server << std::endl;
15 }
16 }
17}
18
19TEST_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;
23 SetAllocFail(1);
24 EXPECT_EQ(ARES_ENOMEM, ares_get_servers(channel_, &servers));
25 SetAllocFail(2);
26 EXPECT_EQ(ARES_ENOMEM, ares_get_servers(channel_, &servers));
27 EXPECT_EQ(ARES_ENODATA, ares_get_servers(nullptr, &servers));
28}
29
30TEST_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_));
34
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));
44
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_));
48}
49
50TEST_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_));
54
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);
65 server2.udp_port = 0;
66 server2.tcp_port = 0;;
67 EXPECT_EQ(ARES_ENODATA, ares_set_servers_ports(nullptr, &server1));
68
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_));
72}
73
74TEST_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"));
80
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_));
85
86 // Same, with spaces
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"));
89
90 // Same, with ports
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_));
98
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);
104
105 // Allocation failure cases
106 for (int fail = 1; fail <= 5; fail++) {
107 SetAllocFail(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"));
110 }
111
112 // Blank servers
113 EXPECT_EQ(ARES_SUCCESS, ares_set_servers_csv(channel_, ""));
114 std::vector<std::string> none;
115 EXPECT_EQ(none, GetNameServers(channel_));
116
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"));
119}
120
121TEST_F(DefaultChannelTest, TimeoutValue) {
122 struct timeval tinfo;
123 tinfo.tv_sec = 0;
124 tinfo.tv_usec = 0;
125 struct timeval tmax;
126 tmax.tv_sec = 0;
127 tmax.tv_usec = 10;
128 struct timeval* pt;
129
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);
135
136 pt = ares_timeout(channel_, nullptr, &tinfo);
137 EXPECT_EQ(nullptr, pt);
138
139 HostResult result;
140 ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
141
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);
147
148 tmax.tv_sec = 100;
149 pt = ares_timeout(channel_, &tmax, &tinfo);
150 EXPECT_EQ(&tinfo, pt);
151
152 pt = ares_timeout(channel_, nullptr, &tinfo);
153 EXPECT_EQ(&tinfo, pt);
154
155 Process();
156}
157
158TEST_F(LibraryTest, InetNtoP) {
159 struct in_addr addr;
160 addr.s_addr = htonl(0x01020304);
161 char buffer[256];
162 EXPECT_EQ(buffer, ares_inet_ntop(AF_INET, &addr, buffer, sizeof(buffer)));
163 EXPECT_EQ("1.2.3.4", std::string(buffer));
164}
165
166TEST_F(LibraryTest, Mkquery) {
167 byte* p;
168 int len;
169 ares_mkquery("example.com", ns_c_in, ns_t_a, 0x1234, 0, &p, &len);
170 std::vector<byte> data(p, p + len);
171 ares_free_string(p);
172
173 std::string actual = PacketToString(data);
174 DNSPacket pkt;
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);
178}
179
180TEST_F(LibraryTest, CreateQuery) {
181 byte* p;
182 int len;
183 EXPECT_EQ(ARES_SUCCESS,
184 ares_create_query("exam\\@le.com", ns_c_in, ns_t_a, 0x1234, 0,
185 &p, &len, 0));
186 std::vector<byte> data(p, p + len);
187 ares_free_string(p);
188
189 std::string actual = PacketToString(data);
190 DNSPacket pkt;
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);
194}
195
196TEST_F(LibraryTest, CreateQueryTrailingEscapedDot) {
197 byte* p;
198 int len;
199 EXPECT_EQ(ARES_SUCCESS,
200 ares_create_query("example.com\\.", ns_c_in, ns_t_a, 0x1234, 0,
201 &p, &len, 0));
202 std::vector<byte> data(p, p + len);
203 ares_free_string(p);
204
205 std::string actual = PacketToString(data);
206 EXPECT_EQ("REQ QRY Q:{'example.com\\.' IN A}", actual);
207}
208
209TEST_F(LibraryTest, CreateQueryFailures) {
210 byte* p;
211 int len;
212 // RC1035 has a 255 byte limit on names.
213 std::string longname;
214 for (int ii = 0; ii < 17; ii++) {
215 longname += "fedcba9876543210";
216 }
217 p = nullptr;
218 EXPECT_EQ(ARES_EBADNAME,
219 ares_create_query(longname.c_str(), ns_c_in, ns_t_a, 0x1234, 0,
220 &p, &len, 0));
221 if (p) ares_free_string(p);
222
223 SetAllocFail(1);
224
225 p = nullptr;
226 EXPECT_EQ(ARES_ENOMEM,
227 ares_create_query("example.com", ns_c_in, ns_t_a, 0x1234, 0,
228 &p, &len, 0));
229 if (p) ares_free_string(p);
230
231 // 63-char limit on a single label
232 std::string longlabel = "a.a123456789b123456789c123456789d123456789e123456789f123456789g123456789.org";
233 p = nullptr;
234 EXPECT_EQ(ARES_EBADNAME,
235 ares_create_query(longlabel.c_str(), ns_c_in, ns_t_a, 0x1234, 0,
236 &p, &len, 0));
237 if (p) ares_free_string(p);
238
239 // Empty non-terminal label
240 p = nullptr;
241 EXPECT_EQ(ARES_EBADNAME,
242 ares_create_query("example..com", ns_c_in, ns_t_a, 0x1234, 0,
243 &p, &len, 0));
244 if (p) ares_free_string(p);
245}
246
247TEST_F(DefaultChannelTest, SendFailure) {
248 unsigned char buf[2];
249 SearchResult result;
250 ares_send(channel_, buf, sizeof(buf), SearchCallback, &result);
251 EXPECT_TRUE(result.done_);
252 EXPECT_EQ(ARES_EBADQUERY, result.status_);
253}
254
255std::string ExpandName(const std::vector<byte>& data, int offset,
256 long *enclen) {
257 char *name = nullptr;
258 int rc = ares_expand_name(data.data() + offset, data.data(), data.size(),
259 &name, enclen);
260 EXPECT_EQ(ARES_SUCCESS, rc);
261 std::string result;
262 if (rc == ARES_SUCCESS) {
263 result = name;
264 } else {
265 result = "<error>";
266 }
267 free(name);
268 return result;
269}
270
271TEST_F(LibraryTest, ExpandName) {
272 long enclen;
273 std::vector<byte> data1 = {1, 'a', 2, 'b', 'c', 3, 'd', 'e', 'f', 0};
274 EXPECT_EQ("a.bc.def", ExpandName(data1, 0, &enclen));
275 EXPECT_EQ(data1.size(), enclen);
276
277 std::vector<byte> data2 = {0};
278 EXPECT_EQ("", ExpandName(data2, 0, &enclen));
279 EXPECT_EQ(1, enclen);
280
281 // Complete name indirection
282 std::vector<byte> data3 = {0x12, 0x23,
283 3, 'd', 'e', 'f', 0,
284 0xC0, 2};
285 EXPECT_EQ("def", ExpandName(data3, 2, &enclen));
286 EXPECT_EQ(5, enclen);
287 EXPECT_EQ("def", ExpandName(data3, 7, &enclen));
288 EXPECT_EQ(2, enclen);
289
290 // One label then indirection
291 std::vector<byte> data4 = {0x12, 0x23,
292 3, 'd', 'e', 'f', 0,
293 1, 'a', 0xC0, 2};
294 EXPECT_EQ("def", ExpandName(data4, 2, &enclen));
295 EXPECT_EQ(5, enclen);
296 EXPECT_EQ("a.def", ExpandName(data4, 7, &enclen));
297 EXPECT_EQ(4, enclen);
298
299 // Two labels then indirection
300 std::vector<byte> data5 = {0x12, 0x23,
301 3, 'd', 'e', 'f', 0,
302 1, 'a', 1, 'b', 0xC0, 2};
303 EXPECT_EQ("def", ExpandName(data5, 2, &enclen));
304 EXPECT_EQ(5, enclen);
305 EXPECT_EQ("a.b.def", ExpandName(data5, 7, &enclen));
306 EXPECT_EQ(6, enclen);
307
308 // Empty name, indirection to empty name
309 std::vector<byte> data6 = {0x12, 0x23,
310 0,
311 0xC0, 2};
312 EXPECT_EQ("", ExpandName(data6, 2, &enclen));
313 EXPECT_EQ(1, enclen);
314 EXPECT_EQ("", ExpandName(data6, 3, &enclen));
315 EXPECT_EQ(2, enclen);
316}
317
318TEST_F(LibraryTest, ExpandNameFailure) {
319 std::vector<byte> data1 = {0x03, 'c', 'o', 'm', 0x00};
320 char *name = nullptr;
321 long enclen;
322 SetAllocFail(1);
323 EXPECT_EQ(ARES_ENOMEM,
324 ares_expand_name(data1.data(), data1.data(), data1.size(),
325 &name, &enclen));
326
327 // Empty packet
328 EXPECT_EQ(ARES_EBADNAME,
329 ares_expand_name(data1.data(), data1.data(), 0, &name, &enclen));
330
331 // Start beyond enclosing data
332 EXPECT_EQ(ARES_EBADNAME,
333 ares_expand_name(data1.data() + data1.size(), data1.data(), data1.size(),
334 &name, &enclen));
335
336 // Length beyond size of enclosing data
337 std::vector<byte> data2a = {0x13, 'c', 'o', 'm', 0x00};
338 EXPECT_EQ(ARES_EBADNAME,
339 ares_expand_name(data2a.data(), data2a.data(), data2a.size(),
340 &name, &enclen));
341 std::vector<byte> data2b = {0x1};
342 EXPECT_EQ(ARES_EBADNAME,
343 ares_expand_name(data2b.data(), data2b.data(), data2b.size(),
344 &name, &enclen));
345 std::vector<byte> data2c = {0xC0};
346 EXPECT_EQ(ARES_EBADNAME,
347 ares_expand_name(data2c.data(), data2c.data(), data2c.size(),
348 &name, &enclen));
349
350 // Indirection beyond enclosing data
351 std::vector<byte> data3a = {0xC0, 0x02};
352 EXPECT_EQ(ARES_EBADNAME,
353 ares_expand_name(data3a.data(), data3a.data(), data3a.size(),
354 &name, &enclen));
355 std::vector<byte> data3b = {0xC0, 0x0A, 'c', 'o', 'm', 0x00};
356 EXPECT_EQ(ARES_EBADNAME,
357 ares_expand_name(data3b.data(), data3b.data(), data3b.size(),
358 &name, &enclen));
359
360 // Invalid top bits in label length
361 std::vector<byte> data4 = {0x03, 'c', 'o', 'm', 0x00, 0x80, 0x00};
362 EXPECT_EQ(ARES_EBADNAME,
363 ares_expand_name(data4.data() + 5, data4.data(), data4.size(),
364 &name, &enclen));
365
366 // Label too long: 64-byte label, with invalid top 2 bits of length (01).
367 std::vector<byte> data5 = {0x40,
368 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
369 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
370 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
371 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
372 0x00};
373 EXPECT_EQ(ARES_EBADNAME,
374 ares_expand_name(data5.data(), data5.data(), data5.size(),
375 &name, &enclen)) << name;
376
377 // Incomplete indirect length
378 std::vector<byte> data6 = {0x03, 'c', 'o', 'm', 0x00, 0xC0};
379 EXPECT_EQ(ARES_EBADNAME,
380 ares_expand_name(data6.data() + 5, data6.data(), data6.size(),
381 &name, &enclen));
382
383 // Indirection loops
384 std::vector<byte> data7 = {0xC0, 0x02, 0xC0, 0x00};
385 EXPECT_EQ(ARES_EBADNAME,
386 ares_expand_name(data7.data(), data7.data(), data7.size(),
387 &name, &enclen));
388 std::vector<byte> data8 = {3, 'd', 'e', 'f', 0xC0, 0x08, 0x00, 0x00,
389 3, 'a', 'b', 'c', 0xC0, 0x00};
390 EXPECT_EQ(ARES_EBADNAME,
391 ares_expand_name(data8.data(), data8.data(), data8.size(),
392 &name, &enclen));
393 std::vector<byte> data9 = {0x12, 0x23, // start 2 bytes in
394 3, 'd', 'e', 'f', 0xC0, 0x02};
395 EXPECT_EQ(ARES_EBADNAME,
396 ares_expand_name(data9.data() + 2, data9.data(), data9.size(),
397 &name, &enclen));
398}
399
400TEST_F(LibraryTest, CreateEDNSQuery) {
401 byte* p;
402 int len;
403 EXPECT_EQ(ARES_SUCCESS,
404 ares_create_query("example.com", ns_c_in, ns_t_a, 0x1234, 0,
405 &p, &len, 1280));
406 std::vector<byte> data(p, p + len);
407 ares_free_string(p);
408
409 std::string actual = PacketToString(data);
410 DNSPacket pkt;
411 pkt.set_qid(0x1234).add_question(new DNSQuestion("example.com", ns_t_a))
412 .add_additional(new DNSOptRR(0, 1280));
413 std::string expected = PacketToString(pkt.data());
414 EXPECT_EQ(expected, actual);
415}
416
417TEST_F(LibraryTest, CreateRootQuery) {
418 byte* p;
419 int len;
420 ares_create_query(".", ns_c_in, ns_t_a, 0x1234, 0, &p, &len, 0);
421 std::vector<byte> data(p, p + len);
422 ares_free_string(p);
423
424 std::string actual = PacketToString(data);
425 DNSPacket pkt;
426 pkt.set_qid(0x1234).add_question(new DNSQuestion("", ns_t_a));
427 std::string expected = PacketToString(pkt.data());
428 EXPECT_EQ(expected, actual);
429}
430
431TEST_F(LibraryTest, Version) {
432 // Assume linked to same version
433 EXPECT_EQ(std::string(ARES_VERSION_STR),
434 std::string(ares_version(nullptr)));
435 int version;
436 ares_version(&version);
437 EXPECT_EQ(ARES_VERSION, version);
438}
439
440TEST_F(LibraryTest, Strerror) {
441 EXPECT_EQ("Successful completion",
442 std::string(ares_strerror(ARES_SUCCESS)));
443 EXPECT_EQ("DNS query cancelled",
444 std::string(ares_strerror(ARES_ECANCELLED)));
445 EXPECT_EQ("unknown",
446 std::string(ares_strerror(99)));
447}
448
449TEST_F(LibraryTest, ExpandString) {
450 std::vector<byte> s1 = { 3, 'a', 'b', 'c'};
451 char* result = nullptr;
452 long len;
453 EXPECT_EQ(ARES_SUCCESS,
454 ares_expand_string(s1.data(), s1.data(), s1.size(),
455 (unsigned char**)&result, &len));
456 EXPECT_EQ("abc", std::string(result));
457 EXPECT_EQ(1 + 3, len); // amount of data consumed includes 1 byte len
458 free(result);
459 result = nullptr;
460 EXPECT_EQ(ARES_EBADSTR,
461 ares_expand_string(s1.data() + 1, s1.data(), s1.size(),
462 (unsigned char**)&result, &len));
463 EXPECT_EQ(ARES_EBADSTR,
464 ares_expand_string(s1.data() + 4, s1.data(), s1.size(),
465 (unsigned char**)&result, &len));
466 SetAllocSizeFail(3 + 1);
467 EXPECT_EQ(ARES_ENOMEM,
468 ares_expand_string(s1.data(), s1.data(), s1.size(),
469 (unsigned char**)&result, &len));
470}
471
472} // namespace test
473} // namespace ares