Chromium Code Reviews| Index: net/dns/dns_response_unittest.cc |
| diff --git a/net/dns/dns_response_unittest.cc b/net/dns/dns_response_unittest.cc |
| index 41f3a7296929c94add82acd33486d3be91fe4e1f..a2103fb1cf73a38992b1d37196c0b56d84508bdb 100644 |
| --- a/net/dns/dns_response_unittest.cc |
| +++ b/net/dns/dns_response_unittest.cc |
| @@ -4,9 +4,14 @@ |
| #include "net/dns/dns_response.h" |
| +#include "base/time.h" |
| +#include "net/base/address_list.h" |
| #include "net/base/io_buffer.h" |
| +#include "net/base/net_util.h" |
| +#include "net/base/sys_addrinfo.h" |
| #include "net/dns/dns_protocol.h" |
| #include "net/dns/dns_query.h" |
| +#include "net/dns/dns_test_util.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| namespace net { |
| @@ -24,7 +29,7 @@ TEST(DnsRecordParserTest, Constructor) { |
| EXPECT_TRUE(DnsRecordParser(data, 1, 1).AtEnd()); |
| } |
| -TEST(DnsRecordParserTest, ParseName) { |
| +TEST(DnsRecordParserTest, ReadName) { |
| const uint8 data[] = { |
| // all labels "foo.example.com" |
| 0x03, 'f', 'o', 'o', |
| @@ -46,31 +51,31 @@ TEST(DnsRecordParserTest, ParseName) { |
| DnsRecordParser parser(data, sizeof(data), 0); |
| ASSERT_TRUE(parser.IsValid()); |
| - EXPECT_EQ(0x11, parser.ParseName(data + 0x00, &out)); |
| + EXPECT_EQ(0x11, parser.ReadName(data + 0x00, &out)); |
| EXPECT_EQ("foo.example.com", out); |
| // Check that the last "." is never stored. |
| out.clear(); |
| - EXPECT_EQ(0x1, parser.ParseName(data + 0x10, &out)); |
| + EXPECT_EQ(0x1, parser.ReadName(data + 0x10, &out)); |
| EXPECT_EQ("", out); |
| out.clear(); |
| - EXPECT_EQ(0x6, parser.ParseName(data + 0x11, &out)); |
| + EXPECT_EQ(0x6, parser.ReadName(data + 0x11, &out)); |
| EXPECT_EQ("bar.example.com", out); |
| out.clear(); |
| - EXPECT_EQ(0x2, parser.ParseName(data + 0x17, &out)); |
| + EXPECT_EQ(0x2, parser.ReadName(data + 0x17, &out)); |
| EXPECT_EQ("bar.example.com", out); |
| // Parse name without storing it. |
| - EXPECT_EQ(0x11, parser.ParseName(data + 0x00, NULL)); |
| - EXPECT_EQ(0x1, parser.ParseName(data + 0x10, NULL)); |
| - EXPECT_EQ(0x6, parser.ParseName(data + 0x11, NULL)); |
| - EXPECT_EQ(0x2, parser.ParseName(data + 0x17, NULL)); |
| + EXPECT_EQ(0x11, parser.ReadName(data + 0x00, NULL)); |
| + EXPECT_EQ(0x1, parser.ReadName(data + 0x10, NULL)); |
| + EXPECT_EQ(0x6, parser.ReadName(data + 0x11, NULL)); |
| + EXPECT_EQ(0x2, parser.ReadName(data + 0x17, NULL)); |
| // Check that it works even if initial position is different. |
| parser = DnsRecordParser(data, sizeof(data), 0x12); |
| - EXPECT_EQ(0x6, parser.ParseName(data + 0x11, NULL)); |
| + EXPECT_EQ(0x6, parser.ReadName(data + 0x11, NULL)); |
| } |
| -TEST(DnsRecordParserTest, ParseNameFail) { |
| +TEST(DnsRecordParserTest, ReadNameFail) { |
| const uint8 data[] = { |
| // label length beyond packet |
| 0x30, 'x', 'x', |
| @@ -90,15 +95,15 @@ TEST(DnsRecordParserTest, ParseNameFail) { |
| ASSERT_TRUE(parser.IsValid()); |
| std::string out; |
| - EXPECT_EQ(0, parser.ParseName(data + 0x00, &out)); |
| - EXPECT_EQ(0, parser.ParseName(data + 0x04, &out)); |
| - EXPECT_EQ(0, parser.ParseName(data + 0x08, &out)); |
| - EXPECT_EQ(0, parser.ParseName(data + 0x0a, &out)); |
| - EXPECT_EQ(0, parser.ParseName(data + 0x0c, &out)); |
| - EXPECT_EQ(0, parser.ParseName(data + 0x0e, &out)); |
| + EXPECT_EQ(0, parser.ReadName(data + 0x00, &out)); |
| + EXPECT_EQ(0, parser.ReadName(data + 0x04, &out)); |
| + EXPECT_EQ(0, parser.ReadName(data + 0x08, &out)); |
| + EXPECT_EQ(0, parser.ReadName(data + 0x0a, &out)); |
| + EXPECT_EQ(0, parser.ReadName(data + 0x0c, &out)); |
| + EXPECT_EQ(0, parser.ReadName(data + 0x0e, &out)); |
| } |
| -TEST(DnsRecordParserTest, ParseRecord) { |
| +TEST(DnsRecordParserTest, ReadRecord) { |
| const uint8 data[] = { |
| // Type CNAME record. |
| 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e', |
| @@ -124,17 +129,17 @@ TEST(DnsRecordParserTest, ParseRecord) { |
| DnsRecordParser parser(data, sizeof(data), 0); |
| DnsResourceRecord record; |
| - EXPECT_TRUE(parser.ParseRecord(&record)); |
| + EXPECT_TRUE(parser.ReadRecord(&record)); |
| EXPECT_EQ("example.com", record.name); |
| EXPECT_EQ(dns_protocol::kTypeCNAME, record.type); |
| EXPECT_EQ(dns_protocol::kClassIN, record.klass); |
| EXPECT_EQ(0x00012474u, record.ttl); |
| EXPECT_EQ(6u, record.rdata.length()); |
| - EXPECT_EQ(6, parser.ParseName(record.rdata.data(), &out)); |
| + EXPECT_EQ(6, parser.ReadName(record.rdata.data(), &out)); |
| EXPECT_EQ("foo.example.com", out); |
| EXPECT_FALSE(parser.AtEnd()); |
| - EXPECT_TRUE(parser.ParseRecord(&record)); |
| + EXPECT_TRUE(parser.ReadRecord(&record)); |
| EXPECT_EQ("bar.example.com", record.name); |
| EXPECT_EQ(dns_protocol::kTypeA, record.type); |
| EXPECT_EQ(dns_protocol::kClassIN, record.klass); |
| @@ -145,9 +150,9 @@ TEST(DnsRecordParserTest, ParseRecord) { |
| // Test truncated record. |
| parser = DnsRecordParser(data, sizeof(data) - 2, 0); |
| - EXPECT_TRUE(parser.ParseRecord(&record)); |
| + EXPECT_TRUE(parser.ReadRecord(&record)); |
| EXPECT_FALSE(parser.AtEnd()); |
| - EXPECT_FALSE(parser.ParseRecord(&record)); |
| + EXPECT_FALSE(parser.ReadRecord(&record)); |
| } |
| TEST(DnsResponseTest, InitParse) { |
| @@ -234,11 +239,89 @@ TEST(DnsResponseTest, InitParse) { |
| DnsResourceRecord record; |
| DnsRecordParser parser = resp.Parser(); |
| - EXPECT_TRUE(parser.ParseRecord(&record)); |
| + EXPECT_TRUE(parser.ReadRecord(&record)); |
| EXPECT_FALSE(parser.AtEnd()); |
| - EXPECT_TRUE(parser.ParseRecord(&record)); |
| + EXPECT_TRUE(parser.ReadRecord(&record)); |
| EXPECT_TRUE(parser.AtEnd()); |
| - EXPECT_FALSE(parser.ParseRecord(&record)); |
| + EXPECT_FALSE(parser.ReadRecord(&record)); |
| +} |
| + |
| +void VerifyAddressList(const std::vector<const char*>& ip_addresses, |
| + const AddressList& addrlist) { |
| + ASSERT_GT(ip_addresses.size(), 0u); |
| + ASSERT_NE(static_cast<addrinfo*>(NULL), addrlist.head()); |
| + |
| + IPAddressNumber ip_number; |
| + const struct addrinfo* ainfo = addrlist.head(); |
| + for (std::vector<const char*>::const_iterator i = ip_addresses.begin(); |
| + i != ip_addresses.end(); ++i, ainfo = ainfo->ai_next) { |
| + ASSERT_NE(static_cast<addrinfo*>(NULL), ainfo); |
| + EXPECT_EQ(sizeof(struct sockaddr_in), |
| + static_cast<size_t>(ainfo->ai_addrlen)); |
| + |
| + const struct sockaddr* sa = ainfo->ai_addr; |
| + EXPECT_STREQ(*i, NetAddressToString(sa, ainfo->ai_addrlen).c_str()); |
| + } |
| + ASSERT_EQ(static_cast<addrinfo*>(NULL), ainfo); |
| +} |
| + |
| +TEST(DnsResponseTest, ParseToAddressList) { |
| + const struct TestCase { |
| + const uint8* query_data; |
| + size_t query_size; |
| + const uint8* response_data; |
| + size_t response_size; |
| + const char* const* expected_addresses; |
| + size_t num_expected_addresses; |
| + const char* expected_cname; |
| + int expected_ttl_sec; |
| + } cases[] = { |
| + { |
| + kT0QueryDatagram, arraysize(kT0QueryDatagram), |
| + kT0ResponseDatagram, arraysize(kT0ResponseDatagram), |
| + kT0IpAddresses, arraysize(kT0IpAddresses), |
| + kT0CanonName, |
| + kT0TTL, |
| + }, |
| + { |
| + kT1QueryDatagram, arraysize(kT1QueryDatagram), |
| + kT1ResponseDatagram, arraysize(kT1ResponseDatagram), |
| + kT1IpAddresses, arraysize(kT1IpAddresses), |
| + kT1CanonName, |
| + kT1TTL, |
| + }, |
| + { |
| + kT2QueryDatagram, arraysize(kT2QueryDatagram), |
| + kT2ResponseDatagram, arraysize(kT2ResponseDatagram), |
| + kT2IpAddresses, arraysize(kT2IpAddresses), |
| + kT2CanonName, |
| + kT2TTL, |
| + }, |
| + { |
| + kT3QueryDatagram, arraysize(kT3QueryDatagram), |
| + kT3ResponseDatagram, arraysize(kT3ResponseDatagram), |
| + kT3IpAddresses, arraysize(kT3IpAddresses), |
| + kT3CanonName, |
| + kT3TTL, |
| + }, |
| + }; |
| + |
| + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { |
|
cbentzel
2012/02/15 19:48:35
You should add tests for each of the unsuccessful
|
| + const TestCase& t = cases[i]; |
| + DnsResponse response(t.response_data, t.response_size, t.query_size); |
| + AddressList addr_list; |
| + base::TimeDelta ttl; |
| + EXPECT_EQ(DnsResponse::DNS_SUCCESS, |
| + response.ParseToAddressList(&addr_list, &ttl)); |
| + std::vector<const char*> expected_addresses( |
| + t.expected_addresses, |
| + t.expected_addresses + t.num_expected_addresses); |
| + VerifyAddressList(expected_addresses, addr_list); |
| + std::string cname; |
| + ASSERT_TRUE(addr_list.GetCanonicalName(&cname)); |
| + EXPECT_EQ(t.expected_cname, cname); |
| + EXPECT_EQ(base::TimeDelta::FromSeconds(t.expected_ttl_sec), ttl); |
| + } |
| } |
| } // namespace |