test-bind.cc 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  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 "include/utils.h"
  20. #include "server.h"
  21. #include "gtest/gtest.h"
  22. #include <arpa/inet.h>
  23. #include <netdb.h>
  24. #include <netinet/in.h>
  25. #include <openssl/rand.h>
  26. #include <sys/socket.h>
  27. TEST(Bind, tls)
  28. {
  29. Defer
  30. {
  31. unlink("/tmp/smartdns-cert.pem");
  32. unlink("/tmp/smartdns-key.pem");
  33. };
  34. smartdns::Server server_wrap;
  35. smartdns::Server server;
  36. server.Start(R"""(bind [::]:61053
  37. server-tls 127.0.0.1:60053 -no-check-certificate
  38. )""");
  39. server_wrap.Start(R"""(bind-tls [::]:60053
  40. address /example.com/1.2.3.4
  41. )""");
  42. smartdns::Client client;
  43. ASSERT_TRUE(client.Query("example.com", 61053));
  44. ASSERT_EQ(client.GetAnswerNum(), 1);
  45. EXPECT_EQ(client.GetStatus(), "NOERROR");
  46. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  47. }
  48. TEST(Bind, https)
  49. {
  50. Defer
  51. {
  52. unlink("/tmp/smartdns-cert.pem");
  53. unlink("/tmp/smartdns-key.pem");
  54. };
  55. smartdns::Server server_wrap;
  56. smartdns::Server server;
  57. server.Start(R"""(bind [::]:61053
  58. server https://127.0.0.1:60053 -no-check-certificate
  59. )""");
  60. server_wrap.Start(R"""(bind-https [::]:60053
  61. address /example.com/1.2.3.4
  62. )""");
  63. smartdns::Client client;
  64. ASSERT_TRUE(client.Query("example.com", 61053));
  65. ASSERT_EQ(client.GetAnswerNum(), 1);
  66. EXPECT_EQ(client.GetStatus(), "NOERROR");
  67. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  68. }
  69. TEST(Bind, udp_tcp)
  70. {
  71. smartdns::MockServer server_upstream;
  72. smartdns::MockServer server_upstream2;
  73. smartdns::Server server;
  74. server_upstream.Start("udp://0.0.0.0:61053", [](struct smartdns::ServerRequestContext *request) {
  75. unsigned char addr[4] = {1, 2, 3, 4};
  76. dns_add_A(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 611, addr);
  77. request->response_packet->head.rcode = DNS_RC_NOERROR;
  78. return smartdns::SERVER_REQUEST_OK;
  79. });
  80. server.Start(R"""(
  81. bind [::]:60053
  82. bind-tcp [::]:60053
  83. server 127.0.0.1:61053
  84. )""");
  85. smartdns::Client client;
  86. ASSERT_TRUE(client.Query("a.com +tcp", 60053));
  87. std::cout << client.GetResult() << std::endl;
  88. ASSERT_EQ(client.GetAnswerNum(), 1);
  89. EXPECT_EQ(client.GetStatus(), "NOERROR");
  90. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  91. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  92. ASSERT_TRUE(client.Query("a.com", 60053));
  93. std::cout << client.GetResult() << std::endl;
  94. ASSERT_EQ(client.GetAnswerNum(), 1);
  95. EXPECT_EQ(client.GetStatus(), "NOERROR");
  96. EXPECT_GE(client.GetAnswer()[0].GetTTL(), 609);
  97. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  98. }
  99. TEST(Bind, self)
  100. {
  101. smartdns::MockServer server_upstream;
  102. smartdns::Server server;
  103. server_upstream.Start("udp://0.0.0.0:62053", [](struct smartdns::ServerRequestContext *request) {
  104. if (request->qtype == DNS_T_A) {
  105. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  106. return smartdns::SERVER_REQUEST_OK;
  107. }
  108. return smartdns::SERVER_REQUEST_SOA;
  109. });
  110. server.Start(R"""(
  111. bind [::]:60053 -group self
  112. server 127.0.0.1:61053 -group self
  113. bind [::]:61053 -group upstream
  114. server 127.0.0.1:62053 -group upstream
  115. )""");
  116. smartdns::Client client;
  117. ASSERT_TRUE(client.Query("a.com", 60053));
  118. std::cout << client.GetResult() << std::endl;
  119. ASSERT_EQ(client.GetAnswerNum(), 1);
  120. EXPECT_EQ(client.GetStatus(), "NOERROR");
  121. EXPECT_LT(client.GetQueryTime(), 100);
  122. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  123. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  124. }
  125. TEST(Bind, nocache)
  126. {
  127. smartdns::MockServer server_upstream;
  128. smartdns::MockServer server_upstream2;
  129. smartdns::Server server;
  130. server_upstream.Start("udp://0.0.0.0:61053", [](struct smartdns::ServerRequestContext *request) {
  131. unsigned char addr[4] = {1, 2, 3, 4};
  132. usleep(15 * 1000);
  133. dns_add_A(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 611, addr);
  134. request->response_packet->head.rcode = DNS_RC_NOERROR;
  135. return smartdns::SERVER_REQUEST_OK;
  136. });
  137. server.Start(R"""(
  138. bind [::]:60053 --no-cache
  139. bind-tcp [::]:60053
  140. server 127.0.0.1:61053
  141. )""");
  142. smartdns::Client client;
  143. ASSERT_TRUE(client.Query("a.com", 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].GetData(), "1.2.3.4");
  150. ASSERT_TRUE(client.Query("a.com", 60053));
  151. EXPECT_GT(client.GetQueryTime(), 10);
  152. std::cout << client.GetResult() << std::endl;
  153. ASSERT_EQ(client.GetAnswerNum(), 1);
  154. EXPECT_EQ(client.GetStatus(), "NOERROR");
  155. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  156. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  157. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  158. }
  159. TEST(Bind, device)
  160. {
  161. smartdns::MockServer server_upstream;
  162. smartdns::Server server;
  163. server_upstream.Start("udp://0.0.0.0:62053", [](struct smartdns::ServerRequestContext *request) {
  164. if (request->qtype == DNS_T_A) {
  165. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  166. return smartdns::SERVER_REQUEST_OK;
  167. }
  168. return smartdns::SERVER_REQUEST_SOA;
  169. });
  170. server.Start(R"""(
  171. bind [::]:60053@lo
  172. server 127.0.0.1:62053
  173. )""");
  174. smartdns::Client client;
  175. ASSERT_TRUE(client.Query("a.com", 60053));
  176. std::cout << client.GetResult() << std::endl;
  177. ASSERT_EQ(client.GetAnswerNum(), 1);
  178. EXPECT_EQ(client.GetStatus(), "NOERROR");
  179. EXPECT_LT(client.GetQueryTime(), 100);
  180. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  181. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  182. }
  183. TEST(Bind, malformed_packet)
  184. {
  185. smartdns::MockServer server_upstream;
  186. smartdns::Server server;
  187. server_upstream.Start("udp://0.0.0.0:62053", [](struct smartdns::ServerRequestContext *request) {
  188. if (request->qtype == DNS_T_A) {
  189. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
  190. return smartdns::SERVER_REQUEST_OK;
  191. }
  192. return smartdns::SERVER_REQUEST_SOA;
  193. });
  194. server.Start(R"""(
  195. bind [::]:60053@lo
  196. server 127.0.0.1:62053
  197. log-level info
  198. )""");
  199. int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  200. ASSERT_NE(sockfd, -1);
  201. Defer
  202. {
  203. close(sockfd);
  204. };
  205. struct sockaddr_in server_addr;
  206. server_addr.sin_family = AF_INET;
  207. server_addr.sin_port = htons(60053);
  208. server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  209. for (int i = 0; i < 100000; i++) {
  210. char buf[4096];
  211. int len = random() % 4096;
  212. if (len <= 0) {
  213. len = 1;
  214. }
  215. RAND_bytes((unsigned char *)buf, len);
  216. sendto(sockfd, buf, len, 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
  217. }
  218. smartdns::Client client;
  219. ASSERT_TRUE(client.Query("a.com", 60053));
  220. std::cout << client.GetResult() << std::endl;
  221. ASSERT_EQ(client.GetAnswerNum(), 1);
  222. EXPECT_EQ(client.GetStatus(), "NOERROR");
  223. EXPECT_LT(client.GetQueryTime(), 100);
  224. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  225. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  226. }
  227. TEST(Bind, group)
  228. {
  229. smartdns::MockServer server_upstream;
  230. smartdns::MockServer server_upstream1;
  231. smartdns::MockServer server_upstream2;
  232. smartdns::Server server;
  233. server_upstream.Start("udp://0.0.0.0:61053", [](struct smartdns::ServerRequestContext *request) {
  234. if (request->qtype != DNS_T_A) {
  235. return smartdns::SERVER_REQUEST_SOA;
  236. }
  237. smartdns::MockServer::AddIP(request, request->domain.c_str(), "9.10.11.12", 611);
  238. return smartdns::SERVER_REQUEST_OK;
  239. });
  240. server_upstream1.Start("udp://0.0.0.0:62053", [](struct smartdns::ServerRequestContext *request) {
  241. if (request->qtype != DNS_T_A) {
  242. return smartdns::SERVER_REQUEST_SOA;
  243. }
  244. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
  245. return smartdns::SERVER_REQUEST_OK;
  246. });
  247. server_upstream2.Start("udp://0.0.0.0:63053", [](struct smartdns::ServerRequestContext *request) {
  248. if (request->qtype != DNS_T_A) {
  249. return smartdns::SERVER_REQUEST_SOA;
  250. }
  251. smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8", 611);
  252. return smartdns::SERVER_REQUEST_OK;
  253. });
  254. server.Start(R"""(bind [::]:60053
  255. bind [::]:60153 -group g1
  256. bind [::]:60253 -group g2
  257. server 127.0.0.1:61053
  258. server 127.0.0.1:62053 -group g1 -exclude-default-group
  259. server 127.0.0.1:63053 -group g2 -exclude-default-group
  260. )""");
  261. smartdns::Client client;
  262. ASSERT_TRUE(client.Query("a.com", 60053));
  263. std::cout << client.GetResult() << std::endl;
  264. ASSERT_EQ(client.GetAnswerNum(), 1);
  265. EXPECT_EQ(client.GetStatus(), "NOERROR");
  266. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  267. EXPECT_EQ(client.GetAnswer()[0].GetData(), "9.10.11.12");
  268. ASSERT_TRUE(client.Query("a.com", 60153));
  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(), "a.com");
  273. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  274. ASSERT_TRUE(client.Query("a.com", 60253));
  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(), "a.com");
  279. EXPECT_EQ(client.GetAnswer()[0].GetData(), "5.6.7.8");
  280. }