Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(383)

Side by Side Diff: net/base/address_tracker_linux_unittest.cc

Issue 11359141: Use Netlink instead of NetworkManager (via D-bus) to monitor network (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Little reformat Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/base/address_tracker_linux.cc ('k') | net/base/network_change_notifier_linux.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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>
8
7 #include <vector> 9 #include <vector>
8 10
9 #include "base/bind.h" 11 #include "base/bind.h"
10 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
11 13
12 namespace net { 14 namespace net {
13 namespace internal { 15 namespace internal {
14 16
15 void Noop() {} 17 void Noop() {}
16 18
17 class AddressTrackerLinuxTest : public testing::Test { 19 class AddressTrackerLinuxTest : public testing::Test {
18 protected: 20 protected:
19 AddressTrackerLinuxTest() : tracker_(base::Bind(&Noop)) {} 21 AddressTrackerLinuxTest() : tracker_(base::Bind(&Noop), base::Bind(&Noop)) {}
20 22
21 bool HandleMessage(char* buf, size_t length) { 23 void HandleMessage(
22 return tracker_.HandleMessage(buf, length); 24 char* buf, size_t length, bool* address_changed, bool* link_changed) {
szym 2012/11/21 20:14:10 Style says that in multi-line function declaration
25 tracker_.HandleMessage(buf, length, address_changed, link_changed);
23 } 26 }
24 27
25 AddressTrackerLinux::AddressMap GetAddressMap() { 28 AddressTrackerLinux::AddressMap GetAddressMap() {
26 return tracker_.GetAddressMap(); 29 return tracker_.GetAddressMap();
27 } 30 }
28 31
32 const base::hash_set<int>* GetOnlineLinks() const {
33 return &tracker_.online_links_;
34 }
35
29 AddressTrackerLinux tracker_; 36 AddressTrackerLinux tracker_;
30 }; 37 };
31 38
32 namespace { 39 namespace {
33 40
34 typedef std::vector<char> Buffer; 41 typedef std::vector<char> Buffer;
35 42
36 class NetlinkMessage { 43 class NetlinkMessage {
37 public: 44 public:
38 explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) { 45 explicit NetlinkMessage(uint16 type) : buffer_(NLMSG_HDRLEN) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 CHECK(NLMSG_OK(header(), buffer_.size())); 83 CHECK(NLMSG_OK(header(), buffer_.size()));
77 } 84 }
78 85
79 struct nlmsghdr* header() { 86 struct nlmsghdr* header() {
80 return reinterpret_cast<struct nlmsghdr*>(&buffer_[0]); 87 return reinterpret_cast<struct nlmsghdr*>(&buffer_[0]);
81 } 88 }
82 89
83 Buffer buffer_; 90 Buffer buffer_;
84 }; 91 };
85 92
86 void MakeMessage(uint16 type, 93 void MakeAddrMessage(uint16 type,
87 uint8 flags, 94 uint8 flags,
88 uint8 family, 95 uint8 family,
89 const IPAddressNumber& address, 96 const IPAddressNumber& address,
90 const IPAddressNumber& local, 97 const IPAddressNumber& local,
91 Buffer* output) { 98 Buffer* output) {
92 NetlinkMessage nlmsg(type); 99 NetlinkMessage nlmsg(type);
93 struct ifaddrmsg msg = {}; 100 struct ifaddrmsg msg = {};
94 msg.ifa_family = family; 101 msg.ifa_family = family;
95 msg.ifa_flags = flags; 102 msg.ifa_flags = flags;
96 nlmsg.AddPayload(&msg, sizeof(msg)); 103 nlmsg.AddPayload(&msg, sizeof(msg));
97 if (address.size()) 104 if (address.size())
98 nlmsg.AddAttribute(IFA_ADDRESS, &address[0], address.size()); 105 nlmsg.AddAttribute(IFA_ADDRESS, &address[0], address.size());
99 if (local.size()) 106 if (local.size())
100 nlmsg.AddAttribute(IFA_LOCAL, &local[0], local.size()); 107 nlmsg.AddAttribute(IFA_LOCAL, &local[0], local.size());
101 nlmsg.AppendTo(output); 108 nlmsg.AppendTo(output);
102 } 109 }
103 110
111 void MakeLinkMessage(uint16 type, uint32 flags, uint32 index, Buffer* output) {
112 NetlinkMessage nlmsg(type);
113 struct ifinfomsg msg = {};
114 msg.ifi_index = index;
115 msg.ifi_flags = flags;
116 nlmsg.AddPayload(&msg, sizeof(msg));
117 output->clear();
118 nlmsg.AppendTo(output);
119 }
120
104 const unsigned char kAddress0[] = { 127, 0, 0, 1 }; 121 const unsigned char kAddress0[] = { 127, 0, 0, 1 };
105 const unsigned char kAddress1[] = { 10, 0, 0, 1 }; 122 const unsigned char kAddress1[] = { 10, 0, 0, 1 };
106 const unsigned char kAddress2[] = { 192, 168, 0, 1 }; 123 const unsigned char kAddress2[] = { 192, 168, 0, 1 };
107 const unsigned char kAddress3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124 const unsigned char kAddress3[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
108 0, 0, 0, 1 }; 125 0, 0, 0, 1 };
109 const unsigned char kAddress4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 126 const unsigned char kAddress4[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255,
110 169, 254, 0, 1 }; 127 169, 254, 0, 1 };
111 128
112 TEST_F(AddressTrackerLinuxTest, NewAddress) { 129 TEST_F(AddressTrackerLinuxTest, NewAddress) {
113 const IPAddressNumber kEmpty; 130 const IPAddressNumber kEmpty;
114 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); 131 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0));
115 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); 132 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1));
116 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); 133 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2));
117 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); 134 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3));
135 bool address_changed;
136 bool link_changed;
118 137
119 Buffer buffer; 138 Buffer buffer;
120 MakeMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); 139 MakeAddrMessage(RTM_NEWADDR,
szym 2012/11/21 20:14:10 This does not have to be one arg per line. I think
121 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); 140 IFA_F_TEMPORARY,
141 AF_INET,
142 kAddr0,
143 kEmpty,
144 &buffer);
145 address_changed = false;
146 link_changed = false;
147 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
148 EXPECT_TRUE(address_changed);
149 EXPECT_FALSE(link_changed);
122 AddressTrackerLinux::AddressMap map = GetAddressMap(); 150 AddressTrackerLinux::AddressMap map = GetAddressMap();
123 EXPECT_EQ(1u, map.size()); 151 EXPECT_EQ(1u, map.size());
124 EXPECT_TRUE(map.find(kAddr0) != map.end()); 152 EXPECT_TRUE(map.find(kAddr0) != map.end());
125 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); 153 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags);
126 154
127 buffer.clear(); 155 buffer.clear();
128 MakeMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr1, kAddr2, &buffer); 156 MakeAddrMessage(RTM_NEWADDR,
129 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); 157 IFA_F_HOMEADDRESS,
158 AF_INET,
159 kAddr1,
160 kAddr2,
161 &buffer);
162 address_changed = false;
szym 2012/11/21 20:14:10 Suggest adding two helper functions to the fixture
163 link_changed = false;
164 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
165 EXPECT_TRUE(address_changed);
166 EXPECT_FALSE(link_changed);
130 map = GetAddressMap(); 167 map = GetAddressMap();
131 EXPECT_EQ(2u, map.size()); 168 EXPECT_EQ(2u, map.size());
132 EXPECT_TRUE(map.find(kAddr0) != map.end()); 169 EXPECT_TRUE(map.find(kAddr0) != map.end());
133 EXPECT_TRUE(map.find(kAddr2) != map.end()); 170 EXPECT_TRUE(map.find(kAddr2) != map.end());
134 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr2].ifa_flags); 171 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr2].ifa_flags);
135 172
136 buffer.clear(); 173 buffer.clear();
137 MakeMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer); 174 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET6, kEmpty, kAddr3, &buffer);
138 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); 175 address_changed = false;
176 link_changed = false;
177 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
178 EXPECT_TRUE(address_changed);
179 EXPECT_FALSE(link_changed);
139 map = GetAddressMap(); 180 map = GetAddressMap();
140 EXPECT_EQ(3u, map.size()); 181 EXPECT_EQ(3u, map.size());
141 EXPECT_TRUE(map.find(kAddr3) != map.end()); 182 EXPECT_TRUE(map.find(kAddr3) != map.end());
142 } 183 }
143 184
144 TEST_F(AddressTrackerLinuxTest, NewAddressChange) { 185 TEST_F(AddressTrackerLinuxTest, NewAddressChange) {
145 const IPAddressNumber kEmpty; 186 const IPAddressNumber kEmpty;
146 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); 187 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0));
188 bool address_changed;
189 bool link_changed;
147 190
148 Buffer buffer; 191 Buffer buffer;
149 MakeMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); 192 MakeAddrMessage(RTM_NEWADDR,
150 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); 193 IFA_F_TEMPORARY,
194 AF_INET,
195 kAddr0,
196 kEmpty,
197 &buffer);
198 address_changed = false;
199 link_changed = false;
200 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
201 EXPECT_TRUE(address_changed);
202 EXPECT_FALSE(link_changed);
151 AddressTrackerLinux::AddressMap map = GetAddressMap(); 203 AddressTrackerLinux::AddressMap map = GetAddressMap();
152 EXPECT_EQ(1u, map.size()); 204 EXPECT_EQ(1u, map.size());
153 EXPECT_TRUE(map.find(kAddr0) != map.end()); 205 EXPECT_TRUE(map.find(kAddr0) != map.end());
154 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); 206 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags);
155 207
156 buffer.clear(); 208 buffer.clear();
157 MakeMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, &buffer); 209 MakeAddrMessage(RTM_NEWADDR,
158 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); 210 IFA_F_HOMEADDRESS,
211 AF_INET,
212 kAddr0,
213 kEmpty,
214 &buffer);
215 address_changed = false;
216 link_changed = false;
217 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
218 EXPECT_TRUE(address_changed);
219 EXPECT_FALSE(link_changed);
159 map = GetAddressMap(); 220 map = GetAddressMap();
160 EXPECT_EQ(1u, map.size()); 221 EXPECT_EQ(1u, map.size());
161 EXPECT_TRUE(map.find(kAddr0) != map.end()); 222 EXPECT_TRUE(map.find(kAddr0) != map.end());
162 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); 223 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags);
163 224
164 // Both messages in one buffer. 225 // Both messages in one buffer.
165 buffer.clear(); 226 buffer.clear();
166 MakeMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kEmpty, &buffer); 227 MakeAddrMessage(RTM_NEWADDR,
167 MakeMessage(RTM_NEWADDR, IFA_F_HOMEADDRESS, AF_INET, kAddr0, kEmpty, &buffer); 228 IFA_F_TEMPORARY,
168 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); 229 AF_INET,
230 kAddr0,
231 kEmpty,
232 &buffer);
233 MakeAddrMessage(RTM_NEWADDR,
234 IFA_F_HOMEADDRESS,
235 AF_INET,
236 kAddr0,
237 kEmpty,
238 &buffer);
239 address_changed = false;
240 link_changed = false;
241 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
242 EXPECT_TRUE(address_changed);
243 EXPECT_FALSE(link_changed);
169 map = GetAddressMap(); 244 map = GetAddressMap();
170 EXPECT_EQ(1u, map.size()); 245 EXPECT_EQ(1u, map.size());
171 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags); 246 EXPECT_EQ(IFA_F_HOMEADDRESS, map[kAddr0].ifa_flags);
172 } 247 }
173 248
174 TEST_F(AddressTrackerLinuxTest, NewAddressDuplicate) { 249 TEST_F(AddressTrackerLinuxTest, NewAddressDuplicate) {
175 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); 250 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0));
251 bool address_changed;
252 bool link_changed;
176 253
177 Buffer buffer; 254 Buffer buffer;
178 MakeMessage(RTM_NEWADDR, IFA_F_TEMPORARY, AF_INET, kAddr0, kAddr0, &buffer); 255 MakeAddrMessage(RTM_NEWADDR,
179 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); 256 IFA_F_TEMPORARY,
257 AF_INET,
258 kAddr0,
259 kAddr0,
260 &buffer);
261 address_changed = false;
262 link_changed = false;
263 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
264 EXPECT_TRUE(address_changed);
265 EXPECT_FALSE(link_changed);
180 AddressTrackerLinux::AddressMap map = GetAddressMap(); 266 AddressTrackerLinux::AddressMap map = GetAddressMap();
181 EXPECT_EQ(1u, map.size()); 267 EXPECT_EQ(1u, map.size());
182 EXPECT_TRUE(map.find(kAddr0) != map.end()); 268 EXPECT_TRUE(map.find(kAddr0) != map.end());
183 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); 269 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags);
184 270
185 EXPECT_FALSE(HandleMessage(&buffer[0], buffer.size())); 271 address_changed = false;
272 link_changed = false;
273 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
274 EXPECT_FALSE(address_changed);
275 EXPECT_FALSE(link_changed);
186 map = GetAddressMap(); 276 map = GetAddressMap();
187 EXPECT_EQ(1u, map.size()); 277 EXPECT_EQ(1u, map.size());
188 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags); 278 EXPECT_EQ(IFA_F_TEMPORARY, map[kAddr0].ifa_flags);
189 } 279 }
190 280
191 TEST_F(AddressTrackerLinuxTest, DeleteAddress) { 281 TEST_F(AddressTrackerLinuxTest, DeleteAddress) {
192 const IPAddressNumber kEmpty; 282 const IPAddressNumber kEmpty;
193 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); 283 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0));
194 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1)); 284 const IPAddressNumber kAddr1(kAddress1, kAddress1 + arraysize(kAddress1));
195 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2)); 285 const IPAddressNumber kAddr2(kAddress2, kAddress2 + arraysize(kAddress2));
286 bool address_changed;
287 bool link_changed;
196 288
197 Buffer buffer; 289 Buffer buffer;
198 MakeMessage(RTM_NEWADDR, 0, AF_INET, kAddr0, kEmpty, &buffer); 290 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kAddr0, kEmpty, &buffer);
199 MakeMessage(RTM_NEWADDR, 0, AF_INET, kAddr1, kAddr2, &buffer); 291 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kAddr1, kAddr2, &buffer);
200 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); 292 address_changed = false;
293 link_changed = false;
294 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
295 EXPECT_TRUE(address_changed);
296 EXPECT_FALSE(link_changed);
201 AddressTrackerLinux::AddressMap map = GetAddressMap(); 297 AddressTrackerLinux::AddressMap map = GetAddressMap();
202 EXPECT_EQ(2u, map.size()); 298 EXPECT_EQ(2u, map.size());
203 299
204 buffer.clear(); 300 buffer.clear();
205 MakeMessage(RTM_DELADDR, 0, AF_INET, kEmpty, kAddr0, &buffer); 301 MakeAddrMessage(RTM_DELADDR, 0, AF_INET, kEmpty, kAddr0, &buffer);
206 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); 302 address_changed = false;
303 link_changed = false;
304 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
305 EXPECT_TRUE(address_changed);
306 EXPECT_FALSE(link_changed);
207 map = GetAddressMap(); 307 map = GetAddressMap();
208 EXPECT_EQ(1u, map.size()); 308 EXPECT_EQ(1u, map.size());
209 EXPECT_TRUE(map.find(kAddr0) == map.end()); 309 EXPECT_TRUE(map.find(kAddr0) == map.end());
210 EXPECT_TRUE(map.find(kAddr2) != map.end()); 310 EXPECT_TRUE(map.find(kAddr2) != map.end());
211 311
212 buffer.clear(); 312 buffer.clear();
213 MakeMessage(RTM_DELADDR, 0, AF_INET, kAddr2, kAddr1, &buffer); 313 MakeAddrMessage(RTM_DELADDR, 0, AF_INET, kAddr2, kAddr1, &buffer);
214 // kAddr1 does not exist in the map. 314 // kAddr1 does not exist in the map.
215 EXPECT_FALSE(HandleMessage(&buffer[0], buffer.size())); 315 address_changed = false;
316 link_changed = false;
317 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
318 EXPECT_FALSE(address_changed);
319 EXPECT_FALSE(link_changed);
216 map = GetAddressMap(); 320 map = GetAddressMap();
217 EXPECT_EQ(1u, map.size()); 321 EXPECT_EQ(1u, map.size());
218 322
219 buffer.clear(); 323 buffer.clear();
220 MakeMessage(RTM_DELADDR, 0, AF_INET, kAddr2, kEmpty, &buffer); 324 MakeAddrMessage(RTM_DELADDR, 0, AF_INET, kAddr2, kEmpty, &buffer);
221 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); 325 address_changed = false;
326 link_changed = false;
327 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
328 EXPECT_TRUE(address_changed);
329 EXPECT_FALSE(link_changed);
222 map = GetAddressMap(); 330 map = GetAddressMap();
223 EXPECT_EQ(0u, map.size()); 331 EXPECT_EQ(0u, map.size());
224 } 332 }
225 333
226 TEST_F(AddressTrackerLinuxTest, IgnoredMessage) { 334 TEST_F(AddressTrackerLinuxTest, IgnoredMessage) {
227 const IPAddressNumber kEmpty; 335 const IPAddressNumber kEmpty;
228 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0)); 336 const IPAddressNumber kAddr0(kAddress0, kAddress0 + arraysize(kAddress0));
229 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3)); 337 const IPAddressNumber kAddr3(kAddress3, kAddress3 + arraysize(kAddress3));
338 bool address_changed;
339 bool link_changed;
230 340
231 Buffer buffer; 341 Buffer buffer;
232 // Ignored family. 342 // Ignored family.
233 MakeMessage(RTM_NEWADDR, 0, AF_UNSPEC, kAddr3, kAddr0, &buffer); 343 MakeAddrMessage(RTM_NEWADDR, 0, AF_UNSPEC, kAddr3, kAddr0, &buffer);
234 // No address. 344 // No address.
235 MakeMessage(RTM_NEWADDR, 0, AF_INET, kEmpty, kEmpty, &buffer); 345 MakeAddrMessage(RTM_NEWADDR, 0, AF_INET, kEmpty, kEmpty, &buffer);
236 // Ignored type. 346 // Ignored type.
237 MakeMessage(RTM_DELROUTE, 0, AF_INET6, kAddr3, kEmpty, &buffer); 347 MakeAddrMessage(RTM_DELROUTE, 0, AF_INET6, kAddr3, kEmpty, &buffer);
238 EXPECT_FALSE(HandleMessage(&buffer[0], buffer.size())); 348 address_changed = false;
349 link_changed = false;
350 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
351 EXPECT_FALSE(address_changed);
352 EXPECT_FALSE(link_changed);
239 EXPECT_EQ(0u, GetAddressMap().size()); 353 EXPECT_EQ(0u, GetAddressMap().size());
240 354
241 // Valid message after ignored messages. 355 // Valid message after ignored messages.
242 NetlinkMessage nlmsg(RTM_NEWADDR); 356 NetlinkMessage nlmsg(RTM_NEWADDR);
243 struct ifaddrmsg msg = {}; 357 struct ifaddrmsg msg = {};
244 msg.ifa_family = AF_INET; 358 msg.ifa_family = AF_INET;
245 nlmsg.AddPayload(&msg, sizeof(msg)); 359 nlmsg.AddPayload(&msg, sizeof(msg));
246 // Ignored attribute. 360 // Ignored attribute.
247 struct ifa_cacheinfo cache_info = {}; 361 struct ifa_cacheinfo cache_info = {};
248 nlmsg.AddAttribute(IFA_CACHEINFO, &cache_info, sizeof(cache_info)); 362 nlmsg.AddAttribute(IFA_CACHEINFO, &cache_info, sizeof(cache_info));
249 nlmsg.AddAttribute(IFA_ADDRESS, &kAddr0[0], kAddr0.size()); 363 nlmsg.AddAttribute(IFA_ADDRESS, &kAddr0[0], kAddr0.size());
250 nlmsg.AppendTo(&buffer); 364 nlmsg.AppendTo(&buffer);
251 365
252 EXPECT_TRUE(HandleMessage(&buffer[0], buffer.size())); 366 address_changed = false;
367 link_changed = false;
368 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
369 EXPECT_TRUE(address_changed);
370 EXPECT_FALSE(link_changed);
253 EXPECT_EQ(1u, GetAddressMap().size()); 371 EXPECT_EQ(1u, GetAddressMap().size());
254 } 372 }
255 373
374 TEST_F(AddressTrackerLinuxTest, AddInterface) {
375 Buffer buffer;
376 bool address_changed;
377 bool link_changed;
378
379 // Ignores loopback
380 MakeLinkMessage(RTM_NEWLINK,
381 IFF_LOOPBACK | IFF_UP | IFF_LOWER_UP | IFF_RUNNING,
382 0,
383 &buffer);
384 address_changed = false;
385 link_changed = false;
386 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
387 EXPECT_FALSE(address_changed);
388 EXPECT_FALSE(link_changed);
389 EXPECT_TRUE(GetOnlineLinks()->empty());
390
391 // Ignores not IFF_LOWER_UP
392 MakeLinkMessage(RTM_NEWLINK,
393 IFF_UP | IFF_RUNNING,
394 0,
395 &buffer);
396 address_changed = false;
397 link_changed = false;
398 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
399 EXPECT_FALSE(address_changed);
400 EXPECT_FALSE(link_changed);
401 EXPECT_TRUE(GetOnlineLinks()->empty());
402
403 // Ignores deletion
404 MakeLinkMessage(RTM_DELLINK,
405 IFF_UP | IFF_LOWER_UP | IFF_RUNNING,
406 0,
407 &buffer);
408 address_changed = false;
409 link_changed = false;
410 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
411 EXPECT_FALSE(address_changed);
412 EXPECT_FALSE(link_changed);
413 EXPECT_TRUE(GetOnlineLinks()->empty());
414
415 // Verify success
416 MakeLinkMessage(RTM_NEWLINK,
417 IFF_UP | IFF_LOWER_UP | IFF_RUNNING,
418 0,
419 &buffer);
420 address_changed = false;
421 link_changed = false;
422 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
423 EXPECT_FALSE(address_changed);
424 EXPECT_TRUE(link_changed);
425 EXPECT_TRUE(GetOnlineLinks()->find(0) != GetOnlineLinks()->end());
szym 2012/11/21 20:14:10 Suggest: |count(value) != 0|
426
427 // Ignores redundant enables
428 address_changed = false;
429 link_changed = false;
430 MakeLinkMessage(RTM_NEWLINK,
431 IFF_UP | IFF_LOWER_UP | IFF_RUNNING,
432 0,
433 &buffer);
434 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
435 EXPECT_FALSE(address_changed);
436 EXPECT_FALSE(link_changed);
437 EXPECT_TRUE(GetOnlineLinks()->find(0) != GetOnlineLinks()->end());
szym 2012/11/21 20:14:10 Suggest also EXPECT_EQ(1, GetOnlineLinks()->size()
438
439 // Verify adding another online device (e.g. VPN) is considered a change
440 address_changed = false;
441 link_changed = false;
442 MakeLinkMessage(RTM_NEWLINK,
443 IFF_UP | IFF_LOWER_UP | IFF_RUNNING,
444 1,
445 &buffer);
446 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
447 EXPECT_FALSE(address_changed);
448 EXPECT_TRUE(link_changed);
449 EXPECT_TRUE(GetOnlineLinks()->find(0) != GetOnlineLinks()->end());
450 EXPECT_TRUE(GetOnlineLinks()->find(1) != GetOnlineLinks()->end());
szym 2012/11/21 20:14:10 Suggest also EXPECT_EQ(2, GetOnlineLinks()->size()
451 }
452
453 TEST_F(AddressTrackerLinuxTest, RemoveInterface) {
454 Buffer buffer;
455 bool address_changed;
456 bool link_changed;
457
458 // Should disappear when not IFF_LOWER_UP
459 MakeLinkMessage(RTM_NEWLINK,
460 IFF_UP | IFF_LOWER_UP | IFF_RUNNING,
461 0,
462 &buffer);
463 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
szym 2012/11/21 20:14:10 Add expectation that GetOnlineLinks is not empty.
464 address_changed = false;
465 link_changed = false;
466 MakeLinkMessage(RTM_NEWLINK,
467 IFF_UP | IFF_RUNNING,
468 0,
469 &buffer);
470 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
471 EXPECT_FALSE(address_changed);
472 EXPECT_TRUE(link_changed);
473 EXPECT_TRUE(GetOnlineLinks()->empty());
474
475 // Ignores redundant disables
476 address_changed = false;
477 link_changed = false;
478 MakeLinkMessage(RTM_NEWLINK,
479 IFF_UP | IFF_RUNNING,
480 0,
481 &buffer);
482 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
483 EXPECT_FALSE(address_changed);
484 EXPECT_FALSE(link_changed);
485 EXPECT_TRUE(GetOnlineLinks()->empty());
486
487 // Ignores deleting down interfaces
488 address_changed = false;
489 link_changed = false;
490 MakeLinkMessage(RTM_DELLINK,
491 IFF_UP | IFF_RUNNING,
492 0,
493 &buffer);
494 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
495 EXPECT_FALSE(address_changed);
496 EXPECT_FALSE(link_changed);
497 EXPECT_TRUE(GetOnlineLinks()->empty());
498
499 // Should disappear when deleted
500 MakeLinkMessage(RTM_NEWLINK,
501 IFF_UP | IFF_LOWER_UP | IFF_RUNNING,
502 0,
503 &buffer);
504 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
szym 2012/11/21 20:14:10 ditto
505 address_changed = false;
506 link_changed = false;
507 MakeLinkMessage(RTM_DELLINK,
508 IFF_UP | IFF_LOWER_UP | IFF_RUNNING,
509 0,
510 &buffer);
511 HandleMessage(&buffer[0], buffer.size(), &address_changed, &link_changed);
512 EXPECT_FALSE(address_changed);
513 EXPECT_TRUE(link_changed);
514 EXPECT_TRUE(GetOnlineLinks()->empty());
515 }
516
256 } // namespace 517 } // namespace
257 518
258 } // namespace internal 519 } // namespace internal
259 } // namespace net 520 } // namespace net
OLDNEW
« no previous file with comments | « net/base/address_tracker_linux.cc ('k') | net/base/network_change_notifier_linux.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698