1 // Copyright 2024 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/functional/callback_helpers.h"
6 #include "base/test/bind.h"
7 #include "net/dns/host_resolver_manager_unittest.h"
8
9 #include <memory>
10
11 #include "base/test/scoped_feature_list.h"
12 #include "net/base/features.h"
13 #include "net/dns/host_resolver_system_task.h"
14 #include "net/test/gtest_util.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 using net::test::IsOk;
18
19 namespace net {
20
21 class HostResolverManagerIPv6ReachabilityOverrideTest
22 : public HostResolverManagerDnsTest,
23 public testing::WithParamInterface<bool> {
24 public:
25 static constexpr const char kTargetHost[] = "host.test";
26
HostResolverManagerIPv6ReachabilityOverrideTest()27 HostResolverManagerIPv6ReachabilityOverrideTest() {
28 std::map<std::string, std::string> field_trial_params;
29 if (GetParam()) {
30 feature_list_.InitAndEnableFeature(
31 features::kEnableIPv6ReachabilityOverride);
32 } else {
33 feature_list_.InitAndDisableFeature(
34 features::kEnableIPv6ReachabilityOverride);
35 }
36 }
37
38 protected:
SetUp()39 void SetUp() override {
40 HostResolverManagerDnsTest::SetUp();
41 // Make the global reachiability probe failed.
42 CreateResolverWithLimitsAndParams(
43 /*max_concurrent_resolves=*/10,
44 HostResolverSystemTask::Params(proc_, /*max_retry_attempts=*/4),
45 /*ipv6_reachable=*/false,
46 /*check_ipv6_on_wifi=*/true);
47 ChangeDnsConfig(CreateValidDnsConfig());
48 // Wait until ongoing probe tasks finish.
49 RunUntilIdle();
50
51 // This rule is used when only A record is queried.
52 proc_->AddRule(kTargetHost, ADDRESS_FAMILY_IPV4, "192.0.2.1",
53 HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
54 // This rule is used when A and AAAA records are queried.
55 proc_->AddRule(kTargetHost, ADDRESS_FAMILY_UNSPECIFIED,
56 "192.0.2.1,2001:db8::1");
57 }
58
59 private:
60 base::test::ScopedFeatureList feature_list_;
61 };
62
63 INSTANTIATE_TEST_SUITE_P(All,
64 HostResolverManagerIPv6ReachabilityOverrideTest,
65 testing::Bool());
66
TEST_P(HostResolverManagerIPv6ReachabilityOverrideTest,Request)67 TEST_P(HostResolverManagerIPv6ReachabilityOverrideTest, Request) {
68 proc_->SignalMultiple(1u);
69 std::unique_ptr<HostResolver::ResolveHostRequest> request =
70 resolver_->CreateRequest(
71 url::SchemeHostPort(url::kHttpScheme, kTargetHost, 80),
72 NetworkAnonymizationKey(), NetLogWithSource(), std::nullopt,
73 resolve_context_.get());
74
75 int result = ERR_IO_PENDING;
76 base::RunLoop run_loop;
77 request->Start(base::BindLambdaForTesting([&](int rv) {
78 result = rv;
79 run_loop.Quit();
80 }));
81 run_loop.Run();
82 EXPECT_THAT(result, IsOk());
83
84 if (GetParam()) {
85 EXPECT_THAT(
86 request->GetAddressResults()->endpoints(),
87 testing::UnorderedElementsAre(CreateExpected("192.0.2.1", 80),
88 CreateExpected("2001:db8::1", 80)));
89 } else {
90 EXPECT_THAT(request->GetAddressResults()->endpoints(),
91 testing::UnorderedElementsAre(CreateExpected("192.0.2.1", 80)));
92 }
93 }
94
95 } // namespace net
96