ares-test-internal.cc 23 KB

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