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