| 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/address_sorter_posix.h" | 5 #include "net/dns/address_sorter_posix.h" | 
| 6 | 6 | 
| 7 #include "base/bind.h" | 7 #include "base/bind.h" | 
| 8 #include "base/logging.h" | 8 #include "base/logging.h" | 
| 9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" | 
| 10 #include "net/base/net_util.h" | 10 #include "net/base/net_util.h" | 
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 144       const std::string& addr) { | 144       const std::string& addr) { | 
| 145     IPAddressNumber address = ParseIP(addr); | 145     IPAddressNumber address = ParseIP(addr); | 
| 146     AddressSorterPosix::SourceAddressInfo* info = &sorter_.source_map_[address]; | 146     AddressSorterPosix::SourceAddressInfo* info = &sorter_.source_map_[address]; | 
| 147     if (info->scope == AddressSorterPosix::SCOPE_UNDEFINED) | 147     if (info->scope == AddressSorterPosix::SCOPE_UNDEFINED) | 
| 148       sorter_.FillPolicy(address, info); | 148       sorter_.FillPolicy(address, info); | 
| 149     return info; | 149     return info; | 
| 150   } | 150   } | 
| 151 | 151 | 
| 152   // Verify that NULL-terminated |addresses| matches (-1)-terminated |order| | 152   // Verify that NULL-terminated |addresses| matches (-1)-terminated |order| | 
| 153   // after sorting. | 153   // after sorting. | 
| 154   void Verify(const char* addresses[], const int order[]) { | 154   void Verify(const char* const addresses[], const int order[]) { | 
| 155     AddressList list; | 155     AddressList list; | 
| 156     for (const char** addr = addresses; *addr != NULL; ++addr) | 156     for (const char* const* addr = addresses; *addr != NULL; ++addr) | 
| 157       list.push_back(IPEndPoint(ParseIP(*addr), 80)); | 157       list.push_back(IPEndPoint(ParseIP(*addr), 80)); | 
| 158     for (size_t i = 0; order[i] >= 0; ++i) | 158     for (size_t i = 0; order[i] >= 0; ++i) | 
| 159       CHECK_LT(order[i], static_cast<int>(list.size())); | 159       CHECK_LT(order[i], static_cast<int>(list.size())); | 
| 160 | 160 | 
| 161     AddressList result; | 161     AddressList result; | 
| 162     TestCompletionCallback callback; | 162     TestCompletionCallback callback; | 
| 163     sorter_.Sort(list, base::Bind(&OnSortComplete, &result, | 163     sorter_.Sort(list, base::Bind(&OnSortComplete, &result, | 
| 164                                   callback.callback())); | 164                                   callback.callback())); | 
| 165     callback.WaitForResult(); | 165     callback.WaitForResult(); | 
| 166 | 166 | 
| 167     for (size_t i = 0; (i < result.size()) || (order[i] >= 0); ++i) { | 167     for (size_t i = 0; (i < result.size()) || (order[i] >= 0); ++i) { | 
| 168       IPEndPoint expected = order[i] >= 0 ? list[order[i]] : IPEndPoint(); | 168       IPEndPoint expected = order[i] >= 0 ? list[order[i]] : IPEndPoint(); | 
| 169       IPEndPoint actual = i < result.size() ? result[i] : IPEndPoint(); | 169       IPEndPoint actual = i < result.size() ? result[i] : IPEndPoint(); | 
| 170       EXPECT_TRUE(expected.address() == actual.address()) << | 170       EXPECT_TRUE(expected.address() == actual.address()) << | 
| 171           "Address out of order at position " << i << "\n" << | 171           "Address out of order at position " << i << "\n" << | 
| 172           "  Actual: " << actual.ToStringWithoutPort() << "\n" << | 172           "  Actual: " << actual.ToStringWithoutPort() << "\n" << | 
| 173           "Expected: " << expected.ToStringWithoutPort(); | 173           "Expected: " << expected.ToStringWithoutPort(); | 
| 174     } | 174     } | 
| 175   } | 175   } | 
| 176 | 176 | 
| 177   TestSocketFactory socket_factory_; | 177   TestSocketFactory socket_factory_; | 
| 178   AddressSorterPosix sorter_; | 178   AddressSorterPosix sorter_; | 
| 179 }; | 179 }; | 
| 180 | 180 | 
| 181 // Rule 1: Avoid unusable destinations. | 181 // Rule 1: Avoid unusable destinations. | 
| 182 TEST_F(AddressSorterPosixTest, Rule1) { | 182 TEST_F(AddressSorterPosixTest, Rule1) { | 
| 183   AddMapping("10.0.0.231", "10.0.0.1"); | 183   AddMapping("10.0.0.231", "10.0.0.1"); | 
| 184   const char* addresses[] = { "::1", "10.0.0.231", "127.0.0.1", NULL }; | 184   const char* const addresses[] = { "::1", "10.0.0.231", "127.0.0.1", NULL }; | 
| 185   const int order[] = { 1, -1 }; | 185   const int order[] = { 1, -1 }; | 
| 186   Verify(addresses, order); | 186   Verify(addresses, order); | 
| 187 } | 187 } | 
| 188 | 188 | 
| 189 // Rule 2: Prefer matching scope. | 189 // Rule 2: Prefer matching scope. | 
| 190 TEST_F(AddressSorterPosixTest, Rule2) { | 190 TEST_F(AddressSorterPosixTest, Rule2) { | 
| 191   AddMapping("3002::1", "4000::10");      // matching global | 191   AddMapping("3002::1", "4000::10");      // matching global | 
| 192   AddMapping("ff32::1", "fe81::10");      // matching link-local | 192   AddMapping("ff32::1", "fe81::10");      // matching link-local | 
| 193   AddMapping("fec1::1", "fec1::10");      // matching node-local | 193   AddMapping("fec1::1", "fec1::10");      // matching node-local | 
| 194   AddMapping("3002::2", "::1");           // global vs. link-local | 194   AddMapping("3002::2", "::1");           // global vs. link-local | 
| 195   AddMapping("fec1::2", "fe81::10");      // site-local vs. link-local | 195   AddMapping("fec1::2", "fe81::10");      // site-local vs. link-local | 
| 196   AddMapping("8.0.0.1", "169.254.0.10");  // global vs. link-local | 196   AddMapping("8.0.0.1", "169.254.0.10");  // global vs. link-local | 
| 197   // In all three cases, matching scope is preferred. | 197   // In all three cases, matching scope is preferred. | 
| 198   const int order[] = { 1, 0, -1 }; | 198   const int order[] = { 1, 0, -1 }; | 
| 199   const char* addresses1[] = { "3002::2", "3002::1", NULL }; | 199   const char* const addresses1[] = { "3002::2", "3002::1", NULL }; | 
| 200   Verify(addresses1, order); | 200   Verify(addresses1, order); | 
| 201   const char* addresses2[] = { "fec1::2", "ff32::1", NULL }; | 201   const char* const addresses2[] = { "fec1::2", "ff32::1", NULL }; | 
| 202   Verify(addresses2, order); | 202   Verify(addresses2, order); | 
| 203   const char* addresses3[] = { "8.0.0.1", "fec1::1", NULL }; | 203   const char* const addresses3[] = { "8.0.0.1", "fec1::1", NULL }; | 
| 204   Verify(addresses3, order); | 204   Verify(addresses3, order); | 
| 205 } | 205 } | 
| 206 | 206 | 
| 207 // Rule 3: Avoid deprecated addresses. | 207 // Rule 3: Avoid deprecated addresses. | 
| 208 TEST_F(AddressSorterPosixTest, Rule3) { | 208 TEST_F(AddressSorterPosixTest, Rule3) { | 
| 209   // Matching scope. | 209   // Matching scope. | 
| 210   AddMapping("3002::1", "4000::10"); | 210   AddMapping("3002::1", "4000::10"); | 
| 211   GetSourceInfo("4000::10")->deprecated = true; | 211   GetSourceInfo("4000::10")->deprecated = true; | 
| 212   AddMapping("3002::2", "4000::20"); | 212   AddMapping("3002::2", "4000::20"); | 
| 213   const char* addresses[] = { "3002::1", "3002::2", NULL }; | 213   const char* const addresses[] = { "3002::1", "3002::2", NULL }; | 
| 214   const int order[] = { 1, 0, -1 }; | 214   const int order[] = { 1, 0, -1 }; | 
| 215   Verify(addresses, order); | 215   Verify(addresses, order); | 
| 216 } | 216 } | 
| 217 | 217 | 
| 218 // Rule 4: Prefer home addresses. | 218 // Rule 4: Prefer home addresses. | 
| 219 TEST_F(AddressSorterPosixTest, Rule4) { | 219 TEST_F(AddressSorterPosixTest, Rule4) { | 
| 220   AddMapping("3002::1", "4000::10"); | 220   AddMapping("3002::1", "4000::10"); | 
| 221   AddMapping("3002::2", "4000::20"); | 221   AddMapping("3002::2", "4000::20"); | 
| 222   GetSourceInfo("4000::20")->home = true; | 222   GetSourceInfo("4000::20")->home = true; | 
| 223   const char* addresses[] = { "3002::1", "3002::2", NULL }; | 223   const char* const addresses[] = { "3002::1", "3002::2", NULL }; | 
| 224   const int order[] = { 1, 0, -1 }; | 224   const int order[] = { 1, 0, -1 }; | 
| 225   Verify(addresses, order); | 225   Verify(addresses, order); | 
| 226 } | 226 } | 
| 227 | 227 | 
| 228 // Rule 5: Prefer matching label. | 228 // Rule 5: Prefer matching label. | 
| 229 TEST_F(AddressSorterPosixTest, Rule5) { | 229 TEST_F(AddressSorterPosixTest, Rule5) { | 
| 230   AddMapping("::1", "::1");                       // matching loopback | 230   AddMapping("::1", "::1");                       // matching loopback | 
| 231   AddMapping("::ffff:1234:1", "::ffff:1234:10");  // matching IPv4-mapped | 231   AddMapping("::ffff:1234:1", "::ffff:1234:10");  // matching IPv4-mapped | 
| 232   AddMapping("2001::1", "::ffff:1234:10");        // Teredo vs. IPv4-mapped | 232   AddMapping("2001::1", "::ffff:1234:10");        // Teredo vs. IPv4-mapped | 
| 233   AddMapping("2002::1", "2001::10");              // 6to4 vs. Teredo | 233   AddMapping("2002::1", "2001::10");              // 6to4 vs. Teredo | 
| 234   const int order[] = { 1, 0, -1 }; | 234   const int order[] = { 1, 0, -1 }; | 
| 235   { | 235   { | 
| 236     const char* addresses[] = { "2001::1", "::1", NULL }; | 236     const char* const addresses[] = { "2001::1", "::1", NULL }; | 
| 237     Verify(addresses, order); | 237     Verify(addresses, order); | 
| 238   } | 238   } | 
| 239   { | 239   { | 
| 240     const char* addresses[] = { "2002::1", "::ffff:1234:1", NULL }; | 240     const char* const addresses[] = { "2002::1", "::ffff:1234:1", NULL }; | 
| 241     Verify(addresses, order); | 241     Verify(addresses, order); | 
| 242   } | 242   } | 
| 243 } | 243 } | 
| 244 | 244 | 
| 245 // Rule 6: Prefer higher precedence. | 245 // Rule 6: Prefer higher precedence. | 
| 246 TEST_F(AddressSorterPosixTest, Rule6) { | 246 TEST_F(AddressSorterPosixTest, Rule6) { | 
| 247   AddMapping("::1", "::1");                       // loopback | 247   AddMapping("::1", "::1");                       // loopback | 
| 248   AddMapping("ff32::1", "fe81::10");              // multicast | 248   AddMapping("ff32::1", "fe81::10");              // multicast | 
| 249   AddMapping("::ffff:1234:1", "::ffff:1234:10");  // IPv4-mapped | 249   AddMapping("::ffff:1234:1", "::ffff:1234:10");  // IPv4-mapped | 
| 250   AddMapping("2001::1", "2001::10");              // Teredo | 250   AddMapping("2001::1", "2001::10");              // Teredo | 
| 251   const char* addresses[] = { "2001::1", "::ffff:1234:1", "ff32::1", "::1", | 251   const char* const addresses[] = { "2001::1", "::ffff:1234:1", "ff32::1", | 
| 252                               NULL }; | 252     "::1", NULL }; | 
| 253   const int order[] = { 3, 2, 1, 0, -1 }; | 253   const int order[] = { 3, 2, 1, 0, -1 }; | 
| 254   Verify(addresses, order); | 254   Verify(addresses, order); | 
| 255 } | 255 } | 
| 256 | 256 | 
| 257 // Rule 7: Prefer native transport. | 257 // Rule 7: Prefer native transport. | 
| 258 TEST_F(AddressSorterPosixTest, Rule7) { | 258 TEST_F(AddressSorterPosixTest, Rule7) { | 
| 259   AddMapping("3002::1", "4000::10"); | 259   AddMapping("3002::1", "4000::10"); | 
| 260   AddMapping("3002::2", "4000::20"); | 260   AddMapping("3002::2", "4000::20"); | 
| 261   GetSourceInfo("4000::20")->native = true; | 261   GetSourceInfo("4000::20")->native = true; | 
| 262   const char* addresses[] = { "3002::1", "3002::2", NULL }; | 262   const char* const addresses[] = { "3002::1", "3002::2", NULL }; | 
| 263   const int order[] = { 1, 0, -1 }; | 263   const int order[] = { 1, 0, -1 }; | 
| 264   Verify(addresses, order); | 264   Verify(addresses, order); | 
| 265 } | 265 } | 
| 266 | 266 | 
| 267 // Rule 8: Prefer smaller scope. | 267 // Rule 8: Prefer smaller scope. | 
| 268 TEST_F(AddressSorterPosixTest, Rule8) { | 268 TEST_F(AddressSorterPosixTest, Rule8) { | 
| 269   // Matching scope. Should precede the others by Rule 2. | 269   // Matching scope. Should precede the others by Rule 2. | 
| 270   AddMapping("fe81::1", "fe81::10");  // link-local | 270   AddMapping("fe81::1", "fe81::10");  // link-local | 
| 271   AddMapping("3000::1", "4000::10");  // global | 271   AddMapping("3000::1", "4000::10");  // global | 
| 272   // Mismatched scope. | 272   // Mismatched scope. | 
| 273   AddMapping("ff32::1", "4000::10");  // link-local | 273   AddMapping("ff32::1", "4000::10");  // link-local | 
| 274   AddMapping("ff35::1", "4000::10");  // site-local | 274   AddMapping("ff35::1", "4000::10");  // site-local | 
| 275   AddMapping("ff38::1", "4000::10");  // org-local | 275   AddMapping("ff38::1", "4000::10");  // org-local | 
| 276   const char* addresses[] = { "ff38::1", "3000::1", "ff35::1", "ff32::1", | 276   const char* const addresses[] = { "ff38::1", "3000::1", "ff35::1", "ff32::1", | 
| 277                               "fe81::1", NULL }; | 277                                     "fe81::1", NULL }; | 
| 278   const int order[] = { 4, 1, 3, 2, 0, -1 }; | 278   const int order[] = { 4, 1, 3, 2, 0, -1 }; | 
| 279   Verify(addresses, order); | 279   Verify(addresses, order); | 
| 280 } | 280 } | 
| 281 | 281 | 
| 282 // Rule 9: Use longest matching prefix. | 282 // Rule 9: Use longest matching prefix. | 
| 283 TEST_F(AddressSorterPosixTest, Rule9) { | 283 TEST_F(AddressSorterPosixTest, Rule9) { | 
| 284   AddMapping("3000::1", "3000:ffff::10");  // 16 bit match | 284   AddMapping("3000::1", "3000:ffff::10");  // 16 bit match | 
| 285   GetSourceInfo("3000:ffff::10")->prefix_length = 16; | 285   GetSourceInfo("3000:ffff::10")->prefix_length = 16; | 
| 286   AddMapping("4000::1", "4000::10");       // 123 bit match, limited to 15 | 286   AddMapping("4000::1", "4000::10");       // 123 bit match, limited to 15 | 
| 287   GetSourceInfo("4000::10")->prefix_length = 15; | 287   GetSourceInfo("4000::10")->prefix_length = 15; | 
| 288   AddMapping("4002::1", "4000::10");       // 14 bit match | 288   AddMapping("4002::1", "4000::10");       // 14 bit match | 
| 289   AddMapping("4080::1", "4000::10");       // 8 bit match | 289   AddMapping("4080::1", "4000::10");       // 8 bit match | 
| 290   const char* addresses[] = { "4080::1", "4002::1", "4000::1", "3000::1", | 290   const char* const addresses[] = { "4080::1", "4002::1", "4000::1", "3000::1", | 
| 291                               NULL }; | 291                                     NULL }; | 
| 292   const int order[] = { 3, 2, 1, 0, -1 }; | 292   const int order[] = { 3, 2, 1, 0, -1 }; | 
| 293   Verify(addresses, order); | 293   Verify(addresses, order); | 
| 294 } | 294 } | 
| 295 | 295 | 
| 296 // Rule 10: Leave the order unchanged. | 296 // Rule 10: Leave the order unchanged. | 
| 297 TEST_F(AddressSorterPosixTest, Rule10) { | 297 TEST_F(AddressSorterPosixTest, Rule10) { | 
| 298   AddMapping("4000::1", "4000::10"); | 298   AddMapping("4000::1", "4000::10"); | 
| 299   AddMapping("4000::2", "4000::10"); | 299   AddMapping("4000::2", "4000::10"); | 
| 300   AddMapping("4000::3", "4000::10"); | 300   AddMapping("4000::3", "4000::10"); | 
| 301   const char* addresses[] = { "4000::1", "4000::2", "4000::3", NULL }; | 301   const char* const addresses[] = { "4000::1", "4000::2", "4000::3", NULL }; | 
| 302   const int order[] = { 0, 1, 2, -1 }; | 302   const int order[] = { 0, 1, 2, -1 }; | 
| 303   Verify(addresses, order); | 303   Verify(addresses, order); | 
| 304 } | 304 } | 
| 305 | 305 | 
| 306 TEST_F(AddressSorterPosixTest, MultipleRules) { | 306 TEST_F(AddressSorterPosixTest, MultipleRules) { | 
| 307   AddMapping("::1", "::1");           // loopback | 307   AddMapping("::1", "::1");           // loopback | 
| 308   AddMapping("ff32::1", "fe81::10");  // link-local multicast | 308   AddMapping("ff32::1", "fe81::10");  // link-local multicast | 
| 309   AddMapping("ff3e::1", "4000::10");  // global multicast | 309   AddMapping("ff3e::1", "4000::10");  // global multicast | 
| 310   AddMapping("4000::1", "4000::10");  // global unicast | 310   AddMapping("4000::1", "4000::10");  // global unicast | 
| 311   AddMapping("ff32::2", "fe81::20");  // deprecated link-local multicast | 311   AddMapping("ff32::2", "fe81::20");  // deprecated link-local multicast | 
| 312   GetSourceInfo("fe81::20")->deprecated = true; | 312   GetSourceInfo("fe81::20")->deprecated = true; | 
| 313   const char* addresses[] = { "ff3e::1", "ff32::2", "4000::1", "ff32::1", "::1", | 313   const char* const addresses[] = { "ff3e::1", "ff32::2", "4000::1", "ff32::1", | 
| 314                               "8.0.0.1", NULL }; | 314                                     "::1", "8.0.0.1", NULL }; | 
| 315   const int order[] = { 4, 3, 0, 2, 1, -1 }; | 315   const int order[] = { 4, 3, 0, 2, 1, -1 }; | 
| 316   Verify(addresses, order); | 316   Verify(addresses, order); | 
| 317 } | 317 } | 
| 318 | 318 | 
| 319 }  // namespace net | 319 }  // namespace net | 
| OLD | NEW | 
|---|