Skip to content

Commit b93f4d7

Browse files
alyssawilkravenblackx
authored andcommitted
cares: fixing a test failure for specific environments
SupportsCustomResolversAsFallback has been failing locally for me because there's only a default resolver, so we use the configured failovers immediately. Fixing the test to handle that case Signed-off-by: Alyssa Wilk <alyssar@chromium.org>
1 parent a8b4d0d commit b93f4d7

File tree

1 file changed

+29
-6
lines changed

1 file changed

+29
-6
lines changed

test/extensions/network/dns_resolver/cares/dns_impl_test.cc

+29-6
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ class DnsResolverImplPeer {
387387
resolver_->initializeChannel(&options, ARES_OPT_FLAGS | ARES_OPT_DOMAINS |
388388
(zero_timeout ? ARES_OPT_TIMEOUTMS : 0));
389389
}
390+
bool isCaresDefaultTheOnlyNameserver() { return resolver_->isCaresDefaultTheOnlyNameserver(); }
390391

391392
private:
392393
DnsResolverImpl* resolver_;
@@ -450,18 +451,35 @@ TEST_F(DnsImplConstructor, SupportsCustomResolversAsFallback) {
450451
char addr4str[INET_ADDRSTRLEN];
451452
auto addr4 = Network::Utility::parseInternetAddress("1.2.3.4");
452453

453-
// convert the address and options into typed_dns_resolver_config
454+
// First, create a resolver with no fallback. Check to see if cares default is
455+
// the only nameserver.
456+
bool only_has_default = false;
457+
{
458+
envoy::extensions::network::dns_resolver::cares::v3::CaresDnsResolverConfig cares;
459+
cares.mutable_dns_resolver_options()->MergeFrom(dns_resolver_options_);
460+
461+
envoy::config::core::v3::TypedExtensionConfig typed_dns_resolver_config;
462+
typed_dns_resolver_config.mutable_typed_config()->PackFrom(cares);
463+
typed_dns_resolver_config.set_name(std::string(Network::CaresDnsResolver));
464+
Network::DnsResolverFactory& dns_resolver_factory =
465+
createDnsResolverFactoryFromTypedConfig(typed_dns_resolver_config);
466+
auto resolver =
467+
dns_resolver_factory.createDnsResolver(*dispatcher_, *api_, typed_dns_resolver_config);
468+
auto peer =
469+
std::make_unique<DnsResolverImplPeer>(dynamic_cast<DnsResolverImpl*>(resolver.get()));
470+
only_has_default = peer->isCaresDefaultTheOnlyNameserver();
471+
}
472+
473+
// Now create a resolver with a failover resolver.
454474
envoy::config::core::v3::Address dns_resolvers;
455475
Network::Utility::addressToProtobufAddress(
456476
Network::Address::Ipv4Instance(addr4->ip()->addressAsString(), addr4->ip()->port()),
457477
dns_resolvers);
458478
envoy::extensions::network::dns_resolver::cares::v3::CaresDnsResolverConfig cares;
459479
cares.set_use_resolvers_as_fallback(true);
460480
cares.add_resolvers()->MergeFrom(dns_resolvers);
461-
462481
// copy over dns_resolver_options_
463482
cares.mutable_dns_resolver_options()->MergeFrom(dns_resolver_options_);
464-
465483
envoy::config::core::v3::TypedExtensionConfig typed_dns_resolver_config;
466484
typed_dns_resolver_config.mutable_typed_config()->PackFrom(cares);
467485
typed_dns_resolver_config.set_name(std::string(Network::CaresDnsResolver));
@@ -470,14 +488,19 @@ TEST_F(DnsImplConstructor, SupportsCustomResolversAsFallback) {
470488
auto resolver =
471489
dns_resolver_factory.createDnsResolver(*dispatcher_, *api_, typed_dns_resolver_config);
472490

473-
// Given that the local machine will have a working conf in resolve.conf the resolver will not
474-
// use the fallback given.
475491
auto peer = std::make_unique<DnsResolverImplPeer>(dynamic_cast<DnsResolverImpl*>(resolver.get()));
476492
ares_addr_port_node* resolvers;
477493
int result = ares_get_servers_ports(peer->channel(), &resolvers);
478494
EXPECT_EQ(result, ARES_SUCCESS);
479495
EXPECT_EQ(resolvers->family, AF_INET);
480-
EXPECT_STRNE(inet_ntop(AF_INET, &resolvers->addr.addr4, addr4str, INET_ADDRSTRLEN), "1.2.3.4");
496+
if (only_has_default) {
497+
// If cares default was the only resolver, the fallbacks will be used.
498+
EXPECT_STREQ(inet_ntop(AF_INET, &resolvers->addr.addr4, addr4str, INET_ADDRSTRLEN), "1.2.3.4");
499+
} else {
500+
// In the common case, where cares default was not the only resolver, the fallback will not be
501+
// used.
502+
EXPECT_STRNE(inet_ntop(AF_INET, &resolvers->addr.addr4, addr4str, INET_ADDRSTRLEN), "1.2.3.4");
503+
}
481504
ares_free_data(resolvers);
482505
}
483506

0 commit comments

Comments
 (0)