| Index: net/dns/dns_response_unittest.cc
|
| diff --git a/net/dns/dns_response_unittest.cc b/net/dns/dns_response_unittest.cc
|
| index 760fe47e994d5eafff54c2e600070b5974231db2..b19679be1107f6878e41fbaf792b09d79e5e9d97 100644
|
| --- a/net/dns/dns_response_unittest.cc
|
| +++ b/net/dns/dns_response_unittest.cc
|
| @@ -245,6 +245,248 @@ TEST(DnsResponseTest, InitParse) {
|
| EXPECT_FALSE(parser.ReadRecord(&record));
|
| }
|
|
|
| +// TODO(noamsml): Simplify this test
|
| +TEST(DnsResponseTest, GetResponseOffset) {
|
| + // Easiest way to comput size of QNAME data
|
| + const char qname_data[] = "\x0A""codereview""\x08""chromium""\x03""org";
|
| + const base::StringPiece qname(qname_data, sizeof(qname_data));
|
| + const size_t qsec_length = qname.size() + 4;
|
| +
|
| + const uint8 response_data[] = {
|
| + // Header
|
| + 0xca, 0xfe, // ID
|
| + 0x81, 0x80, // Standard query response, RA, no error
|
| + 0x00, 0x01, // 1 question
|
| + 0x00, 0x02, // 2 RRs (answers)
|
| + 0x00, 0x00, // 0 authority RRs
|
| + 0x00, 0x00, // 0 additional RRs
|
| +
|
| + // Question
|
| + // This part is echoed back from the respective query.
|
| + 0x0a, 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w',
|
| + 0x08, 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm',
|
| + 0x03, 'o', 'r', 'g',
|
| + 0x00,
|
| + 0x00, 0x01, // TYPE is A.
|
| + 0x00, 0x01, // CLASS is IN.
|
| +
|
| + // Answer 1
|
| + 0xc0, 0x0c, // NAME is a pointer to name in Question section.
|
| + 0x00, 0x05, // TYPE is CNAME.
|
| + 0x00, 0x01, // CLASS is IN.
|
| + 0x00, 0x01, // TTL (4 bytes) is 20 hours, 47 minutes, 48 seconds.
|
| + 0x24, 0x74,
|
| + 0x00, 0x12, // RDLENGTH is 18 bytes.
|
| + // ghs.l.google.com in DNS format.
|
| + 0x03, 'g', 'h', 's',
|
| + 0x01, 'l',
|
| + 0x06, 'g', 'o', 'o', 'g', 'l', 'e',
|
| + 0x03, 'c', 'o', 'm',
|
| + 0x00,
|
| +
|
| + // Answer 2
|
| + 0xc0, 0x35, // NAME is a pointer to name in Answer 1.
|
| + 0x00, 0x01, // TYPE is A.
|
| + 0x00, 0x01, // CLASS is IN.
|
| + 0x00, 0x00, // TTL (4 bytes) is 53 seconds.
|
| + 0x00, 0x35,
|
| + 0x00, 0x04, // RDLENGTH is 4 bytes.
|
| + 0x4a, 0x7d, // RDATA is the IP: 74.125.95.121
|
| + 0x5f, 0x79,
|
| + };
|
| +
|
| + DnsResponse resp;
|
| + memcpy(resp.io_buffer()->data(), response_data, sizeof(response_data));
|
| +
|
| + EXPECT_EQ(sizeof(dns_protocol::Header) + qsec_length,
|
| + resp.GetResponseOffset());
|
| +}
|
| +
|
| +// TODO(noamsml): Simplify this test
|
| +TEST(DnsResponseTest, GetQuestionSectionSizeNoQuestion) {
|
| + const uint8 response_data[] = {
|
| + // Header
|
| + 0xca, 0xfe, // ID
|
| + 0x81, 0x80, // Standard query response, RA, no error
|
| + 0x00, 0x00, // 1 question
|
| + 0x00, 0x02, // 2 RRs (answers)
|
| + 0x00, 0x00, // 0 authority RRs
|
| + 0x00, 0x00, // 0 additional RRs
|
| +
|
| + // Answer 1
|
| + 0xc0, 0x0c, // NAME is a pointer to name in Question section.
|
| + 0x00, 0x05, // TYPE is CNAME.
|
| + 0x00, 0x01, // CLASS is IN.
|
| + 0x00, 0x01, // TTL (4 bytes) is 20 hours, 47 minutes, 48 seconds.
|
| + 0x24, 0x74,
|
| + 0x00, 0x12, // RDLENGTH is 18 bytes.
|
| + // ghs.l.google.com in DNS format.
|
| + 0x03, 'g', 'h', 's',
|
| + 0x01, 'l',
|
| + 0x06, 'g', 'o', 'o', 'g', 'l', 'e',
|
| + 0x03, 'c', 'o', 'm',
|
| + 0x00,
|
| +
|
| + // Answer 2
|
| + 0xc0, 0x35, // NAME is a pointer to name in Answer 1.
|
| + 0x00, 0x01, // TYPE is A.
|
| + 0x00, 0x01, // CLASS is IN.
|
| + 0x00, 0x00, // TTL (4 bytes) is 53 seconds.
|
| + 0x00, 0x35,
|
| + 0x00, 0x04, // RDLENGTH is 4 bytes.
|
| + 0x4a, 0x7d, // RDATA is the IP: 74.125.95.121
|
| + 0x5f, 0x79,
|
| + };
|
| +
|
| + DnsResponse resp;
|
| + memcpy(resp.io_buffer()->data(), response_data, sizeof(response_data));
|
| +
|
| + EXPECT_EQ(sizeof(dns_protocol::Header), resp.GetResponseOffset());
|
| +}
|
| +
|
| +// TODO(noamsml): Simplify this test
|
| +TEST(DnsResponseTest, GetQuestionSectionSizeTwoQuestions) {
|
| + // Easiest way to compute size of QNAME data
|
| + const char qname_data[] = "\x0A""codereview""\x08""chromium""\x03""org";
|
| + const base::StringPiece qname(qname_data, sizeof(qname_data));
|
| + const char qname2_data[] = "\x0B""codereview2""\xc0\x18";
|
| + const base::StringPiece qname2(qname2_data, sizeof(qname2_data));
|
| + const size_t qsec_length = qname.size() + qname2.size() + 8;
|
| +
|
| + const uint8 response_data[] = {
|
| + // Header
|
| + 0xca, 0xfe, // ID
|
| + 0x81, 0x80, // Standard query response, RA, no error
|
| + 0x00, 0x02, // 1 question
|
| + 0x00, 0x02, // 2 RRs (answers)
|
| + 0x00, 0x00, // 0 authority RRs
|
| + 0x00, 0x00, // 0 additional RRs
|
| +
|
| + // Question 1
|
| + 0x0a, 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w',
|
| + 0x08, 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm',
|
| + 0x03, 'o', 'r', 'g',
|
| + 0x00,
|
| + 0x00, 0x01, // TYPE is A.
|
| + 0x00, 0x01, // CLASS is IN.
|
| +
|
| + // Question 2
|
| + 0x0b, 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w', '2',
|
| + 0xc0, 0x18, // pointer to "chromium.org"
|
| + 0x00,
|
| + 0x00, 0x01, // TYPE is A.
|
| + 0x00, 0x01, // CLASS is IN.
|
| +
|
| + // Answer 1
|
| + 0xc0, 0x0c, // NAME is a pointer to name in Question section.
|
| + 0x00, 0x05, // TYPE is CNAME.
|
| + 0x00, 0x01, // CLASS is IN.
|
| + 0x00, 0x01, // TTL (4 bytes) is 20 hours, 47 minutes, 48 seconds.
|
| + 0x24, 0x74,
|
| + 0x00, 0x12, // RDLENGTH is 18 bytes.
|
| + // ghs.l.google.com in DNS format.
|
| + 0x03, 'g', 'h', 's',
|
| + 0x01, 'l',
|
| + 0x06, 'g', 'o', 'o', 'g', 'l', 'e',
|
| + 0x03, 'c', 'o', 'm',
|
| + 0x00,
|
| +
|
| + // Answer 2
|
| + 0xc0, 0x35, // NAME is a pointer to name in Answer 1.
|
| + 0x00, 0x01, // TYPE is A.
|
| + 0x00, 0x01, // CLASS is IN.
|
| + 0x00, 0x00, // TTL (4 bytes) is 53 seconds.
|
| + 0x00, 0x35,
|
| + 0x00, 0x04, // RDLENGTH is 4 bytes.
|
| + 0x4a, 0x7d, // RDATA is the IP: 74.125.95.121
|
| + 0x5f, 0x79,
|
| + };
|
| +
|
| + DnsResponse resp;
|
| + memcpy(resp.io_buffer()->data(), response_data, sizeof(response_data));
|
| +
|
| + EXPECT_EQ(sizeof(dns_protocol::Header) + qsec_length,
|
| + resp.GetResponseOffset());
|
| +}
|
| +
|
| +// TODO(noamsml): simplify test
|
| +TEST(DnsResponseTest, InitParseNoQuery) {
|
| + // This includes \0 at the end.
|
| + const char qname_data[] = "\x0A""codereview""\x08""chromium""\x03""org";
|
| + const base::StringPiece qname(qname_data, sizeof(qname_data));
|
| + // Compilers want to copy when binding temporary to const &, so must use heap.
|
| + scoped_ptr<DnsQuery> query(new DnsQuery(0xcafe, qname, dns_protocol::kTypeA));
|
| +
|
| + const uint8 response_data[] = {
|
| + // Header
|
| + 0xca, 0xfe, // ID
|
| + 0x81, 0x80, // Standard query response, RA, no error
|
| + 0x00, 0x01, // 1 question
|
| + 0x00, 0x02, // 2 RRs (answers)
|
| + 0x00, 0x00, // 0 authority RRs
|
| + 0x00, 0x00, // 0 additional RRs
|
| +
|
| + // Question
|
| + // This part is echoed back from the respective query.
|
| + 0x0a, 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w',
|
| + 0x08, 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm',
|
| + 0x03, 'o', 'r', 'g',
|
| + 0x00,
|
| + 0x00, 0x01, // TYPE is A.
|
| + 0x00, 0x01, // CLASS is IN.
|
| +
|
| + // Answer 1
|
| + 0xc0, 0x0c, // NAME is a pointer to name in Question section.
|
| + 0x00, 0x05, // TYPE is CNAME.
|
| + 0x00, 0x01, // CLASS is IN.
|
| + 0x00, 0x01, // TTL (4 bytes) is 20 hours, 47 minutes, 48 seconds.
|
| + 0x24, 0x74,
|
| + 0x00, 0x12, // RDLENGTH is 18 bytes.
|
| + // ghs.l.google.com in DNS format.
|
| + 0x03, 'g', 'h', 's',
|
| + 0x01, 'l',
|
| + 0x06, 'g', 'o', 'o', 'g', 'l', 'e',
|
| + 0x03, 'c', 'o', 'm',
|
| + 0x00,
|
| +
|
| + // Answer 2
|
| + 0xc0, 0x35, // NAME is a pointer to name in Answer 1.
|
| + 0x00, 0x01, // TYPE is A.
|
| + 0x00, 0x01, // CLASS is IN.
|
| + 0x00, 0x00, // TTL (4 bytes) is 53 seconds.
|
| + 0x00, 0x35,
|
| + 0x00, 0x04, // RDLENGTH is 4 bytes.
|
| + 0x4a, 0x7d, // RDATA is the IP: 74.125.95.121
|
| + 0x5f, 0x79,
|
| + };
|
| +
|
| + DnsResponse resp;
|
| + memcpy(resp.io_buffer()->data(), response_data, sizeof(response_data));
|
| +
|
| + // Accept matching question.
|
| + EXPECT_TRUE(resp.InitParse(sizeof(response_data)));
|
| + EXPECT_TRUE(resp.IsValid());
|
| +
|
| + // Check header access.
|
| + EXPECT_EQ(0x8180, resp.flags());
|
| + EXPECT_EQ(0x0, resp.rcode());
|
| + EXPECT_EQ(2u, resp.answer_count());
|
| +
|
| + // Check question access.
|
| + EXPECT_EQ(query->qname(), resp.qname());
|
| + EXPECT_EQ(query->qtype(), resp.qtype());
|
| + EXPECT_EQ("codereview.chromium.org", resp.GetDottedName());
|
| +
|
| + DnsResourceRecord record;
|
| + DnsRecordParser parser = resp.Parser();
|
| + EXPECT_TRUE(parser.ReadRecord(&record));
|
| + EXPECT_FALSE(parser.AtEnd());
|
| + EXPECT_TRUE(parser.ReadRecord(&record));
|
| + EXPECT_TRUE(parser.AtEnd());
|
| + EXPECT_FALSE(parser.ReadRecord(&record));
|
| +}
|
| +
|
| +
|
| void VerifyAddressList(const std::vector<const char*>& ip_addresses,
|
| const AddressList& addrlist) {
|
| ASSERT_EQ(ip_addresses.size(), addrlist.size());
|
|
|