Home | History | Annotate | Download | only in dns
      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 
     13 namespace net {
     14 
     15 static 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 
     33 TEST(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 
     55 TEST(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