ares-test-live.cc 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. // This file includes tests that attempt to do real lookups
  2. // of DNS names using the local machine's live infrastructure.
  3. // As a result, we don't check the results very closely, to allow
  4. // for varying local configurations.
  5. #include "ares-test.h"
  6. #ifdef HAVE_NETDB_H
  7. #include <netdb.h>
  8. #endif
  9. namespace ares {
  10. namespace test {
  11. // Use the address of Google's public DNS servers as example addresses that are
  12. // likely to be accessible everywhere/everywhen.
  13. unsigned char gdns_addr4[4] = {0x08, 0x08, 0x08, 0x08};
  14. unsigned char gdns_addr6[16] = {0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0x00, 0x00,
  15. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88};
  16. MATCHER_P(IncludesAtLeastNumAddresses, n, "") {
  17. if(!arg)
  18. return false;
  19. int cnt = 0;
  20. for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
  21. cnt++;
  22. return cnt >= n;
  23. }
  24. MATCHER_P(OnlyIncludesAddrType, addrtype, "") {
  25. if(!arg)
  26. return false;
  27. for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
  28. if (ai->ai_family != addrtype)
  29. return false;
  30. return true;
  31. }
  32. MATCHER_P(IncludesAddrType, addrtype, "") {
  33. if(!arg)
  34. return false;
  35. for (const ares_addrinfo_node* ai = arg->nodes; ai != NULL; ai = ai->ai_next)
  36. if (ai->ai_family == addrtype)
  37. return true;
  38. return false;
  39. }
  40. //VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetAddrInfoV4) {
  41. //struct ares_addrinfo_hints hints = {};
  42. //hints.ai_family = AF_INET;
  43. //AddrInfoResult result;
  44. //ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
  45. //Process();
  46. //EXPECT_TRUE(result.done_);
  47. //EXPECT_EQ(ARES_SUCCESS, result.status_);
  48. //EXPECT_THAT(result.ai_, IncludesAtLeastNumAddresses(1));
  49. //EXPECT_THAT(result.ai_, OnlyIncludesAddrType(AF_INET));
  50. //}
  51. //VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetAddrInfoV6) {
  52. //struct ares_addrinfo_hints hints = {};
  53. //hints.ai_family = AF_INET6;
  54. //AddrInfoResult result;
  55. //ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
  56. //Process();
  57. //EXPECT_TRUE(result.done_);
  58. //EXPECT_EQ(ARES_SUCCESS, result.status_);
  59. //EXPECT_THAT(result.ai_, IncludesAtLeastNumAddresses(1));
  60. //EXPECT_THAT(result.ai_, OnlyIncludesAddrType(AF_INET6));
  61. //}
  62. //VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetAddrInfoUnspec) {
  63. //struct ares_addrinfo_hints hints = {};
  64. //hints.ai_family = AF_UNSPEC;
  65. //AddrInfoResult result;
  66. //ares_getaddrinfo(channel_, "www.google.com.", NULL, &hints, AddrInfoCallback, &result);
  67. //Process();
  68. //EXPECT_TRUE(result.done_);
  69. //EXPECT_EQ(ARES_SUCCESS, result.status_);
  70. //EXPECT_THAT(result.ai_, IncludesAtLeastNumAddresses(2));
  71. //EXPECT_THAT(result.ai_, IncludesAddrType(AF_INET6));
  72. //EXPECT_THAT(result.ai_, IncludesAddrType(AF_INET));
  73. //}
  74. VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveGetHostByNameV4) {
  75. HostResult result;
  76. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  77. Process();
  78. EXPECT_TRUE(result.done_);
  79. EXPECT_EQ(ARES_SUCCESS, result.status_);
  80. EXPECT_LT(0, (int)result.host_.addrs_.size());
  81. EXPECT_EQ(AF_INET, result.host_.addrtype_);
  82. }
  83. VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveGetHostByNameV6) {
  84. HostResult result;
  85. ares_gethostbyname(channel_, "www.google.com.", AF_INET6, HostCallback, &result);
  86. Process();
  87. EXPECT_TRUE(result.done_);
  88. EXPECT_EQ(ARES_SUCCESS, result.status_);
  89. EXPECT_LT(0, (int)result.host_.addrs_.size());
  90. EXPECT_EQ(AF_INET6, result.host_.addrtype_);
  91. }
  92. VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveGetHostByAddrV4) {
  93. HostResult result;
  94. ares_gethostbyaddr(channel_, gdns_addr4, sizeof(gdns_addr4), AF_INET, HostCallback, &result);
  95. Process();
  96. EXPECT_TRUE(result.done_);
  97. EXPECT_EQ(ARES_SUCCESS, result.status_);
  98. EXPECT_LT(0, (int)result.host_.addrs_.size());
  99. EXPECT_EQ(AF_INET, result.host_.addrtype_);
  100. }
  101. VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveGetHostByAddrV6) {
  102. HostResult result;
  103. ares_gethostbyaddr(channel_, gdns_addr6, sizeof(gdns_addr6), AF_INET6, HostCallback, &result);
  104. Process();
  105. EXPECT_TRUE(result.done_);
  106. EXPECT_EQ(ARES_SUCCESS, result.status_);
  107. EXPECT_LT(0, (int)result.host_.addrs_.size());
  108. EXPECT_EQ(AF_INET6, result.host_.addrtype_);
  109. }
  110. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetHostByNameFile) {
  111. struct hostent *host = nullptr;
  112. // Still need a channel even to query /etc/hosts.
  113. EXPECT_EQ(ARES_ENOTFOUND,
  114. ares_gethostbyname_file(nullptr, "localhost", AF_INET, &host));
  115. int rc = ares_gethostbyname_file(channel_, "bogus.mcname", AF_INET, &host);
  116. EXPECT_EQ(nullptr, host);
  117. EXPECT_EQ(ARES_ENOTFOUND, rc);
  118. rc = ares_gethostbyname_file(channel_, "localhost", AF_INET, &host);
  119. if (rc == ARES_SUCCESS) {
  120. EXPECT_NE(nullptr, host);
  121. ares_free_hostent(host);
  122. }
  123. }
  124. TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameV4) {
  125. HostResult result;
  126. ares_gethostbyname(channel_, "localhost", AF_INET, HostCallback, &result);
  127. Process();
  128. EXPECT_TRUE(result.done_);
  129. if ((result.status_ != ARES_ENOTFOUND) && (result.status_ != ARES_ECONNREFUSED)) {
  130. EXPECT_EQ(ARES_SUCCESS, result.status_);
  131. EXPECT_EQ(1, (int)result.host_.addrs_.size());
  132. EXPECT_EQ(AF_INET, result.host_.addrtype_);
  133. EXPECT_NE(std::string::npos, result.host_.name_.find("localhost"));
  134. }
  135. }
  136. TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameV6) {
  137. HostResult result;
  138. ares_gethostbyname(channel_, "localhost", AF_INET6, HostCallback, &result);
  139. Process();
  140. EXPECT_TRUE(result.done_);
  141. if (result.status_ == ARES_SUCCESS) {
  142. EXPECT_EQ(1, (int)result.host_.addrs_.size());
  143. EXPECT_EQ(AF_INET6, result.host_.addrtype_);
  144. std::stringstream ss;
  145. ss << HostEnt(result.host_);
  146. EXPECT_NE(std::string::npos, result.host_.name_.find("localhost"));
  147. }
  148. }
  149. TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameIPV4) {
  150. HostResult result;
  151. ares_gethostbyname(channel_, "127.0.0.1", AF_INET, HostCallback, &result);
  152. Process();
  153. EXPECT_TRUE(result.done_);
  154. EXPECT_EQ(ARES_SUCCESS, result.status_);
  155. EXPECT_EQ(1, (int)result.host_.addrs_.size());
  156. EXPECT_EQ(AF_INET, result.host_.addrtype_);
  157. std::stringstream ss;
  158. ss << HostEnt(result.host_);
  159. EXPECT_EQ("{'127.0.0.1' aliases=[] addrs=[127.0.0.1]}", ss.str());
  160. }
  161. TEST_P(DefaultChannelModeTest, LiveGetLocalhostByNameIPV6) {
  162. HostResult result;
  163. ares_gethostbyname(channel_, "::1", AF_INET6, HostCallback, &result);
  164. Process();
  165. EXPECT_TRUE(result.done_);
  166. if (result.status_ != ARES_ENOTFOUND) {
  167. EXPECT_EQ(ARES_SUCCESS, result.status_);
  168. EXPECT_EQ(1, (int)result.host_.addrs_.size());
  169. EXPECT_EQ(AF_INET6, result.host_.addrtype_);
  170. std::stringstream ss;
  171. ss << HostEnt(result.host_);
  172. EXPECT_EQ("{'::1' aliases=[] addrs=[0000:0000:0000:0000:0000:0000:0000:0001]}", ss.str());
  173. }
  174. }
  175. TEST_P(DefaultChannelModeTest, LiveGetLocalhostFailFamily) {
  176. HostResult result;
  177. ares_gethostbyname(channel_, "127.0.0.1", AF_INET+AF_INET6, HostCallback, &result);
  178. Process();
  179. EXPECT_TRUE(result.done_);
  180. EXPECT_EQ(ARES_ENOTIMP, result.status_);
  181. }
  182. TEST_P(DefaultChannelModeTest, LiveGetLocalhostByAddrV4) {
  183. HostResult result;
  184. struct in_addr addr;
  185. addr.s_addr = htonl(INADDR_LOOPBACK);
  186. ares_gethostbyaddr(channel_, &addr, sizeof(addr), AF_INET, HostCallback, &result);
  187. Process();
  188. EXPECT_TRUE(result.done_);
  189. if (result.status_ != ARES_ENOTFOUND) {
  190. EXPECT_EQ(ARES_SUCCESS, result.status_);
  191. EXPECT_LT(0, (int)result.host_.addrs_.size());
  192. EXPECT_EQ(AF_INET, result.host_.addrtype_);
  193. // oddly, travis does not resolve to localhost, but a random hostname starting with travis-job
  194. if (result.host_.name_.find("travis-job") == std::string::npos) {
  195. EXPECT_NE(std::string::npos,
  196. result.host_.name_.find("localhost"));
  197. }
  198. }
  199. }
  200. TEST_P(DefaultChannelModeTest, LiveGetLocalhostByAddrV6) {
  201. HostResult result;
  202. struct in6_addr addr;
  203. memset(&addr, 0, sizeof(addr));
  204. addr.s6_addr[15] = 1; // in6addr_loopback
  205. ares_gethostbyaddr(channel_, &addr, sizeof(addr), AF_INET6, HostCallback, &result);
  206. Process();
  207. EXPECT_TRUE(result.done_);
  208. if (result.status_ != ARES_ENOTFOUND) {
  209. EXPECT_EQ(ARES_SUCCESS, result.status_);
  210. EXPECT_LT(0, (int)result.host_.addrs_.size());
  211. EXPECT_EQ(AF_INET6, result.host_.addrtype_);
  212. const std::string& name = result.host_.name_;
  213. EXPECT_TRUE(std::string::npos != name.find("localhost") ||
  214. std::string::npos != name.find("ip6-loopback"));
  215. }
  216. }
  217. TEST_P(DefaultChannelModeTest, LiveGetHostByAddrFailFamily) {
  218. HostResult result;
  219. unsigned char addr[4] = {8, 8, 8, 8};
  220. ares_gethostbyaddr(channel_, addr, sizeof(addr), AF_INET6+AF_INET,
  221. HostCallback, &result);
  222. EXPECT_TRUE(result.done_);
  223. EXPECT_EQ(ARES_ENOTIMP, result.status_);
  224. }
  225. TEST_P(DefaultChannelModeTest, LiveGetHostByAddrFailAddrSize) {
  226. HostResult result;
  227. unsigned char addr[4] = {8, 8, 8, 8};
  228. ares_gethostbyaddr(channel_, addr, sizeof(addr) - 1, AF_INET,
  229. HostCallback, &result);
  230. EXPECT_TRUE(result.done_);
  231. EXPECT_EQ(ARES_ENOTIMP, result.status_);
  232. }
  233. TEST_P(DefaultChannelModeTest, LiveGetHostByAddrFailAlloc) {
  234. HostResult result;
  235. unsigned char addr[4] = {8, 8, 8, 8};
  236. SetAllocFail(1);
  237. ares_gethostbyaddr(channel_, addr, sizeof(addr), AF_INET,
  238. HostCallback, &result);
  239. EXPECT_TRUE(result.done_);
  240. EXPECT_EQ(ARES_ENOMEM, result.status_);
  241. }
  242. INSTANTIATE_TEST_CASE_P(Modes, DefaultChannelModeTest,
  243. ::testing::Values("f", "b", "fb", "bf"));
  244. VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchA) {
  245. SearchResult result;
  246. ares_search(channel_, "www.youtube.com.", ns_c_in, ns_t_a,
  247. SearchCallback, &result);
  248. Process();
  249. EXPECT_TRUE(result.done_);
  250. EXPECT_EQ(ARES_SUCCESS, result.status_);
  251. }
  252. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveSearchEmptyA) {
  253. SearchResult result;
  254. ares_search(channel_, "", ns_c_in, ns_t_a,
  255. SearchCallback, &result);
  256. Process();
  257. EXPECT_TRUE(result.done_);
  258. EXPECT_NE(ARES_SUCCESS, result.status_);
  259. }
  260. VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchNS) {
  261. SearchResult result;
  262. ares_search(channel_, "google.com.", ns_c_in, ns_t_ns,
  263. SearchCallback, &result);
  264. Process();
  265. EXPECT_TRUE(result.done_);
  266. EXPECT_EQ(ARES_SUCCESS, result.status_);
  267. }
  268. VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchMX) {
  269. SearchResult result;
  270. ares_search(channel_, "google.com.", ns_c_in, ns_t_mx,
  271. SearchCallback, &result);
  272. Process();
  273. EXPECT_TRUE(result.done_);
  274. EXPECT_EQ(ARES_SUCCESS, result.status_);
  275. }
  276. VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchTXT) {
  277. SearchResult result;
  278. ares_search(channel_, "google.com.", ns_c_in, ns_t_txt,
  279. SearchCallback, &result);
  280. Process();
  281. EXPECT_TRUE(result.done_);
  282. EXPECT_EQ(ARES_SUCCESS, result.status_);
  283. }
  284. VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchSOA) {
  285. SearchResult result;
  286. ares_search(channel_, "google.com.", ns_c_in, ns_t_soa,
  287. SearchCallback, &result);
  288. Process();
  289. EXPECT_TRUE(result.done_);
  290. EXPECT_EQ(ARES_SUCCESS, result.status_);
  291. }
  292. VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchSRV) {
  293. SearchResult result;
  294. ares_search(channel_, "_imap._tcp.gmail.com.", ns_c_in, ns_t_srv,
  295. SearchCallback, &result);
  296. Process();
  297. EXPECT_TRUE(result.done_);
  298. EXPECT_EQ(ARES_SUCCESS, result.status_);
  299. }
  300. VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_LiveSearchANY) {
  301. SearchResult result;
  302. ares_search(channel_, "google.com.", ns_c_in, ns_t_any,
  303. SearchCallback, &result);
  304. Process();
  305. EXPECT_TRUE(result.done_);
  306. EXPECT_EQ(ARES_SUCCESS, result.status_);
  307. }
  308. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4) {
  309. NameInfoResult result;
  310. struct sockaddr_in sockaddr;
  311. memset(&sockaddr, 0, sizeof(sockaddr));
  312. sockaddr.sin_family = AF_INET;
  313. sockaddr.sin_port = htons(53);
  314. sockaddr.sin_addr.s_addr = htonl(0x08080808);
  315. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  316. ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
  317. NameInfoCallback, &result);
  318. Process();
  319. EXPECT_TRUE(result.done_);
  320. EXPECT_EQ(ARES_SUCCESS, result.status_);
  321. if (verbose) std::cerr << "8.8.8.8:53 => " << result.node_ << "/" << result.service_ << std::endl;
  322. }
  323. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NoPort) {
  324. NameInfoResult result;
  325. struct sockaddr_in sockaddr;
  326. memset(&sockaddr, 0, sizeof(sockaddr));
  327. sockaddr.sin_family = AF_INET;
  328. sockaddr.sin_port = htons(0);
  329. sockaddr.sin_addr.s_addr = htonl(0x08080808);
  330. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  331. ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
  332. NameInfoCallback, &result);
  333. Process();
  334. EXPECT_TRUE(result.done_);
  335. EXPECT_EQ(ARES_SUCCESS, result.status_);
  336. if (verbose) std::cerr << "8.8.8.8:0 => " << result.node_ << "/" << result.service_ << std::endl;
  337. }
  338. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4UnassignedPort) {
  339. NameInfoResult result;
  340. struct sockaddr_in sockaddr;
  341. memset(&sockaddr, 0, sizeof(sockaddr));
  342. sockaddr.sin_family = AF_INET;
  343. sockaddr.sin_port = htons(4); // Unassigned at IANA
  344. sockaddr.sin_addr.s_addr = htonl(0x08080808);
  345. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  346. ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
  347. NameInfoCallback, &result);
  348. Process();
  349. EXPECT_TRUE(result.done_);
  350. EXPECT_EQ(ARES_SUCCESS, result.status_);
  351. if (verbose) std::cerr << "8.8.8.8:4 => " << result.node_ << "/" << result.service_ << std::endl;
  352. }
  353. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6Both) {
  354. NameInfoResult result;
  355. struct sockaddr_in6 sockaddr;
  356. memset(&sockaddr, 0, sizeof(sockaddr));
  357. sockaddr.sin6_family = AF_INET6;
  358. sockaddr.sin6_port = htons(53);
  359. memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
  360. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  361. ARES_NI_TCP|ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_NOFQDN,
  362. NameInfoCallback, &result);
  363. Process();
  364. EXPECT_TRUE(result.done_);
  365. EXPECT_EQ(ARES_SUCCESS, result.status_);
  366. if (verbose) std::cerr << "[2001:4860:4860::8888]:53 => " << result.node_ << "/" << result.service_ << std::endl;
  367. }
  368. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6Neither) {
  369. NameInfoResult result;
  370. struct sockaddr_in6 sockaddr;
  371. memset(&sockaddr, 0, sizeof(sockaddr));
  372. sockaddr.sin6_family = AF_INET6;
  373. sockaddr.sin6_port = htons(53);
  374. memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
  375. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  376. ARES_NI_TCP|ARES_NI_NOFQDN, // Neither specified => assume lookup host.
  377. NameInfoCallback, &result);
  378. Process();
  379. EXPECT_TRUE(result.done_);
  380. EXPECT_EQ(ARES_SUCCESS, result.status_);
  381. if (verbose) std::cerr << "[2001:4860:4860::8888]:53 => " << result.node_ << "/" << result.service_ << std::endl;
  382. }
  383. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4Numeric) {
  384. NameInfoResult result;
  385. struct sockaddr_in sockaddr;
  386. memset(&sockaddr, 0, sizeof(sockaddr));
  387. sockaddr.sin_family = AF_INET;
  388. sockaddr.sin_port = htons(53);
  389. sockaddr.sin_addr.s_addr = htonl(0x08080808);
  390. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  391. ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_TCP|ARES_NI_NUMERICHOST,
  392. NameInfoCallback, &result);
  393. Process();
  394. EXPECT_TRUE(result.done_);
  395. EXPECT_EQ(ARES_SUCCESS, result.status_);
  396. EXPECT_EQ("8.8.8.8", result.node_);
  397. if (verbose) std::cerr << "8.8.8.8:53 => " << result.node_ << "/" << result.service_ << std::endl;
  398. }
  399. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6Numeric) {
  400. NameInfoResult result;
  401. struct sockaddr_in6 sockaddr;
  402. memset(&sockaddr, 0, sizeof(sockaddr));
  403. sockaddr.sin6_family = AF_INET6;
  404. sockaddr.sin6_port = htons(53);
  405. memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
  406. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  407. ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_DCCP|ARES_NI_NUMERICHOST,
  408. NameInfoCallback, &result);
  409. Process();
  410. EXPECT_TRUE(result.done_);
  411. EXPECT_EQ(ARES_SUCCESS, result.status_);
  412. EXPECT_EQ("2001:4860:4860::8888%0", result.node_);
  413. if (verbose) std::cerr << "[2001:4860:4860::8888]:53 => " << result.node_ << "/" << result.service_ << std::endl;
  414. }
  415. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6LinkLocal) {
  416. NameInfoResult result;
  417. struct sockaddr_in6 sockaddr;
  418. memset(&sockaddr, 0, sizeof(sockaddr));
  419. sockaddr.sin6_family = AF_INET6;
  420. sockaddr.sin6_port = htons(53);
  421. unsigned char addr6[16] = {0xfe, 0x80, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00,
  422. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04};
  423. memcpy(sockaddr.sin6_addr.s6_addr, addr6, 16);
  424. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  425. ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_DCCP|ARES_NI_NUMERICHOST,
  426. NameInfoCallback, &result);
  427. Process();
  428. EXPECT_TRUE(result.done_);
  429. EXPECT_EQ(ARES_SUCCESS, result.status_);
  430. EXPECT_EQ("fe80:102:102::304%0", result.node_);
  431. if (verbose) std::cerr << "[fe80:102:102::304]:53 => " << result.node_ << "/" << result.service_ << std::endl;
  432. }
  433. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NotFound) {
  434. NameInfoResult result;
  435. struct sockaddr_in sockaddr;
  436. memset(&sockaddr, 0, sizeof(sockaddr));
  437. sockaddr.sin_family = AF_INET;
  438. sockaddr.sin_port = htons(4); // Port 4 unassigned at IANA
  439. // RFC5737 says 192.0.2.0 should not be used publically.
  440. sockaddr.sin_addr.s_addr = htonl(0xC0000200);
  441. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  442. ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
  443. NameInfoCallback, &result);
  444. Process();
  445. EXPECT_TRUE(result.done_);
  446. EXPECT_EQ(ARES_SUCCESS, result.status_);
  447. EXPECT_EQ("192.0.2.0", result.node_);
  448. if (verbose) std::cerr << "192.0.2.0:53 => " << result.node_ << "/" << result.service_ << std::endl;
  449. }
  450. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV4NotFoundFail) {
  451. NameInfoResult result;
  452. struct sockaddr_in sockaddr;
  453. memset(&sockaddr, 0, sizeof(sockaddr));
  454. sockaddr.sin_family = AF_INET;
  455. sockaddr.sin_port = htons(53);
  456. // RFC5737 says 192.0.2.0 should not be used publically.
  457. sockaddr.sin_addr.s_addr = htonl(0xC0000200);
  458. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  459. ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP|ARES_NI_NAMEREQD,
  460. NameInfoCallback, &result);
  461. Process();
  462. EXPECT_TRUE(result.done_);
  463. EXPECT_EQ(ARES_ENOTFOUND, result.status_);
  464. }
  465. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoV6NotFound) {
  466. NameInfoResult result;
  467. struct sockaddr_in6 sockaddr;
  468. memset(&sockaddr, 0, sizeof(sockaddr));
  469. sockaddr.sin6_family = AF_INET6;
  470. sockaddr.sin6_port = htons(53);
  471. // 2001:db8::/32 is only supposed to be used in documentation.
  472. unsigned char addr6[16] = {0x20, 0x01, 0x0d, 0xb8, 0x01, 0x02, 0x00, 0x00,
  473. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04};
  474. memcpy(sockaddr.sin6_addr.s6_addr, addr6, 16);
  475. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  476. ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
  477. NameInfoCallback, &result);
  478. Process();
  479. EXPECT_TRUE(result.done_);
  480. EXPECT_EQ(ARES_SUCCESS, result.status_);
  481. EXPECT_EQ("2001:db8:102::304%0", result.node_);
  482. if (verbose) std::cerr << "[2001:db8:102::304]:53 => " << result.node_ << "/" << result.service_ << std::endl;
  483. }
  484. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInvalidFamily) {
  485. NameInfoResult result;
  486. struct sockaddr_in6 sockaddr;
  487. memset(&sockaddr, 0, sizeof(sockaddr));
  488. sockaddr.sin6_family = AF_INET6 + AF_INET;
  489. sockaddr.sin6_port = htons(53);
  490. memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
  491. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  492. ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
  493. NameInfoCallback, &result);
  494. Process();
  495. EXPECT_TRUE(result.done_);
  496. EXPECT_EQ(ARES_ENOTIMP, result.status_);
  497. }
  498. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInvalidFlags) {
  499. NameInfoResult result;
  500. struct sockaddr_in6 sockaddr;
  501. memset(&sockaddr, 0, sizeof(sockaddr));
  502. sockaddr.sin6_family = AF_INET6;
  503. sockaddr.sin6_port = htons(53);
  504. memcpy(sockaddr.sin6_addr.s6_addr, gdns_addr6, 16);
  505. // Ask for both a name-required, and a numeric host.
  506. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  507. ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP|ARES_NI_NUMERICHOST|ARES_NI_NAMEREQD,
  508. NameInfoCallback, &result);
  509. Process();
  510. EXPECT_TRUE(result.done_);
  511. EXPECT_EQ(ARES_EBADFLAGS, result.status_);
  512. }
  513. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetServiceInfo) {
  514. NameInfoResult result;
  515. struct sockaddr_in sockaddr;
  516. memset(&sockaddr, 0, sizeof(sockaddr));
  517. sockaddr.sin_family = AF_INET;
  518. sockaddr.sin_port = htons(53);
  519. sockaddr.sin_addr.s_addr = htonl(0x08080808);
  520. // Just look up service info
  521. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  522. ARES_NI_LOOKUPSERVICE|ARES_NI_SCTP,
  523. NameInfoCallback, &result);
  524. Process();
  525. EXPECT_TRUE(result.done_);
  526. EXPECT_EQ(ARES_SUCCESS, result.status_);
  527. EXPECT_EQ("", result.node_);
  528. }
  529. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetServiceInfoNumeric) {
  530. NameInfoResult result;
  531. struct sockaddr_in sockaddr;
  532. memset(&sockaddr, 0, sizeof(sockaddr));
  533. sockaddr.sin_family = AF_INET;
  534. sockaddr.sin_port = htons(53);
  535. sockaddr.sin_addr.s_addr = htonl(0x08080808);
  536. // Just look up service info
  537. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  538. ARES_NI_LOOKUPSERVICE|ARES_NI_SCTP|ARES_NI_NUMERICSERV,
  539. NameInfoCallback, &result);
  540. Process();
  541. EXPECT_TRUE(result.done_);
  542. EXPECT_EQ(ARES_SUCCESS, result.status_);
  543. EXPECT_EQ("", result.node_);
  544. EXPECT_EQ("53", result.service_);
  545. }
  546. VIRT_NONVIRT_TEST_F(DefaultChannelTest, LiveGetNameInfoAllocFail) {
  547. NameInfoResult result;
  548. struct sockaddr_in sockaddr;
  549. memset(&sockaddr, 0, sizeof(sockaddr));
  550. sockaddr.sin_family = AF_INET;
  551. sockaddr.sin_port = htons(53);
  552. sockaddr.sin_addr.s_addr = htonl(0x08080808);
  553. SetAllocFail(1);
  554. ares_getnameinfo(channel_, (const struct sockaddr*)&sockaddr, sizeof(sockaddr),
  555. ARES_NI_LOOKUPHOST|ARES_NI_LOOKUPSERVICE|ARES_NI_UDP,
  556. NameInfoCallback, &result);
  557. Process();
  558. EXPECT_TRUE(result.done_);
  559. EXPECT_EQ(ARES_ENOMEM, result.status_);
  560. }
  561. VIRT_NONVIRT_TEST_F(DefaultChannelTest, DISABLED_GetSock) {
  562. ares_socket_t socks[3] = {ARES_SOCKET_BAD, ARES_SOCKET_BAD, ARES_SOCKET_BAD};
  563. int bitmask = ares_getsock(channel_, socks, 3);
  564. EXPECT_EQ(0, bitmask);
  565. bitmask = ares_getsock(channel_, nullptr, 0);
  566. EXPECT_EQ(0, bitmask);
  567. // Ask again with a pending query.
  568. HostResult result;
  569. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  570. bitmask = ares_getsock(channel_, socks, 3);
  571. EXPECT_NE(0, bitmask);
  572. bitmask = ares_getsock(channel_, nullptr, 0);
  573. EXPECT_EQ(0, bitmask);
  574. Process();
  575. }
  576. TEST_F(LibraryTest, DISABLED_GetTCPSock) {
  577. ares_channel channel;
  578. struct ares_options opts = {0};
  579. opts.tcp_port = 53;
  580. opts.flags = ARES_FLAG_USEVC;
  581. int optmask = ARES_OPT_TCP_PORT | ARES_OPT_FLAGS;
  582. EXPECT_EQ(ARES_SUCCESS, ares_init_options(&channel, &opts, optmask));
  583. EXPECT_NE(nullptr, channel);
  584. ares_socket_t socks[3] = {ARES_SOCKET_BAD, ARES_SOCKET_BAD, ARES_SOCKET_BAD};
  585. int bitmask = ares_getsock(channel, socks, 3);
  586. EXPECT_EQ(0, bitmask);
  587. bitmask = ares_getsock(channel, nullptr, 0);
  588. EXPECT_EQ(0, bitmask);
  589. // Ask again with a pending query.
  590. HostResult result;
  591. ares_gethostbyname(channel, "www.google.com.", AF_INET, HostCallback, &result);
  592. bitmask = ares_getsock(channel, socks, 3);
  593. EXPECT_NE(0, bitmask);
  594. bitmask = ares_getsock(channel, nullptr, 0);
  595. EXPECT_EQ(0, bitmask);
  596. ProcessWork(channel, NoExtraFDs, nullptr);
  597. ares_destroy(channel);
  598. }
  599. TEST_F(DefaultChannelTest, VerifySocketFunctionCallback) {
  600. VirtualizeIO vio(channel_);
  601. auto my_functions = VirtualizeIO::default_functions;
  602. size_t count = 0;
  603. my_functions.asocket = [](int af, int type, int protocol, void * p) {
  604. EXPECT_NE(nullptr, p);
  605. (*reinterpret_cast<size_t *>(p))++;
  606. return ::socket(af, type, protocol);
  607. };
  608. ares_set_socket_functions(channel_, &my_functions, &count);
  609. {
  610. count = 0;
  611. HostResult result;
  612. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  613. Process();
  614. EXPECT_TRUE(result.done_);
  615. EXPECT_NE(0, count);
  616. }
  617. {
  618. count = 0;
  619. ares_channel copy;
  620. EXPECT_EQ(ARES_SUCCESS, ares_dup(&copy, channel_));
  621. HostResult result;
  622. ares_gethostbyname(copy, "www.google.com.", AF_INET, HostCallback, &result);
  623. ProcessWork(copy, NoExtraFDs, nullptr);
  624. EXPECT_TRUE(result.done_);
  625. ares_destroy(copy);
  626. EXPECT_NE(0, count);
  627. }
  628. }
  629. TEST_F(DefaultChannelTest, LiveSetServers) {
  630. struct ares_addr_node server1;
  631. struct ares_addr_node server2;
  632. server1.next = &server2;
  633. server1.family = AF_INET;
  634. server1.addr.addr4.s_addr = htonl(0x01020304);
  635. server2.next = nullptr;
  636. server2.family = AF_INET;
  637. server2.addr.addr4.s_addr = htonl(0x02030405);
  638. // Change not allowed while request is pending
  639. HostResult result;
  640. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  641. EXPECT_EQ(ARES_ENOTIMP, ares_set_servers(channel_, &server1));
  642. ares_cancel(channel_);
  643. }
  644. TEST_F(DefaultChannelTest, LiveSetServersPorts) {
  645. struct ares_addr_port_node server1;
  646. struct ares_addr_port_node server2;
  647. server1.next = &server2;
  648. server1.family = AF_INET;
  649. server1.addr.addr4.s_addr = htonl(0x01020304);
  650. server1.udp_port = 111;
  651. server1.tcp_port = 111;
  652. server2.next = nullptr;
  653. server2.family = AF_INET;
  654. server2.addr.addr4.s_addr = htonl(0x02030405);
  655. server2.udp_port = 0;
  656. server2.tcp_port = 0;;
  657. EXPECT_EQ(ARES_ENODATA, ares_set_servers_ports(nullptr, &server1));
  658. // Change not allowed while request is pending
  659. HostResult result;
  660. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  661. EXPECT_EQ(ARES_ENOTIMP, ares_set_servers_ports(channel_, &server1));
  662. ares_cancel(channel_);
  663. }
  664. TEST_F(DefaultChannelTest, LiveSetServersCSV) {
  665. // Change not allowed while request is pending
  666. HostResult result;
  667. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  668. EXPECT_EQ(ARES_ENOTIMP, ares_set_servers_csv(channel_, "1.2.3.4,2.3.4.5"));
  669. EXPECT_EQ(ARES_ENOTIMP, ares_set_servers_ports_csv(channel_, "1.2.3.4:56,2.3.4.5:67"));
  670. ares_cancel(channel_);
  671. }
  672. } // namespace test
  673. } // namespace ares