Home | History | Annotate | Download | only in base
      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
      3 // found in the LICENSE file.
      4 
      5 #include "base/memory/scoped_ptr.h"
      6 #include "net/base/address_tracker_linux.h"
      7 
      8 #include <linux/if.h>
      9 
     10 #include <vector>
     11 
     12 #include "base/bind.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 
     15 #ifndef IFA_F_HOMEADDRESS
     16 #define IFA_F_HOMEADDRESS 0x10
     17 #endif
     18 
     19 namespace net {
     20 namespace internal {
     21 namespace {
     22 
     23 const int kTestInterfaceTun = 123;
     24 
     25 const char* TestGetInterfaceName(int interface_index) {
     26   if (interface_index == kTestInterfaceTun)
     27     return "tun0";
     28   return "eth0";
     29 }
     30 
     31 }  // namespace
     32 
     33 typedef std::vector<char> Buffer;
     34 
     35 class AddressTrackerLinuxTest : public testing::Test {
     36  protected:
     37   AddressTrackerLinuxTest() {}
     38 
     39   void InitializeAddressTracker(bool tracking) {
     40     if (tracking) {
     41       tracker_.reset(new AddressTrackerLinux(base::Bind(&base::DoNothing),
     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;
     49   }
     50 
     51   bool HandleAddressMessage(const Buffer& buf) {
     52     Buffer writable_buf = buf;
     53     bool address_changed = false;
     54     bool link_changed = false;
     55     bool tunnel_changed = false;
     56     tracker_->HandleMessage(&writable_buf[0], buf.size(),
     57                            &address_changed, &link_changed, &tunnel_changed);
     58     EXPECT_FALSE(link_changed);
     59     return address_changed;
     60   }
     61 
     62   bool HandleLinkMessage(const Buffer& buf) {
     63     Buffer writable_buf = buf;
     64     bool address_changed = false;
     65     bool link_changed = false;
     66     bool tunnel_changed = false;
     67     tracker_->HandleMessage(&writable_buf[0], buf.size(),
     68                            &address_changed, &link_changed, &tunnel_changed);
     69     EXPECT_FALSE(address_changed);
     70     return link_changed;
     71   }
     72 
     73   bool HandleTunnelMessage(const Buffer& buf) {
     74     Buffer writable_buf = buf;
     75     bool address_changed = false;
     76     bool link_changed = false;
     77     bool tunnel_changed = false;
     78     tracker_->HandleMessage(&writable_buf[0], buf.size(),
     79                            &address_changed, &link_changed, &tunnel_changed);
     80     EXPECT_FALSE(address_changed);
     81     return tunnel_changed;
     82   }
     83 
     84   AddressTrackerLinux::AddressMap GetAddressMap() {
     85     return tracker_->GetAddressMap();
     86   }
     87 
     88   const base::hash_set<int> GetOnlineLinks() const {
     89     return tracker_->GetOnlineLinks();
     90   }
     91 
     92   scoped_ptr<AddressTrackerLinux> tracker_;
     93   AddressTrackerLinux::GetInterfaceNameFunction original_get_interface_name_;
     94 };
     95 
     96 namespace {
     97 
     98 class NetlinkMessage {
     99  public:
    100   explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) {
    101     header()->nlmsg_type = type;
    102     Align();
    103   }
    104 
    105   void AddPayload(const void* data, size_t length) {
    106     CHECK_EQ(static_cast<size_t>(NLMSG_HDRLEN),
    107              buffer_.size()) << "Payload must be added first";
    108     Append(data, length);
    109     Align();
    110   }
    111 
    112   void AddAttribute(uint16 type, const void* data, size_t length) {
    113     struct nlattr attr;
    114     attr.nla_len = NLA_HDRLEN + length;
    115     attr.nla_type = type;
    116     Append(&attr, sizeof(attr));
    117     Align();
    118     Append(data, length);
    119     Align();
    120   }
    121 
    122   void AppendTo(Buffer* output) const {
    123     CHECK_EQ(NLMSG_ALIGN(output->size()), output->size());
    124     output->reserve(output->size() + NLMSG_LENGTH(buffer_.size()));
    125     output->insert(output->end(), buffer_.begin(), buffer_.end());
    126   }
    127 
    128  private:
    129   void Append(const void* data, size_t length) {
    130     const char* chardata = reinterpret_cast<const char*>(data);
    131     buffer_.insert(buffer_.end(), chardata, chardata + length);
    132   }
    133 
    134   void Align() {
    135     header()->nlmsg_len = buffer_.size();
    136     buffer_.insert(buffer_.end(), NLMSG_ALIGN(buffer_.size()) - buffer_.size(),
    137                    0);
    138     CHECK(NLMSG_OK(header(), buffer_.size()));
    139   }
    140 
    141   struct nlmsghdr* header() {
    142     return reinterpret_cast<struct nlmsghdr*>(&buffer_[0]);
    143   }
    144 
    145   Buffer buffer_;
    146 };
    147 
    148 #define INFINITY_LIFE_TIME 0xFFFFFFFF
    149 
    150 void MakeAddrMessageWithCacheInfo(uint16 type,
    151                                   uint8 flags,
    152                                   uint8 family,
    153                                   const IPAddressNumber& address,
    154                                   const IPAddressNumber& local,
    155                                   uint32 preferred_lifetime,
    156                                   Buffer* output) {
    157   NetlinkMessage nlmsg(type);
    158   struct ifaddrmsg msg = {};
    159   msg.ifa_family = family;
    160   msg.ifa_flags = flags;
    161   nlmsg.AddPayload(&msg, sizeof(msg));
    162   if (address.size())
    163     nlmsg.AddAttribute(IFA_ADDRESS, &address[0], address.size());
    164   if (local.size())
    165     nlmsg.AddAttribute(IFA_LOCAL, &local[0], local.size());
    166   struct ifa_cacheinfo cache_info = {};
    167   cache_info.ifa_prefered = preferred_lifetime;
    168   cache_info.ifa_valid = INFINITY_LIFE_TIME;
    169   nlmsg.AddAttribute(IFA_CACHEINFO, &cache_info, sizeof(cache_info));
    170   nlmsg.AppendTo(output);
    171 }
    172 
    173 void MakeAddrMessage(uint16 type,
    174                      uint8 flags,
    175                      uint8 family,
    176                      const IPAddressNumber& address,
    177                      const IPAddressNumber& local,
    178                      Buffer* output) {
    179   MakeAddrMessageWithCacheInfo(type, flags, family, address, local,
    180                                INFINITY_LIFE_TIME, output);
    181 }
    182 
    183 void MakeLinkMessage(uint16 type, uint32 flags, uint32 index, Buffer* output) {
    184   NetlinkMessage nlmsg(type);
    185   struct ifinfomsg msg = {};
    186   msg.ifi_index = index;
    187   msg.ifi_flags = flags;
    188   nlmsg.AddPayload(&msg, sizeof(msg));
    189   output->clear();
    190   nlmsg.AppendTo(output);
    191 }
    192 
    193 const unsigned char kAddress0[] = { 127, 0, 0, 1 };
    194 const unsigned char kAddress1[] = { 10, 0, 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,
    197                                     0, 0, 0, 1 };
    198 
    199 TEST_F(AddressTrackerLinuxTest, NewAddress) {
    200   InitializeAddressTracker(true);
    201 
    202   const IPAddressNumber kEmpty;
    203   const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0));
    204   const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1));
    205   const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2));
    206   const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3));
    207 
    208   Buffer buffer;
    209   MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty,
    210                   &buffer);
    211   EXPECT_TRUE(HandleAddressMessage(buffer));
    212   AddressTrackerLinux::AddressMap map = GetAddressMap();
    213   EXPECT_EQ(1u, map.size());
    214   EXPECT_EQ(1u, map.count(kAddr0));
    215   EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags);
    216 
    217   buffer.clear();
    218   MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr1, kAddr2,
    219                   &buffer);
    220   EXPECT_TRUE(HandleAddressMessage(buffer));
    221   map = GetAddressMap();
    222   EXPECT_EQ(2u, map.size());
    223   EXPECT_EQ(1u, map.count(kAddr0));
    224   EXPECT_EQ(1u, map.count(kAddr2));
    225   EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr2].ifa_flags);
    226 
    227   buffer.clear();
    228   MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer);
    229   EXPECT_TRUE(HandleAddressMessage(buffer));
    230   map = GetAddressMap();
    231   EXPECT_EQ(3u, map.size());
    232   EXPECT_EQ(1u, map.count(kAddr3));
    233 }
    234 
    235 TEST_F(AddressTrackerLinuxTest, NewAddressChange) {
    236   InitializeAddressTracker(true);
    237 
    238   const IPAddressNumber kEmpty;
    239   const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0));
    240 
    241   Buffer buffer;
    242   MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty,
    243                   &buffer);
    244   EXPECT_TRUE(HandleAddressMessage(buffer));
    245   AddressTrackerLinux::AddressMap map = GetAddressMap();
    246   EXPECT_EQ(1u, map.size());
    247   EXPECT_EQ(1u, map.count(kAddr0));
    248   EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags);
    249 
    250   buffer.clear();
    251   MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty,
    252                   &buffer);
    253   EXPECT_TRUE(HandleAddressMessage(buffer));
    254   map = GetAddressMap();
    255   EXPECT_EQ(1u, map.size());
    256   EXPECT_EQ(1u, map.count(kAddr0));
    257   EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags);
    258 
    259   // Both messages in one buffer.
    260   buffer.clear();
    261   MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty,
    262                   &buffer);
    263   MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty,
    264                   &buffer);
    265   EXPECT_TRUE(HandleAddressMessage(buffer));
    266   map = GetAddressMap();
    267   EXPECT_EQ(1u, map.size());
    268   EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags);
    269 }
    270 
    271 TEST_F(AddressTrackerLinuxTest, NewAddressDuplicate) {
    272   InitializeAddressTracker(true);
    273 
    274   const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0));
    275 
    276   Buffer buffer;
    277   MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kAddr0,
    278                   &buffer);
    279   EXPECT_TRUE(HandleAddressMessage(buffer));
    280   AddressTrackerLinux::AddressMap map = GetAddressMap();
    281   EXPECT_EQ(1u, map.size());
    282   EXPECT_EQ(1u, map.count(kAddr0));
    283   EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags);
    284 
    285   EXPECT_FALSE(HandleAddressMessage(buffer));
    286   map = GetAddressMap();
    287   EXPECT_EQ(1u, map.size());
    288   EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags);
    289 }
    290 
    291 TEST_F(AddressTrackerLinuxTest, DeleteAddress) {
    292   InitializeAddressTracker(true);
    293 
    294   const IPAddressNumber kEmpty;
    295   const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0));
    296   const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1));
    297   const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2));
    298 
    299   Buffer buffer;
    300   MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kAddr0, kEmpty, &buffer);
    301   MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kAddr1, kAddr2, &buffer);
    302   EXPECT_TRUE(HandleAddressMessage(buffer));
    303   AddressTrackerLinux::AddressMap map = GetAddressMap();
    304   EXPECT_EQ(2u, map.size());
    305 
    306   buffer.clear();
    307   MakeAddrMessage(RTM_DELADDR, 0, AF_INET, kEmpty, kAddr0, &buffer);
    308   EXPECT_TRUE(HandleAddressMessage(buffer));
    309   map = GetAddressMap();
    310   EXPECT_EQ(1u, map.size());
    311   EXPECT_EQ(0u, map.count(kAddr0));
    312   EXPECT_EQ(1u, map.count(kAddr2));
    313 
    314   buffer.clear();
    315   MakeAddrMessage(RTM_DELADDR, 0, AF_INET, kAddr2, kAddr1, &buffer);
    316   // kAddr1 does not exist in the map.
    317   EXPECT_FALSE(HandleAddressMessage(buffer));
    318   map = GetAddressMap();
    319   EXPECT_EQ(1u, map.size());
    320 
    321   buffer.clear();
    322   MakeAddrMessage(RTM_DELADDR, 0, AF_INET, kAddr2, kEmpty, &buffer);
    323   EXPECT_TRUE(HandleAddressMessage(buffer));
    324   map = GetAddressMap();
    325   EXPECT_EQ(0u, map.size());
    326 }
    327 
    328 TEST_F(AddressTrackerLinuxTest, DeprecatedLifetime) {
    329   InitializeAddressTracker(true);
    330 
    331   const IPAddressNumber kEmpty;
    332   const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3));
    333 
    334   Buffer buffer;
    335   MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer);
    336   EXPECT_TRUE(HandleAddressMessage(buffer));
    337   AddressTrackerLinux::AddressMap map = GetAddressMap();
    338   EXPECT_EQ(1u, map.size());
    339   EXPECT_EQ(1u, map.count(kAddr3));
    340   EXPECT_EQ(0, map[kAddr3].ifa_flags);
    341 
    342   // Verify 0 preferred lifetime implies deprecated.
    343   buffer.clear();
    344   MakeAddrMessageWithCacheInfo(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, 0,
    345                                &buffer);
    346   EXPECT_TRUE(HandleAddressMessage(buffer));
    347   map = GetAddressMap();
    348   EXPECT_EQ(1u, map.size());
    349   EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags);
    350 
    351   // Verify properly flagged message doesn't imply change.
    352   buffer.clear();
    353   MakeAddrMessageWithCacheInfo(RTM_NEWADDR, IFA_F_DEPRECATED, AF_INET6, kEmpty,
    354                                kAddr3, 0, &buffer);
    355   EXPECT_FALSE(HandleAddressMessage(buffer));
    356   map = GetAddressMap();
    357   EXPECT_EQ(1u, map.size());
    358   EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags);
    359 
    360   // Verify implied deprecated doesn't imply change.
    361   buffer.clear();
    362   MakeAddrMessageWithCacheInfo(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, 0,
    363                                &buffer);
    364   EXPECT_FALSE(HandleAddressMessage(buffer));
    365   map = GetAddressMap();
    366   EXPECT_EQ(1u, map.size());
    367   EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags);
    368 }
    369 
    370 TEST_F(AddressTrackerLinuxTest, IgnoredMessage) {
    371   InitializeAddressTracker(true);
    372 
    373   const IPAddressNumber kEmpty;
    374   const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0));
    375   const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3));
    376 
    377   Buffer buffer;
    378   // Ignored family.
    379   MakeAddrMessage(RTM_NEWADDR, 0, AF_UNSPEC, kAddr3, kAddr0, &buffer);
    380   // No address.
    381   MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kEmpty, kEmpty, &buffer);
    382   // Ignored type.
    383   MakeAddrMessage(RTM_DELROUTE, 0, AF_INET6, kAddr3, kEmpty, &buffer);
    384   EXPECT_FALSE(HandleAddressMessage(buffer));
    385   EXPECT_TRUE(GetAddressMap().empty());
    386 
    387   // Valid message after ignored messages.
    388   NetlinkMessage nlmsg(RTM_NEWADDR);
    389   struct ifaddrmsg msg = {};
    390   msg.ifa_family = AF_INET;
    391   nlmsg.AddPayload(&msg, sizeof(msg));
    392   // Ignored attribute.
    393   struct ifa_cacheinfo cache_info = {};
    394   nlmsg.AddAttribute(IFA_CACHEINFO, &cache_info, sizeof(cache_info));
    395   nlmsg.AddAttribute(IFA_ADDRESS, &kAddr0[0], kAddr0.size());
    396   nlmsg.AppendTo(&buffer);
    397 
    398   EXPECT_TRUE(HandleAddressMessage(buffer));
    399   EXPECT_EQ(1u, GetAddressMap().size());
    400 }
    401 
    402 TEST_F(AddressTrackerLinuxTest, AddInterface) {
    403   InitializeAddressTracker(true);
    404 
    405   Buffer buffer;
    406 
    407   // Ignores loopback.
    408   MakeLinkMessage(RTM_NEWLINK,
    409                   IFF_LOOPBACK | IFF_UP | IFF_LOWER_UP | IFF_RUNNING,
    410                   0, &buffer);
    411   EXPECT_FALSE(HandleLinkMessage(buffer));
    412   EXPECT_TRUE(GetOnlineLinks().empty());
    413 
    414   // Ignores not IFF_LOWER_UP.
    415   MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer);
    416   EXPECT_FALSE(HandleLinkMessage(buffer));
    417   EXPECT_TRUE(GetOnlineLinks().empty());
    418 
    419   // Ignores deletion.
    420   MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer);
    421   EXPECT_FALSE(HandleLinkMessage(buffer));
    422   EXPECT_TRUE(GetOnlineLinks().empty());
    423 
    424   // Verify success.
    425   MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer);
    426   EXPECT_TRUE(HandleLinkMessage(buffer));
    427   EXPECT_EQ(1u, GetOnlineLinks().count(0));
    428   EXPECT_EQ(1u, GetOnlineLinks().size());
    429 
    430   // Ignores redundant enables.
    431   MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer);
    432   EXPECT_FALSE(HandleLinkMessage(buffer));
    433   EXPECT_EQ(1u, GetOnlineLinks().count(0));
    434   EXPECT_EQ(1u, GetOnlineLinks().size());
    435 
    436   // Verify adding another online device (e.g. VPN) is considered a change.
    437   MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 1, &buffer);
    438   EXPECT_TRUE(HandleLinkMessage(buffer));
    439   EXPECT_EQ(1u, GetOnlineLinks().count(0));
    440   EXPECT_EQ(1u, GetOnlineLinks().count(1));
    441   EXPECT_EQ(2u, GetOnlineLinks().size());
    442 }
    443 
    444 TEST_F(AddressTrackerLinuxTest, RemoveInterface) {
    445   InitializeAddressTracker(true);
    446 
    447   Buffer buffer;
    448 
    449   // Should disappear when not IFF_LOWER_UP.
    450   MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer);
    451   EXPECT_TRUE(HandleLinkMessage(buffer));
    452   EXPECT_FALSE(GetOnlineLinks().empty());
    453   MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer);
    454   EXPECT_TRUE(HandleLinkMessage(buffer));
    455   EXPECT_TRUE(GetOnlineLinks().empty());
    456 
    457   // Ignores redundant disables.
    458   MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer);
    459   EXPECT_FALSE(HandleLinkMessage(buffer));
    460   EXPECT_TRUE(GetOnlineLinks().empty());
    461 
    462   // Ignores deleting down interfaces.
    463   MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_RUNNING, 0, &buffer);
    464   EXPECT_FALSE(HandleLinkMessage(buffer));
    465   EXPECT_TRUE(GetOnlineLinks().empty());
    466 
    467   // Should disappear when deleted.
    468   MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer);
    469   EXPECT_TRUE(HandleLinkMessage(buffer));
    470   EXPECT_FALSE(GetOnlineLinks().empty());
    471   MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer);
    472   EXPECT_TRUE(HandleLinkMessage(buffer));
    473   EXPECT_TRUE(GetOnlineLinks().empty());
    474 }
    475 
    476 TEST_F(AddressTrackerLinuxTest, TunnelInterface) {
    477   InitializeAddressTracker(true);
    478 
    479   Buffer buffer;
    480 
    481   // Ignores without "tun" prefixed name.
    482   MakeLinkMessage(RTM_NEWLINK,
    483                   IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT,
    484                   0, &buffer);
    485   EXPECT_FALSE(HandleTunnelMessage(buffer));
    486 
    487   // Verify success.
    488   MakeLinkMessage(RTM_NEWLINK,
    489                   IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT,
    490                   kTestInterfaceTun, &buffer);
    491   EXPECT_TRUE(HandleTunnelMessage(buffer));
    492 
    493   // Ignores redundant enables.
    494   MakeLinkMessage(RTM_NEWLINK,
    495                   IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT,
    496                   kTestInterfaceTun, &buffer);
    497   EXPECT_FALSE(HandleTunnelMessage(buffer));
    498 
    499   // Ignores deleting without "tun" prefixed name.
    500   MakeLinkMessage(RTM_DELLINK,
    501                   IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT,
    502                   0, &buffer);
    503   EXPECT_FALSE(HandleTunnelMessage(buffer));
    504 
    505   // Verify successful deletion
    506   MakeLinkMessage(RTM_DELLINK,
    507                   IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT,
    508                   kTestInterfaceTun, &buffer);
    509   EXPECT_TRUE(HandleTunnelMessage(buffer));
    510 
    511   // Ignores redundant deletions.
    512   MakeLinkMessage(RTM_DELLINK,
    513                   IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT,
    514                   kTestInterfaceTun, &buffer);
    515   EXPECT_FALSE(HandleTunnelMessage(buffer));
    516 }
    517 
    518 // Check AddressTrackerLinux::get_interface_name_ original implementation
    519 // doesn't crash or return NULL.
    520 TEST_F(AddressTrackerLinuxTest, GetInterfaceName) {
    521   InitializeAddressTracker(true);
    522 
    523   for (int i = 0; i < 10; i++)
    524     EXPECT_NE((const char*)NULL, original_get_interface_name_(i));
    525 }
    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 
    553 }  // namespace
    554 
    555 }  // namespace internal
    556 }  // namespace net
    557