blob: 20d3d7084ac7eb2876169a8c019d425ffbe54413 [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"
[email protected]e4e522d2014-03-12 05:08:0617#include "net/dns/dns_protocol.h"
Bence Béky98447b12018-05-08 03:14:0118#include "net/test/test_with_scoped_task_environment.h"
[email protected]6998a662011-09-03 00:17:2919#include "testing/gtest/include/gtest/gtest.h"
20
21namespace net {
22
23namespace {
24
Bence Béky98447b12018-05-08 03:14:0125class DnsConfigServiceTest : public TestWithScopedTaskEnvironment {
[email protected]6998a662011-09-03 00:17:2926 public:
[email protected]b4481b222012-03-16 17:13:1127 void OnConfigChanged(const DnsConfig& config) {
[email protected]6998a662011-09-03 00:17:2928 last_config_ = config;
29 if (quit_on_config_)
Weza03bae02018-07-13 17:17:3330 std::move(quit_on_config_).Run();
[email protected]6998a662011-09-03 00:17:2931 }
[email protected]6998a662011-09-03 00:17:2932
33 protected:
[email protected]b4481b222012-03-16 17:13:1134 class TestDnsConfigService : public DnsConfigService {
35 public:
dchengb03027d2014-10-21 12:00:2036 void ReadNow() override {}
37 bool StartWatching() override { return true; }
[email protected]b4481b222012-03-16 17:13:1138
39 // Expose the protected methods to this test suite.
40 void InvalidateConfig() {
41 DnsConfigService::InvalidateConfig();
42 }
43
44 void InvalidateHosts() {
45 DnsConfigService::InvalidateHosts();
46 }
47
48 void OnConfigRead(const DnsConfig& config) {
49 DnsConfigService::OnConfigRead(config);
50 }
51
52 void OnHostsRead(const DnsHosts& hosts) {
53 DnsConfigService::OnHostsRead(hosts);
54 }
[email protected]bb0e34542012-08-31 19:52:4055
56 void set_watch_failed(bool value) {
57 DnsConfigService::set_watch_failed(value);
58 }
[email protected]b4481b222012-03-16 17:13:1159 };
60
61 void WaitForConfig(base::TimeDelta timeout) {
Weza03bae02018-07-13 17:17:3362 base::RunLoop run_loop;
skyostil4891b25b2015-06-11 11:43:4563 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Weza03bae02018-07-13 17:17:3364 FROM_HERE, run_loop.QuitClosure(), timeout);
65 quit_on_config_ = run_loop.QuitClosure();
66 run_loop.Run();
[email protected]b4481b222012-03-16 17:13:1167 }
68
69 // Generate a config using the given seed..
70 DnsConfig MakeConfig(unsigned seed) {
71 DnsConfig config;
martijna23c8962016-03-04 18:18:5172 config.nameservers.push_back(
73 IPEndPoint(IPAddress(1, 2, 3, 4), seed & 0xFFFF));
[email protected]b4481b222012-03-16 17:13:1174 EXPECT_TRUE(config.IsValid());
75 return config;
76 }
77
78 // Generate hosts using the given seed.
79 DnsHosts MakeHosts(unsigned seed) {
80 DnsHosts hosts;
81 std::string hosts_content = "127.0.0.1 localhost";
82 hosts_content.append(seed, '1');
83 ParseHosts(hosts_content, &hosts);
84 EXPECT_FALSE(hosts.empty());
85 return hosts;
86 }
87
dcheng67be2b1f2014-10-27 21:47:2988 void SetUp() override {
[email protected]b4481b222012-03-16 17:13:1189 service_.reset(new TestDnsConfigService());
[email protected]bb0e34542012-08-31 19:52:4090 service_->WatchConfig(base::Bind(&DnsConfigServiceTest::OnConfigChanged,
91 base::Unretained(this)));
[email protected]b4481b222012-03-16 17:13:1192 EXPECT_FALSE(last_config_.IsValid());
[email protected]6998a662011-09-03 00:17:2993 }
94
95 DnsConfig last_config_;
Weza03bae02018-07-13 17:17:3396 base::OnceClosure quit_on_config_;
[email protected]6998a662011-09-03 00:17:2997
98 // Service under test.
danakj22f90e72016-04-16 01:55:4099 std::unique_ptr<TestDnsConfigService> service_;
[email protected]6998a662011-09-03 00:17:29100};
101
102} // namespace
103
[email protected]b4481b222012-03-16 17:13:11104TEST_F(DnsConfigServiceTest, FirstConfig) {
105 DnsConfig config = MakeConfig(1);
[email protected]6998a662011-09-03 00:17:29106
[email protected]6998a662011-09-03 00:17:29107 service_->OnConfigRead(config);
[email protected]b4481b222012-03-16 17:13:11108 // No hosts yet, so no config.
[email protected]bb0e34542012-08-31 19:52:40109 EXPECT_TRUE(last_config_.Equals(DnsConfig()));
[email protected]6998a662011-09-03 00:17:29110
[email protected]b4481b222012-03-16 17:13:11111 service_->OnHostsRead(config.hosts);
[email protected]b4481b222012-03-16 17:13:11112 EXPECT_TRUE(last_config_.Equals(config));
113}
[email protected]6998a662011-09-03 00:17:29114
[email protected]b4481b222012-03-16 17:13:11115TEST_F(DnsConfigServiceTest, Timeout) {
116 DnsConfig config = MakeConfig(1);
117 config.hosts = MakeHosts(1);
[email protected]163d9b22012-06-12 19:50:36118 ASSERT_TRUE(config.IsValid());
[email protected]6998a662011-09-03 00:17:29119
[email protected]6998a662011-09-03 00:17:29120 service_->OnConfigRead(config);
[email protected]b4481b222012-03-16 17:13:11121 service_->OnHostsRead(config.hosts);
[email protected]bb0e34542012-08-31 19:52:40122 EXPECT_FALSE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11123 EXPECT_TRUE(last_config_.Equals(config));
[email protected]6998a662011-09-03 00:17:29124
[email protected]b4481b222012-03-16 17:13:11125 service_->InvalidateConfig();
126 WaitForConfig(TestTimeouts::action_timeout());
[email protected]bb0e34542012-08-31 19:52:40127 EXPECT_FALSE(last_config_.Equals(config));
128 EXPECT_TRUE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11129
130 service_->OnConfigRead(config);
[email protected]bb0e34542012-08-31 19:52:40131 EXPECT_FALSE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11132 EXPECT_TRUE(last_config_.Equals(config));
133
134 service_->InvalidateHosts();
135 WaitForConfig(TestTimeouts::action_timeout());
[email protected]bb0e34542012-08-31 19:52:40136 EXPECT_FALSE(last_config_.Equals(config));
137 EXPECT_TRUE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11138
[email protected]bb0e34542012-08-31 19:52:40139 DnsConfig bad_config = last_config_ = MakeConfig(0xBAD);
[email protected]163d9b22012-06-12 19:50:36140 service_->InvalidateConfig();
[email protected]bb0e34542012-08-31 19:52:40141 // We don't expect an update. This should time out.
[email protected]163d9b22012-06-12 19:50:36142 WaitForConfig(base::TimeDelta::FromMilliseconds(100) +
143 TestTimeouts::tiny_timeout());
[email protected]bb0e34542012-08-31 19:52:40144 EXPECT_TRUE(last_config_.Equals(bad_config)) << "Unexpected change";
[email protected]163d9b22012-06-12 19:50:36145
[email protected]bb0e34542012-08-31 19:52:40146 last_config_ = DnsConfig();
[email protected]163d9b22012-06-12 19:50:36147 service_->OnConfigRead(config);
[email protected]b4481b222012-03-16 17:13:11148 service_->OnHostsRead(config.hosts);
[email protected]bb0e34542012-08-31 19:52:40149 EXPECT_FALSE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11150 EXPECT_TRUE(last_config_.Equals(config));
151}
152
153TEST_F(DnsConfigServiceTest, SameConfig) {
154 DnsConfig config = MakeConfig(1);
155 config.hosts = MakeHosts(1);
156
157 service_->OnConfigRead(config);
158 service_->OnHostsRead(config.hosts);
[email protected]bb0e34542012-08-31 19:52:40159 EXPECT_FALSE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11160 EXPECT_TRUE(last_config_.Equals(config));
161
[email protected]bb0e34542012-08-31 19:52:40162 last_config_ = DnsConfig();
[email protected]b4481b222012-03-16 17:13:11163 service_->OnConfigRead(config);
[email protected]bb0e34542012-08-31 19:52:40164 EXPECT_TRUE(last_config_.Equals(DnsConfig())) << "Unexpected change";
[email protected]b4481b222012-03-16 17:13:11165
166 service_->OnHostsRead(config.hosts);
[email protected]bb0e34542012-08-31 19:52:40167 EXPECT_TRUE(last_config_.Equals(DnsConfig())) << "Unexpected change";
[email protected]b4481b222012-03-16 17:13:11168}
169
170TEST_F(DnsConfigServiceTest, DifferentConfig) {
171 DnsConfig config1 = MakeConfig(1);
172 DnsConfig config2 = MakeConfig(2);
173 DnsConfig config3 = MakeConfig(1);
174 config1.hosts = MakeHosts(1);
175 config2.hosts = MakeHosts(1);
176 config3.hosts = MakeHosts(2);
177 ASSERT_TRUE(config1.EqualsIgnoreHosts(config3));
178 ASSERT_FALSE(config1.Equals(config2));
179 ASSERT_FALSE(config1.Equals(config3));
180 ASSERT_FALSE(config2.Equals(config3));
181
182 service_->OnConfigRead(config1);
183 service_->OnHostsRead(config1.hosts);
[email protected]bb0e34542012-08-31 19:52:40184 EXPECT_FALSE(last_config_.Equals(DnsConfig()));
[email protected]b4481b222012-03-16 17:13:11185 EXPECT_TRUE(last_config_.Equals(config1));
186
187 // It doesn't matter for this tests, but increases coverage.
188 service_->InvalidateConfig();
189 service_->InvalidateHosts();
190
191 service_->OnConfigRead(config2);
[email protected]bb0e34542012-08-31 19:52:40192 EXPECT_TRUE(last_config_.Equals(config1)) << "Unexpected change";
193 service_->OnHostsRead(config2.hosts); // Not an actual change.
194 EXPECT_FALSE(last_config_.Equals(config1));
[email protected]b4481b222012-03-16 17:13:11195 EXPECT_TRUE(last_config_.Equals(config2));
196
197 service_->OnConfigRead(config3);
[email protected]bb0e34542012-08-31 19:52:40198 EXPECT_TRUE(last_config_.EqualsIgnoreHosts(config3));
[email protected]b4481b222012-03-16 17:13:11199 service_->OnHostsRead(config3.hosts);
[email protected]bb0e34542012-08-31 19:52:40200 EXPECT_FALSE(last_config_.Equals(config2));
[email protected]b4481b222012-03-16 17:13:11201 EXPECT_TRUE(last_config_.Equals(config3));
[email protected]6998a662011-09-03 00:17:29202}
203
[email protected]bb0e34542012-08-31 19:52:40204TEST_F(DnsConfigServiceTest, WatchFailure) {
205 DnsConfig config1 = MakeConfig(1);
206 DnsConfig config2 = MakeConfig(2);
207 config1.hosts = MakeHosts(1);
208 config2.hosts = MakeHosts(2);
209
210 service_->OnConfigRead(config1);
211 service_->OnHostsRead(config1.hosts);
212 EXPECT_FALSE(last_config_.Equals(DnsConfig()));
213 EXPECT_TRUE(last_config_.Equals(config1));
214
215 // Simulate watch failure.
216 service_->set_watch_failed(true);
217 service_->InvalidateConfig();
218 WaitForConfig(TestTimeouts::action_timeout());
219 EXPECT_FALSE(last_config_.Equals(config1));
220 EXPECT_TRUE(last_config_.Equals(DnsConfig()));
221
222 DnsConfig bad_config = last_config_ = MakeConfig(0xBAD);
223 // Actual change in config, so expect an update, but it should be empty.
224 service_->OnConfigRead(config1);
225 EXPECT_FALSE(last_config_.Equals(bad_config));
226 EXPECT_TRUE(last_config_.Equals(DnsConfig()));
227
228 last_config_ = bad_config;
229 // Actual change in config, so expect an update, but it should be empty.
230 service_->InvalidateConfig();
231 service_->OnConfigRead(config2);
232 EXPECT_FALSE(last_config_.Equals(bad_config));
233 EXPECT_TRUE(last_config_.Equals(DnsConfig()));
234
235 last_config_ = bad_config;
236 // No change, so no update.
237 service_->InvalidateConfig();
238 service_->OnConfigRead(config2);
239 EXPECT_TRUE(last_config_.Equals(bad_config));
240}
241
[email protected]6998a662011-09-03 00:17:29242} // namespace net