| 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 |