| 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/base/address_tracker_linux.h" | 5 #include "net/base/address_tracker_linux.h" |
| 6 | 6 |
| 7 #include <linux/if.h> | 7 #include <linux/if.h> |
| 8 | 8 |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 base::Bind(&base::DoNothing)), | 39 base::Bind(&base::DoNothing)), |
| 40 original_get_interface_name_(tracker_.get_interface_name_) { | 40 original_get_interface_name_(tracker_.get_interface_name_) { |
| 41 tracker_.get_interface_name_ = TestGetInterfaceName; | 41 tracker_.get_interface_name_ = TestGetInterfaceName; |
| 42 } | 42 } |
| 43 | 43 |
| 44 bool HandleAddressMessage(const Buffer& buf) { | 44 bool HandleAddressMessage(const Buffer& buf) { |
| 45 Buffer writable_buf = buf; | 45 Buffer writable_buf = buf; |
| 46 bool address_changed = false; | 46 bool address_changed = false; |
| 47 bool link_changed = false; | 47 bool link_changed = false; |
| 48 bool tunnel_changed = false; | 48 bool tunnel_changed = false; |
| 49 tracker_.HandleMessage(&writable_buf[0], buf.size(), | 49 tracker_.HandleMessage(&writable_buf[0], |
| 50 &address_changed, &link_changed, &tunnel_changed); | 50 buf.size(), |
| 51 &address_changed, |
| 52 &link_changed, |
| 53 &tunnel_changed); |
| 51 EXPECT_FALSE(link_changed); | 54 EXPECT_FALSE(link_changed); |
| 52 return address_changed; | 55 return address_changed; |
| 53 } | 56 } |
| 54 | 57 |
| 55 bool HandleLinkMessage(const Buffer& buf) { | 58 bool HandleLinkMessage(const Buffer& buf) { |
| 56 Buffer writable_buf = buf; | 59 Buffer writable_buf = buf; |
| 57 bool address_changed = false; | 60 bool address_changed = false; |
| 58 bool link_changed = false; | 61 bool link_changed = false; |
| 59 bool tunnel_changed = false; | 62 bool tunnel_changed = false; |
| 60 tracker_.HandleMessage(&writable_buf[0], buf.size(), | 63 tracker_.HandleMessage(&writable_buf[0], |
| 61 &address_changed, &link_changed, &tunnel_changed); | 64 buf.size(), |
| 65 &address_changed, |
| 66 &link_changed, |
| 67 &tunnel_changed); |
| 62 EXPECT_FALSE(address_changed); | 68 EXPECT_FALSE(address_changed); |
| 63 return link_changed; | 69 return link_changed; |
| 64 } | 70 } |
| 65 | 71 |
| 66 bool HandleTunnelMessage(const Buffer& buf) { | 72 bool HandleTunnelMessage(const Buffer& buf) { |
| 67 Buffer writable_buf = buf; | 73 Buffer writable_buf = buf; |
| 68 bool address_changed = false; | 74 bool address_changed = false; |
| 69 bool link_changed = false; | 75 bool link_changed = false; |
| 70 bool tunnel_changed = false; | 76 bool tunnel_changed = false; |
| 71 tracker_.HandleMessage(&writable_buf[0], buf.size(), | 77 tracker_.HandleMessage(&writable_buf[0], |
| 72 &address_changed, &link_changed, &tunnel_changed); | 78 buf.size(), |
| 79 &address_changed, |
| 80 &link_changed, |
| 81 &tunnel_changed); |
| 73 EXPECT_FALSE(address_changed); | 82 EXPECT_FALSE(address_changed); |
| 74 return tunnel_changed; | 83 return tunnel_changed; |
| 75 } | 84 } |
| 76 | 85 |
| 77 AddressTrackerLinux::AddressMap GetAddressMap() { | 86 AddressTrackerLinux::AddressMap GetAddressMap() { |
| 78 return tracker_.GetAddressMap(); | 87 return tracker_.GetAddressMap(); |
| 79 } | 88 } |
| 80 | 89 |
| 81 const base::hash_set<int>* GetOnlineLinks() const { | 90 const base::hash_set<int>* GetOnlineLinks() const { |
| 82 return &tracker_.online_links_; | 91 return &tracker_.online_links_; |
| 83 } | 92 } |
| 84 | 93 |
| 85 AddressTrackerLinux tracker_; | 94 AddressTrackerLinux tracker_; |
| 86 AddressTrackerLinux::GetInterfaceNameFunction original_get_interface_name_; | 95 AddressTrackerLinux::GetInterfaceNameFunction original_get_interface_name_; |
| 87 }; | 96 }; |
| 88 | 97 |
| 89 namespace { | 98 namespace { |
| 90 | 99 |
| 91 class NetlinkMessage { | 100 class NetlinkMessage { |
| 92 public: | 101 public: |
| 93 explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) { | 102 explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) { |
| 94 header()->nlmsg_type = type; | 103 header()->nlmsg_type = type; |
| 95 Align(); | 104 Align(); |
| 96 } | 105 } |
| 97 | 106 |
| 98 void AddPayload(const void* data, size_t length) { | 107 void AddPayload(const void* data, size_t length) { |
| 99 CHECK_EQ(static_cast<size_t>(NLMSG_HDRLEN), | 108 CHECK_EQ(static_cast<size_t>(NLMSG_HDRLEN), buffer_.size()) |
| 100 buffer_.size()) << "Payload must be added first"; | 109 << "Payload must be added first"; |
| 101 Append(data, length); | 110 Append(data, length); |
| 102 Align(); | 111 Align(); |
| 103 } | 112 } |
| 104 | 113 |
| 105 void AddAttribute(uint16 type, const void* data, size_t length) { | 114 void AddAttribute(uint16 type, const void* data, size_t length) { |
| 106 struct nlattr attr; | 115 struct nlattr attr; |
| 107 attr.nla_len = NLA_HDRLEN + length; | 116 attr.nla_len = NLA_HDRLEN + length; |
| 108 attr.nla_type = type; | 117 attr.nla_type = type; |
| 109 Append(&attr, sizeof(attr)); | 118 Append(&attr, sizeof(attr)); |
| 110 Align(); | 119 Align(); |
| 111 Append(data, length); | 120 Append(data, length); |
| 112 Align(); | 121 Align(); |
| 113 } | 122 } |
| 114 | 123 |
| 115 void AppendTo(Buffer* output) const { | 124 void AppendTo(Buffer* output) const { |
| 116 CHECK_EQ(NLMSG_ALIGN(output->size()), output->size()); | 125 CHECK_EQ(NLMSG_ALIGN(output->size()), output->size()); |
| 117 output->reserve(output->size() + NLMSG_LENGTH(buffer_.size())); | 126 output->reserve(output->size() + NLMSG_LENGTH(buffer_.size())); |
| 118 output->insert(output->end(), buffer_.begin(), buffer_.end()); | 127 output->insert(output->end(), buffer_.begin(), buffer_.end()); |
| 119 } | 128 } |
| 120 | 129 |
| 121 private: | 130 private: |
| 122 void Append(const void* data, size_t length) { | 131 void Append(const void* data, size_t length) { |
| 123 const char* chardata = reinterpret_cast<const char*>(data); | 132 const char* chardata = reinterpret_cast<const char*>(data); |
| 124 buffer_.insert(buffer_.end(), chardata, chardata + length); | 133 buffer_.insert(buffer_.end(), chardata, chardata + length); |
| 125 } | 134 } |
| 126 | 135 |
| 127 void Align() { | 136 void Align() { |
| 128 header()->nlmsg_len = buffer_.size(); | 137 header()->nlmsg_len = buffer_.size(); |
| 129 buffer_.insert(buffer_.end(), NLMSG_ALIGN(buffer_.size()) - buffer_.size(), | 138 buffer_.insert( |
| 130 0); | 139 buffer_.end(), NLMSG_ALIGN(buffer_.size()) - buffer_.size(), 0); |
| 131 CHECK(NLMSG_OK(header(), buffer_.size())); | 140 CHECK(NLMSG_OK(header(), buffer_.size())); |
| 132 } | 141 } |
| 133 | 142 |
| 134 struct nlmsghdr* header() { | 143 struct nlmsghdr* header() { |
| 135 return reinterpret_cast<struct nlmsghdr*>(&buffer_[0]); | 144 return reinterpret_cast<struct nlmsghdr*>(&buffer_[0]); |
| 136 } | 145 } |
| 137 | 146 |
| 138 Buffer buffer_; | 147 Buffer buffer_; |
| 139 }; | 148 }; |
| 140 | 149 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 162 nlmsg.AddAttribute(IFA_CACHEINFO, &cache_info, sizeof(cache_info)); | 171 nlmsg.AddAttribute(IFA_CACHEINFO, &cache_info, sizeof(cache_info)); |
| 163 nlmsg.AppendTo(output); | 172 nlmsg.AppendTo(output); |
| 164 } | 173 } |
| 165 | 174 |
| 166 void MakeAddrMessage(uint16 type, | 175 void MakeAddrMessage(uint16 type, |
| 167 uint8 flags, | 176 uint8 flags, |
| 168 uint8 family, | 177 uint8 family, |
| 169 const IPAddressNumber& address, | 178 const IPAddressNumber& address, |
| 170 const IPAddressNumber& local, | 179 const IPAddressNumber& local, |
| 171 Buffer* output) { | 180 Buffer* output) { |
| 172 MakeAddrMessageWithCacheInfo(type, flags, family, address, local, | 181 MakeAddrMessageWithCacheInfo( |
| 173 INFINITY_LIFE_TIME, output); | 182 type, flags, family, address, local, INFINITY_LIFE_TIME, output); |
| 174 } | 183 } |
| 175 | 184 |
| 176 void MakeLinkMessage(uint16 type, uint32 flags, uint32 index, Buffer* output) { | 185 void MakeLinkMessage(uint16 type, uint32 flags, uint32 index, Buffer* output) { |
| 177 NetlinkMessage nlmsg(type); | 186 NetlinkMessage nlmsg(type); |
| 178 struct ifinfomsg msg = {}; | 187 struct ifinfomsg msg = {}; |
| 179 msg.ifi_index = index; | 188 msg.ifi_index = index; |
| 180 msg.ifi_flags = flags; | 189 msg.ifi_flags = flags; |
| 181 nlmsg.AddPayload(&msg, sizeof(msg)); | 190 nlmsg.AddPayload(&msg, sizeof(msg)); |
| 182 output->clear(); | 191 output->clear(); |
| 183 nlmsg.AppendTo(output); | 192 nlmsg.AppendTo(output); |
| 184 } | 193 } |
| 185 | 194 |
| 186 const unsigned char kAddress0[] = { 127, 0, 0, 1 }; | 195 const unsigned char kAddress0[] = {127, 0, 0, 1}; |
| 187 const unsigned char kAddress1[] = { 10, 0, 0, 1 }; | 196 const unsigned char kAddress1[] = {10, 0, 0, 1}; |
| 188 const unsigned char kAddress2[] = { 192, 168, 0, 1 }; | 197 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, | 198 const unsigned char kAddress3[] = {0, 0, 0, 0, 0, 0, 0, 0, |
| 190 0, 0, 0, 1 }; | 199 0, 0, 0, 0, 0, 0, 0, 1}; |
| 191 | 200 |
| 192 TEST_F(AddressTrackerLinuxTest, NewAddress) { | 201 TEST_F(AddressTrackerLinuxTest, NewAddress) { |
| 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( |
| 201 &buffer); | 210 RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); |
| 202 EXPECT_TRUE(HandleAddressMessage(buffer)); | 211 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 203 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 212 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 204 EXPECT_EQ(1u, map.size()); | 213 EXPECT_EQ(1u, map.size()); |
| 205 EXPECT_EQ(1u, map.count(kAddr0)); | 214 EXPECT_EQ(1u, map.count(kAddr0)); |
| 206 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 215 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 207 | 216 |
| 208 buffer.clear(); | 217 buffer.clear(); |
| 209 MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr1, kAddr2, | 218 MakeAddrMessage( |
| 210 &buffer); | 219 RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr1, kAddr2, &buffer); |
| 211 EXPECT_TRUE(HandleAddressMessage(buffer)); | 220 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 212 map = GetAddressMap(); | 221 map = GetAddressMap(); |
| 213 EXPECT_EQ(2u, map.size()); | 222 EXPECT_EQ(2u, map.size()); |
| 214 EXPECT_EQ(1u, map.count(kAddr0)); | 223 EXPECT_EQ(1u, map.count(kAddr0)); |
| 215 EXPECT_EQ(1u, map.count(kAddr2)); | 224 EXPECT_EQ(1u, map.count(kAddr2)); |
| 216 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr2].ifa_flags); | 225 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr2].ifa_flags); |
| 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) { |
| 227 const IPAddressNumber kEmpty; | 236 const IPAddressNumber kEmpty; |
| 228 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 237 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 229 | 238 |
| 230 Buffer buffer; | 239 Buffer buffer; |
| 231 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, | 240 MakeAddrMessage( |
| 232 &buffer); | 241 RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); |
| 233 EXPECT_TRUE(HandleAddressMessage(buffer)); | 242 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 234 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 243 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 235 EXPECT_EQ(1u, map.size()); | 244 EXPECT_EQ(1u, map.size()); |
| 236 EXPECT_EQ(1u, map.count(kAddr0)); | 245 EXPECT_EQ(1u, map.count(kAddr0)); |
| 237 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 246 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 238 | 247 |
| 239 buffer.clear(); | 248 buffer.clear(); |
| 240 MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, | 249 MakeAddrMessage( |
| 241 &buffer); | 250 RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, &buffer); |
| 242 EXPECT_TRUE(HandleAddressMessage(buffer)); | 251 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 243 map = GetAddressMap(); | 252 map = GetAddressMap(); |
| 244 EXPECT_EQ(1u, map.size()); | 253 EXPECT_EQ(1u, map.size()); |
| 245 EXPECT_EQ(1u, map.count(kAddr0)); | 254 EXPECT_EQ(1u, map.count(kAddr0)); |
| 246 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); | 255 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); |
| 247 | 256 |
| 248 // Both messages in one buffer. | 257 // Both messages in one buffer. |
| 249 buffer.clear(); | 258 buffer.clear(); |
| 250 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, | 259 MakeAddrMessage( |
| 251 &buffer); | 260 RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); |
| 252 MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, | 261 MakeAddrMessage( |
| 253 &buffer); | 262 RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, &buffer); |
| 254 EXPECT_TRUE(HandleAddressMessage(buffer)); | 263 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 255 map = GetAddressMap(); | 264 map = GetAddressMap(); |
| 256 EXPECT_EQ(1u, map.size()); | 265 EXPECT_EQ(1u, map.size()); |
| 257 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); | 266 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); |
| 258 } | 267 } |
| 259 | 268 |
| 260 TEST_F(AddressTrackerLinuxTest, NewAddressDuplicate) { | 269 TEST_F(AddressTrackerLinuxTest, NewAddressDuplicate) { |
| 261 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 270 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 262 | 271 |
| 263 Buffer buffer; | 272 Buffer buffer; |
| 264 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kAddr0, | 273 MakeAddrMessage( |
| 265 &buffer); | 274 RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kAddr0, &buffer); |
| 266 EXPECT_TRUE(HandleAddressMessage(buffer)); | 275 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 267 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 276 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 268 EXPECT_EQ(1u, map.size()); | 277 EXPECT_EQ(1u, map.size()); |
| 269 EXPECT_EQ(1u, map.count(kAddr0)); | 278 EXPECT_EQ(1u, map.count(kAddr0)); |
| 270 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 279 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 271 | 280 |
| 272 EXPECT_FALSE(HandleAddressMessage(buffer)); | 281 EXPECT_FALSE(HandleAddressMessage(buffer)); |
| 273 map = GetAddressMap(); | 282 map = GetAddressMap(); |
| 274 EXPECT_EQ(1u, map.size()); | 283 EXPECT_EQ(1u, map.size()); |
| 275 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 284 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 Buffer buffer; | 326 Buffer buffer; |
| 318 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); | 327 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); |
| 319 EXPECT_TRUE(HandleAddressMessage(buffer)); | 328 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 320 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 329 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 321 EXPECT_EQ(1u, map.size()); | 330 EXPECT_EQ(1u, map.size()); |
| 322 EXPECT_EQ(1u, map.count(kAddr3)); | 331 EXPECT_EQ(1u, map.count(kAddr3)); |
| 323 EXPECT_EQ(0, map[kAddr3].ifa_flags); | 332 EXPECT_EQ(0, map[kAddr3].ifa_flags); |
| 324 | 333 |
| 325 // Verify 0 preferred lifetime implies deprecated. | 334 // Verify 0 preferred lifetime implies deprecated. |
| 326 buffer.clear(); | 335 buffer.clear(); |
| 327 MakeAddrMessageWithCacheInfo(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, 0, | 336 MakeAddrMessageWithCacheInfo( |
| 328 &buffer); | 337 RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, 0, &buffer); |
| 329 EXPECT_TRUE(HandleAddressMessage(buffer)); | 338 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 330 map = GetAddressMap(); | 339 map = GetAddressMap(); |
| 331 EXPECT_EQ(1u, map.size()); | 340 EXPECT_EQ(1u, map.size()); |
| 332 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); | 341 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); |
| 333 | 342 |
| 334 // Verify properly flagged message doesn't imply change. | 343 // Verify properly flagged message doesn't imply change. |
| 335 buffer.clear(); | 344 buffer.clear(); |
| 336 MakeAddrMessageWithCacheInfo(RTM_NEWADDR, IFA_F_DEPRECATED, AF_INET6, kEmpty, | 345 MakeAddrMessageWithCacheInfo( |
| 337 kAddr3, 0, &buffer); | 346 RTM_NEWADDR, IFA_F_DEPRECATED, AF_INET6, kEmpty, kAddr3, 0, &buffer); |
| 338 EXPECT_FALSE(HandleAddressMessage(buffer)); | 347 EXPECT_FALSE(HandleAddressMessage(buffer)); |
| 339 map = GetAddressMap(); | 348 map = GetAddressMap(); |
| 340 EXPECT_EQ(1u, map.size()); | 349 EXPECT_EQ(1u, map.size()); |
| 341 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); | 350 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); |
| 342 | 351 |
| 343 // Verify implied deprecated doesn't imply change. | 352 // Verify implied deprecated doesn't imply change. |
| 344 buffer.clear(); | 353 buffer.clear(); |
| 345 MakeAddrMessageWithCacheInfo(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, 0, | 354 MakeAddrMessageWithCacheInfo( |
| 346 &buffer); | 355 RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, 0, &buffer); |
| 347 EXPECT_FALSE(HandleAddressMessage(buffer)); | 356 EXPECT_FALSE(HandleAddressMessage(buffer)); |
| 348 map = GetAddressMap(); | 357 map = GetAddressMap(); |
| 349 EXPECT_EQ(1u, map.size()); | 358 EXPECT_EQ(1u, map.size()); |
| 350 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); | 359 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); |
| 351 } | 360 } |
| 352 | 361 |
| 353 TEST_F(AddressTrackerLinuxTest, IgnoredMessage) { | 362 TEST_F(AddressTrackerLinuxTest, IgnoredMessage) { |
| 354 const IPAddressNumber kEmpty; | 363 const IPAddressNumber kEmpty; |
| 355 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 364 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 356 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); | 365 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 379 EXPECT_TRUE(HandleAddressMessage(buffer)); | 388 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 380 EXPECT_EQ(1u, GetAddressMap().size()); | 389 EXPECT_EQ(1u, GetAddressMap().size()); |
| 381 } | 390 } |
| 382 | 391 |
| 383 TEST_F(AddressTrackerLinuxTest, AddInterface) { | 392 TEST_F(AddressTrackerLinuxTest, AddInterface) { |
| 384 Buffer buffer; | 393 Buffer buffer; |
| 385 | 394 |
| 386 // Ignores loopback. | 395 // Ignores loopback. |
| 387 MakeLinkMessage(RTM_NEWLINK, | 396 MakeLinkMessage(RTM_NEWLINK, |
| 388 IFF_LOOPBACK | IFF_UP | IFF_LOWER_UP | IFF_RUNNING, | 397 IFF_LOOPBACK | IFF_UP | IFF_LOWER_UP | IFF_RUNNING, |
| 389 0, &buffer); | 398 0, |
| 399 &buffer); |
| 390 EXPECT_FALSE(HandleLinkMessage(buffer)); | 400 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 391 EXPECT_TRUE(GetOnlineLinks()->empty()); | 401 EXPECT_TRUE(GetOnlineLinks()->empty()); |
| 392 | 402 |
| 393 // Ignores not IFF_LOWER_UP. | 403 // Ignores not IFF_LOWER_UP. |
| 394 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); | 404 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); |
| 395 EXPECT_FALSE(HandleLinkMessage(buffer)); | 405 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 396 EXPECT_TRUE(GetOnlineLinks()->empty()); | 406 EXPECT_TRUE(GetOnlineLinks()->empty()); |
| 397 | 407 |
| 398 // Ignores deletion. | 408 // Ignores deletion. |
| 399 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); | 409 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 EXPECT_TRUE(HandleLinkMessage(buffer)); | 459 EXPECT_TRUE(HandleLinkMessage(buffer)); |
| 450 EXPECT_TRUE(GetOnlineLinks()->empty()); | 460 EXPECT_TRUE(GetOnlineLinks()->empty()); |
| 451 } | 461 } |
| 452 | 462 |
| 453 TEST_F(AddressTrackerLinuxTest, TunnelInterface) { | 463 TEST_F(AddressTrackerLinuxTest, TunnelInterface) { |
| 454 Buffer buffer; | 464 Buffer buffer; |
| 455 | 465 |
| 456 // Ignores without "tun" prefixed name. | 466 // Ignores without "tun" prefixed name. |
| 457 MakeLinkMessage(RTM_NEWLINK, | 467 MakeLinkMessage(RTM_NEWLINK, |
| 458 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 468 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 459 0, &buffer); | 469 0, |
| 470 &buffer); |
| 460 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 471 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 461 | 472 |
| 462 // Verify success. | 473 // Verify success. |
| 463 MakeLinkMessage(RTM_NEWLINK, | 474 MakeLinkMessage(RTM_NEWLINK, |
| 464 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 475 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 465 kTestInterfaceTun, &buffer); | 476 kTestInterfaceTun, |
| 477 &buffer); |
| 466 EXPECT_TRUE(HandleTunnelMessage(buffer)); | 478 EXPECT_TRUE(HandleTunnelMessage(buffer)); |
| 467 | 479 |
| 468 // Ignores redundant enables. | 480 // Ignores redundant enables. |
| 469 MakeLinkMessage(RTM_NEWLINK, | 481 MakeLinkMessage(RTM_NEWLINK, |
| 470 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 482 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 471 kTestInterfaceTun, &buffer); | 483 kTestInterfaceTun, |
| 484 &buffer); |
| 472 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 485 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 473 | 486 |
| 474 // Ignores deleting without "tun" prefixed name. | 487 // Ignores deleting without "tun" prefixed name. |
| 475 MakeLinkMessage(RTM_DELLINK, | 488 MakeLinkMessage(RTM_DELLINK, |
| 476 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 489 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 477 0, &buffer); | 490 0, |
| 491 &buffer); |
| 478 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 492 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 479 | 493 |
| 480 // Verify successful deletion | 494 // Verify successful deletion |
| 481 MakeLinkMessage(RTM_DELLINK, | 495 MakeLinkMessage(RTM_DELLINK, |
| 482 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 496 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 483 kTestInterfaceTun, &buffer); | 497 kTestInterfaceTun, |
| 498 &buffer); |
| 484 EXPECT_TRUE(HandleTunnelMessage(buffer)); | 499 EXPECT_TRUE(HandleTunnelMessage(buffer)); |
| 485 | 500 |
| 486 // Ignores redundant deletions. | 501 // Ignores redundant deletions. |
| 487 MakeLinkMessage(RTM_DELLINK, | 502 MakeLinkMessage(RTM_DELLINK, |
| 488 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 503 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 489 kTestInterfaceTun, &buffer); | 504 kTestInterfaceTun, |
| 505 &buffer); |
| 490 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 506 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 491 } | 507 } |
| 492 | 508 |
| 493 // Check AddressTrackerLinux::get_interface_name_ original implementation | 509 // Check AddressTrackerLinux::get_interface_name_ original implementation |
| 494 // doesn't crash or return NULL. | 510 // doesn't crash or return NULL. |
| 495 TEST_F(AddressTrackerLinuxTest, GetInterfaceName) { | 511 TEST_F(AddressTrackerLinuxTest, GetInterfaceName) { |
| 496 for (int i = 0; i < 10; i++) | 512 for (int i = 0; i < 10; i++) |
| 497 EXPECT_NE((const char*)NULL, original_get_interface_name_(i)); | 513 EXPECT_NE((const char*)NULL, original_get_interface_name_(i)); |
| 498 } | 514 } |
| 499 | 515 |
| 500 } // namespace | 516 } // namespace |
| 501 | 517 |
| 502 } // namespace internal | 518 } // namespace internal |
| 503 } // namespace net | 519 } // namespace net |
| OLD | NEW |