| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/dns/mapped_host_resolver.h" | 5 #include "net/dns/mapped_host_resolver.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "net/base/address_list.h" | 9 #include "net/base/address_list.h" |
| 10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 | 22 |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 std::string FirstAddress(const AddressList& address_list) { | 25 std::string FirstAddress(const AddressList& address_list) { |
| 26 if (address_list.empty()) | 26 if (address_list.empty()) |
| 27 return std::string(); | 27 return std::string(); |
| 28 return address_list.front().ToString(); | 28 return address_list.front().ToString(); |
| 29 } | 29 } |
| 30 | 30 |
| 31 TEST(MappedHostResolverTest, Inclusion) { | 31 TEST(MappedHostResolverTest, Inclusion) { |
| 32 // Outstanding request. |
| 33 std::unique_ptr<HostResolver::Request> request; |
| 32 // Create a mock host resolver, with specific hostname to IP mappings. | 34 // Create a mock host resolver, with specific hostname to IP mappings. |
| 33 std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver()); | 35 std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver()); |
| 34 resolver_impl->rules()->AddSimulatedFailure("*google.com"); | 36 resolver_impl->rules()->AddSimulatedFailure("*google.com"); |
| 35 resolver_impl->rules()->AddRule("baz.com", "192.168.1.5"); | 37 resolver_impl->rules()->AddRule("baz.com", "192.168.1.5"); |
| 36 resolver_impl->rules()->AddRule("foo.com", "192.168.1.8"); | 38 resolver_impl->rules()->AddRule("foo.com", "192.168.1.8"); |
| 37 resolver_impl->rules()->AddRule("proxy", "192.168.1.11"); | 39 resolver_impl->rules()->AddRule("proxy", "192.168.1.11"); |
| 38 | 40 |
| 39 // Create a remapped resolver that uses |resolver_impl|. | 41 // Create a remapped resolver that uses |resolver_impl|. |
| 40 std::unique_ptr<MappedHostResolver> resolver( | 42 std::unique_ptr<MappedHostResolver> resolver( |
| 41 new MappedHostResolver(std::move(resolver_impl))); | 43 new MappedHostResolver(std::move(resolver_impl))); |
| 42 | 44 |
| 43 int rv; | 45 int rv; |
| 44 AddressList address_list; | 46 AddressList address_list; |
| 45 | 47 |
| 46 // Try resolving "www.google.com:80". There are no mappings yet, so this | 48 // Try resolving "www.google.com:80". There are no mappings yet, so this |
| 47 // hits |resolver_impl| and fails. | 49 // hits |resolver_impl| and fails. |
| 48 TestCompletionCallback callback; | 50 TestCompletionCallback callback; |
| 49 rv = resolver->Resolve( | 51 rv = resolver->Resolve( |
| 50 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)), | 52 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)), |
| 51 DEFAULT_PRIORITY, | 53 DEFAULT_PRIORITY, &address_list, callback.callback(), &request, |
| 52 &address_list, | |
| 53 callback.callback(), | |
| 54 NULL, | |
| 55 BoundNetLog()); | 54 BoundNetLog()); |
| 56 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 55 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 57 rv = callback.WaitForResult(); | 56 rv = callback.WaitForResult(); |
| 58 EXPECT_THAT(rv, IsError(ERR_NAME_NOT_RESOLVED)); | 57 EXPECT_THAT(rv, IsError(ERR_NAME_NOT_RESOLVED)); |
| 59 | 58 |
| 60 // Remap *.google.com to baz.com. | 59 // Remap *.google.com to baz.com. |
| 61 EXPECT_TRUE(resolver->AddRuleFromString("map *.google.com baz.com")); | 60 EXPECT_TRUE(resolver->AddRuleFromString("map *.google.com baz.com")); |
| 61 request.reset(); |
| 62 | 62 |
| 63 // Try resolving "www.google.com:80". Should be remapped to "baz.com:80". | 63 // Try resolving "www.google.com:80". Should be remapped to "baz.com:80". |
| 64 rv = resolver->Resolve( | 64 rv = resolver->Resolve( |
| 65 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)), | 65 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)), |
| 66 DEFAULT_PRIORITY, | 66 DEFAULT_PRIORITY, &address_list, callback.callback(), &request, |
| 67 &address_list, | |
| 68 callback.callback(), | |
| 69 NULL, | |
| 70 BoundNetLog()); | 67 BoundNetLog()); |
| 71 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 68 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 72 rv = callback.WaitForResult(); | 69 rv = callback.WaitForResult(); |
| 73 EXPECT_THAT(rv, IsOk()); | 70 EXPECT_THAT(rv, IsOk()); |
| 74 EXPECT_EQ("192.168.1.5:80", FirstAddress(address_list)); | 71 EXPECT_EQ("192.168.1.5:80", FirstAddress(address_list)); |
| 72 request.reset(); |
| 75 | 73 |
| 76 // Try resolving "foo.com:77". This will NOT be remapped, so result | 74 // Try resolving "foo.com:77". This will NOT be remapped, so result |
| 77 // is "foo.com:77". | 75 // is "foo.com:77". |
| 78 rv = resolver->Resolve(HostResolver::RequestInfo(HostPortPair("foo.com", 77)), | 76 rv = resolver->Resolve(HostResolver::RequestInfo(HostPortPair("foo.com", 77)), |
| 79 DEFAULT_PRIORITY, | 77 DEFAULT_PRIORITY, &address_list, callback.callback(), |
| 80 &address_list, | 78 &request, BoundNetLog()); |
| 81 callback.callback(), | |
| 82 NULL, | |
| 83 BoundNetLog()); | |
| 84 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 79 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 85 rv = callback.WaitForResult(); | 80 rv = callback.WaitForResult(); |
| 86 EXPECT_THAT(rv, IsOk()); | 81 EXPECT_THAT(rv, IsOk()); |
| 87 EXPECT_EQ("192.168.1.8:77", FirstAddress(address_list)); | 82 EXPECT_EQ("192.168.1.8:77", FirstAddress(address_list)); |
| 83 request.reset(); |
| 88 | 84 |
| 89 // Remap "*.org" to "proxy:99". | 85 // Remap "*.org" to "proxy:99". |
| 90 EXPECT_TRUE(resolver->AddRuleFromString("Map *.org proxy:99")); | 86 EXPECT_TRUE(resolver->AddRuleFromString("Map *.org proxy:99")); |
| 91 | 87 |
| 92 // Try resolving "chromium.org:61". Should be remapped to "proxy:99". | 88 // Try resolving "chromium.org:61". Should be remapped to "proxy:99". |
| 93 rv = resolver->Resolve( | 89 rv = resolver->Resolve( |
| 94 HostResolver::RequestInfo(HostPortPair("chromium.org", 61)), | 90 HostResolver::RequestInfo(HostPortPair("chromium.org", 61)), |
| 95 DEFAULT_PRIORITY, | 91 DEFAULT_PRIORITY, &address_list, callback.callback(), &request, |
| 96 &address_list, | |
| 97 callback.callback(), | |
| 98 NULL, | |
| 99 BoundNetLog()); | 92 BoundNetLog()); |
| 100 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 93 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 101 rv = callback.WaitForResult(); | 94 rv = callback.WaitForResult(); |
| 102 EXPECT_THAT(rv, IsOk()); | 95 EXPECT_THAT(rv, IsOk()); |
| 103 EXPECT_EQ("192.168.1.11:99", FirstAddress(address_list)); | 96 EXPECT_EQ("192.168.1.11:99", FirstAddress(address_list)); |
| 104 } | 97 } |
| 105 | 98 |
| 106 // Tests that exclusions are respected. | 99 // Tests that exclusions are respected. |
| 107 TEST(MappedHostResolverTest, Exclusion) { | 100 TEST(MappedHostResolverTest, Exclusion) { |
| 101 // Outstanding request. |
| 102 std::unique_ptr<HostResolver::Request> request; |
| 108 // Create a mock host resolver, with specific hostname to IP mappings. | 103 // Create a mock host resolver, with specific hostname to IP mappings. |
| 109 std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver()); | 104 std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver()); |
| 110 resolver_impl->rules()->AddRule("baz", "192.168.1.5"); | 105 resolver_impl->rules()->AddRule("baz", "192.168.1.5"); |
| 111 resolver_impl->rules()->AddRule("www.google.com", "192.168.1.3"); | 106 resolver_impl->rules()->AddRule("www.google.com", "192.168.1.3"); |
| 112 | 107 |
| 113 // Create a remapped resolver that uses |resolver_impl|. | 108 // Create a remapped resolver that uses |resolver_impl|. |
| 114 std::unique_ptr<MappedHostResolver> resolver( | 109 std::unique_ptr<MappedHostResolver> resolver( |
| 115 new MappedHostResolver(std::move(resolver_impl))); | 110 new MappedHostResolver(std::move(resolver_impl))); |
| 116 | 111 |
| 117 int rv; | 112 int rv; |
| 118 AddressList address_list; | 113 AddressList address_list; |
| 119 TestCompletionCallback callback; | 114 TestCompletionCallback callback; |
| 120 | 115 |
| 121 // Remap "*.com" to "baz". | 116 // Remap "*.com" to "baz". |
| 122 EXPECT_TRUE(resolver->AddRuleFromString("map *.com baz")); | 117 EXPECT_TRUE(resolver->AddRuleFromString("map *.com baz")); |
| 123 | 118 |
| 124 // Add an exclusion for "*.google.com". | 119 // Add an exclusion for "*.google.com". |
| 125 EXPECT_TRUE(resolver->AddRuleFromString("EXCLUDE *.google.com")); | 120 EXPECT_TRUE(resolver->AddRuleFromString("EXCLUDE *.google.com")); |
| 126 | 121 |
| 127 // Try resolving "www.google.com". Should not be remapped due to exclusion). | 122 // Try resolving "www.google.com". Should not be remapped due to exclusion). |
| 128 rv = resolver->Resolve( | 123 rv = resolver->Resolve( |
| 129 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)), | 124 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)), |
| 130 DEFAULT_PRIORITY, | 125 DEFAULT_PRIORITY, &address_list, callback.callback(), &request, |
| 131 &address_list, | |
| 132 callback.callback(), | |
| 133 NULL, | |
| 134 BoundNetLog()); | 126 BoundNetLog()); |
| 135 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 127 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 136 rv = callback.WaitForResult(); | 128 rv = callback.WaitForResult(); |
| 137 EXPECT_THAT(rv, IsOk()); | 129 EXPECT_THAT(rv, IsOk()); |
| 138 EXPECT_EQ("192.168.1.3:80", FirstAddress(address_list)); | 130 EXPECT_EQ("192.168.1.3:80", FirstAddress(address_list)); |
| 131 request.reset(); |
| 139 | 132 |
| 140 // Try resolving "chrome.com:80". Should be remapped to "baz:80". | 133 // Try resolving "chrome.com:80". Should be remapped to "baz:80". |
| 141 rv = resolver->Resolve( | 134 rv = resolver->Resolve( |
| 142 HostResolver::RequestInfo(HostPortPair("chrome.com", 80)), | 135 HostResolver::RequestInfo(HostPortPair("chrome.com", 80)), |
| 143 DEFAULT_PRIORITY, | 136 DEFAULT_PRIORITY, &address_list, callback.callback(), &request, |
| 144 &address_list, | |
| 145 callback.callback(), | |
| 146 NULL, | |
| 147 BoundNetLog()); | 137 BoundNetLog()); |
| 148 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 138 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 149 rv = callback.WaitForResult(); | 139 rv = callback.WaitForResult(); |
| 150 EXPECT_THAT(rv, IsOk()); | 140 EXPECT_THAT(rv, IsOk()); |
| 151 EXPECT_EQ("192.168.1.5:80", FirstAddress(address_list)); | 141 EXPECT_EQ("192.168.1.5:80", FirstAddress(address_list)); |
| 152 } | 142 } |
| 153 | 143 |
| 154 TEST(MappedHostResolverTest, SetRulesFromString) { | 144 TEST(MappedHostResolverTest, SetRulesFromString) { |
| 145 // Outstanding request. |
| 146 std::unique_ptr<HostResolver::Request> request; |
| 155 // Create a mock host resolver, with specific hostname to IP mappings. | 147 // Create a mock host resolver, with specific hostname to IP mappings. |
| 156 std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver()); | 148 std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver()); |
| 157 resolver_impl->rules()->AddRule("baz", "192.168.1.7"); | 149 resolver_impl->rules()->AddRule("baz", "192.168.1.7"); |
| 158 resolver_impl->rules()->AddRule("bar", "192.168.1.9"); | 150 resolver_impl->rules()->AddRule("bar", "192.168.1.9"); |
| 159 | 151 |
| 160 // Create a remapped resolver that uses |resolver_impl|. | 152 // Create a remapped resolver that uses |resolver_impl|. |
| 161 std::unique_ptr<MappedHostResolver> resolver( | 153 std::unique_ptr<MappedHostResolver> resolver( |
| 162 new MappedHostResolver(std::move(resolver_impl))); | 154 new MappedHostResolver(std::move(resolver_impl))); |
| 163 | 155 |
| 164 int rv; | 156 int rv; |
| 165 AddressList address_list; | 157 AddressList address_list; |
| 166 TestCompletionCallback callback; | 158 TestCompletionCallback callback; |
| 167 | 159 |
| 168 // Remap "*.com" to "baz", and *.net to "bar:60". | 160 // Remap "*.com" to "baz", and *.net to "bar:60". |
| 169 resolver->SetRulesFromString("map *.com baz , map *.net bar:60"); | 161 resolver->SetRulesFromString("map *.com baz , map *.net bar:60"); |
| 170 | 162 |
| 171 // Try resolving "www.google.com". Should be remapped to "baz". | 163 // Try resolving "www.google.com". Should be remapped to "baz". |
| 172 rv = resolver->Resolve( | 164 rv = resolver->Resolve( |
| 173 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)), | 165 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)), |
| 174 DEFAULT_PRIORITY, | 166 DEFAULT_PRIORITY, &address_list, callback.callback(), &request, |
| 175 &address_list, | |
| 176 callback.callback(), | |
| 177 NULL, | |
| 178 BoundNetLog()); | 167 BoundNetLog()); |
| 179 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 168 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 180 rv = callback.WaitForResult(); | 169 rv = callback.WaitForResult(); |
| 181 EXPECT_THAT(rv, IsOk()); | 170 EXPECT_THAT(rv, IsOk()); |
| 182 EXPECT_EQ("192.168.1.7:80", FirstAddress(address_list)); | 171 EXPECT_EQ("192.168.1.7:80", FirstAddress(address_list)); |
| 172 request.reset(); |
| 183 | 173 |
| 184 // Try resolving "chrome.net:80". Should be remapped to "bar:60". | 174 // Try resolving "chrome.net:80". Should be remapped to "bar:60". |
| 185 rv = resolver->Resolve( | 175 rv = resolver->Resolve( |
| 186 HostResolver::RequestInfo(HostPortPair("chrome.net", 80)), | 176 HostResolver::RequestInfo(HostPortPair("chrome.net", 80)), |
| 187 DEFAULT_PRIORITY, | 177 DEFAULT_PRIORITY, &address_list, callback.callback(), &request, |
| 188 &address_list, | |
| 189 callback.callback(), | |
| 190 NULL, | |
| 191 BoundNetLog()); | 178 BoundNetLog()); |
| 192 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 179 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 193 rv = callback.WaitForResult(); | 180 rv = callback.WaitForResult(); |
| 194 EXPECT_THAT(rv, IsOk()); | 181 EXPECT_THAT(rv, IsOk()); |
| 195 EXPECT_EQ("192.168.1.9:60", FirstAddress(address_list)); | 182 EXPECT_EQ("192.168.1.9:60", FirstAddress(address_list)); |
| 196 } | 183 } |
| 197 | 184 |
| 198 // Parsing bad rules should silently discard the rule (and never crash). | 185 // Parsing bad rules should silently discard the rule (and never crash). |
| 199 TEST(MappedHostResolverTest, ParseInvalidRules) { | 186 TEST(MappedHostResolverTest, ParseInvalidRules) { |
| 200 std::unique_ptr<MappedHostResolver> resolver( | 187 std::unique_ptr<MappedHostResolver> resolver( |
| 201 new MappedHostResolver(std::unique_ptr<HostResolver>())); | 188 new MappedHostResolver(std::unique_ptr<HostResolver>())); |
| 202 | 189 |
| 203 EXPECT_FALSE(resolver->AddRuleFromString("xyz")); | 190 EXPECT_FALSE(resolver->AddRuleFromString("xyz")); |
| 204 EXPECT_FALSE(resolver->AddRuleFromString(std::string())); | 191 EXPECT_FALSE(resolver->AddRuleFromString(std::string())); |
| 205 EXPECT_FALSE(resolver->AddRuleFromString(" ")); | 192 EXPECT_FALSE(resolver->AddRuleFromString(" ")); |
| 206 EXPECT_FALSE(resolver->AddRuleFromString("EXCLUDE")); | 193 EXPECT_FALSE(resolver->AddRuleFromString("EXCLUDE")); |
| 207 EXPECT_FALSE(resolver->AddRuleFromString("EXCLUDE foo bar")); | 194 EXPECT_FALSE(resolver->AddRuleFromString("EXCLUDE foo bar")); |
| 208 EXPECT_FALSE(resolver->AddRuleFromString("INCLUDE")); | 195 EXPECT_FALSE(resolver->AddRuleFromString("INCLUDE")); |
| 209 EXPECT_FALSE(resolver->AddRuleFromString("INCLUDE x")); | 196 EXPECT_FALSE(resolver->AddRuleFromString("INCLUDE x")); |
| 210 EXPECT_FALSE(resolver->AddRuleFromString("INCLUDE x :10")); | 197 EXPECT_FALSE(resolver->AddRuleFromString("INCLUDE x :10")); |
| 211 } | 198 } |
| 212 | 199 |
| 213 // Test mapping hostnames to resolving failures. | 200 // Test mapping hostnames to resolving failures. |
| 214 TEST(MappedHostResolverTest, MapToError) { | 201 TEST(MappedHostResolverTest, MapToError) { |
| 202 // Outstanding request. |
| 203 std::unique_ptr<HostResolver::Request> request; |
| 215 std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver()); | 204 std::unique_ptr<MockHostResolver> resolver_impl(new MockHostResolver()); |
| 216 resolver_impl->rules()->AddRule("*", "192.168.1.5"); | 205 resolver_impl->rules()->AddRule("*", "192.168.1.5"); |
| 217 | 206 |
| 218 std::unique_ptr<MappedHostResolver> resolver( | 207 std::unique_ptr<MappedHostResolver> resolver( |
| 219 new MappedHostResolver(std::move(resolver_impl))); | 208 new MappedHostResolver(std::move(resolver_impl))); |
| 220 | 209 |
| 221 int rv; | 210 int rv; |
| 222 AddressList address_list; | 211 AddressList address_list; |
| 223 | 212 |
| 224 // Remap *.google.com to resolving failures. | 213 // Remap *.google.com to resolving failures. |
| 225 EXPECT_TRUE(resolver->AddRuleFromString("MAP *.google.com ~NOTFOUND")); | 214 EXPECT_TRUE(resolver->AddRuleFromString("MAP *.google.com ~NOTFOUND")); |
| 226 | 215 |
| 227 // Try resolving www.google.com --> Should give an error. | 216 // Try resolving www.google.com --> Should give an error. |
| 228 TestCompletionCallback callback1; | 217 TestCompletionCallback callback1; |
| 229 rv = resolver->Resolve( | 218 rv = resolver->Resolve( |
| 230 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)), | 219 HostResolver::RequestInfo(HostPortPair("www.google.com", 80)), |
| 231 DEFAULT_PRIORITY, | 220 DEFAULT_PRIORITY, &address_list, callback1.callback(), &request, |
| 232 &address_list, | |
| 233 callback1.callback(), | |
| 234 NULL, | |
| 235 BoundNetLog()); | 221 BoundNetLog()); |
| 236 EXPECT_THAT(rv, IsError(ERR_NAME_NOT_RESOLVED)); | 222 EXPECT_THAT(rv, IsError(ERR_NAME_NOT_RESOLVED)); |
| 223 request.reset(); |
| 237 | 224 |
| 238 // Try resolving www.foo.com --> Should succeed. | 225 // Try resolving www.foo.com --> Should succeed. |
| 239 TestCompletionCallback callback2; | 226 TestCompletionCallback callback2; |
| 240 rv = resolver->Resolve( | 227 rv = resolver->Resolve( |
| 241 HostResolver::RequestInfo(HostPortPair("www.foo.com", 80)), | 228 HostResolver::RequestInfo(HostPortPair("www.foo.com", 80)), |
| 242 DEFAULT_PRIORITY, | 229 DEFAULT_PRIORITY, &address_list, callback2.callback(), &request, |
| 243 &address_list, | |
| 244 callback2.callback(), | |
| 245 NULL, | |
| 246 BoundNetLog()); | 230 BoundNetLog()); |
| 247 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 231 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 248 rv = callback2.WaitForResult(); | 232 rv = callback2.WaitForResult(); |
| 249 EXPECT_THAT(rv, IsOk()); | 233 EXPECT_THAT(rv, IsOk()); |
| 250 EXPECT_EQ("192.168.1.5:80", FirstAddress(address_list)); | 234 EXPECT_EQ("192.168.1.5:80", FirstAddress(address_list)); |
| 251 } | 235 } |
| 252 | 236 |
| 253 } // namespace | 237 } // namespace |
| 254 | 238 |
| 255 } // namespace net | 239 } // namespace net |
| OLD | NEW |