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