190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <algorithm>
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/bind.h"
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/dns/dns_response.h"
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/dns/dns_test_util.h"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/dns/mdns_cache.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/dns/record_parsed.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/dns/record_rdata.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using ::testing::Return;
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using ::testing::StrictMock;
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace net {
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)static const uint8 kTestResponsesDifferentAnswers[] = {
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Answer 1
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // ghs.l.google.com in DNS format.
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  3, 'g', 'h', 's',
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  1, 'l',
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  6, 'g', 'o', 'o', 'g', 'l', 'e',
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  3, 'c', 'o', 'm',
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00,
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // TYPE is A.
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // CLASS is IN.
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 0, 0, 53,        // TTL (4 bytes) is 53 seconds.
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 4,               // RDLENGTH is 4 bytes.
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  74, 125, 95, 121,   // RDATA is the IP: 74.125.95.121
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Answer 2
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Pointer to answer 1
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0xc0, 0x00,
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // TYPE is A.
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // CLASS is IN.
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 0, 0, 53,        // TTL (4 bytes) is 53 seconds.
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 4,               // RDLENGTH is 4 bytes.
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  74, 125, 95, 122,   // RDATA is the IP: 74.125.95.122
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)static const uint8 kTestResponsesSameAnswers[] = {
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Answer 1
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // ghs.l.google.com in DNS format.
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  3, 'g', 'h', 's',
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  1, 'l',
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  6, 'g', 'o', 'o', 'g', 'l', 'e',
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  3, 'c', 'o', 'm',
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00,
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // TYPE is A.
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // CLASS is IN.
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 0, 0, 53,        // TTL (4 bytes) is 53 seconds.
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 4,               // RDLENGTH is 4 bytes.
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  74, 125, 95, 121,   // RDATA is the IP: 74.125.95.121
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Answer 2
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Pointer to answer 1
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0xc0, 0x00,
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // TYPE is A.
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // CLASS is IN.
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 0, 0, 112,       // TTL (4 bytes) is 112 seconds.
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 4,               // RDLENGTH is 4 bytes.
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  74, 125, 95, 121,   // RDATA is the IP: 74.125.95.121
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic const uint8 kTestResponseTwoRecords[] = {
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Answer 1
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // ghs.l.google.com in DNS format. (A)
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  3, 'g', 'h', 's',
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  1, 'l',
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  6, 'g', 'o', 'o', 'g', 'l', 'e',
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  3, 'c', 'o', 'm',
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00,
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // TYPE is A.
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // CLASS is IN.
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 0, 0, 53,        // TTL (4 bytes) is 53 seconds.
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 4,               // RDLENGTH is 4 bytes.
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  74, 125, 95, 121,   // RDATA is the IP: 74.125.95.121
82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Answer 2
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // ghs.l.google.com in DNS format. (AAAA)
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  3, 'g', 'h', 's',
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  1, 'l',
87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  6, 'g', 'o', 'o', 'g', 'l', 'e',
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  3, 'c', 'o', 'm',
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00,
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x1c,         // TYPE is AAA.
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // CLASS is IN.
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 0, 0, 53,        // TTL (4 bytes) is 53 seconds.
93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 16,              // RDLENGTH is 16 bytes.
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x4a, 0x7d, 0x4a, 0x7d,
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x5f, 0x79, 0x5f, 0x79,
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x5f, 0x79, 0x5f, 0x79,
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x5f, 0x79, 0x5f, 0x79,
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const uint8 kTestResponsesGoodbyePacket[] = {
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Answer 1
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // ghs.l.google.com in DNS format. (Goodbye packet)
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  3, 'g', 'h', 's',
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  1, 'l',
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  6, 'g', 'o', 'o', 'g', 'l', 'e',
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  3, 'c', 'o', 'm',
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00,
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // TYPE is A.
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // CLASS is IN.
110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 0, 0, 0,         // TTL (4 bytes) is zero.
111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 4,               // RDLENGTH is 4 bytes.
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  74, 125, 95, 121,   // RDATA is the IP: 74.125.95.121
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Answer 2
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // ghs.l.google.com in DNS format.
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  3, 'g', 'h', 's',
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  1, 'l',
118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  6, 'g', 'o', 'o', 'g', 'l', 'e',
119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  3, 'c', 'o', 'm',
120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00,
121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // TYPE is A.
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x01,         // CLASS is IN.
123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 0, 0, 53,        // TTL (4 bytes) is 53 seconds.
124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0, 4,               // RDLENGTH is 4 bytes.
125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  74, 125, 95, 121,   // RDATA is the IP: 74.125.95.121
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class RecordRemovalMock {
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MOCK_METHOD1(OnRecordRemoved, void(const RecordParsed*));
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class MDnsCacheTest : public ::testing::Test {
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MDnsCacheTest()
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : default_time_(base::Time::FromDoubleT(1234.0)) {}
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~MDnsCacheTest() {}
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected:
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::Time default_time_;
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  StrictMock<RecordRemovalMock> record_removal_;
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MDnsCache cache_;
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test a single insert, corresponding lookup, and unsuccessful lookup.
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(MDnsCacheTest, InsertLookupSingle) {
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser(kT1ResponseDatagram, sizeof(kT1ResponseDatagram),
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         sizeof(dns_protocol::Header));
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  parser.SkipQuestion();
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record1;
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record2;
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<const RecordParsed*> results;
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record1 = RecordParsed::CreateFrom(&parser, default_time_);
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record2 = RecordParsed::CreateFrom(&parser, default_time_);
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass()));
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.Pass()));
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results,
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        default_time_);
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1u, results.size());
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(default_time_, results.front()->time_created());
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("ghs.l.google.com", results.front()->name());
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  results.clear();
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cache_.FindDnsRecords(PtrRecordRdata::kType, "ghs.l.google.com", &results,
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        default_time_);
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0u, results.size());
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test that records expire when their ttl has passed.
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(MDnsCacheTest, Expiration) {
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser(kT1ResponseDatagram, sizeof(kT1ResponseDatagram),
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         sizeof(dns_protocol::Header));
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  parser.SkipQuestion();
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record1;
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record2;
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<const RecordParsed*> results;
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const RecordParsed* record_to_be_deleted;
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record1 = RecordParsed::CreateFrom(&parser, default_time_);
18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeDelta ttl1 = base::TimeDelta::FromSeconds(record1->ttl());
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record2 = RecordParsed::CreateFrom(&parser, default_time_);
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeDelta ttl2 = base::TimeDelta::FromSeconds(record2->ttl());
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record_to_be_deleted = record2.get();
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass()));
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.Pass()));
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results,
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        default_time_);
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1u, results.size());
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(default_time_ + ttl2, cache_.next_expiration());
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results,
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        default_time_ + ttl2);
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0u, results.size());
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(record_removal_, OnRecordRemoved(record_to_be_deleted));
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cache_.CleanupRecords(default_time_ + ttl2, base::Bind(
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      &RecordRemovalMock::OnRecordRemoved, base::Unretained(&record_removal_)));
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To make sure that we've indeed removed them from the map, check no funny
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // business happens once they're deleted for good.
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(default_time_ + ttl1, cache_.next_expiration());
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results,
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        default_time_ + ttl2);
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0u, results.size());
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test that a new record replacing one with the same identity (name/rrtype for
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// unique records) causes the cache to output a "record changed" event.
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(MDnsCacheTest, RecordChange) {
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser(kTestResponsesDifferentAnswers,
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         sizeof(kTestResponsesDifferentAnswers),
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         0);
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record1;
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record2;
23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<const RecordParsed*> results;
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record1 = RecordParsed::CreateFrom(&parser, default_time_);
23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record2 = RecordParsed::CreateFrom(&parser, default_time_);
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass()));
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordChanged,
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            cache_.UpdateDnsRecord(record2.Pass()));
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test that a new record replacing an otherwise identical one already in the
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// cache causes the cache to output a "no change" event.
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(MDnsCacheTest, RecordNoChange) {
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser(kTestResponsesSameAnswers,
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         sizeof(kTestResponsesSameAnswers),
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         0);
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record1;
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record2;
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<const RecordParsed*> results;
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record1 = RecordParsed::CreateFrom(&parser, default_time_);
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record2 = RecordParsed::CreateFrom(&parser, default_time_ +
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     base::TimeDelta::FromSeconds(1));
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass()));
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::NoChange, cache_.UpdateDnsRecord(record2.Pass()));
26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test that the next expiration time of the cache is updated properly on record
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// insertion.
26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(MDnsCacheTest, RecordPreemptExpirationTime) {
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser(kTestResponsesSameAnswers,
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         sizeof(kTestResponsesSameAnswers),
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         0);
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record1;
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record2;
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<const RecordParsed*> results;
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record1 = RecordParsed::CreateFrom(&parser, default_time_);
27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record2 = RecordParsed::CreateFrom(&parser, default_time_);
27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeDelta ttl1 = base::TimeDelta::FromSeconds(record1->ttl());
27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeDelta ttl2 = base::TimeDelta::FromSeconds(record2->ttl());
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(base::Time(), cache_.next_expiration());
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.Pass()));
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(default_time_ + ttl2, cache_.next_expiration());
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::NoChange, cache_.UpdateDnsRecord(record1.Pass()));
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(default_time_ + ttl1, cache_.next_expiration());
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Test that the cache handles mDNS "goodbye" packets correctly, not adding the
2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// records to the cache if they are not already there, and eventually removing
2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// records from the cache if they are.
2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(MDnsCacheTest, GoodbyePacket) {
2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DnsRecordParser parser(kTestResponsesGoodbyePacket,
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                         sizeof(kTestResponsesGoodbyePacket),
2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                         0);
2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<const RecordParsed> record_goodbye;
2967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<const RecordParsed> record_hello;
2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<const RecordParsed> record_goodbye2;
2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::vector<const RecordParsed*> results;
2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  record_goodbye = RecordParsed::CreateFrom(&parser, default_time_);
3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  record_hello = RecordParsed::CreateFrom(&parser, default_time_);
3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  parser = DnsRecordParser(kTestResponsesGoodbyePacket,
3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                           sizeof(kTestResponsesGoodbyePacket),
3047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                           0);
3057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  record_goodbye2 = RecordParsed::CreateFrom(&parser, default_time_);
3067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::TimeDelta ttl = base::TimeDelta::FromSeconds(record_hello->ttl());
3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(base::Time(), cache_.next_expiration());
3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(MDnsCache::NoChange, cache_.UpdateDnsRecord(record_goodbye.Pass()));
3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(base::Time(), cache_.next_expiration());
3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(MDnsCache::RecordAdded,
3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            cache_.UpdateDnsRecord(record_hello.Pass()));
3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(default_time_ + ttl, cache_.next_expiration());
3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(MDnsCache::NoChange,
3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            cache_.UpdateDnsRecord(record_goodbye2.Pass()));
3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(default_time_ + base::TimeDelta::FromSeconds(1),
3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            cache_.next_expiration());
3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(MDnsCacheTest, AnyRRType) {
322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DnsRecordParser parser(kTestResponseTwoRecords,
323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         sizeof(kTestResponseTwoRecords),
324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         0);
325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<const RecordParsed> record1;
327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<const RecordParsed> record2;
328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<const RecordParsed*> results;
329eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  record1 = RecordParsed::CreateFrom(&parser, default_time_);
331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  record2 = RecordParsed::CreateFrom(&parser, default_time_);
332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass()));
333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.Pass()));
334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cache_.FindDnsRecords(0, "ghs.l.google.com", &results, default_time_);
336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(2u, results.size());
338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(default_time_, results.front()->time_created());
339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("ghs.l.google.com", results[0]->name());
341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("ghs.l.google.com", results[1]->name());
342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(dns_protocol::kTypeA,
343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            std::min(results[0]->type(), results[1]->type()));
344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(dns_protocol::kTypeAAAA,
345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            std::max(results[0]->type(), results[1]->type()));
346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(MDnsCacheTest, RemoveRecord) {
349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DnsRecordParser parser(kT1ResponseDatagram, sizeof(kT1ResponseDatagram),
350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         sizeof(dns_protocol::Header));
351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parser.SkipQuestion();
352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<const RecordParsed> record1;
354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<const RecordParsed*> results;
355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  record1 = RecordParsed::CreateFrom(&parser, default_time_);
357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass()));
358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cache_.FindDnsRecords(dns_protocol::kTypeCNAME, "codereview.chromium.org",
360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        &results, default_time_);
361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1u, results.size());
363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<const RecordParsed> record_out =
365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      cache_.RemoveRecord(results.front());
366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(record_out.get(), results.front());
368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cache_.FindDnsRecords(dns_protocol::kTypeCNAME, "codereview.chromium.org",
370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        &results, default_time_);
371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0u, results.size());
373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace net
376