24 #include <gmock/gmock.h>
25 #include <gtest/gtest.h>
27 #include "absl/functional/bind_front.h"
28 #include "absl/strings/match.h"
55 const char* g_resolver_type =
"";
59 ResolveAddressTest() {
69 ~ResolveAddressTest()
override {
76 grpc_schedule_on_exec_ctx);
90 void PollPollsetUntilRequestDone() {
124 void MustFailExpectCancelledErrorMessage(
138 void MustSucceedWithIPv6First(
142 reinterpret_cast<const struct sockaddr*
>((*
result)[0].addr)
147 void MustSucceedWithIPv4First(
151 reinterpret_cast<const struct sockaddr*
>((*
result)[0].addr)
152 ->sa_family == AF_INET);
156 void MustNotBeCalled(
158 FAIL() <<
"This should never be called";
186 "localhost:1",
"", pollset_set(),
189 PollPollsetUntilRequestDone();
192 TEST_F(ResolveAddressTest, DefaultPort) {
195 "localhost",
"1", pollset_set(),
198 PollPollsetUntilRequestDone();
201 TEST_F(ResolveAddressTest, LocalhostResultHasIPv6First) {
203 GTEST_SKIP() <<
"this test is only valid with the c-ares resolver";
207 "localhost:1",
"", pollset_set(),
210 PollPollsetUntilRequestDone();
225 source_addr->
len = dest_addr->
len;
234 kMockIpv6DisabledSourceAddrFactoryVtable = {
235 IPv6DisabledGetSourceAddr,
236 DeleteSourceAddrFactory,
241 TEST_F(ResolveAddressTest, LocalhostResultHasIPv4FirstWhenIPv6IsntAvalailable) {
243 GTEST_SKIP() <<
"this test is only valid with the c-ares resolver";
249 mock->
vtable = &kMockIpv6DisabledSourceAddrFactoryVtable;
254 "localhost:1",
"", pollset_set(),
257 PollPollsetUntilRequestDone();
260 TEST_F(ResolveAddressTest, NonNumericDefaultPort) {
263 "localhost",
"http", pollset_set(),
266 PollPollsetUntilRequestDone();
269 TEST_F(ResolveAddressTest, MissingDefaultPort) {
272 "localhost",
"", pollset_set(),
275 PollPollsetUntilRequestDone();
278 TEST_F(ResolveAddressTest, IPv6WithPort) {
281 "[2001:db8::1]:1",
"", pollset_set(),
284 PollPollsetUntilRequestDone();
293 test->PollPollsetUntilRequestDone();
296 TEST_F(ResolveAddressTest, IPv6WithoutPortNoBrackets) {
300 TEST_F(ResolveAddressTest, IPv6WithoutPortWithBrackets) {
304 TEST_F(ResolveAddressTest, IPv6WithoutPortV4MappedV6) {
314 test->PollPollsetUntilRequestDone();
317 TEST_F(ResolveAddressTest, InvalidIPv4Addresses) {
321 TEST_F(ResolveAddressTest, InvalidIPv6Addresses) {
331 test->PollPollsetUntilRequestDone();
334 TEST_F(ResolveAddressTest, UnparseableHostPortsOnlyBracket) {
338 TEST_F(ResolveAddressTest, UnparseableHostPortsMissingRightBracket) {
342 TEST_F(ResolveAddressTest, UnparseableHostPortsBadPort) {
346 TEST_F(ResolveAddressTest, UnparseableHostPortsBadIPv6) {
350 TEST_F(ResolveAddressTest, UnparseableHostPortsBadLocalhost) {
354 TEST_F(ResolveAddressTest, UnparseableHostPortsBadLocalhostWithPort) {
360 TEST_F(ResolveAddressTest, ImmediateCancel) {
363 "localhost:1",
"1", pollset_set(),
369 PollPollsetUntilRequestDone();
373 TEST_F(ResolveAddressTest, CancelDoesNotSucceed) {
376 "localhost:1",
"1", pollset_set(),
379 PollPollsetUntilRequestDone();
385 int g_fake_non_responsive_dns_server_port;
389 "Injecting broken nameserver list. Bad server address:|[::1]:%d|.",
390 g_fake_non_responsive_dns_server_port);
394 memset(dns_server_addrs, 0,
sizeof(dns_server_addrs));
395 dns_server_addrs[0].family =
AF_INET6;
396 (
reinterpret_cast<char*
>(&dns_server_addrs[0].addr.addr6))[15] = 0x1;
397 dns_server_addrs[0].tcp_port = g_fake_non_responsive_dns_server_port;
398 dns_server_addrs[0].udp_port = g_fake_non_responsive_dns_server_port;
399 dns_server_addrs[0].next =
nullptr;
405 TEST_F(ResolveAddressTest, CancelWithNonResponsiveDNSServer) {
407 GTEST_SKIP() <<
"the native resolver doesn't support cancellation, so we "
408 "can only test this with c-ares";
413 kWaitForClientToSendFirstBytes,
415 g_fake_non_responsive_dns_server_port = fake_dns_server.
port();
420 "foo.bar.com:1",
"1", pollset_set(),
427 PollPollsetUntilRequestDone();
433 static std::unique_ptr<PollsetSetWrapper>
Create() {
463 TEST_F(ResolveAddressTest, DeleteInterestedPartiesAfterCancellation) {
467 GTEST_SKIP() <<
"the native resolver doesn't support cancellation, so we "
468 "can only test this with c-ares";
473 kWaitForClientToSendFirstBytes,
475 g_fake_non_responsive_dns_server_port = fake_dns_server.
port();
483 "foo.bar.com:1",
"1", pss->pollset_set(),
493 PollPollsetUntilRequestDone();
496 int main(
int argc,
char** argv) {
501 g_resolver_type =
"native";
503 g_resolver_type =
"ares";