address_sorting_test.cc 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. /*
  2. *
  3. * Copyright 2017 gRPC authors.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. */
  18. #include <grpc/grpc.h>
  19. #include <grpc/support/alloc.h>
  20. #include <grpc/support/host_port.h>
  21. #include <grpc/support/log.h>
  22. #include <grpc/support/string_util.h>
  23. #include <grpc/support/sync.h>
  24. #include <grpc/support/time.h>
  25. #include <string.h>
  26. #include <arpa/inet.h>
  27. #include <gflags/gflags.h>
  28. #include <gmock/gmock.h>
  29. #include <sys/socket.h>
  30. #include <sys/types.h>
  31. #include <vector>
  32. #include <address_sorting.h>
  33. #include "test/cpp/util/subprocess.h"
  34. #include "test/cpp/util/test_config.h"
  35. #include "src/core/ext/filters/client_channel/client_channel.h"
  36. #include "src/core/ext/filters/client_channel/resolver.h"
  37. #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
  38. #include "src/core/ext/filters/client_channel/resolver_registry.h"
  39. #include "src/core/lib/channel/channel_args.h"
  40. #include "src/core/lib/iomgr/combiner.h"
  41. #include "src/core/lib/iomgr/executor.h"
  42. #include "src/core/lib/iomgr/iomgr.h"
  43. #include "src/core/lib/iomgr/resolve_address.h"
  44. #include "src/core/lib/iomgr/sockaddr_utils.h"
  45. #include "src/core/lib/support/env.h"
  46. #include "src/core/lib/support/string.h"
  47. #include "test/core/util/port.h"
  48. #include "test/core/util/test_config.h"
  49. namespace {
  50. struct TestAddress {
  51. std::string dest_addr;
  52. int family;
  53. };
  54. grpc_resolved_address TestAddressToGrpcResolvedAddress(TestAddress test_addr) {
  55. char* host;
  56. char* port;
  57. grpc_resolved_address resolved_addr;
  58. gpr_split_host_port(test_addr.dest_addr.c_str(), &host, &port);
  59. if (test_addr.family == AF_INET) {
  60. sockaddr_in in_dest;
  61. memset(&in_dest, 0, sizeof(sockaddr_in));
  62. in_dest.sin_port = htons(atoi(port));
  63. in_dest.sin_family = AF_INET;
  64. GPR_ASSERT(inet_pton(AF_INET, host, &in_dest.sin_addr) == 1);
  65. memcpy(&resolved_addr.addr, &in_dest, sizeof(sockaddr_in));
  66. resolved_addr.len = sizeof(sockaddr_in);
  67. } else {
  68. GPR_ASSERT(test_addr.family == AF_INET6);
  69. sockaddr_in6 in6_dest;
  70. memset(&in6_dest, 0, sizeof(sockaddr_in6));
  71. in6_dest.sin6_port = htons(atoi(port));
  72. in6_dest.sin6_family = AF_INET6;
  73. GPR_ASSERT(inet_pton(AF_INET6, host, &in6_dest.sin6_addr) == 1);
  74. memcpy(&resolved_addr.addr, &in6_dest, sizeof(sockaddr_in6));
  75. resolved_addr.len = sizeof(sockaddr_in6);
  76. }
  77. gpr_free(host);
  78. gpr_free(port);
  79. return resolved_addr;
  80. }
  81. class MockSourceAddrFactory : public address_sorting_source_addr_factory {
  82. public:
  83. MockSourceAddrFactory(
  84. bool ipv4_supported, bool ipv6_supported,
  85. const std::map<std::string, TestAddress>& dest_addr_to_src_addr)
  86. : ipv4_supported_(ipv4_supported),
  87. ipv6_supported_(ipv6_supported),
  88. dest_addr_to_src_addr_(dest_addr_to_src_addr) {}
  89. bool GetSourceAddr(const address_sorting_address* dest_addr,
  90. address_sorting_address* source_addr) {
  91. if ((address_sorting_abstract_get_family(dest_addr) ==
  92. ADDRESS_SORTING_AF_INET &&
  93. !ipv4_supported_) ||
  94. (address_sorting_abstract_get_family(dest_addr) ==
  95. ADDRESS_SORTING_AF_INET6 &&
  96. !ipv6_supported_)) {
  97. return false;
  98. }
  99. char* ip_addr_str;
  100. grpc_resolved_address dest_addr_as_resolved_addr;
  101. memcpy(&dest_addr_as_resolved_addr.addr, dest_addr, dest_addr->len);
  102. dest_addr_as_resolved_addr.len = dest_addr->len;
  103. grpc_sockaddr_to_string(&ip_addr_str, &dest_addr_as_resolved_addr,
  104. false /* normalize */);
  105. auto it = dest_addr_to_src_addr_.find(ip_addr_str);
  106. if (it == dest_addr_to_src_addr_.end()) {
  107. gpr_log(GPR_DEBUG, "can't find |%s| in dest to src map", ip_addr_str);
  108. gpr_free(ip_addr_str);
  109. return false;
  110. }
  111. gpr_free(ip_addr_str);
  112. grpc_resolved_address source_addr_as_resolved_addr =
  113. TestAddressToGrpcResolvedAddress(it->second);
  114. memcpy(source_addr->addr, &source_addr_as_resolved_addr.addr,
  115. source_addr_as_resolved_addr.len);
  116. source_addr->len = source_addr_as_resolved_addr.len;
  117. return true;
  118. }
  119. private:
  120. // user provided test config
  121. bool ipv4_supported_;
  122. bool ipv6_supported_;
  123. std::map<std::string, TestAddress> dest_addr_to_src_addr_;
  124. };
  125. static bool mock_source_addr_factory_wrapper_get_source_addr(
  126. address_sorting_source_addr_factory* factory,
  127. const address_sorting_address* dest_addr,
  128. address_sorting_address* source_addr) {
  129. MockSourceAddrFactory* mock =
  130. reinterpret_cast<MockSourceAddrFactory*>(factory);
  131. return mock->GetSourceAddr(dest_addr, source_addr);
  132. }
  133. void mock_source_addr_factory_wrapper_destroy(
  134. address_sorting_source_addr_factory* factory) {
  135. MockSourceAddrFactory* mock =
  136. reinterpret_cast<MockSourceAddrFactory*>(factory);
  137. delete mock;
  138. }
  139. const address_sorting_source_addr_factory_vtable kMockSourceAddrFactoryVtable =
  140. {
  141. mock_source_addr_factory_wrapper_get_source_addr,
  142. mock_source_addr_factory_wrapper_destroy,
  143. };
  144. void OverrideAddressSortingSourceAddrFactory(
  145. bool ipv4_supported, bool ipv6_supported,
  146. const std::map<std::string, TestAddress>& dest_addr_to_src_addr) {
  147. address_sorting_source_addr_factory* factory = new MockSourceAddrFactory(
  148. ipv4_supported, ipv6_supported, dest_addr_to_src_addr);
  149. factory->vtable = &kMockSourceAddrFactoryVtable;
  150. address_sorting_override_source_addr_factory_for_testing(factory);
  151. }
  152. grpc_lb_addresses* BuildLbAddrInputs(std::vector<TestAddress> test_addrs) {
  153. grpc_lb_addresses* lb_addrs = grpc_lb_addresses_create(0, NULL);
  154. lb_addrs->addresses =
  155. (grpc_lb_address*)gpr_zalloc(sizeof(grpc_lb_address) * test_addrs.size());
  156. lb_addrs->num_addresses = test_addrs.size();
  157. for (size_t i = 0; i < test_addrs.size(); i++) {
  158. lb_addrs->addresses[i].address =
  159. TestAddressToGrpcResolvedAddress(test_addrs[i]);
  160. }
  161. return lb_addrs;
  162. }
  163. void VerifyLbAddrOutputs(grpc_lb_addresses* lb_addrs,
  164. std::vector<std::string> expected_addrs) {
  165. EXPECT_EQ(lb_addrs->num_addresses, expected_addrs.size());
  166. for (size_t i = 0; i < lb_addrs->num_addresses; i++) {
  167. char* ip_addr_str;
  168. grpc_sockaddr_to_string(&ip_addr_str, &lb_addrs->addresses[i].address,
  169. false /* normalize */);
  170. EXPECT_EQ(expected_addrs[i], ip_addr_str);
  171. gpr_free(ip_addr_str);
  172. }
  173. grpc_core::ExecCtx exec_ctx;
  174. grpc_lb_addresses_destroy(lb_addrs);
  175. }
  176. } // namespace
  177. /* Tests for rule 1 */
  178. TEST(AddressSortingTest, TestDepriotizesUnreachableAddresses) {
  179. bool ipv4_supported = true;
  180. bool ipv6_supported = true;
  181. OverrideAddressSortingSourceAddrFactory(
  182. ipv4_supported, ipv6_supported,
  183. {
  184. {"1.2.3.4:443", {"4.3.2.1:443", AF_INET}},
  185. });
  186. auto* lb_addrs = BuildLbAddrInputs({
  187. {"1.2.3.4:443", AF_INET},
  188. {"5.6.7.8:443", AF_INET},
  189. });
  190. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  191. VerifyLbAddrOutputs(lb_addrs, {
  192. "1.2.3.4:443",
  193. "5.6.7.8:443",
  194. });
  195. }
  196. TEST(AddressSortingTest, TestDepriotizesUnsupportedDomainIpv6) {
  197. bool ipv4_supported = true;
  198. bool ipv6_supported = false;
  199. OverrideAddressSortingSourceAddrFactory(
  200. ipv4_supported, ipv6_supported,
  201. {
  202. {"1.2.3.4:443", {"4.3.2.1:0", AF_INET}},
  203. });
  204. auto lb_addrs = BuildLbAddrInputs({
  205. {"[2607:f8b0:400a:801::1002]:443", AF_INET6},
  206. {"1.2.3.4:443", AF_INET},
  207. });
  208. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  209. VerifyLbAddrOutputs(lb_addrs, {
  210. "1.2.3.4:443",
  211. "[2607:f8b0:400a:801::1002]:443",
  212. });
  213. }
  214. TEST(AddressSortingTest, TestDepriotizesUnsupportedDomainIpv4) {
  215. bool ipv4_supported = false;
  216. bool ipv6_supported = true;
  217. OverrideAddressSortingSourceAddrFactory(
  218. ipv4_supported, ipv6_supported,
  219. {
  220. {"1.2.3.4:443", {"4.3.2.1:0", AF_INET}},
  221. {"[2607:f8b0:400a:801::1002]:443", {"[fec0::1234]:0", AF_INET6}},
  222. });
  223. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  224. {"[2607:f8b0:400a:801::1002]:443", AF_INET6},
  225. {"1.2.3.4:443", AF_INET},
  226. });
  227. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  228. VerifyLbAddrOutputs(lb_addrs, {
  229. "[2607:f8b0:400a:801::1002]:443",
  230. "1.2.3.4:443",
  231. });
  232. }
  233. /* Tests for rule 2 */
  234. TEST(AddressSortingTest, TestDepriotizesNonMatchingScope) {
  235. bool ipv4_supported = true;
  236. bool ipv6_supported = true;
  237. OverrideAddressSortingSourceAddrFactory(
  238. ipv4_supported, ipv6_supported,
  239. {
  240. {"[2000:f8b0:400a:801::1002]:443",
  241. {"[fec0::1000]:0", AF_INET6}}, // global and site-local scope
  242. {"[fec0::5000]:443",
  243. {"[fec0::5001]:0", AF_INET6}}, // site-local and site-local scope
  244. });
  245. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  246. {"[2000:f8b0:400a:801::1002]:443", AF_INET6},
  247. {"[fec0::5000]:443", AF_INET6},
  248. });
  249. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  250. VerifyLbAddrOutputs(lb_addrs, {
  251. "[fec0::5000]:443",
  252. "[2000:f8b0:400a:801::1002]:443",
  253. });
  254. }
  255. /* Tests for rule 5 */
  256. TEST(AddressSortingTest, TestUsesLabelFromDefaultTable) {
  257. bool ipv4_supported = true;
  258. bool ipv6_supported = true;
  259. OverrideAddressSortingSourceAddrFactory(
  260. ipv4_supported, ipv6_supported,
  261. {
  262. {"[2002::5001]:443", {"[2001::5002]:0", AF_INET6}},
  263. {"[2001::5001]:443",
  264. {"[2001::5002]:0", AF_INET6}}, // matching labels
  265. });
  266. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  267. {"[2002::5001]:443", AF_INET6},
  268. {"[2001::5001]:443", AF_INET6},
  269. });
  270. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  271. VerifyLbAddrOutputs(lb_addrs, {
  272. "[2001::5001]:443",
  273. "[2002::5001]:443",
  274. });
  275. }
  276. /* Tests for rule 6 */
  277. TEST(AddressSortingTest,
  278. TestUsesDestinationWithHigherPrecedenceWithAnIpv4Address) {
  279. bool ipv4_supported = true;
  280. bool ipv6_supported = true;
  281. OverrideAddressSortingSourceAddrFactory(
  282. ipv4_supported, ipv6_supported,
  283. {
  284. {"[3ffe::5001]:443", {"[3ffe::5002]:0", AF_INET6}},
  285. {"1.2.3.4:443", {"5.6.7.8:0", AF_INET}},
  286. });
  287. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  288. {"[3ffe::5001]:443", AF_INET6},
  289. {"1.2.3.4:443", AF_INET},
  290. });
  291. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  292. VerifyLbAddrOutputs(
  293. lb_addrs, {
  294. // The AF_INET address should be IPv4-mapped by the sort,
  295. // and IPv4-mapped
  296. // addresses have higher precedence than 3ffe::/16 by spec.
  297. "1.2.3.4:443",
  298. "[3ffe::5001]:443",
  299. });
  300. }
  301. TEST(AddressSortingTest,
  302. TestUsesDestinationWithHigherPrecedenceWith2000PrefixedAddress) {
  303. bool ipv4_supported = true;
  304. bool ipv6_supported = true;
  305. OverrideAddressSortingSourceAddrFactory(
  306. ipv4_supported, ipv6_supported,
  307. {
  308. {"[2001::1234]:443", {"[2001::5678]:0", AF_INET6}},
  309. {"[2000::5001]:443", {"[2000::5002]:0", AF_INET6}},
  310. });
  311. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  312. {"[2001::1234]:443", AF_INET6},
  313. {"[2000::5001]:443", AF_INET6},
  314. });
  315. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  316. VerifyLbAddrOutputs(
  317. lb_addrs, {
  318. // The 2000::/16 address should match the ::/0 prefix rule
  319. "[2000::5001]:443",
  320. "[2001::1234]:443",
  321. });
  322. }
  323. TEST(
  324. AddressSortingTest,
  325. TestUsesDestinationWithHigherPrecedenceWith2000PrefixedAddressEnsurePrefixMatchHasNoEffect) {
  326. bool ipv4_supported = true;
  327. bool ipv6_supported = true;
  328. OverrideAddressSortingSourceAddrFactory(
  329. ipv4_supported, ipv6_supported,
  330. {
  331. {"[2001::1231]:443", {"[2001::1232]:0", AF_INET6}},
  332. {"[2000::5001]:443", {"[2000::5002]:0", AF_INET6}},
  333. });
  334. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  335. {"[2001::1231]:443", AF_INET6},
  336. {"[2000::5001]:443", AF_INET6},
  337. });
  338. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  339. VerifyLbAddrOutputs(lb_addrs, {
  340. "[2000::5001]:443",
  341. "[2001::1231]:443",
  342. });
  343. }
  344. TEST(AddressSortingTest,
  345. TestUsesDestinationWithHigherPrecedenceWithLinkAndSiteLocalAddresses) {
  346. bool ipv4_supported = true;
  347. bool ipv6_supported = true;
  348. OverrideAddressSortingSourceAddrFactory(
  349. ipv4_supported, ipv6_supported,
  350. {
  351. {"[fec0::1234]:443", {"[fec0::5678]:0", AF_INET6}},
  352. {"[fc00::5001]:443", {"[fc00::5002]:0", AF_INET6}},
  353. });
  354. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  355. {"[fec0::1234]:443", AF_INET6},
  356. {"[fc00::5001]:443", AF_INET6},
  357. });
  358. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  359. VerifyLbAddrOutputs(lb_addrs, {
  360. "[fc00::5001]:443",
  361. "[fec0::1234]:443",
  362. });
  363. }
  364. /* Tests for rule 8 */
  365. TEST(AddressSortingTest, TestPrefersSmallerScope) {
  366. bool ipv4_supported = true;
  367. bool ipv6_supported = true;
  368. OverrideAddressSortingSourceAddrFactory(
  369. ipv4_supported, ipv6_supported,
  370. {
  371. // Both of these destinations have the same precedence in default
  372. // policy
  373. // table.
  374. {"[fec0::1234]:443", {"[fec0::5678]:0", AF_INET6}},
  375. {"[3ffe::5001]:443", {"[3ffe::5002]:0", AF_INET6}},
  376. });
  377. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  378. {"[3ffe::5001]:443", AF_INET6},
  379. {"[fec0::1234]:443", AF_INET6},
  380. });
  381. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  382. VerifyLbAddrOutputs(lb_addrs, {
  383. "[fec0::1234]:443",
  384. "[3ffe::5001]:443",
  385. });
  386. }
  387. /* Tests for rule 9 */
  388. TEST(AddressSortingTest, TestPrefersLongestMatchingSrcDstPrefix) {
  389. bool ipv4_supported = true;
  390. bool ipv6_supported = true;
  391. OverrideAddressSortingSourceAddrFactory(
  392. ipv4_supported, ipv6_supported,
  393. {
  394. // Both of these destinations have the same precedence in default
  395. // policy
  396. // table.
  397. {"[3ffe:1234::]:443", {"[3ffe:1235::]:0", AF_INET6}},
  398. {"[3ffe:5001::]:443", {"[3ffe:4321::]:0", AF_INET6}},
  399. });
  400. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  401. {"[3ffe:5001::]:443", AF_INET6},
  402. {"[3ffe:1234::]:443", AF_INET6},
  403. });
  404. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  405. VerifyLbAddrOutputs(lb_addrs, {
  406. "[3ffe:1234::]:443",
  407. "[3ffe:5001::]:443",
  408. });
  409. }
  410. TEST(AddressSortingTest,
  411. TestPrefersLongestMatchingSrcDstPrefixMatchesWholeAddress) {
  412. bool ipv4_supported = true;
  413. bool ipv6_supported = true;
  414. OverrideAddressSortingSourceAddrFactory(
  415. ipv4_supported, ipv6_supported,
  416. {
  417. {"[3ffe::1234]:443", {"[3ffe::1235]:0", AF_INET6}},
  418. {"[3ffe::5001]:443", {"[3ffe::4321]:0", AF_INET6}},
  419. });
  420. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  421. {"[3ffe::5001]:443", AF_INET6},
  422. {"[3ffe::1234]:443", AF_INET6},
  423. });
  424. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  425. VerifyLbAddrOutputs(lb_addrs, {
  426. "[3ffe::1234]:443",
  427. "[3ffe::5001]:443",
  428. });
  429. }
  430. TEST(AddressSortingTest, TestPrefersLongestPrefixStressInnerBytePrefix) {
  431. bool ipv4_supported = true;
  432. bool ipv6_supported = true;
  433. OverrideAddressSortingSourceAddrFactory(
  434. ipv4_supported, ipv6_supported,
  435. {
  436. {"[3ffe:8000::]:443", {"[3ffe:C000::]:0", AF_INET6}},
  437. {"[3ffe:2000::]:443", {"[3ffe:3000::]:0", AF_INET6}},
  438. });
  439. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  440. {"[3ffe:8000::]:443", AF_INET6},
  441. {"[3ffe:2000::]:443", AF_INET6},
  442. });
  443. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  444. VerifyLbAddrOutputs(lb_addrs, {
  445. "[3ffe:2000::]:443",
  446. "[3ffe:8000::]:443",
  447. });
  448. }
  449. TEST(AddressSortingTest, TestPrefersLongestPrefixDiffersOnHighestBitOfByte) {
  450. bool ipv4_supported = true;
  451. bool ipv6_supported = true;
  452. OverrideAddressSortingSourceAddrFactory(
  453. ipv4_supported, ipv6_supported,
  454. {
  455. {"[3ffe:6::]:443", {"[3ffe:8::]:0", AF_INET6}},
  456. {"[3ffe:c::]:443", {"[3ffe:8::]:0", AF_INET6}},
  457. });
  458. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  459. {"[3ffe:6::]:443", AF_INET6},
  460. {"[3ffe:c::]:443", AF_INET6},
  461. });
  462. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  463. VerifyLbAddrOutputs(lb_addrs, {
  464. "[3ffe:c::]:443",
  465. "[3ffe:6::]:443",
  466. });
  467. }
  468. TEST(AddressSortingTest, TestPrefersLongestPrefixDiffersByLastBit) {
  469. bool ipv4_supported = true;
  470. bool ipv6_supported = true;
  471. OverrideAddressSortingSourceAddrFactory(
  472. ipv4_supported, ipv6_supported,
  473. {
  474. {"[3ffe:1111:1111:1111::]:443",
  475. {"[3ffe:1111:1111:1111::]:0", AF_INET6}},
  476. {"[3ffe:1111:1111:1110::]:443",
  477. {"[3ffe:1111:1111:1111::]:0", AF_INET6}},
  478. });
  479. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  480. {"[3ffe:1111:1111:1110::]:443", AF_INET6},
  481. {"[3ffe:1111:1111:1111::]:443", AF_INET6},
  482. });
  483. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  484. VerifyLbAddrOutputs(lb_addrs, {
  485. "[3ffe:1111:1111:1111::]:443",
  486. "[3ffe:1111:1111:1110::]:443",
  487. });
  488. }
  489. /* Tests for rule 10 */
  490. TEST(AddressSortingTest, TestStableSort) {
  491. bool ipv4_supported = true;
  492. bool ipv6_supported = true;
  493. OverrideAddressSortingSourceAddrFactory(
  494. ipv4_supported, ipv6_supported,
  495. {
  496. {"[3ffe::1234]:443", {"[3ffe::1236]:0", AF_INET6}},
  497. {"[3ffe::1235]:443", {"[3ffe::1237]:0", AF_INET6}},
  498. });
  499. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  500. {"[3ffe::1234]:443", AF_INET6},
  501. {"[3ffe::1235]:443", AF_INET6},
  502. });
  503. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  504. VerifyLbAddrOutputs(lb_addrs, {
  505. "[3ffe::1234]:443",
  506. "[3ffe::1235]:443",
  507. });
  508. }
  509. TEST(AddressSortingTest, TestStableSortFiveElements) {
  510. bool ipv4_supported = true;
  511. bool ipv6_supported = true;
  512. OverrideAddressSortingSourceAddrFactory(
  513. ipv4_supported, ipv6_supported,
  514. {
  515. {"[3ffe::1231]:443", {"[3ffe::1201]:0", AF_INET6}},
  516. {"[3ffe::1232]:443", {"[3ffe::1202]:0", AF_INET6}},
  517. {"[3ffe::1233]:443", {"[3ffe::1203]:0", AF_INET6}},
  518. {"[3ffe::1234]:443", {"[3ffe::1204]:0", AF_INET6}},
  519. {"[3ffe::1235]:443", {"[3ffe::1205]:0", AF_INET6}},
  520. });
  521. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  522. {"[3ffe::1231]:443", AF_INET6},
  523. {"[3ffe::1232]:443", AF_INET6},
  524. {"[3ffe::1233]:443", AF_INET6},
  525. {"[3ffe::1234]:443", AF_INET6},
  526. {"[3ffe::1235]:443", AF_INET6},
  527. });
  528. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  529. VerifyLbAddrOutputs(lb_addrs, {
  530. "[3ffe::1231]:443",
  531. "[3ffe::1232]:443",
  532. "[3ffe::1233]:443",
  533. "[3ffe::1234]:443",
  534. "[3ffe::1235]:443",
  535. });
  536. }
  537. TEST(AddressSortingTest, TestStableSortNoSrcAddrsExist) {
  538. bool ipv4_supported = true;
  539. bool ipv6_supported = true;
  540. OverrideAddressSortingSourceAddrFactory(ipv4_supported, ipv6_supported, {});
  541. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  542. {"[3ffe::1231]:443", AF_INET6},
  543. {"[3ffe::1232]:443", AF_INET6},
  544. {"[3ffe::1233]:443", AF_INET6},
  545. {"[3ffe::1234]:443", AF_INET6},
  546. {"[3ffe::1235]:443", AF_INET6},
  547. });
  548. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  549. VerifyLbAddrOutputs(lb_addrs, {
  550. "[3ffe::1231]:443",
  551. "[3ffe::1232]:443",
  552. "[3ffe::1233]:443",
  553. "[3ffe::1234]:443",
  554. "[3ffe::1235]:443",
  555. });
  556. }
  557. TEST(AddressSortingTest, TestStableSortNoSrcAddrsExistWithIpv4) {
  558. bool ipv4_supported = true;
  559. bool ipv6_supported = true;
  560. OverrideAddressSortingSourceAddrFactory(ipv4_supported, ipv6_supported, {});
  561. grpc_lb_addresses* lb_addrs = BuildLbAddrInputs({
  562. {"[::ffff:5.6.7.8]:443", AF_INET6},
  563. {"1.2.3.4:443", AF_INET},
  564. });
  565. grpc_cares_wrapper_address_sorting_sort(lb_addrs);
  566. VerifyLbAddrOutputs(lb_addrs, {
  567. "[::ffff:5.6.7.8]:443",
  568. "1.2.3.4:443",
  569. });
  570. }
  571. int main(int argc, char** argv) {
  572. const char* resolver = gpr_getenv("GRPC_DNS_RESOLVER");
  573. if (resolver == NULL || strlen(resolver) == 0) {
  574. gpr_setenv("GRPC_DNS_RESOLVER", "ares");
  575. } else if (strcmp("ares", resolver)) {
  576. gpr_log(GPR_INFO, "GRPC_DNS_RESOLVER != ares: %s.", resolver);
  577. }
  578. grpc_test_init(argc, argv);
  579. ::testing::InitGoogleTest(&argc, argv);
  580. grpc_init();
  581. auto result = RUN_ALL_TESTS();
  582. grpc_shutdown();
  583. return result;
  584. }