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 |