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