test-speed-check.cc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  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 SpeedCheck : public ::testing::Test
  26. {
  27. protected:
  28. virtual void SetUp() {}
  29. virtual void TearDown() {}
  30. };
  31. TEST_F(SpeedCheck, response_mode)
  32. {
  33. smartdns::MockServer server_upstream;
  34. smartdns::Server server;
  35. std::map<int, int> qid_map;
  36. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  37. if (request->qtype == DNS_T_A) {
  38. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  39. smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
  40. return smartdns::SERVER_REQUEST_OK;
  41. }
  42. return smartdns::SERVER_REQUEST_SOA;
  43. });
  44. server.Start(R"""(bind [::]:60053
  45. server 127.0.0.1:61053
  46. log-num 0
  47. log-console yes
  48. response-mode first-ping
  49. domain-rules /a.com/ -r fastest-response
  50. log-level debug
  51. cache-persist no)""");
  52. smartdns::Client client;
  53. ASSERT_TRUE(client.Query("b.com", 60053));
  54. std::cout << client.GetResult() << std::endl;
  55. ASSERT_EQ(client.GetAnswerNum(), 1);
  56. EXPECT_EQ(client.GetStatus(), "NOERROR");
  57. EXPECT_GT(client.GetQueryTime(), 100);
  58. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  59. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  60. ASSERT_TRUE(client.Query("a.com", 60053));
  61. std::cout << client.GetResult() << std::endl;
  62. ASSERT_EQ(client.GetAnswerNum(), 2);
  63. EXPECT_EQ(client.GetStatus(), "NOERROR");
  64. EXPECT_LT(client.GetQueryTime(), 10);
  65. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  66. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  67. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  68. EXPECT_EQ(client.GetAnswer()[1].GetData(), "5.6.7.8");
  69. }
  70. TEST_F(SpeedCheck, none)
  71. {
  72. smartdns::MockServer server_upstream;
  73. smartdns::Server server;
  74. std::map<int, int> qid_map;
  75. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  76. if (request->qtype == DNS_T_A) {
  77. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  78. smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
  79. return smartdns::SERVER_REQUEST_OK;
  80. }
  81. return smartdns::SERVER_REQUEST_SOA;
  82. });
  83. server.Start(R"""(bind [::]:60053
  84. server 127.0.0.1:61053
  85. log-num 0
  86. log-console yes
  87. speed-check-mode none
  88. log-level debug
  89. cache-persist no)""");
  90. smartdns::Client client;
  91. ASSERT_TRUE(client.Query("b.com", 60053));
  92. std::cout << client.GetResult() << std::endl;
  93. ASSERT_EQ(client.GetAnswerNum(), 2);
  94. EXPECT_EQ(client.GetStatus(), "NOERROR");
  95. EXPECT_LT(client.GetQueryTime(), 20);
  96. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  97. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  98. ASSERT_TRUE(client.Query("a.com", 60053));
  99. std::cout << client.GetResult() << std::endl;
  100. ASSERT_EQ(client.GetAnswerNum(), 2);
  101. EXPECT_EQ(client.GetStatus(), "NOERROR");
  102. EXPECT_LT(client.GetQueryTime(), 20);
  103. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  104. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  105. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  106. EXPECT_EQ(client.GetAnswer()[1].GetData(), "5.6.7.8");
  107. }
  108. TEST_F(SpeedCheck, domain_rules_none)
  109. {
  110. smartdns::MockServer server_upstream;
  111. smartdns::Server server;
  112. std::map<int, int> qid_map;
  113. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  114. if (request->qtype == DNS_T_A) {
  115. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  116. smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
  117. return smartdns::SERVER_REQUEST_OK;
  118. }
  119. return smartdns::SERVER_REQUEST_SOA;
  120. });
  121. server.Start(R"""(bind [::]:60053
  122. server 127.0.0.1:61053
  123. log-num 0
  124. log-console yes
  125. domain-rules /a.com/ -c none
  126. log-level debug
  127. cache-persist no)""");
  128. smartdns::Client client;
  129. ASSERT_TRUE(client.Query("b.com", 60053));
  130. std::cout << client.GetResult() << std::endl;
  131. ASSERT_EQ(client.GetAnswerNum(), 1);
  132. EXPECT_EQ(client.GetStatus(), "NOERROR");
  133. EXPECT_GT(client.GetQueryTime(), 200);
  134. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  135. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  136. ASSERT_TRUE(client.Query("a.com", 60053));
  137. std::cout << client.GetResult() << std::endl;
  138. ASSERT_EQ(client.GetAnswerNum(), 2);
  139. EXPECT_EQ(client.GetStatus(), "NOERROR");
  140. EXPECT_LT(client.GetQueryTime(), 20);
  141. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  142. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  143. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  144. EXPECT_EQ(client.GetAnswer()[1].GetData(), "5.6.7.8");
  145. }
  146. TEST_F(SpeedCheck, only_ping)
  147. {
  148. smartdns::MockServer server_upstream;
  149. smartdns::Server server;
  150. std::map<int, int> qid_map;
  151. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  152. if (request->qtype == DNS_T_A) {
  153. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  154. smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
  155. return smartdns::SERVER_REQUEST_OK;
  156. }
  157. return smartdns::SERVER_REQUEST_SOA;
  158. });
  159. server.Start(R"""(bind [::]:60053
  160. server 127.0.0.1:61053
  161. log-num 0
  162. log-console yes
  163. speed-check-mode ping
  164. log-level debug
  165. cache-persist no)""");
  166. smartdns::Client client;
  167. ASSERT_TRUE(client.Query("b.com", 60053));
  168. std::cout << client.GetResult() << std::endl;
  169. ASSERT_EQ(client.GetAnswerNum(), 1);
  170. EXPECT_EQ(client.GetStatus(), "NOERROR");
  171. EXPECT_LT(client.GetQueryTime(), 1200);
  172. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  173. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  174. }
  175. TEST_F(SpeedCheck, fastest_ip)
  176. {
  177. smartdns::MockServer server_upstream;
  178. smartdns::Server server;
  179. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  180. if (request->qtype == DNS_T_A) {
  181. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  182. smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
  183. return smartdns::SERVER_REQUEST_OK;
  184. }
  185. return smartdns::SERVER_REQUEST_SOA;
  186. });
  187. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 100);
  188. server.MockPing(PING_TYPE_ICMP, "5.6.7.8", 60, 110);
  189. server.Start(R"""(bind [::]:60053
  190. server 127.0.0.1:61053
  191. log-num 0
  192. log-console yes
  193. speed-check-mode ping
  194. dualstack-ip-selection no
  195. log-level debug
  196. cache-persist no)""");
  197. smartdns::Client client;
  198. ASSERT_TRUE(client.Query("b.com", 60053));
  199. std::cout << client.GetResult() << std::endl;
  200. ASSERT_EQ(client.GetAnswerNum(), 1);
  201. EXPECT_EQ(client.GetStatus(), "NOERROR");
  202. EXPECT_LT(client.GetQueryTime(), 200);
  203. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  204. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  205. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  206. usleep(220 * 1000);
  207. ASSERT_TRUE(client.Query("b.com", 60053));
  208. std::cout << client.GetResult() << std::endl;
  209. ASSERT_EQ(client.GetAnswerNum(), 2);
  210. EXPECT_EQ(client.GetStatus(), "NOERROR");
  211. EXPECT_LT(client.GetQueryTime(), 20);
  212. EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
  213. EXPECT_GT(client.GetAnswer()[0].GetTTL(), 597);
  214. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  215. EXPECT_EQ(client.GetAnswer()[1].GetData(), "5.6.7.8");
  216. }
  217. TEST_F(SpeedCheck, unreach_best_ipv4)
  218. {
  219. smartdns::MockServer server_upstream;
  220. smartdns::MockServer server_upstream2;
  221. smartdns::Server server;
  222. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  223. if (request->qtype == DNS_T_A) {
  224. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  225. smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
  226. return smartdns::SERVER_REQUEST_OK;
  227. }
  228. return smartdns::SERVER_REQUEST_SOA;
  229. });
  230. server_upstream2.Start("udp://0.0.0.0:62053", [&](struct smartdns::ServerRequestContext *request) {
  231. if (request->qtype == DNS_T_A) {
  232. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  233. smartdns::MockServer::AddIP(request, request->domain.c_str(), "9.10.11.12");
  234. return smartdns::SERVER_REQUEST_OK;
  235. }
  236. return smartdns::SERVER_REQUEST_SOA;
  237. });
  238. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10000);
  239. server.MockPing(PING_TYPE_ICMP, "5.6.7.8", 60, 10000);
  240. server.MockPing(PING_TYPE_ICMP, "9.10.11.12", 60, 10000);
  241. server.Start(R"""(bind [::]:60053
  242. server 127.0.0.1:61053
  243. server 127.0.0.1:62053
  244. log-num 0
  245. log-console yes
  246. speed-check-mode ping
  247. dualstack-ip-selection no
  248. log-level debug
  249. cache-persist no)""");
  250. smartdns::Client client;
  251. ASSERT_TRUE(client.Query("a.com", 60053));
  252. std::cout << client.GetResult() << std::endl;
  253. ASSERT_EQ(client.GetAnswerNum(), 1);
  254. EXPECT_EQ(client.GetStatus(), "NOERROR");
  255. EXPECT_LT(client.GetQueryTime(), 1200);
  256. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  257. EXPECT_GT(client.GetAnswer()[0].GetTTL(), 597);
  258. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  259. }
  260. TEST_F(SpeedCheck, unreach_best_ipv6)
  261. {
  262. smartdns::MockServer server_upstream;
  263. smartdns::MockServer server_upstream2;
  264. smartdns::Server server;
  265. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  266. if (request->qtype == DNS_T_AAAA) {
  267. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::1");
  268. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::2");
  269. return smartdns::SERVER_REQUEST_OK;
  270. }
  271. return smartdns::SERVER_REQUEST_SOA;
  272. });
  273. server_upstream2.Start("udp://0.0.0.0:62053", [&](struct smartdns::ServerRequestContext *request) {
  274. if (request->qtype == DNS_T_AAAA) {
  275. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::2");
  276. smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::3");
  277. return smartdns::SERVER_REQUEST_OK;
  278. }
  279. return smartdns::SERVER_REQUEST_SOA;
  280. });
  281. server.MockPing(PING_TYPE_ICMP, "2001:db8::1", 60, 10000);
  282. server.MockPing(PING_TYPE_ICMP, "2001:db8::2", 60, 10000);
  283. server.MockPing(PING_TYPE_ICMP, "2001:db8::3", 60, 10000);
  284. server.Start(R"""(bind [::]:60053
  285. server 127.0.0.1:61053
  286. server 127.0.0.1:62053
  287. log-num 0
  288. log-console yes
  289. speed-check-mode ping
  290. dualstack-ip-selection no
  291. log-level debug
  292. cache-persist no)""");
  293. smartdns::Client client;
  294. ASSERT_TRUE(client.Query("a.com AAAA", 60053));
  295. std::cout << client.GetResult() << std::endl;
  296. ASSERT_EQ(client.GetAnswerNum(), 1);
  297. EXPECT_EQ(client.GetStatus(), "NOERROR");
  298. EXPECT_LT(client.GetQueryTime(), 1200);
  299. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  300. EXPECT_GT(client.GetAnswer()[0].GetTTL(), 597);
  301. EXPECT_EQ(client.GetAnswer()[0].GetData(), "2001:db8::2");
  302. }