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 |