| 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], |
| 57 &address_changed, &link_changed, &tunnel_changed); | 57 buf.size(), |
| 58 &address_changed, |
| 59 &link_changed, |
| 60 &tunnel_changed); |
| 58 EXPECT_FALSE(link_changed); | 61 EXPECT_FALSE(link_changed); |
| 59 return address_changed; | 62 return address_changed; |
| 60 } | 63 } |
| 61 | 64 |
| 62 bool HandleLinkMessage(const Buffer& buf) { | 65 bool HandleLinkMessage(const Buffer& buf) { |
| 63 Buffer writable_buf = buf; | 66 Buffer writable_buf = buf; |
| 64 bool address_changed = false; | 67 bool address_changed = false; |
| 65 bool link_changed = false; | 68 bool link_changed = false; |
| 66 bool tunnel_changed = false; | 69 bool tunnel_changed = false; |
| 67 tracker_->HandleMessage(&writable_buf[0], buf.size(), | 70 tracker_->HandleMessage(&writable_buf[0], |
| 68 &address_changed, &link_changed, &tunnel_changed); | 71 buf.size(), |
| 72 &address_changed, |
| 73 &link_changed, |
| 74 &tunnel_changed); |
| 69 EXPECT_FALSE(address_changed); | 75 EXPECT_FALSE(address_changed); |
| 70 return link_changed; | 76 return link_changed; |
| 71 } | 77 } |
| 72 | 78 |
| 73 bool HandleTunnelMessage(const Buffer& buf) { | 79 bool HandleTunnelMessage(const Buffer& buf) { |
| 74 Buffer writable_buf = buf; | 80 Buffer writable_buf = buf; |
| 75 bool address_changed = false; | 81 bool address_changed = false; |
| 76 bool link_changed = false; | 82 bool link_changed = false; |
| 77 bool tunnel_changed = false; | 83 bool tunnel_changed = false; |
| 78 tracker_->HandleMessage(&writable_buf[0], buf.size(), | 84 tracker_->HandleMessage(&writable_buf[0], |
| 79 &address_changed, &link_changed, &tunnel_changed); | 85 buf.size(), |
| 86 &address_changed, |
| 87 &link_changed, |
| 88 &tunnel_changed); |
| 80 EXPECT_FALSE(address_changed); | 89 EXPECT_FALSE(address_changed); |
| 81 return tunnel_changed; | 90 return tunnel_changed; |
| 82 } | 91 } |
| 83 | 92 |
| 84 AddressTrackerLinux::AddressMap GetAddressMap() { | 93 AddressTrackerLinux::AddressMap GetAddressMap() { |
| 85 return tracker_->GetAddressMap(); | 94 return tracker_->GetAddressMap(); |
| 86 } | 95 } |
| 87 | 96 |
| 88 const base::hash_set<int> GetOnlineLinks() const { | 97 const base::hash_set<int> GetOnlineLinks() const { |
| 89 return tracker_->GetOnlineLinks(); | 98 return tracker_->GetOnlineLinks(); |
| 90 } | 99 } |
| 91 | 100 |
| 92 scoped_ptr<AddressTrackerLinux> tracker_; | 101 scoped_ptr<AddressTrackerLinux> tracker_; |
| 93 AddressTrackerLinux::GetInterfaceNameFunction original_get_interface_name_; | 102 AddressTrackerLinux::GetInterfaceNameFunction original_get_interface_name_; |
| 94 }; | 103 }; |
| 95 | 104 |
| 96 namespace { | 105 namespace { |
| 97 | 106 |
| 98 class NetlinkMessage { | 107 class NetlinkMessage { |
| 99 public: | 108 public: |
| 100 explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) { | 109 explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) { |
| 101 header()->nlmsg_type = type; | 110 header()->nlmsg_type = type; |
| 102 Align(); | 111 Align(); |
| 103 } | 112 } |
| 104 | 113 |
| 105 void AddPayload(const void* data, size_t length) { | 114 void AddPayload(const void* data, size_t length) { |
| 106 CHECK_EQ(static_cast<size_t>(NLMSG_HDRLEN), | 115 CHECK_EQ(static_cast<size_t>(NLMSG_HDRLEN), buffer_.size()) |
| 107 buffer_.size()) << "Payload must be added first"; | 116 << "Payload must be added first"; |
| 108 Append(data, length); | 117 Append(data, length); |
| 109 Align(); | 118 Align(); |
| 110 } | 119 } |
| 111 | 120 |
| 112 void AddAttribute(uint16 type, const void* data, size_t length) { | 121 void AddAttribute(uint16 type, const void* data, size_t length) { |
| 113 struct nlattr attr; | 122 struct nlattr attr; |
| 114 attr.nla_len = NLA_HDRLEN + length; | 123 attr.nla_len = NLA_HDRLEN + length; |
| 115 attr.nla_type = type; | 124 attr.nla_type = type; |
| 116 Append(&attr, sizeof(attr)); | 125 Append(&attr, sizeof(attr)); |
| 117 Align(); | 126 Align(); |
| 118 Append(data, length); | 127 Append(data, length); |
| 119 Align(); | 128 Align(); |
| 120 } | 129 } |
| 121 | 130 |
| 122 void AppendTo(Buffer* output) const { | 131 void AppendTo(Buffer* output) const { |
| 123 CHECK_EQ(NLMSG_ALIGN(output->size()), output->size()); | 132 CHECK_EQ(NLMSG_ALIGN(output->size()), output->size()); |
| 124 output->reserve(output->size() + NLMSG_LENGTH(buffer_.size())); | 133 output->reserve(output->size() + NLMSG_LENGTH(buffer_.size())); |
| 125 output->insert(output->end(), buffer_.begin(), buffer_.end()); | 134 output->insert(output->end(), buffer_.begin(), buffer_.end()); |
| 126 } | 135 } |
| 127 | 136 |
| 128 private: | 137 private: |
| 129 void Append(const void* data, size_t length) { | 138 void Append(const void* data, size_t length) { |
| 130 const char* chardata = reinterpret_cast<const char*>(data); | 139 const char* chardata = reinterpret_cast<const char*>(data); |
| 131 buffer_.insert(buffer_.end(), chardata, chardata + length); | 140 buffer_.insert(buffer_.end(), chardata, chardata + length); |
| 132 } | 141 } |
| 133 | 142 |
| 134 void Align() { | 143 void Align() { |
| 135 header()->nlmsg_len = buffer_.size(); | 144 header()->nlmsg_len = buffer_.size(); |
| 136 buffer_.insert(buffer_.end(), NLMSG_ALIGN(buffer_.size()) - buffer_.size(), | 145 buffer_.insert( |
| 137 0); | 146 buffer_.end(), NLMSG_ALIGN(buffer_.size()) - buffer_.size(), 0); |
| 138 CHECK(NLMSG_OK(header(), buffer_.size())); | 147 CHECK(NLMSG_OK(header(), buffer_.size())); |
| 139 } | 148 } |
| 140 | 149 |
| 141 struct nlmsghdr* header() { | 150 struct nlmsghdr* header() { |
| 142 return reinterpret_cast<struct nlmsghdr*>(&buffer_[0]); | 151 return reinterpret_cast<struct nlmsghdr*>(&buffer_[0]); |
| 143 } | 152 } |
| 144 | 153 |
| 145 Buffer buffer_; | 154 Buffer buffer_; |
| 146 }; | 155 }; |
| 147 | 156 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 169 nlmsg.AddAttribute(IFA_CACHEINFO, &cache_info, sizeof(cache_info)); | 178 nlmsg.AddAttribute(IFA_CACHEINFO, &cache_info, sizeof(cache_info)); |
| 170 nlmsg.AppendTo(output); | 179 nlmsg.AppendTo(output); |
| 171 } | 180 } |
| 172 | 181 |
| 173 void MakeAddrMessage(uint16 type, | 182 void MakeAddrMessage(uint16 type, |
| 174 uint8 flags, | 183 uint8 flags, |
| 175 uint8 family, | 184 uint8 family, |
| 176 const IPAddressNumber& address, | 185 const IPAddressNumber& address, |
| 177 const IPAddressNumber& local, | 186 const IPAddressNumber& local, |
| 178 Buffer* output) { | 187 Buffer* output) { |
| 179 MakeAddrMessageWithCacheInfo(type, flags, family, address, local, | 188 MakeAddrMessageWithCacheInfo( |
| 180 INFINITY_LIFE_TIME, output); | 189 type, flags, family, address, local, INFINITY_LIFE_TIME, output); |
| 181 } | 190 } |
| 182 | 191 |
| 183 void MakeLinkMessage(uint16 type, uint32 flags, uint32 index, Buffer* output) { | 192 void MakeLinkMessage(uint16 type, uint32 flags, uint32 index, Buffer* output) { |
| 184 NetlinkMessage nlmsg(type); | 193 NetlinkMessage nlmsg(type); |
| 185 struct ifinfomsg msg = {}; | 194 struct ifinfomsg msg = {}; |
| 186 msg.ifi_index = index; | 195 msg.ifi_index = index; |
| 187 msg.ifi_flags = flags; | 196 msg.ifi_flags = flags; |
| 188 nlmsg.AddPayload(&msg, sizeof(msg)); | 197 nlmsg.AddPayload(&msg, sizeof(msg)); |
| 189 output->clear(); | 198 output->clear(); |
| 190 nlmsg.AppendTo(output); | 199 nlmsg.AppendTo(output); |
| 191 } | 200 } |
| 192 | 201 |
| 193 const unsigned char kAddress0[] = { 127, 0, 0, 1 }; | 202 const unsigned char kAddress0[] = {127, 0, 0, 1}; |
| 194 const unsigned char kAddress1[] = { 10, 0, 0, 1 }; | 203 const unsigned char kAddress1[] = {10, 0, 0, 1}; |
| 195 const unsigned char kAddress2[] = { 192, 168, 0, 1 }; | 204 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, | 205 const unsigned char kAddress3[] = |
| 197 0, 0, 0, 1 }; | 206 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; |
| 198 | 207 |
| 199 TEST_F(AddressTrackerLinuxTest, NewAddress) { | 208 TEST_F(AddressTrackerLinuxTest, NewAddress) { |
| 200 InitializeAddressTracker(true); | 209 InitializeAddressTracker(true); |
| 201 | 210 |
| 202 const IPAddressNumber kEmpty; | 211 const IPAddressNumber kEmpty; |
| 203 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 212 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 204 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); | 213 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); |
| 205 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); | 214 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); |
| 206 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); | 215 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); |
| 207 | 216 |
| 208 Buffer buffer; | 217 Buffer buffer; |
| 209 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, | 218 MakeAddrMessage( |
| 210 &buffer); | 219 RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); |
| 211 EXPECT_TRUE(HandleAddressMessage(buffer)); | 220 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 212 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 221 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 213 EXPECT_EQ(1u, map.size()); | 222 EXPECT_EQ(1u, map.size()); |
| 214 EXPECT_EQ(1u, map.count(kAddr0)); | 223 EXPECT_EQ(1u, map.count(kAddr0)); |
| 215 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 224 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 216 | 225 |
| 217 buffer.clear(); | 226 buffer.clear(); |
| 218 MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr1, kAddr2, | 227 MakeAddrMessage( |
| 219 &buffer); | 228 RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr1, kAddr2, &buffer); |
| 220 EXPECT_TRUE(HandleAddressMessage(buffer)); | 229 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 221 map = GetAddressMap(); | 230 map = GetAddressMap(); |
| 222 EXPECT_EQ(2u, map.size()); | 231 EXPECT_EQ(2u, map.size()); |
| 223 EXPECT_EQ(1u, map.count(kAddr0)); | 232 EXPECT_EQ(1u, map.count(kAddr0)); |
| 224 EXPECT_EQ(1u, map.count(kAddr2)); | 233 EXPECT_EQ(1u, map.count(kAddr2)); |
| 225 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr2].ifa_flags); | 234 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr2].ifa_flags); |
| 226 | 235 |
| 227 buffer.clear(); | 236 buffer.clear(); |
| 228 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); | 237 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); |
| 229 EXPECT_TRUE(HandleAddressMessage(buffer)); | 238 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 230 map = GetAddressMap(); | 239 map = GetAddressMap(); |
| 231 EXPECT_EQ(3u, map.size()); | 240 EXPECT_EQ(3u, map.size()); |
| 232 EXPECT_EQ(1u, map.count(kAddr3)); | 241 EXPECT_EQ(1u, map.count(kAddr3)); |
| 233 } | 242 } |
| 234 | 243 |
| 235 TEST_F(AddressTrackerLinuxTest, NewAddressChange) { | 244 TEST_F(AddressTrackerLinuxTest, NewAddressChange) { |
| 236 InitializeAddressTracker(true); | 245 InitializeAddressTracker(true); |
| 237 | 246 |
| 238 const IPAddressNumber kEmpty; | 247 const IPAddressNumber kEmpty; |
| 239 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 248 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 240 | 249 |
| 241 Buffer buffer; | 250 Buffer buffer; |
| 242 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, | 251 MakeAddrMessage( |
| 243 &buffer); | 252 RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); |
| 244 EXPECT_TRUE(HandleAddressMessage(buffer)); | 253 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 245 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 254 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 246 EXPECT_EQ(1u, map.size()); | 255 EXPECT_EQ(1u, map.size()); |
| 247 EXPECT_EQ(1u, map.count(kAddr0)); | 256 EXPECT_EQ(1u, map.count(kAddr0)); |
| 248 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 257 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 249 | 258 |
| 250 buffer.clear(); | 259 buffer.clear(); |
| 251 MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, | 260 MakeAddrMessage( |
| 252 &buffer); | 261 RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, &buffer); |
| 253 EXPECT_TRUE(HandleAddressMessage(buffer)); | 262 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 254 map = GetAddressMap(); | 263 map = GetAddressMap(); |
| 255 EXPECT_EQ(1u, map.size()); | 264 EXPECT_EQ(1u, map.size()); |
| 256 EXPECT_EQ(1u, map.count(kAddr0)); | 265 EXPECT_EQ(1u, map.count(kAddr0)); |
| 257 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); | 266 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); |
| 258 | 267 |
| 259 // Both messages in one buffer. | 268 // Both messages in one buffer. |
| 260 buffer.clear(); | 269 buffer.clear(); |
| 261 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, | 270 MakeAddrMessage( |
| 262 &buffer); | 271 RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); |
| 263 MakeAddrMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, | 272 MakeAddrMessage( |
| 264 &buffer); | 273 RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, &buffer); |
| 265 EXPECT_TRUE(HandleAddressMessage(buffer)); | 274 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 266 map = GetAddressMap(); | 275 map = GetAddressMap(); |
| 267 EXPECT_EQ(1u, map.size()); | 276 EXPECT_EQ(1u, map.size()); |
| 268 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); | 277 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); |
| 269 } | 278 } |
| 270 | 279 |
| 271 TEST_F(AddressTrackerLinuxTest, NewAddressDuplicate) { | 280 TEST_F(AddressTrackerLinuxTest, NewAddressDuplicate) { |
| 272 InitializeAddressTracker(true); | 281 InitializeAddressTracker(true); |
| 273 | 282 |
| 274 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); | 283 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); |
| 275 | 284 |
| 276 Buffer buffer; | 285 Buffer buffer; |
| 277 MakeAddrMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kAddr0, | 286 MakeAddrMessage( |
| 278 &buffer); | 287 RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kAddr0, &buffer); |
| 279 EXPECT_TRUE(HandleAddressMessage(buffer)); | 288 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 280 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 289 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 281 EXPECT_EQ(1u, map.size()); | 290 EXPECT_EQ(1u, map.size()); |
| 282 EXPECT_EQ(1u, map.count(kAddr0)); | 291 EXPECT_EQ(1u, map.count(kAddr0)); |
| 283 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 292 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| 284 | 293 |
| 285 EXPECT_FALSE(HandleAddressMessage(buffer)); | 294 EXPECT_FALSE(HandleAddressMessage(buffer)); |
| 286 map = GetAddressMap(); | 295 map = GetAddressMap(); |
| 287 EXPECT_EQ(1u, map.size()); | 296 EXPECT_EQ(1u, map.size()); |
| 288 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); | 297 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 Buffer buffer; | 343 Buffer buffer; |
| 335 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); | 344 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); |
| 336 EXPECT_TRUE(HandleAddressMessage(buffer)); | 345 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 337 AddressTrackerLinux::AddressMap map = GetAddressMap(); | 346 AddressTrackerLinux::AddressMap map = GetAddressMap(); |
| 338 EXPECT_EQ(1u, map.size()); | 347 EXPECT_EQ(1u, map.size()); |
| 339 EXPECT_EQ(1u, map.count(kAddr3)); | 348 EXPECT_EQ(1u, map.count(kAddr3)); |
| 340 EXPECT_EQ(0, map[kAddr3].ifa_flags); | 349 EXPECT_EQ(0, map[kAddr3].ifa_flags); |
| 341 | 350 |
| 342 // Verify 0 preferred lifetime implies deprecated. | 351 // Verify 0 preferred lifetime implies deprecated. |
| 343 buffer.clear(); | 352 buffer.clear(); |
| 344 MakeAddrMessageWithCacheInfo(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, 0, | 353 MakeAddrMessageWithCacheInfo( |
| 345 &buffer); | 354 RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, 0, &buffer); |
| 346 EXPECT_TRUE(HandleAddressMessage(buffer)); | 355 EXPECT_TRUE(HandleAddressMessage(buffer)); |
| 347 map = GetAddressMap(); | 356 map = GetAddressMap(); |
| 348 EXPECT_EQ(1u, map.size()); | 357 EXPECT_EQ(1u, map.size()); |
| 349 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); | 358 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); |
| 350 | 359 |
| 351 // Verify properly flagged message doesn't imply change. | 360 // Verify properly flagged message doesn't imply change. |
| 352 buffer.clear(); | 361 buffer.clear(); |
| 353 MakeAddrMessageWithCacheInfo(RTM_NEWADDR, IFA_F_DEPRECATED, AF_INET6, kEmpty, | 362 MakeAddrMessageWithCacheInfo( |
| 354 kAddr3, 0, &buffer); | 363 RTM_NEWADDR, IFA_F_DEPRECATED, AF_INET6, kEmpty, kAddr3, 0, &buffer); |
| 355 EXPECT_FALSE(HandleAddressMessage(buffer)); | 364 EXPECT_FALSE(HandleAddressMessage(buffer)); |
| 356 map = GetAddressMap(); | 365 map = GetAddressMap(); |
| 357 EXPECT_EQ(1u, map.size()); | 366 EXPECT_EQ(1u, map.size()); |
| 358 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); | 367 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); |
| 359 | 368 |
| 360 // Verify implied deprecated doesn't imply change. | 369 // Verify implied deprecated doesn't imply change. |
| 361 buffer.clear(); | 370 buffer.clear(); |
| 362 MakeAddrMessageWithCacheInfo(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, 0, | 371 MakeAddrMessageWithCacheInfo( |
| 363 &buffer); | 372 RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, 0, &buffer); |
| 364 EXPECT_FALSE(HandleAddressMessage(buffer)); | 373 EXPECT_FALSE(HandleAddressMessage(buffer)); |
| 365 map = GetAddressMap(); | 374 map = GetAddressMap(); |
| 366 EXPECT_EQ(1u, map.size()); | 375 EXPECT_EQ(1u, map.size()); |
| 367 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); | 376 EXPECT_EQ(IFA_F_DEPRECATED, map[kAddr3].ifa_flags); |
| 368 } | 377 } |
| 369 | 378 |
| 370 TEST_F(AddressTrackerLinuxTest, IgnoredMessage) { | 379 TEST_F(AddressTrackerLinuxTest, IgnoredMessage) { |
| 371 InitializeAddressTracker(true); | 380 InitializeAddressTracker(true); |
| 372 | 381 |
| 373 const IPAddressNumber kEmpty; | 382 const IPAddressNumber kEmpty; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 400 } | 409 } |
| 401 | 410 |
| 402 TEST_F(AddressTrackerLinuxTest, AddInterface) { | 411 TEST_F(AddressTrackerLinuxTest, AddInterface) { |
| 403 InitializeAddressTracker(true); | 412 InitializeAddressTracker(true); |
| 404 | 413 |
| 405 Buffer buffer; | 414 Buffer buffer; |
| 406 | 415 |
| 407 // Ignores loopback. | 416 // Ignores loopback. |
| 408 MakeLinkMessage(RTM_NEWLINK, | 417 MakeLinkMessage(RTM_NEWLINK, |
| 409 IFF_LOOPBACK | IFF_UP | IFF_LOWER_UP | IFF_RUNNING, | 418 IFF_LOOPBACK | IFF_UP | IFF_LOWER_UP | IFF_RUNNING, |
| 410 0, &buffer); | 419 0, |
| 420 &buffer); |
| 411 EXPECT_FALSE(HandleLinkMessage(buffer)); | 421 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 412 EXPECT_TRUE(GetOnlineLinks().empty()); | 422 EXPECT_TRUE(GetOnlineLinks().empty()); |
| 413 | 423 |
| 414 // Ignores not IFF_LOWER_UP. | 424 // Ignores not IFF_LOWER_UP. |
| 415 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); | 425 MakeLinkMessage(RTM_NEWLINK, IFF_UP | IFF_RUNNING, 0, &buffer); |
| 416 EXPECT_FALSE(HandleLinkMessage(buffer)); | 426 EXPECT_FALSE(HandleLinkMessage(buffer)); |
| 417 EXPECT_TRUE(GetOnlineLinks().empty()); | 427 EXPECT_TRUE(GetOnlineLinks().empty()); |
| 418 | 428 |
| 419 // Ignores deletion. | 429 // Ignores deletion. |
| 420 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); | 430 MakeLinkMessage(RTM_DELLINK, IFF_UP | IFF_LOWER_UP | IFF_RUNNING, 0, &buffer); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 } | 484 } |
| 475 | 485 |
| 476 TEST_F(AddressTrackerLinuxTest, TunnelInterface) { | 486 TEST_F(AddressTrackerLinuxTest, TunnelInterface) { |
| 477 InitializeAddressTracker(true); | 487 InitializeAddressTracker(true); |
| 478 | 488 |
| 479 Buffer buffer; | 489 Buffer buffer; |
| 480 | 490 |
| 481 // Ignores without "tun" prefixed name. | 491 // Ignores without "tun" prefixed name. |
| 482 MakeLinkMessage(RTM_NEWLINK, | 492 MakeLinkMessage(RTM_NEWLINK, |
| 483 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 493 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 484 0, &buffer); | 494 0, |
| 495 &buffer); |
| 485 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 496 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 486 | 497 |
| 487 // Verify success. | 498 // Verify success. |
| 488 MakeLinkMessage(RTM_NEWLINK, | 499 MakeLinkMessage(RTM_NEWLINK, |
| 489 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 500 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 490 kTestInterfaceTun, &buffer); | 501 kTestInterfaceTun, |
| 502 &buffer); |
| 491 EXPECT_TRUE(HandleTunnelMessage(buffer)); | 503 EXPECT_TRUE(HandleTunnelMessage(buffer)); |
| 492 | 504 |
| 493 // Ignores redundant enables. | 505 // Ignores redundant enables. |
| 494 MakeLinkMessage(RTM_NEWLINK, | 506 MakeLinkMessage(RTM_NEWLINK, |
| 495 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 507 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 496 kTestInterfaceTun, &buffer); | 508 kTestInterfaceTun, |
| 509 &buffer); |
| 497 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 510 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 498 | 511 |
| 499 // Ignores deleting without "tun" prefixed name. | 512 // Ignores deleting without "tun" prefixed name. |
| 500 MakeLinkMessage(RTM_DELLINK, | 513 MakeLinkMessage(RTM_DELLINK, |
| 501 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 514 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 502 0, &buffer); | 515 0, |
| 516 &buffer); |
| 503 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 517 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 504 | 518 |
| 505 // Verify successful deletion | 519 // Verify successful deletion |
| 506 MakeLinkMessage(RTM_DELLINK, | 520 MakeLinkMessage(RTM_DELLINK, |
| 507 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 521 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 508 kTestInterfaceTun, &buffer); | 522 kTestInterfaceTun, |
| 523 &buffer); |
| 509 EXPECT_TRUE(HandleTunnelMessage(buffer)); | 524 EXPECT_TRUE(HandleTunnelMessage(buffer)); |
| 510 | 525 |
| 511 // Ignores redundant deletions. | 526 // Ignores redundant deletions. |
| 512 MakeLinkMessage(RTM_DELLINK, | 527 MakeLinkMessage(RTM_DELLINK, |
| 513 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, | 528 IFF_UP | IFF_LOWER_UP | IFF_RUNNING | IFF_POINTOPOINT, |
| 514 kTestInterfaceTun, &buffer); | 529 kTestInterfaceTun, |
| 530 &buffer); |
| 515 EXPECT_FALSE(HandleTunnelMessage(buffer)); | 531 EXPECT_FALSE(HandleTunnelMessage(buffer)); |
| 516 } | 532 } |
| 517 | 533 |
| 518 // Check AddressTrackerLinux::get_interface_name_ original implementation | 534 // Check AddressTrackerLinux::get_interface_name_ original implementation |
| 519 // doesn't crash or return NULL. | 535 // doesn't crash or return NULL. |
| 520 TEST_F(AddressTrackerLinuxTest, GetInterfaceName) { | 536 TEST_F(AddressTrackerLinuxTest, GetInterfaceName) { |
| 521 InitializeAddressTracker(true); | 537 InitializeAddressTracker(true); |
| 522 | 538 |
| 523 for (int i = 0; i < 10; i++) | 539 for (int i = 0; i < 10; i++) |
| 524 EXPECT_NE((const char*)NULL, original_get_interface_name_(i)); | 540 EXPECT_NE((const char*)NULL, original_get_interface_name_(i)); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 547 | 563 |
| 548 TEST_F(AddressTrackerLinuxTest, NonTrackingModeInit) { | 564 TEST_F(AddressTrackerLinuxTest, NonTrackingModeInit) { |
| 549 AddressTrackerLinux tracker; | 565 AddressTrackerLinux tracker; |
| 550 tracker.Init(); | 566 tracker.Init(); |
| 551 } | 567 } |
| 552 | 568 |
| 553 } // namespace | 569 } // namespace |
| 554 | 570 |
| 555 } // namespace internal | 571 } // namespace internal |
| 556 } // namespace net | 572 } // namespace net |
| OLD | NEW |