1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/base/net_util.h"
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/dns/dns_response.h"
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/dns/record_rdata.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net {
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::StringPiece MakeStringPiece(const uint8* data, unsigned size) {
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char* data_cc = reinterpret_cast<const char*>(data);
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return base::StringPiece(data_cc, size);
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(RecordRdataTest, ParseSrvRecord) {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SrvRecordRdata> record1_obj;
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SrvRecordRdata> record2_obj;
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // These are just the rdata portions of the DNS records, rather than complete
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // records, but it works well enough for this test.
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const uint8 record[] = {
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x00, 0x01,
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x00, 0x02,
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x00, 0x50,
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x03, 'w', 'w', 'w',
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x06, 'g', 'o', 'o', 'g', 'l', 'e',
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x03, 'c', 'o', 'm',
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x00,
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x01, 0x01,
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x01, 0x02,
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x01, 0x03,
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x04, 'w', 'w', 'w', '2',
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0xc0, 0x0a,  // Pointer to "google.com"
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DnsRecordParser parser(record, sizeof(record), 0);
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const unsigned first_record_len = 22;
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::StringPiece record1_strpiece = MakeStringPiece(
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      record, first_record_len);
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::StringPiece record2_strpiece = MakeStringPiece(
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      record + first_record_len, sizeof(record) - first_record_len);
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  record1_obj = SrvRecordRdata::Create(record1_strpiece, parser);
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(record1_obj != NULL);
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(1, record1_obj->priority());
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(2, record1_obj->weight());
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(80, record1_obj->port());
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ("www.google.com", record1_obj->target());
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  record2_obj = SrvRecordRdata::Create(record2_strpiece, parser);
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(record2_obj != NULL);
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(257, record2_obj->priority());
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(258, record2_obj->weight());
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(259, record2_obj->port());
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ("www2.google.com", record2_obj->target());
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(record1_obj->IsEqual(record1_obj.get()));
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_FALSE(record1_obj->IsEqual(record2_obj.get()));
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(RecordRdataTest, ParseARecord) {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<ARecordRdata> record_obj;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // These are just the rdata portions of the DNS records, rather than complete
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // records, but it works well enough for this test.
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const uint8 record[] = {
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x7F, 0x00, 0x00, 0x01  // 127.0.0.1
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DnsRecordParser parser(record, sizeof(record), 0);
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::StringPiece record_strpiece = MakeStringPiece(record, sizeof(record));
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  record_obj = ARecordRdata::Create(record_strpiece, parser);
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(record_obj != NULL);
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ("127.0.0.1", IPAddressToString(record_obj->address()));
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(record_obj->IsEqual(record_obj.get()));
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(RecordRdataTest, ParseAAAARecord) {
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<AAAARecordRdata> record_obj;
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // These are just the rdata portions of the DNS records, rather than complete
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // records, but it works well enough for this test.
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const uint8 record[] = {
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x12, 0x34, 0x56, 0x78,
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x00, 0x00, 0x00, 0x00,
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x00, 0x00, 0x00, 0x00,
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x00, 0x00, 0x00, 0x09  // 1234:5678::9A
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser(record, sizeof(record), 0);
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::StringPiece record_strpiece = MakeStringPiece(record, sizeof(record));
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record_obj = AAAARecordRdata::Create(record_strpiece, parser);
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(record_obj != NULL);
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ("1234:5678::9",
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            IPAddressToString(record_obj->address()));
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(record_obj->IsEqual(record_obj.get()));
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(RecordRdataTest, ParseCnameRecord) {
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<CnameRecordRdata> record_obj;
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // These are just the rdata portions of the DNS records, rather than complete
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // records, but it works well enough for this test.
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const uint8 record[] = {
120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x03, 'w', 'w', 'w',
121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x06, 'g', 'o', 'o', 'g', 'l', 'e',
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x03, 'c', 'o', 'm',
123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x00
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DnsRecordParser parser(record, sizeof(record), 0);
127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::StringPiece record_strpiece = MakeStringPiece(record, sizeof(record));
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  record_obj = CnameRecordRdata::Create(record_strpiece, parser);
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(record_obj != NULL);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ("www.google.com", record_obj->cname());
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(record_obj->IsEqual(record_obj.get()));
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(RecordRdataTest, ParsePtrRecord) {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<PtrRecordRdata> record_obj;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // These are just the rdata portions of the DNS records, rather than complete
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // records, but it works well enough for this test.
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const uint8 record[] = {
144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x03, 'w', 'w', 'w',
145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x06, 'g', 'o', 'o', 'g', 'l', 'e',
146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x03, 'c', 'o', 'm',
147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x00
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DnsRecordParser parser(record, sizeof(record), 0);
151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::StringPiece record_strpiece = MakeStringPiece(record, sizeof(record));
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  record_obj = PtrRecordRdata::Create(record_strpiece, parser);
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(record_obj != NULL);
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ("www.google.com", record_obj->ptrdomain());
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(record_obj->IsEqual(record_obj.get()));
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(RecordRdataTest, ParseTxtRecord) {
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<TxtRecordRdata> record_obj;
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // These are just the rdata portions of the DNS records, rather than complete
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // records, but it works well enough for this test.
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const uint8 record[] = {
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x03, 'w', 'w', 'w',
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x06, 'g', 'o', 'o', 'g', 'l', 'e',
170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x03, 'c', 'o', 'm'
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DnsRecordParser parser(record, sizeof(record), 0);
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::StringPiece record_strpiece = MakeStringPiece(record, sizeof(record));
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  record_obj = TxtRecordRdata::Create(record_strpiece, parser);
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(record_obj != NULL);
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> expected;
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.push_back("www");
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.push_back("google");
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected.push_back("com");
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(expected, record_obj->texts());
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(record_obj->IsEqual(record_obj.get()));
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(RecordRdataTest, ParseNsecRecord) {
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<NsecRecordRdata> record_obj;
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // These are just the rdata portions of the DNS records, rather than complete
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // records, but it works well enough for this test.
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const uint8 record[] = {
196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x03, 'w', 'w', 'w',
197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x06, 'g', 'o', 'o', 'g', 'l', 'e',
198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x03, 'c', 'o', 'm',
199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x00,
200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    0x00, 0x02, 0x40, 0x01
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DnsRecordParser parser(record, sizeof(record), 0);
204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::StringPiece record_strpiece = MakeStringPiece(record, sizeof(record));
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  record_obj = NsecRecordRdata::Create(record_strpiece, parser);
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(record_obj != NULL);
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_EQ(16u, record_obj->bitmap_length());
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(record_obj->GetBit(0));
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(record_obj->GetBit(1));
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (int i = 2; i < 15; i++) {
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(record_obj->GetBit(i));
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(record_obj->GetBit(15));
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(record_obj->IsEqual(record_obj.get()));
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace net
223