Delete dns resolver connectivity test (#28994)
parent
33135abbee
commit
bbe49dc16b
5 changed files with 0 additions and 370 deletions
@ -1,214 +0,0 @@ |
|||||||
/*
|
|
||||||
* |
|
||||||
* Copyright 2015 gRPC authors. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
* |
|
||||||
*/ |
|
||||||
|
|
||||||
#include <string.h> |
|
||||||
|
|
||||||
#include <grpc/grpc.h> |
|
||||||
#include <grpc/support/alloc.h> |
|
||||||
|
|
||||||
#include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" |
|
||||||
#include "src/core/lib/channel/channel_args.h" |
|
||||||
#include "src/core/lib/config/core_configuration.h" |
|
||||||
#include "src/core/lib/iomgr/resolve_address.h" |
|
||||||
#include "src/core/lib/iomgr/resolve_address_impl.h" |
|
||||||
#include "src/core/lib/iomgr/timer.h" |
|
||||||
#include "src/core/lib/iomgr/work_serializer.h" |
|
||||||
#include "src/core/lib/resolver/resolver.h" |
|
||||||
#include "src/core/lib/resolver/resolver_registry.h" |
|
||||||
#include "src/core/lib/resolver/server_address.h" |
|
||||||
#include "test/core/util/test_config.h" |
|
||||||
|
|
||||||
static gpr_mu g_mu; |
|
||||||
static bool g_fail_resolution = true; |
|
||||||
static std::shared_ptr<grpc_core::WorkSerializer>* g_work_serializer; |
|
||||||
|
|
||||||
namespace { |
|
||||||
|
|
||||||
class TestDNSResolver : public grpc_core::DNSResolver { |
|
||||||
public: |
|
||||||
class TestDNSRequest : public grpc_core::DNSResolver::Request { |
|
||||||
public: |
|
||||||
explicit TestDNSRequest( |
|
||||||
std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)> |
|
||||||
on_done) |
|
||||||
: on_done_(std::move(on_done)) {} |
|
||||||
|
|
||||||
void Start() override { |
|
||||||
gpr_mu_lock(&g_mu); |
|
||||||
if (g_fail_resolution) { |
|
||||||
g_fail_resolution = false; |
|
||||||
gpr_mu_unlock(&g_mu); |
|
||||||
new grpc_core::DNSCallbackExecCtxScheduler( |
|
||||||
std::move(on_done_), absl::UnknownError("Forced Failure")); |
|
||||||
} else { |
|
||||||
gpr_mu_unlock(&g_mu); |
|
||||||
std::vector<grpc_resolved_address> addrs; |
|
||||||
grpc_resolved_address phony_resolved_address; |
|
||||||
memset(&phony_resolved_address, 0, sizeof(phony_resolved_address)); |
|
||||||
addrs.push_back(phony_resolved_address); |
|
||||||
new grpc_core::DNSCallbackExecCtxScheduler(std::move(on_done_), addrs); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void Orphan() override { Unref(); } |
|
||||||
|
|
||||||
private: |
|
||||||
std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)> |
|
||||||
on_done_; |
|
||||||
}; |
|
||||||
|
|
||||||
grpc_core::OrphanablePtr<grpc_core::DNSResolver::Request> ResolveName( |
|
||||||
absl::string_view name, absl::string_view /* default_port */, |
|
||||||
grpc_pollset_set* /* interested_parties */, |
|
||||||
std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)> |
|
||||||
on_done) override { |
|
||||||
GPR_ASSERT("test" == name); |
|
||||||
return grpc_core::MakeOrphanable<TestDNSRequest>(std::move(on_done)); |
|
||||||
} |
|
||||||
|
|
||||||
absl::StatusOr<std::vector<grpc_resolved_address>> ResolveNameBlocking( |
|
||||||
absl::string_view /* name */, |
|
||||||
absl::string_view /* default_port */) override { |
|
||||||
GPR_ASSERT(0); |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
static grpc_ares_request* my_dns_lookup_ares( |
|
||||||
const char* /*dns_server*/, const char* addr, const char* /*default_port*/, |
|
||||||
grpc_pollset_set* /*interested_parties*/, grpc_closure* on_done, |
|
||||||
std::unique_ptr<grpc_core::ServerAddressList>* addresses, |
|
||||||
std::unique_ptr<grpc_core::ServerAddressList>* /*balancer_addresses*/, |
|
||||||
char** /*service_config_json*/, int /*query_timeout_ms*/) { // NOLINT
|
|
||||||
gpr_mu_lock(&g_mu); |
|
||||||
GPR_ASSERT(0 == strcmp("test", addr)); |
|
||||||
grpc_error_handle error = GRPC_ERROR_NONE; |
|
||||||
if (g_fail_resolution) { |
|
||||||
g_fail_resolution = false; |
|
||||||
gpr_mu_unlock(&g_mu); |
|
||||||
error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Forced Failure"); |
|
||||||
} else { |
|
||||||
gpr_mu_unlock(&g_mu); |
|
||||||
*addresses = absl::make_unique<grpc_core::ServerAddressList>(); |
|
||||||
grpc_resolved_address phony_resolved_address; |
|
||||||
memset(&phony_resolved_address, 0, sizeof(phony_resolved_address)); |
|
||||||
phony_resolved_address.len = 123; |
|
||||||
(*addresses)->emplace_back(phony_resolved_address, nullptr); |
|
||||||
} |
|
||||||
grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_done, error); |
|
||||||
return nullptr; |
|
||||||
} |
|
||||||
|
|
||||||
static void my_cancel_ares_request(grpc_ares_request* request) { |
|
||||||
GPR_ASSERT(request == nullptr); |
|
||||||
} |
|
||||||
|
|
||||||
static grpc_core::OrphanablePtr<grpc_core::Resolver> create_resolver( |
|
||||||
const char* name, |
|
||||||
std::unique_ptr<grpc_core::Resolver::ResultHandler> result_handler) { |
|
||||||
grpc_core::ResolverFactory* factory = grpc_core::CoreConfiguration::Get() |
|
||||||
.resolver_registry() |
|
||||||
.LookupResolverFactory("dns"); |
|
||||||
absl::StatusOr<grpc_core::URI> uri = grpc_core::URI::Parse(name); |
|
||||||
if (!uri.ok()) { |
|
||||||
gpr_log(GPR_ERROR, "%s", uri.status().ToString().c_str()); |
|
||||||
GPR_ASSERT(uri.ok()); |
|
||||||
} |
|
||||||
grpc_core::ResolverArgs args; |
|
||||||
args.uri = std::move(*uri); |
|
||||||
args.work_serializer = *g_work_serializer; |
|
||||||
args.result_handler = std::move(result_handler); |
|
||||||
grpc_core::OrphanablePtr<grpc_core::Resolver> resolver = |
|
||||||
factory->CreateResolver(std::move(args)); |
|
||||||
return resolver; |
|
||||||
} |
|
||||||
|
|
||||||
class ResultHandler : public grpc_core::Resolver::ResultHandler { |
|
||||||
public: |
|
||||||
struct ResolverOutput { |
|
||||||
grpc_core::Resolver::Result result; |
|
||||||
gpr_event ev; |
|
||||||
|
|
||||||
ResolverOutput() { gpr_event_init(&ev); } |
|
||||||
}; |
|
||||||
|
|
||||||
void SetOutput(ResolverOutput* output) { |
|
||||||
gpr_atm_rel_store(&output_, reinterpret_cast<gpr_atm>(output)); |
|
||||||
} |
|
||||||
|
|
||||||
void ReportResult(grpc_core::Resolver::Result result) override { |
|
||||||
ResolverOutput* output = |
|
||||||
reinterpret_cast<ResolverOutput*>(gpr_atm_acq_load(&output_)); |
|
||||||
GPR_ASSERT(output != nullptr); |
|
||||||
output->result = std::move(result); |
|
||||||
gpr_event_set(&output->ev, reinterpret_cast<void*>(1)); |
|
||||||
} |
|
||||||
|
|
||||||
private: |
|
||||||
gpr_atm output_ = 0; // ResolverOutput*
|
|
||||||
}; |
|
||||||
|
|
||||||
// interleave waiting for an event with a timer check
|
|
||||||
static bool wait_loop(int deadline_seconds, gpr_event* ev) { |
|
||||||
while (deadline_seconds) { |
|
||||||
gpr_log(GPR_DEBUG, "Test: waiting for %d more seconds", deadline_seconds); |
|
||||||
if (gpr_event_wait(ev, grpc_timeout_seconds_to_deadline(1))) return true; |
|
||||||
deadline_seconds--; |
|
||||||
|
|
||||||
grpc_core::ExecCtx exec_ctx; |
|
||||||
grpc_timer_check(nullptr); |
|
||||||
} |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
int main(int argc, char** argv) { |
|
||||||
grpc::testing::TestEnvironment env(argc, argv); |
|
||||||
|
|
||||||
grpc_init(); |
|
||||||
gpr_mu_init(&g_mu); |
|
||||||
auto work_serializer = std::make_shared<grpc_core::WorkSerializer>(); |
|
||||||
g_work_serializer = &work_serializer; |
|
||||||
grpc_core::SetDNSResolver(new TestDNSResolver()); |
|
||||||
grpc_dns_lookup_ares = my_dns_lookup_ares; |
|
||||||
grpc_cancel_ares_request = my_cancel_ares_request; |
|
||||||
|
|
||||||
{ |
|
||||||
grpc_core::ExecCtx exec_ctx; |
|
||||||
ResultHandler* result_handler = new ResultHandler(); |
|
||||||
grpc_core::OrphanablePtr<grpc_core::Resolver> resolver = create_resolver( |
|
||||||
"dns:test", |
|
||||||
std::unique_ptr<grpc_core::Resolver::ResultHandler>(result_handler)); |
|
||||||
ResultHandler::ResolverOutput output1; |
|
||||||
result_handler->SetOutput(&output1); |
|
||||||
resolver->StartLocked(); |
|
||||||
grpc_core::ExecCtx::Get()->Flush(); |
|
||||||
GPR_ASSERT(wait_loop(5, &output1.ev)); |
|
||||||
GPR_ASSERT(!output1.result.addresses.ok()); |
|
||||||
|
|
||||||
ResultHandler::ResolverOutput output2; |
|
||||||
result_handler->SetOutput(&output2); |
|
||||||
grpc_core::ExecCtx::Get()->Flush(); |
|
||||||
GPR_ASSERT(wait_loop(30, &output2.ev)); |
|
||||||
GPR_ASSERT(output2.result.addresses.ok()); |
|
||||||
GPR_ASSERT(!output2.result.addresses->empty()); |
|
||||||
} |
|
||||||
|
|
||||||
grpc_shutdown(); |
|
||||||
gpr_mu_destroy(&g_mu); |
|
||||||
} |
|
Loading…
Reference in new issue