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 "net/dns/record_parsed.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/dns/dns_protocol.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/dns/dns_response.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/dns/dns_test_util.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/dns/record_rdata.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net {
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)static const uint8 kT1ResponseWithCacheFlushBit[] = {
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x0a, 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w',
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x08, 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm',
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x03, 'o', 'r', 'g',
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00,
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x05,        // TYPE is CNAME.
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x80, 0x01,        // CLASS is IN with cache flush bit set.
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,        // TTL (4 bytes) is 20 hours, 47 minutes, 48 seconds.
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x24, 0x74,
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x12,        // RDLENGTH is 18 bytes.
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // ghs.l.google.com in DNS format.
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x03, 'g', 'h', 's',
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x01, 'l',
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x06, 'g', 'o', 'o', 'g', 'l', 'e',
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x03, 'c', 'o', 'm',
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(RecordParsedTest, ParseSingleRecord) {
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DnsRecordParser parser(kT1ResponseDatagram, sizeof(kT1ResponseDatagram),
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         sizeof(dns_protocol::Header));
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<const RecordParsed> record;
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const CnameRecordRdata* rdata;
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parser.SkipQuestion();
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record = RecordParsed::CreateFrom(&parser, base::Time());
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(record != NULL);
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ("codereview.chromium.org", record->name());
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(dns_protocol::kTypeCNAME, record->type());
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(dns_protocol::kClassIN, record->klass());
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rdata = record->rdata<CnameRecordRdata>();
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(rdata != NULL);
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(kT1CanonName, rdata->cname());
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_FALSE(record->rdata<SrvRecordRdata>());
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(record->IsEqual(record.get(), true));
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(RecordParsedTest, CacheFlushBitCompare) {
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser1(kT1ResponseDatagram, sizeof(kT1ResponseDatagram),
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         sizeof(dns_protocol::Header));
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  parser1.SkipQuestion();
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record1 =
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      RecordParsed::CreateFrom(&parser1, base::Time());
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser2(kT1ResponseWithCacheFlushBit,
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                          sizeof(kT1ResponseWithCacheFlushBit),
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                          0);
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record2 =
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      RecordParsed::CreateFrom(&parser2, base::Time());
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(record1->IsEqual(record2.get(), false));
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(record1->IsEqual(record2.get(), true));
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(record2->IsEqual(record1.get(), false));
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(record2->IsEqual(record1.get(), true));
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  //namespace net
76