test-subnet.cc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. /*************************************************************************
  2. *
  3. * Copyright (C) 2018-2023 Ruilin Peng (Nick) <[email protected]>.
  4. *
  5. * smartdns is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * smartdns is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #include "client.h"
  19. #include "dns.h"
  20. #include "include/utils.h"
  21. #include "server.h"
  22. #include "util.h"
  23. #include "gtest/gtest.h"
  24. #include <fstream>
  25. class SubNet : public ::testing::Test
  26. {
  27. protected:
  28. virtual void SetUp() {}
  29. virtual void TearDown() {}
  30. };
  31. TEST_F(SubNet, pass_subnet)
  32. {
  33. smartdns::MockServer server_upstream;
  34. smartdns::Server server;
  35. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  36. if (request->qtype != DNS_T_A) {
  37. return smartdns::SERVER_REQUEST_SOA;
  38. }
  39. struct dns_opt_ecs ecs;
  40. struct dns_rrs *rrs = NULL;
  41. int rr_count = 0;
  42. int i = 0;
  43. int ret = 0;
  44. int has_ecs = 0;
  45. rr_count = 0;
  46. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  47. if (rr_count <= 0) {
  48. return smartdns::SERVER_REQUEST_ERROR;
  49. }
  50. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  51. memset(&ecs, 0, sizeof(ecs));
  52. ret = dns_get_OPT_ECS(rrs, NULL, NULL, &ecs);
  53. if (ret != 0) {
  54. continue;
  55. }
  56. has_ecs = 1;
  57. break;
  58. }
  59. if (has_ecs == 0) {
  60. return smartdns::SERVER_REQUEST_ERROR;
  61. }
  62. if (ecs.family != 1) {
  63. return smartdns::SERVER_REQUEST_ERROR;
  64. }
  65. if (memcmp(ecs.addr, "\x08\x08\x08\x00", 4) != 0) {
  66. return smartdns::SERVER_REQUEST_ERROR;
  67. }
  68. if (ecs.source_prefix != 24) {
  69. return smartdns::SERVER_REQUEST_ERROR;
  70. }
  71. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  72. return smartdns::SERVER_REQUEST_OK;
  73. });
  74. server.Start(R"""(bind [::]:60053
  75. server 127.0.0.1:61053
  76. log-num 0
  77. log-console yes
  78. dualstack-ip-selection no
  79. log-level debug
  80. cache-persist no)""");
  81. smartdns::Client client;
  82. ASSERT_TRUE(client.Query("a.com A +subnet=8.8.8.8/24", 60053));
  83. std::cout << client.GetResult() << std::endl;
  84. ASSERT_EQ(client.GetAnswerNum(), 1);
  85. EXPECT_EQ(client.GetStatus(), "NOERROR");
  86. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  87. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  88. EXPECT_EQ(client.GetAnswer()[0].GetType(), "A");
  89. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  90. }
  91. TEST_F(SubNet, conf)
  92. {
  93. smartdns::MockServer server_upstream;
  94. smartdns::Server server;
  95. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  96. if (request->qtype != DNS_T_A) {
  97. return smartdns::SERVER_REQUEST_SOA;
  98. }
  99. struct dns_opt_ecs ecs;
  100. struct dns_rrs *rrs = NULL;
  101. int rr_count = 0;
  102. int i = 0;
  103. int ret = 0;
  104. int has_ecs = 0;
  105. rr_count = 0;
  106. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  107. if (rr_count <= 0) {
  108. return smartdns::SERVER_REQUEST_ERROR;
  109. }
  110. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  111. memset(&ecs, 0, sizeof(ecs));
  112. ret = dns_get_OPT_ECS(rrs, NULL, NULL, &ecs);
  113. if (ret != 0) {
  114. continue;
  115. }
  116. has_ecs = 1;
  117. break;
  118. }
  119. if (has_ecs == 0) {
  120. return smartdns::SERVER_REQUEST_ERROR;
  121. }
  122. if (ecs.family != DNS_OPT_ECS_FAMILY_IPV4) {
  123. return smartdns::SERVER_REQUEST_ERROR;
  124. }
  125. if (memcmp(ecs.addr, "\x08\x08\x08\x00", 4) != 0) {
  126. return smartdns::SERVER_REQUEST_ERROR;
  127. }
  128. if (ecs.source_prefix != 24) {
  129. return smartdns::SERVER_REQUEST_ERROR;
  130. }
  131. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  132. return smartdns::SERVER_REQUEST_OK;
  133. });
  134. server.Start(R"""(bind [::]:60053
  135. server 127.0.0.1:61053
  136. log-num 0
  137. log-console yes
  138. dualstack-ip-selection no
  139. edns-client-subnet 8.8.8.8/24
  140. log-level debug
  141. cache-persist no)""");
  142. smartdns::Client client;
  143. ASSERT_TRUE(client.Query("a.com A", 60053));
  144. std::cout << client.GetResult() << std::endl;
  145. ASSERT_EQ(client.GetAnswerNum(), 1);
  146. EXPECT_EQ(client.GetStatus(), "NOERROR");
  147. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  148. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  149. EXPECT_EQ(client.GetAnswer()[0].GetType(), "A");
  150. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  151. }
  152. TEST_F(SubNet, conf_v6)
  153. {
  154. smartdns::MockServer server_upstream;
  155. smartdns::Server server;
  156. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  157. if (request->qtype != DNS_T_AAAA) {
  158. return smartdns::SERVER_REQUEST_SOA;
  159. }
  160. struct dns_opt_ecs ecs;
  161. struct dns_rrs *rrs = NULL;
  162. int rr_count = 0;
  163. int i = 0;
  164. int ret = 0;
  165. int has_ecs = 0;
  166. rr_count = 0;
  167. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  168. if (rr_count <= 0) {
  169. return smartdns::SERVER_REQUEST_ERROR;
  170. }
  171. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  172. memset(&ecs, 0, sizeof(ecs));
  173. ret = dns_get_OPT_ECS(rrs, NULL, NULL, &ecs);
  174. if (ret != 0) {
  175. continue;
  176. }
  177. has_ecs = 1;
  178. break;
  179. }
  180. if (has_ecs == 0) {
  181. return smartdns::SERVER_REQUEST_ERROR;
  182. }
  183. if (ecs.family != DNS_OPT_ECS_FAMILY_IPV6) {
  184. return smartdns::SERVER_REQUEST_ERROR;
  185. }
  186. if (memcmp(ecs.addr, "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00", 16) != 0) {
  187. return smartdns::SERVER_REQUEST_ERROR;
  188. }
  189. if (ecs.source_prefix != 64) {
  190. return smartdns::SERVER_REQUEST_ERROR;
  191. }
  192. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::1");
  193. return smartdns::SERVER_REQUEST_OK;
  194. });
  195. server.MockPing(PING_TYPE_ICMP, "2001:db8::1", 60, 70);
  196. server.Start(R"""(bind [::]:60053
  197. server 127.0.0.1:61053
  198. log-num 0
  199. log-console yes
  200. dualstack-ip-selection no
  201. edns-client-subnet ffff:ffff:ffff:ffff:ffff::/64
  202. log-level debug
  203. cache-persist no)""");
  204. smartdns::Client client;
  205. ASSERT_TRUE(client.Query("a.com AAAA", 60053));
  206. std::cout << client.GetResult() << std::endl;
  207. ASSERT_EQ(client.GetAnswerNum(), 1);
  208. EXPECT_EQ(client.GetStatus(), "NOERROR");
  209. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  210. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  211. EXPECT_EQ(client.GetAnswer()[0].GetType(), "AAAA");
  212. EXPECT_EQ(client.GetAnswer()[0].GetData(), "2001:db8::1");
  213. }
  214. TEST_F(SubNet, v4_server_subnet_txt)
  215. {
  216. smartdns::MockServer server_upstream;
  217. smartdns::Server server;
  218. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  219. if (request->qtype != DNS_T_TXT) {
  220. return smartdns::SERVER_REQUEST_SOA;
  221. }
  222. struct dns_opt_ecs ecs;
  223. struct dns_rrs *rrs = NULL;
  224. int rr_count = 0;
  225. int i = 0;
  226. int ret = 0;
  227. int has_ecs = 0;
  228. rr_count = 0;
  229. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  230. if (rr_count <= 0) {
  231. return smartdns::SERVER_REQUEST_ERROR;
  232. }
  233. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  234. memset(&ecs, 0, sizeof(ecs));
  235. ret = dns_get_OPT_ECS(rrs, NULL, NULL, &ecs);
  236. if (ret != 0) {
  237. continue;
  238. }
  239. has_ecs = 1;
  240. break;
  241. }
  242. if (has_ecs == 0) {
  243. return smartdns::SERVER_REQUEST_ERROR;
  244. }
  245. if (ecs.family != DNS_OPT_ECS_FAMILY_IPV4) {
  246. return smartdns::SERVER_REQUEST_ERROR;
  247. }
  248. if (memcmp(ecs.addr, "\x08\x08\x08\x00", 4) != 0) {
  249. return smartdns::SERVER_REQUEST_ERROR;
  250. }
  251. if (ecs.source_prefix != 24) {
  252. return smartdns::SERVER_REQUEST_ERROR;
  253. }
  254. dns_add_TXT(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 6, "hello world");
  255. return smartdns::SERVER_REQUEST_OK;
  256. });
  257. server.Start(R"""(bind [::]:60053
  258. server 127.0.0.1:61053 -subnet 8.8.8.8/24
  259. log-num 0
  260. log-console yes
  261. dualstack-ip-selection no
  262. log-level debug
  263. rr-ttl-min 0
  264. cache-persist no)""");
  265. smartdns::Client client;
  266. ASSERT_TRUE(client.Query("a.com TXT", 60053));
  267. std::cout << client.GetResult() << std::endl;
  268. ASSERT_EQ(client.GetAnswerNum(), 1);
  269. EXPECT_EQ(client.GetStatus(), "NOERROR");
  270. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  271. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 6);
  272. EXPECT_EQ(client.GetAnswer()[0].GetType(), "TXT");
  273. EXPECT_EQ(client.GetAnswer()[0].GetData(), "\"hello world\"");
  274. }
  275. TEST_F(SubNet, v6_default_subnet_txt)
  276. {
  277. smartdns::MockServer server_upstream;
  278. smartdns::Server server;
  279. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  280. if (request->qtype != DNS_T_TXT) {
  281. return smartdns::SERVER_REQUEST_SOA;
  282. }
  283. struct dns_opt_ecs ecs;
  284. struct dns_rrs *rrs = NULL;
  285. int rr_count = 0;
  286. int i = 0;
  287. int ret = 0;
  288. int has_ecs = 0;
  289. rr_count = 0;
  290. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  291. if (rr_count <= 0) {
  292. return smartdns::SERVER_REQUEST_ERROR;
  293. }
  294. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  295. memset(&ecs, 0, sizeof(ecs));
  296. ret = dns_get_OPT_ECS(rrs, NULL, NULL, &ecs);
  297. if (ret != 0) {
  298. continue;
  299. }
  300. has_ecs = 1;
  301. break;
  302. }
  303. if (has_ecs == 0) {
  304. return smartdns::SERVER_REQUEST_ERROR;
  305. }
  306. if (ecs.family != DNS_OPT_ECS_FAMILY_IPV6) {
  307. return smartdns::SERVER_REQUEST_ERROR;
  308. }
  309. if (memcmp(ecs.addr, "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00", 16) != 0) {
  310. return smartdns::SERVER_REQUEST_ERROR;
  311. }
  312. if (ecs.source_prefix != 64) {
  313. return smartdns::SERVER_REQUEST_ERROR;
  314. }
  315. dns_add_TXT(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 6, "hello world");
  316. return smartdns::SERVER_REQUEST_OK;
  317. });
  318. server.Start(R"""(bind [::]:60053
  319. server 127.0.0.1:61053
  320. log-num 0
  321. log-console yes
  322. dualstack-ip-selection no
  323. rr-ttl-min 0
  324. edns-client-subnet ffff:ffff:ffff:ffff:ffff::/64
  325. log-level debug
  326. cache-persist no)""");
  327. smartdns::Client client;
  328. ASSERT_TRUE(client.Query("a.com TXT", 60053));
  329. std::cout << client.GetResult() << std::endl;
  330. ASSERT_EQ(client.GetAnswerNum(), 1);
  331. EXPECT_EQ(client.GetStatus(), "NOERROR");
  332. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  333. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 6);
  334. EXPECT_EQ(client.GetAnswer()[0].GetType(), "TXT");
  335. EXPECT_EQ(client.GetAnswer()[0].GetData(), "\"hello world\"");
  336. }
  337. TEST_F(SubNet, per_server)
  338. {
  339. smartdns::MockServer server_upstream1;
  340. smartdns::MockServer server_upstream2;
  341. smartdns::Server server;
  342. server_upstream1.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  343. if (request->qtype == DNS_T_A) {
  344. struct dns_opt_ecs ecs;
  345. struct dns_rrs *rrs = NULL;
  346. int rr_count = 0;
  347. int i = 0;
  348. int ret = 0;
  349. int has_ecs = 0;
  350. rr_count = 0;
  351. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  352. if (rr_count <= 0) {
  353. return smartdns::SERVER_REQUEST_ERROR;
  354. }
  355. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  356. memset(&ecs, 0, sizeof(ecs));
  357. ret = dns_get_OPT_ECS(rrs, NULL, NULL, &ecs);
  358. if (ret != 0) {
  359. continue;
  360. }
  361. has_ecs = 1;
  362. break;
  363. }
  364. if (has_ecs == 1) {
  365. return smartdns::SERVER_REQUEST_ERROR;
  366. }
  367. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  368. return smartdns::SERVER_REQUEST_OK;
  369. }
  370. if (request->qtype == DNS_T_AAAA) {
  371. struct dns_opt_ecs ecs;
  372. struct dns_rrs *rrs = NULL;
  373. int rr_count = 0;
  374. int i = 0;
  375. int ret = 0;
  376. int has_ecs = 0;
  377. rr_count = 0;
  378. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  379. if (rr_count <= 0) {
  380. return smartdns::SERVER_REQUEST_ERROR;
  381. }
  382. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  383. memset(&ecs, 0, sizeof(ecs));
  384. ret = dns_get_OPT_ECS(rrs, NULL, NULL, &ecs);
  385. if (ret != 0) {
  386. continue;
  387. }
  388. has_ecs = 1;
  389. break;
  390. }
  391. if (has_ecs == 1) {
  392. return smartdns::SERVER_REQUEST_ERROR;
  393. }
  394. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::1");
  395. return smartdns::SERVER_REQUEST_OK;
  396. }
  397. return smartdns::SERVER_REQUEST_SOA;
  398. });
  399. server_upstream2.Start("udp://0.0.0.0:62053", [&](struct smartdns::ServerRequestContext *request) {
  400. if (request->qtype == DNS_T_A) {
  401. struct dns_opt_ecs ecs;
  402. struct dns_rrs *rrs = NULL;
  403. int rr_count = 0;
  404. int i = 0;
  405. int ret = 0;
  406. int has_ecs = 0;
  407. rr_count = 0;
  408. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  409. if (rr_count <= 0) {
  410. return smartdns::SERVER_REQUEST_ERROR;
  411. }
  412. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  413. memset(&ecs, 0, sizeof(ecs));
  414. ret = dns_get_OPT_ECS(rrs, NULL, NULL, &ecs);
  415. if (ret != 0) {
  416. continue;
  417. }
  418. has_ecs = 1;
  419. break;
  420. }
  421. if (has_ecs == 0) {
  422. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  423. return smartdns::SERVER_REQUEST_OK;
  424. }
  425. if (ecs.family != DNS_OPT_ECS_FAMILY_IPV4) {
  426. return smartdns::SERVER_REQUEST_ERROR;
  427. }
  428. if (memcmp(ecs.addr, "\x08\x08\x08\x00", 4) != 0) {
  429. return smartdns::SERVER_REQUEST_ERROR;
  430. }
  431. if (ecs.source_prefix != 24) {
  432. return smartdns::SERVER_REQUEST_ERROR;
  433. }
  434. smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
  435. return smartdns::SERVER_REQUEST_OK;
  436. }
  437. if (request->qtype = DNS_T_AAAA) {
  438. struct dns_opt_ecs ecs;
  439. struct dns_rrs *rrs = NULL;
  440. int rr_count = 0;
  441. int i = 0;
  442. int ret = 0;
  443. int has_ecs = 0;
  444. rr_count = 0;
  445. rrs = dns_get_rrs_start(request->packet, DNS_RRS_OPT, &rr_count);
  446. if (rr_count <= 0) {
  447. return smartdns::SERVER_REQUEST_ERROR;
  448. }
  449. for (i = 0; i < rr_count && rrs; i++, rrs = dns_get_rrs_next(request->packet, rrs)) {
  450. memset(&ecs, 0, sizeof(ecs));
  451. ret = dns_get_OPT_ECS(rrs, NULL, NULL, &ecs);
  452. if (ret != 0) {
  453. continue;
  454. }
  455. has_ecs = 1;
  456. break;
  457. }
  458. if (has_ecs == 0) {
  459. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::1");
  460. return smartdns::SERVER_REQUEST_ERROR;
  461. }
  462. if (ecs.family != DNS_OPT_ECS_FAMILY_IPV6) {
  463. return smartdns::SERVER_REQUEST_ERROR;
  464. }
  465. if (memcmp(ecs.addr, "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00", 16) != 0) {
  466. return smartdns::SERVER_REQUEST_ERROR;
  467. }
  468. if (ecs.source_prefix != 64) {
  469. return smartdns::SERVER_REQUEST_ERROR;
  470. }
  471. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::2");
  472. return smartdns::SERVER_REQUEST_OK;
  473. }
  474. return smartdns::SERVER_REQUEST_SOA;
  475. });
  476. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 100);
  477. server.MockPing(PING_TYPE_ICMP, "5.6.7.8", 60, 10);
  478. server.MockPing(PING_TYPE_ICMP, "2001:db8::1", 60, 100);
  479. server.MockPing(PING_TYPE_ICMP, "2001:db8::2", 60, 10);
  480. server.Start(R"""(bind [::]:60053
  481. server 127.0.0.1:62053 -subnet=8.8.8.8/24 -subnet=ffff:ffff:ffff:ffff:ffff::/64
  482. server 127.0.0.1:61053
  483. log-num 0
  484. log-console yes
  485. dualstack-ip-selection no
  486. log-level debug
  487. cache-persist no)""");
  488. smartdns::Client client;
  489. ASSERT_TRUE(client.Query("a.com A", 60053));
  490. std::cout << client.GetResult() << std::endl;
  491. ASSERT_EQ(client.GetAnswerNum(), 1);
  492. EXPECT_EQ(client.GetStatus(), "NOERROR");
  493. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  494. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  495. EXPECT_EQ(client.GetAnswer()[0].GetType(), "A");
  496. EXPECT_EQ(client.GetAnswer()[0].GetData(), "5.6.7.8");
  497. ASSERT_TRUE(client.Query("a.com AAAA", 60053));
  498. std::cout << client.GetResult() << std::endl;
  499. ASSERT_EQ(client.GetAnswerNum(), 1);
  500. EXPECT_EQ(client.GetStatus(), "NOERROR");
  501. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  502. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  503. EXPECT_EQ(client.GetAnswer()[0].GetType(), "AAAA");
  504. EXPECT_EQ(client.GetAnswer()[0].GetData(), "2001:db8::2");
  505. }