| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/base/host_resolver_impl.h" | 5 #include "net/base/host_resolver_impl.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 HostResolverProc* resolver_proc) { | 44 HostResolverProc* resolver_proc) { |
| 45 return HostResolverImpl::ProcTaskParams(resolver_proc, | 45 return HostResolverImpl::ProcTaskParams(resolver_proc, |
| 46 kMaxRetryAttempts); | 46 kMaxRetryAttempts); |
| 47 } | 47 } |
| 48 | 48 |
| 49 HostResolverImpl* CreateHostResolverImpl(HostResolverProc* resolver_proc) { | 49 HostResolverImpl* CreateHostResolverImpl(HostResolverProc* resolver_proc) { |
| 50 return new HostResolverImpl( | 50 return new HostResolverImpl( |
| 51 HostCache::CreateDefaultCache(), | 51 HostCache::CreateDefaultCache(), |
| 52 DefaultLimits(), | 52 DefaultLimits(), |
| 53 DefaultParams(resolver_proc), | 53 DefaultParams(resolver_proc), |
| 54 scoped_ptr<DnsConfigService>(NULL), |
| 54 NULL); | 55 NULL); |
| 55 } | 56 } |
| 56 | 57 |
| 57 // This HostResolverImpl will only allow 1 outstanding resolve at a time. | 58 // This HostResolverImpl will only allow 1 outstanding resolve at a time. |
| 58 HostResolverImpl* CreateSerialHostResolverImpl( | 59 HostResolverImpl* CreateSerialHostResolverImpl( |
| 59 HostResolverProc* resolver_proc) { | 60 HostResolverProc* resolver_proc) { |
| 60 HostResolverImpl::ProcTaskParams params = DefaultParams(resolver_proc); | 61 HostResolverImpl::ProcTaskParams params = DefaultParams(resolver_proc); |
| 61 params.max_retry_attempts = 0u; | 62 params.max_retry_attempts = 0u; |
| 62 | 63 |
| 63 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); | 64 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); |
| 64 | 65 |
| 65 return new HostResolverImpl(HostCache::CreateDefaultCache(), | 66 return new HostResolverImpl(HostCache::CreateDefaultCache(), |
| 66 limits, | 67 limits, |
| 67 params, | 68 params, |
| 69 scoped_ptr<DnsConfigService>(NULL), |
| 68 NULL); | 70 NULL); |
| 69 } | 71 } |
| 70 | 72 |
| 71 // Helper to create a HostResolver::RequestInfo. | 73 // Helper to create a HostResolver::RequestInfo. |
| 72 HostResolver::RequestInfo CreateResolverRequest( | 74 HostResolver::RequestInfo CreateResolverRequest( |
| 73 const std::string& hostname, | 75 const std::string& hostname, |
| 74 RequestPriority priority) { | 76 RequestPriority priority) { |
| 75 HostResolver::RequestInfo info(HostPortPair(hostname, 80)); | 77 HostResolver::RequestInfo info(HostPortPair(hostname, 80)); |
| 76 info.set_priority(priority); | 78 info.set_priority(priority); |
| 77 return info; | 79 return info; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 107 } | 109 } |
| 108 | 110 |
| 109 void Signal() { | 111 void Signal() { |
| 110 event_.Signal(); | 112 event_.Signal(); |
| 111 } | 113 } |
| 112 | 114 |
| 113 virtual int Resolve(const std::string& hostname, | 115 virtual int Resolve(const std::string& hostname, |
| 114 AddressFamily address_family, | 116 AddressFamily address_family, |
| 115 HostResolverFlags host_resolver_flags, | 117 HostResolverFlags host_resolver_flags, |
| 116 AddressList* addrlist, | 118 AddressList* addrlist, |
| 117 int* os_error) { | 119 int* os_error) OVERRIDE { |
| 118 event_.Wait(); | 120 event_.Wait(); |
| 119 { | 121 { |
| 120 base::AutoLock l(lock_); | 122 base::AutoLock l(lock_); |
| 121 capture_list_.push_back(CaptureEntry(hostname, address_family)); | 123 capture_list_.push_back(CaptureEntry(hostname, address_family)); |
| 122 } | 124 } |
| 123 return ResolveUsingPrevious(hostname, address_family, | 125 return ResolveUsingPrevious(hostname, address_family, |
| 124 host_resolver_flags, addrlist, os_error); | 126 host_resolver_flags, addrlist, os_error); |
| 125 } | 127 } |
| 126 | 128 |
| 127 CaptureList GetCaptureList() const { | 129 CaptureList GetCaptureList() const { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 154 // z = value of address_family | 156 // z = value of address_family |
| 155 // | 157 // |
| 156 class EchoingHostResolverProc : public HostResolverProc { | 158 class EchoingHostResolverProc : public HostResolverProc { |
| 157 public: | 159 public: |
| 158 EchoingHostResolverProc() : HostResolverProc(NULL) {} | 160 EchoingHostResolverProc() : HostResolverProc(NULL) {} |
| 159 | 161 |
| 160 virtual int Resolve(const std::string& hostname, | 162 virtual int Resolve(const std::string& hostname, |
| 161 AddressFamily address_family, | 163 AddressFamily address_family, |
| 162 HostResolverFlags host_resolver_flags, | 164 HostResolverFlags host_resolver_flags, |
| 163 AddressList* addrlist, | 165 AddressList* addrlist, |
| 164 int* os_error) { | 166 int* os_error) OVERRIDE { |
| 165 // Encode the request's hostname and address_family in the output address. | 167 // Encode the request's hostname and address_family in the output address. |
| 166 std::string ip_literal = base::StringPrintf("192.%d.%d.%d", | 168 std::string ip_literal = base::StringPrintf("192.%d.%d.%d", |
| 167 static_cast<int>(hostname.size()), | 169 static_cast<int>(hostname.size()), |
| 168 static_cast<int>(hostname[0]), | 170 static_cast<int>(hostname[0]), |
| 169 static_cast<int>(address_family)); | 171 static_cast<int>(address_family)); |
| 170 | 172 |
| 171 return SystemHostResolverProc(ip_literal, | 173 return SystemHostResolverProc(ip_literal, |
| 172 ADDRESS_FAMILY_UNSPECIFIED, | 174 ADDRESS_FAMILY_UNSPECIFIED, |
| 173 host_resolver_flags, | 175 host_resolver_flags, |
| 174 addrlist, os_error); | 176 addrlist, os_error); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 int total_attempts_resolved() { return total_attempts_resolved_; } | 222 int total_attempts_resolved() { return total_attempts_resolved_; } |
| 221 | 223 |
| 222 // Returns the first attempt that that has resolved the host. | 224 // Returns the first attempt that that has resolved the host. |
| 223 int resolved_attempt_number() { return resolved_attempt_number_; } | 225 int resolved_attempt_number() { return resolved_attempt_number_; } |
| 224 | 226 |
| 225 // HostResolverProc methods. | 227 // HostResolverProc methods. |
| 226 virtual int Resolve(const std::string& host, | 228 virtual int Resolve(const std::string& host, |
| 227 AddressFamily address_family, | 229 AddressFamily address_family, |
| 228 HostResolverFlags host_resolver_flags, | 230 HostResolverFlags host_resolver_flags, |
| 229 AddressList* addrlist, | 231 AddressList* addrlist, |
| 230 int* os_error) { | 232 int* os_error) OVERRIDE { |
| 231 bool wait_for_right_attempt_to_complete = true; | 233 bool wait_for_right_attempt_to_complete = true; |
| 232 { | 234 { |
| 233 base::AutoLock auto_lock(lock_); | 235 base::AutoLock auto_lock(lock_); |
| 234 ++current_attempt_number_; | 236 ++current_attempt_number_; |
| 235 if (current_attempt_number_ == attempt_number_to_resolve_) { | 237 if (current_attempt_number_ == attempt_number_to_resolve_) { |
| 236 resolved_attempt_number_ = current_attempt_number_; | 238 resolved_attempt_number_ = current_attempt_number_; |
| 237 wait_for_right_attempt_to_complete = false; | 239 wait_for_right_attempt_to_complete = false; |
| 238 } | 240 } |
| 239 } | 241 } |
| 240 | 242 |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 } | 429 } |
| 428 | 430 |
| 429 TEST_F(HostResolverImplTest, FailedAsynchronousLookup) { | 431 TEST_F(HostResolverImplTest, FailedAsynchronousLookup) { |
| 430 AddressList addrlist; | 432 AddressList addrlist; |
| 431 const int kPortnum = 80; | 433 const int kPortnum = 80; |
| 432 | 434 |
| 433 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 435 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
| 434 new RuleBasedHostResolverProc(NULL)); | 436 new RuleBasedHostResolverProc(NULL)); |
| 435 resolver_proc->AddSimulatedFailure("just.testing"); | 437 resolver_proc->AddSimulatedFailure("just.testing"); |
| 436 | 438 |
| 437 scoped_ptr<HostResolver> host_resolver( | 439 scoped_ptr<HostResolver> host_resolver(CreateHostResolverImpl(resolver_proc)); |
| 438 CreateHostResolverImpl(resolver_proc)); | |
| 439 | 440 |
| 440 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); | 441 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); |
| 441 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 442 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 442 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, | 443 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, |
| 443 log.bound()); | 444 log.bound()); |
| 444 EXPECT_EQ(ERR_IO_PENDING, err); | 445 EXPECT_EQ(ERR_IO_PENDING, err); |
| 445 | 446 |
| 446 CapturingNetLog::EntryList entries; | 447 CapturingNetLog::EntryList entries; |
| 447 log.GetEntries(&entries); | 448 log.GetEntries(&entries); |
| 448 | 449 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 463 | 464 |
| 464 // Also test that the error is not cached! | 465 // Also test that the error is not cached! |
| 465 err = host_resolver->ResolveFromCache(info, &addrlist, log.bound()); | 466 err = host_resolver->ResolveFromCache(info, &addrlist, log.bound()); |
| 466 EXPECT_EQ(ERR_DNS_CACHE_MISS, err); | 467 EXPECT_EQ(ERR_DNS_CACHE_MISS, err); |
| 467 } | 468 } |
| 468 | 469 |
| 469 // Using WaitingHostResolverProc you can simulate very long lookups. | 470 // Using WaitingHostResolverProc you can simulate very long lookups. |
| 470 class WaitingHostResolverProc : public HostResolverProc { | 471 class WaitingHostResolverProc : public HostResolverProc { |
| 471 public: | 472 public: |
| 472 explicit WaitingHostResolverProc(HostResolverProc* previous) | 473 explicit WaitingHostResolverProc(HostResolverProc* previous) |
| 473 : HostResolverProc(previous), | 474 : HostResolverProc(previous), |
| 474 is_waiting_(false, false), | 475 is_waiting_(false, false), |
| 475 is_signaled_(false, false) {} | 476 is_signaled_(false, false) {} |
| 477 |
| 478 // If |manual_reset| is true, once Signalled, it will let all Resolve calls |
| 479 // proceed. |
| 480 WaitingHostResolverProc(HostResolverProc* previous, bool manual_reset) |
| 481 : HostResolverProc(previous), |
| 482 is_waiting_(false, false), |
| 483 is_signaled_(manual_reset, false) {} |
| 476 | 484 |
| 477 // Waits until a call to |Resolve| is blocked. It is recommended to always | 485 // Waits until a call to |Resolve| is blocked. It is recommended to always |
| 478 // |Wait| before |Signal|, and required if issuing a series of two or more | 486 // |Wait| before |Signal|, and required if issuing a series of two or more |
| 479 // calls to |Signal|, because |WaitableEvent| does not count the number of | 487 // calls to |Signal|, because |WaitableEvent| does not count the number of |
| 480 // signals. | 488 // signals. |
| 481 void Wait() { | 489 void Wait() { |
| 482 is_waiting_.Wait(); | 490 is_waiting_.Wait(); |
| 483 } | 491 } |
| 484 | 492 |
| 485 // Signals a waiting call to |Resolve|. | 493 // Signals a waiting call to |Resolve|. |
| 486 void Signal() { | 494 void Signal() { |
| 487 is_signaled_.Signal(); | 495 is_signaled_.Signal(); |
| 488 } | 496 } |
| 489 | 497 |
| 490 // HostResolverProc methods: | 498 // HostResolverProc methods: |
| 491 virtual int Resolve(const std::string& host, | 499 virtual int Resolve(const std::string& host, |
| 492 AddressFamily address_family, | 500 AddressFamily address_family, |
| 493 HostResolverFlags host_resolver_flags, | 501 HostResolverFlags host_resolver_flags, |
| 494 AddressList* addrlist, | 502 AddressList* addrlist, |
| 495 int* os_error) { | 503 int* os_error) OVERRIDE { |
| 496 is_waiting_.Signal(); | 504 is_waiting_.Signal(); |
| 497 is_signaled_.Wait(); | 505 is_signaled_.Wait(); |
| 498 return ResolveUsingPrevious(host, address_family, host_resolver_flags, | 506 return ResolveUsingPrevious(host, address_family, host_resolver_flags, |
| 499 addrlist, os_error); | 507 addrlist, os_error); |
| 500 } | 508 } |
| 501 | 509 |
| 502 private: | 510 private: |
| 503 virtual ~WaitingHostResolverProc() {} | 511 virtual ~WaitingHostResolverProc() {} |
| 504 | |
| 505 base::WaitableEvent is_waiting_; | 512 base::WaitableEvent is_waiting_; |
| 506 base::WaitableEvent is_signaled_; | 513 base::WaitableEvent is_signaled_; |
| 507 }; | 514 }; |
| 508 | 515 |
| 509 TEST_F(HostResolverImplTest, AbortedAsynchronousLookup) { | 516 TEST_F(HostResolverImplTest, AbortedAsynchronousLookup) { |
| 510 scoped_refptr<WaitingHostResolverProc> resolver_proc( | 517 scoped_refptr<WaitingHostResolverProc> resolver_proc( |
| 511 new WaitingHostResolverProc(NULL)); | 518 new WaitingHostResolverProc(NULL)); |
| 512 | 519 |
| 513 CapturingNetLog net_log(CapturingNetLog::kUnbounded); | 520 CapturingNetLog net_log(CapturingNetLog::kUnbounded); |
| 514 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 521 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 515 { | 522 { |
| 516 // This resolver will be destroyed while a lookup is running on WorkerPool. | 523 // This resolver will be destroyed while a lookup is running on WorkerPool. |
| 517 scoped_ptr<HostResolver> host_resolver( | 524 scoped_ptr<HostResolver> host_resolver( |
| 518 new HostResolverImpl(HostCache::CreateDefaultCache(), | 525 new HostResolverImpl(HostCache::CreateDefaultCache(), |
| 519 DefaultLimits(), | 526 DefaultLimits(), |
| 520 DefaultParams(resolver_proc), | 527 DefaultParams(resolver_proc), |
| 528 scoped_ptr<DnsConfigService>(NULL), |
| 521 &net_log)); | 529 &net_log)); |
| 522 AddressList addrlist; | 530 AddressList addrlist; |
| 523 const int kPortnum = 80; | 531 const int kPortnum = 80; |
| 524 | 532 |
| 525 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); | 533 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); |
| 526 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, | 534 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, |
| 527 log.bound()); | 535 log.bound()); |
| 528 EXPECT_EQ(ERR_IO_PENDING, err); | 536 EXPECT_EQ(ERR_IO_PENDING, err); |
| 529 | 537 |
| 530 resolver_proc->Wait(); | 538 resolver_proc->Wait(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 546 | 554 |
| 547 int pos = ExpectLogContainsSomewhereAfter(net_log_entries, 0, | 555 int pos = ExpectLogContainsSomewhereAfter(net_log_entries, 0, |
| 548 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, | 556 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, |
| 549 NetLog::PHASE_BEGIN); | 557 NetLog::PHASE_BEGIN); |
| 550 pos = ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, | 558 pos = ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, |
| 551 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB, | 559 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB, |
| 552 NetLog::PHASE_BEGIN); | 560 NetLog::PHASE_BEGIN); |
| 553 pos = ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, | 561 pos = ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, |
| 554 NetLog::TYPE_HOST_RESOLVER_IMPL_PROC_TASK, | 562 NetLog::TYPE_HOST_RESOLVER_IMPL_PROC_TASK, |
| 555 NetLog::PHASE_BEGIN); | 563 NetLog::PHASE_BEGIN); |
| 556 // Both Request and ProcTask need to be cancelled. (The Job is "aborted".) | 564 |
| 557 pos = ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, | 565 // The Request needs to be cancelled. (The Job is "aborted".) |
| 558 NetLog::TYPE_CANCELLED, | 566 // Don't care about order in which Request, Job and ProcTask end. |
| 559 NetLog::PHASE_NONE); | |
| 560 // Don't care about order in which Request, Job and ProcTask end, or when the | |
| 561 // other one is cancelled. | |
| 562 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, | 567 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, |
| 563 NetLog::TYPE_CANCELLED, | 568 NetLog::TYPE_CANCELLED, |
| 564 NetLog::PHASE_NONE); | 569 NetLog::PHASE_NONE); |
| 565 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, | 570 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, |
| 571 NetLog::TYPE_HOST_RESOLVER_IMPL_PROC_TASK, |
| 572 NetLog::PHASE_END); |
| 573 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, |
| 566 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, | 574 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, |
| 567 NetLog::PHASE_END); | 575 NetLog::PHASE_END); |
| 568 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, | 576 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, |
| 569 NetLog::TYPE_HOST_RESOLVER_IMPL_PROC_TASK, | |
| 570 NetLog::PHASE_END); | |
| 571 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, | |
| 572 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB, | 577 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB, |
| 573 NetLog::PHASE_END); | 578 NetLog::PHASE_END); |
| 574 | 579 |
| 575 EXPECT_FALSE(callback_called_); | 580 EXPECT_FALSE(callback_called_); |
| 576 } | 581 } |
| 577 | 582 |
| 578 TEST_F(HostResolverImplTest, NumericIPv4Address) { | 583 TEST_F(HostResolverImplTest, NumericIPv4Address) { |
| 579 // Stevens says dotted quads with AI_UNSPEC resolve to a single sockaddr_in. | 584 // Stevens says dotted quads with AI_UNSPEC resolve to a single sockaddr_in. |
| 580 | 585 |
| 581 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 586 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 672 | 677 |
| 673 // Helper class used by HostResolverImplTest.DeDupeRequests. It receives request | 678 // Helper class used by HostResolverImplTest.DeDupeRequests. It receives request |
| 674 // completion notifications for all the resolves, so it can tally up and | 679 // completion notifications for all the resolves, so it can tally up and |
| 675 // determine when we are done. | 680 // determine when we are done. |
| 676 class DeDupeRequestsVerifier : public ResolveRequest::Delegate { | 681 class DeDupeRequestsVerifier : public ResolveRequest::Delegate { |
| 677 public: | 682 public: |
| 678 explicit DeDupeRequestsVerifier(CapturingHostResolverProc* resolver_proc) | 683 explicit DeDupeRequestsVerifier(CapturingHostResolverProc* resolver_proc) |
| 679 : count_a_(0), count_b_(0), resolver_proc_(resolver_proc) {} | 684 : count_a_(0), count_b_(0), resolver_proc_(resolver_proc) {} |
| 680 | 685 |
| 681 // The test does 5 resolves (which can complete in any order). | 686 // The test does 5 resolves (which can complete in any order). |
| 682 virtual void OnCompleted(ResolveRequest* resolve) { | 687 virtual void OnCompleted(ResolveRequest* resolve) OVERRIDE { |
| 683 // Tally up how many requests we have seen. | 688 // Tally up how many requests we have seen. |
| 684 if (resolve->hostname() == "a") { | 689 if (resolve->hostname() == "a") { |
| 685 count_a_++; | 690 count_a_++; |
| 686 } else if (resolve->hostname() == "b") { | 691 } else if (resolve->hostname() == "b") { |
| 687 count_b_++; | 692 count_b_++; |
| 688 } else { | 693 } else { |
| 689 FAIL() << "Unexpected hostname: " << resolve->hostname(); | 694 FAIL() << "Unexpected hostname: " << resolve->hostname(); |
| 690 } | 695 } |
| 691 | 696 |
| 692 // Check that the port was set correctly. | 697 // Check that the port was set correctly. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 745 // |verifier| will send quit message once all the requests have finished. | 750 // |verifier| will send quit message once all the requests have finished. |
| 746 MessageLoop::current()->Run(); | 751 MessageLoop::current()->Run(); |
| 747 } | 752 } |
| 748 | 753 |
| 749 // Helper class used by HostResolverImplTest.CancelMultipleRequests. | 754 // Helper class used by HostResolverImplTest.CancelMultipleRequests. |
| 750 class CancelMultipleRequestsVerifier : public ResolveRequest::Delegate { | 755 class CancelMultipleRequestsVerifier : public ResolveRequest::Delegate { |
| 751 public: | 756 public: |
| 752 CancelMultipleRequestsVerifier() {} | 757 CancelMultipleRequestsVerifier() {} |
| 753 | 758 |
| 754 // The cancels kill all but one request. | 759 // The cancels kill all but one request. |
| 755 virtual void OnCompleted(ResolveRequest* resolve) { | 760 virtual void OnCompleted(ResolveRequest* resolve) OVERRIDE { |
| 756 EXPECT_EQ("a", resolve->hostname()); | 761 EXPECT_EQ("a", resolve->hostname()); |
| 757 EXPECT_EQ(82, resolve->port()); | 762 EXPECT_EQ(82, resolve->port()); |
| 758 | 763 |
| 759 // Check that the port was set correctly. | 764 // Check that the port was set correctly. |
| 760 EXPECT_EQ(resolve->port(), resolve->addrlist().GetPort()); | 765 EXPECT_EQ(resolve->port(), resolve->addrlist().GetPort()); |
| 761 | 766 |
| 762 // End this test, we are done. | 767 // End this test, we are done. |
| 763 MessageLoop::current()->Quit(); | 768 MessageLoop::current()->Quit(); |
| 764 } | 769 } |
| 765 | 770 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 803 MessageLoop::current()->Run(); | 808 MessageLoop::current()->Run(); |
| 804 } | 809 } |
| 805 | 810 |
| 806 // Helper class used by HostResolverImplTest.CancelWithinCallback. | 811 // Helper class used by HostResolverImplTest.CancelWithinCallback. |
| 807 class CancelWithinCallbackVerifier : public ResolveRequest::Delegate { | 812 class CancelWithinCallbackVerifier : public ResolveRequest::Delegate { |
| 808 public: | 813 public: |
| 809 CancelWithinCallbackVerifier() | 814 CancelWithinCallbackVerifier() |
| 810 : req_to_cancel1_(NULL), req_to_cancel2_(NULL), num_completions_(0) { | 815 : req_to_cancel1_(NULL), req_to_cancel2_(NULL), num_completions_(0) { |
| 811 } | 816 } |
| 812 | 817 |
| 813 virtual void OnCompleted(ResolveRequest* resolve) { | 818 virtual void OnCompleted(ResolveRequest* resolve) OVERRIDE { |
| 814 num_completions_++; | 819 num_completions_++; |
| 815 | 820 |
| 816 // Port 80 is the first request that the callback will be invoked for. | 821 // Port 80 is the first request that the callback will be invoked for. |
| 817 // While we are executing within that callback, cancel the other requests | 822 // While we are executing within that callback, cancel the other requests |
| 818 // in the job and start another request. | 823 // in the job and start another request. |
| 819 if (80 == resolve->port()) { | 824 if (80 == resolve->port()) { |
| 820 EXPECT_EQ("a", resolve->hostname()); | 825 EXPECT_EQ("a", resolve->hostname()); |
| 821 | 826 |
| 822 req_to_cancel1_->Cancel(); | 827 req_to_cancel1_->Cancel(); |
| 823 req_to_cancel2_->Cancel(); | 828 req_to_cancel2_->Cancel(); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 886 } | 891 } |
| 887 | 892 |
| 888 // Helper class used by HostResolverImplTest.DeleteWithinCallback. | 893 // Helper class used by HostResolverImplTest.DeleteWithinCallback. |
| 889 class DeleteWithinCallbackVerifier : public ResolveRequest::Delegate { | 894 class DeleteWithinCallbackVerifier : public ResolveRequest::Delegate { |
| 890 public: | 895 public: |
| 891 // |host_resolver| is the resolver that the the resolve requests were started | 896 // |host_resolver| is the resolver that the the resolve requests were started |
| 892 // with. | 897 // with. |
| 893 explicit DeleteWithinCallbackVerifier(HostResolver* host_resolver) | 898 explicit DeleteWithinCallbackVerifier(HostResolver* host_resolver) |
| 894 : host_resolver_(host_resolver) {} | 899 : host_resolver_(host_resolver) {} |
| 895 | 900 |
| 896 virtual void OnCompleted(ResolveRequest* resolve) { | 901 virtual void OnCompleted(ResolveRequest* resolve) OVERRIDE { |
| 897 EXPECT_EQ("a", resolve->hostname()); | 902 EXPECT_EQ("a", resolve->hostname()); |
| 898 EXPECT_EQ(80, resolve->port()); | 903 EXPECT_EQ(80, resolve->port()); |
| 899 | 904 |
| 900 // Deletes the host resolver. | 905 // Deletes the host resolver. |
| 901 host_resolver_.reset(); | 906 host_resolver_.reset(); |
| 902 | 907 |
| 903 // Quit after returning from OnCompleted (to give it a chance at | 908 // Quit after returning from OnCompleted (to give it a chance at |
| 904 // incorrectly running the cancelled tasks). | 909 // incorrectly running the cancelled tasks). |
| 905 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure()); | 910 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
| 906 } | 911 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 936 | 941 |
| 937 // |verifier| will send quit message once all the requests have finished. | 942 // |verifier| will send quit message once all the requests have finished. |
| 938 MessageLoop::current()->Run(); | 943 MessageLoop::current()->Run(); |
| 939 } | 944 } |
| 940 | 945 |
| 941 // Helper class used by HostResolverImplTest.StartWithinCallback. | 946 // Helper class used by HostResolverImplTest.StartWithinCallback. |
| 942 class StartWithinCallbackVerifier : public ResolveRequest::Delegate { | 947 class StartWithinCallbackVerifier : public ResolveRequest::Delegate { |
| 943 public: | 948 public: |
| 944 StartWithinCallbackVerifier() : num_requests_(0) {} | 949 StartWithinCallbackVerifier() : num_requests_(0) {} |
| 945 | 950 |
| 946 virtual void OnCompleted(ResolveRequest* resolve) { | 951 virtual void OnCompleted(ResolveRequest* resolve) OVERRIDE { |
| 947 EXPECT_EQ("a", resolve->hostname()); | 952 EXPECT_EQ("a", resolve->hostname()); |
| 948 | 953 |
| 949 if (80 == resolve->port()) { | 954 if (80 == resolve->port()) { |
| 950 // On completing the first request, start another request for "a". | 955 // On completing the first request, start another request for "a". |
| 951 // Since caching is disabled, this will result in another async request. | 956 // Since caching is disabled, this will result in another async request. |
| 952 final_request_.reset(new ResolveRequest( | 957 final_request_.reset(new ResolveRequest( |
| 953 resolve->resolver(), "a", 70, this)); | 958 resolve->resolver(), "a", 70, this)); |
| 954 } | 959 } |
| 955 if (++num_requests_ == 5) { | 960 if (++num_requests_ == 5) { |
| 956 // Test is done. | 961 // Test is done. |
| 957 MessageLoop::current()->Quit(); | 962 MessageLoop::current()->Quit(); |
| 958 } | 963 } |
| 959 } | 964 } |
| 960 | 965 |
| 961 private: | 966 private: |
| 962 int num_requests_; | 967 int num_requests_; |
| 963 scoped_ptr<ResolveRequest> final_request_; | 968 scoped_ptr<ResolveRequest> final_request_; |
| 964 DISALLOW_COPY_AND_ASSIGN(StartWithinCallbackVerifier); | 969 DISALLOW_COPY_AND_ASSIGN(StartWithinCallbackVerifier); |
| 965 }; | 970 }; |
| 966 | 971 |
| 967 TEST_F(HostResolverImplTest, StartWithinCallback) { | 972 TEST_F(HostResolverImplTest, StartWithinCallback) { |
| 968 // Use a capturing resolver_proc, since the verifier needs to know what calls | 973 // Use a capturing resolver_proc, since the verifier needs to know what calls |
| 969 // reached Resolver(). Also, the capturing resolver_proc is initially | 974 // reached Resolver(). Also, the capturing resolver_proc is initially |
| 970 // blocked. | 975 // blocked. |
| 971 scoped_refptr<CapturingHostResolverProc> resolver_proc( | 976 scoped_refptr<CapturingHostResolverProc> resolver_proc( |
| 972 new CapturingHostResolverProc(NULL)); | 977 new CapturingHostResolverProc(NULL)); |
| 973 | 978 |
| 974 // Turn off caching for this host resolver. | 979 // Turn off caching for this host resolver. |
| 975 scoped_ptr<HostResolver> host_resolver(new HostResolverImpl( | 980 scoped_ptr<HostResolver> host_resolver(new HostResolverImpl( |
| 976 NULL, DefaultLimits(), DefaultParams(resolver_proc), NULL)); | 981 NULL, |
| 982 DefaultLimits(), |
| 983 DefaultParams(resolver_proc), |
| 984 scoped_ptr<DnsConfigService>(NULL), |
| 985 NULL)); |
| 977 | 986 |
| 978 // The class will receive callbacks for when each resolve completes. It | 987 // The class will receive callbacks for when each resolve completes. It |
| 979 // checks that the right things happened. | 988 // checks that the right things happened. |
| 980 StartWithinCallbackVerifier verifier; | 989 StartWithinCallbackVerifier verifier; |
| 981 | 990 |
| 982 // Start 4 requests, duplicating hosts "a". Since the resolver_proc is | 991 // Start 4 requests, duplicating hosts "a". Since the resolver_proc is |
| 983 // blocked, these should all pile up until we signal it. | 992 // blocked, these should all pile up until we signal it. |
| 984 | 993 |
| 985 ResolveRequest req1(host_resolver.get(), "a", 80, &verifier); | 994 ResolveRequest req1(host_resolver.get(), "a", 80, &verifier); |
| 986 ResolveRequest req2(host_resolver.get(), "a", 81, &verifier); | 995 ResolveRequest req2(host_resolver.get(), "a", 81, &verifier); |
| 987 ResolveRequest req3(host_resolver.get(), "a", 82, &verifier); | 996 ResolveRequest req3(host_resolver.get(), "a", 82, &verifier); |
| 988 ResolveRequest req4(host_resolver.get(), "a", 83, &verifier); | 997 ResolveRequest req4(host_resolver.get(), "a", 83, &verifier); |
| 989 | 998 |
| 990 // Ready, Set, GO!!! | 999 // Ready, Set, GO!!! |
| 991 resolver_proc->Signal(); | 1000 resolver_proc->Signal(); |
| 992 | 1001 |
| 993 // |verifier| will send quit message once all the requests have finished. | 1002 // |verifier| will send quit message once all the requests have finished. |
| 994 MessageLoop::current()->Run(); | 1003 MessageLoop::current()->Run(); |
| 995 } | 1004 } |
| 996 | 1005 |
| 997 // Helper class used by HostResolverImplTest.BypassCache. | 1006 // Helper class used by HostResolverImplTest.BypassCache. |
| 998 class BypassCacheVerifier : public ResolveRequest::Delegate { | 1007 class BypassCacheVerifier : public ResolveRequest::Delegate { |
| 999 public: | 1008 public: |
| 1000 BypassCacheVerifier() {} | 1009 BypassCacheVerifier() {} |
| 1001 | 1010 |
| 1002 virtual void OnCompleted(ResolveRequest* resolve) { | 1011 virtual void OnCompleted(ResolveRequest* resolve) OVERRIDE { |
| 1003 EXPECT_EQ("a", resolve->hostname()); | 1012 EXPECT_EQ("a", resolve->hostname()); |
| 1004 HostResolver* resolver = resolve->resolver(); | 1013 HostResolver* resolver = resolve->resolver(); |
| 1005 | 1014 |
| 1006 if (80 == resolve->port()) { | 1015 if (80 == resolve->port()) { |
| 1007 // On completing the first request, start another request for "a". | 1016 // On completing the first request, start another request for "a". |
| 1008 // Since caching is enabled, this should complete synchronously. | 1017 // Since caching is enabled, this should complete synchronously. |
| 1009 | 1018 |
| 1010 // Note that |junk_callback| shouldn't be used since we are going to | 1019 // Note that |junk_callback| shouldn't be used since we are going to |
| 1011 // complete synchronously. | 1020 // complete synchronously. |
| 1012 TestCompletionCallback junk_callback; | 1021 TestCompletionCallback junk_callback; |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1134 EXPECT_EQ(ERR_ABORTED, callback.WaitForResult()); | 1143 EXPECT_EQ(ERR_ABORTED, callback.WaitForResult()); |
| 1135 | 1144 |
| 1136 rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, | 1145 rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
| 1137 BoundNetLog()); | 1146 BoundNetLog()); |
| 1138 EXPECT_EQ(ERR_IO_PENDING, rv); | 1147 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1139 resolver_proc->Wait(); | 1148 resolver_proc->Wait(); |
| 1140 resolver_proc->Signal(); | 1149 resolver_proc->Signal(); |
| 1141 EXPECT_EQ(OK, callback.WaitForResult()); | 1150 EXPECT_EQ(OK, callback.WaitForResult()); |
| 1142 } | 1151 } |
| 1143 | 1152 |
| 1144 class ResolveWithinCallback { | 1153 // Helper class used by AbortOnlyExistingRequestsOnIPAddressChange. |
| 1154 class StartWithinAbortedCallbackVerifier : public ResolveRequest::Delegate { |
| 1145 public: | 1155 public: |
| 1146 explicit ResolveWithinCallback(const HostResolver::RequestInfo& info) | 1156 explicit StartWithinAbortedCallbackVerifier(const std::string& next_hostname) |
| 1147 : info_(info) {} | 1157 : next_hostname_(next_hostname) {} |
| 1148 | 1158 |
| 1149 const CompletionCallback& callback() const { return callback_.callback(); } | 1159 virtual void OnCompleted(ResolveRequest* resolve) OVERRIDE { |
| 1150 | 1160 if (request_.get() == NULL) { |
| 1151 int WaitForResult() { | 1161 EXPECT_EQ(ERR_ABORTED, resolve->result()); |
| 1152 int result = callback_.WaitForResult(); | 1162 // Start new request for a different hostname to ensure that the order |
| 1153 // Ditch the WaitingHostResolverProc so that the subsequent request | 1163 // of jobs in HostResolverImpl is not stable. |
| 1154 // succeeds. | 1164 request_.reset(new ResolveRequest(resolve->resolver(), |
| 1155 host_resolver_.reset( | 1165 next_hostname_, |
| 1156 CreateHostResolverImpl(CreateCatchAllHostResolverProc())); | 1166 resolve->port(), |
| 1157 EXPECT_EQ(ERR_IO_PENDING, | 1167 this)); |
| 1158 host_resolver_->Resolve(info_, &addrlist_, | 1168 } else { |
| 1159 nested_callback_.callback(), NULL, | 1169 EXPECT_EQ(resolve, request_.get()); |
| 1160 BoundNetLog())); | 1170 callback_.callback().Run(resolve->result()); |
| 1161 return result; | 1171 } |
| 1162 } | 1172 } |
| 1163 | 1173 |
| 1164 int WaitForNestedResult() { | 1174 int WaitUntilDone() { |
| 1165 return nested_callback_.WaitForResult(); | 1175 return callback_.WaitForResult(); |
| 1166 } | 1176 } |
| 1167 | 1177 |
| 1168 private: | 1178 private: |
| 1169 const HostResolver::RequestInfo info_; | 1179 std::string next_hostname_; |
| 1170 AddressList addrlist_; | 1180 scoped_ptr<ResolveRequest> request_; |
| 1171 TestCompletionCallback callback_; | 1181 TestCompletionCallback callback_; |
| 1172 TestCompletionCallback nested_callback_; | 1182 DISALLOW_COPY_AND_ASSIGN(StartWithinAbortedCallbackVerifier); |
| 1173 scoped_ptr<HostResolver> host_resolver_; | |
| 1174 }; | 1183 }; |
| 1175 | 1184 |
| 1176 TEST_F(HostResolverImplTest, OnlyAbortExistingRequestsOnIPAddressChange) { | 1185 // Tests that a new Request made from the callback of a previously aborted one |
| 1186 // will not be aborted. |
| 1187 TEST_F(HostResolverImplTest, AbortOnlyExistingRequestsOnIPAddressChange) { |
| 1188 // Setting |manual_reset| to true so that Signal unblocks all calls. |
| 1177 scoped_refptr<WaitingHostResolverProc> resolver_proc( | 1189 scoped_refptr<WaitingHostResolverProc> resolver_proc( |
| 1178 new WaitingHostResolverProc(CreateCatchAllHostResolverProc())); | 1190 new WaitingHostResolverProc(CreateCatchAllHostResolverProc(), true)); |
| 1179 scoped_ptr<HostResolver> host_resolver(CreateHostResolverImpl(resolver_proc)); | 1191 scoped_ptr<HostResolver> host_resolver(CreateHostResolverImpl(resolver_proc)); |
| 1180 | 1192 |
| 1181 // Resolve "host1". | 1193 StartWithinAbortedCallbackVerifier verifier1("zzz"); |
| 1182 HostResolver::RequestInfo info(HostPortPair("host1", 70)); | 1194 StartWithinAbortedCallbackVerifier verifier2("aaa"); |
| 1183 ResolveWithinCallback callback(info); | 1195 StartWithinAbortedCallbackVerifier verifier3("eee"); |
| 1184 AddressList addrlist; | |
| 1185 int rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, | |
| 1186 BoundNetLog()); | |
| 1187 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 1188 | 1196 |
| 1197 ResolveRequest req1(host_resolver.get(), "bbb", 40, &verifier1); |
| 1198 ResolveRequest req2(host_resolver.get(), "eee", 80, &verifier2); |
| 1199 ResolveRequest req3(host_resolver.get(), "ccc", 90, &verifier3); |
| 1200 // The jobs start immediately. |
| 1201 // Wait until at least one is blocked. |
| 1189 resolver_proc->Wait(); | 1202 resolver_proc->Wait(); |
| 1190 // Triggering an IP address change. | 1203 // Trigger an IP address change. |
| 1191 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 1204 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 1192 MessageLoop::current()->RunAllPending(); // Notification happens async. | 1205 // This should abort all running jobs. |
| 1193 EXPECT_EQ(ERR_ABORTED, callback.WaitForResult()); | 1206 MessageLoop::current()->RunAllPending(); |
| 1194 resolver_proc->Signal(); // release the thread from WorkerPool for cleanup | 1207 EXPECT_EQ(ERR_ABORTED, req1.result()); |
| 1195 EXPECT_EQ(OK, callback.WaitForNestedResult()); | 1208 EXPECT_EQ(ERR_ABORTED, req2.result()); |
| 1209 EXPECT_EQ(ERR_ABORTED, req3.result()); |
| 1210 // Unblock all calls to proc. |
| 1211 resolver_proc->Signal(); |
| 1212 // Run until the re-started requests finish. |
| 1213 EXPECT_EQ(OK, verifier1.WaitUntilDone()); |
| 1214 EXPECT_EQ(OK, verifier2.WaitUntilDone()); |
| 1215 EXPECT_EQ(OK, verifier3.WaitUntilDone()); |
| 1216 MessageLoop::current()->AssertIdle(); |
| 1196 } | 1217 } |
| 1197 | 1218 |
| 1198 // Tests that when the maximum threads is set to 1, requests are dequeued | 1219 // Tests that when the maximum threads is set to 1, requests are dequeued |
| 1199 // in order of priority. | 1220 // in order of priority. |
| 1200 TEST_F(HostResolverImplTest, HigherPriorityRequestsStartedFirst) { | 1221 TEST_F(HostResolverImplTest, HigherPriorityRequestsStartedFirst) { |
| 1201 scoped_refptr<CapturingHostResolverProc> resolver_proc( | 1222 scoped_refptr<CapturingHostResolverProc> resolver_proc( |
| 1202 new CapturingHostResolverProc(NULL)); | 1223 new CapturingHostResolverProc(NULL)); |
| 1203 | 1224 |
| 1204 scoped_ptr<HostResolverImpl> host_resolver( | 1225 scoped_ptr<HostResolverImpl> host_resolver( |
| 1205 CreateSerialHostResolverImpl(resolver_proc)); | 1226 CreateSerialHostResolverImpl(resolver_proc)); |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1568 // the host. First and second attempt will be forced to sleep until they get | 1589 // the host. First and second attempt will be forced to sleep until they get |
| 1569 // word that a resolution has completed. The 3rd resolution attempt will try | 1590 // word that a resolution has completed. The 3rd resolution attempt will try |
| 1570 // to get done ASAP, and won't sleep.. | 1591 // to get done ASAP, and won't sleep.. |
| 1571 int kAttemptNumberToResolve = 3; | 1592 int kAttemptNumberToResolve = 3; |
| 1572 int kTotalAttempts = 3; | 1593 int kTotalAttempts = 3; |
| 1573 | 1594 |
| 1574 scoped_refptr<LookupAttemptHostResolverProc> resolver_proc( | 1595 scoped_refptr<LookupAttemptHostResolverProc> resolver_proc( |
| 1575 new LookupAttemptHostResolverProc( | 1596 new LookupAttemptHostResolverProc( |
| 1576 NULL, kAttemptNumberToResolve, kTotalAttempts)); | 1597 NULL, kAttemptNumberToResolve, kTotalAttempts)); |
| 1577 | 1598 |
| 1578 HostResolverImpl::ProcTaskParams params = DefaultParams(resolver_proc); | 1599 HostResolverImpl::ProcTaskParams params = DefaultParams(resolver_proc.get()); |
| 1579 | 1600 |
| 1580 // Specify smaller interval for unresponsive_delay_ for HostResolverImpl so | 1601 // Specify smaller interval for unresponsive_delay_ for HostResolverImpl so |
| 1581 // that unit test runs faster. For example, this test finishes in 1.5 secs | 1602 // that unit test runs faster. For example, this test finishes in 1.5 secs |
| 1582 // (500ms * 3). | 1603 // (500ms * 3). |
| 1583 params.unresponsive_delay = TimeDelta::FromMilliseconds(500); | 1604 params.unresponsive_delay = TimeDelta::FromMilliseconds(500); |
| 1584 | 1605 |
| 1585 scoped_ptr<HostResolverImpl> host_resolver( | 1606 scoped_ptr<HostResolverImpl> host_resolver( |
| 1586 new HostResolverImpl(HostCache::CreateDefaultCache(), | 1607 new HostResolverImpl(HostCache::CreateDefaultCache(), |
| 1587 DefaultLimits(), | 1608 DefaultLimits(), |
| 1588 params, | 1609 params, |
| 1610 scoped_ptr<DnsConfigService>(NULL), |
| 1589 NULL)); | 1611 NULL)); |
| 1590 | 1612 |
| 1591 // Resolve "host1". | 1613 // Resolve "host1". |
| 1592 HostResolver::RequestInfo info(HostPortPair("host1", 70)); | 1614 HostResolver::RequestInfo info(HostPortPair("host1", 70)); |
| 1593 TestCompletionCallback callback; | 1615 TestCompletionCallback callback; |
| 1594 AddressList addrlist; | 1616 AddressList addrlist; |
| 1595 int rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, | 1617 int rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
| 1596 BoundNetLog()); | 1618 BoundNetLog()); |
| 1597 EXPECT_EQ(ERR_IO_PENDING, rv); | 1619 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1598 | 1620 |
| 1599 // Resolve returns -4 to indicate that 3rd attempt has resolved the host. | 1621 // Resolve returns -4 to indicate that 3rd attempt has resolved the host. |
| 1600 EXPECT_EQ(-4, callback.WaitForResult()); | 1622 EXPECT_EQ(-4, callback.WaitForResult()); |
| 1601 | 1623 |
| 1602 resolver_proc->WaitForAllAttemptsToFinish(TimeDelta::FromMilliseconds(60000)); | 1624 resolver_proc->WaitForAllAttemptsToFinish(TimeDelta::FromMilliseconds(60000)); |
| 1603 MessageLoop::current()->RunAllPending(); | 1625 MessageLoop::current()->RunAllPending(); |
| 1604 | 1626 |
| 1605 EXPECT_EQ(resolver_proc->total_attempts_resolved(), kTotalAttempts); | 1627 EXPECT_EQ(resolver_proc->total_attempts_resolved(), kTotalAttempts); |
| 1606 EXPECT_EQ(resolver_proc->resolved_attempt_number(), kAttemptNumberToResolve); | 1628 EXPECT_EQ(resolver_proc->resolved_attempt_number(), kAttemptNumberToResolve); |
| 1607 } | 1629 } |
| 1608 | 1630 |
| 1609 // TODO(cbentzel): Test a mix of requests with different HostResolverFlags. | 1631 // TODO(cbentzel): Test a mix of requests with different HostResolverFlags. |
| 1610 | 1632 |
| 1611 } // namespace net | 1633 } // namespace net |
| OLD | NEW |