|
|
|
@ -154,10 +154,10 @@ class ResolveAddressTest : public ::testing::Test { |
|
|
|
|
Finish(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void MustNotBeCalled( |
|
|
|
|
absl::StatusOr<std::vector<grpc_resolved_address>> /*result*/) { |
|
|
|
|
FAIL() << "This should never be called"; |
|
|
|
|
} |
|
|
|
|
grpc_pollset_set* pollset_set() const { return pollset_set_; } |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
static void DoNothing(void* /*arg*/, grpc_error_handle /*error*/) {} |
|
|
|
|
|
|
|
|
|
void Finish() { |
|
|
|
|
grpc_core::MutexLockForGprMu lock(mu_); |
|
|
|
@ -165,11 +165,6 @@ class ResolveAddressTest : public ::testing::Test { |
|
|
|
|
GRPC_LOG_IF_ERROR("pollset_kick", grpc_pollset_kick(pollset_, nullptr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grpc_pollset_set* pollset_set() const { return pollset_set_; } |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
static void DoNothing(void* /*arg*/, grpc_error_handle /*error*/) {} |
|
|
|
|
|
|
|
|
|
gpr_mu* mu_; |
|
|
|
|
bool done_ = false; // guarded by mu
|
|
|
|
|
grpc_pollset* pollset_; // guarded by mu
|
|
|
|
@ -183,18 +178,20 @@ class ResolveAddressTest : public ::testing::Test { |
|
|
|
|
|
|
|
|
|
TEST_F(ResolveAddressTest, Localhost) { |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
auto r = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
"localhost:1", "", pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustSucceed, this)); |
|
|
|
|
r->Start(); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
PollPollsetUntilRequestDone(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(ResolveAddressTest, DefaultPort) { |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
auto r = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
"localhost", "1", pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustSucceed, this)); |
|
|
|
|
r->Start(); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
PollPollsetUntilRequestDone(); |
|
|
|
|
} |
|
|
|
@ -204,9 +201,10 @@ TEST_F(ResolveAddressTest, LocalhostResultHasIPv6First) { |
|
|
|
|
GTEST_SKIP() << "this test is only valid with the c-ares resolver"; |
|
|
|
|
} |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
auto r = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
"localhost:1", "", pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustSucceedWithIPv6First, this)); |
|
|
|
|
r->Start(); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
PollPollsetUntilRequestDone(); |
|
|
|
|
} |
|
|
|
@ -251,45 +249,50 @@ TEST_F(ResolveAddressTest, LocalhostResultHasIPv4FirstWhenIPv6IsntAvalailable) { |
|
|
|
|
address_sorting_override_source_addr_factory_for_testing(mock); |
|
|
|
|
// run the test
|
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
auto r = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
"localhost:1", "", pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustSucceedWithIPv4First, this)); |
|
|
|
|
r->Start(); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
PollPollsetUntilRequestDone(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(ResolveAddressTest, NonNumericDefaultPort) { |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
auto r = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
"localhost", "http", pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustSucceed, this)); |
|
|
|
|
r->Start(); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
PollPollsetUntilRequestDone(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(ResolveAddressTest, MissingDefaultPort) { |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
auto r = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
"localhost", "", pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustFail, this)); |
|
|
|
|
r->Start(); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
PollPollsetUntilRequestDone(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(ResolveAddressTest, IPv6WithPort) { |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
auto r = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
"[2001:db8::1]:1", "", pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustSucceed, this)); |
|
|
|
|
r->Start(); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
PollPollsetUntilRequestDone(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void TestIPv6WithoutPort(ResolveAddressTest* test, const char* target) { |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
auto r = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
target, "80", test->pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustSucceed, test)); |
|
|
|
|
r->Start(); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
test->PollPollsetUntilRequestDone(); |
|
|
|
|
} |
|
|
|
@ -308,9 +311,10 @@ TEST_F(ResolveAddressTest, IPv6WithoutPortV4MappedV6) { |
|
|
|
|
|
|
|
|
|
void TestInvalidIPAddress(ResolveAddressTest* test, const char* target) { |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
auto r = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
target, "", test->pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustFail, test)); |
|
|
|
|
r->Start(); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
test->PollPollsetUntilRequestDone(); |
|
|
|
|
} |
|
|
|
@ -325,9 +329,10 @@ TEST_F(ResolveAddressTest, InvalidIPv6Addresses) { |
|
|
|
|
|
|
|
|
|
void TestUnparseableHostPort(ResolveAddressTest* test, const char* target) { |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
auto r = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
target, "1", test->pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustFail, test)); |
|
|
|
|
r->Start(); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
test->PollPollsetUntilRequestDone(); |
|
|
|
|
} |
|
|
|
@ -360,25 +365,13 @@ TEST_F(ResolveAddressTest, UnparseableHostPortsBadLocalhostWithPort) { |
|
|
|
|
// test doesn't care what the result is, just that we don't crash etc.
|
|
|
|
|
TEST_F(ResolveAddressTest, ImmediateCancel) { |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
auto request_handle = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
auto r = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
"localhost:1", "1", pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::DontCare, this)); |
|
|
|
|
if (grpc_core::GetDNSResolver()->Cancel(request_handle)) { |
|
|
|
|
Finish(); |
|
|
|
|
} |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
PollPollsetUntilRequestDone(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Attempt to cancel a request after it has completed.
|
|
|
|
|
TEST_F(ResolveAddressTest, CancelDoesNotSucceed) { |
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
auto request_handle = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
"localhost:1", "1", pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustSucceed, this)); |
|
|
|
|
r->Start(); |
|
|
|
|
r.reset(); // cancel the resolution
|
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
PollPollsetUntilRequestDone(); |
|
|
|
|
ASSERT_FALSE(grpc_core::GetDNSResolver()->Cancel(request_handle)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
@ -417,14 +410,14 @@ TEST_F(ResolveAddressTest, CancelWithNonResponsiveDNSServer) { |
|
|
|
|
grpc_ares_test_only_inject_config = InjectNonResponsiveDNSServer; |
|
|
|
|
// Run the test
|
|
|
|
|
grpc_core::ExecCtx exec_ctx; |
|
|
|
|
auto request_handle = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
auto r = grpc_core::GetDNSResolver()->ResolveName( |
|
|
|
|
"foo.bar.com:1", "1", pollset_set(), |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustNotBeCalled, this)); |
|
|
|
|
absl::bind_front(&ResolveAddressTest::MustFailExpectCancelledErrorMessage, |
|
|
|
|
this)); |
|
|
|
|
r->Start(); |
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); // initiate DNS requests
|
|
|
|
|
ASSERT_TRUE(grpc_core::GetDNSResolver()->Cancel(request_handle)); |
|
|
|
|
Finish(); |
|
|
|
|
// let cancellation work finish to ensure the callback is not called
|
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); |
|
|
|
|
r.reset(); // cancel the resolution
|
|
|
|
|
grpc_core::ExecCtx::Get()->Flush(); // let cancellation work finish
|
|
|
|
|
PollPollsetUntilRequestDone(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|