blob: 002a9888b560cd5034e693d7c4136166273cef20 [file] [log] [blame]
[email protected]7054e78f2012-05-07 21:44:561// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]9087aa32010-02-18 08:03:382// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]f2cb3cf2013-03-21 01:40:535#include "net/dns/mapped_host_resolver.h"
[email protected]9087aa32010-02-18 08:03:386
dchengc7eeda422015-12-26 03:56:487#include <utility>
8
[email protected]98e1cd012011-11-08 15:33:099#include "net/base/address_list.h"
[email protected]9087aa32010-02-18 08:03:3810#include "net/base/net_errors.h"
11#include "net/base/net_util.h"
[email protected]6e78dfb2011-07-28 21:34:4712#include "net/base/test_completion_callback.h"
[email protected]f2cb3cf2013-03-21 01:40:5313#include "net/dns/mock_host_resolver.h"
eroman87c53d62015-04-02 06:51:0714#include "net/log/net_log.h"
[email protected]9087aa32010-02-18 08:03:3815#include "testing/gtest/include/gtest/gtest.h"
16
17namespace net {
18
19namespace {
20
[email protected]7054e78f2012-05-07 21:44:5621std::string FirstAddress(const AddressList& address_list) {
22 if (address_list.empty())
[email protected]007b3f82013-04-09 08:46:4523 return std::string();
[email protected]7054e78f2012-05-07 21:44:5624 return address_list.front().ToString();
25}
26
[email protected]9087aa32010-02-18 08:03:3827TEST(MappedHostResolverTest, Inclusion) {
28 // Create a mock host resolver, with specific hostname to IP mappings.
[email protected]c54a8912012-10-22 22:09:4329 scoped_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
[email protected]9087aa32010-02-18 08:03:3830 resolver_impl->rules()->AddSimulatedFailure("*google.com");
31 resolver_impl->rules()->AddRule("baz.com", "192.168.1.5");
32 resolver_impl->rules()->AddRule("foo.com", "192.168.1.8");
33 resolver_impl->rules()->AddRule("proxy", "192.168.1.11");
34
35 // Create a remapped resolver that uses |resolver_impl|.
[email protected]73c45322010-10-01 23:57:5436 scoped_ptr<MappedHostResolver> resolver(
dchengc7eeda422015-12-26 03:56:4837 new MappedHostResolver(std::move(resolver_impl)));
[email protected]9087aa32010-02-18 08:03:3838
39 int rv;
40 AddressList address_list;
41
42 // Try resolving "www.google.com:80". There are no mappings yet, so this
43 // hits |resolver_impl| and fails.
[email protected]aa22b242011-11-16 18:58:2944 TestCompletionCallback callback;
[email protected]b9823c02013-08-16 21:24:4145 rv = resolver->Resolve(
[email protected]5109c1952013-08-20 18:44:1046 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)),
47 DEFAULT_PRIORITY,
[email protected]b9823c02013-08-16 21:24:4148 &address_list,
49 callback.callback(),
50 NULL,
51 BoundNetLog());
[email protected]6e78dfb2011-07-28 21:34:4752 EXPECT_EQ(ERR_IO_PENDING, rv);
53 rv = callback.WaitForResult();
[email protected]9087aa32010-02-18 08:03:3854 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv);
55
56 // Remap *.google.com to baz.com.
57 EXPECT_TRUE(resolver->AddRuleFromString("map *.google.com baz.com"));
58
59 // Try resolving "www.google.com:80". Should be remapped to "baz.com:80".
[email protected]b9823c02013-08-16 21:24:4160 rv = resolver->Resolve(
[email protected]5109c1952013-08-20 18:44:1061 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)),
62 DEFAULT_PRIORITY,
[email protected]b9823c02013-08-16 21:24:4163 &address_list,
64 callback.callback(),
65 NULL,
66 BoundNetLog());
[email protected]6e78dfb2011-07-28 21:34:4767 EXPECT_EQ(ERR_IO_PENDING, rv);
68 rv = callback.WaitForResult();
[email protected]9087aa32010-02-18 08:03:3869 EXPECT_EQ(OK, rv);
[email protected]7054e78f2012-05-07 21:44:5670 EXPECT_EQ("192.168.1.5:80", FirstAddress(address_list));
[email protected]9087aa32010-02-18 08:03:3871
72 // Try resolving "foo.com:77". This will NOT be remapped, so result
73 // is "foo.com:77".
[email protected]5109c1952013-08-20 18:44:1074 rv = resolver->Resolve(HostResolver::RequestInfo(HostPortPair("foo.com", 77)),
75 DEFAULT_PRIORITY,
76 &address_list,
77 callback.callback(),
78 NULL,
79 BoundNetLog());
[email protected]6e78dfb2011-07-28 21:34:4780 EXPECT_EQ(ERR_IO_PENDING, rv);
81 rv = callback.WaitForResult();
[email protected]9087aa32010-02-18 08:03:3882 EXPECT_EQ(OK, rv);
[email protected]7054e78f2012-05-07 21:44:5683 EXPECT_EQ("192.168.1.8:77", FirstAddress(address_list));
[email protected]9087aa32010-02-18 08:03:3884
85 // Remap "*.org" to "proxy:99".
86 EXPECT_TRUE(resolver->AddRuleFromString("Map *.org proxy:99"));
87
88 // Try resolving "chromium.org:61". Should be remapped to "proxy:99".
[email protected]5109c1952013-08-20 18:44:1089 rv = resolver->Resolve(
90 HostResolver::RequestInfo(HostPortPair("chromium.org", 61)),
91 DEFAULT_PRIORITY,
92 &address_list,
93 callback.callback(),
94 NULL,
95 BoundNetLog());
[email protected]6e78dfb2011-07-28 21:34:4796 EXPECT_EQ(ERR_IO_PENDING, rv);
97 rv = callback.WaitForResult();
[email protected]9087aa32010-02-18 08:03:3898 EXPECT_EQ(OK, rv);
[email protected]7054e78f2012-05-07 21:44:5699 EXPECT_EQ("192.168.1.11:99", FirstAddress(address_list));
[email protected]9087aa32010-02-18 08:03:38100}
101
102// Tests that exclusions are respected.
103TEST(MappedHostResolverTest, Exclusion) {
104 // Create a mock host resolver, with specific hostname to IP mappings.
[email protected]c54a8912012-10-22 22:09:43105 scoped_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
[email protected]9087aa32010-02-18 08:03:38106 resolver_impl->rules()->AddRule("baz", "192.168.1.5");
107 resolver_impl->rules()->AddRule("www.google.com", "192.168.1.3");
108
109 // Create a remapped resolver that uses |resolver_impl|.
[email protected]73c45322010-10-01 23:57:54110 scoped_ptr<MappedHostResolver> resolver(
dchengc7eeda422015-12-26 03:56:48111 new MappedHostResolver(std::move(resolver_impl)));
[email protected]9087aa32010-02-18 08:03:38112
113 int rv;
114 AddressList address_list;
[email protected]aa22b242011-11-16 18:58:29115 TestCompletionCallback callback;
[email protected]9087aa32010-02-18 08:03:38116
117 // Remap "*.com" to "baz".
118 EXPECT_TRUE(resolver->AddRuleFromString("map *.com baz"));
119
120 // Add an exclusion for "*.google.com".
121 EXPECT_TRUE(resolver->AddRuleFromString("EXCLUDE *.google.com"));
122
123 // Try resolving "www.google.com". Should not be remapped due to exclusion).
[email protected]b9823c02013-08-16 21:24:41124 rv = resolver->Resolve(
[email protected]5109c1952013-08-20 18:44:10125 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)),
126 DEFAULT_PRIORITY,
[email protected]b9823c02013-08-16 21:24:41127 &address_list,
128 callback.callback(),
129 NULL,
130 BoundNetLog());
[email protected]6e78dfb2011-07-28 21:34:47131 EXPECT_EQ(ERR_IO_PENDING, rv);
132 rv = callback.WaitForResult();
[email protected]9087aa32010-02-18 08:03:38133 EXPECT_EQ(OK, rv);
[email protected]7054e78f2012-05-07 21:44:56134 EXPECT_EQ("192.168.1.3:80", FirstAddress(address_list));
[email protected]9087aa32010-02-18 08:03:38135
136 // Try resolving "chrome.com:80". Should be remapped to "baz:80".
[email protected]5109c1952013-08-20 18:44:10137 rv = resolver->Resolve(
138 HostResolver::RequestInfo(HostPortPair("chrome.com", 80)),
139 DEFAULT_PRIORITY,
140 &address_list,
141 callback.callback(),
142 NULL,
143 BoundNetLog());
[email protected]6e78dfb2011-07-28 21:34:47144 EXPECT_EQ(ERR_IO_PENDING, rv);
145 rv = callback.WaitForResult();
[email protected]9087aa32010-02-18 08:03:38146 EXPECT_EQ(OK, rv);
[email protected]7054e78f2012-05-07 21:44:56147 EXPECT_EQ("192.168.1.5:80", FirstAddress(address_list));
[email protected]9087aa32010-02-18 08:03:38148}
149
150TEST(MappedHostResolverTest, SetRulesFromString) {
151 // Create a mock host resolver, with specific hostname to IP mappings.
[email protected]c54a8912012-10-22 22:09:43152 scoped_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
[email protected]9087aa32010-02-18 08:03:38153 resolver_impl->rules()->AddRule("baz", "192.168.1.7");
154 resolver_impl->rules()->AddRule("bar", "192.168.1.9");
155
156 // Create a remapped resolver that uses |resolver_impl|.
[email protected]73c45322010-10-01 23:57:54157 scoped_ptr<MappedHostResolver> resolver(
dchengc7eeda422015-12-26 03:56:48158 new MappedHostResolver(std::move(resolver_impl)));
[email protected]9087aa32010-02-18 08:03:38159
160 int rv;
161 AddressList address_list;
[email protected]aa22b242011-11-16 18:58:29162 TestCompletionCallback callback;
[email protected]9087aa32010-02-18 08:03:38163
164 // Remap "*.com" to "baz", and *.net to "bar:60".
165 resolver->SetRulesFromString("map *.com baz , map *.net bar:60");
166
167 // Try resolving "www.google.com". Should be remapped to "baz".
[email protected]b9823c02013-08-16 21:24:41168 rv = resolver->Resolve(
[email protected]5109c1952013-08-20 18:44:10169 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)),
170 DEFAULT_PRIORITY,
[email protected]b9823c02013-08-16 21:24:41171 &address_list,
172 callback.callback(),
173 NULL,
174 BoundNetLog());
[email protected]6e78dfb2011-07-28 21:34:47175 EXPECT_EQ(ERR_IO_PENDING, rv);
176 rv = callback.WaitForResult();
[email protected]9087aa32010-02-18 08:03:38177 EXPECT_EQ(OK, rv);
[email protected]7054e78f2012-05-07 21:44:56178 EXPECT_EQ("192.168.1.7:80", FirstAddress(address_list));
[email protected]9087aa32010-02-18 08:03:38179
180 // Try resolving "chrome.net:80". Should be remapped to "bar:60".
[email protected]5109c1952013-08-20 18:44:10181 rv = resolver->Resolve(
182 HostResolver::RequestInfo(HostPortPair("chrome.net", 80)),
183 DEFAULT_PRIORITY,
184 &address_list,
185 callback.callback(),
186 NULL,
187 BoundNetLog());
[email protected]6e78dfb2011-07-28 21:34:47188 EXPECT_EQ(ERR_IO_PENDING, rv);
189 rv = callback.WaitForResult();
[email protected]9087aa32010-02-18 08:03:38190 EXPECT_EQ(OK, rv);
[email protected]7054e78f2012-05-07 21:44:56191 EXPECT_EQ("192.168.1.9:60", FirstAddress(address_list));
[email protected]9087aa32010-02-18 08:03:38192}
193
194// Parsing bad rules should silently discard the rule (and never crash).
195TEST(MappedHostResolverTest, ParseInvalidRules) {
[email protected]c54a8912012-10-22 22:09:43196 scoped_ptr<MappedHostResolver> resolver(
197 new MappedHostResolver(scoped_ptr<HostResolver>()));
[email protected]9087aa32010-02-18 08:03:38198
199 EXPECT_FALSE(resolver->AddRuleFromString("xyz"));
[email protected]007b3f82013-04-09 08:46:45200 EXPECT_FALSE(resolver->AddRuleFromString(std::string()));
[email protected]9087aa32010-02-18 08:03:38201 EXPECT_FALSE(resolver->AddRuleFromString(" "));
202 EXPECT_FALSE(resolver->AddRuleFromString("EXCLUDE"));
203 EXPECT_FALSE(resolver->AddRuleFromString("EXCLUDE foo bar"));
204 EXPECT_FALSE(resolver->AddRuleFromString("INCLUDE"));
205 EXPECT_FALSE(resolver->AddRuleFromString("INCLUDE x"));
206 EXPECT_FALSE(resolver->AddRuleFromString("INCLUDE x :10"));
207}
208
[email protected]c6c07432013-03-07 00:24:44209// Test mapping hostnames to resolving failures.
210TEST(MappedHostResolverTest, MapToError) {
211 scoped_ptr<MockHostResolver> resolver_impl(new MockHostResolver());
212 resolver_impl->rules()->AddRule("*", "192.168.1.5");
213
214 scoped_ptr<MappedHostResolver> resolver(
dchengc7eeda422015-12-26 03:56:48215 new MappedHostResolver(std::move(resolver_impl)));
[email protected]c6c07432013-03-07 00:24:44216
217 int rv;
218 AddressList address_list;
219
220 // Remap *.google.com to resolving failures.
221 EXPECT_TRUE(resolver->AddRuleFromString("MAP *.google.com ~NOTFOUND"));
222
223 // Try resolving www.google.com --> Should give an error.
224 TestCompletionCallback callback1;
[email protected]b9823c02013-08-16 21:24:41225 rv = resolver->Resolve(
[email protected]5109c1952013-08-20 18:44:10226 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)),
227 DEFAULT_PRIORITY,
[email protected]b9823c02013-08-16 21:24:41228 &address_list,
229 callback1.callback(),
230 NULL,
231 BoundNetLog());
[email protected]c6c07432013-03-07 00:24:44232 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv);
233
234 // Try resolving www.foo.com --> Should succeed.
235 TestCompletionCallback callback2;
[email protected]5109c1952013-08-20 18:44:10236 rv = resolver->Resolve(
237 HostResolver::RequestInfo(HostPortPair("www.foo.com", 80)),
238 DEFAULT_PRIORITY,
239 &address_list,
240 callback2.callback(),
241 NULL,
242 BoundNetLog());
[email protected]c6c07432013-03-07 00:24:44243 EXPECT_EQ(ERR_IO_PENDING, rv);
244 rv = callback2.WaitForResult();
245 EXPECT_EQ(OK, rv);
246 EXPECT_EQ("192.168.1.5:80", FirstAddress(address_list));
247}
248
[email protected]9087aa32010-02-18 08:03:38249} // namespace
250
251} // namespace net