Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(685)

Side by Side Diff: net/dns/mdns_cache_unittest.cc

Issue 14697022: Cache for mDNS records (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@record_parsed_klassbit
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/dns/dns_response.h"
6 #include "net/dns/dns_test_util.h"
7 #include "net/dns/mdns_cache.h"
8 #include "net/dns/record_parsed.h"
9 #include "net/dns/record_rdata.h"
10 #include "testing/gmock/include/gmock/gmock.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12
13 using ::testing::Return;
14 using ::testing::NiceMock;
15
16 namespace net {
17
18 static const uint8 kTestResposesDifferentAnswers[] = {
19 // Answer 1
20 // ghs.l.google.com in DNS format.
21 0x03, 'g', 'h', 's',
22 0x01, 'l',
23 0x06, 'g', 'o', 'o', 'g', 'l', 'e',
24 0x03, 'c', 'o', 'm',
25 0x00,
26 0x00, 0x01, // TYPE is A.
27 0x00, 0x01, // CLASS is IN.
28 0x00, 0x00, // TTL (4 bytes) is 53 seconds.
29 0x00, 0x35,
30 0x00, 0x04, // RDLENGTH is 4 bytes.
31 0x4a, 0x7d, // RDATA is the IP: 74.125.95.121
32 0x5f, 0x79,
33
34 // Answer 2
35 // Pointer to answer 1
36 0xc0, 0x00,
37 0x00, 0x01, // TYPE is A.
38 0x00, 0x01, // CLASS is IN.
39 0x00, 0x00, // TTL (4 bytes) is 53 seconds.
40 0x00, 0x35,
41 0x00, 0x04, // RDLENGTH is 4 bytes.
42 0x4a, 0x7d, // RDATA is the IP: 74.125.95.122
43 0x5f, 0x80,
44 };
45
46 static const uint8 kTestResposesSameAnswers[] = {
47 // Answer 1
48 // ghs.l.google.com in DNS format.
49 0x03, 'g', 'h', 's',
50 0x01, 'l',
51 0x06, 'g', 'o', 'o', 'g', 'l', 'e',
52 0x03, 'c', 'o', 'm',
53 0x00,
54 0x00, 0x01, // TYPE is A.
55 0x00, 0x01, // CLASS is IN.
56 0x00, 0x00, // TTL (4 bytes) is 53 seconds.
57 0x00, 0x35,
58 0x00, 0x04, // RDLENGTH is 4 bytes.
59 0x4a, 0x7d, // RDATA is the IP: 74.125.95.121
60 0x5f, 0x79,
61
62 // Answer 2
63 // Pointer to answer 1
64 0xc0, 0x00,
65 0x00, 0x01, // TYPE is A.
66 0x00, 0x01, // CLASS is IN.
67 0x00, 0x00, // TTL (4 bytes) is 112 seconds.
68 0x00, 0x70,
69 0x00, 0x04, // RDLENGTH is 4 bytes.
70 0x4a, 0x7d, // RDATA is the IP: 74.125.95.121
71 0x5f, 0x79,
72 };
73
74 class MDnsCacheTest : public ::testing::Test {
75 public:
76 MDnsCacheTest() : default_time_(base::Time::FromDoubleT(1234.0)) {}
77 virtual ~MDnsCacheTest() {}
78
79 protected:
80 base::Time default_time_;
81 MDnsCache cache_;
82 };
83
84 TEST_F(MDnsCacheTest, InsertLookupSingle) {
85 DnsRecordParser parser(kT1ResponseDatagram, sizeof(kT1ResponseDatagram),
86 sizeof(dns_protocol::Header));
87 parser.SkipQuestion();
88 scoped_ptr<const RecordParsed> record1;
89 scoped_ptr<const RecordParsed> record2;
90 std::list<const RecordParsed*> results;
91
92 record1 = RecordParsed::CreateFrom(&parser, default_time_);
93 record2 = RecordParsed::CreateFrom(&parser, default_time_);
94
95 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.release()));
96
97 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.release()));
98
99 MDnsCache::TypeNameQuery query_success(
100 ARecordRdata::kType, "ghs.l.google.com");
101
102 EXPECT_TRUE(cache_.FindDnsRecords(query_success, &results, default_time_));
103 EXPECT_EQ(1u, results.size());
104 EXPECT_EQ(default_time_, results.front()->time_created());
105
106 EXPECT_EQ("ghs.l.google.com", results.front()->name());
107
108 MDnsCache::TypeNameQuery query_failure(
109 PtrRecordRdata::kType, "ghs.l.google.com");
110
111 EXPECT_FALSE(cache_.FindDnsRecords(query_failure, &results, default_time_));
112 }
113
114 TEST_F(MDnsCacheTest, Expiration) {
115 DnsRecordParser parser(kT1ResponseDatagram, sizeof(kT1ResponseDatagram),
116 sizeof(dns_protocol::Header));
117 parser.SkipQuestion();
118 scoped_ptr<const RecordParsed> record1;
119 scoped_ptr<const RecordParsed> record2;
120
121 std::list<const RecordParsed*> results;
122 std::list<linked_ptr<const RecordParsed> > removed;
123
124 record1 = RecordParsed::CreateFrom(&parser, default_time_);
125 base::TimeDelta ttl1 = base::TimeDelta::FromSeconds(record1->ttl());
126
127 record2 = RecordParsed::CreateFrom(&parser, default_time_);
128 base::TimeDelta ttl2 = base::TimeDelta::FromSeconds(record2->ttl());
129
130 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.release()));
131 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.release()));
132
133 MDnsCache::TypeNameQuery query_expired(
134 ARecordRdata::kType, "ghs.l.google.com");
135
136 EXPECT_TRUE(cache_.FindDnsRecords(query_expired, &results, default_time_));
137
138 EXPECT_EQ(default_time_ + ttl2, cache_.GetNextExpiration());
139
140 EXPECT_FALSE(cache_.FindDnsRecords(query_expired, &results,
141 default_time_ + ttl2));
142
143 cache_.CleanupRecords(&removed, default_time_ + ttl2);
144
145 EXPECT_EQ(1u, removed.size());
146
147 EXPECT_EQ(removed.front()->name(), "ghs.l.google.com");
148
149 // To make sure that we've indeed removed them from the map, check no funny
150 // business happens once they're deleted for good.
151 removed.empty();
152
153 EXPECT_EQ(default_time_ + ttl1, cache_.GetNextExpiration());
154 EXPECT_FALSE(cache_.FindDnsRecords(query_expired, &results,
155 default_time_ + ttl2));
156 }
157
158 TEST_F(MDnsCacheTest, RecordChange) {
159 DnsRecordParser parser(kTestResposesDifferentAnswers,
160 sizeof(kTestResposesDifferentAnswers),
161 0);
162
163 scoped_ptr<const RecordParsed> record1;
164 scoped_ptr<const RecordParsed> record2;
165 std::list<const RecordParsed*> results;
166 std::list<linked_ptr<const RecordParsed> > removed;
167
168 record1 = RecordParsed::CreateFrom(&parser, default_time_);
169 record2 = RecordParsed::CreateFrom(&parser, default_time_);
170
171 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.release()));
172 EXPECT_EQ(MDnsCache::RecordChanged,
173 cache_.UpdateDnsRecord(record2.release()));
174 }
175
176 TEST_F(MDnsCacheTest, RecordNoChange) {
177 DnsRecordParser parser(kTestResposesSameAnswers,
178 sizeof(kTestResposesSameAnswers),
179 0);
180
181 scoped_ptr<const RecordParsed> record1;
182 scoped_ptr<const RecordParsed> record2;
183 std::list<const RecordParsed*> results;
184 std::list<linked_ptr<const RecordParsed> > removed;
185
186 record1 = RecordParsed::CreateFrom(&parser, default_time_);
187 record2 = RecordParsed::CreateFrom(&parser, default_time_ +
188 base::TimeDelta::FromSeconds(1));
189
190 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.release()));
191 EXPECT_EQ(MDnsCache::NoChange, cache_.UpdateDnsRecord(record2.release()));
192 }
193
194 TEST_F(MDnsCacheTest, RecordPreemptExpirationTime) {
195 DnsRecordParser parser(kTestResposesSameAnswers,
196 sizeof(kTestResposesSameAnswers),
197 0);
198
199 scoped_ptr<const RecordParsed> record1;
200 scoped_ptr<const RecordParsed> record2;
201 std::list<const RecordParsed*> results;
202 std::list<linked_ptr<const RecordParsed> > removed;
203
204 record1 = RecordParsed::CreateFrom(&parser, default_time_);
205 record2 = RecordParsed::CreateFrom(&parser, default_time_);
206 base::TimeDelta ttl1 = base::TimeDelta::FromSeconds(record1->ttl());
207 base::TimeDelta ttl2 = base::TimeDelta::FromSeconds(record2->ttl());
208
209 EXPECT_EQ(base::Time(), cache_.GetNextExpiration());
210 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.release()));
211 EXPECT_EQ(default_time_ + ttl2, cache_.GetNextExpiration());
212 EXPECT_EQ(MDnsCache::NoChange, cache_.UpdateDnsRecord(record1.release()));
213 EXPECT_EQ(default_time_ + ttl1, cache_.GetNextExpiration());
214 }
215 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698