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, |
szym
2013/04/17 22:11:12
This is not a valid DNS response. The pointer is t
Noam Samuel
2013/04/18 19:03:17
Done.
|
+ 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 |
szym
2013/04/17 22:11:12
I suggest you reuse the response packets in dns_te
Noam Samuel
2013/04/18 19:03:17
Done.
|
+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()); |