OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include "net/dns/mdns_cache.h" |
| 6 |
5 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> |
6 | 9 |
7 #include "base/bind.h" | 10 #include "base/bind.h" |
8 #include "net/dns/dns_response.h" | 11 #include "net/dns/dns_response.h" |
9 #include "net/dns/dns_test_util.h" | 12 #include "net/dns/dns_test_util.h" |
10 #include "net/dns/mdns_cache.h" | |
11 #include "net/dns/record_parsed.h" | 13 #include "net/dns/record_parsed.h" |
12 #include "net/dns/record_rdata.h" | 14 #include "net/dns/record_rdata.h" |
13 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
15 | 17 |
16 using ::testing::Return; | 18 using ::testing::Return; |
17 using ::testing::StrictMock; | 19 using ::testing::StrictMock; |
18 | 20 |
19 namespace net { | 21 namespace net { |
20 | 22 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 sizeof(dns_protocol::Header)); | 122 sizeof(dns_protocol::Header)); |
121 parser.SkipQuestion(); | 123 parser.SkipQuestion(); |
122 | 124 |
123 scoped_ptr<const RecordParsed> record1; | 125 scoped_ptr<const RecordParsed> record1; |
124 scoped_ptr<const RecordParsed> record2; | 126 scoped_ptr<const RecordParsed> record2; |
125 std::vector<const RecordParsed*> results; | 127 std::vector<const RecordParsed*> results; |
126 | 128 |
127 record1 = RecordParsed::CreateFrom(&parser, default_time_); | 129 record1 = RecordParsed::CreateFrom(&parser, default_time_); |
128 record2 = RecordParsed::CreateFrom(&parser, default_time_); | 130 record2 = RecordParsed::CreateFrom(&parser, default_time_); |
129 | 131 |
130 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass())); | 132 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(std::move(record1))); |
131 | 133 |
132 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.Pass())); | 134 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(std::move(record2))); |
133 | 135 |
134 cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results, | 136 cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results, |
135 default_time_); | 137 default_time_); |
136 | 138 |
137 EXPECT_EQ(1u, results.size()); | 139 EXPECT_EQ(1u, results.size()); |
138 EXPECT_EQ(default_time_, results.front()->time_created()); | 140 EXPECT_EQ(default_time_, results.front()->time_created()); |
139 | 141 |
140 EXPECT_EQ("ghs.l.google.com", results.front()->name()); | 142 EXPECT_EQ("ghs.l.google.com", results.front()->name()); |
141 | 143 |
142 results.clear(); | 144 results.clear(); |
(...skipping 14 matching lines...) Expand all Loading... |
157 std::vector<const RecordParsed*> results; | 159 std::vector<const RecordParsed*> results; |
158 const RecordParsed* record_to_be_deleted; | 160 const RecordParsed* record_to_be_deleted; |
159 | 161 |
160 record1 = RecordParsed::CreateFrom(&parser, default_time_); | 162 record1 = RecordParsed::CreateFrom(&parser, default_time_); |
161 base::TimeDelta ttl1 = base::TimeDelta::FromSeconds(record1->ttl()); | 163 base::TimeDelta ttl1 = base::TimeDelta::FromSeconds(record1->ttl()); |
162 | 164 |
163 record2 = RecordParsed::CreateFrom(&parser, default_time_); | 165 record2 = RecordParsed::CreateFrom(&parser, default_time_); |
164 base::TimeDelta ttl2 = base::TimeDelta::FromSeconds(record2->ttl()); | 166 base::TimeDelta ttl2 = base::TimeDelta::FromSeconds(record2->ttl()); |
165 record_to_be_deleted = record2.get(); | 167 record_to_be_deleted = record2.get(); |
166 | 168 |
167 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass())); | 169 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(std::move(record1))); |
168 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.Pass())); | 170 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(std::move(record2))); |
169 | 171 |
170 cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results, | 172 cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results, |
171 default_time_); | 173 default_time_); |
172 | 174 |
173 EXPECT_EQ(1u, results.size()); | 175 EXPECT_EQ(1u, results.size()); |
174 | 176 |
175 EXPECT_EQ(default_time_ + ttl2, cache_.next_expiration()); | 177 EXPECT_EQ(default_time_ + ttl2, cache_.next_expiration()); |
176 | 178 |
177 | 179 |
178 cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results, | 180 cache_.FindDnsRecords(ARecordRdata::kType, "ghs.l.google.com", &results, |
(...skipping 23 matching lines...) Expand all Loading... |
202 sizeof(kTestResponsesDifferentAnswers), | 204 sizeof(kTestResponsesDifferentAnswers), |
203 0); | 205 0); |
204 | 206 |
205 scoped_ptr<const RecordParsed> record1; | 207 scoped_ptr<const RecordParsed> record1; |
206 scoped_ptr<const RecordParsed> record2; | 208 scoped_ptr<const RecordParsed> record2; |
207 std::vector<const RecordParsed*> results; | 209 std::vector<const RecordParsed*> results; |
208 | 210 |
209 record1 = RecordParsed::CreateFrom(&parser, default_time_); | 211 record1 = RecordParsed::CreateFrom(&parser, default_time_); |
210 record2 = RecordParsed::CreateFrom(&parser, default_time_); | 212 record2 = RecordParsed::CreateFrom(&parser, default_time_); |
211 | 213 |
212 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass())); | 214 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(std::move(record1))); |
213 EXPECT_EQ(MDnsCache::RecordChanged, | 215 EXPECT_EQ(MDnsCache::RecordChanged, |
214 cache_.UpdateDnsRecord(record2.Pass())); | 216 cache_.UpdateDnsRecord(std::move(record2))); |
215 } | 217 } |
216 | 218 |
217 // Test that a new record replacing an otherwise identical one already in the | 219 // Test that a new record replacing an otherwise identical one already in the |
218 // cache causes the cache to output a "no change" event. | 220 // cache causes the cache to output a "no change" event. |
219 TEST_F(MDnsCacheTest, RecordNoChange) { | 221 TEST_F(MDnsCacheTest, RecordNoChange) { |
220 DnsRecordParser parser(kTestResponsesSameAnswers, | 222 DnsRecordParser parser(kTestResponsesSameAnswers, |
221 sizeof(kTestResponsesSameAnswers), | 223 sizeof(kTestResponsesSameAnswers), |
222 0); | 224 0); |
223 | 225 |
224 scoped_ptr<const RecordParsed> record1; | 226 scoped_ptr<const RecordParsed> record1; |
225 scoped_ptr<const RecordParsed> record2; | 227 scoped_ptr<const RecordParsed> record2; |
226 std::vector<const RecordParsed*> results; | 228 std::vector<const RecordParsed*> results; |
227 | 229 |
228 record1 = RecordParsed::CreateFrom(&parser, default_time_); | 230 record1 = RecordParsed::CreateFrom(&parser, default_time_); |
229 record2 = RecordParsed::CreateFrom(&parser, default_time_ + | 231 record2 = RecordParsed::CreateFrom(&parser, default_time_ + |
230 base::TimeDelta::FromSeconds(1)); | 232 base::TimeDelta::FromSeconds(1)); |
231 | 233 |
232 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass())); | 234 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(std::move(record1))); |
233 EXPECT_EQ(MDnsCache::NoChange, cache_.UpdateDnsRecord(record2.Pass())); | 235 EXPECT_EQ(MDnsCache::NoChange, cache_.UpdateDnsRecord(std::move(record2))); |
234 } | 236 } |
235 | 237 |
236 // Test that the next expiration time of the cache is updated properly on record | 238 // Test that the next expiration time of the cache is updated properly on record |
237 // insertion. | 239 // insertion. |
238 TEST_F(MDnsCacheTest, RecordPreemptExpirationTime) { | 240 TEST_F(MDnsCacheTest, RecordPreemptExpirationTime) { |
239 DnsRecordParser parser(kTestResponsesSameAnswers, | 241 DnsRecordParser parser(kTestResponsesSameAnswers, |
240 sizeof(kTestResponsesSameAnswers), | 242 sizeof(kTestResponsesSameAnswers), |
241 0); | 243 0); |
242 | 244 |
243 scoped_ptr<const RecordParsed> record1; | 245 scoped_ptr<const RecordParsed> record1; |
244 scoped_ptr<const RecordParsed> record2; | 246 scoped_ptr<const RecordParsed> record2; |
245 std::vector<const RecordParsed*> results; | 247 std::vector<const RecordParsed*> results; |
246 | 248 |
247 record1 = RecordParsed::CreateFrom(&parser, default_time_); | 249 record1 = RecordParsed::CreateFrom(&parser, default_time_); |
248 record2 = RecordParsed::CreateFrom(&parser, default_time_); | 250 record2 = RecordParsed::CreateFrom(&parser, default_time_); |
249 base::TimeDelta ttl1 = base::TimeDelta::FromSeconds(record1->ttl()); | 251 base::TimeDelta ttl1 = base::TimeDelta::FromSeconds(record1->ttl()); |
250 base::TimeDelta ttl2 = base::TimeDelta::FromSeconds(record2->ttl()); | 252 base::TimeDelta ttl2 = base::TimeDelta::FromSeconds(record2->ttl()); |
251 | 253 |
252 EXPECT_EQ(base::Time(), cache_.next_expiration()); | 254 EXPECT_EQ(base::Time(), cache_.next_expiration()); |
253 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.Pass())); | 255 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(std::move(record2))); |
254 EXPECT_EQ(default_time_ + ttl2, cache_.next_expiration()); | 256 EXPECT_EQ(default_time_ + ttl2, cache_.next_expiration()); |
255 EXPECT_EQ(MDnsCache::NoChange, cache_.UpdateDnsRecord(record1.Pass())); | 257 EXPECT_EQ(MDnsCache::NoChange, cache_.UpdateDnsRecord(std::move(record1))); |
256 EXPECT_EQ(default_time_ + ttl1, cache_.next_expiration()); | 258 EXPECT_EQ(default_time_ + ttl1, cache_.next_expiration()); |
257 } | 259 } |
258 | 260 |
259 // Test that the cache handles mDNS "goodbye" packets correctly, not adding the | 261 // Test that the cache handles mDNS "goodbye" packets correctly, not adding the |
260 // records to the cache if they are not already there, and eventually removing | 262 // records to the cache if they are not already there, and eventually removing |
261 // records from the cache if they are. | 263 // records from the cache if they are. |
262 TEST_F(MDnsCacheTest, GoodbyePacket) { | 264 TEST_F(MDnsCacheTest, GoodbyePacket) { |
263 DnsRecordParser parser(kTestResponsesGoodbyePacket, | 265 DnsRecordParser parser(kTestResponsesGoodbyePacket, |
264 sizeof(kTestResponsesGoodbyePacket), | 266 sizeof(kTestResponsesGoodbyePacket), |
265 0); | 267 0); |
266 | 268 |
267 scoped_ptr<const RecordParsed> record_goodbye; | 269 scoped_ptr<const RecordParsed> record_goodbye; |
268 scoped_ptr<const RecordParsed> record_hello; | 270 scoped_ptr<const RecordParsed> record_hello; |
269 scoped_ptr<const RecordParsed> record_goodbye2; | 271 scoped_ptr<const RecordParsed> record_goodbye2; |
270 std::vector<const RecordParsed*> results; | 272 std::vector<const RecordParsed*> results; |
271 | 273 |
272 record_goodbye = RecordParsed::CreateFrom(&parser, default_time_); | 274 record_goodbye = RecordParsed::CreateFrom(&parser, default_time_); |
273 record_hello = RecordParsed::CreateFrom(&parser, default_time_); | 275 record_hello = RecordParsed::CreateFrom(&parser, default_time_); |
274 parser = DnsRecordParser(kTestResponsesGoodbyePacket, | 276 parser = DnsRecordParser(kTestResponsesGoodbyePacket, |
275 sizeof(kTestResponsesGoodbyePacket), | 277 sizeof(kTestResponsesGoodbyePacket), |
276 0); | 278 0); |
277 record_goodbye2 = RecordParsed::CreateFrom(&parser, default_time_); | 279 record_goodbye2 = RecordParsed::CreateFrom(&parser, default_time_); |
278 | 280 |
279 base::TimeDelta ttl = base::TimeDelta::FromSeconds(record_hello->ttl()); | 281 base::TimeDelta ttl = base::TimeDelta::FromSeconds(record_hello->ttl()); |
280 | 282 |
281 EXPECT_EQ(base::Time(), cache_.next_expiration()); | 283 EXPECT_EQ(base::Time(), cache_.next_expiration()); |
282 EXPECT_EQ(MDnsCache::NoChange, cache_.UpdateDnsRecord(record_goodbye.Pass())); | 284 EXPECT_EQ(MDnsCache::NoChange, |
| 285 cache_.UpdateDnsRecord(std::move(record_goodbye))); |
283 EXPECT_EQ(base::Time(), cache_.next_expiration()); | 286 EXPECT_EQ(base::Time(), cache_.next_expiration()); |
284 EXPECT_EQ(MDnsCache::RecordAdded, | 287 EXPECT_EQ(MDnsCache::RecordAdded, |
285 cache_.UpdateDnsRecord(record_hello.Pass())); | 288 cache_.UpdateDnsRecord(std::move(record_hello))); |
286 EXPECT_EQ(default_time_ + ttl, cache_.next_expiration()); | 289 EXPECT_EQ(default_time_ + ttl, cache_.next_expiration()); |
287 EXPECT_EQ(MDnsCache::NoChange, | 290 EXPECT_EQ(MDnsCache::NoChange, |
288 cache_.UpdateDnsRecord(record_goodbye2.Pass())); | 291 cache_.UpdateDnsRecord(std::move(record_goodbye2))); |
289 EXPECT_EQ(default_time_ + base::TimeDelta::FromSeconds(1), | 292 EXPECT_EQ(default_time_ + base::TimeDelta::FromSeconds(1), |
290 cache_.next_expiration()); | 293 cache_.next_expiration()); |
291 } | 294 } |
292 | 295 |
293 TEST_F(MDnsCacheTest, AnyRRType) { | 296 TEST_F(MDnsCacheTest, AnyRRType) { |
294 DnsRecordParser parser(kTestResponseTwoRecords, | 297 DnsRecordParser parser(kTestResponseTwoRecords, |
295 sizeof(kTestResponseTwoRecords), | 298 sizeof(kTestResponseTwoRecords), |
296 0); | 299 0); |
297 | 300 |
298 scoped_ptr<const RecordParsed> record1; | 301 scoped_ptr<const RecordParsed> record1; |
299 scoped_ptr<const RecordParsed> record2; | 302 scoped_ptr<const RecordParsed> record2; |
300 std::vector<const RecordParsed*> results; | 303 std::vector<const RecordParsed*> results; |
301 | 304 |
302 record1 = RecordParsed::CreateFrom(&parser, default_time_); | 305 record1 = RecordParsed::CreateFrom(&parser, default_time_); |
303 record2 = RecordParsed::CreateFrom(&parser, default_time_); | 306 record2 = RecordParsed::CreateFrom(&parser, default_time_); |
304 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass())); | 307 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(std::move(record1))); |
305 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record2.Pass())); | 308 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(std::move(record2))); |
306 | 309 |
307 cache_.FindDnsRecords(0, "ghs.l.google.com", &results, default_time_); | 310 cache_.FindDnsRecords(0, "ghs.l.google.com", &results, default_time_); |
308 | 311 |
309 EXPECT_EQ(2u, results.size()); | 312 EXPECT_EQ(2u, results.size()); |
310 EXPECT_EQ(default_time_, results.front()->time_created()); | 313 EXPECT_EQ(default_time_, results.front()->time_created()); |
311 | 314 |
312 EXPECT_EQ("ghs.l.google.com", results[0]->name()); | 315 EXPECT_EQ("ghs.l.google.com", results[0]->name()); |
313 EXPECT_EQ("ghs.l.google.com", results[1]->name()); | 316 EXPECT_EQ("ghs.l.google.com", results[1]->name()); |
314 EXPECT_EQ(dns_protocol::kTypeA, | 317 EXPECT_EQ(dns_protocol::kTypeA, |
315 std::min(results[0]->type(), results[1]->type())); | 318 std::min(results[0]->type(), results[1]->type())); |
316 EXPECT_EQ(dns_protocol::kTypeAAAA, | 319 EXPECT_EQ(dns_protocol::kTypeAAAA, |
317 std::max(results[0]->type(), results[1]->type())); | 320 std::max(results[0]->type(), results[1]->type())); |
318 } | 321 } |
319 | 322 |
320 TEST_F(MDnsCacheTest, RemoveRecord) { | 323 TEST_F(MDnsCacheTest, RemoveRecord) { |
321 DnsRecordParser parser(kT1ResponseDatagram, sizeof(kT1ResponseDatagram), | 324 DnsRecordParser parser(kT1ResponseDatagram, sizeof(kT1ResponseDatagram), |
322 sizeof(dns_protocol::Header)); | 325 sizeof(dns_protocol::Header)); |
323 parser.SkipQuestion(); | 326 parser.SkipQuestion(); |
324 | 327 |
325 scoped_ptr<const RecordParsed> record1; | 328 scoped_ptr<const RecordParsed> record1; |
326 std::vector<const RecordParsed*> results; | 329 std::vector<const RecordParsed*> results; |
327 | 330 |
328 record1 = RecordParsed::CreateFrom(&parser, default_time_); | 331 record1 = RecordParsed::CreateFrom(&parser, default_time_); |
329 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(record1.Pass())); | 332 EXPECT_EQ(MDnsCache::RecordAdded, cache_.UpdateDnsRecord(std::move(record1))); |
330 | 333 |
331 cache_.FindDnsRecords(dns_protocol::kTypeCNAME, "codereview.chromium.org", | 334 cache_.FindDnsRecords(dns_protocol::kTypeCNAME, "codereview.chromium.org", |
332 &results, default_time_); | 335 &results, default_time_); |
333 | 336 |
334 EXPECT_EQ(1u, results.size()); | 337 EXPECT_EQ(1u, results.size()); |
335 | 338 |
336 scoped_ptr<const RecordParsed> record_out = | 339 scoped_ptr<const RecordParsed> record_out = |
337 cache_.RemoveRecord(results.front()); | 340 cache_.RemoveRecord(results.front()); |
338 | 341 |
339 EXPECT_EQ(record_out.get(), results.front()); | 342 EXPECT_EQ(record_out.get(), results.front()); |
340 | 343 |
341 cache_.FindDnsRecords(dns_protocol::kTypeCNAME, "codereview.chromium.org", | 344 cache_.FindDnsRecords(dns_protocol::kTypeCNAME, "codereview.chromium.org", |
342 &results, default_time_); | 345 &results, default_time_); |
343 | 346 |
344 EXPECT_EQ(0u, results.size()); | 347 EXPECT_EQ(0u, results.size()); |
345 } | 348 } |
346 | 349 |
347 } // namespace net | 350 } // namespace net |
OLD | NEW |