ares-test-mock.cc 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173
  1. #include "ares-test.h"
  2. #include "dns-proto.h"
  3. #include <sstream>
  4. #include <vector>
  5. using testing::InvokeWithoutArgs;
  6. using testing::DoAll;
  7. namespace ares {
  8. namespace test {
  9. TEST_P(MockChannelTest, Basic) {
  10. std::vector<byte> reply = {
  11. 0x00, 0x00, // qid
  12. 0x84, // response + query + AA + not-TC + not-RD
  13. 0x00, // not-RA + not-Z + not-AD + not-CD + rc=NoError
  14. 0x00, 0x01, // 1 question
  15. 0x00, 0x01, // 1 answer RRs
  16. 0x00, 0x00, // 0 authority RRs
  17. 0x00, 0x00, // 0 additional RRs
  18. // Question
  19. 0x03, 'w', 'w', 'w',
  20. 0x06, 'g', 'o', 'o', 'g', 'l', 'e',
  21. 0x03, 'c', 'o', 'm',
  22. 0x00,
  23. 0x00, 0x01, // type A
  24. 0x00, 0x01, // class IN
  25. // Answer
  26. 0x03, 'w', 'w', 'w',
  27. 0x06, 'g', 'o', 'o', 'g', 'l', 'e',
  28. 0x03, 'c', 'o', 'm',
  29. 0x00,
  30. 0x00, 0x01, // type A
  31. 0x00, 0x01, // class IN
  32. 0x00, 0x00, 0x01, 0x00, // TTL
  33. 0x00, 0x04, // rdata length
  34. 0x01, 0x02, 0x03, 0x04
  35. };
  36. ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
  37. .WillByDefault(SetReplyData(&server_, reply));
  38. HostResult result;
  39. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  40. Process();
  41. EXPECT_TRUE(result.done_);
  42. std::stringstream ss;
  43. ss << result.host_;
  44. EXPECT_EQ("{'www.google.com' aliases=[] addrs=[1.2.3.4]}", ss.str());
  45. }
  46. // UDP only so mock server doesn't get confused by concatenated requests
  47. TEST_P(MockUDPChannelTest, GetHostByNameParallelLookups) {
  48. DNSPacket rsp1;
  49. rsp1.set_response().set_aa()
  50. .add_question(new DNSQuestion("www.google.com", ns_t_a))
  51. .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5}));
  52. ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
  53. .WillByDefault(SetReply(&server_, &rsp1));
  54. DNSPacket rsp2;
  55. rsp2.set_response().set_aa()
  56. .add_question(new DNSQuestion("www.example.com", ns_t_a))
  57. .add_answer(new DNSARR("www.example.com", 100, {1, 2, 3, 4}));
  58. ON_CALL(server_, OnRequest("www.example.com", ns_t_a))
  59. .WillByDefault(SetReply(&server_, &rsp2));
  60. HostResult result1;
  61. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result1);
  62. HostResult result2;
  63. ares_gethostbyname(channel_, "www.example.com.", AF_INET, HostCallback, &result2);
  64. HostResult result3;
  65. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result3);
  66. Process();
  67. EXPECT_TRUE(result1.done_);
  68. EXPECT_TRUE(result2.done_);
  69. EXPECT_TRUE(result3.done_);
  70. std::stringstream ss1;
  71. ss1 << result1.host_;
  72. EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss1.str());
  73. std::stringstream ss2;
  74. ss2 << result2.host_;
  75. EXPECT_EQ("{'www.example.com' aliases=[] addrs=[1.2.3.4]}", ss2.str());
  76. std::stringstream ss3;
  77. ss3 << result3.host_;
  78. EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss3.str());
  79. }
  80. // UDP to TCP specific test
  81. TEST_P(MockUDPChannelTest, TruncationRetry) {
  82. DNSPacket rsptruncated;
  83. rsptruncated.set_response().set_aa().set_tc()
  84. .add_question(new DNSQuestion("www.google.com", ns_t_a));
  85. DNSPacket rspok;
  86. rspok.set_response()
  87. .add_question(new DNSQuestion("www.google.com", ns_t_a))
  88. .add_answer(new DNSARR("www.google.com", 100, {1, 2, 3, 4}));
  89. EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
  90. .WillOnce(SetReply(&server_, &rsptruncated))
  91. .WillOnce(SetReply(&server_, &rspok));
  92. HostResult result;
  93. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  94. Process();
  95. EXPECT_TRUE(result.done_);
  96. std::stringstream ss;
  97. ss << result.host_;
  98. EXPECT_EQ("{'www.google.com' aliases=[] addrs=[1.2.3.4]}", ss.str());
  99. }
  100. static int sock_cb_count = 0;
  101. static int SocketConnectCallback(ares_socket_t fd, int type, void *data) {
  102. int rc = *(int*)data;
  103. if (verbose) std::cerr << "SocketConnectCallback(" << fd << ") invoked" << std::endl;
  104. sock_cb_count++;
  105. return rc;
  106. }
  107. TEST_P(MockChannelTest, SockCallback) {
  108. DNSPacket rsp;
  109. rsp.set_response().set_aa()
  110. .add_question(new DNSQuestion("www.google.com", ns_t_a))
  111. .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5}));
  112. EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
  113. .WillOnce(SetReply(&server_, &rsp));
  114. // Get notified of new sockets
  115. int rc = ARES_SUCCESS;
  116. ares_set_socket_callback(channel_, SocketConnectCallback, &rc);
  117. HostResult result;
  118. sock_cb_count = 0;
  119. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  120. Process();
  121. EXPECT_EQ(1, sock_cb_count);
  122. EXPECT_TRUE(result.done_);
  123. std::stringstream ss;
  124. ss << result.host_;
  125. EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
  126. }
  127. TEST_P(MockChannelTest, SockFailCallback) {
  128. // Notification of new sockets gives an error.
  129. int rc = -1;
  130. ares_set_socket_callback(channel_, SocketConnectCallback, &rc);
  131. HostResult result;
  132. sock_cb_count = 0;
  133. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  134. Process();
  135. EXPECT_LT(1, sock_cb_count);
  136. EXPECT_TRUE(result.done_);
  137. EXPECT_EQ(ARES_ECONNREFUSED, result.status_);
  138. }
  139. static int sock_config_cb_count = 0;
  140. static int SocketConfigureCallback(ares_socket_t fd, int type, void *data) {
  141. int rc = *(int*)data;
  142. if (verbose) std::cerr << "SocketConfigureCallback(" << fd << ") invoked" << std::endl;
  143. sock_config_cb_count++;
  144. return rc;
  145. }
  146. TEST_P(MockChannelTest, SockConfigureCallback) {
  147. DNSPacket rsp;
  148. rsp.set_response().set_aa()
  149. .add_question(new DNSQuestion("www.google.com", ns_t_a))
  150. .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5}));
  151. EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
  152. .WillOnce(SetReply(&server_, &rsp));
  153. // Get notified of new sockets
  154. int rc = ARES_SUCCESS;
  155. ares_set_socket_configure_callback(channel_, SocketConfigureCallback, &rc);
  156. HostResult result;
  157. sock_config_cb_count = 0;
  158. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  159. Process();
  160. EXPECT_EQ(1, sock_config_cb_count);
  161. EXPECT_TRUE(result.done_);
  162. std::stringstream ss;
  163. ss << result.host_;
  164. EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
  165. }
  166. TEST_P(MockChannelTest, SockConfigureFailCallback) {
  167. // Notification of new sockets gives an error.
  168. int rc = -1;
  169. ares_set_socket_configure_callback(channel_, SocketConfigureCallback, &rc);
  170. HostResult result;
  171. sock_config_cb_count = 0;
  172. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  173. Process();
  174. EXPECT_LT(1, sock_config_cb_count);
  175. EXPECT_TRUE(result.done_);
  176. EXPECT_EQ(ARES_ECONNREFUSED, result.status_);
  177. }
  178. // TCP only to prevent retries
  179. TEST_P(MockTCPChannelTest, MalformedResponse) {
  180. std::vector<byte> one = {0x01};
  181. EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
  182. .WillOnce(SetReplyData(&server_, one));
  183. HostResult result;
  184. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  185. Process();
  186. EXPECT_TRUE(result.done_);
  187. EXPECT_EQ(ARES_ETIMEOUT, result.status_);
  188. }
  189. TEST_P(MockTCPChannelTest, FormErrResponse) {
  190. DNSPacket rsp;
  191. rsp.set_response().set_aa()
  192. .add_question(new DNSQuestion("www.google.com", ns_t_a));
  193. rsp.set_rcode(ns_r_formerr);
  194. EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
  195. .WillOnce(SetReply(&server_, &rsp));
  196. HostResult result;
  197. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  198. Process();
  199. EXPECT_TRUE(result.done_);
  200. EXPECT_EQ(ARES_EFORMERR, result.status_);
  201. }
  202. TEST_P(MockTCPChannelTest, ServFailResponse) {
  203. DNSPacket rsp;
  204. rsp.set_response().set_aa()
  205. .add_question(new DNSQuestion("www.google.com", ns_t_a));
  206. rsp.set_rcode(ns_r_servfail);
  207. EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
  208. .WillOnce(SetReply(&server_, &rsp));
  209. HostResult result;
  210. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  211. Process();
  212. EXPECT_TRUE(result.done_);
  213. // ARES_FLAG_NOCHECKRESP not set, so SERVFAIL consumed
  214. EXPECT_EQ(ARES_ECONNREFUSED, result.status_);
  215. }
  216. TEST_P(MockTCPChannelTest, NotImplResponse) {
  217. DNSPacket rsp;
  218. rsp.set_response().set_aa()
  219. .add_question(new DNSQuestion("www.google.com", ns_t_a));
  220. rsp.set_rcode(ns_r_notimpl);
  221. EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
  222. .WillOnce(SetReply(&server_, &rsp));
  223. HostResult result;
  224. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  225. Process();
  226. EXPECT_TRUE(result.done_);
  227. // ARES_FLAG_NOCHECKRESP not set, so NOTIMPL consumed
  228. EXPECT_EQ(ARES_ECONNREFUSED, result.status_);
  229. }
  230. TEST_P(MockTCPChannelTest, RefusedResponse) {
  231. DNSPacket rsp;
  232. rsp.set_response().set_aa()
  233. .add_question(new DNSQuestion("www.google.com", ns_t_a));
  234. rsp.set_rcode(ns_r_refused);
  235. EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
  236. .WillOnce(SetReply(&server_, &rsp));
  237. HostResult result;
  238. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  239. Process();
  240. EXPECT_TRUE(result.done_);
  241. // ARES_FLAG_NOCHECKRESP not set, so REFUSED consumed
  242. EXPECT_EQ(ARES_ECONNREFUSED, result.status_);
  243. }
  244. TEST_P(MockTCPChannelTest, YXDomainResponse) {
  245. DNSPacket rsp;
  246. rsp.set_response().set_aa()
  247. .add_question(new DNSQuestion("www.google.com", ns_t_a));
  248. rsp.set_rcode(ns_r_yxdomain);
  249. EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
  250. .WillOnce(SetReply(&server_, &rsp));
  251. HostResult result;
  252. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  253. Process();
  254. EXPECT_TRUE(result.done_);
  255. EXPECT_EQ(ARES_ENODATA, result.status_);
  256. }
  257. class MockExtraOptsTest
  258. : public MockChannelOptsTest,
  259. public ::testing::WithParamInterface< std::pair<int, bool> > {
  260. public:
  261. MockExtraOptsTest()
  262. : MockChannelOptsTest(1, GetParam().first, GetParam().second,
  263. FillOptions(&opts_),
  264. ARES_OPT_SOCK_SNDBUF|ARES_OPT_SOCK_RCVBUF) {}
  265. static struct ares_options* FillOptions(struct ares_options * opts) {
  266. memset(opts, 0, sizeof(struct ares_options));
  267. // Set a few options that affect socket communications
  268. opts->socket_send_buffer_size = 514;
  269. opts->socket_receive_buffer_size = 514;
  270. return opts;
  271. }
  272. private:
  273. struct ares_options opts_;
  274. };
  275. TEST_P(MockExtraOptsTest, SimpleQuery) {
  276. ares_set_local_ip4(channel_, 0x7F000001);
  277. byte addr6[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  278. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
  279. ares_set_local_ip6(channel_, addr6);
  280. ares_set_local_dev(channel_, "dummy");
  281. DNSPacket rsp;
  282. rsp.set_response().set_aa()
  283. .add_question(new DNSQuestion("www.google.com", ns_t_a))
  284. .add_answer(new DNSARR("www.google.com", 100, {2, 3, 4, 5}));
  285. ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
  286. .WillByDefault(SetReply(&server_, &rsp));
  287. HostResult result;
  288. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  289. Process();
  290. EXPECT_TRUE(result.done_);
  291. std::stringstream ss;
  292. ss << result.host_;
  293. EXPECT_EQ("{'www.google.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
  294. }
  295. class MockFlagsChannelOptsTest
  296. : public MockChannelOptsTest,
  297. public ::testing::WithParamInterface< std::pair<int, bool> > {
  298. public:
  299. MockFlagsChannelOptsTest(int flags)
  300. : MockChannelOptsTest(1, GetParam().first, GetParam().second,
  301. FillOptions(&opts_, flags), ARES_OPT_FLAGS) {}
  302. static struct ares_options* FillOptions(struct ares_options * opts, int flags) {
  303. memset(opts, 0, sizeof(struct ares_options));
  304. opts->flags = flags;
  305. return opts;
  306. }
  307. private:
  308. struct ares_options opts_;
  309. };
  310. class MockNoCheckRespChannelTest : public MockFlagsChannelOptsTest {
  311. public:
  312. MockNoCheckRespChannelTest() : MockFlagsChannelOptsTest(ARES_FLAG_NOCHECKRESP) {}
  313. };
  314. TEST_P(MockNoCheckRespChannelTest, ServFailResponse) {
  315. DNSPacket rsp;
  316. rsp.set_response().set_aa()
  317. .add_question(new DNSQuestion("www.google.com", ns_t_a));
  318. rsp.set_rcode(ns_r_servfail);
  319. ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
  320. .WillByDefault(SetReply(&server_, &rsp));
  321. HostResult result;
  322. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  323. Process();
  324. EXPECT_TRUE(result.done_);
  325. EXPECT_EQ(ARES_ESERVFAIL, result.status_);
  326. }
  327. TEST_P(MockNoCheckRespChannelTest, NotImplResponse) {
  328. DNSPacket rsp;
  329. rsp.set_response().set_aa()
  330. .add_question(new DNSQuestion("www.google.com", ns_t_a));
  331. rsp.set_rcode(ns_r_notimpl);
  332. ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
  333. .WillByDefault(SetReply(&server_, &rsp));
  334. HostResult result;
  335. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  336. Process();
  337. EXPECT_TRUE(result.done_);
  338. EXPECT_EQ(ARES_ENOTIMP, result.status_);
  339. }
  340. TEST_P(MockNoCheckRespChannelTest, RefusedResponse) {
  341. DNSPacket rsp;
  342. rsp.set_response().set_aa()
  343. .add_question(new DNSQuestion("www.google.com", ns_t_a));
  344. rsp.set_rcode(ns_r_refused);
  345. ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
  346. .WillByDefault(SetReply(&server_, &rsp));
  347. HostResult result;
  348. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  349. Process();
  350. EXPECT_TRUE(result.done_);
  351. EXPECT_EQ(ARES_EREFUSED, result.status_);
  352. }
  353. class MockEDNSChannelTest : public MockFlagsChannelOptsTest {
  354. public:
  355. MockEDNSChannelTest() : MockFlagsChannelOptsTest(ARES_FLAG_EDNS) {}
  356. };
  357. TEST_P(MockEDNSChannelTest, RetryWithoutEDNS) {
  358. DNSPacket rspfail;
  359. rspfail.set_response().set_aa().set_rcode(ns_r_servfail)
  360. .add_question(new DNSQuestion("www.google.com", ns_t_a));
  361. DNSPacket rspok;
  362. rspok.set_response()
  363. .add_question(new DNSQuestion("www.google.com", ns_t_a))
  364. .add_answer(new DNSARR("www.google.com", 100, {1, 2, 3, 4}));
  365. EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
  366. .WillOnce(SetReply(&server_, &rspfail))
  367. .WillOnce(SetReply(&server_, &rspok));
  368. HostResult result;
  369. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  370. Process();
  371. EXPECT_TRUE(result.done_);
  372. std::stringstream ss;
  373. ss << result.host_;
  374. EXPECT_EQ("{'www.google.com' aliases=[] addrs=[1.2.3.4]}", ss.str());
  375. }
  376. TEST_P(MockChannelTest, SearchDomains) {
  377. DNSPacket nofirst;
  378. nofirst.set_response().set_aa().set_rcode(ns_r_nxdomain)
  379. .add_question(new DNSQuestion("www.first.com", ns_t_a));
  380. ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
  381. .WillByDefault(SetReply(&server_, &nofirst));
  382. DNSPacket nosecond;
  383. nosecond.set_response().set_aa().set_rcode(ns_r_nxdomain)
  384. .add_question(new DNSQuestion("www.second.org", ns_t_a));
  385. ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
  386. .WillByDefault(SetReply(&server_, &nosecond));
  387. DNSPacket yesthird;
  388. yesthird.set_response().set_aa()
  389. .add_question(new DNSQuestion("www.third.gov", ns_t_a))
  390. .add_answer(new DNSARR("www.third.gov", 0x0200, {2, 3, 4, 5}));
  391. ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
  392. .WillByDefault(SetReply(&server_, &yesthird));
  393. HostResult result;
  394. ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
  395. Process();
  396. EXPECT_TRUE(result.done_);
  397. std::stringstream ss;
  398. ss << result.host_;
  399. EXPECT_EQ("{'www.third.gov' aliases=[] addrs=[2.3.4.5]}", ss.str());
  400. }
  401. // Relies on retries so is UDP-only
  402. TEST_P(MockUDPChannelTest, SearchDomainsWithResentReply) {
  403. DNSPacket nofirst;
  404. nofirst.set_response().set_aa().set_rcode(ns_r_nxdomain)
  405. .add_question(new DNSQuestion("www.first.com", ns_t_a));
  406. EXPECT_CALL(server_, OnRequest("www.first.com", ns_t_a))
  407. .WillOnce(SetReply(&server_, &nofirst));
  408. DNSPacket nosecond;
  409. nosecond.set_response().set_aa().set_rcode(ns_r_nxdomain)
  410. .add_question(new DNSQuestion("www.second.org", ns_t_a));
  411. EXPECT_CALL(server_, OnRequest("www.second.org", ns_t_a))
  412. .WillOnce(SetReply(&server_, &nosecond));
  413. DNSPacket yesthird;
  414. yesthird.set_response().set_aa()
  415. .add_question(new DNSQuestion("www.third.gov", ns_t_a))
  416. .add_answer(new DNSARR("www.third.gov", 0x0200, {2, 3, 4, 5}));
  417. // Before sending the real answer, resend an earlier reply
  418. EXPECT_CALL(server_, OnRequest("www.third.gov", ns_t_a))
  419. .WillOnce(DoAll(SetReply(&server_, &nofirst),
  420. SetReplyQID(&server_, 123)))
  421. .WillOnce(DoAll(SetReply(&server_, &yesthird),
  422. SetReplyQID(&server_, -1)));
  423. HostResult result;
  424. ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
  425. Process();
  426. EXPECT_TRUE(result.done_);
  427. std::stringstream ss;
  428. ss << result.host_;
  429. EXPECT_EQ("{'www.third.gov' aliases=[] addrs=[2.3.4.5]}", ss.str());
  430. }
  431. TEST_P(MockChannelTest, SearchDomainsBare) {
  432. DNSPacket nofirst;
  433. nofirst.set_response().set_aa().set_rcode(ns_r_nxdomain)
  434. .add_question(new DNSQuestion("www.first.com", ns_t_a));
  435. ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
  436. .WillByDefault(SetReply(&server_, &nofirst));
  437. DNSPacket nosecond;
  438. nosecond.set_response().set_aa().set_rcode(ns_r_nxdomain)
  439. .add_question(new DNSQuestion("www.second.org", ns_t_a));
  440. ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
  441. .WillByDefault(SetReply(&server_, &nosecond));
  442. DNSPacket nothird;
  443. nothird.set_response().set_aa().set_rcode(ns_r_nxdomain)
  444. .add_question(new DNSQuestion("www.third.gov", ns_t_a));
  445. ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
  446. .WillByDefault(SetReply(&server_, &nothird));
  447. DNSPacket yesbare;
  448. yesbare.set_response().set_aa()
  449. .add_question(new DNSQuestion("www", ns_t_a))
  450. .add_answer(new DNSARR("www", 0x0200, {2, 3, 4, 5}));
  451. ON_CALL(server_, OnRequest("www", ns_t_a))
  452. .WillByDefault(SetReply(&server_, &yesbare));
  453. HostResult result;
  454. ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
  455. Process();
  456. EXPECT_TRUE(result.done_);
  457. std::stringstream ss;
  458. ss << result.host_;
  459. EXPECT_EQ("{'www' aliases=[] addrs=[2.3.4.5]}", ss.str());
  460. }
  461. TEST_P(MockChannelTest, SearchNoDataThenSuccess) {
  462. // First two search domains recognize the name but have no A records.
  463. DNSPacket nofirst;
  464. nofirst.set_response().set_aa()
  465. .add_question(new DNSQuestion("www.first.com", ns_t_a));
  466. ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
  467. .WillByDefault(SetReply(&server_, &nofirst));
  468. DNSPacket nosecond;
  469. nosecond.set_response().set_aa()
  470. .add_question(new DNSQuestion("www.second.org", ns_t_a));
  471. ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
  472. .WillByDefault(SetReply(&server_, &nosecond));
  473. DNSPacket yesthird;
  474. yesthird.set_response().set_aa()
  475. .add_question(new DNSQuestion("www.third.gov", ns_t_a))
  476. .add_answer(new DNSARR("www.third.gov", 0x0200, {2, 3, 4, 5}));
  477. ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
  478. .WillByDefault(SetReply(&server_, &yesthird));
  479. HostResult result;
  480. ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
  481. Process();
  482. EXPECT_TRUE(result.done_);
  483. std::stringstream ss;
  484. ss << result.host_;
  485. EXPECT_EQ("{'www.third.gov' aliases=[] addrs=[2.3.4.5]}", ss.str());
  486. }
  487. TEST_P(MockChannelTest, SearchNoDataThenNoDataBare) {
  488. // First two search domains recognize the name but have no A records.
  489. DNSPacket nofirst;
  490. nofirst.set_response().set_aa()
  491. .add_question(new DNSQuestion("www.first.com", ns_t_a));
  492. ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
  493. .WillByDefault(SetReply(&server_, &nofirst));
  494. DNSPacket nosecond;
  495. nosecond.set_response().set_aa()
  496. .add_question(new DNSQuestion("www.second.org", ns_t_a));
  497. ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
  498. .WillByDefault(SetReply(&server_, &nosecond));
  499. DNSPacket nothird;
  500. nothird.set_response().set_aa()
  501. .add_question(new DNSQuestion("www.third.gov", ns_t_a));
  502. ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
  503. .WillByDefault(SetReply(&server_, &nothird));
  504. DNSPacket nobare;
  505. nobare.set_response().set_aa()
  506. .add_question(new DNSQuestion("www", ns_t_a));
  507. ON_CALL(server_, OnRequest("www", ns_t_a))
  508. .WillByDefault(SetReply(&server_, &nobare));
  509. HostResult result;
  510. ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
  511. Process();
  512. EXPECT_TRUE(result.done_);
  513. EXPECT_EQ(ARES_ENODATA, result.status_);
  514. }
  515. TEST_P(MockChannelTest, SearchNoDataThenFail) {
  516. // First two search domains recognize the name but have no A records.
  517. DNSPacket nofirst;
  518. nofirst.set_response().set_aa()
  519. .add_question(new DNSQuestion("www.first.com", ns_t_a));
  520. ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
  521. .WillByDefault(SetReply(&server_, &nofirst));
  522. DNSPacket nosecond;
  523. nosecond.set_response().set_aa()
  524. .add_question(new DNSQuestion("www.second.org", ns_t_a));
  525. ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
  526. .WillByDefault(SetReply(&server_, &nosecond));
  527. DNSPacket nothird;
  528. nothird.set_response().set_aa()
  529. .add_question(new DNSQuestion("www.third.gov", ns_t_a));
  530. ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
  531. .WillByDefault(SetReply(&server_, &nothird));
  532. DNSPacket nobare;
  533. nobare.set_response().set_aa().set_rcode(ns_r_nxdomain)
  534. .add_question(new DNSQuestion("www", ns_t_a));
  535. ON_CALL(server_, OnRequest("www", ns_t_a))
  536. .WillByDefault(SetReply(&server_, &nobare));
  537. HostResult result;
  538. ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
  539. Process();
  540. EXPECT_TRUE(result.done_);
  541. EXPECT_EQ(ARES_ENODATA, result.status_);
  542. }
  543. TEST_P(MockChannelTest, SearchAllocFailure) {
  544. SearchResult result;
  545. SetAllocFail(1);
  546. ares_search(channel_, "fully.qualified.", ns_c_in, ns_t_a, SearchCallback, &result);
  547. /* Already done */
  548. EXPECT_TRUE(result.done_);
  549. EXPECT_EQ(ARES_ENOMEM, result.status_);
  550. }
  551. TEST_P(MockChannelTest, SearchHighNdots) {
  552. DNSPacket nobare;
  553. nobare.set_response().set_aa().set_rcode(ns_r_nxdomain)
  554. .add_question(new DNSQuestion("a.b.c.w.w.w", ns_t_a));
  555. ON_CALL(server_, OnRequest("a.b.c.w.w.w", ns_t_a))
  556. .WillByDefault(SetReply(&server_, &nobare));
  557. DNSPacket yesfirst;
  558. yesfirst.set_response().set_aa()
  559. .add_question(new DNSQuestion("a.b.c.w.w.w.first.com", ns_t_a))
  560. .add_answer(new DNSARR("a.b.c.w.w.w.first.com", 0x0200, {2, 3, 4, 5}));
  561. ON_CALL(server_, OnRequest("a.b.c.w.w.w.first.com", ns_t_a))
  562. .WillByDefault(SetReply(&server_, &yesfirst));
  563. SearchResult result;
  564. ares_search(channel_, "a.b.c.w.w.w", ns_c_in, ns_t_a, SearchCallback, &result);
  565. Process();
  566. EXPECT_TRUE(result.done_);
  567. EXPECT_EQ(ARES_SUCCESS, result.status_);
  568. std::stringstream ss;
  569. ss << PacketToString(result.data_);
  570. EXPECT_EQ("RSP QRY AA NOERROR Q:{'a.b.c.w.w.w.first.com' IN A} "
  571. "A:{'a.b.c.w.w.w.first.com' IN A TTL=512 2.3.4.5}",
  572. ss.str());
  573. }
  574. TEST_P(MockChannelTest, UnspecifiedFamilyV6) {
  575. DNSPacket rsp6;
  576. rsp6.set_response().set_aa()
  577. .add_question(new DNSQuestion("example.com", ns_t_aaaa))
  578. .add_answer(new DNSAaaaRR("example.com", 100,
  579. {0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  580. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03}));
  581. ON_CALL(server_, OnRequest("example.com", ns_t_aaaa))
  582. .WillByDefault(SetReply(&server_, &rsp6));
  583. HostResult result;
  584. ares_gethostbyname(channel_, "example.com.", AF_UNSPEC, HostCallback, &result);
  585. Process();
  586. EXPECT_TRUE(result.done_);
  587. std::stringstream ss;
  588. ss << result.host_;
  589. // Default to IPv6 when both are available.
  590. EXPECT_EQ("{'example.com' aliases=[] addrs=[2121:0000:0000:0000:0000:0000:0000:0303]}", ss.str());
  591. }
  592. TEST_P(MockChannelTest, UnspecifiedFamilyV4) {
  593. DNSPacket rsp6;
  594. rsp6.set_response().set_aa()
  595. .add_question(new DNSQuestion("example.com", ns_t_aaaa));
  596. ON_CALL(server_, OnRequest("example.com", ns_t_aaaa))
  597. .WillByDefault(SetReply(&server_, &rsp6));
  598. DNSPacket rsp4;
  599. rsp4.set_response().set_aa()
  600. .add_question(new DNSQuestion("example.com", ns_t_a))
  601. .add_answer(new DNSARR("example.com", 100, {2, 3, 4, 5}));
  602. ON_CALL(server_, OnRequest("example.com", ns_t_a))
  603. .WillByDefault(SetReply(&server_, &rsp4));
  604. HostResult result;
  605. ares_gethostbyname(channel_, "example.com.", AF_UNSPEC, HostCallback, &result);
  606. Process();
  607. EXPECT_TRUE(result.done_);
  608. std::stringstream ss;
  609. ss << result.host_;
  610. EXPECT_EQ("{'example.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
  611. }
  612. TEST_P(MockChannelTest, UnspecifiedFamilyNoData) {
  613. DNSPacket rsp6;
  614. rsp6.set_response().set_aa()
  615. .add_question(new DNSQuestion("example.com", ns_t_aaaa))
  616. .add_answer(new DNSCnameRR("example.com", 100, "elsewhere.com"));
  617. ON_CALL(server_, OnRequest("example.com", ns_t_aaaa))
  618. .WillByDefault(SetReply(&server_, &rsp6));
  619. DNSPacket rsp4;
  620. rsp4.set_response().set_aa()
  621. .add_question(new DNSQuestion("example.com", ns_t_a));
  622. ON_CALL(server_, OnRequest("example.com", ns_t_a))
  623. .WillByDefault(SetReply(&server_, &rsp4));
  624. HostResult result;
  625. ares_gethostbyname(channel_, "example.com.", AF_UNSPEC, HostCallback, &result);
  626. Process();
  627. EXPECT_TRUE(result.done_);
  628. std::stringstream ss;
  629. ss << result.host_;
  630. EXPECT_EQ("{'' aliases=[] addrs=[]}", ss.str());
  631. }
  632. TEST_P(MockChannelTest, UnspecifiedFamilyCname6A4) {
  633. DNSPacket rsp6;
  634. rsp6.set_response().set_aa()
  635. .add_question(new DNSQuestion("example.com", ns_t_aaaa))
  636. .add_answer(new DNSCnameRR("example.com", 100, "elsewhere.com"));
  637. ON_CALL(server_, OnRequest("example.com", ns_t_aaaa))
  638. .WillByDefault(SetReply(&server_, &rsp6));
  639. DNSPacket rsp4;
  640. rsp4.set_response().set_aa()
  641. .add_question(new DNSQuestion("example.com", ns_t_a))
  642. .add_answer(new DNSARR("example.com", 100, {1, 2, 3, 4}));
  643. ON_CALL(server_, OnRequest("example.com", ns_t_a))
  644. .WillByDefault(SetReply(&server_, &rsp4));
  645. HostResult result;
  646. ares_gethostbyname(channel_, "example.com.", AF_UNSPEC, HostCallback, &result);
  647. Process();
  648. EXPECT_TRUE(result.done_);
  649. std::stringstream ss;
  650. ss << result.host_;
  651. EXPECT_EQ("{'example.com' aliases=[] addrs=[1.2.3.4]}", ss.str());
  652. }
  653. TEST_P(MockChannelTest, ExplicitIP) {
  654. HostResult result;
  655. ares_gethostbyname(channel_, "1.2.3.4", AF_INET, HostCallback, &result);
  656. EXPECT_TRUE(result.done_); // Immediate return
  657. EXPECT_EQ(ARES_SUCCESS, result.status_);
  658. std::stringstream ss;
  659. ss << result.host_;
  660. EXPECT_EQ("{'1.2.3.4' aliases=[] addrs=[1.2.3.4]}", ss.str());
  661. }
  662. TEST_P(MockChannelTest, ExplicitIPAllocFail) {
  663. HostResult result;
  664. SetAllocSizeFail(strlen("1.2.3.4") + 1);
  665. ares_gethostbyname(channel_, "1.2.3.4", AF_INET, HostCallback, &result);
  666. EXPECT_TRUE(result.done_); // Immediate return
  667. EXPECT_EQ(ARES_ENOMEM, result.status_);
  668. }
  669. TEST_P(MockChannelTest, SortListV4) {
  670. DNSPacket rsp;
  671. rsp.set_response().set_aa()
  672. .add_question(new DNSQuestion("example.com", ns_t_a))
  673. .add_answer(new DNSARR("example.com", 100, {22, 23, 24, 25}))
  674. .add_answer(new DNSARR("example.com", 100, {12, 13, 14, 15}))
  675. .add_answer(new DNSARR("example.com", 100, {2, 3, 4, 5}));
  676. ON_CALL(server_, OnRequest("example.com", ns_t_a))
  677. .WillByDefault(SetReply(&server_, &rsp));
  678. {
  679. EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "12.13.0.0/255.255.0.0 1234::5678"));
  680. HostResult result;
  681. ares_gethostbyname(channel_, "example.com.", AF_INET, HostCallback, &result);
  682. Process();
  683. EXPECT_TRUE(result.done_);
  684. std::stringstream ss;
  685. ss << result.host_;
  686. EXPECT_EQ("{'example.com' aliases=[] addrs=[12.13.14.15, 22.23.24.25, 2.3.4.5]}", ss.str());
  687. }
  688. {
  689. EXPECT_EQ(ARES_SUCCESS, ares_set_sortlist(channel_, "2.3.0.0/16 130.140.150.160/26"));
  690. HostResult result;
  691. ares_gethostbyname(channel_, "example.com.", AF_INET, HostCallback, &result);
  692. Process();
  693. EXPECT_TRUE(result.done_);
  694. std::stringstream ss;
  695. ss << result.host_;
  696. EXPECT_EQ("{'example.com' aliases=[] addrs=[2.3.4.5, 22.23.24.25, 12.13.14.15]}", ss.str());
  697. }
  698. struct ares_options options;
  699. memset(&options, 0, sizeof(options));
  700. int optmask = 0;
  701. EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel_, &options, &optmask));
  702. EXPECT_TRUE((optmask & ARES_OPT_SORTLIST) == ARES_OPT_SORTLIST);
  703. ares_destroy_options(&options);
  704. }
  705. TEST_P(MockChannelTest, SortListV6) {
  706. DNSPacket rsp;
  707. rsp.set_response().set_aa()
  708. .add_question(new DNSQuestion("example.com", ns_t_aaaa))
  709. .add_answer(new DNSAaaaRR("example.com", 100,
  710. {0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  711. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02}))
  712. .add_answer(new DNSAaaaRR("example.com", 100,
  713. {0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  714. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03}));
  715. ON_CALL(server_, OnRequest("example.com", ns_t_aaaa))
  716. .WillByDefault(SetReply(&server_, &rsp));
  717. {
  718. ares_set_sortlist(channel_, "1111::/16 2.3.0.0/255.255.0.0");
  719. HostResult result;
  720. ares_gethostbyname(channel_, "example.com.", AF_INET6, HostCallback, &result);
  721. Process();
  722. EXPECT_TRUE(result.done_);
  723. std::stringstream ss;
  724. ss << result.host_;
  725. EXPECT_EQ("{'example.com' aliases=[] addrs=[1111:0000:0000:0000:0000:0000:0000:0202, "
  726. "2121:0000:0000:0000:0000:0000:0000:0303]}", ss.str());
  727. }
  728. {
  729. ares_set_sortlist(channel_, "2121::/8");
  730. HostResult result;
  731. ares_gethostbyname(channel_, "example.com.", AF_INET6, HostCallback, &result);
  732. Process();
  733. EXPECT_TRUE(result.done_);
  734. std::stringstream ss;
  735. ss << result.host_;
  736. EXPECT_EQ("{'example.com' aliases=[] addrs=[2121:0000:0000:0000:0000:0000:0000:0303, "
  737. "1111:0000:0000:0000:0000:0000:0000:0202]}", ss.str());
  738. }
  739. }
  740. // Relies on retries so is UDP-only
  741. TEST_P(MockUDPChannelTest, SearchDomainsAllocFail) {
  742. DNSPacket nofirst;
  743. nofirst.set_response().set_aa().set_rcode(ns_r_nxdomain)
  744. .add_question(new DNSQuestion("www.first.com", ns_t_a));
  745. ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
  746. .WillByDefault(SetReply(&server_, &nofirst));
  747. DNSPacket nosecond;
  748. nosecond.set_response().set_aa().set_rcode(ns_r_nxdomain)
  749. .add_question(new DNSQuestion("www.second.org", ns_t_a));
  750. ON_CALL(server_, OnRequest("www.second.org", ns_t_a))
  751. .WillByDefault(SetReply(&server_, &nosecond));
  752. DNSPacket yesthird;
  753. yesthird.set_response().set_aa()
  754. .add_question(new DNSQuestion("www.third.gov", ns_t_a))
  755. .add_answer(new DNSARR("www.third.gov", 0x0200, {2, 3, 4, 5}));
  756. ON_CALL(server_, OnRequest("www.third.gov", ns_t_a))
  757. .WillByDefault(SetReply(&server_, &yesthird));
  758. // Fail a variety of different memory allocations, and confirm
  759. // that the operation either fails with ENOMEM or succeeds
  760. // with the expected result.
  761. const int kCount = 34;
  762. HostResult results[kCount];
  763. for (int ii = 1; ii <= kCount; ii++) {
  764. HostResult* result = &(results[ii - 1]);
  765. ClearFails();
  766. SetAllocFail(ii);
  767. ares_gethostbyname(channel_, "www", AF_INET, HostCallback, result);
  768. Process();
  769. EXPECT_TRUE(result->done_);
  770. if (result->status_ == ARES_SUCCESS) {
  771. std::stringstream ss;
  772. ss << result->host_;
  773. EXPECT_EQ("{'www.third.gov' aliases=[] addrs=[2.3.4.5]}", ss.str()) << " failed alloc #" << ii;
  774. if (verbose) std::cerr << "Succeeded despite failure of alloc #" << ii << std::endl;
  775. }
  776. }
  777. // Explicitly destroy the channel now, so that the HostResult objects
  778. // are still valid (in case any pending work refers to them).
  779. ares_destroy(channel_);
  780. channel_ = nullptr;
  781. }
  782. // Relies on retries so is UDP-only
  783. TEST_P(MockUDPChannelTest, Resend) {
  784. std::vector<byte> nothing;
  785. DNSPacket reply;
  786. reply.set_response().set_aa()
  787. .add_question(new DNSQuestion("www.google.com", ns_t_a))
  788. .add_answer(new DNSARR("www.google.com", 0x0100, {0x01, 0x02, 0x03, 0x04}));
  789. EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
  790. .WillOnce(SetReplyData(&server_, nothing))
  791. .WillOnce(SetReplyData(&server_, nothing))
  792. .WillOnce(SetReply(&server_, &reply));
  793. HostResult result;
  794. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  795. Process();
  796. EXPECT_TRUE(result.done_);
  797. EXPECT_EQ(2, result.timeouts_);
  798. std::stringstream ss;
  799. ss << result.host_;
  800. EXPECT_EQ("{'www.google.com' aliases=[] addrs=[1.2.3.4]}", ss.str());
  801. }
  802. TEST_P(MockChannelTest, CancelImmediate) {
  803. HostResult result;
  804. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  805. ares_cancel(channel_);
  806. EXPECT_TRUE(result.done_);
  807. EXPECT_EQ(ARES_ECANCELLED, result.status_);
  808. EXPECT_EQ(0, result.timeouts_);
  809. }
  810. TEST_P(MockChannelTest, CancelImmediateGetHostByAddr) {
  811. HostResult result;
  812. struct in_addr addr;
  813. addr.s_addr = htonl(0x08080808);
  814. ares_gethostbyaddr(channel_, &addr, sizeof(addr), AF_INET, HostCallback, &result);
  815. ares_cancel(channel_);
  816. EXPECT_TRUE(result.done_);
  817. EXPECT_EQ(ARES_ECANCELLED, result.status_);
  818. EXPECT_EQ(0, result.timeouts_);
  819. }
  820. // Relies on retries so is UDP-only
  821. TEST_P(MockUDPChannelTest, CancelLater) {
  822. std::vector<byte> nothing;
  823. // On second request, cancel the channel.
  824. EXPECT_CALL(server_, OnRequest("www.google.com", ns_t_a))
  825. .WillOnce(SetReplyData(&server_, nothing))
  826. .WillOnce(CancelChannel(&server_, channel_));
  827. HostResult result;
  828. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  829. Process();
  830. EXPECT_TRUE(result.done_);
  831. EXPECT_EQ(ARES_ECANCELLED, result.status_);
  832. EXPECT_EQ(0, result.timeouts_);
  833. }
  834. TEST_P(MockChannelTest, GetHostByNameDestroyAbsolute) {
  835. HostResult result;
  836. ares_gethostbyname(channel_, "www.google.com.", AF_INET, HostCallback, &result);
  837. ares_destroy(channel_);
  838. channel_ = nullptr;
  839. EXPECT_TRUE(result.done_); // Synchronous
  840. EXPECT_EQ(ARES_EDESTRUCTION, result.status_);
  841. EXPECT_EQ(0, result.timeouts_);
  842. }
  843. TEST_P(MockChannelTest, GetHostByNameDestroyRelative) {
  844. HostResult result;
  845. ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
  846. ares_destroy(channel_);
  847. channel_ = nullptr;
  848. EXPECT_TRUE(result.done_); // Synchronous
  849. EXPECT_EQ(ARES_EDESTRUCTION, result.status_);
  850. EXPECT_EQ(0, result.timeouts_);
  851. }
  852. TEST_P(MockChannelTest, GetHostByNameCNAMENoData) {
  853. DNSPacket response;
  854. response.set_response().set_aa()
  855. .add_question(new DNSQuestion("cname.first.com", ns_t_a))
  856. .add_answer(new DNSCnameRR("cname.first.com", 100, "a.first.com"));
  857. ON_CALL(server_, OnRequest("cname.first.com", ns_t_a))
  858. .WillByDefault(SetReply(&server_, &response));
  859. HostResult result;
  860. ares_gethostbyname(channel_, "cname.first.com", AF_INET, HostCallback, &result);
  861. Process();
  862. EXPECT_TRUE(result.done_);
  863. EXPECT_EQ(ARES_ENODATA, result.status_);
  864. }
  865. TEST_P(MockChannelTest, GetHostByAddrDestroy) {
  866. unsigned char gdns_addr4[4] = {0x08, 0x08, 0x08, 0x08};
  867. HostResult result;
  868. ares_gethostbyaddr(channel_, gdns_addr4, sizeof(gdns_addr4), AF_INET, HostCallback, &result);
  869. ares_destroy(channel_);
  870. channel_ = nullptr;
  871. EXPECT_TRUE(result.done_); // Synchronous
  872. EXPECT_EQ(ARES_EDESTRUCTION, result.status_);
  873. EXPECT_EQ(0, result.timeouts_);
  874. }
  875. #ifndef WIN32
  876. TEST_P(MockChannelTest, HostAlias) {
  877. DNSPacket reply;
  878. reply.set_response().set_aa()
  879. .add_question(new DNSQuestion("www.google.com", ns_t_a))
  880. .add_answer(new DNSARR("www.google.com", 0x0100, {0x01, 0x02, 0x03, 0x04}));
  881. ON_CALL(server_, OnRequest("www.google.com", ns_t_a))
  882. .WillByDefault(SetReply(&server_, &reply));
  883. TempFile aliases("\n\n# www commentedout\nwww www.google.com\n");
  884. EnvValue with_env("HOSTALIASES", aliases.filename());
  885. HostResult result;
  886. ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
  887. Process();
  888. EXPECT_TRUE(result.done_);
  889. std::stringstream ss;
  890. ss << result.host_;
  891. EXPECT_EQ("{'www.google.com' aliases=[] addrs=[1.2.3.4]}", ss.str());
  892. }
  893. TEST_P(MockChannelTest, HostAliasMissing) {
  894. DNSPacket yesfirst;
  895. yesfirst.set_response().set_aa()
  896. .add_question(new DNSQuestion("www.first.com", ns_t_a))
  897. .add_answer(new DNSARR("www.first.com", 0x0200, {2, 3, 4, 5}));
  898. ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
  899. .WillByDefault(SetReply(&server_, &yesfirst));
  900. TempFile aliases("\n\n# www commentedout\nww www.google.com\n");
  901. EnvValue with_env("HOSTALIASES", aliases.filename());
  902. HostResult result;
  903. ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
  904. Process();
  905. EXPECT_TRUE(result.done_);
  906. std::stringstream ss;
  907. ss << result.host_;
  908. EXPECT_EQ("{'www.first.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
  909. }
  910. TEST_P(MockChannelTest, HostAliasMissingFile) {
  911. DNSPacket yesfirst;
  912. yesfirst.set_response().set_aa()
  913. .add_question(new DNSQuestion("www.first.com", ns_t_a))
  914. .add_answer(new DNSARR("www.first.com", 0x0200, {2, 3, 4, 5}));
  915. ON_CALL(server_, OnRequest("www.first.com", ns_t_a))
  916. .WillByDefault(SetReply(&server_, &yesfirst));
  917. EnvValue with_env("HOSTALIASES", "bogus.mcfile");
  918. HostResult result;
  919. ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
  920. Process();
  921. EXPECT_TRUE(result.done_);
  922. std::stringstream ss;
  923. ss << result.host_;
  924. EXPECT_EQ("{'www.first.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
  925. }
  926. TEST_P(MockChannelTest, HostAliasUnreadable) {
  927. TempFile aliases("www www.google.com\n");
  928. chmod(aliases.filename(), 0);
  929. EnvValue with_env("HOSTALIASES", aliases.filename());
  930. HostResult result;
  931. ares_gethostbyname(channel_, "www", AF_INET, HostCallback, &result);
  932. EXPECT_TRUE(result.done_);
  933. EXPECT_EQ(ARES_EFILE, result.status_);
  934. chmod(aliases.filename(), 0777);
  935. }
  936. #endif
  937. class MockMultiServerChannelTest
  938. : public MockChannelOptsTest,
  939. public ::testing::WithParamInterface< std::pair<int, bool> > {
  940. public:
  941. MockMultiServerChannelTest(bool rotate)
  942. : MockChannelOptsTest(3, GetParam().first, GetParam().second, nullptr, rotate ? ARES_OPT_ROTATE : ARES_OPT_NOROTATE) {}
  943. void CheckExample() {
  944. HostResult result;
  945. ares_gethostbyname(channel_, "www.example.com.", AF_INET, HostCallback, &result);
  946. Process();
  947. EXPECT_TRUE(result.done_);
  948. std::stringstream ss;
  949. ss << result.host_;
  950. EXPECT_EQ("{'www.example.com' aliases=[] addrs=[2.3.4.5]}", ss.str());
  951. }
  952. };
  953. class RotateMultiMockTest : public MockMultiServerChannelTest {
  954. public:
  955. RotateMultiMockTest() : MockMultiServerChannelTest(true) {}
  956. };
  957. class NoRotateMultiMockTest : public MockMultiServerChannelTest {
  958. public:
  959. NoRotateMultiMockTest() : MockMultiServerChannelTest(false) {}
  960. };
  961. TEST_P(RotateMultiMockTest, ThirdServer) {
  962. struct ares_options opts = {0};
  963. int optmask = 0;
  964. EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel_, &opts, &optmask));
  965. EXPECT_EQ(0, (optmask & ARES_OPT_NOROTATE));
  966. ares_destroy_options(&opts);
  967. DNSPacket servfailrsp;
  968. servfailrsp.set_response().set_aa().set_rcode(ns_r_servfail)
  969. .add_question(new DNSQuestion("www.example.com", ns_t_a));
  970. DNSPacket notimplrsp;
  971. notimplrsp.set_response().set_aa().set_rcode(ns_r_notimpl)
  972. .add_question(new DNSQuestion("www.example.com", ns_t_a));
  973. DNSPacket okrsp;
  974. okrsp.set_response().set_aa()
  975. .add_question(new DNSQuestion("www.example.com", ns_t_a))
  976. .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5}));
  977. EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
  978. .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
  979. EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
  980. .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
  981. EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
  982. .WillOnce(SetReply(servers_[2].get(), &okrsp));
  983. CheckExample();
  984. // Second time around, starts from server [1].
  985. EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
  986. .WillOnce(SetReply(servers_[1].get(), &servfailrsp));
  987. EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
  988. .WillOnce(SetReply(servers_[2].get(), &notimplrsp));
  989. EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
  990. .WillOnce(SetReply(servers_[0].get(), &okrsp));
  991. CheckExample();
  992. // Third time around, starts from server [2].
  993. EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
  994. .WillOnce(SetReply(servers_[2].get(), &servfailrsp));
  995. EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
  996. .WillOnce(SetReply(servers_[0].get(), &notimplrsp));
  997. EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
  998. .WillOnce(SetReply(servers_[1].get(), &okrsp));
  999. CheckExample();
  1000. }
  1001. TEST_P(NoRotateMultiMockTest, ThirdServer) {
  1002. struct ares_options opts = {0};
  1003. int optmask = 0;
  1004. EXPECT_EQ(ARES_SUCCESS, ares_save_options(channel_, &opts, &optmask));
  1005. EXPECT_EQ(ARES_OPT_NOROTATE, (optmask & ARES_OPT_NOROTATE));
  1006. ares_destroy_options(&opts);
  1007. DNSPacket servfailrsp;
  1008. servfailrsp.set_response().set_aa().set_rcode(ns_r_servfail)
  1009. .add_question(new DNSQuestion("www.example.com", ns_t_a));
  1010. DNSPacket notimplrsp;
  1011. notimplrsp.set_response().set_aa().set_rcode(ns_r_notimpl)
  1012. .add_question(new DNSQuestion("www.example.com", ns_t_a));
  1013. DNSPacket okrsp;
  1014. okrsp.set_response().set_aa()
  1015. .add_question(new DNSQuestion("www.example.com", ns_t_a))
  1016. .add_answer(new DNSARR("www.example.com", 100, {2,3,4,5}));
  1017. EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
  1018. .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
  1019. EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
  1020. .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
  1021. EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
  1022. .WillOnce(SetReply(servers_[2].get(), &okrsp));
  1023. CheckExample();
  1024. // Second time around, still starts from server [0].
  1025. EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
  1026. .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
  1027. EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
  1028. .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
  1029. EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
  1030. .WillOnce(SetReply(servers_[2].get(), &okrsp));
  1031. CheckExample();
  1032. // Third time around, still starts from server [0].
  1033. EXPECT_CALL(*servers_[0], OnRequest("www.example.com", ns_t_a))
  1034. .WillOnce(SetReply(servers_[0].get(), &servfailrsp));
  1035. EXPECT_CALL(*servers_[1], OnRequest("www.example.com", ns_t_a))
  1036. .WillOnce(SetReply(servers_[1].get(), &notimplrsp));
  1037. EXPECT_CALL(*servers_[2], OnRequest("www.example.com", ns_t_a))
  1038. .WillOnce(SetReply(servers_[2].get(), &okrsp));
  1039. CheckExample();
  1040. }
  1041. INSTANTIATE_TEST_CASE_P(AddressFamilies, MockChannelTest, ::testing::ValuesIn(ares::test::families_modes));
  1042. INSTANTIATE_TEST_CASE_P(AddressFamilies, MockUDPChannelTest, ::testing::ValuesIn(ares::test::families));
  1043. INSTANTIATE_TEST_CASE_P(AddressFamilies, MockTCPChannelTest, ::testing::ValuesIn(ares::test::families));
  1044. INSTANTIATE_TEST_CASE_P(AddressFamilies, MockExtraOptsTest, ::testing::ValuesIn(ares::test::families_modes));
  1045. INSTANTIATE_TEST_CASE_P(AddressFamilies, MockNoCheckRespChannelTest, ::testing::ValuesIn(ares::test::families_modes));
  1046. INSTANTIATE_TEST_CASE_P(AddressFamilies, MockEDNSChannelTest, ::testing::ValuesIn(ares::test::families_modes));
  1047. INSTANTIATE_TEST_CASE_P(TransportModes, RotateMultiMockTest, ::testing::ValuesIn(ares::test::families_modes));
  1048. INSTANTIATE_TEST_CASE_P(TransportModes, NoRotateMultiMockTest, ::testing::ValuesIn(ares::test::families_modes));
  1049. } // namespace test
  1050. } // namespace ares