Chromium Code Reviews| 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> | |
| 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 Loading... | |
| 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 |
| OLD | NEW |