aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/core/iomgr/resolve_address_posix_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/core/iomgr/resolve_address_posix_test.cc')
-rw-r--r--test/core/iomgr/resolve_address_posix_test.cc81
1 files changed, 80 insertions, 1 deletions
diff --git a/test/core/iomgr/resolve_address_posix_test.cc b/test/core/iomgr/resolve_address_posix_test.cc
index 5785c73e22..826c7e1faf 100644
--- a/test/core/iomgr/resolve_address_posix_test.cc
+++ b/test/core/iomgr/resolve_address_posix_test.cc
@@ -18,12 +18,14 @@
#include "src/core/lib/iomgr/resolve_address.h"
+#include <net/if.h>
#include <string.h>
#include <sys/un.h>
#include <grpc/grpc.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
#include <grpc/support/sync.h>
#include <grpc/support/time.h>
@@ -33,6 +35,7 @@
#include "src/core/lib/gprpp/thd.h"
#include "src/core/lib/iomgr/executor.h"
#include "src/core/lib/iomgr/iomgr.h"
+#include "test/core/util/cmdline.h"
#include "test/core/util/test_config.h"
static gpr_timespec test_deadline(void) {
@@ -117,12 +120,18 @@ static void must_succeed(void* argsp, grpc_error* err) {
GPR_ASSERT(args->addrs != nullptr);
GPR_ASSERT(args->addrs->naddrs > 0);
gpr_atm_rel_store(&args->done_atm, 1);
+ gpr_mu_lock(args->mu);
+ GRPC_LOG_IF_ERROR("pollset_kick", grpc_pollset_kick(args->pollset, nullptr));
+ gpr_mu_unlock(args->mu);
}
static void must_fail(void* argsp, grpc_error* err) {
args_struct* args = static_cast<args_struct*>(argsp);
GPR_ASSERT(err != GRPC_ERROR_NONE);
gpr_atm_rel_store(&args->done_atm, 1);
+ gpr_mu_lock(args->mu);
+ GRPC_LOG_IF_ERROR("pollset_kick", grpc_pollset_kick(args->pollset, nullptr));
+ gpr_mu_unlock(args->mu);
}
static void test_unix_socket(void) {
@@ -159,22 +168,92 @@ static void test_unix_socket_path_name_too_long(void) {
args_finish(&args);
}
+static void resolve_address_must_succeed(const char* target) {
+ grpc_core::ExecCtx exec_ctx;
+ args_struct args;
+ args_init(&args);
+ poll_pollset_until_request_done(&args);
+ grpc_resolve_address(
+ target, "1" /* port number */, args.pollset_set,
+ GRPC_CLOSURE_CREATE(must_succeed, &args, grpc_schedule_on_exec_ctx),
+ &args.addrs);
+ grpc_core::ExecCtx::Get()->Flush();
+ args_finish(&args);
+}
+
+static void test_named_and_numeric_scope_ids(void) {
+ char* arbitrary_interface_name = static_cast<char*>(gpr_zalloc(IF_NAMESIZE));
+ int interface_index = 0;
+ // Probe candidate interface index numbers until we find one that the
+ // system recognizes, and then use that for the test.
+ for (size_t i = 1; i < 65536; i++) {
+ if (if_indextoname(i, arbitrary_interface_name) != nullptr) {
+ gpr_log(
+ GPR_DEBUG,
+ "Found interface at index %d named %s. Will use this for the test",
+ (int)i, arbitrary_interface_name);
+ interface_index = (int)i;
+ break;
+ }
+ }
+ GPR_ASSERT(strlen(arbitrary_interface_name) > 0);
+ // Test resolution of an ipv6 address with a named scope ID
+ gpr_log(GPR_DEBUG, "test resolution with a named scope ID");
+ char* target_with_named_scope_id = nullptr;
+ gpr_asprintf(&target_with_named_scope_id, "fe80::1234%%%s",
+ arbitrary_interface_name);
+ resolve_address_must_succeed(target_with_named_scope_id);
+ gpr_free(target_with_named_scope_id);
+ gpr_free(arbitrary_interface_name);
+ // Test resolution of an ipv6 address with a numeric scope ID
+ gpr_log(GPR_DEBUG, "test resolution with a numeric scope ID");
+ char* target_with_numeric_scope_id = nullptr;
+ gpr_asprintf(&target_with_numeric_scope_id, "fe80::1234%%%d",
+ interface_index);
+ resolve_address_must_succeed(target_with_numeric_scope_id);
+ gpr_free(target_with_numeric_scope_id);
+}
+
int main(int argc, char** argv) {
+ // First set the resolver type based off of --resolver
+ const char* resolver_type = nullptr;
+ gpr_cmdline* cl = gpr_cmdline_create("resolve address test");
+ gpr_cmdline_add_string(cl, "resolver", "Resolver type (ares or native)",
+ &resolver_type);
+ // In case that there are more than one argument on the command line,
+ // --resolver will always be the first one, so only parse the first argument
+ // (other arguments may be unknown to cl)
+ gpr_cmdline_parse(cl, argc > 2 ? 2 : argc, argv);
+ const char* cur_resolver = gpr_getenv("GRPC_DNS_RESOLVER");
+ if (cur_resolver != nullptr && strlen(cur_resolver) != 0) {
+ gpr_log(GPR_INFO, "Warning: overriding resolver setting of %s",
+ cur_resolver);
+ }
+ if (gpr_stricmp(resolver_type, "native") == 0) {
+ gpr_setenv("GRPC_DNS_RESOLVER", "native");
+ } else if (gpr_stricmp(resolver_type, "ares") == 0) {
+ gpr_setenv("GRPC_DNS_RESOLVER", "ares");
+ } else {
+ gpr_log(GPR_ERROR, "--resolver_type was not set to ares or native");
+ abort();
+ }
grpc::testing::TestEnvironment env(argc, argv);
grpc_init();
{
grpc_core::ExecCtx exec_ctx;
- char* resolver_env = gpr_getenv("GRPC_DNS_RESOLVER");
+ test_named_and_numeric_scope_ids();
// c-ares resolver doesn't support UDS (ability for native DNS resolver
// to handle this is only expected to be used by servers, which
// unconditionally use the native DNS resolver).
+ char* resolver_env = gpr_getenv("GRPC_DNS_RESOLVER");
if (resolver_env == nullptr || gpr_stricmp(resolver_env, "native") == 0) {
test_unix_socket();
test_unix_socket_path_name_too_long();
}
gpr_free(resolver_env);
}
+ gpr_cmdline_destroy(cl);
grpc_shutdown();
return 0;