| 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 "base/memory/scoped_ptr.h" |
| 6 #include "net/base/address_tracker_linux.h" | 6 #include "net/base/address_tracker_linux.h" |
| 7 | 7 |
| 8 #include <linux/if.h> | 8 #include <linux/if.h> |
| 9 | 9 |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 } | 46 } |
| 47 original_get_interface_name_ = tracker_->get_interface_name_; | 47 original_get_interface_name_ = tracker_->get_interface_name_; |
| 48 tracker_->get_interface_name_ = TestGetInterfaceName; | 48 tracker_->get_interface_name_ = TestGetInterfaceName; |
| 49 } | 49 } |
| 50 | 50 |
| 51 bool HandleAddressMessage(const Buffer& buf) { | 51 bool HandleAddressMessage(const Buffer& buf) { |
| 52 Buffer writable_buf = buf; | 52 Buffer writable_buf = buf; |
| 53 bool address_changed = false; | 53 bool address_changed = false; |
| 54 bool link_changed = false; | 54 bool link_changed = false; |
| 55 bool tunnel_changed = false; | 55 bool tunnel_changed = false; |
| 56 tracker_->HandleMessage(&writable_buf[0], buf.size(), | 56 tracker_->HandleMessage(&writable_buf[0], buf.size(), &address_changed, |
| 57 &address_changed, &link_changed, &tunnel_changed); | 57 &link_changed, &tunnel_changed); |
| 58 EXPECT_FALSE(link_changed); | 58 EXPECT_FALSE(link_changed); |
| 59 return address_changed; | 59 return address_changed; |
| 60 } | 60 } |
| 61 | 61 |
| 62 bool HandleLinkMessage(const Buffer& buf) { | 62 bool HandleLinkMessage(const Buffer& buf) { |
| 63 Buffer writable_buf = buf; | 63 Buffer writable_buf = buf; |
| 64 bool address_changed = false; | 64 bool address_changed = false; |
| 65 bool link_changed = false; | 65 bool link_changed = false; |
| 66 bool tunnel_changed = false; | 66 bool tunnel_changed = false; |
| 67 tracker_->HandleMessage(&writable_buf[0], buf.size(), | 67 tracker_->HandleMessage(&writable_buf[0], buf.size(), &address_changed, |
| 68 &address_changed, &link_changed, &tunnel_changed); | 68 &link_changed, &tunnel_changed); |
| 69 EXPECT_FALSE(address_changed); | 69 EXPECT_FALSE(address_changed); |
| 70 return link_changed; | 70 return link_changed; |
| 71 } | 71 } |
| 72 | 72 |
| 73 bool HandleTunnelMessage(const Buffer& buf) { | 73 bool HandleTunnelMessage(const Buffer& buf) { |
| 74 Buffer writable_buf = buf; | 74 Buffer writable_buf = buf; |
| 75 bool address_changed = false; | 75 bool address_changed = false; |
| 76 bool link_changed = false; | 76 bool link_changed = false; |
| 77 bool tunnel_changed = false; | 77 bool tunnel_changed = false; |
| 78 tracker_->HandleMessage(&writable_buf[0], buf.size(), | 78 tracker_->HandleMessage(&writable_buf[0], buf.size(), &address_changed, |
| 79 &address_changed, &link_changed, &tunnel_changed); | 79 &link_changed, &tunnel_changed); |
| 80 EXPECT_FALSE(address_changed); | 80 EXPECT_FALSE(address_changed); |
| 81 return tunnel_changed; | 81 return tunnel_changed; |
| 82 } | 82 } |
| 83 | 83 |
| 84 AddressTrackerLinux::AddressMap GetAddressMap() { | 84 AddressTrackerLinux::AddressMap GetAddressMap() { |
| 85 return tracker_->GetAddressMap(); | 85 return tracker_->GetAddressMap(); |
| 86 } | 86 } |
| 87 | 87 |
| 88 const base::hash_set<int> GetOnlineLinks() const { | 88 const base::hash_set<int> GetOnlineLinks() const { |
| 89 return tracker_->GetOnlineLinks(); | 89 return tracker_->GetOnlineLinks(); |
| 90 } | 90 } |
| 91 | 91 |
| 92 scoped_ptr<AddressTrackerLinux> tracker_; | 92 scoped_ptr<AddressTrackerLinux> tracker_; |
| 93 AddressTrackerLinux::GetInterfaceNameFunction original_get_interface_name_; | 93 AddressTrackerLinux::GetInterfaceNameFunction original_get_interface_name_; |
| 94 }; | 94 }; |
| 95 | 95 |
| 96 namespace { | 96 namespace { |
| 97 | 97 |
| 98 class NetlinkMessage { | 98 class NetlinkMessage { |
| 99 public: | 99 public: |
| 100 explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) { | 100 explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) { |
| 101 header()->nlmsg_type = type; | 101 header()->nlmsg_type = type; |
| 102 Align(); | 102 Align(); |
| 103 } | 103 } |
| 104 | 104 |
| 105 void AddPayload(const void* data, size_t length) { | 105 void AddPayload(const void* data, size_t length) { |
| 106 CHECK_EQ(static_cast<size_t>(NLMSG_HDRLEN), | 106 CHECK_EQ(static_cast<size_t>(NLMSG_HDRLEN), buffer_.size()) |
| 107 buffer_.size()) << "Payload must be added first"; | 107 << "Payload must be added first"; |
| 108 Append(data, length); | 108 Append(data, length); |
| 109 Align(); | 109 Align(); |
| 110 } | 110 } |
| 111 | 111 |
| 112 void AddAttribute(uint16 type, const void* data, size_t length) { | 112 void AddAttribute(uint16 type, const void* data, size_t length) { |
| 113 struct nlattr attr; | 113 struct nlattr attr; |
| 114 attr.nla_len = NLA_HDRLEN + length; | 114 attr.nla_len = NLA_HDRLEN + length; |
| 115 attr.nla_type = type; | 115 attr.nla_type = type; |
| 116 Append(&attr, sizeof(attr)); | 116 Append(&attr, sizeof(attr)); |
| 117 Align(); | 117 Align(); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 void MakeLinkMessage(uint16 type, uint32 flags, uint32 index, Buffer* output) { | 183 void MakeLinkMessage(uint16 type, uint32 flags, uint32 index, Buffer* output) { |
| 184 NetlinkMessage nlmsg(type); | 184 NetlinkMessage nlmsg(type); |
| 185 struct ifinfomsg msg = {}; | 185 struct ifinfomsg msg = {}; |
| 186 msg.ifi_index = index; | 186 msg.ifi_index = index; |
| 187 msg.ifi_flags = flags; | 187 msg.ifi_flags = flags; |
| 188 nlmsg.AddPayload(&msg, sizeof(msg)); | 188 nlmsg.AddPayload(&msg, sizeof(msg)); |
| 189 output->clear(); | 189 output->clear(); |
| 190 nlmsg.AppendTo(output); | 190 nlmsg.AppendTo(output); |
| 191 } | 191 } |
| 192 | 192 |
| 193 const unsigned char kAddress0[] = { 127, 0, 0, 1 }; | 193 const unsigned char kAddress0[] = {127, 0, 0, 1}; |
| 194 const unsigned char kAddress1[] = { 10, 0, 0, 1 }; | 194 const unsigned char kAddress1[] = {10, 0, 0, 1}; |
| 195 const unsigned char kAddress2[] = { 192, 168, 0, 1 }; | 195 const unsigned char kAddress2[] = {192, 168, 0, 1}; |
| 196 const unsigned char kAddress3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 196 const unsigned char kAddress3[] = |
| 197 0, 0, 0, 1 }; | 197 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; |
| 198 | 198 |
| 199 TEST_F(AddressTrackerLinuxTest, NewAddress) { | 199 TEST_F(AddressTrackerLinuxTest, NewAddress) { |
| 200 InitializeAddressTracker(true); | 200 InitializeAddressTracker(true); |
| 201 | 201 |
| 202 const IPAddressNumber kEmpty; | 202 const IPAddressNumber kEmpty; |
| 203 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 203 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 204 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); | 204 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); |
| 205 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); | 205 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); |
| 206 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); | 206 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); |
| 207 | 207 |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 EXPECT_EQ(1u, GetAddressMap().size()); | 399 EXPECT_EQ(1u, GetAddressMap().size()); |
| 400 } | 400 } |
| 401 | 401 |
| 402 TEST_F(AddressTrackerLinuxTest, AddInterface) { | 402 TEST_F(AddressTrackerLinuxTest, AddInterface) { |
| 403 InitializeAddressTracker(true); | 403 InitializeAddressTracker(true); |
| 404 | 404 |
| 405 Buffer buffer; | 405 Buffer buffer; |
| 406 | 406 |
| 407 // Ignores loopback. | 407 // Ignores loopback. |
| 408 MakeLinkMessage(RTM_NEWLINK, | 408 MakeLinkMessage(RTM_NEWLINK, |
| 409 IFF_LOOPBACK | IFF_UP | IFF_LOWER_UP | IFF_RUNNING, | 409 IFF_LOOPBACK | IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, |
| 410 0, &buffer); | 410 &buffer); |
| 411 EXPECT_FALSE(HandleLinkMessage(buffer)); | 411 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 412 EXPECT_TRUE(GetOnlineLinks().empty()); | 412 EXPECT_TRUE(GetOnlineLinks().empty()); |
| 413 | 413 |
| 414 // Ignores not IFF_LOWER_UP. | 414 // Ignores not IFF_LOWER_UP. |
| 415 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); | 415 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); |
| 416 EXPECT_FALSE(HandleLinkMessage(buffer)); | 416 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 417 EXPECT_TRUE(GetOnlineLinks().empty()); | 417 EXPECT_TRUE(GetOnlineLinks().empty()); |
| 418 | 418 |
| 419 // Ignores deletion. | 419 // Ignores deletion. |
| 420 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); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 EXPECT_TRUE(GetOnlineLinks().empty()); | 473 EXPECT_TRUE(GetOnlineLinks().empty()); |
| 474 } | 474 } |
| 475 | 475 |
| 476 TEST_F(AddressTrackerLinuxTest, TunnelInterface) { | 476 TEST_F(AddressTrackerLinuxTest, TunnelInterface) { |
| 477 InitializeAddressTracker(true); | 477 InitializeAddressTracker(true); |
| 478 | 478 |
| 479 Buffer buffer; | 479 Buffer buffer; |
| 480 | 480 |
| 481 // Ignores without "tun" prefixed name. | 481 // Ignores without "tun" prefixed name. |
| 482 MakeLinkMessage(RTM_NEWLINK, | 482 MakeLinkMessage(RTM_NEWLINK, |
| 483 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 483 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, 0, |
| 484 0, &buffer); | 484 &buffer); |
| 485 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 485 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 486 | 486 |
| 487 // Verify success. | 487 // Verify success. |
| 488 MakeLinkMessage(RTM_NEWLINK, | 488 MakeLinkMessage(RTM_NEWLINK, |
| 489 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 489 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 490 kTestInterfaceTun, &buffer); | 490 kTestInterfaceTun, &buffer); |
| 491 EXPECT_TRUE(HandleTunnelMessage(buffer)); | 491 EXPECT_TRUE(HandleTunnelMessage(buffer)); |
| 492 | 492 |
| 493 // Ignores redundant enables. | 493 // Ignores redundant enables. |
| 494 MakeLinkMessage(RTM_NEWLINK, | 494 MakeLinkMessage(RTM_NEWLINK, |
| 495 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 495 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 496 kTestInterfaceTun, &buffer); | 496 kTestInterfaceTun, &buffer); |
| 497 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 497 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 498 | 498 |
| 499 // Ignores deleting without "tun" prefixed name. | 499 // Ignores deleting without "tun" prefixed name. |
| 500 MakeLinkMessage(RTM_DELLINK, | 500 MakeLinkMessage(RTM_DELLINK, |
| 501 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 501 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, 0, |
| 502 0, &buffer); | 502 &buffer); |
| 503 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 503 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 504 | 504 |
| 505 // Verify successful deletion | 505 // Verify successful deletion |
| 506 MakeLinkMessage(RTM_DELLINK, | 506 MakeLinkMessage(RTM_DELLINK, |
| 507 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 507 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 508 kTestInterfaceTun, &buffer); | 508 kTestInterfaceTun, &buffer); |
| 509 EXPECT_TRUE(HandleTunnelMessage(buffer)); | 509 EXPECT_TRUE(HandleTunnelMessage(buffer)); |
| 510 | 510 |
| 511 // Ignores redundant deletions. | 511 // Ignores redundant deletions. |
| 512 MakeLinkMessage(RTM_DELLINK, | 512 MakeLinkMessage(RTM_DELLINK, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 524 EXPECT_NE((const char*)NULL, original_get_interface_name_(i)); | 524 EXPECT_NE((const char*)NULL, original_get_interface_name_(i)); |
| 525 } | 525 } |
| 526 | 526 |
| 527 TEST_F(AddressTrackerLinuxTest, NonTrackingMode) { | 527 TEST_F(AddressTrackerLinuxTest, NonTrackingMode) { |
| 528 InitializeAddressTracker(false); | 528 InitializeAddressTracker(false); |
| 529 | 529 |
| 530 const IPAddressNumber kEmpty; | 530 const IPAddressNumber kEmpty; |
| 531 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 531 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 532 | 532 |
| 533 Buffer buffer; | 533 Buffer buffer; |
| 534 MakeAddrMessage( | 534 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, |
| 535 RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); | 535 &buffer); |
| 536 EXPECT_TRUE(HandleAddressMessage(buffer)); | 536 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 537 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 537 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 538 EXPECT_EQ(1u, map.size()); | 538 EXPECT_EQ(1u, map.size()); |
| 539 EXPECT_EQ(1u, map.count(kAddr0)); | 539 EXPECT_EQ(1u, map.count(kAddr0)); |
| 540 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 540 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 541 | 541 |
| 542 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); | 542 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| 543 EXPECT_TRUE(HandleLinkMessage(buffer)); | 543 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 544 EXPECT_EQ(1u, GetOnlineLinks().count(0)); | 544 EXPECT_EQ(1u, GetOnlineLinks().count(0)); |
| 545 EXPECT_EQ(1u, GetOnlineLinks().size()); | 545 EXPECT_EQ(1u, GetOnlineLinks().size()); |
| 546 } | 546 } |
| 547 | 547 |
| 548 TEST_F(AddressTrackerLinuxTest, NonTrackingModeInit) { | 548 TEST_F(AddressTrackerLinuxTest, NonTrackingModeInit) { |
| 549 AddressTrackerLinux tracker; | 549 AddressTrackerLinux tracker; |
| 550 tracker.Init(); | 550 tracker.Init(); |
| 551 } | 551 } |
| 552 | 552 |
| 553 } // namespace | 553 } // namespace |
| 554 | 554 |
| 555 } // namespace internal | 555 } // namespace internal |
| 556 } // namespace net | 556 } // namespace net |
| OLD | NEW |