blob: cdb0515a7fa5118af6bbdc2799d0c6c7adcdce9c [file] [log] [blame]
[email protected]5761ab9c2012-02-04 16:44:531// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]6998a662011-09-03 00:17:292// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/dns/dns_config_service.h"
6
danakj22f90e72016-04-16 01:55:407#include <memory>
8
[email protected]76d7f722011-10-10 17:22:419#include "base/bind.h"
[email protected]b4481b222012-03-16 17:13:1110#include "base/cancelable_callback.h"
skyostil4891b25b2015-06-11 11:43:4511#include "base/location.h"
fdoray5eeb7642016-06-22 16:11:2812#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4513#include "base/single_thread_task_runner.h"
[email protected]e4e522d2014-03-12 05:08:0614#include "base/strings/string_split.h"
[email protected]6998a662011-09-03 00:17:2915#include "base/test/test_timeouts.h"
gabf767595f2016-05-11 18:50:3516#include "base/threading/thread_task_runner_handle.h"
Eric Orth8afaf152018-11-07 21:01:2617#include "net/dns/public/dns_protocol.h"
Eric Orthde0c5662019-06-25 15:36:0218#include "net/dns/test_dns_config_service.h"
Gabriel Charettec7108742019-08-23 03:31:4019#include "net/test/test_with_task_environment.h"
[email protected]6998a662011-09-03 00:17:2920#include "testing/gtest/include/gtest/gtest.h"
21
22namespace net {
23
24namespace {
25
Gabriel Charette694c3c332019-08-19 14:53:0526class DnsConfigServiceTest : public TestWithTaskEnvironment {
[email protected]6998a662011-09-03 00:17:2927 public:
[email protected]b4481b222012-03-16 17:13:1128 void OnConfigChanged(const DnsConfig& config) {
[email protected]6998a662011-09-03 00:17:2929 last_config_ = config;
30 if (quit_on_config_)
Weza03bae02018-07-13 17:17:3331 std::move(quit_on_config_).Run();
[email protected]6998a662011-09-03 00:17:2932 }
[email protected]6998a662011-09-03 00:17:2933
34 protected:
[email protected]b4481b222012-03-16 17:13:1135 void WaitForConfig(base::TimeDelta timeout) {
Weza03bae02018-07-13 17:17:3336 base::RunLoop run_loop;
skyostil4891b25b2015-06-11 11:43:4537 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Weza03bae02018-07-13 17:17:3338 FROM_HERE, run_loop.QuitClosure(), timeout);
39 quit_on_config_ = run_loop.QuitClosure();
40 run_loop.Run();
[email protected]b4481b222012-03-16 17:13:1141 }
42
43 // Generate a config using the given seed..
44 DnsConfig MakeConfig(unsigned seed) {
45 DnsConfig config;
martijna23c8962016-03-04 18:18:5146 config.nameservers.push_back(
47 IPEndPoint(IPAddress(1, 2, 3, 4), seed & 0xFFFF));
[email protected]b4481b222012-03-16 17:13:1148 EXPECT_TRUE(config.IsValid());
49 return config;
50 }
51
52 // Generate hosts using the given seed.
53 DnsHosts MakeHosts(unsigned seed) {
54 DnsHosts hosts;
55 std::string hosts_content = "127.0.0.1 localhost";
56 hosts_content.append(seed, '1');
57 ParseHosts(hosts_content, &hosts);
58 EXPECT_FALSE(hosts.empty());
59 return hosts;
60 }
61
dcheng67be2b1f2014-10-27 21:47:2962 void SetUp() override {
[email protected]b4481b222012-03-16 17:13:1163 service_.reset(new TestDnsConfigService());
[email protected]bb0e34542012-08-31 19:52:4064 service_->WatchConfig(base::Bind(&DnsConfigServiceTest::OnConfigChanged,
65 base::Unretained(this)));
[email protected]b4481b222012-03-16 17:13:1166 EXPECT_FALSE(last_config_.IsValid());
[email protected]6998a662011-09-03 00:17:2967 }
68
69 DnsConfig last_config_;
Weza03bae02018-07-13 17:17:3370 base::OnceClosure quit_on_config_;
[email protected]6998a662011-09-03 00:17:2971
72 // Service under test.
danakj22f90e72016-04-16 01:55:4073 std::unique_ptr<TestDnsConfigService> service_;
[email protected]6998a662011-09-03 00:17:2974};
75
76} // namespace
77
[email protected]b4481b222012-03-16 17:13:1178TEST_F(DnsConfigServiceTest, FirstConfig) {
79 DnsConfig config = MakeConfig(1);
[email protected]6998a662011-09-03 00:17:2980
[email protected]6998a662011-09-03 00:17:2981 service_->OnConfigRead(config);
[email protected]b4481b222012-03-16 17:13:1182 // No hosts yet, so no config.
[email protected]bb0e34542012-08-31 19:52:4083 EXPECT_TRUE(last_config_.Equals(DnsConfig()));
[email protected]6998a662011-09-03 00:17:2984
[email protected]b4481b222012-03-16 17:13:1185 service_->OnHostsRead(config.hosts);
[email protected]b4481b222012-03-16 17:13:1186 EXPECT_TRUE(last_config_.Equals(config));
87}
[email protected]6998a662011-09-03 00:17:2988
[email protected]b4481b222012-03-16 17:13:1189TEST_F(DnsConfigServiceTest, Timeout) {
90 DnsConfig config = MakeConfig(1);
91 config.hosts = MakeHosts(1);
[email protected]163d9b22012-06-12 19:50:3692 ASSERT_TRUE(config.IsValid());
[email protected]6998a662011-09-03 00:17:2993
[email protected]6998a662011-09-03 00:17:2994 service_->OnConfigRead(config);
[email protected]b4481b222012-03-16 17:13:1195 service_->OnHostsRead(config.hosts);
[email protected]bb0e34542012-08-31 19:52:4096 EXPECT_FALSE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:1197 EXPECT_TRUE(last_config_.Equals(config));
[email protected]6998a662011-09-03 00:17:2998
[email protected]b4481b222012-03-16 17:13:1199 service_->InvalidateConfig();
100 WaitForConfig(TestTimeouts::action_timeout());
[email protected]bb0e34542012-08-31 19:52:40101 EXPECT_FALSE(last_config_.Equals(config));
102 EXPECT_TRUE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11103
104 service_->OnConfigRead(config);
[email protected]bb0e34542012-08-31 19:52:40105 EXPECT_FALSE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11106 EXPECT_TRUE(last_config_.Equals(config));
107
108 service_->InvalidateHosts();
109 WaitForConfig(TestTimeouts::action_timeout());
[email protected]bb0e34542012-08-31 19:52:40110 EXPECT_FALSE(last_config_.Equals(config));
111 EXPECT_TRUE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11112
[email protected]bb0e34542012-08-31 19:52:40113 DnsConfig bad_config = last_config_ = MakeConfig(0xBAD);
[email protected]163d9b22012-06-12 19:50:36114 service_->InvalidateConfig();
[email protected]bb0e34542012-08-31 19:52:40115 // We don't expect an update. This should time out.
[email protected]163d9b22012-06-12 19:50:36116 WaitForConfig(base::TimeDelta::FromMilliseconds(100) +
117 TestTimeouts::tiny_timeout());
[email protected]bb0e34542012-08-31 19:52:40118 EXPECT_TRUE(last_config_.Equals(bad_config)) << "Unexpected change";
[email protected]163d9b22012-06-12 19:50:36119
[email protected]bb0e34542012-08-31 19:52:40120 last_config_ = DnsConfig();
[email protected]163d9b22012-06-12 19:50:36121 service_->OnConfigRead(config);
[email protected]b4481b222012-03-16 17:13:11122 service_->OnHostsRead(config.hosts);
[email protected]bb0e34542012-08-31 19:52:40123 EXPECT_FALSE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11124 EXPECT_TRUE(last_config_.Equals(config));
125}
126
127TEST_F(DnsConfigServiceTest, SameConfig) {
128 DnsConfig config = MakeConfig(1);
129 config.hosts = MakeHosts(1);
130
131 service_->OnConfigRead(config);
132 service_->OnHostsRead(config.hosts);
[email protected]bb0e34542012-08-31 19:52:40133 EXPECT_FALSE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11134 EXPECT_TRUE(last_config_.Equals(config));
135
[email protected]bb0e34542012-08-31 19:52:40136 last_config_ = DnsConfig();
[email protected]b4481b222012-03-16 17:13:11137 service_->OnConfigRead(config);
[email protected]bb0e34542012-08-31 19:52:40138 EXPECT_TRUE(last_config_.Equals(DnsConfig())) << "Unexpected change";
[email protected]b4481b222012-03-16 17:13:11139
140 service_->OnHostsRead(config.hosts);
[email protected]bb0e34542012-08-31 19:52:40141 EXPECT_TRUE(last_config_.Equals(DnsConfig())) << "Unexpected change";
[email protected]b4481b222012-03-16 17:13:11142}
143
144TEST_F(DnsConfigServiceTest, DifferentConfig) {
145 DnsConfig config1 = MakeConfig(1);
146 DnsConfig config2 = MakeConfig(2);
147 DnsConfig config3 = MakeConfig(1);
148 config1.hosts = MakeHosts(1);
149 config2.hosts = MakeHosts(1);
150 config3.hosts = MakeHosts(2);
151 ASSERT_TRUE(config1.EqualsIgnoreHosts(config3));
152 ASSERT_FALSE(config1.Equals(config2));
153 ASSERT_FALSE(config1.Equals(config3));
154 ASSERT_FALSE(config2.Equals(config3));
155
156 service_->OnConfigRead(config1);
157 service_->OnHostsRead(config1.hosts);
[email protected]bb0e34542012-08-31 19:52:40158 EXPECT_FALSE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11159 EXPECT_TRUE(last_config_.Equals(config1));
160
161 // It doesn't matter for this tests, but increases coverage.
162 service_->InvalidateConfig();
163 service_->InvalidateHosts();
164
165 service_->OnConfigRead(config2);
[email protected]bb0e34542012-08-31 19:52:40166 EXPECT_TRUE(last_config_.Equals(config1)) << "Unexpected change";
167 service_->OnHostsRead(config2.hosts); // Not an actual change.
168 EXPECT_FALSE(last_config_.Equals(config1));
[email protected]b4481b222012-03-16 17:13:11169 EXPECT_TRUE(last_config_.Equals(config2));
170
171 service_->OnConfigRead(config3);
[email protected]bb0e34542012-08-31 19:52:40172 EXPECT_TRUE(last_config_.EqualsIgnoreHosts(config3));
[email protected]b4481b222012-03-16 17:13:11173 service_->OnHostsRead(config3.hosts);
[email protected]bb0e34542012-08-31 19:52:40174 EXPECT_FALSE(last_config_.Equals(config2));
[email protected]b4481b222012-03-16 17:13:11175 EXPECT_TRUE(last_config_.Equals(config3));
[email protected]6998a662011-09-03 00:17:29176}
177
[email protected]bb0e34542012-08-31 19:52:40178TEST_F(DnsConfigServiceTest, WatchFailure) {
179 DnsConfig config1 = MakeConfig(1);
180 DnsConfig config2 = MakeConfig(2);
181 config1.hosts = MakeHosts(1);
182 config2.hosts = MakeHosts(2);
183
184 service_->OnConfigRead(config1);
185 service_->OnHostsRead(config1.hosts);
186 EXPECT_FALSE(last_config_.Equals(DnsConfig()));
187 EXPECT_TRUE(last_config_.Equals(config1));
188
189 // Simulate watch failure.
190 service_->set_watch_failed(true);
191 service_->InvalidateConfig();
192 WaitForConfig(TestTimeouts::action_timeout());
193 EXPECT_FALSE(last_config_.Equals(config1));
194 EXPECT_TRUE(last_config_.Equals(DnsConfig()));
195
196 DnsConfig bad_config = last_config_ = MakeConfig(0xBAD);
197 // Actual change in config, so expect an update, but it should be empty.
198 service_->OnConfigRead(config1);
199 EXPECT_FALSE(last_config_.Equals(bad_config));
200 EXPECT_TRUE(last_config_.Equals(DnsConfig()));
201
202 last_config_ = bad_config;
203 // Actual change in config, so expect an update, but it should be empty.
204 service_->InvalidateConfig();
205 service_->OnConfigRead(config2);
206 EXPECT_FALSE(last_config_.Equals(bad_config));
207 EXPECT_TRUE(last_config_.Equals(DnsConfig()));
208
209 last_config_ = bad_config;
210 // No change, so no update.
211 service_->InvalidateConfig();
212 service_->OnConfigRead(config2);
213 EXPECT_TRUE(last_config_.Equals(bad_config));
214}
215
[email protected]6998a662011-09-03 00:17:29216} // namespace net