ares-test-internal.cc 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. #include "ares-test.h"
  2. #include "dns-proto.h"
  3. #include <stdio.h>
  4. #ifdef HAVE_UNISTD_H
  5. #include <unistd.h>
  6. #endif
  7. #include <fcntl.h>
  8. extern "C" {
  9. // Remove command-line defines of package variables for the test project...
  10. #undef PACKAGE_NAME
  11. #undef PACKAGE_BUGREPORT
  12. #undef PACKAGE_STRING
  13. #undef PACKAGE_TARNAME
  14. // ... so we can include the library's config without symbol redefinitions.
  15. #include "ares_setup.h"
  16. #include "ares_nowarn.h"
  17. #include "ares_inet_net_pton.h"
  18. #include "ares_data.h"
  19. #include "ares_private.h"
  20. #include "bitncmp.h"
  21. #ifdef HAVE_ARPA_INET_H
  22. #include <arpa/inet.h>
  23. #endif
  24. #ifdef HAVE_SYS_UIO_H
  25. # include <sys/uio.h>
  26. #endif
  27. }
  28. #include <string>
  29. #include <vector>
  30. namespace ares {
  31. namespace test {
  32. #ifndef CARES_SYMBOL_HIDING
  33. void CheckPtoN4(int size, unsigned int value, const char *input) {
  34. struct in_addr a4;
  35. a4.s_addr = 0;
  36. uint32_t expected = htonl(value);
  37. EXPECT_EQ(size, ares_inet_net_pton(AF_INET, input, &a4, sizeof(a4)))
  38. << " for input " << input;
  39. EXPECT_EQ(expected, a4.s_addr) << " for input " << input;
  40. }
  41. #endif
  42. TEST_F(LibraryTest, InetPtoN) {
  43. struct in_addr a4;
  44. struct in6_addr a6;
  45. #ifndef CARES_SYMBOL_HIDING
  46. uint32_t expected;
  47. CheckPtoN4(4 * 8, 0x01020304, "1.2.3.4");
  48. CheckPtoN4(4 * 8, 0x81010101, "129.1.1.1");
  49. CheckPtoN4(4 * 8, 0xC0010101, "192.1.1.1");
  50. CheckPtoN4(4 * 8, 0xE0010101, "224.1.1.1");
  51. CheckPtoN4(4 * 8, 0xE1010101, "225.1.1.1");
  52. CheckPtoN4(4, 0xE0000000, "224");
  53. CheckPtoN4(4 * 8, 0xFD000000, "253");
  54. CheckPtoN4(4 * 8, 0xF0010101, "240.1.1.1");
  55. CheckPtoN4(4 * 8, 0x02030405, "02.3.4.5");
  56. CheckPtoN4(3 * 8, 0x01020304, "1.2.3.4/24");
  57. CheckPtoN4(3 * 8, 0x01020300, "1.2.3/24");
  58. CheckPtoN4(2 * 8, 0xa0000000, "0xa");
  59. CheckPtoN4(0, 0x02030405, "2.3.4.5/000");
  60. CheckPtoN4(1 * 8, 0x01020000, "1.2/8");
  61. CheckPtoN4(2 * 8, 0x01020000, "0x0102/16");
  62. CheckPtoN4(4 * 8, 0x02030405, "02.3.4.5");
  63. EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "::", &a6, sizeof(a6)));
  64. EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "::1", &a6, sizeof(a6)));
  65. EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "1234:5678::", &a6, sizeof(a6)));
  66. EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "12:34::ff", &a6, sizeof(a6)));
  67. EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4", &a6, sizeof(a6)));
  68. EXPECT_EQ(23, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4/23", &a6, sizeof(a6)));
  69. EXPECT_EQ(3 * 8, ares_inet_net_pton(AF_INET6, "12:34::ff/24", &a6, sizeof(a6)));
  70. EXPECT_EQ(0, ares_inet_net_pton(AF_INET6, "12:34::ff/0", &a6, sizeof(a6)));
  71. EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "12:34::ffff:0.2", &a6, sizeof(a6)));
  72. EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234", &a6, sizeof(a6)));
  73. // Various malformed versions
  74. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "", &a4, sizeof(a4)));
  75. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, " ", &a4, sizeof(a4)));
  76. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x", &a4, sizeof(a4)));
  77. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x ", &a4, sizeof(a4)));
  78. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "x0", &a4, sizeof(a4)));
  79. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0xXYZZY", &a4, sizeof(a4)));
  80. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "xyzzy", &a4, sizeof(a4)));
  81. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET+AF_INET6, "1.2.3.4", &a4, sizeof(a4)));
  82. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "257.2.3.4", &a4, sizeof(a4)));
  83. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "002.3.4.x", &a4, sizeof(a4)));
  84. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "00.3.4.x", &a4, sizeof(a4)));
  85. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.x", &a4, sizeof(a4)));
  86. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5.6", &a4, sizeof(a4)));
  87. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5.6/12", &a4, sizeof(a4)));
  88. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4:5", &a4, sizeof(a4)));
  89. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5/120", &a4, sizeof(a4)));
  90. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5/1x", &a4, sizeof(a4)));
  91. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "2.3.4.5/x", &a4, sizeof(a4)));
  92. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/240", &a6, sizeof(a6)));
  93. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/02", &a6, sizeof(a6)));
  94. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/2y", &a6, sizeof(a6)));
  95. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/y", &a6, sizeof(a6)));
  96. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff/", &a6, sizeof(a6)));
  97. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "", &a6, sizeof(a6)));
  98. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":x", &a6, sizeof(a6)));
  99. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":", &a6, sizeof(a6)));
  100. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ": :1234", &a6, sizeof(a6)));
  101. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "::12345", &a6, sizeof(a6)));
  102. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234::2345:3456::0011", &a6, sizeof(a6)));
  103. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:", &a6, sizeof(a6)));
  104. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234::", &a6, sizeof(a6)));
  105. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1.2.3.4", &a6, sizeof(a6)));
  106. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":1234:1234:1234:1234:1234:1234:1234:1234", &a6, sizeof(a6)));
  107. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":1234:1234:1234:1234:1234:1234:1234:1234:", &a6, sizeof(a6)));
  108. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678", &a6, sizeof(a6)));
  109. // TODO(drysdale): check whether the next two tests should give -1.
  110. EXPECT_EQ(0, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678:5678", &a6, sizeof(a6)));
  111. EXPECT_EQ(0, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678:5678:5678", &a6, sizeof(a6)));
  112. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:257.2.3.4", &a6, sizeof(a6)));
  113. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:002.2.3.4", &a6, sizeof(a6)));
  114. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4.5.6", &a6, sizeof(a6)));
  115. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4.5", &a6, sizeof(a6)));
  116. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.z", &a6, sizeof(a6)));
  117. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3001.4", &a6, sizeof(a6)));
  118. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3..4", &a6, sizeof(a6)));
  119. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.", &a6, sizeof(a6)));
  120. // Hex constants are allowed.
  121. EXPECT_EQ(4 * 8, ares_inet_net_pton(AF_INET, "0x01020304", &a4, sizeof(a4)));
  122. expected = htonl(0x01020304);
  123. EXPECT_EQ(expected, a4.s_addr);
  124. EXPECT_EQ(4 * 8, ares_inet_net_pton(AF_INET, "0x0a0b0c0d", &a4, sizeof(a4)));
  125. expected = htonl(0x0a0b0c0d);
  126. EXPECT_EQ(expected, a4.s_addr);
  127. EXPECT_EQ(4 * 8, ares_inet_net_pton(AF_INET, "0x0A0B0C0D", &a4, sizeof(a4)));
  128. expected = htonl(0x0a0b0c0d);
  129. EXPECT_EQ(expected, a4.s_addr);
  130. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x0xyz", &a4, sizeof(a4)));
  131. EXPECT_EQ(4 * 8, ares_inet_net_pton(AF_INET, "0x1122334", &a4, sizeof(a4)));
  132. expected = htonl(0x11223340);
  133. EXPECT_EQ(expected, a4.s_addr); // huh?
  134. // No room, no room.
  135. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "1.2.3.4", &a4, sizeof(a4) - 1));
  136. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ff", &a6, sizeof(a6) - 1));
  137. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x01020304", &a4, 2));
  138. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x01020304", &a4, 0));
  139. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x0a0b0c0d", &a4, 0));
  140. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x0xyz", &a4, 0));
  141. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "0x1122334", &a4, sizeof(a4) - 1));
  142. EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "253", &a4, sizeof(a4) - 1));
  143. #endif
  144. EXPECT_EQ(1, ares_inet_pton(AF_INET, "1.2.3.4", &a4));
  145. EXPECT_EQ(1, ares_inet_pton(AF_INET6, "12:34::ff", &a6));
  146. EXPECT_EQ(1, ares_inet_pton(AF_INET6, "12:34::ffff:1.2.3.4", &a6));
  147. EXPECT_EQ(0, ares_inet_pton(AF_INET, "xyzzy", &a4));
  148. EXPECT_EQ(-1, ares_inet_pton(AF_INET+AF_INET6, "1.2.3.4", &a4));
  149. }
  150. TEST_F(LibraryTest, FreeCorruptData) {
  151. // ares_free_data(p) expects that there is a type field and a marker
  152. // field in the memory before p. Feed it incorrect versions of each.
  153. struct ares_data *data = (struct ares_data *)malloc(sizeof(struct ares_data));
  154. void* p = &(data->data);
  155. // Invalid type
  156. data->type = (ares_datatype)99;
  157. data->mark = ARES_DATATYPE_MARK;
  158. ares_free_data(p);
  159. // Invalid marker
  160. data->type = (ares_datatype)ARES_DATATYPE_MX_REPLY;
  161. data->mark = ARES_DATATYPE_MARK + 1;
  162. ares_free_data(p);
  163. // Null pointer
  164. ares_free_data(nullptr);
  165. free(data);
  166. }
  167. #ifndef CARES_SYMBOL_HIDING
  168. TEST_F(LibraryTest, FreeLongChain) {
  169. struct ares_addr_node *data = nullptr;
  170. for (int ii = 0; ii < 100000; ii++) {
  171. struct ares_addr_node *prev = (struct ares_addr_node*)ares_malloc_data(ARES_DATATYPE_ADDR_NODE);
  172. prev->next = data;
  173. data = prev;
  174. }
  175. ares_free_data(data);
  176. }
  177. TEST(LibraryInit, StrdupFailures) {
  178. EXPECT_EQ(ARES_SUCCESS, ares_library_init(ARES_LIB_INIT_ALL));
  179. char* copy = ares_strdup("string");
  180. EXPECT_NE(nullptr, copy);
  181. ares_free(copy);
  182. ares_library_cleanup();
  183. }
  184. TEST_F(LibraryTest, StrdupFailures) {
  185. SetAllocFail(1);
  186. char* copy = ares_strdup("string");
  187. EXPECT_EQ(nullptr, copy);
  188. }
  189. TEST_F(LibraryTest, MallocDataFail) {
  190. EXPECT_EQ(nullptr, ares_malloc_data((ares_datatype)99));
  191. SetAllocSizeFail(sizeof(struct ares_data));
  192. EXPECT_EQ(nullptr, ares_malloc_data(ARES_DATATYPE_MX_REPLY));
  193. }
  194. TEST(Misc, Bitncmp) {
  195. byte a[4] = {0x80, 0x01, 0x02, 0x03};
  196. byte b[4] = {0x80, 0x01, 0x02, 0x04};
  197. byte c[4] = {0x01, 0xFF, 0x80, 0x02};
  198. EXPECT_GT(0, ares__bitncmp(a, b, sizeof(a)*8));
  199. EXPECT_LT(0, ares__bitncmp(b, a, sizeof(a)*8));
  200. EXPECT_EQ(0, ares__bitncmp(a, a, sizeof(a)*8));
  201. for (int ii = 1; ii < (3*8+5); ii++) {
  202. EXPECT_EQ(0, ares__bitncmp(a, b, ii));
  203. EXPECT_EQ(0, ares__bitncmp(b, a, ii));
  204. EXPECT_LT(0, ares__bitncmp(a, c, ii));
  205. EXPECT_GT(0, ares__bitncmp(c, a, ii));
  206. }
  207. // Last byte differs at 5th bit
  208. EXPECT_EQ(0, ares__bitncmp(a, b, 3*8 + 3));
  209. EXPECT_EQ(0, ares__bitncmp(a, b, 3*8 + 4));
  210. EXPECT_EQ(0, ares__bitncmp(a, b, 3*8 + 5));
  211. EXPECT_GT(0, ares__bitncmp(a, b, 3*8 + 6));
  212. EXPECT_GT(0, ares__bitncmp(a, b, 3*8 + 7));
  213. }
  214. TEST_F(LibraryTest, Casts) {
  215. ares_ssize_t ssz = 100;
  216. unsigned int u = 100;
  217. int i = 100;
  218. long l = 100;
  219. unsigned int ru = aresx_sztoui(ssz);
  220. EXPECT_EQ(u, ru);
  221. int ri = aresx_sztosi(ssz);
  222. EXPECT_EQ(i, ri);
  223. ri = aresx_sltosi(l);
  224. EXPECT_EQ(l, (long)ri);
  225. }
  226. TEST_F(LibraryTest, ReadLine) {
  227. TempFile temp("abcde\n0123456789\nXYZ\n012345678901234567890\n\n");
  228. FILE *fp = fopen(temp.filename(), "r");
  229. size_t bufsize = 4;
  230. char *buf = (char *)ares_malloc(bufsize);
  231. EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize));
  232. EXPECT_EQ("abcde", std::string(buf));
  233. EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize));
  234. EXPECT_EQ("0123456789", std::string(buf));
  235. EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize));
  236. EXPECT_EQ("XYZ", std::string(buf));
  237. SetAllocFail(1);
  238. EXPECT_EQ(ARES_ENOMEM, ares__read_line(fp, &buf, &bufsize));
  239. EXPECT_EQ(nullptr, buf);
  240. fclose(fp);
  241. ares_free(buf);
  242. }
  243. TEST_F(LibraryTest, ReadLineNoBuf) {
  244. TempFile temp("abcde\n0123456789\nXYZ\n012345678901234567890");
  245. FILE *fp = fopen(temp.filename(), "r");
  246. size_t bufsize = 0;
  247. char *buf = nullptr;
  248. SetAllocFail(1);
  249. EXPECT_EQ(ARES_ENOMEM, ares__read_line(fp, &buf, &bufsize));
  250. EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize));
  251. EXPECT_EQ("abcde", std::string(buf));
  252. EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize));
  253. EXPECT_EQ("0123456789", std::string(buf));
  254. EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize));
  255. EXPECT_EQ("XYZ", std::string(buf));
  256. EXPECT_EQ(ARES_SUCCESS, ares__read_line(fp, &buf, &bufsize));
  257. EXPECT_EQ("012345678901234567890", std::string(buf));
  258. fclose(fp);
  259. ares_free(buf);
  260. }
  261. TEST(Misc, GetHostent) {
  262. TempFile hostsfile("1.2.3.4 example.com \n"
  263. " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n"
  264. "#comment\n"
  265. "4.5.6.7\n"
  266. "1.3.5.7 \n"
  267. "::1 ipv6.com");
  268. struct hostent *host = nullptr;
  269. FILE *fp = fopen(hostsfile.filename(), "r");
  270. ASSERT_NE(nullptr, fp);
  271. EXPECT_EQ(ARES_EBADFAMILY, ares__get_hostent(fp, AF_INET+AF_INET6, &host));
  272. rewind(fp);
  273. EXPECT_EQ(ARES_SUCCESS, ares__get_hostent(fp, AF_INET, &host));
  274. ASSERT_NE(nullptr, host);
  275. std::stringstream ss1;
  276. ss1 << HostEnt(host);
  277. EXPECT_EQ("{'example.com' aliases=[] addrs=[1.2.3.4]}", ss1.str());
  278. ares_free_hostent(host);
  279. host = nullptr;
  280. EXPECT_EQ(ARES_SUCCESS, ares__get_hostent(fp, AF_INET, &host));
  281. ASSERT_NE(nullptr, host);
  282. std::stringstream ss2;
  283. ss2 << HostEnt(host);
  284. EXPECT_EQ("{'google.com' aliases=[www.google.com, www2.google.com] addrs=[2.3.4.5]}", ss2.str());
  285. ares_free_hostent(host);
  286. host = nullptr;
  287. EXPECT_EQ(ARES_EOF, ares__get_hostent(fp, AF_INET, &host));
  288. rewind(fp);
  289. EXPECT_EQ(ARES_SUCCESS, ares__get_hostent(fp, AF_INET6, &host));
  290. ASSERT_NE(nullptr, host);
  291. std::stringstream ss3;
  292. ss3 << HostEnt(host);
  293. EXPECT_EQ("{'ipv6.com' aliases=[] addrs=[0000:0000:0000:0000:0000:0000:0000:0001]}", ss3.str());
  294. ares_free_hostent(host);
  295. host = nullptr;
  296. EXPECT_EQ(ARES_EOF, ares__get_hostent(fp, AF_INET6, &host));
  297. fclose(fp);
  298. }
  299. TEST_F(LibraryTest, GetHostentAllocFail) {
  300. TempFile hostsfile("1.2.3.4 example.com alias1 alias2\n");
  301. struct hostent *host = nullptr;
  302. FILE *fp = fopen(hostsfile.filename(), "r");
  303. ASSERT_NE(nullptr, fp);
  304. for (int ii = 1; ii <= 8; ii++) {
  305. rewind(fp);
  306. ClearFails();
  307. SetAllocFail(ii);
  308. host = nullptr;
  309. EXPECT_EQ(ARES_ENOMEM, ares__get_hostent(fp, AF_INET, &host)) << ii;
  310. }
  311. fclose(fp);
  312. }
  313. TEST_F(DefaultChannelTest, GetAddrInfoHostsPositive) {
  314. TempFile hostsfile("1.2.3.4 example.com \n"
  315. " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n"
  316. "#comment\n"
  317. "4.5.6.7\n"
  318. "1.3.5.7 \n"
  319. "::1 ipv6.com");
  320. EnvValue with_env("CARES_HOSTS", hostsfile.filename());
  321. struct ares_addrinfo_hints hints = {};
  322. AddrInfoResult result = {};
  323. hints.ai_family = AF_INET;
  324. hints.ai_flags = ARES_AI_CANONNAME | ARES_AI_ENVHOSTS | ARES_AI_NOSORT;
  325. ares_getaddrinfo(channel_, "example.com", NULL, &hints, AddrInfoCallback, &result);
  326. Process();
  327. EXPECT_TRUE(result.done_);
  328. std::stringstream ss;
  329. ss << result.ai_;
  330. EXPECT_EQ("{example.com addr=[1.2.3.4]}", ss.str());
  331. }
  332. TEST_F(DefaultChannelTest, GetAddrInfoHostsSpaces) {
  333. TempFile hostsfile("1.2.3.4 example.com \n"
  334. " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n"
  335. "#comment\n"
  336. "4.5.6.7\n"
  337. "1.3.5.7 \n"
  338. "::1 ipv6.com");
  339. EnvValue with_env("CARES_HOSTS", hostsfile.filename());
  340. struct ares_addrinfo_hints hints = {};
  341. AddrInfoResult result = {};
  342. hints.ai_family = AF_INET;
  343. hints.ai_flags = ARES_AI_CANONNAME | ARES_AI_ENVHOSTS | ARES_AI_NOSORT;
  344. ares_getaddrinfo(channel_, "google.com", NULL, &hints, AddrInfoCallback, &result);
  345. Process();
  346. EXPECT_TRUE(result.done_);
  347. std::stringstream ss;
  348. ss << result.ai_;
  349. EXPECT_EQ("{www.google.com->google.com, www2.google.com->google.com addr=[2.3.4.5]}", ss.str());
  350. }
  351. TEST_F(DefaultChannelTest, GetAddrInfoHostsByALias) {
  352. TempFile hostsfile("1.2.3.4 example.com \n"
  353. " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n"
  354. "#comment\n"
  355. "4.5.6.7\n"
  356. "1.3.5.7 \n"
  357. "::1 ipv6.com");
  358. EnvValue with_env("CARES_HOSTS", hostsfile.filename());
  359. struct ares_addrinfo_hints hints = {};
  360. AddrInfoResult result = {};
  361. hints.ai_family = AF_INET;
  362. hints.ai_flags = ARES_AI_CANONNAME | ARES_AI_ENVHOSTS | ARES_AI_NOSORT;
  363. ares_getaddrinfo(channel_, "www2.google.com", NULL, &hints, AddrInfoCallback, &result);
  364. Process();
  365. EXPECT_TRUE(result.done_);
  366. std::stringstream ss;
  367. ss << result.ai_;
  368. EXPECT_EQ("{www.google.com->google.com, www2.google.com->google.com addr=[2.3.4.5]}", ss.str());
  369. }
  370. TEST_F(DefaultChannelTest, GetAddrInfoHostsIPV6) {
  371. TempFile hostsfile("1.2.3.4 example.com \n"
  372. " 2.3.4.5\tgoogle.com www.google.com\twww2.google.com\n"
  373. "#comment\n"
  374. "4.5.6.7\n"
  375. "1.3.5.7 \n"
  376. "::1 ipv6.com");
  377. EnvValue with_env("CARES_HOSTS", hostsfile.filename());
  378. struct ares_addrinfo_hints hints = {};
  379. AddrInfoResult result = {};
  380. hints.ai_family = AF_INET6;
  381. hints.ai_flags = ARES_AI_CANONNAME | ARES_AI_ENVHOSTS | ARES_AI_NOSORT;
  382. ares_getaddrinfo(channel_, "ipv6.com", NULL, &hints, AddrInfoCallback, &result);
  383. Process();
  384. EXPECT_TRUE(result.done_);
  385. std::stringstream ss;
  386. ss << result.ai_;
  387. EXPECT_EQ("{ipv6.com addr=[[0000:0000:0000:0000:0000:0000:0000:0001]]}", ss.str());
  388. }
  389. TEST_F(LibraryTest, GetAddrInfoAllocFail) {
  390. TempFile hostsfile("1.2.3.4 example.com alias1 alias2\n");
  391. struct ares_addrinfo_hints hints;
  392. unsigned short port = 80;
  393. memset(&hints, 0, sizeof(hints));
  394. hints.ai_family = AF_INET;
  395. FILE *fp = fopen(hostsfile.filename(), "r");
  396. ASSERT_NE(nullptr, fp);
  397. for (int ii = 1; ii <= 3; ii++) {
  398. rewind(fp);
  399. ClearFails();
  400. SetAllocFail(ii);
  401. struct ares_addrinfo ai;
  402. EXPECT_EQ(ARES_ENOMEM, ares__readaddrinfo(fp, "example.com", port, &hints, &ai)) << ii;
  403. }
  404. fclose(fp);
  405. }
  406. TEST(Misc, OnionDomain) {
  407. EXPECT_EQ(0, ares__is_onion_domain("onion.no"));
  408. EXPECT_EQ(0, ares__is_onion_domain(".onion.no"));
  409. EXPECT_EQ(1, ares__is_onion_domain(".onion"));
  410. EXPECT_EQ(1, ares__is_onion_domain(".onion."));
  411. EXPECT_EQ(1, ares__is_onion_domain("yes.onion"));
  412. EXPECT_EQ(1, ares__is_onion_domain("yes.onion."));
  413. EXPECT_EQ(1, ares__is_onion_domain("YES.ONION"));
  414. EXPECT_EQ(1, ares__is_onion_domain("YES.ONION."));
  415. }
  416. #endif
  417. #ifdef CARES_EXPOSE_STATICS
  418. // These tests access internal static functions from the library, which
  419. // are only exposed when CARES_EXPOSE_STATICS has been configured. As such
  420. // they are tightly couple to the internal library implementation details.
  421. extern "C" char *ares_striendstr(const char*, const char*);
  422. TEST_F(LibraryTest, Striendstr) {
  423. EXPECT_EQ(nullptr, ares_striendstr("abc", "12345"));
  424. EXPECT_NE(nullptr, ares_striendstr("abc12345", "12345"));
  425. EXPECT_NE(nullptr, ares_striendstr("abcxyzzy", "XYZZY"));
  426. EXPECT_NE(nullptr, ares_striendstr("xyzzy", "XYZZY"));
  427. EXPECT_EQ(nullptr, ares_striendstr("xyxzy", "XYZZY"));
  428. EXPECT_NE(nullptr, ares_striendstr("", ""));
  429. const char *str = "plugh";
  430. EXPECT_NE(nullptr, ares_striendstr(str, str));
  431. }
  432. extern "C" int ares__single_domain(ares_channel, const char*, char**);
  433. TEST_F(DefaultChannelTest, SingleDomain) {
  434. TempFile aliases("www www.google.com\n");
  435. EnvValue with_env("HOSTALIASES", aliases.filename());
  436. SetAllocSizeFail(128);
  437. char *ptr = nullptr;
  438. EXPECT_EQ(ARES_ENOMEM, ares__single_domain(channel_, "www", &ptr));
  439. channel_->flags |= ARES_FLAG_NOSEARCH|ARES_FLAG_NOALIASES;
  440. EXPECT_EQ(ARES_SUCCESS, ares__single_domain(channel_, "www", &ptr));
  441. EXPECT_EQ("www", std::string(ptr));
  442. ares_free(ptr);
  443. ptr = nullptr;
  444. SetAllocFail(1);
  445. EXPECT_EQ(ARES_ENOMEM, ares__single_domain(channel_, "www", &ptr));
  446. EXPECT_EQ(nullptr, ptr);
  447. }
  448. #endif
  449. TEST_F(DefaultChannelTest, SaveInvalidChannel) {
  450. int saved = channel_->nservers;
  451. channel_->nservers = -1;
  452. struct ares_options opts;
  453. int optmask = 0;
  454. EXPECT_EQ(ARES_ENODATA, ares_save_options(channel_, &opts, &optmask));
  455. channel_->nservers = saved;
  456. }
  457. // Need to put this in own function due to nested lambda bug
  458. // in VS2013. (C2888)
  459. static int configure_socket(ares_socket_t s) {
  460. // transposed from ares-process, simplified non-block setter.
  461. #if defined(USE_BLOCKING_SOCKETS)
  462. return 0; /* returns success */
  463. #elif defined(HAVE_FCNTL_O_NONBLOCK)
  464. /* most recent unix versions */
  465. int flags;
  466. flags = fcntl(s, F_GETFL, 0);
  467. return fcntl(s, F_SETFL, flags | O_NONBLOCK);
  468. #elif defined(HAVE_IOCTL_FIONBIO)
  469. /* older unix versions */
  470. int flags = 1;
  471. return ioctl(s, FIONBIO, &flags);
  472. #elif defined(HAVE_IOCTLSOCKET_FIONBIO)
  473. #ifdef WATT32
  474. char flags = 1;
  475. #else
  476. /* Windows */
  477. unsigned long flags = 1UL;
  478. #endif
  479. return ioctlsocket(s, FIONBIO, &flags);
  480. #elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO)
  481. /* Amiga */
  482. long flags = 1L;
  483. return IoctlSocket(s, FIONBIO, flags);
  484. #elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK)
  485. /* BeOS */
  486. long b = 1L;
  487. return setsockopt(s, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
  488. #else
  489. # error "no non-blocking method was found/used/set"
  490. #endif
  491. }
  492. // TODO: This should not really be in this file, but we need ares config
  493. // flags, and here they are available.
  494. const struct ares_socket_functions VirtualizeIO::default_functions = {
  495. [](int af, int type, int protocol, void *) -> ares_socket_t {
  496. auto s = ::socket(af, type, protocol);
  497. if (s == ARES_SOCKET_BAD) {
  498. return s;
  499. }
  500. if (configure_socket(s) != 0) {
  501. sclose(s);
  502. return ares_socket_t(-1);
  503. }
  504. return s;
  505. },
  506. [](ares_socket_t s, void * p) {
  507. return :: sclose(s);
  508. },
  509. [](ares_socket_t s, const struct sockaddr * addr, socklen_t len, void *) {
  510. return ::connect(s, addr, len);
  511. },
  512. [](ares_socket_t s, void * dst, size_t len, int flags, struct sockaddr * addr, socklen_t * alen, void *) -> ares_ssize_t {
  513. #ifdef HAVE_RECVFROM
  514. return ::recvfrom(s, reinterpret_cast<RECV_TYPE_ARG2>(dst), len, flags, addr, alen);
  515. #else
  516. return sread(s, dst, len);
  517. #endif
  518. },
  519. [](ares_socket_t s, const struct iovec * vec, int len, void *) {
  520. #ifndef HAVE_WRITEV
  521. return ares_writev(s, vec, len);
  522. #else
  523. return :: writev(s, vec, len);
  524. #endif
  525. }
  526. };
  527. } // namespace test
  528. } // namespace ares