blob: 4965ecfcef449e251dbc948504938a1d95d0af86 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/functional/callback_helpers.h"
#include "base/test/bind.h"
#include "net/dns/host_resolver_manager_unittest.h"
#include <memory>
#include "base/test/scoped_feature_list.h"
#include "net/base/features.h"
#include "net/dns/host_resolver_system_task.h"
#include "net/test/gtest_util.h"
#include "testing/gtest/include/gtest/gtest.h"
using net::test::IsOk;
namespace net {
class HostResolverManagerIPv6ReachabilityOverrideTest
: public HostResolverManagerDnsTest,
public testing::WithParamInterface<bool> {
public:
static constexpr const char kTargetHost[] = "host.test";
HostResolverManagerIPv6ReachabilityOverrideTest() {
std::map<std::string, std::string> field_trial_params;
if (GetParam()) {
feature_list_.InitAndEnableFeature(
features::kEnableIPv6ReachabilityOverride);
} else {
feature_list_.InitAndDisableFeature(
features::kEnableIPv6ReachabilityOverride);
}
}
protected:
void SetUp() override {
HostResolverManagerDnsTest::SetUp();
// Make the global reachiability probe failed.
CreateResolverWithLimitsAndParams(
/*max_concurrent_resolves=*/10,
HostResolverSystemTask::Params(proc_, /*max_retry_attempts=*/4),
/*ipv6_reachable=*/false,
/*check_ipv6_on_wifi=*/true);
ChangeDnsConfig(CreateValidDnsConfig());
// Wait until ongoing probe tasks finish.
RunUntilIdle();
// This rule is used when only A record is queried.
proc_->AddRule(kTargetHost, ADDRESS_FAMILY_IPV4, "192.0.2.1",
HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
// This rule is used when A and AAAA records are queried.
proc_->AddRule(kTargetHost, ADDRESS_FAMILY_UNSPECIFIED,
"192.0.2.1,2001:db8::1");
}
private:
base::test::ScopedFeatureList feature_list_;
};
INSTANTIATE_TEST_SUITE_P(All,
HostResolverManagerIPv6ReachabilityOverrideTest,
testing::Bool());
TEST_P(HostResolverManagerIPv6ReachabilityOverrideTest, Request) {
proc_->SignalMultiple(1u);
std::unique_ptr<HostResolver::ResolveHostRequest> request =
resolver_->CreateRequest(
url::SchemeHostPort(url::kHttpScheme, kTargetHost, 80),
NetworkAnonymizationKey(), NetLogWithSource(), std::nullopt,
resolve_context_.get());
int result = ERR_IO_PENDING;
base::RunLoop run_loop;
request->Start(base::BindLambdaForTesting([&](int rv) {
result = rv;
run_loop.Quit();
}));
run_loop.Run();
EXPECT_THAT(result, IsOk());
if (GetParam()) {
EXPECT_THAT(
request->GetAddressResults()->endpoints(),
testing::UnorderedElementsAre(CreateExpected("192.0.2.1", 80),
CreateExpected("2001:db8::1", 80)));
} else {
EXPECT_THAT(request->GetAddressResults()->endpoints(),
testing::UnorderedElementsAre(CreateExpected("192.0.2.1", 80)));
}
}
} // namespace net