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