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/dns/dns_response.h" | 5 #include "net/dns/dns_response.h" |
6 | 6 |
| 7 #include "base/time.h" |
| 8 #include "net/base/address_list.h" |
7 #include "net/base/io_buffer.h" | 9 #include "net/base/io_buffer.h" |
| 10 #include "net/base/net_util.h" |
| 11 #include "net/base/sys_addrinfo.h" |
8 #include "net/dns/dns_protocol.h" | 12 #include "net/dns/dns_protocol.h" |
9 #include "net/dns/dns_query.h" | 13 #include "net/dns/dns_query.h" |
| 14 #include "net/dns/dns_test_util.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
11 | 16 |
12 namespace net { | 17 namespace net { |
13 | 18 |
14 namespace { | 19 namespace { |
15 | 20 |
16 TEST(DnsRecordParserTest, Constructor) { | 21 TEST(DnsRecordParserTest, Constructor) { |
17 const char data[] = { 0 }; | 22 const char data[] = { 0 }; |
18 | 23 |
19 EXPECT_FALSE(DnsRecordParser().IsValid()); | 24 EXPECT_FALSE(DnsRecordParser().IsValid()); |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 | 239 |
235 DnsResourceRecord record; | 240 DnsResourceRecord record; |
236 DnsRecordParser parser = resp.Parser(); | 241 DnsRecordParser parser = resp.Parser(); |
237 EXPECT_TRUE(parser.ParseRecord(&record)); | 242 EXPECT_TRUE(parser.ParseRecord(&record)); |
238 EXPECT_FALSE(parser.AtEnd()); | 243 EXPECT_FALSE(parser.AtEnd()); |
239 EXPECT_TRUE(parser.ParseRecord(&record)); | 244 EXPECT_TRUE(parser.ParseRecord(&record)); |
240 EXPECT_TRUE(parser.AtEnd()); | 245 EXPECT_TRUE(parser.AtEnd()); |
241 EXPECT_FALSE(parser.ParseRecord(&record)); | 246 EXPECT_FALSE(parser.ParseRecord(&record)); |
242 } | 247 } |
243 | 248 |
| 249 void VerifyAddressList(const std::vector<const char*>& ip_addresses, |
| 250 const AddressList& addrlist) { |
| 251 ASSERT_GT(ip_addresses.size(), 0u); |
| 252 ASSERT_NE(static_cast<addrinfo*>(NULL), addrlist.head()); |
| 253 |
| 254 IPAddressNumber ip_number; |
| 255 const struct addrinfo* ainfo = addrlist.head(); |
| 256 for (std::vector<const char*>::const_iterator i = ip_addresses.begin(); |
| 257 i != ip_addresses.end(); ++i, ainfo = ainfo->ai_next) { |
| 258 ASSERT_NE(static_cast<addrinfo*>(NULL), ainfo); |
| 259 EXPECT_EQ(sizeof(struct sockaddr_in), |
| 260 static_cast<size_t>(ainfo->ai_addrlen)); |
| 261 |
| 262 const struct sockaddr* sa = ainfo->ai_addr; |
| 263 EXPECT_STREQ(*i, NetAddressToString(sa, ainfo->ai_addrlen).c_str()); |
| 264 } |
| 265 ASSERT_EQ(static_cast<addrinfo*>(NULL), ainfo); |
| 266 } |
| 267 |
| 268 TEST(DnsResponseTest, ParseAddressList) { |
| 269 const struct TestCase { |
| 270 const uint8* query_data; |
| 271 size_t query_size; |
| 272 const uint8* response_data; |
| 273 size_t response_size; |
| 274 const char* const* expected_addresses; |
| 275 size_t num_expected_addresses; |
| 276 const char* expected_cname; |
| 277 int expected_ttl_sec; |
| 278 } cases[] = { |
| 279 { |
| 280 kT0QueryDatagram, arraysize(kT0QueryDatagram), |
| 281 kT0ResponseDatagram, arraysize(kT0ResponseDatagram), |
| 282 kT0IpAddresses, arraysize(kT0IpAddresses), |
| 283 kT0CanonName, |
| 284 kT0TTL, |
| 285 }, |
| 286 { |
| 287 kT1QueryDatagram, arraysize(kT1QueryDatagram), |
| 288 kT1ResponseDatagram, arraysize(kT1ResponseDatagram), |
| 289 kT1IpAddresses, arraysize(kT1IpAddresses), |
| 290 kT1CanonName, |
| 291 kT1TTL, |
| 292 }, |
| 293 { |
| 294 kT2QueryDatagram, arraysize(kT2QueryDatagram), |
| 295 kT2ResponseDatagram, arraysize(kT2ResponseDatagram), |
| 296 kT2IpAddresses, arraysize(kT2IpAddresses), |
| 297 kT2CanonName, |
| 298 kT2TTL, |
| 299 }, |
| 300 { |
| 301 kT3QueryDatagram, arraysize(kT3QueryDatagram), |
| 302 kT3ResponseDatagram, arraysize(kT3ResponseDatagram), |
| 303 kT3IpAddresses, arraysize(kT3IpAddresses), |
| 304 kT3CanonName, |
| 305 kT3TTL, |
| 306 }, |
| 307 }; |
| 308 |
| 309 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { |
| 310 const TestCase& t = cases[i]; |
| 311 DnsResponse response(t.response_data, t.response_size, t.query_size); |
| 312 AddressList addr_list; |
| 313 base::TimeDelta ttl; |
| 314 EXPECT_TRUE(response.ParseAddressList(&addr_list, &ttl)); |
| 315 std::vector<const char*> expected_addresses( |
| 316 t.expected_addresses, |
| 317 t.expected_addresses + t.num_expected_addresses); |
| 318 VerifyAddressList(expected_addresses, addr_list); |
| 319 std::string cname; |
| 320 ASSERT_TRUE(addr_list.GetCanonicalName(&cname)); |
| 321 EXPECT_EQ(t.expected_cname, cname); |
| 322 EXPECT_EQ(base::TimeDelta::FromSeconds(t.expected_ttl_sec), ttl); |
| 323 } |
| 324 } |
| 325 |
244 } // namespace | 326 } // namespace |
245 | 327 |
246 } // namespace net | 328 } // namespace net |
OLD | NEW |