test-group.cc 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. /*************************************************************************
  2. *
  3. * Copyright (C) 2018-2025 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 "smartdns/dns.h"
  20. #include "include/utils.h"
  21. #include "server.h"
  22. #include "gtest/gtest.h"
  23. class Group : public ::testing::Test
  24. {
  25. protected:
  26. virtual void SetUp() {}
  27. virtual void TearDown() {}
  28. };
  29. TEST_F(Group, conf_file)
  30. {
  31. smartdns::MockServer server_upstream;
  32. smartdns::MockServer server_upstream2;
  33. smartdns::Server server;
  34. std::string file = "/tmp/smartdns_conf_file" + smartdns::GenerateRandomString(5) + ".conf";
  35. std::ofstream ofs(file);
  36. ASSERT_TRUE(ofs.is_open());
  37. Defer
  38. {
  39. ofs.close();
  40. unlink(file.c_str());
  41. };
  42. ofs << R"""(
  43. server udp://127.0.0.1:61053 -e
  44. client-rules 127.0.0.1
  45. address /a.com/1.1.1.1
  46. domain-rules /b.com/ -address 4.5.6.7
  47. # should pop all groups
  48. group-begin dummy
  49. address /a.com/9.9.9.9
  50. )""";
  51. ofs.flush();
  52. server_upstream.Start("udp://0.0.0.0:61053", [](struct smartdns::ServerRequestContext *request) {
  53. if (request->qtype != DNS_T_A) {
  54. return smartdns::SERVER_REQUEST_SOA;
  55. }
  56. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
  57. return smartdns::SERVER_REQUEST_OK;
  58. });
  59. server_upstream2.Start("udp://0.0.0.0:62053",
  60. [](struct smartdns::ServerRequestContext *request) { return smartdns::SERVER_REQUEST_SOA; });
  61. /* this ip will be discard, but is reachable */
  62. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10);
  63. server.Start(R"""(bind [::]:60053
  64. conf-file /tmp/smartdns_conf_file*.conf -g client
  65. server udp://127.0.0.1:61053
  66. )""");
  67. smartdns::Client client;
  68. ASSERT_TRUE(client.Query("a.com", 60053));
  69. std::cout << client.GetResult() << std::endl;
  70. ASSERT_EQ(client.GetAnswerNum(), 1);
  71. EXPECT_EQ(client.GetStatus(), "NOERROR");
  72. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  73. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.1.1.1");
  74. ASSERT_TRUE(client.Query("b.com", 60053));
  75. std::cout << client.GetResult() << std::endl;
  76. ASSERT_EQ(client.GetAnswerNum(), 1);
  77. EXPECT_EQ(client.GetStatus(), "NOERROR");
  78. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  79. EXPECT_EQ(client.GetAnswer()[0].GetData(), "4.5.6.7");
  80. auto ipaddr = smartdns::GetAvailableIPAddresses();
  81. if (ipaddr.size() > 0) {
  82. ASSERT_TRUE(client.Query("a.com", 60053, ipaddr[0]));
  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].GetData(), "1.2.3.4");
  88. }
  89. }
  90. TEST_F(Group, conf_file_ip_rule)
  91. {
  92. smartdns::MockServer server_upstream;
  93. smartdns::MockServer server_upstream2;
  94. smartdns::Server server;
  95. std::string file = "/tmp/smartdns_conf_file" + smartdns::GenerateRandomString(5) + ".conf";
  96. std::ofstream ofs(file);
  97. ASSERT_TRUE(ofs.is_open());
  98. Defer
  99. {
  100. ofs.close();
  101. unlink(file.c_str());
  102. };
  103. ofs << R"""(
  104. server udp://127.0.0.1:61053 -e
  105. client-rules 127.0.0.1
  106. ignore-ip 7.8.9.10
  107. group-begin dummy
  108. ignore-ip 1.2.3.4
  109. ignore-ip 7.8.9.10
  110. )""";
  111. ofs.flush();
  112. server_upstream.Start("udp://0.0.0.0:61053", [](struct smartdns::ServerRequestContext *request) {
  113. if (request->qtype != DNS_T_A) {
  114. return smartdns::SERVER_REQUEST_SOA;
  115. }
  116. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
  117. smartdns::MockServer::AddIP(request, request->domain.c_str(), "7.8.9.10", 611);
  118. return smartdns::SERVER_REQUEST_OK;
  119. });
  120. server_upstream2.Start("udp://0.0.0.0:62053",
  121. [](struct smartdns::ServerRequestContext *request) { return smartdns::SERVER_REQUEST_SOA; });
  122. /* this ip will be discard, but is reachable */
  123. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 20);
  124. server.MockPing(PING_TYPE_ICMP, "7.8.9.10", 60, 10);
  125. server.Start(R"""(bind [::]:60053
  126. conf-file /tmp/smartdns_conf_file*.conf -g client
  127. server udp://127.0.0.1:61053
  128. ignore-ip 1.2.3.4
  129. )""");
  130. smartdns::Client client;
  131. ASSERT_TRUE(client.Query("a.com", 60053));
  132. std::cout << client.GetResult() << std::endl;
  133. ASSERT_EQ(client.GetAnswerNum(), 1);
  134. EXPECT_EQ(client.GetStatus(), "NOERROR");
  135. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  136. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  137. auto ipaddr = smartdns::GetAvailableIPAddresses();
  138. if (ipaddr.size() > 0) {
  139. ASSERT_TRUE(client.Query("a.com", 60053, ipaddr[0]));
  140. std::cout << client.GetResult() << std::endl;
  141. ASSERT_EQ(client.GetAnswerNum(), 1);
  142. EXPECT_EQ(client.GetStatus(), "NOERROR");
  143. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  144. EXPECT_EQ(client.GetAnswer()[0].GetData(), "7.8.9.10");
  145. }
  146. }
  147. TEST_F(Group, speed_check)
  148. {
  149. smartdns::MockServer server_upstream;
  150. smartdns::MockServer server_upstream2;
  151. smartdns::Server server;
  152. std::string file = "/tmp/smartdns_conf_file" + smartdns::GenerateRandomString(5) + ".conf";
  153. std::ofstream ofs(file);
  154. ASSERT_TRUE(ofs.is_open());
  155. Defer
  156. {
  157. ofs.close();
  158. unlink(file.c_str());
  159. };
  160. ofs << R"""(
  161. server udp://127.0.0.1:61053 -e
  162. client-rules 127.0.0.1
  163. speed-check-mode none
  164. )""";
  165. ofs.flush();
  166. server_upstream.Start("udp://0.0.0.0:61053", [](struct smartdns::ServerRequestContext *request) {
  167. if (request->qtype != DNS_T_A) {
  168. return smartdns::SERVER_REQUEST_SOA;
  169. }
  170. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
  171. smartdns::MockServer::AddIP(request, request->domain.c_str(), "7.8.9.10", 611);
  172. return smartdns::SERVER_REQUEST_OK;
  173. });
  174. server_upstream2.Start("udp://0.0.0.0:62053",
  175. [](struct smartdns::ServerRequestContext *request) { return smartdns::SERVER_REQUEST_SOA; });
  176. /* this ip will be discard, but is reachable */
  177. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 20);
  178. server.MockPing(PING_TYPE_ICMP, "7.8.9.10", 60, 10);
  179. server.Start(R"""(bind [::]:60053
  180. conf-file /tmp/smartdns_conf_file*.conf -g client
  181. server udp://127.0.0.1:61053
  182. )""");
  183. smartdns::Client client;
  184. ASSERT_TRUE(client.Query("a.com", 60053));
  185. std::cout << client.GetResult() << std::endl;
  186. ASSERT_EQ(client.GetAnswerNum(), 2);
  187. EXPECT_EQ(client.GetStatus(), "NOERROR");
  188. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  189. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  190. EXPECT_EQ(client.GetAnswer()[1].GetData(), "7.8.9.10");
  191. auto ipaddr = smartdns::GetAvailableIPAddresses();
  192. if (ipaddr.size() > 0) {
  193. ASSERT_TRUE(client.Query("a.com", 60053, ipaddr[0]));
  194. std::cout << client.GetResult() << std::endl;
  195. ASSERT_EQ(client.GetAnswerNum(), 1);
  196. EXPECT_EQ(client.GetStatus(), "NOERROR");
  197. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  198. EXPECT_EQ(client.GetAnswer()[0].GetData(), "7.8.9.10");
  199. }
  200. }
  201. TEST_F(Group, conf_inherit)
  202. {
  203. smartdns::MockServer server_upstream;
  204. smartdns::Server server;
  205. std::string file = "/tmp/smartdns_conf_file" + smartdns::GenerateRandomString(5) + ".conf";
  206. std::ofstream ofs(file);
  207. ASSERT_TRUE(ofs.is_open());
  208. Defer
  209. {
  210. ofs.close();
  211. unlink(file.c_str());
  212. };
  213. ofs << R"""(
  214. server udp://127.0.0.1:61053 -e
  215. client-rules 127.0.0.1
  216. )""";
  217. ofs.flush();
  218. server_upstream.Start("udp://0.0.0.0:61053", [](struct smartdns::ServerRequestContext *request) {
  219. if (request->qtype == DNS_T_AAAA) {
  220. smartdns::MockServer::AddIP(request, request->domain.c_str(), "64:ff9b::102:304", 700);
  221. return smartdns::SERVER_REQUEST_OK;
  222. } else if (request->qtype == DNS_T_A) {
  223. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
  224. smartdns::MockServer::AddIP(request, request->domain.c_str(), "7.8.9.10", 611);
  225. return smartdns::SERVER_REQUEST_OK;
  226. } else if (request->qtype == DNS_T_TXT) {
  227. dns_add_TXT(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 6, "hello world");
  228. return smartdns::SERVER_REQUEST_OK;
  229. } else {
  230. return smartdns::SERVER_REQUEST_SOA;
  231. }
  232. });
  233. /* this ip will be discard, but is reachable */
  234. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 50);
  235. server.MockPing(PING_TYPE_ICMP, "7.8.9.10", 60, 10);
  236. server.MockPing(PING_TYPE_ICMP, "64:ff9b::102:304", 60, 10);
  237. server.Start(R"""(bind [::]:60053
  238. server udp://127.0.0.1:61053
  239. group-begin dummy
  240. speed-check-mode none
  241. force-AAAA-SOA yes
  242. force-qtype-SOA 16
  243. conf-file /tmp/smartdns_conf_file*.conf -g client
  244. )""");
  245. smartdns::Client client;
  246. ASSERT_TRUE(client.Query("a.com", 60053));
  247. std::cout << client.GetResult() << std::endl;
  248. ASSERT_EQ(client.GetAnswerNum(), 2);
  249. EXPECT_EQ(client.GetStatus(), "NOERROR");
  250. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  251. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  252. EXPECT_EQ(client.GetAnswer()[1].GetData(), "7.8.9.10");
  253. ASSERT_TRUE(client.Query("b.com AAAA", 60053));
  254. std::cout << client.GetResult() << std::endl;
  255. ASSERT_EQ(client.GetAnswerNum(), 0);
  256. EXPECT_EQ(client.GetStatus(), "NOERROR");
  257. ASSERT_TRUE(client.Query("c.com TXT", 60053));
  258. std::cout << client.GetResult() << std::endl;
  259. ASSERT_EQ(client.GetAnswerNum(), 0);
  260. EXPECT_EQ(client.GetStatus(), "NOERROR");
  261. auto ipaddr = smartdns::GetAvailableIPAddresses();
  262. if (ipaddr.size() > 0) {
  263. ASSERT_TRUE(client.Query("a.com", 60053, ipaddr[0]));
  264. std::cout << client.GetResult() << std::endl;
  265. ASSERT_EQ(client.GetAnswerNum(), 1);
  266. EXPECT_EQ(client.GetStatus(), "NOERROR");
  267. EXPECT_EQ(client.GetAnswer()[0].GetData(), "7.8.9.10");
  268. ASSERT_TRUE(client.Query("b.com AAAA", 60053, ipaddr[0]));
  269. std::cout << client.GetResult() << std::endl;
  270. ASSERT_EQ(client.GetAnswerNum(), 1);
  271. EXPECT_EQ(client.GetStatus(), "NOERROR");
  272. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  273. EXPECT_EQ(client.GetAnswer()[0].GetData(), "64:ff9b::102:304");
  274. ASSERT_TRUE(client.Query("c.com TXT", 60053, ipaddr[0]));
  275. std::cout << client.GetResult() << std::endl;
  276. ASSERT_EQ(client.GetAnswerNum(), 1);
  277. EXPECT_EQ(client.GetStatus(), "NOERROR");
  278. EXPECT_EQ(client.GetAnswer()[0].GetName(), "c.com");
  279. EXPECT_EQ(client.GetAnswer()[0].GetData(), "\"hello world\"");
  280. }
  281. }
  282. TEST_F(Group, dualstack_inherit_ipv4_prefer)
  283. {
  284. smartdns::MockServer server_upstream;
  285. smartdns::Server server;
  286. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  287. if (request->qtype == DNS_T_A) {
  288. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  289. smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
  290. return smartdns::SERVER_REQUEST_OK;
  291. } else if (request->qtype == DNS_T_AAAA) {
  292. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::1");
  293. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::2");
  294. return smartdns::SERVER_REQUEST_OK;
  295. }
  296. return smartdns::SERVER_REQUEST_SOA;
  297. });
  298. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 80);
  299. server.MockPing(PING_TYPE_ICMP, "5.6.7.8", 60, 110);
  300. server.MockPing(PING_TYPE_ICMP, "2001:db8::1", 60, 150);
  301. server.MockPing(PING_TYPE_ICMP, "2001:db8::2", 60, 200);
  302. server.Start(R"""(bind [::]:60053
  303. server 127.0.0.1:61053
  304. speed-check-mode ping
  305. group-begin dummy
  306. group-begin client
  307. dualstack-ip-selection no
  308. client-rules 127.0.0.1
  309. )""");
  310. smartdns::Client client;
  311. ASSERT_TRUE(client.Query("a.com AAAA", 60053));
  312. std::cout << client.GetResult() << std::endl;
  313. ASSERT_EQ(client.GetAnswerNum(), 1);
  314. EXPECT_EQ(client.GetStatus(), "NOERROR");
  315. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  316. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  317. EXPECT_EQ(client.GetAnswer()[0].GetData(), "2001:db8::1");
  318. ASSERT_TRUE(client.Query("a.com", 60053));
  319. std::cout << client.GetResult() << std::endl;
  320. ASSERT_EQ(client.GetAnswerNum(), 1);
  321. EXPECT_EQ(client.GetStatus(), "NOERROR");
  322. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  323. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  324. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  325. auto ipaddr = smartdns::GetAvailableIPAddresses();
  326. if (ipaddr.size() > 0) {
  327. ASSERT_TRUE(client.Query("a.com AAAA", 60053, ipaddr[0]));
  328. std::cout << client.GetResult() << std::endl;
  329. ASSERT_EQ(client.GetAuthorityNum(), 1);
  330. EXPECT_EQ(client.GetStatus(), "NOERROR");
  331. EXPECT_EQ(client.GetAuthority()[0].GetName(), "a.com");
  332. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 3);
  333. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  334. ASSERT_TRUE(client.Query("a.com", 60053, ipaddr[0]));
  335. std::cout << client.GetResult() << std::endl;
  336. ASSERT_EQ(client.GetAnswerNum(), 1);
  337. EXPECT_EQ(client.GetStatus(), "NOERROR");
  338. EXPECT_LT(client.GetQueryTime(), 20);
  339. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  340. EXPECT_GT(client.GetAnswer()[0].GetTTL(), 597);
  341. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  342. }
  343. }
  344. TEST_F(Group, group_match_client_ip)
  345. {
  346. smartdns::MockServer server_upstream;
  347. smartdns::Server server;
  348. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  349. if (request->qtype == DNS_T_A) {
  350. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  351. smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
  352. return smartdns::SERVER_REQUEST_OK;
  353. } else if (request->qtype == DNS_T_AAAA) {
  354. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::1");
  355. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::2");
  356. return smartdns::SERVER_REQUEST_OK;
  357. }
  358. return smartdns::SERVER_REQUEST_SOA;
  359. });
  360. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 80);
  361. server.MockPing(PING_TYPE_ICMP, "5.6.7.8", 60, 110);
  362. server.MockPing(PING_TYPE_ICMP, "2001:db8::1", 60, 150);
  363. server.MockPing(PING_TYPE_ICMP, "2001:db8::2", 60, 200);
  364. server.Start(R"""(bind [::]:60053
  365. server 127.0.0.1:61053
  366. speed-check-mode ping
  367. group-begin client
  368. dualstack-ip-selection no
  369. group-match -client-ip 127.0.0.1
  370. )""");
  371. smartdns::Client client;
  372. ASSERT_TRUE(client.Query("a.com AAAA", 60053));
  373. std::cout << client.GetResult() << std::endl;
  374. ASSERT_EQ(client.GetAnswerNum(), 1);
  375. EXPECT_EQ(client.GetStatus(), "NOERROR");
  376. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  377. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  378. EXPECT_EQ(client.GetAnswer()[0].GetData(), "2001:db8::1");
  379. ASSERT_TRUE(client.Query("a.com", 60053));
  380. std::cout << client.GetResult() << std::endl;
  381. ASSERT_EQ(client.GetAnswerNum(), 1);
  382. EXPECT_EQ(client.GetStatus(), "NOERROR");
  383. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  384. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  385. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  386. auto ipaddr = smartdns::GetAvailableIPAddresses();
  387. if (ipaddr.size() > 0) {
  388. ASSERT_TRUE(client.Query("a.com AAAA", 60053, ipaddr[0]));
  389. std::cout << client.GetResult() << std::endl;
  390. ASSERT_EQ(client.GetAuthorityNum(), 1);
  391. EXPECT_EQ(client.GetStatus(), "NOERROR");
  392. EXPECT_EQ(client.GetAuthority()[0].GetName(), "a.com");
  393. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 3);
  394. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  395. ASSERT_TRUE(client.Query("a.com", 60053, ipaddr[0]));
  396. std::cout << client.GetResult() << std::endl;
  397. ASSERT_EQ(client.GetAnswerNum(), 1);
  398. EXPECT_EQ(client.GetStatus(), "NOERROR");
  399. EXPECT_LT(client.GetQueryTime(), 20);
  400. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  401. EXPECT_GT(client.GetAnswer()[0].GetTTL(), 597);
  402. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  403. }
  404. }
  405. TEST_F(Group, group_match_domain)
  406. {
  407. smartdns::MockServer server_upstream;
  408. smartdns::Server server;
  409. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  410. if (request->qtype == DNS_T_A) {
  411. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  412. smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
  413. return smartdns::SERVER_REQUEST_OK;
  414. } else if (request->qtype == DNS_T_AAAA) {
  415. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::1");
  416. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::2");
  417. return smartdns::SERVER_REQUEST_OK;
  418. }
  419. return smartdns::SERVER_REQUEST_SOA;
  420. });
  421. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 80);
  422. server.MockPing(PING_TYPE_ICMP, "5.6.7.8", 60, 110);
  423. server.MockPing(PING_TYPE_ICMP, "2001:db8::1", 60, 150);
  424. server.MockPing(PING_TYPE_ICMP, "2001:db8::2", 60, 200);
  425. server.Start(R"""(bind [::]:60053
  426. server 127.0.0.1:61053
  427. speed-check-mode none
  428. group-begin client
  429. address #6
  430. group-match -domain a.com
  431. )""");
  432. smartdns::Client client;
  433. ASSERT_TRUE(client.Query("a.com AAAA", 60053));
  434. std::cout << client.GetResult() << std::endl;
  435. ASSERT_EQ(client.GetAuthorityNum(), 1);
  436. EXPECT_EQ(client.GetStatus(), "NOERROR");
  437. EXPECT_EQ(client.GetAuthority()[0].GetName(), "a.com");
  438. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 30);
  439. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  440. ASSERT_TRUE(client.Query("a.com", 60053));
  441. std::cout << client.GetResult() << std::endl;
  442. ASSERT_EQ(client.GetAnswerNum(), 2);
  443. EXPECT_EQ(client.GetStatus(), "NOERROR");
  444. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  445. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  446. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  447. EXPECT_EQ(client.GetAnswer()[1].GetData(), "5.6.7.8");
  448. ASSERT_TRUE(client.Query("b.com AAAA", 60053));
  449. std::cout << client.GetResult() << std::endl;
  450. ASSERT_EQ(client.GetAnswerNum(), 2);
  451. EXPECT_EQ(client.GetStatus(), "NOERROR");
  452. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  453. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  454. EXPECT_EQ(client.GetAnswer()[0].GetData(), "2001:db8::1");
  455. EXPECT_EQ(client.GetAnswer()[1].GetData(), "2001:db8::2");
  456. ASSERT_TRUE(client.Query("b.com", 60053));
  457. std::cout << client.GetResult() << std::endl;
  458. ASSERT_EQ(client.GetAnswerNum(), 2);
  459. EXPECT_EQ(client.GetStatus(), "NOERROR");
  460. EXPECT_LT(client.GetQueryTime(), 20);
  461. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  462. EXPECT_GT(client.GetAnswer()[0].GetTTL(), 597);
  463. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  464. EXPECT_EQ(client.GetAnswer()[1].GetData(), "5.6.7.8");
  465. }
  466. TEST_F(Group, group_from_bind)
  467. {
  468. smartdns::MockServer server_upstream;
  469. smartdns::Server server;
  470. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  471. if (request->qtype == DNS_T_A) {
  472. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  473. smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
  474. return smartdns::SERVER_REQUEST_OK;
  475. } else if (request->qtype == DNS_T_AAAA) {
  476. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::1");
  477. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::2");
  478. return smartdns::SERVER_REQUEST_OK;
  479. }
  480. return smartdns::SERVER_REQUEST_SOA;
  481. });
  482. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 80);
  483. server.MockPing(PING_TYPE_ICMP, "5.6.7.8", 60, 110);
  484. server.MockPing(PING_TYPE_ICMP, "2001:db8::1", 60, 150);
  485. server.MockPing(PING_TYPE_ICMP, "2001:db8::2", 60, 200);
  486. server.Start(R"""(bind [::]:60053
  487. bind [::]:60054 -g client
  488. server 127.0.0.1:61053
  489. speed-check-mode none
  490. group-begin client
  491. address 1.1.1.1
  492. group-match -domain b.com
  493. )""");
  494. smartdns::Client client;
  495. ASSERT_TRUE(client.Query("a.com", 60053));
  496. std::cout << client.GetResult() << std::endl;
  497. ASSERT_EQ(client.GetAnswerNum(), 2);
  498. EXPECT_EQ(client.GetStatus(), "NOERROR");
  499. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  500. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  501. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  502. EXPECT_EQ(client.GetAnswer()[1].GetData(), "5.6.7.8");
  503. ASSERT_TRUE(client.Query("b.com", 60053));
  504. std::cout << client.GetResult() << std::endl;
  505. ASSERT_EQ(client.GetAnswerNum(), 1);
  506. EXPECT_EQ(client.GetStatus(), "NOERROR");
  507. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  508. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  509. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.1.1.1");
  510. ASSERT_TRUE(client.Query("a.com", 60054));
  511. std::cout << client.GetResult() << std::endl;
  512. ASSERT_EQ(client.GetAnswerNum(), 1);
  513. EXPECT_EQ(client.GetStatus(), "NOERROR");
  514. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  515. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  516. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.1.1.1");
  517. }
  518. TEST_F(Group, server_group_exclude_default)
  519. {
  520. smartdns::MockServer server_upstream;
  521. smartdns::MockServer server_upstream1;
  522. smartdns::Server server;
  523. server_upstream.Start("udp://0.0.0.0:61053", [](struct smartdns::ServerRequestContext *request) {
  524. if (request->qtype != DNS_T_A) {
  525. return smartdns::SERVER_REQUEST_SOA;
  526. }
  527. usleep(50000);
  528. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
  529. return smartdns::SERVER_REQUEST_OK;
  530. });
  531. server_upstream1.Start("udp://0.0.0.0:62053",
  532. [](struct smartdns::ServerRequestContext *request) { return smartdns::SERVER_REQUEST_SOA; });
  533. server.MockPing(PING_TYPE_ICMP, "2001::", 128, 10000);
  534. server.Start(R"""(bind [::]:60053
  535. bind-tcp [::]:60053
  536. group-begin client
  537. server 127.0.0.1:61053
  538. group-end
  539. server 127.0.0.1:62053
  540. )""");
  541. smartdns::Client client;
  542. ASSERT_TRUE(client.Query("a.com", 60053));
  543. std::cout << client.GetResult() << std::endl;
  544. ASSERT_EQ(client.GetAuthorityNum(), 1);
  545. EXPECT_EQ(client.GetStatus(), "NXDOMAIN");
  546. EXPECT_EQ(client.GetAuthority()[0].GetName(), "a.com");
  547. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 600);
  548. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  549. }
  550. TEST_F(Group, group_inherit)
  551. {
  552. smartdns::Server server;
  553. smartdns::MockServer server_upstream;
  554. server_upstream.Start("udp://0.0.0.0:61056", [](struct smartdns::ServerRequestContext *request) {
  555. if (request->qtype != DNS_T_A) {
  556. return smartdns::SERVER_REQUEST_SOA;
  557. }
  558. usleep(50000);
  559. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
  560. return smartdns::SERVER_REQUEST_OK;
  561. });
  562. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 80);
  563. server.Start(R"""(bind [::]:60053
  564. bind [::]:60054 -g group1
  565. bind [::]:60055 -g group1_1
  566. bind [::]:60056 -g group1_1_1
  567. bind [::]:60057 -g group1_1_2
  568. server 127.0.0.1:61053
  569. address 1.1.1.0
  570. speed-check-mode none
  571. group-begin group1
  572. address 1.1.1.1
  573. group-match -domain b.com
  574. address /b.com/1.1.1.3
  575. group-begin group1_1
  576. address /b.com/1.1.1.2
  577. group-begin group1_1_1 -inherit none
  578. server 127.0.0.1:61056
  579. group-end
  580. group-begin group1_1_2 -inherit default
  581. group-end
  582. group-end
  583. group-end
  584. )""");
  585. smartdns::Client client;
  586. ASSERT_TRUE(client.Query("a.com", 60053));
  587. std::cout << client.GetResult() << std::endl;
  588. ASSERT_EQ(client.GetAnswerNum(), 1);
  589. EXPECT_EQ(client.GetStatus(), "NOERROR");
  590. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  591. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  592. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.1.1.0");
  593. ASSERT_TRUE(client.Query("b.com", 60054));
  594. std::cout << client.GetResult() << std::endl;
  595. ASSERT_EQ(client.GetAnswerNum(), 1);
  596. EXPECT_EQ(client.GetStatus(), "NOERROR");
  597. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  598. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  599. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.1.1.3");
  600. ASSERT_TRUE(client.Query("a.com", 60055));
  601. std::cout << client.GetResult() << std::endl;
  602. ASSERT_EQ(client.GetAnswerNum(), 1);
  603. EXPECT_EQ(client.GetStatus(), "NOERROR");
  604. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  605. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  606. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.1.1.1");
  607. ASSERT_TRUE(client.Query("b.com", 60055));
  608. std::cout << client.GetResult() << std::endl;
  609. ASSERT_EQ(client.GetAnswerNum(), 1);
  610. EXPECT_EQ(client.GetStatus(), "NOERROR");
  611. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  612. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  613. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.1.1.2");
  614. ASSERT_TRUE(client.Query("a.com", 60056));
  615. std::cout << client.GetResult() << std::endl;
  616. ASSERT_EQ(client.GetAnswerNum(), 1);
  617. EXPECT_EQ(client.GetStatus(), "NOERROR");
  618. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  619. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  620. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  621. ASSERT_TRUE(client.Query("a.com", 60057));
  622. std::cout << client.GetResult() << std::endl;
  623. ASSERT_EQ(client.GetAnswerNum(), 1);
  624. EXPECT_EQ(client.GetStatus(), "NOERROR");
  625. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  626. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  627. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.1.1.0");
  628. }