ares-test-misc.cc 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. #include "ares-test.h"
  2. #include "dns-proto.h"
  3. #include <string>
  4. #include <vector>
  5. namespace ares {
  6. namespace test {
  7. TEST_F(DefaultChannelTest, GetServers) {
  8. std::vector<std::string> servers = GetNameServers(channel_);
  9. if (verbose) {
  10. for (const std::string& server : servers) {
  11. std::cerr << "Nameserver: " << server << std::endl;
  12. }
  13. }
  14. }
  15. TEST_F(DefaultChannelTest, GetServersFailures) {
  16. EXPECT_EQ(ARES_SUCCESS,
  17. ares_set_servers_csv(channel_, "1.2.3.4,2.3.4.5"));
  18. struct ares_addr_node* servers = nullptr;
  19. SetAllocFail(1);
  20. EXPECT_EQ(ARES_ENOMEM, ares_get_servers(channel_, &servers));
  21. SetAllocFail(2);
  22. EXPECT_EQ(ARES_ENOMEM, ares_get_servers(channel_, &servers));
  23. EXPECT_EQ(ARES_ENODATA, ares_get_servers(nullptr, &servers));
  24. }
  25. TEST_F(DefaultChannelTest, SetServers) {
  26. EXPECT_EQ(ARES_SUCCESS, ares_set_servers(channel_, nullptr));
  27. std::vector<std::string> empty;
  28. EXPECT_EQ(empty, GetNameServers(channel_));
  29. struct ares_addr_node server1;
  30. struct ares_addr_node server2;
  31. server1.next = &server2;
  32. server1.family = AF_INET;
  33. server1.addr.addr4.s_addr = htonl(0x01020304);
  34. server2.next = nullptr;
  35. server2.family = AF_INET;
  36. server2.addr.addr4.s_addr = htonl(0x02030405);
  37. EXPECT_EQ(ARES_ENODATA, ares_set_servers(nullptr, &server1));
  38. EXPECT_EQ(ARES_SUCCESS, ares_set_servers(channel_, &server1));
  39. std::vector<std::string> expected = {"1.2.3.4", "2.3.4.5"};
  40. EXPECT_EQ(expected, GetNameServers(channel_));
  41. }
  42. TEST_F(DefaultChannelTest, SetServersPorts) {
  43. EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports(channel_, nullptr));
  44. std::vector<std::string> empty;
  45. EXPECT_EQ(empty, GetNameServers(channel_));
  46. struct ares_addr_port_node server1;
  47. struct ares_addr_port_node server2;
  48. server1.next = &server2;
  49. server1.family = AF_INET;
  50. server1.addr.addr4.s_addr = htonl(0x01020304);
  51. server1.udp_port = 111;
  52. server1.tcp_port = 111;
  53. server2.next = nullptr;
  54. server2.family = AF_INET;
  55. server2.addr.addr4.s_addr = htonl(0x02030405);
  56. server2.udp_port = 0;
  57. server2.tcp_port = 0;;
  58. EXPECT_EQ(ARES_ENODATA, ares_set_servers_ports(nullptr, &server1));
  59. EXPECT_EQ(ARES_SUCCESS, ares_set_servers_ports(channel_, &server1));
  60. std::vector<std::string> expected = {"1.2.3.4:111", "2.3.4.5"};
  61. EXPECT_EQ(expected, GetNameServers(channel_));
  62. }
  63. TEST_F(DefaultChannelTest, SetServersCSV) {
  64. EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "1.2.3.4"));
  65. EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "xyzzy,plugh"));
  66. EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "256.1.2.3"));
  67. EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "1.2.3.4.5"));
  68. EXPECT_EQ(ARES_ENODATA, ares_set_servers_csv(nullptr, "1:2:3:4:5"));
  69. EXPECT_EQ(ARES_SUCCESS,
  70. ares_set_servers_csv(channel_, "1.2.3.4,0102:0304:0506:0708:0910:1112:1314:1516,2.3.4.5"));
  71. std::vector<std::string> expected = {"1.2.3.4", "0102:0304:0506:0708:0910:1112:1314:1516", "2.3.4.5"};
  72. EXPECT_EQ(expected, GetNameServers(channel_));
  73. // Same, with spaces
  74. EXPECT_EQ(ARES_EBADSTR,
  75. ares_set_servers_csv(channel_, "1.2.3.4 , 0102:0304:0506:0708:0910:1112:1314:1516, 2.3.4.5"));
  76. // Same, with ports
  77. EXPECT_EQ(ARES_SUCCESS,
  78. ares_set_servers_csv(channel_, "1.2.3.4:54,[0102:0304:0506:0708:0910:1112:1314:1516]:80,2.3.4.5:55"));
  79. EXPECT_EQ(expected, GetNameServers(channel_));
  80. EXPECT_EQ(ARES_SUCCESS,
  81. 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"));
  82. std::vector<std::string> expected2 = {"1.2.3.4:54", "[0102:0304:0506:0708:0910:1112:1314:1516]:80", "2.3.4.5:55"};
  83. EXPECT_EQ(expected2, GetNameServers(channel_));
  84. // Should survive duplication
  85. ares_channel channel2;
  86. EXPECT_EQ(ARES_SUCCESS, ares_dup(&channel2, channel_));
  87. EXPECT_EQ(expected2, GetNameServers(channel2));
  88. ares_destroy(channel2);
  89. // Allocation failure cases
  90. for (int fail = 1; fail <= 5; fail++) {
  91. SetAllocFail(fail);
  92. EXPECT_EQ(ARES_ENOMEM,
  93. ares_set_servers_csv(channel_, "1.2.3.4,0102:0304:0506:0708:0910:1112:1314:1516,2.3.4.5"));
  94. }
  95. // Blank servers
  96. EXPECT_EQ(ARES_SUCCESS, ares_set_servers_csv(channel_, ""));
  97. std::vector<std::string> none;
  98. EXPECT_EQ(none, GetNameServers(channel_));
  99. EXPECT_EQ(ARES_EBADSTR, ares_set_servers_csv(channel_, "2.3.4.5,1.2.3.4:,3.4.5.6"));
  100. EXPECT_EQ(ARES_EBADSTR, ares_set_servers_csv(channel_, "2.3.4.5,1.2.3.4:Z,3.4.5.6"));
  101. }
  102. TEST_F(DefaultChannelTest, TimeoutValue) {
  103. struct timeval tinfo;
  104. tinfo.tv_sec = 0;
  105. tinfo.tv_usec = 0;
  106. struct timeval tmax;
  107. tmax.tv_sec = 0;
  108. tmax.tv_usec = 10;
  109. struct timeval* pt;
  110. // No timers => get max back.
  111. pt = ares_timeout(channel_, &tmax, &tinfo);
  112. EXPECT_EQ(&tmax, pt);
  113. EXPECT_EQ(0, pt->tv_sec);
  114. EXPECT_EQ(10, pt->tv_usec);
  115. pt = ares_timeout(channel_, nullptr, &tinfo);
  116. EXPECT_EQ(nullptr, pt);
  117. HostResult result;
  118. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  119. // Now there's a timer running.
  120. pt = ares_timeout(channel_, &tmax, &tinfo);
  121. EXPECT_EQ(&tmax, pt);
  122. EXPECT_EQ(0, pt->tv_sec);
  123. EXPECT_EQ(10, pt->tv_usec);
  124. tmax.tv_sec = 100;
  125. pt = ares_timeout(channel_, &tmax, &tinfo);
  126. EXPECT_EQ(&tinfo, pt);
  127. pt = ares_timeout(channel_, nullptr, &tinfo);
  128. EXPECT_EQ(&tinfo, pt);
  129. Process();
  130. }
  131. TEST_F(LibraryTest, InetNtoP) {
  132. struct in_addr addr;
  133. addr.s_addr = htonl(0x01020304);
  134. char buffer[256];
  135. EXPECT_EQ(buffer, ares_inet_ntop(AF_INET, &addr, buffer, sizeof(buffer)));
  136. EXPECT_EQ("1.2.3.4", std::string(buffer));
  137. }
  138. TEST_F(LibraryTest, Mkquery) {
  139. byte* p;
  140. int len;
  141. ares_mkquery("example.com", C_IN, T_A, 0x1234, 0, &p, &len);
  142. std::vector<byte> data(p, p + len);
  143. ares_free_string(p);
  144. std::string actual = PacketToString(data);
  145. DNSPacket pkt;
  146. pkt.set_qid(0x1234).add_question(new DNSQuestion("example.com", T_A));
  147. std::string expected = PacketToString(pkt.data());
  148. EXPECT_EQ(expected, actual);
  149. }
  150. TEST_F(LibraryTest, CreateQuery) {
  151. byte* p;
  152. int len;
  153. EXPECT_EQ(ARES_SUCCESS,
  154. ares_create_query("exam\\@le.com", C_IN, T_A, 0x1234, 0,
  155. &p, &len, 0));
  156. std::vector<byte> data(p, p + len);
  157. ares_free_string(p);
  158. std::string actual = PacketToString(data);
  159. DNSPacket pkt;
  160. pkt.set_qid(0x1234).add_question(new DNSQuestion("[email protected]", T_A));
  161. std::string expected = PacketToString(pkt.data());
  162. EXPECT_EQ(expected, actual);
  163. }
  164. TEST_F(LibraryTest, CreateQueryTrailingEscapedDot) {
  165. byte* p;
  166. int len;
  167. EXPECT_EQ(ARES_SUCCESS,
  168. ares_create_query("example.com\\.", C_IN, T_A, 0x1234, 0,
  169. &p, &len, 0));
  170. std::vector<byte> data(p, p + len);
  171. ares_free_string(p);
  172. std::string actual = PacketToString(data);
  173. EXPECT_EQ("REQ QRY Q:{'example.com\\.' IN A}", actual);
  174. }
  175. TEST_F(LibraryTest, CreateQueryNameTooLong) {
  176. byte* p;
  177. int len;
  178. EXPECT_EQ(ARES_EBADNAME,
  179. ares_create_query(
  180. "a1234567890123456789.b1234567890123456789.c1234567890123456789.d1234567890123456789."
  181. "a1234567890123456789.b1234567890123456789.c1234567890123456789.d1234567890123456789."
  182. "a1234567890123456789.b1234567890123456789.c1234567890123456789.d1234567890123456789."
  183. "x1234567890123456789.y1234567890123456789.",
  184. C_IN, T_A, 0x1234, 0, &p, &len, 0));
  185. }
  186. TEST_F(LibraryTest, CreateQueryFailures) {
  187. byte* p;
  188. int len;
  189. // RC1035 has a 255 byte limit on names.
  190. std::string longname;
  191. for (int ii = 0; ii < 17; ii++) {
  192. longname += "fedcba9876543210";
  193. }
  194. p = nullptr;
  195. EXPECT_EQ(ARES_EBADNAME,
  196. ares_create_query(longname.c_str(), C_IN, T_A, 0x1234, 0,
  197. &p, &len, 0));
  198. if (p) ares_free_string(p);
  199. SetAllocFail(1);
  200. p = nullptr;
  201. EXPECT_EQ(ARES_ENOMEM,
  202. ares_create_query("example.com", C_IN, T_A, 0x1234, 0,
  203. &p, &len, 0));
  204. if (p) ares_free_string(p);
  205. // 63-char limit on a single label
  206. std::string longlabel = "a.a123456789b123456789c123456789d123456789e123456789f123456789g123456789.org";
  207. p = nullptr;
  208. EXPECT_EQ(ARES_EBADNAME,
  209. ares_create_query(longlabel.c_str(), C_IN, T_A, 0x1234, 0,
  210. &p, &len, 0));
  211. if (p) ares_free_string(p);
  212. // Empty non-terminal label
  213. p = nullptr;
  214. EXPECT_EQ(ARES_EBADNAME,
  215. ares_create_query("example..com", C_IN, T_A, 0x1234, 0,
  216. &p, &len, 0));
  217. if (p) ares_free_string(p);
  218. }
  219. TEST_F(LibraryTest, CreateQueryOnionDomain) {
  220. byte* p;
  221. int len;
  222. EXPECT_EQ(ARES_ENOTFOUND,
  223. ares_create_query("dontleak.onion", C_IN, T_A, 0x1234, 0,
  224. &p, &len, 0));
  225. }
  226. TEST_F(DefaultChannelTest, HostByNameOnionDomain) {
  227. HostResult result;
  228. ares_gethostbyname(channel_, "dontleak.onion", AF_INET, HostCallback, &result);
  229. EXPECT_TRUE(result.done_);
  230. EXPECT_EQ(ARES_ENOTFOUND, result.status_);
  231. }
  232. TEST_F(DefaultChannelTest, HostByNameFileOnionDomain) {
  233. struct hostent *h;
  234. EXPECT_EQ(ARES_ENOTFOUND,
  235. ares_gethostbyname_file(channel_, "dontleak.onion", AF_INET, &h));
  236. }
  237. TEST_F(DefaultChannelTest, GetAddrinfoOnionDomain) {
  238. AddrInfoResult result;
  239. struct ares_addrinfo_hints hints = {};
  240. hints.ai_family = AF_UNSPEC;
  241. ares_getaddrinfo(channel_, "dontleak.onion", NULL, &hints, AddrInfoCallback, &result);
  242. EXPECT_TRUE(result.done_);
  243. EXPECT_EQ(ARES_ENOTFOUND, result.status_);
  244. }
  245. // Interesting question: should tacking on a search domain let the query
  246. // through? It seems safer to reject it because "supersecret.onion.search"
  247. // still leaks information about the query to malicious resolvers.
  248. TEST_F(DefaultChannelTest, SearchOnionDomain) {
  249. SearchResult result;
  250. ares_search(channel_, "dontleak.onion", C_IN, T_A,
  251. SearchCallback, &result);
  252. EXPECT_TRUE(result.done_);
  253. EXPECT_EQ(ARES_ENOTFOUND, result.status_);
  254. }
  255. TEST_F(DefaultChannelTest, SendFailure) {
  256. unsigned char buf[2];
  257. SearchResult result;
  258. ares_send(channel_, buf, sizeof(buf), SearchCallback, &result);
  259. EXPECT_TRUE(result.done_);
  260. EXPECT_EQ(ARES_EBADQUERY, result.status_);
  261. }
  262. std::string ExpandName(const std::vector<byte>& data, int offset,
  263. long *enclen) {
  264. char *name = nullptr;
  265. int rc = ares_expand_name(data.data() + offset, data.data(), data.size(),
  266. &name, enclen);
  267. EXPECT_EQ(ARES_SUCCESS, rc);
  268. std::string result;
  269. if (rc == ARES_SUCCESS) {
  270. result = name;
  271. } else {
  272. result = "<error>";
  273. }
  274. ares_free_string(name);
  275. return result;
  276. }
  277. TEST_F(LibraryTest, ExpandName) {
  278. long enclen;
  279. std::vector<byte> data1 = {1, 'a', 2, 'b', 'c', 3, 'd', 'e', 'f', 0};
  280. EXPECT_EQ("a.bc.def", ExpandName(data1, 0, &enclen));
  281. EXPECT_EQ(data1.size(), enclen);
  282. std::vector<byte> data2 = {0};
  283. EXPECT_EQ("", ExpandName(data2, 0, &enclen));
  284. EXPECT_EQ(1, enclen);
  285. // Complete name indirection
  286. std::vector<byte> data3 = {0x12, 0x23,
  287. 3, 'd', 'e', 'f', 0,
  288. 0xC0, 2};
  289. EXPECT_EQ("def", ExpandName(data3, 2, &enclen));
  290. EXPECT_EQ(5, enclen);
  291. EXPECT_EQ("def", ExpandName(data3, 7, &enclen));
  292. EXPECT_EQ(2, enclen);
  293. // One label then indirection
  294. std::vector<byte> data4 = {0x12, 0x23,
  295. 3, 'd', 'e', 'f', 0,
  296. 1, 'a', 0xC0, 2};
  297. EXPECT_EQ("def", ExpandName(data4, 2, &enclen));
  298. EXPECT_EQ(5, enclen);
  299. EXPECT_EQ("a.def", ExpandName(data4, 7, &enclen));
  300. EXPECT_EQ(4, enclen);
  301. // Two labels then indirection
  302. std::vector<byte> data5 = {0x12, 0x23,
  303. 3, 'd', 'e', 'f', 0,
  304. 1, 'a', 1, 'b', 0xC0, 2};
  305. EXPECT_EQ("def", ExpandName(data5, 2, &enclen));
  306. EXPECT_EQ(5, enclen);
  307. EXPECT_EQ("a.b.def", ExpandName(data5, 7, &enclen));
  308. EXPECT_EQ(6, enclen);
  309. // Empty name, indirection to empty name
  310. std::vector<byte> data6 = {0x12, 0x23,
  311. 0,
  312. 0xC0, 2};
  313. EXPECT_EQ("", ExpandName(data6, 2, &enclen));
  314. EXPECT_EQ(1, enclen);
  315. EXPECT_EQ("", ExpandName(data6, 3, &enclen));
  316. EXPECT_EQ(2, enclen);
  317. }
  318. TEST_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. // Empty packet
  327. EXPECT_EQ(ARES_EBADNAME,
  328. ares_expand_name(data1.data(), data1.data(), 0, &name, &enclen));
  329. // Start beyond enclosing data
  330. EXPECT_EQ(ARES_EBADNAME,
  331. ares_expand_name(data1.data() + data1.size(), data1.data(), data1.size(),
  332. &name, &enclen));
  333. // Length beyond size of enclosing data
  334. std::vector<byte> data2a = {0x13, 'c', 'o', 'm', 0x00};
  335. EXPECT_EQ(ARES_EBADNAME,
  336. ares_expand_name(data2a.data(), data2a.data(), data2a.size(),
  337. &name, &enclen));
  338. std::vector<byte> data2b = {0x1};
  339. EXPECT_EQ(ARES_EBADNAME,
  340. ares_expand_name(data2b.data(), data2b.data(), data2b.size(),
  341. &name, &enclen));
  342. std::vector<byte> data2c = {0xC0};
  343. EXPECT_EQ(ARES_EBADNAME,
  344. ares_expand_name(data2c.data(), data2c.data(), data2c.size(),
  345. &name, &enclen));
  346. // Indirection beyond enclosing data
  347. std::vector<byte> data3a = {0xC0, 0x02};
  348. EXPECT_EQ(ARES_EBADNAME,
  349. ares_expand_name(data3a.data(), data3a.data(), data3a.size(),
  350. &name, &enclen));
  351. std::vector<byte> data3b = {0xC0, 0x0A, 'c', 'o', 'm', 0x00};
  352. EXPECT_EQ(ARES_EBADNAME,
  353. ares_expand_name(data3b.data(), data3b.data(), data3b.size(),
  354. &name, &enclen));
  355. // Invalid top bits in label length
  356. std::vector<byte> data4 = {0x03, 'c', 'o', 'm', 0x00, 0x80, 0x00};
  357. EXPECT_EQ(ARES_EBADNAME,
  358. ares_expand_name(data4.data() + 5, data4.data(), data4.size(),
  359. &name, &enclen));
  360. // Label too long: 64-byte label, with invalid top 2 bits of length (01).
  361. std::vector<byte> data5 = {0x40,
  362. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
  363. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
  364. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
  365. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
  366. 0x00};
  367. EXPECT_EQ(ARES_EBADNAME,
  368. ares_expand_name(data5.data(), data5.data(), data5.size(),
  369. &name, &enclen)) << name;
  370. // Incomplete indirect length
  371. std::vector<byte> data6 = {0x03, 'c', 'o', 'm', 0x00, 0xC0};
  372. EXPECT_EQ(ARES_EBADNAME,
  373. ares_expand_name(data6.data() + 5, data6.data(), data6.size(),
  374. &name, &enclen));
  375. // Indirection loops
  376. std::vector<byte> data7 = {0xC0, 0x02, 0xC0, 0x00};
  377. EXPECT_EQ(ARES_EBADNAME,
  378. ares_expand_name(data7.data(), data7.data(), data7.size(),
  379. &name, &enclen));
  380. std::vector<byte> data8 = {3, 'd', 'e', 'f', 0xC0, 0x08, 0x00, 0x00,
  381. 3, 'a', 'b', 'c', 0xC0, 0x00};
  382. EXPECT_EQ(ARES_EBADNAME,
  383. ares_expand_name(data8.data(), data8.data(), data8.size(),
  384. &name, &enclen));
  385. std::vector<byte> data9 = {0x12, 0x23, // start 2 bytes in
  386. 3, 'd', 'e', 'f', 0xC0, 0x02};
  387. EXPECT_EQ(ARES_EBADNAME,
  388. ares_expand_name(data9.data() + 2, data9.data(), data9.size(),
  389. &name, &enclen));
  390. }
  391. TEST_F(LibraryTest, CreateEDNSQuery) {
  392. byte* p;
  393. int len;
  394. EXPECT_EQ(ARES_SUCCESS,
  395. ares_create_query("example.com", C_IN, T_A, 0x1234, 0,
  396. &p, &len, 1280));
  397. std::vector<byte> data(p, p + len);
  398. ares_free_string(p);
  399. std::string actual = PacketToString(data);
  400. DNSPacket pkt;
  401. pkt.set_qid(0x1234).add_question(new DNSQuestion("example.com", T_A))
  402. .add_additional(new DNSOptRR(0, 1280));
  403. std::string expected = PacketToString(pkt.data());
  404. EXPECT_EQ(expected, actual);
  405. }
  406. TEST_F(LibraryTest, CreateRootQuery) {
  407. byte* p;
  408. int len;
  409. ares_create_query(".", C_IN, T_A, 0x1234, 0, &p, &len, 0);
  410. std::vector<byte> data(p, p + len);
  411. ares_free_string(p);
  412. std::string actual = PacketToString(data);
  413. DNSPacket pkt;
  414. pkt.set_qid(0x1234).add_question(new DNSQuestion("", T_A));
  415. std::string expected = PacketToString(pkt.data());
  416. EXPECT_EQ(expected, actual);
  417. }
  418. TEST_F(LibraryTest, Version) {
  419. // Assume linked to same version
  420. EXPECT_EQ(std::string(ARES_VERSION_STR),
  421. std::string(ares_version(nullptr)));
  422. int version;
  423. ares_version(&version);
  424. EXPECT_EQ(ARES_VERSION, version);
  425. }
  426. TEST_F(LibraryTest, Strerror) {
  427. EXPECT_EQ("Successful completion",
  428. std::string(ares_strerror(ARES_SUCCESS)));
  429. EXPECT_EQ("DNS query cancelled",
  430. std::string(ares_strerror(ARES_ECANCELLED)));
  431. EXPECT_EQ("unknown",
  432. std::string(ares_strerror(99)));
  433. }
  434. TEST_F(LibraryTest, ExpandString) {
  435. std::vector<byte> s1 = { 3, 'a', 'b', 'c'};
  436. char* result = nullptr;
  437. long len;
  438. EXPECT_EQ(ARES_SUCCESS,
  439. ares_expand_string(s1.data(), s1.data(), s1.size(),
  440. (unsigned char**)&result, &len));
  441. EXPECT_EQ("abc", std::string(result));
  442. EXPECT_EQ(1 + 3, len); // amount of data consumed includes 1 byte len
  443. ares_free_string(result);
  444. result = nullptr;
  445. EXPECT_EQ(ARES_EBADSTR,
  446. ares_expand_string(s1.data() + 1, s1.data(), s1.size(),
  447. (unsigned char**)&result, &len));
  448. EXPECT_EQ(ARES_EBADSTR,
  449. ares_expand_string(s1.data() + 4, s1.data(), s1.size(),
  450. (unsigned char**)&result, &len));
  451. SetAllocSizeFail(3 + 1);
  452. EXPECT_EQ(ARES_ENOMEM,
  453. ares_expand_string(s1.data(), s1.data(), s1.size(),
  454. (unsigned char**)&result, &len));
  455. }
  456. } // namespace test
  457. } // namespace ares