1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/dns/record_parsed.h"
6
7#include "net/dns/dns_protocol.h"
8#include "net/dns/dns_response.h"
9#include "net/dns/dns_test_util.h"
10#include "net/dns/record_rdata.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
13namespace net {
14
15static const uint8 kT1ResponseWithCacheFlushBit[] = {
16  0x0a, 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w',
17  0x08, 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm',
18  0x03, 'o', 'r', 'g',
19  0x00,
20  0x00, 0x05,        // TYPE is CNAME.
21  0x80, 0x01,        // CLASS is IN with cache flush bit set.
22  0x00, 0x01,        // TTL (4 bytes) is 20 hours, 47 minutes, 48 seconds.
23  0x24, 0x74,
24  0x00, 0x12,        // RDLENGTH is 18 bytes.
25  // ghs.l.google.com in DNS format.
26  0x03, 'g', 'h', 's',
27  0x01, 'l',
28  0x06, 'g', 'o', 'o', 'g', 'l', 'e',
29  0x03, 'c', 'o', 'm',
30  0x00
31};
32
33TEST(RecordParsedTest, ParseSingleRecord) {
34  DnsRecordParser parser(kT1ResponseDatagram, sizeof(kT1ResponseDatagram),
35                         sizeof(dns_protocol::Header));
36  scoped_ptr<const RecordParsed> record;
37  const CnameRecordRdata* rdata;
38
39  parser.SkipQuestion();
40  record = RecordParsed::CreateFrom(&parser, base::Time());
41  EXPECT_TRUE(record != NULL);
42
43  ASSERT_EQ("codereview.chromium.org", record->name());
44  ASSERT_EQ(dns_protocol::kTypeCNAME, record->type());
45  ASSERT_EQ(dns_protocol::kClassIN, record->klass());
46
47  rdata = record->rdata<CnameRecordRdata>();
48  ASSERT_TRUE(rdata != NULL);
49  ASSERT_EQ(kT1CanonName, rdata->cname());
50
51  ASSERT_FALSE(record->rdata<SrvRecordRdata>());
52  ASSERT_TRUE(record->IsEqual(record.get(), true));
53}
54
55TEST(RecordParsedTest, CacheFlushBitCompare) {
56  DnsRecordParser parser1(kT1ResponseDatagram, sizeof(kT1ResponseDatagram),
57                         sizeof(dns_protocol::Header));
58  parser1.SkipQuestion();
59  scoped_ptr<const RecordParsed> record1 =
60      RecordParsed::CreateFrom(&parser1, base::Time());
61
62  DnsRecordParser parser2(kT1ResponseWithCacheFlushBit,
63                          sizeof(kT1ResponseWithCacheFlushBit),
64                          0);
65
66  scoped_ptr<const RecordParsed> record2 =
67      RecordParsed::CreateFrom(&parser2, base::Time());
68
69  EXPECT_FALSE(record1->IsEqual(record2.get(), false));
70  EXPECT_TRUE(record1->IsEqual(record2.get(), true));
71  EXPECT_FALSE(record2->IsEqual(record1.get(), false));
72  EXPECT_TRUE(record2->IsEqual(record1.get(), true));
73}
74
75}  //namespace net
76