mdns_cache_unittest.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/bind.h"
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/dns/dns_response.h"
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/dns/dns_test_util.h"
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/dns/mdns_cache.h"
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/dns/record_parsed.h"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/dns/record_rdata.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using ::testing::Return;
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using ::testing::StrictMock;
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace net {
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)static const uint8 kTestResponsesDifferentAnswers[] = {
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Answer 1
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // ghs.l.google.com in DNS format.
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x03, 'g', 'h', 's',
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x01, 'l',
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x06, 'g', 'o', 'o', 'g', 'l', 'e',
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x03, 'c', 'o', 'm',
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00,
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x01,         // TYPE is A.
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x01,         // CLASS is IN.
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x00,         // TTL (4 bytes) is 53 seconds.
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x35,
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x04,         // RDLENGTH is 4 bytes.
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x4a, 0x7d,         // RDATA is the IP: 74.125.95.121
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x5f, 0x79,
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Answer 2
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Pointer to answer 1
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0xc0, 0x00,
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x01,         // TYPE is A.
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x01,         // CLASS is IN.
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x00,         // TTL (4 bytes) is 53 seconds.
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x35,
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x04,         // RDLENGTH is 4 bytes.
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x4a, 0x7d,         // RDATA is the IP: 74.125.95.122
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x5f, 0x80,
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)static const uint8 kTestResponsesSameAnswers[] = {
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Answer 1
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // ghs.l.google.com in DNS format.
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x03, 'g', 'h', 's',
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x01, 'l',
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x06, 'g', 'o', 'o', 'g', 'l', 'e',
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x03, 'c', 'o', 'm',
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00,
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x01,         // TYPE is A.
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x01,         // CLASS is IN.
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x00,         // TTL (4 bytes) is 53 seconds.
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x35,
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x04,         // RDLENGTH is 4 bytes.
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x4a, 0x7d,         // RDATA is the IP: 74.125.95.121
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x5f, 0x79,
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Answer 2
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Pointer to answer 1
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0xc0, 0x00,
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x01,         // TYPE is A.
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x01,         // CLASS is IN.
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x00,         // TTL (4 bytes) is 112 seconds.
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x70,
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x00, 0x04,         // RDLENGTH is 4 bytes.
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x4a, 0x7d,         // RDATA is the IP: 74.125.95.121
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  0x5f, 0x79,
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class RecordRemovalMock {
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MOCK_METHOD1(OnRecordRemoved, void(const RecordParsed*));
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class MDnsCacheTest : public ::testing::Test {
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MDnsCacheTest()
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : default_time_(base::Time::FromDoubleT(1234.0)) {}
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~MDnsCacheTest() {}
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected:
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::Time default_time_;
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  StrictMock<RecordRemovalMock> record_removal_;
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MDnsCache cache_;
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test a single insert, corresponding lookup, and unsuccessful lookup.
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(MDnsCacheTest, InsertLookupSingle) {
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser(kT1ResponseDatagram, sizeof(kT1ResponseDatagram),
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         sizeof(dns_protocol::Header));
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  parser.SkipQuestion();
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record1;
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record2;
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<const RecordParsed*> results;
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record1 = RecordParsed::CreateFrom(&parser, default_time_);
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record2 = RecordParsed::CreateFrom(&parser, default_time_);
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass()));
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.Pass()));
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results,
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        default_time_);
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1u, results.size());
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(default_time_, results.front()->time_created());
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("ghs.l.google.com", results.front()->name());
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  results.clear();
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cache_.FindDnsRecords(PtrRecordRdata::kType, "ghs.l.google.com", &results,
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        default_time_);
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0u, results.size());
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test that records expire when their ttl has passed.
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(MDnsCacheTest, Expiration) {
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser(kT1ResponseDatagram, sizeof(kT1ResponseDatagram),
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         sizeof(dns_protocol::Header));
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  parser.SkipQuestion();
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record1;
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record2;
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<const RecordParsed*> results;
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const RecordParsed* record_to_be_deleted;
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record1 = RecordParsed::CreateFrom(&parser, default_time_);
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeDelta ttl1 = base::TimeDelta::FromSeconds(record1->ttl());
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record2 = RecordParsed::CreateFrom(&parser, default_time_);
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeDelta ttl2 = base::TimeDelta::FromSeconds(record2->ttl());
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record_to_be_deleted = record2.get();
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass()));
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.Pass()));
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results,
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        default_time_);
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(1u, results.size());
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(default_time_ + ttl2, cache_.next_expiration());
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results,
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        default_time_ + ttl2);
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0u, results.size());
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(record_removal_, OnRecordRemoved(record_to_be_deleted));
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cache_.CleanupRecords(default_time_ + ttl2, base::Bind(
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      &RecordRemovalMock::OnRecordRemoved, base::Unretained(&record_removal_)));
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // To make sure that we've indeed removed them from the map, check no funny
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // business happens once they're deleted for good.
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(default_time_ + ttl1, cache_.next_expiration());
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results,
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        default_time_ + ttl2);
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0u, results.size());
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test that a new record replacing one with the same identity (name/rrtype for
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// unique records) causes the cache to output a "record changed" event.
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(MDnsCacheTest, RecordChange) {
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser(kTestResponsesDifferentAnswers,
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         sizeof(kTestResponsesDifferentAnswers),
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         0);
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record1;
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record2;
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<const RecordParsed*> results;
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record1 = RecordParsed::CreateFrom(&parser, default_time_);
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record2 = RecordParsed::CreateFrom(&parser, default_time_);
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass()));
18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordChanged,
18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            cache_.UpdateDnsRecord(record2.Pass()));
19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test that a new record replacing an otherwise identical one already in the
19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// cache causes the cache to output a "no change" event.
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(MDnsCacheTest, RecordNoChange) {
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser(kTestResponsesSameAnswers,
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         sizeof(kTestResponsesSameAnswers),
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         0);
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record1;
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record2;
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<const RecordParsed*> results;
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record1 = RecordParsed::CreateFrom(&parser, default_time_);
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record2 = RecordParsed::CreateFrom(&parser, default_time_ +
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                     base::TimeDelta::FromSeconds(1));
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass()));
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::NoChange, cache_.UpdateDnsRecord(record2.Pass()));
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Test that the next expiration time of the cache is updated properly on record
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// insertion.
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(MDnsCacheTest, RecordPreemptExpirationTime) {
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DnsRecordParser parser(kTestResponsesSameAnswers,
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         sizeof(kTestResponsesSameAnswers),
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                         0);
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record1;
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<const RecordParsed> record2;
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::vector<const RecordParsed*> results;
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record1 = RecordParsed::CreateFrom(&parser, default_time_);
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  record2 = RecordParsed::CreateFrom(&parser, default_time_);
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeDelta ttl1 = base::TimeDelta::FromSeconds(record1->ttl());
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::TimeDelta ttl2 = base::TimeDelta::FromSeconds(record2->ttl());
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(base::Time(), cache_.next_expiration());
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.Pass()));
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(default_time_ + ttl2, cache_.next_expiration());
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(MDnsCache::NoChange, cache_.UpdateDnsRecord(record1.Pass()));
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(default_time_ + ttl1, cache_.next_expiration());
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace net
235