| 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 "base/memory/scoped_ptr.h" |
| 5 #include "net/base/address_tracker_linux.h" | 6 #include "net/base/address_tracker_linux.h" |
| 6 | 7 |
| 7 #include <linux/if.h> | 8 #include <linux/if.h> |
| 8 | 9 |
| 9 #include <vector> | 10 #include <vector> |
| 10 | 11 |
| 11 #include "base/bind.h" | 12 #include "base/bind.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 14 |
| 14 #ifndef IFA_F_HOMEADDRESS | 15 #ifndef IFA_F_HOMEADDRESS |
| (...skipping 11 matching lines...) Expand all Loading... |
| 26 return "tun0"; | 27 return "tun0"; |
| 27 return "eth0"; | 28 return "eth0"; |
| 28 } | 29 } |
| 29 | 30 |
| 30 } // namespace | 31 } // namespace |
| 31 | 32 |
| 32 typedef std::vector<char> Buffer; | 33 typedef std::vector<char> Buffer; |
| 33 | 34 |
| 34 class AddressTrackerLinuxTest : public testing::Test { | 35 class AddressTrackerLinuxTest : public testing::Test { |
| 35 protected: | 36 protected: |
| 36 AddressTrackerLinuxTest() | 37 AddressTrackerLinuxTest() {} |
| 37 : tracker_(base::Bind(&base::DoNothing), | 38 |
| 38 base::Bind(&base::DoNothing), | 39 void InitializeAddressTracker(bool tracking) { |
| 39 base::Bind(&base::DoNothing)), | 40 if (tracking) { |
| 40 original_get_interface_name_(tracker_.get_interface_name_) { | 41 tracker_.reset(new AddressTrackerLinux(base::Bind(&base::DoNothing), |
| 41 tracker_.get_interface_name_ = TestGetInterfaceName; | 42 base::Bind(&base::DoNothing), |
| 43 base::Bind(&base::DoNothing))); |
| 44 } else { |
| 45 tracker_.reset(new AddressTrackerLinux()); |
| 46 } |
| 47 original_get_interface_name_ = tracker_->get_interface_name_; |
| 48 tracker_->get_interface_name_ = TestGetInterfaceName; |
| 42 } | 49 } |
| 43 | 50 |
| 44 bool HandleAddressMessage(const Buffer& buf) { | 51 bool HandleAddressMessage(const Buffer& buf) { |
| 45 Buffer writable_buf = buf; | 52 Buffer writable_buf = buf; |
| 46 bool address_changed = false; | 53 bool address_changed = false; |
| 47 bool link_changed = false; | 54 bool link_changed = false; |
| 48 bool tunnel_changed = false; | 55 bool tunnel_changed = false; |
| 49 tracker_.HandleMessage(&writable_buf[0], buf.size(), | 56 tracker_->HandleMessage(&writable_buf[0], buf.size(), |
| 50 &address_changed, &link_changed, &tunnel_changed); | 57 &address_changed, &link_changed, &tunnel_changed); |
| 51 EXPECT_FALSE(link_changed); | 58 EXPECT_FALSE(link_changed); |
| 52 return address_changed; | 59 return address_changed; |
| 53 } | 60 } |
| 54 | 61 |
| 55 bool HandleLinkMessage(const Buffer& buf) { | 62 bool HandleLinkMessage(const Buffer& buf) { |
| 56 Buffer writable_buf = buf; | 63 Buffer writable_buf = buf; |
| 57 bool address_changed = false; | 64 bool address_changed = false; |
| 58 bool link_changed = false; | 65 bool link_changed = false; |
| 59 bool tunnel_changed = false; | 66 bool tunnel_changed = false; |
| 60 tracker_.HandleMessage(&writable_buf[0], buf.size(), | 67 tracker_->HandleMessage(&writable_buf[0], buf.size(), |
| 61 &address_changed, &link_changed, &tunnel_changed); | 68 &address_changed, &link_changed, &tunnel_changed); |
| 62 EXPECT_FALSE(address_changed); | 69 EXPECT_FALSE(address_changed); |
| 63 return link_changed; | 70 return link_changed; |
| 64 } | 71 } |
| 65 | 72 |
| 66 bool HandleTunnelMessage(const Buffer& buf) { | 73 bool HandleTunnelMessage(const Buffer& buf) { |
| 67 Buffer writable_buf = buf; | 74 Buffer writable_buf = buf; |
| 68 bool address_changed = false; | 75 bool address_changed = false; |
| 69 bool link_changed = false; | 76 bool link_changed = false; |
| 70 bool tunnel_changed = false; | 77 bool tunnel_changed = false; |
| 71 tracker_.HandleMessage(&writable_buf[0], buf.size(), | 78 tracker_->HandleMessage(&writable_buf[0], buf.size(), |
| 72 &address_changed, &link_changed, &tunnel_changed); | 79 &address_changed, &link_changed, &tunnel_changed); |
| 73 EXPECT_FALSE(address_changed); | 80 EXPECT_FALSE(address_changed); |
| 74 return tunnel_changed; | 81 return tunnel_changed; |
| 75 } | 82 } |
| 76 | 83 |
| 77 AddressTrackerLinux::AddressMap GetAddressMap() { | 84 AddressTrackerLinux::AddressMap GetAddressMap() { |
| 78 return tracker_.GetAddressMap(); | 85 return tracker_->GetAddressMap(); |
| 79 } | 86 } |
| 80 | 87 |
| 81 const base::hash_set<int>* GetOnlineLinks() const { | 88 const base::hash_set<int> GetOnlineLinks() const { |
| 82 return &tracker_.online_links_; | 89 return tracker_->GetOnlineLinks(); |
| 83 } | 90 } |
| 84 | 91 |
| 85 AddressTrackerLinux tracker_; | 92 scoped_ptr<AddressTrackerLinux> tracker_; |
| 86 AddressTrackerLinux::GetInterfaceNameFunction original_get_interface_name_; | 93 AddressTrackerLinux::GetInterfaceNameFunction original_get_interface_name_; |
| 87 }; | 94 }; |
| 88 | 95 |
| 89 namespace { | 96 namespace { |
| 90 | 97 |
| 91 class NetlinkMessage { | 98 class NetlinkMessage { |
| 92 public: | 99 public: |
| 93 explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) { | 100 explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) { |
| 94 header()->nlmsg_type = type; | 101 header()->nlmsg_type = type; |
| 95 Align(); | 102 Align(); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 nlmsg.AppendTo(output); | 190 nlmsg.AppendTo(output); |
| 184 } | 191 } |
| 185 | 192 |
| 186 const unsigned char kAddress0[] = { 127, 0, 0, 1 }; | 193 const unsigned char kAddress0[] = { 127, 0, 0, 1 }; |
| 187 const unsigned char kAddress1[] = { 10, 0, 0, 1 }; | 194 const unsigned char kAddress1[] = { 10, 0, 0, 1 }; |
| 188 const unsigned char kAddress2[] = { 192, 168, 0, 1 }; | 195 const unsigned char kAddress2[] = { 192, 168, 0, 1 }; |
| 189 const unsigned char kAddress3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 196 const unsigned char kAddress3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 190 0, 0, 0, 1 }; | 197 0, 0, 0, 1 }; |
| 191 | 198 |
| 192 TEST_F(AddressTrackerLinuxTest, NewAddress) { | 199 TEST_F(AddressTrackerLinuxTest, NewAddress) { |
| 200 InitializeAddressTracker(true); |
| 201 |
| 193 const IPAddressNumber kEmpty; | 202 const IPAddressNumber kEmpty; |
| 194 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 203 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 195 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); | 204 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); |
| 196 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); | 205 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); |
| 197 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); | 206 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); |
| 198 | 207 |
| 199 Buffer buffer; | 208 Buffer buffer; |
| 200 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, | 209 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, |
| 201 &buffer); | 210 &buffer); |
| 202 EXPECT_TRUE(HandleAddressMessage(buffer)); | 211 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 217 | 226 |
| 218 buffer.clear(); | 227 buffer.clear(); |
| 219 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); | 228 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); |
| 220 EXPECT_TRUE(HandleAddressMessage(buffer)); | 229 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 221 map = GetAddressMap(); | 230 map = GetAddressMap(); |
| 222 EXPECT_EQ(3u, map.size()); | 231 EXPECT_EQ(3u, map.size()); |
| 223 EXPECT_EQ(1u, map.count(kAddr3)); | 232 EXPECT_EQ(1u, map.count(kAddr3)); |
| 224 } | 233 } |
| 225 | 234 |
| 226 TEST_F(AddressTrackerLinuxTest, NewAddressChange) { | 235 TEST_F(AddressTrackerLinuxTest, NewAddressChange) { |
| 236 InitializeAddressTracker(true); |
| 237 |
| 227 const IPAddressNumber kEmpty; | 238 const IPAddressNumber kEmpty; |
| 228 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 239 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 229 | 240 |
| 230 Buffer buffer; | 241 Buffer buffer; |
| 231 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, | 242 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, |
| 232 &buffer); | 243 &buffer); |
| 233 EXPECT_TRUE(HandleAddressMessage(buffer)); | 244 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 234 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 245 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 235 EXPECT_EQ(1u, map.size()); | 246 EXPECT_EQ(1u, map.size()); |
| 236 EXPECT_EQ(1u, map.count(kAddr0)); | 247 EXPECT_EQ(1u, map.count(kAddr0)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 251 &buffer); | 262 &buffer); |
| 252 MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, | 263 MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, |
| 253 &buffer); | 264 &buffer); |
| 254 EXPECT_TRUE(HandleAddressMessage(buffer)); | 265 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 255 map = GetAddressMap(); | 266 map = GetAddressMap(); |
| 256 EXPECT_EQ(1u, map.size()); | 267 EXPECT_EQ(1u, map.size()); |
| 257 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); | 268 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); |
| 258 } | 269 } |
| 259 | 270 |
| 260 TEST_F(AddressTrackerLinuxTest, NewAddressDuplicate) { | 271 TEST_F(AddressTrackerLinuxTest, NewAddressDuplicate) { |
| 272 InitializeAddressTracker(true); |
| 273 |
| 261 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 274 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 262 | 275 |
| 263 Buffer buffer; | 276 Buffer buffer; |
| 264 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kAddr0, | 277 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kAddr0, |
| 265 &buffer); | 278 &buffer); |
| 266 EXPECT_TRUE(HandleAddressMessage(buffer)); | 279 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 267 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 280 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 268 EXPECT_EQ(1u, map.size()); | 281 EXPECT_EQ(1u, map.size()); |
| 269 EXPECT_EQ(1u, map.count(kAddr0)); | 282 EXPECT_EQ(1u, map.count(kAddr0)); |
| 270 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 283 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 271 | 284 |
| 272 EXPECT_FALSE(HandleAddressMessage(buffer)); | 285 EXPECT_FALSE(HandleAddressMessage(buffer)); |
| 273 map = GetAddressMap(); | 286 map = GetAddressMap(); |
| 274 EXPECT_EQ(1u, map.size()); | 287 EXPECT_EQ(1u, map.size()); |
| 275 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 288 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 276 } | 289 } |
| 277 | 290 |
| 278 TEST_F(AddressTrackerLinuxTest, DeleteAddress) { | 291 TEST_F(AddressTrackerLinuxTest, DeleteAddress) { |
| 292 InitializeAddressTracker(true); |
| 293 |
| 279 const IPAddressNumber kEmpty; | 294 const IPAddressNumber kEmpty; |
| 280 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 295 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 281 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); | 296 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); |
| 282 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); | 297 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); |
| 283 | 298 |
| 284 Buffer buffer; | 299 Buffer buffer; |
| 285 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kAddr0, kEmpty, &buffer); | 300 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kAddr0, kEmpty, &buffer); |
| 286 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kAddr1, kAddr2, &buffer); | 301 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kAddr1, kAddr2, &buffer); |
| 287 EXPECT_TRUE(HandleAddressMessage(buffer)); | 302 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 288 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 303 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 304 EXPECT_EQ(1u, map.size()); | 319 EXPECT_EQ(1u, map.size()); |
| 305 | 320 |
| 306 buffer.clear(); | 321 buffer.clear(); |
| 307 MakeAddrMessage(RTM_DELADDR, 0, AF_INET, kAddr2, kEmpty, &buffer); | 322 MakeAddrMessage(RTM_DELADDR, 0, AF_INET, kAddr2, kEmpty, &buffer); |
| 308 EXPECT_TRUE(HandleAddressMessage(buffer)); | 323 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 309 map = GetAddressMap(); | 324 map = GetAddressMap(); |
| 310 EXPECT_EQ(0u, map.size()); | 325 EXPECT_EQ(0u, map.size()); |
| 311 } | 326 } |
| 312 | 327 |
| 313 TEST_F(AddressTrackerLinuxTest, DeprecatedLifetime) { | 328 TEST_F(AddressTrackerLinuxTest, DeprecatedLifetime) { |
| 329 InitializeAddressTracker(true); |
| 330 |
| 314 const IPAddressNumber kEmpty; | 331 const IPAddressNumber kEmpty; |
| 315 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); | 332 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); |
| 316 | 333 |
| 317 Buffer buffer; | 334 Buffer buffer; |
| 318 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); | 335 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); |
| 319 EXPECT_TRUE(HandleAddressMessage(buffer)); | 336 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 320 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 337 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 321 EXPECT_EQ(1u, map.size()); | 338 EXPECT_EQ(1u, map.size()); |
| 322 EXPECT_EQ(1u, map.count(kAddr3)); | 339 EXPECT_EQ(1u, map.count(kAddr3)); |
| 323 EXPECT_EQ(0, map[kAddr3].ifa_flags); | 340 EXPECT_EQ(0, map[kAddr3].ifa_flags); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 344 buffer.clear(); | 361 buffer.clear(); |
| 345 MakeAddrMessageWithCacheInfo(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, 0, | 362 MakeAddrMessageWithCacheInfo(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, 0, |
| 346 &buffer); | 363 &buffer); |
| 347 EXPECT_FALSE(HandleAddressMessage(buffer)); | 364 EXPECT_FALSE(HandleAddressMessage(buffer)); |
| 348 map = GetAddressMap(); | 365 map = GetAddressMap(); |
| 349 EXPECT_EQ(1u, map.size()); | 366 EXPECT_EQ(1u, map.size()); |
| 350 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); | 367 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); |
| 351 } | 368 } |
| 352 | 369 |
| 353 TEST_F(AddressTrackerLinuxTest, IgnoredMessage) { | 370 TEST_F(AddressTrackerLinuxTest, IgnoredMessage) { |
| 371 InitializeAddressTracker(true); |
| 372 |
| 354 const IPAddressNumber kEmpty; | 373 const IPAddressNumber kEmpty; |
| 355 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 374 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 356 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); | 375 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); |
| 357 | 376 |
| 358 Buffer buffer; | 377 Buffer buffer; |
| 359 // Ignored family. | 378 // Ignored family. |
| 360 MakeAddrMessage(RTM_NEWADDR, 0, AF_UNSPEC, kAddr3, kAddr0, &buffer); | 379 MakeAddrMessage(RTM_NEWADDR, 0, AF_UNSPEC, kAddr3, kAddr0, &buffer); |
| 361 // No address. | 380 // No address. |
| 362 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kEmpty, kEmpty, &buffer); | 381 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kEmpty, kEmpty, &buffer); |
| 363 // Ignored type. | 382 // Ignored type. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 374 struct ifa_cacheinfo cache_info = {}; | 393 struct ifa_cacheinfo cache_info = {}; |
| 375 nlmsg.AddAttribute(IFA_CACHEINFO, &cache_info, sizeof(cache_info)); | 394 nlmsg.AddAttribute(IFA_CACHEINFO, &cache_info, sizeof(cache_info)); |
| 376 nlmsg.AddAttribute(IFA_ADDRESS, &kAddr0[0], kAddr0.size()); | 395 nlmsg.AddAttribute(IFA_ADDRESS, &kAddr0[0], kAddr0.size()); |
| 377 nlmsg.AppendTo(&buffer); | 396 nlmsg.AppendTo(&buffer); |
| 378 | 397 |
| 379 EXPECT_TRUE(HandleAddressMessage(buffer)); | 398 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 380 EXPECT_EQ(1u, GetAddressMap().size()); | 399 EXPECT_EQ(1u, GetAddressMap().size()); |
| 381 } | 400 } |
| 382 | 401 |
| 383 TEST_F(AddressTrackerLinuxTest, AddInterface) { | 402 TEST_F(AddressTrackerLinuxTest, AddInterface) { |
| 403 InitializeAddressTracker(true); |
| 404 |
| 384 Buffer buffer; | 405 Buffer buffer; |
| 385 | 406 |
| 386 // Ignores loopback. | 407 // Ignores loopback. |
| 387 MakeLinkMessage(RTM_NEWLINK, | 408 MakeLinkMessage(RTM_NEWLINK, |
| 388 IFF_LOOPBACK | IFF_UP | IFF_LOWER_UP | IFF_RUNNING, | 409 IFF_LOOPBACK | IFF_UP | IFF_LOWER_UP | IFF_RUNNING, |
| 389 0, &buffer); | 410 0, &buffer); |
| 390 EXPECT_FALSE(HandleLinkMessage(buffer)); | 411 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 391 EXPECT_TRUE(GetOnlineLinks()->empty()); | 412 EXPECT_TRUE(GetOnlineLinks().empty()); |
| 392 | 413 |
| 393 // Ignores not IFF_LOWER_UP. | 414 // Ignores not IFF_LOWER_UP. |
| 394 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); | 415 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); |
| 395 EXPECT_FALSE(HandleLinkMessage(buffer)); | 416 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 396 EXPECT_TRUE(GetOnlineLinks()->empty()); | 417 EXPECT_TRUE(GetOnlineLinks().empty()); |
| 397 | 418 |
| 398 // Ignores deletion. | 419 // Ignores deletion. |
| 399 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); | 420 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 400 EXPECT_FALSE(HandleLinkMessage(buffer)); | 421 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 401 EXPECT_TRUE(GetOnlineLinks()->empty()); | 422 EXPECT_TRUE(GetOnlineLinks().empty()); |
| 402 | 423 |
| 403 // Verify success. | 424 // Verify success. |
| 404 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); | 425 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 405 EXPECT_TRUE(HandleLinkMessage(buffer)); | 426 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 406 EXPECT_EQ(1u, GetOnlineLinks()->count(0)); | 427 EXPECT_EQ(1u, GetOnlineLinks().count(0)); |
| 407 EXPECT_EQ(1u, GetOnlineLinks()->size()); | 428 EXPECT_EQ(1u, GetOnlineLinks().size()); |
| 408 | 429 |
| 409 // Ignores redundant enables. | 430 // Ignores redundant enables. |
| 410 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); | 431 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 411 EXPECT_FALSE(HandleLinkMessage(buffer)); | 432 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 412 EXPECT_EQ(1u, GetOnlineLinks()->count(0)); | 433 EXPECT_EQ(1u, GetOnlineLinks().count(0)); |
| 413 EXPECT_EQ(1u, GetOnlineLinks()->size()); | 434 EXPECT_EQ(1u, GetOnlineLinks().size()); |
| 414 | 435 |
| 415 // Verify adding another online device (e.g. VPN) is considered a change. | 436 // Verify adding another online device (e.g. VPN) is considered a change. |
| 416 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 1, &buffer); | 437 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 1, &buffer); |
| 417 EXPECT_TRUE(HandleLinkMessage(buffer)); | 438 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 418 EXPECT_EQ(1u, GetOnlineLinks()->count(0)); | 439 EXPECT_EQ(1u, GetOnlineLinks().count(0)); |
| 419 EXPECT_EQ(1u, GetOnlineLinks()->count(1)); | 440 EXPECT_EQ(1u, GetOnlineLinks().count(1)); |
| 420 EXPECT_EQ(2u, GetOnlineLinks()->size()); | 441 EXPECT_EQ(2u, GetOnlineLinks().size()); |
| 421 } | 442 } |
| 422 | 443 |
| 423 TEST_F(AddressTrackerLinuxTest, RemoveInterface) { | 444 TEST_F(AddressTrackerLinuxTest, RemoveInterface) { |
| 445 InitializeAddressTracker(true); |
| 446 |
| 424 Buffer buffer; | 447 Buffer buffer; |
| 425 | 448 |
| 426 // Should disappear when not IFF_LOWER_UP. | 449 // Should disappear when not IFF_LOWER_UP. |
| 427 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); | 450 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 428 EXPECT_TRUE(HandleLinkMessage(buffer)); | 451 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 429 EXPECT_FALSE(GetOnlineLinks()->empty()); | 452 EXPECT_FALSE(GetOnlineLinks().empty()); |
| 430 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); | 453 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); |
| 431 EXPECT_TRUE(HandleLinkMessage(buffer)); | 454 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 432 EXPECT_TRUE(GetOnlineLinks()->empty()); | 455 EXPECT_TRUE(GetOnlineLinks().empty()); |
| 433 | 456 |
| 434 // Ignores redundant disables. | 457 // Ignores redundant disables. |
| 435 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); | 458 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); |
| 436 EXPECT_FALSE(HandleLinkMessage(buffer)); | 459 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 437 EXPECT_TRUE(GetOnlineLinks()->empty()); | 460 EXPECT_TRUE(GetOnlineLinks().empty()); |
| 438 | 461 |
| 439 // Ignores deleting down interfaces. | 462 // Ignores deleting down interfaces. |
| 440 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_RUNNING, 0, &buffer); | 463 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_RUNNING, 0, &buffer); |
| 441 EXPECT_FALSE(HandleLinkMessage(buffer)); | 464 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 442 EXPECT_TRUE(GetOnlineLinks()->empty()); | 465 EXPECT_TRUE(GetOnlineLinks().empty()); |
| 443 | 466 |
| 444 // Should disappear when deleted. | 467 // Should disappear when deleted. |
| 445 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); | 468 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 446 EXPECT_TRUE(HandleLinkMessage(buffer)); | 469 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 447 EXPECT_FALSE(GetOnlineLinks()->empty()); | 470 EXPECT_FALSE(GetOnlineLinks().empty()); |
| 448 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); | 471 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 449 EXPECT_TRUE(HandleLinkMessage(buffer)); | 472 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 450 EXPECT_TRUE(GetOnlineLinks()->empty()); | 473 EXPECT_TRUE(GetOnlineLinks().empty()); |
| 451 } | 474 } |
| 452 | 475 |
| 453 TEST_F(AddressTrackerLinuxTest, TunnelInterface) { | 476 TEST_F(AddressTrackerLinuxTest, TunnelInterface) { |
| 477 InitializeAddressTracker(true); |
| 478 |
| 454 Buffer buffer; | 479 Buffer buffer; |
| 455 | 480 |
| 456 // Ignores without "tun" prefixed name. | 481 // Ignores without "tun" prefixed name. |
| 457 MakeLinkMessage(RTM_NEWLINK, | 482 MakeLinkMessage(RTM_NEWLINK, |
| 458 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 483 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 459 0, &buffer); | 484 0, &buffer); |
| 460 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 485 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 461 | 486 |
| 462 // Verify success. | 487 // Verify success. |
| 463 MakeLinkMessage(RTM_NEWLINK, | 488 MakeLinkMessage(RTM_NEWLINK, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 486 // Ignores redundant deletions. | 511 // Ignores redundant deletions. |
| 487 MakeLinkMessage(RTM_DELLINK, | 512 MakeLinkMessage(RTM_DELLINK, |
| 488 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 513 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 489 kTestInterfaceTun, &buffer); | 514 kTestInterfaceTun, &buffer); |
| 490 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 515 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 491 } | 516 } |
| 492 | 517 |
| 493 // Check AddressTrackerLinux::get_interface_name_ original implementation | 518 // Check AddressTrackerLinux::get_interface_name_ original implementation |
| 494 // doesn't crash or return NULL. | 519 // doesn't crash or return NULL. |
| 495 TEST_F(AddressTrackerLinuxTest, GetInterfaceName) { | 520 TEST_F(AddressTrackerLinuxTest, GetInterfaceName) { |
| 521 InitializeAddressTracker(true); |
| 522 |
| 496 for (int i = 0; i < 10; i++) | 523 for (int i = 0; i < 10; i++) |
| 497 EXPECT_NE((const char*)NULL, original_get_interface_name_(i)); | 524 EXPECT_NE((const char*)NULL, original_get_interface_name_(i)); |
| 498 } | 525 } |
| 499 | 526 |
| 527 TEST_F(AddressTrackerLinuxTest, NonTrackingMode) { |
| 528 InitializeAddressTracker(false); |
| 529 |
| 530 const IPAddressNumber kEmpty; |
| 531 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 532 |
| 533 Buffer buffer; |
| 534 MakeAddrMessage( |
| 535 RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); |
| 536 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 537 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 538 EXPECT_EQ(1u, map.size()); |
| 539 EXPECT_EQ(1u, map.count(kAddr0)); |
| 540 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 541 |
| 542 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 543 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 544 EXPECT_EQ(1u, GetOnlineLinks().count(0)); |
| 545 EXPECT_EQ(1u, GetOnlineLinks().size()); |
| 546 } |
| 547 |
| 548 TEST_F(AddressTrackerLinuxTest, NonTrackingModeInit) { |
| 549 AddressTrackerLinux tracker; |
| 550 tracker.Init(); |
| 551 } |
| 552 |
| 500 } // namespace | 553 } // namespace |
| 501 | 554 |
| 502 } // namespace internal | 555 } // namespace internal |
| 503 } // namespace net | 556 } // namespace net |
| OLD | NEW |