| 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 10 matching lines...) Expand all Loading... |
| 21 #include "base/time.h" | 21 #include "base/time.h" |
| 22 #include "net/base/address_list.h" | 22 #include "net/base/address_list.h" |
| 23 #include "net/base/completion_callback.h" | 23 #include "net/base/completion_callback.h" |
| 24 #include "net/base/host_cache.h" | 24 #include "net/base/host_cache.h" |
| 25 #include "net/base/mock_host_resolver.h" | 25 #include "net/base/mock_host_resolver.h" |
| 26 #include "net/base/net_errors.h" | 26 #include "net/base/net_errors.h" |
| 27 #include "net/base/net_log_unittest.h" | 27 #include "net/base/net_log_unittest.h" |
| 28 #include "net/base/net_util.h" | 28 #include "net/base/net_util.h" |
| 29 #include "net/base/sys_addrinfo.h" | 29 #include "net/base/sys_addrinfo.h" |
| 30 #include "net/base/test_completion_callback.h" | 30 #include "net/base/test_completion_callback.h" |
| 31 #include "net/dns/dns_client.h" |
| 32 #include "net/dns/dns_test_util.h" |
| 31 #include "testing/gtest/include/gtest/gtest.h" | 33 #include "testing/gtest/include/gtest/gtest.h" |
| 32 | 34 |
| 33 namespace net { | 35 namespace net { |
| 36 namespace { |
| 34 | 37 |
| 35 using base::TimeDelta; | 38 using base::TimeDelta; |
| 36 using base::TimeTicks; | 39 using base::TimeTicks; |
| 37 | 40 |
| 38 static const size_t kMaxJobs = 10u; | 41 const size_t kMaxJobs = 10u; |
| 39 static const size_t kMaxRetryAttempts = 4u; | 42 const size_t kMaxRetryAttempts = 4u; |
| 40 | 43 |
| 41 PrioritizedDispatcher::Limits DefaultLimits() { | 44 PrioritizedDispatcher::Limits DefaultLimits() { |
| 42 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, kMaxJobs); | 45 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, kMaxJobs); |
| 43 return limits; | 46 return limits; |
| 44 } | 47 } |
| 45 | 48 |
| 46 HostResolverImpl::ProcTaskParams DefaultParams( | 49 HostResolverImpl::ProcTaskParams DefaultParams( |
| 47 HostResolverProc* resolver_proc) { | 50 HostResolverProc* resolver_proc) { |
| 48 return HostResolverImpl::ProcTaskParams(resolver_proc, | 51 return HostResolverImpl::ProcTaskParams(resolver_proc, |
| 49 kMaxRetryAttempts); | 52 kMaxRetryAttempts); |
| 50 } | 53 } |
| 51 | 54 |
| 52 HostResolverImpl* CreateHostResolverImpl(HostResolverProc* resolver_proc) { | 55 HostResolverImpl* CreateHostResolverImpl(HostResolverProc* resolver_proc) { |
| 53 return new HostResolverImpl( | 56 return new HostResolverImpl( |
| 54 HostCache::CreateDefaultCache(), | 57 HostCache::CreateDefaultCache(), |
| 55 DefaultLimits(), | 58 DefaultLimits(), |
| 56 DefaultParams(resolver_proc), | 59 DefaultParams(resolver_proc), |
| 57 scoped_ptr<DnsConfigService>(NULL), | 60 scoped_ptr<DnsConfigService>(NULL), |
| 58 NULL); | 61 NULL); |
| 59 } | 62 } |
| 60 | 63 |
| 64 HostResolverImpl* CreateHostResolverImplWithDnsConfig( |
| 65 HostResolverProc* resolver_proc, |
| 66 scoped_ptr<DnsConfigService> config_service) { |
| 67 return new HostResolverImpl( |
| 68 HostCache::CreateDefaultCache(), |
| 69 DefaultLimits(), |
| 70 DefaultParams(resolver_proc), |
| 71 config_service.Pass(), |
| 72 NULL); |
| 73 } |
| 74 |
| 61 // This HostResolverImpl will only allow 1 outstanding resolve at a time. | 75 // This HostResolverImpl will only allow 1 outstanding resolve at a time. |
| 62 HostResolverImpl* CreateSerialHostResolverImpl( | 76 HostResolverImpl* CreateSerialHostResolverImpl( |
| 63 HostResolverProc* resolver_proc) { | 77 HostResolverProc* resolver_proc) { |
| 64 HostResolverImpl::ProcTaskParams params = DefaultParams(resolver_proc); | 78 HostResolverImpl::ProcTaskParams params = DefaultParams(resolver_proc); |
| 65 params.max_retry_attempts = 0u; | 79 params.max_retry_attempts = 0u; |
| 66 | 80 |
| 67 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); | 81 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1); |
| 68 | 82 |
| 69 return new HostResolverImpl(HostCache::CreateDefaultCache(), | 83 return new HostResolverImpl(HostCache::CreateDefaultCache(), |
| 70 limits, | 84 limits, |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 // resolve results by forwarding them to Delegate. | 404 // resolve results by forwarding them to Delegate. |
| 391 class ResolveRequest { | 405 class ResolveRequest { |
| 392 public: | 406 public: |
| 393 // Delegate interface, for notification when the ResolveRequest completes. | 407 // Delegate interface, for notification when the ResolveRequest completes. |
| 394 class Delegate { | 408 class Delegate { |
| 395 public: | 409 public: |
| 396 virtual ~Delegate() {} | 410 virtual ~Delegate() {} |
| 397 virtual void OnCompleted(ResolveRequest* resolve) = 0; | 411 virtual void OnCompleted(ResolveRequest* resolve) = 0; |
| 398 }; | 412 }; |
| 399 | 413 |
| 414 // For asynchronous resolutions. |
| 400 ResolveRequest(HostResolver* resolver, | 415 ResolveRequest(HostResolver* resolver, |
| 401 const std::string& hostname, | 416 const std::string& hostname, |
| 402 int port, | 417 int port, |
| 403 Delegate* delegate) | 418 Delegate* delegate) |
| 404 : info_(HostPortPair(hostname, port)), | 419 : info_(HostPortPair(hostname, port)), |
| 405 resolver_(resolver), | 420 resolver_(resolver), |
| 406 delegate_(delegate) { | 421 delegate_(delegate) { |
| 407 // Start the request. | 422 // Start the request. |
| 408 int err = resolver->Resolve( | 423 int err = resolver->Resolve( |
| 409 info_, &addrlist_, | 424 info_, &addrlist_, |
| 410 base::Bind(&ResolveRequest::OnLookupFinished, base::Unretained(this)), | 425 base::Bind(&ResolveRequest::OnLookupFinished, base::Unretained(this)), |
| 411 &req_, BoundNetLog()); | 426 &req_, BoundNetLog()); |
| 412 EXPECT_EQ(ERR_IO_PENDING, err); | 427 EXPECT_EQ(ERR_IO_PENDING, err); |
| 413 } | 428 } |
| 414 | 429 |
| 430 // For asynchronous resolutions. |
| 415 ResolveRequest(HostResolver* resolver, | 431 ResolveRequest(HostResolver* resolver, |
| 416 const HostResolver::RequestInfo& info, | 432 const HostResolver::RequestInfo& info, |
| 417 Delegate* delegate) | 433 Delegate* delegate) |
| 418 : info_(info), resolver_(resolver), delegate_(delegate) { | 434 : info_(info), resolver_(resolver), delegate_(delegate) { |
| 419 // Start the request. | 435 // Start the request. |
| 420 int err = resolver->Resolve( | 436 int err = resolver->Resolve( |
| 421 info, &addrlist_, | 437 info, &addrlist_, |
| 422 base::Bind(&ResolveRequest::OnLookupFinished, | 438 base::Bind(&ResolveRequest::OnLookupFinished, |
| 423 base::Unretained(this)), | 439 base::Unretained(this)), |
| 424 &req_, BoundNetLog()); | 440 &req_, BoundNetLog()); |
| 425 EXPECT_EQ(ERR_IO_PENDING, err); | 441 EXPECT_EQ(ERR_IO_PENDING, err); |
| 426 } | 442 } |
| 427 | 443 |
| 444 // For synchronous resolutions. |
| 445 ResolveRequest(HostResolver* resolver, |
| 446 const std::string& hostname, |
| 447 int port) |
| 448 : info_(HostPortPair(hostname, port)), |
| 449 resolver_(resolver), |
| 450 delegate_(NULL) { |
| 451 // Start the request. |
| 452 result_ = resolver->Resolve( |
| 453 info_, &addrlist_, |
| 454 base::Bind(&ResolveRequest::OnLookupFinished, base::Unretained(this)), |
| 455 &req_, BoundNetLog()); |
| 456 EXPECT_NE(ERR_IO_PENDING, result_); |
| 457 } |
| 458 |
| 459 // For synchronous resolutions. |
| 460 ResolveRequest(HostResolver* resolver, |
| 461 const HostResolver::RequestInfo& info) |
| 462 : info_(info), |
| 463 resolver_(resolver), |
| 464 delegate_(NULL) { |
| 465 // Start the request. |
| 466 result_ = resolver->Resolve( |
| 467 info_, &addrlist_, |
| 468 base::Bind(&ResolveRequest::OnLookupFinished, base::Unretained(this)), |
| 469 &req_, BoundNetLog()); |
| 470 EXPECT_NE(ERR_IO_PENDING, result_); |
| 471 } |
| 472 |
| 428 void Cancel() { | 473 void Cancel() { |
| 429 resolver_->CancelRequest(req_); | 474 resolver_->CancelRequest(req_); |
| 430 } | 475 } |
| 431 | 476 |
| 432 const std::string& hostname() const { | 477 const std::string& hostname() const { |
| 433 return info_.hostname(); | 478 return info_.hostname(); |
| 434 } | 479 } |
| 435 | 480 |
| 436 int port() const { | 481 int port() const { |
| 437 return info_.port(); | 482 return info_.port(); |
| 438 } | 483 } |
| 439 | 484 |
| 440 int result() const { | 485 int result() const { |
| 441 return result_; | 486 return result_; |
| 442 } | 487 } |
| 443 | 488 |
| 444 const AddressList& addrlist() const { | 489 const AddressList& addrlist() const { |
| 445 return addrlist_; | 490 return addrlist_; |
| 446 } | 491 } |
| 447 | 492 |
| 448 HostResolver* resolver() const { | 493 HostResolver* resolver() const { |
| 449 return resolver_; | 494 return resolver_; |
| 450 } | 495 } |
| 451 | 496 |
| 452 private: | 497 private: |
| 453 void OnLookupFinished(int result) { | 498 void OnLookupFinished(int result) { |
| 499 EXPECT_TRUE(delegate_ != NULL); |
| 500 if (delegate_ == NULL) |
| 501 return; |
| 454 result_ = result; | 502 result_ = result; |
| 455 delegate_->OnCompleted(this); | 503 delegate_->OnCompleted(this); |
| 456 } | 504 } |
| 457 | 505 |
| 458 // The request details. | 506 // The request details. |
| 459 HostResolver::RequestInfo info_; | 507 HostResolver::RequestInfo info_; |
| 460 HostResolver::RequestHandle req_; | 508 HostResolver::RequestHandle req_; |
| 461 | 509 |
| 462 // The result of the resolve. | 510 // The result of the resolve. |
| 463 int result_; | 511 int result_; |
| 464 AddressList addrlist_; | 512 AddressList addrlist_; |
| 465 | 513 |
| 466 HostResolver* resolver_; | 514 HostResolver* resolver_; |
| 467 | 515 |
| 468 Delegate* delegate_; | 516 Delegate* delegate_; |
| 469 | 517 |
| 470 DISALLOW_COPY_AND_ASSIGN(ResolveRequest); | 518 DISALLOW_COPY_AND_ASSIGN(ResolveRequest); |
| 471 }; | 519 }; |
| 472 | 520 |
| 521 // TODO(szym): Make this fixture more useful. http://crbug.com/117830 |
| 473 class HostResolverImplTest : public testing::Test { | 522 class HostResolverImplTest : public testing::Test { |
| 474 public: | 523 public: |
| 475 HostResolverImplTest() | 524 HostResolverImplTest() |
| 476 : callback_called_(false), | 525 : callback_called_(false), |
| 477 ALLOW_THIS_IN_INITIALIZER_LIST(callback_( | 526 ALLOW_THIS_IN_INITIALIZER_LIST(callback_( |
| 478 base::Bind(&HostResolverImplTest::OnLookupFinished, | 527 base::Bind(&HostResolverImplTest::OnLookupFinished, |
| 479 base::Unretained(this)))) { | 528 base::Unretained(this)))) { |
| 480 } | 529 } |
| 481 | 530 |
| 482 protected: | 531 protected: |
| 483 void OnLookupFinished(int result) { | 532 void OnLookupFinished(int result) { |
| 484 callback_called_ = true; | 533 callback_called_ = true; |
| 485 callback_result_ = result; | 534 callback_result_ = result; |
| 486 MessageLoop::current()->Quit(); | 535 MessageLoop::current()->Quit(); |
| 487 } | 536 } |
| 488 | 537 |
| 489 bool callback_called_; | 538 bool callback_called_; |
| 490 int callback_result_; | 539 int callback_result_; |
| 491 CompletionCallback callback_; | 540 CompletionCallback callback_; |
| 492 }; | 541 }; |
| 493 | 542 |
| 543 // Returns the first address in |addr_list| in "host:port" form, empty string if |
| 544 // the list is empty, or "UNSUPPORTED" if the address cannot be converted. |
| 545 std::string FirstAddressToString(const AddressList& addr_list) { |
| 546 const struct addrinfo* ai = addr_list.head(); |
| 547 if (!ai) |
| 548 return ""; |
| 549 std::string out = NetAddressToStringWithPort(ai); |
| 550 if (out.empty()) |
| 551 return "UNSUPPORTED"; |
| 552 return out; |
| 553 } |
| 554 |
| 555 // Returns the number of addresses in |addr_list|. |
| 556 unsigned NumberOfAddresses(const AddressList& addr_list) { |
| 557 unsigned count = 0; |
| 558 for (const struct addrinfo* ai = addr_list.head(); |
| 559 ai != NULL; |
| 560 ai = ai->ai_next) { |
| 561 ++count; |
| 562 } |
| 563 return count; |
| 564 } |
| 565 |
| 566 } // namespace net |
| 567 |
| 494 TEST_F(HostResolverImplTest, AsynchronousLookup) { | 568 TEST_F(HostResolverImplTest, AsynchronousLookup) { |
| 495 AddressList addrlist; | 569 AddressList addrlist; |
| 496 const int kPortnum = 80; | |
| 497 | 570 |
| 498 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 571 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
| 499 new RuleBasedHostResolverProc(NULL)); | 572 new RuleBasedHostResolverProc(NULL)); |
| 500 resolver_proc->AddRule("just.testing", "192.168.1.42"); | 573 resolver_proc->AddRule("just.testing", "192.168.1.42"); |
| 501 | 574 |
| 502 scoped_ptr<HostResolver> host_resolver( | 575 scoped_ptr<HostResolver> host_resolver( |
| 503 CreateHostResolverImpl(resolver_proc)); | 576 CreateHostResolverImpl(resolver_proc)); |
| 504 | 577 |
| 505 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); | 578 HostResolver::RequestInfo info(HostPortPair("just.testing", 80)); |
| 506 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 579 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 507 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, | 580 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, |
| 508 log.bound()); | 581 log.bound()); |
| 509 EXPECT_EQ(ERR_IO_PENDING, err); | 582 EXPECT_EQ(ERR_IO_PENDING, err); |
| 510 | 583 |
| 511 CapturingNetLog::EntryList entries; | 584 CapturingNetLog::EntryList entries; |
| 512 log.GetEntries(&entries); | 585 log.GetEntries(&entries); |
| 513 | 586 |
| 514 EXPECT_EQ(1u, entries.size()); | 587 EXPECT_EQ(1u, entries.size()); |
| 515 EXPECT_TRUE(LogContainsBeginEvent( | 588 EXPECT_TRUE(LogContainsBeginEvent( |
| 516 entries, 0, NetLog::TYPE_HOST_RESOLVER_IMPL)); | 589 entries, 0, NetLog::TYPE_HOST_RESOLVER_IMPL)); |
| 517 | 590 |
| 518 MessageLoop::current()->Run(); | 591 MessageLoop::current()->Run(); |
| 519 | 592 |
| 520 ASSERT_TRUE(callback_called_); | 593 ASSERT_TRUE(callback_called_); |
| 521 ASSERT_EQ(OK, callback_result_); | 594 ASSERT_EQ(OK, callback_result_); |
| 522 | 595 |
| 523 log.GetEntries(&entries); | 596 log.GetEntries(&entries); |
| 524 | 597 |
| 525 EXPECT_EQ(2u, entries.size()); | 598 EXPECT_EQ(2u, entries.size()); |
| 526 EXPECT_TRUE(LogContainsEndEvent( | 599 EXPECT_TRUE(LogContainsEndEvent( |
| 527 entries, 1, NetLog::TYPE_HOST_RESOLVER_IMPL)); | 600 entries, 1, NetLog::TYPE_HOST_RESOLVER_IMPL)); |
| 528 | 601 |
| 529 const struct addrinfo* ainfo = addrlist.head(); | 602 EXPECT_EQ("192.168.1.42:80", FirstAddressToString(addrlist)); |
| 530 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); | 603 EXPECT_EQ(1u, NumberOfAddresses(addrlist)); |
| 531 EXPECT_EQ(sizeof(struct sockaddr_in), static_cast<size_t>(ainfo->ai_addrlen)); | |
| 532 | |
| 533 const struct sockaddr* sa = ainfo->ai_addr; | |
| 534 const struct sockaddr_in* sa_in = (const struct sockaddr_in*) sa; | |
| 535 EXPECT_TRUE(htons(kPortnum) == sa_in->sin_port); | |
| 536 EXPECT_TRUE(htonl(0xc0a8012a) == sa_in->sin_addr.s_addr); | |
| 537 } | 604 } |
| 538 | 605 |
| 539 TEST_F(HostResolverImplTest, FailedAsynchronousLookup) { | 606 TEST_F(HostResolverImplTest, FailedAsynchronousLookup) { |
| 540 AddressList addrlist; | 607 AddressList addrlist; |
| 541 const int kPortnum = 80; | |
| 542 | |
| 543 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 608 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
| 544 new RuleBasedHostResolverProc(NULL)); | 609 new RuleBasedHostResolverProc(NULL)); |
| 545 resolver_proc->AddSimulatedFailure("just.testing"); | 610 resolver_proc->AddSimulatedFailure("just.testing"); |
| 546 | 611 |
| 547 scoped_ptr<HostResolver> host_resolver(CreateHostResolverImpl(resolver_proc)); | 612 scoped_ptr<HostResolver> host_resolver(CreateHostResolverImpl(resolver_proc)); |
| 548 | 613 |
| 549 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); | 614 HostResolver::RequestInfo info(HostPortPair("just.testing", 80)); |
| 550 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 615 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 551 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, | 616 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, |
| 552 log.bound()); | 617 log.bound()); |
| 553 EXPECT_EQ(ERR_IO_PENDING, err); | 618 EXPECT_EQ(ERR_IO_PENDING, err); |
| 554 | 619 |
| 555 CapturingNetLog::EntryList entries; | 620 CapturingNetLog::EntryList entries; |
| 556 log.GetEntries(&entries); | 621 log.GetEntries(&entries); |
| 557 | 622 |
| 558 EXPECT_EQ(1u, entries.size()); | 623 EXPECT_EQ(1u, entries.size()); |
| 559 EXPECT_TRUE(LogContainsBeginEvent( | 624 EXPECT_TRUE(LogContainsBeginEvent( |
| (...skipping 23 matching lines...) Expand all Loading... |
| 583 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 648 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 584 { | 649 { |
| 585 // This resolver will be destroyed while a lookup is running on WorkerPool. | 650 // This resolver will be destroyed while a lookup is running on WorkerPool. |
| 586 scoped_ptr<HostResolver> host_resolver( | 651 scoped_ptr<HostResolver> host_resolver( |
| 587 new HostResolverImpl(HostCache::CreateDefaultCache(), | 652 new HostResolverImpl(HostCache::CreateDefaultCache(), |
| 588 DefaultLimits(), | 653 DefaultLimits(), |
| 589 DefaultParams(resolver_proc), | 654 DefaultParams(resolver_proc), |
| 590 scoped_ptr<DnsConfigService>(NULL), | 655 scoped_ptr<DnsConfigService>(NULL), |
| 591 &net_log)); | 656 &net_log)); |
| 592 AddressList addrlist; | 657 AddressList addrlist; |
| 593 const int kPortnum = 80; | 658 HostResolver::RequestInfo info(HostPortPair("just.testing", 80)); |
| 594 | |
| 595 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); | |
| 596 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, | 659 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, |
| 597 log.bound()); | 660 log.bound()); |
| 598 EXPECT_EQ(ERR_IO_PENDING, err); | 661 EXPECT_EQ(ERR_IO_PENDING, err); |
| 599 | 662 |
| 600 resolver_proc->Wait(); | 663 resolver_proc->Wait(); |
| 601 } | 664 } |
| 602 | 665 |
| 603 resolver_proc->Signal(); | 666 resolver_proc->Signal(); |
| 604 | 667 |
| 605 CapturingNetLog::EntryList entries; | 668 CapturingNetLog::EntryList entries; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 TEST_F(HostResolverImplTest, NumericIPv4Address) { | 708 TEST_F(HostResolverImplTest, NumericIPv4Address) { |
| 646 // Stevens says dotted quads with AI_UNSPEC resolve to a single sockaddr_in. | 709 // Stevens says dotted quads with AI_UNSPEC resolve to a single sockaddr_in. |
| 647 | 710 |
| 648 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 711 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
| 649 new RuleBasedHostResolverProc(NULL)); | 712 new RuleBasedHostResolverProc(NULL)); |
| 650 resolver_proc->AllowDirectLookup("*"); | 713 resolver_proc->AllowDirectLookup("*"); |
| 651 | 714 |
| 652 scoped_ptr<HostResolver> host_resolver( | 715 scoped_ptr<HostResolver> host_resolver( |
| 653 CreateHostResolverImpl(resolver_proc)); | 716 CreateHostResolverImpl(resolver_proc)); |
| 654 AddressList addrlist; | 717 AddressList addrlist; |
| 655 const int kPortnum = 5555; | |
| 656 TestCompletionCallback callback; | 718 TestCompletionCallback callback; |
| 657 HostResolver::RequestInfo info(HostPortPair("127.1.2.3", kPortnum)); | 719 HostResolver::RequestInfo info(HostPortPair("127.1.2.3", 5555)); |
| 658 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, | 720 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
| 659 BoundNetLog()); | 721 BoundNetLog()); |
| 660 EXPECT_EQ(OK, err); | 722 EXPECT_EQ(OK, err); |
| 661 | 723 |
| 662 const struct addrinfo* ainfo = addrlist.head(); | 724 EXPECT_EQ("127.1.2.3:5555", FirstAddressToString(addrlist)); |
| 663 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); | 725 EXPECT_EQ(1u, NumberOfAddresses(addrlist)); |
| 664 EXPECT_EQ(sizeof(struct sockaddr_in), static_cast<size_t>(ainfo->ai_addrlen)); | |
| 665 | |
| 666 const struct sockaddr* sa = ainfo->ai_addr; | |
| 667 const struct sockaddr_in* sa_in = (const struct sockaddr_in*) sa; | |
| 668 EXPECT_TRUE(htons(kPortnum) == sa_in->sin_port); | |
| 669 EXPECT_TRUE(htonl(0x7f010203) == sa_in->sin_addr.s_addr); | |
| 670 } | 726 } |
| 671 | 727 |
| 672 TEST_F(HostResolverImplTest, NumericIPv6Address) { | 728 TEST_F(HostResolverImplTest, NumericIPv6Address) { |
| 673 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 729 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
| 674 new RuleBasedHostResolverProc(NULL)); | 730 new RuleBasedHostResolverProc(NULL)); |
| 675 resolver_proc->AllowDirectLookup("*"); | 731 resolver_proc->AllowDirectLookup("*"); |
| 676 | 732 |
| 677 // Resolve a plain IPv6 address. Don't worry about [brackets], because | 733 // Resolve a plain IPv6 address. Don't worry about [brackets], because |
| 678 // the caller should have removed them. | 734 // the caller should have removed them. |
| 679 scoped_ptr<HostResolver> host_resolver( | 735 scoped_ptr<HostResolver> host_resolver( |
| 680 CreateHostResolverImpl(resolver_proc)); | 736 CreateHostResolverImpl(resolver_proc)); |
| 681 AddressList addrlist; | 737 AddressList addrlist; |
| 682 const int kPortnum = 5555; | |
| 683 TestCompletionCallback callback; | 738 TestCompletionCallback callback; |
| 684 HostResolver::RequestInfo info(HostPortPair("2001:db8::1", kPortnum)); | 739 HostResolver::RequestInfo info(HostPortPair("2001:db8::1", 5555)); |
| 685 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, | 740 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
| 686 BoundNetLog()); | 741 BoundNetLog()); |
| 687 EXPECT_EQ(OK, err); | 742 EXPECT_EQ(OK, err); |
| 688 | 743 |
| 689 const struct addrinfo* ainfo = addrlist.head(); | 744 std::string ipv6string = FirstAddressToString(addrlist); |
| 690 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); | 745 if (ipv6string != "UNSUPPORTED") |
| 691 EXPECT_EQ(sizeof(struct sockaddr_in6), | 746 EXPECT_EQ("[2001:db8::1]:5555", ipv6string); |
| 692 static_cast<size_t>(ainfo->ai_addrlen)); | 747 EXPECT_EQ(1u, NumberOfAddresses(addrlist)); |
| 693 | |
| 694 const struct sockaddr* sa = ainfo->ai_addr; | |
| 695 const struct sockaddr_in6* sa_in6 = (const struct sockaddr_in6*) sa; | |
| 696 EXPECT_TRUE(htons(kPortnum) == sa_in6->sin6_port); | |
| 697 | |
| 698 const uint8 expect_addr[] = { | |
| 699 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, | |
| 700 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 | |
| 701 }; | |
| 702 for (int i = 0; i < 16; i++) { | |
| 703 EXPECT_EQ(expect_addr[i], sa_in6->sin6_addr.s6_addr[i]); | |
| 704 } | |
| 705 } | 748 } |
| 706 | 749 |
| 707 TEST_F(HostResolverImplTest, EmptyHost) { | 750 TEST_F(HostResolverImplTest, EmptyHost) { |
| 708 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 751 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
| 709 new RuleBasedHostResolverProc(NULL)); | 752 new RuleBasedHostResolverProc(NULL)); |
| 710 resolver_proc->AllowDirectLookup("*"); | 753 resolver_proc->AllowDirectLookup("*"); |
| 711 | 754 |
| 712 scoped_ptr<HostResolver> host_resolver( | 755 scoped_ptr<HostResolver> host_resolver( |
| 713 CreateHostResolverImpl(resolver_proc)); | 756 CreateHostResolverImpl(resolver_proc)); |
| 714 AddressList addrlist; | 757 AddressList addrlist; |
| 715 const int kPortnum = 5555; | |
| 716 TestCompletionCallback callback; | 758 TestCompletionCallback callback; |
| 717 HostResolver::RequestInfo info(HostPortPair("", kPortnum)); | 759 HostResolver::RequestInfo info(HostPortPair("", 5555)); |
| 718 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, | 760 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
| 719 BoundNetLog()); | 761 BoundNetLog()); |
| 720 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err); | 762 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err); |
| 721 } | 763 } |
| 722 | 764 |
| 723 TEST_F(HostResolverImplTest, LongHost) { | 765 TEST_F(HostResolverImplTest, LongHost) { |
| 724 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 766 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
| 725 new RuleBasedHostResolverProc(NULL)); | 767 new RuleBasedHostResolverProc(NULL)); |
| 726 resolver_proc->AllowDirectLookup("*"); | 768 resolver_proc->AllowDirectLookup("*"); |
| 727 | 769 |
| 728 scoped_ptr<HostResolver> host_resolver( | 770 scoped_ptr<HostResolver> host_resolver( |
| 729 CreateHostResolverImpl(resolver_proc)); | 771 CreateHostResolverImpl(resolver_proc)); |
| 730 AddressList addrlist; | 772 AddressList addrlist; |
| 731 const int kPortnum = 5555; | |
| 732 std::string hostname(4097, 'a'); | 773 std::string hostname(4097, 'a'); |
| 733 TestCompletionCallback callback; | 774 TestCompletionCallback callback; |
| 734 HostResolver::RequestInfo info(HostPortPair(hostname, kPortnum)); | 775 HostResolver::RequestInfo info(HostPortPair(hostname, 5555)); |
| 735 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, | 776 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
| 736 BoundNetLog()); | 777 BoundNetLog()); |
| 737 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err); | 778 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err); |
| 738 } | 779 } |
| 739 | 780 |
| 740 // Helper class used by HostResolverImplTest.DeDupeRequests. It receives request | 781 // Helper class used by HostResolverImplTest.DeDupeRequests. It receives request |
| 741 // completion notifications for all the resolves, so it can tally up and | 782 // completion notifications for all the resolves, so it can tally up and |
| 742 // determine when we are done. | 783 // determine when we are done. |
| 743 class DeDupeRequestsVerifier : public ResolveRequest::Delegate { | 784 class DeDupeRequestsVerifier : public ResolveRequest::Delegate { |
| 744 public: | 785 public: |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 863 req3.Cancel(); | 904 req3.Cancel(); |
| 864 req5.Cancel(); | 905 req5.Cancel(); |
| 865 | 906 |
| 866 // Ready, Set, GO!!! | 907 // Ready, Set, GO!!! |
| 867 resolver_proc->Signal(); | 908 resolver_proc->Signal(); |
| 868 | 909 |
| 869 // |verifier| will send quit message once all the requests have finished. | 910 // |verifier| will send quit message once all the requests have finished. |
| 870 MessageLoop::current()->Run(); | 911 MessageLoop::current()->Run(); |
| 871 } | 912 } |
| 872 | 913 |
| 873 // Helper class used by HostResolverImplTest.CanceledRequestsReleaseJobSlots. | 914 // Delegate which allows to wait for specific number of requests to complete. |
| 915 // Used by HostResolverImplTest.CanceledRequestsReleaseJobSlots and .DnsTask. |
| 874 class CountingDelegate : public ResolveRequest::Delegate { | 916 class CountingDelegate : public ResolveRequest::Delegate { |
| 875 public: | 917 public: |
| 876 CountingDelegate() : num_completions_(0) {} | 918 CountingDelegate() : num_completions_(0), awaited_num_completions_(0) {} |
| 877 | 919 |
| 878 virtual void OnCompleted(ResolveRequest* resolve) OVERRIDE { | 920 virtual void OnCompleted(ResolveRequest* resolve) OVERRIDE { |
| 879 ++num_completions_; | 921 ++num_completions_; |
| 880 MessageLoop::current()->Quit(); | 922 if (num_completions_ == awaited_num_completions_) |
| 923 MessageLoop::current()->Quit(); |
| 881 } | 924 } |
| 882 | 925 |
| 883 unsigned num_completions() const { return num_completions_; } | 926 unsigned num_completions() const { return num_completions_; } |
| 884 | 927 |
| 928 void WaitForCompletions(unsigned completions) { |
| 929 ASSERT_LT(num_completions_, completions); |
| 930 awaited_num_completions_ = completions; |
| 931 MessageLoop::current()->Run(); |
| 932 EXPECT_EQ(completions, num_completions_); |
| 933 } |
| 934 |
| 885 private: | 935 private: |
| 886 unsigned num_completions_; | 936 unsigned num_completions_; |
| 937 unsigned awaited_num_completions_; |
| 887 }; | 938 }; |
| 888 | 939 |
| 889 TEST_F(HostResolverImplTest, CanceledRequestsReleaseJobSlots) { | 940 TEST_F(HostResolverImplTest, CanceledRequestsReleaseJobSlots) { |
| 890 scoped_refptr<CountingHostResolverProc> resolver_proc( | 941 scoped_refptr<CountingHostResolverProc> resolver_proc( |
| 891 new CountingHostResolverProc(NULL)); | 942 new CountingHostResolverProc(NULL)); |
| 892 | 943 |
| 893 scoped_ptr<HostResolverImpl> host_resolver( | 944 scoped_ptr<HostResolverImpl> host_resolver( |
| 894 CreateHostResolverImpl(resolver_proc)); | 945 CreateHostResolverImpl(resolver_proc)); |
| 895 | 946 |
| 896 CountingDelegate delegate; | 947 CountingDelegate delegate; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 911 // Cancel all but last two. | 962 // Cancel all but last two. |
| 912 for (unsigned i = 0; i < requests.size() - 2; ++i) { | 963 for (unsigned i = 0; i < requests.size() - 2; ++i) { |
| 913 requests[i]->Cancel(); | 964 requests[i]->Cancel(); |
| 914 } | 965 } |
| 915 | 966 |
| 916 EXPECT_TRUE(resolver_proc->WaitFor(kMaxJobs + 1)); | 967 EXPECT_TRUE(resolver_proc->WaitFor(kMaxJobs + 1)); |
| 917 EXPECT_EQ(0u, delegate.num_completions()); | 968 EXPECT_EQ(0u, delegate.num_completions()); |
| 918 | 969 |
| 919 resolver_proc->SignalAll(); | 970 resolver_proc->SignalAll(); |
| 920 | 971 |
| 921 while (delegate.num_completions() < 2) | 972 delegate.WaitForCompletions(2); |
| 922 MessageLoop::current()->Run(); | |
| 923 | 973 |
| 924 EXPECT_EQ(0u, host_resolver->num_running_jobs_for_tests()); | 974 EXPECT_EQ(0u, host_resolver->num_running_jobs_for_tests()); |
| 925 } | 975 } |
| 926 | 976 |
| 927 // Helper class used by HostResolverImplTest.CancelWithinCallback. | 977 // Helper class used by HostResolverImplTest.CancelWithinCallback. |
| 928 class CancelWithinCallbackVerifier : public ResolveRequest::Delegate { | 978 class CancelWithinCallbackVerifier : public ResolveRequest::Delegate { |
| 929 public: | 979 public: |
| 930 CancelWithinCallbackVerifier() | 980 CancelWithinCallbackVerifier() |
| 931 : req_to_cancel1_(NULL), req_to_cancel2_(NULL), num_completions_(0) { | 981 : req_to_cancel1_(NULL), req_to_cancel2_(NULL), num_completions_(0) { |
| 932 } | 982 } |
| (...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1587 EXPECT_EQ(ADDRESS_FAMILY_IPV4, capture_list[0].address_family); | 1637 EXPECT_EQ(ADDRESS_FAMILY_IPV4, capture_list[0].address_family); |
| 1588 | 1638 |
| 1589 EXPECT_EQ("h1", capture_list[1].hostname); | 1639 EXPECT_EQ("h1", capture_list[1].hostname); |
| 1590 EXPECT_EQ(ADDRESS_FAMILY_IPV6, capture_list[1].address_family); | 1640 EXPECT_EQ(ADDRESS_FAMILY_IPV6, capture_list[1].address_family); |
| 1591 | 1641 |
| 1592 // Now check that the correct resolved IP addresses were returned. | 1642 // Now check that the correct resolved IP addresses were returned. |
| 1593 // Addresses take the form: 192.x.y.z | 1643 // Addresses take the form: 192.x.y.z |
| 1594 // x = length of hostname | 1644 // x = length of hostname |
| 1595 // y = ASCII value of hostname[0] | 1645 // y = ASCII value of hostname[0] |
| 1596 // z = value of address family | 1646 // z = value of address family |
| 1597 EXPECT_EQ("192.2.104.1", NetAddressToString(addrlist[0].head())); | 1647 EXPECT_EQ("192.2.104.1:80", FirstAddressToString(addrlist[0])); |
| 1598 EXPECT_EQ("192.2.104.1", NetAddressToString(addrlist[1].head())); | 1648 EXPECT_EQ("192.2.104.1:80", FirstAddressToString(addrlist[1])); |
| 1599 EXPECT_EQ("192.2.104.2", NetAddressToString(addrlist[2].head())); | 1649 EXPECT_EQ("192.2.104.2:80", FirstAddressToString(addrlist[2])); |
| 1650 EXPECT_EQ(1u, NumberOfAddresses(addrlist[0])); |
| 1651 EXPECT_EQ(1u, NumberOfAddresses(addrlist[1])); |
| 1652 EXPECT_EQ(1u, NumberOfAddresses(addrlist[2])); |
| 1600 } | 1653 } |
| 1601 | 1654 |
| 1602 // This is the exact same test as SetDefaultAddressFamily_IPv4, except the order | 1655 // This is the exact same test as SetDefaultAddressFamily_IPv4, except the order |
| 1603 // of requests 0 and 1 is flipped, and the default is set to IPv6 in place of | 1656 // of requests 0 and 1 is flipped, and the default is set to IPv6 in place of |
| 1604 // IPv4. | 1657 // IPv4. |
| 1605 TEST_F(HostResolverImplTest, SetDefaultAddressFamily_IPv6) { | 1658 TEST_F(HostResolverImplTest, SetDefaultAddressFamily_IPv6) { |
| 1606 scoped_refptr<CapturingHostResolverProc> resolver_proc( | 1659 scoped_refptr<CapturingHostResolverProc> resolver_proc( |
| 1607 new CapturingHostResolverProc(new EchoingHostResolverProc)); | 1660 new CapturingHostResolverProc(new EchoingHostResolverProc)); |
| 1608 | 1661 |
| 1609 scoped_ptr<HostResolverImpl> host_resolver( | 1662 scoped_ptr<HostResolverImpl> host_resolver( |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1654 EXPECT_EQ(ADDRESS_FAMILY_IPV6, capture_list[0].address_family); | 1707 EXPECT_EQ(ADDRESS_FAMILY_IPV6, capture_list[0].address_family); |
| 1655 | 1708 |
| 1656 EXPECT_EQ("h1", capture_list[1].hostname); | 1709 EXPECT_EQ("h1", capture_list[1].hostname); |
| 1657 EXPECT_EQ(ADDRESS_FAMILY_IPV4, capture_list[1].address_family); | 1710 EXPECT_EQ(ADDRESS_FAMILY_IPV4, capture_list[1].address_family); |
| 1658 | 1711 |
| 1659 // Now check that the correct resolved IP addresses were returned. | 1712 // Now check that the correct resolved IP addresses were returned. |
| 1660 // Addresses take the form: 192.x.y.z | 1713 // Addresses take the form: 192.x.y.z |
| 1661 // x = length of hostname | 1714 // x = length of hostname |
| 1662 // y = ASCII value of hostname[0] | 1715 // y = ASCII value of hostname[0] |
| 1663 // z = value of address family | 1716 // z = value of address family |
| 1664 EXPECT_EQ("192.2.104.2", NetAddressToString(addrlist[0].head())); | 1717 EXPECT_EQ("192.2.104.2:80", FirstAddressToString(addrlist[0])); |
| 1665 EXPECT_EQ("192.2.104.2", NetAddressToString(addrlist[1].head())); | 1718 EXPECT_EQ("192.2.104.2:80", FirstAddressToString(addrlist[1])); |
| 1666 EXPECT_EQ("192.2.104.1", NetAddressToString(addrlist[2].head())); | 1719 EXPECT_EQ("192.2.104.1:80", FirstAddressToString(addrlist[2])); |
| 1720 EXPECT_EQ(1u, NumberOfAddresses(addrlist[0])); |
| 1721 EXPECT_EQ(1u, NumberOfAddresses(addrlist[1])); |
| 1722 EXPECT_EQ(1u, NumberOfAddresses(addrlist[2])); |
| 1667 } | 1723 } |
| 1668 | 1724 |
| 1669 TEST_F(HostResolverImplTest, DisallowNonCachedResponses) { | 1725 TEST_F(HostResolverImplTest, DisallowNonCachedResponses) { |
| 1670 AddressList addrlist; | 1726 AddressList addrlist; |
| 1671 const int kPortnum = 80; | |
| 1672 | 1727 |
| 1673 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 1728 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
| 1674 new RuleBasedHostResolverProc(NULL)); | 1729 new RuleBasedHostResolverProc(NULL)); |
| 1675 resolver_proc->AddRule("just.testing", "192.168.1.42"); | 1730 resolver_proc->AddRule("just.testing", "192.168.1.42"); |
| 1676 | 1731 |
| 1677 scoped_ptr<HostResolver> host_resolver( | 1732 scoped_ptr<HostResolver> host_resolver( |
| 1678 CreateHostResolverImpl(resolver_proc)); | 1733 CreateHostResolverImpl(resolver_proc)); |
| 1679 | 1734 |
| 1680 // First hit will miss the cache. | 1735 // First hit will miss the cache. |
| 1681 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); | 1736 HostResolver::RequestInfo info(HostPortPair("just.testing", 80)); |
| 1682 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 1737 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
| 1683 int err = host_resolver->ResolveFromCache(info, &addrlist, log.bound()); | 1738 int err = host_resolver->ResolveFromCache(info, &addrlist, log.bound()); |
| 1684 EXPECT_EQ(ERR_DNS_CACHE_MISS, err); | 1739 EXPECT_EQ(ERR_DNS_CACHE_MISS, err); |
| 1685 | 1740 |
| 1686 // This time, we fetch normally. | 1741 // This time, we fetch normally. |
| 1687 TestCompletionCallback callback; | 1742 TestCompletionCallback callback; |
| 1688 err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, | 1743 err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
| 1689 log.bound()); | 1744 log.bound()); |
| 1690 EXPECT_EQ(ERR_IO_PENDING, err); | 1745 EXPECT_EQ(ERR_IO_PENDING, err); |
| 1691 err = callback.WaitForResult(); | 1746 err = callback.WaitForResult(); |
| 1692 EXPECT_EQ(OK, err); | 1747 EXPECT_EQ(OK, err); |
| 1693 | 1748 |
| 1694 // Now we should be able to fetch from the cache. | 1749 // Now we should be able to fetch from the cache. |
| 1695 err = host_resolver->ResolveFromCache(info, &addrlist, log.bound()); | 1750 err = host_resolver->ResolveFromCache(info, &addrlist, log.bound()); |
| 1696 EXPECT_EQ(OK, err); | 1751 EXPECT_EQ(OK, err); |
| 1697 | 1752 |
| 1698 const struct addrinfo* ainfo = addrlist.head(); | 1753 EXPECT_EQ("192.168.1.42:80", FirstAddressToString(addrlist)); |
| 1699 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); | 1754 EXPECT_EQ(1u, NumberOfAddresses(addrlist)); |
| 1700 EXPECT_EQ(sizeof(struct sockaddr_in), static_cast<size_t>(ainfo->ai_addrlen)); | |
| 1701 | |
| 1702 const struct sockaddr* sa = ainfo->ai_addr; | |
| 1703 const struct sockaddr_in* sa_in = reinterpret_cast<const sockaddr_in*>(sa); | |
| 1704 EXPECT_TRUE(htons(kPortnum) == sa_in->sin_port); | |
| 1705 EXPECT_TRUE(htonl(0xc0a8012a) == sa_in->sin_addr.s_addr); | |
| 1706 } | 1755 } |
| 1707 | 1756 |
| 1708 // Test the retry attempts simulating host resolver proc that takes too long. | 1757 // Test the retry attempts simulating host resolver proc that takes too long. |
| 1709 TEST_F(HostResolverImplTest, MultipleAttempts) { | 1758 TEST_F(HostResolverImplTest, MultipleAttempts) { |
| 1710 // Total number of attempts would be 3 and we want the 3rd attempt to resolve | 1759 // Total number of attempts would be 3 and we want the 3rd attempt to resolve |
| 1711 // the host. First and second attempt will be forced to sleep until they get | 1760 // the host. First and second attempt will be forced to sleep until they get |
| 1712 // word that a resolution has completed. The 3rd resolution attempt will try | 1761 // word that a resolution has completed. The 3rd resolution attempt will try |
| 1713 // to get done ASAP, and won't sleep.. | 1762 // to get done ASAP, and won't sleep.. |
| 1714 int kAttemptNumberToResolve = 3; | 1763 int kAttemptNumberToResolve = 3; |
| 1715 int kTotalAttempts = 3; | 1764 int kTotalAttempts = 3; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1743 // Resolve returns -4 to indicate that 3rd attempt has resolved the host. | 1792 // Resolve returns -4 to indicate that 3rd attempt has resolved the host. |
| 1744 EXPECT_EQ(-4, callback.WaitForResult()); | 1793 EXPECT_EQ(-4, callback.WaitForResult()); |
| 1745 | 1794 |
| 1746 resolver_proc->WaitForAllAttemptsToFinish(TimeDelta::FromMilliseconds(60000)); | 1795 resolver_proc->WaitForAllAttemptsToFinish(TimeDelta::FromMilliseconds(60000)); |
| 1747 MessageLoop::current()->RunAllPending(); | 1796 MessageLoop::current()->RunAllPending(); |
| 1748 | 1797 |
| 1749 EXPECT_EQ(resolver_proc->total_attempts_resolved(), kTotalAttempts); | 1798 EXPECT_EQ(resolver_proc->total_attempts_resolved(), kTotalAttempts); |
| 1750 EXPECT_EQ(resolver_proc->resolved_attempt_number(), kAttemptNumberToResolve); | 1799 EXPECT_EQ(resolver_proc->resolved_attempt_number(), kAttemptNumberToResolve); |
| 1751 } | 1800 } |
| 1752 | 1801 |
| 1802 DnsConfig CreateValidDnsConfig() { |
| 1803 IPAddressNumber dns_ip; |
| 1804 bool rv = ParseIPLiteralToNumber("192.168.1.0", &dns_ip); |
| 1805 EXPECT_TRUE(rv); |
| 1806 |
| 1807 DnsConfig config; |
| 1808 config.nameservers.push_back(IPEndPoint(dns_ip, |
| 1809 dns_protocol::kDefaultPort)); |
| 1810 EXPECT_TRUE(config.IsValid()); |
| 1811 return config; |
| 1812 } |
| 1813 |
| 1814 // TODO(szym): Test AbortAllInProgressJobs due to DnsConfig change. |
| 1815 |
| 1753 // TODO(cbentzel): Test a mix of requests with different HostResolverFlags. | 1816 // TODO(cbentzel): Test a mix of requests with different HostResolverFlags. |
| 1754 | 1817 |
| 1818 // Test successful and fallback resolutions in HostResolverImpl::DnsTask. |
| 1819 TEST_F(HostResolverImplTest, DnsTask) { |
| 1820 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
| 1821 new RuleBasedHostResolverProc(NULL)); |
| 1822 scoped_ptr<HostResolverImpl> host_resolver(CreateHostResolverImpl( |
| 1823 resolver_proc)); |
| 1824 |
| 1825 resolver_proc->AddRule("er_succeed", "192.168.1.101"); |
| 1826 resolver_proc->AddRule("nx_succeed", "192.168.1.102"); |
| 1827 resolver_proc->AddSimulatedFailure("ok_fail"); |
| 1828 resolver_proc->AddSimulatedFailure("er_fail"); |
| 1829 resolver_proc->AddSimulatedFailure("nx_fail"); |
| 1830 |
| 1831 CountingDelegate delegate; |
| 1832 |
| 1833 // Initially there is no config, so client should not be invoked. |
| 1834 ResolveRequest req1(host_resolver.get(), "ok_fail", 80, &delegate); |
| 1835 |
| 1836 delegate.WaitForCompletions(1); |
| 1837 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, req1.result()); |
| 1838 |
| 1839 host_resolver->set_dns_client_for_tests( |
| 1840 CreateMockDnsClient(CreateValidDnsConfig())); |
| 1841 |
| 1842 ResolveRequest req2(host_resolver.get(), "ok_fail", 80, &delegate); |
| 1843 ResolveRequest req3(host_resolver.get(), "er_fail", 80, &delegate); |
| 1844 ResolveRequest req4(host_resolver.get(), "nx_fail", 80, &delegate); |
| 1845 ResolveRequest req5(host_resolver.get(), "er_succeed", 80, &delegate); |
| 1846 ResolveRequest req6(host_resolver.get(), "nx_succeed", 80, &delegate); |
| 1847 |
| 1848 delegate.WaitForCompletions(6); |
| 1849 EXPECT_EQ(OK, req2.result()); |
| 1850 // Resolved by MockDnsClient. |
| 1851 EXPECT_EQ("127.0.0.1:80", FirstAddressToString(req2.addrlist())); |
| 1852 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, req3.result()); |
| 1853 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, req4.result()); |
| 1854 EXPECT_EQ(OK, req5.result()); |
| 1855 EXPECT_EQ("192.168.1.101:80", FirstAddressToString(req5.addrlist())); |
| 1856 EXPECT_EQ(OK, req6.result()); |
| 1857 EXPECT_EQ("192.168.1.102:80", FirstAddressToString(req6.addrlist())); |
| 1858 } |
| 1859 |
| 1860 TEST_F(HostResolverImplTest, ServeFromHosts) { |
| 1861 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
| 1862 new RuleBasedHostResolverProc(NULL)); |
| 1863 MockDnsConfigService* config_service = new MockDnsConfigService(); |
| 1864 scoped_ptr<HostResolverImpl> host_resolver( |
| 1865 CreateHostResolverImplWithDnsConfig( |
| 1866 resolver_proc, |
| 1867 scoped_ptr<DnsConfigService>(config_service))); |
| 1868 |
| 1869 resolver_proc->AddSimulatedFailure("*"); |
| 1870 |
| 1871 DnsConfig config = CreateValidDnsConfig(); |
| 1872 host_resolver->set_dns_client_for_tests(CreateMockDnsClient(config)); |
| 1873 |
| 1874 CountingDelegate delegate; |
| 1875 |
| 1876 ResolveRequest req1(host_resolver.get(), "er_ipv4", 80, &delegate); |
| 1877 delegate.WaitForCompletions(1); |
| 1878 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, req1.result()); |
| 1879 |
| 1880 IPAddressNumber local_ipv4, local_ipv6; |
| 1881 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &local_ipv4)); |
| 1882 ASSERT_TRUE(ParseIPLiteralToNumber("::1", &local_ipv6)); |
| 1883 |
| 1884 DnsHosts hosts; |
| 1885 hosts[DnsHostsKey("er_ipv4", ADDRESS_FAMILY_IPV4)] = local_ipv4; |
| 1886 hosts[DnsHostsKey("er_ipv6", ADDRESS_FAMILY_IPV6)] = local_ipv6; |
| 1887 hosts[DnsHostsKey("er_both", ADDRESS_FAMILY_IPV4)] = local_ipv4; |
| 1888 hosts[DnsHostsKey("er_both", ADDRESS_FAMILY_IPV6)] = local_ipv6; |
| 1889 |
| 1890 config_service->ChangeConfig(config); |
| 1891 config_service->ChangeHosts(hosts); |
| 1892 |
| 1893 ResolveRequest req2(host_resolver.get(), "er_ipv4", 80); |
| 1894 EXPECT_EQ(OK, req2.result()); |
| 1895 EXPECT_EQ("127.0.0.1:80", FirstAddressToString(req2.addrlist())); |
| 1896 |
| 1897 ResolveRequest req3(host_resolver.get(), "er_ipv6", 80); |
| 1898 EXPECT_EQ(OK, req3.result()); |
| 1899 std::string ipv6string = FirstAddressToString(req3.addrlist()); |
| 1900 if (ipv6string != "UNSUPPORTED") |
| 1901 EXPECT_EQ("[::1]:80", ipv6string); |
| 1902 |
| 1903 ResolveRequest req4(host_resolver.get(), "er_both", 80); |
| 1904 EXPECT_EQ(OK, req4.result()); |
| 1905 // Either result is satisfactory. http://crbug.com/117850 |
| 1906 const addrinfo* addr = req4.addrlist().head(); |
| 1907 if (addr->ai_addrlen == sizeof(struct sockaddr_in)) { |
| 1908 EXPECT_EQ("127.0.0.1", NetAddressToString(addr)); |
| 1909 } else { |
| 1910 ipv6string = NetAddressToString(addr); |
| 1911 if (ipv6string != "UNSUPPORTED") |
| 1912 EXPECT_EQ("::1", NetAddressToString(addr)); |
| 1913 } |
| 1914 EXPECT_GE(NumberOfAddresses(req4.addrlist()), 1u); |
| 1915 |
| 1916 // Requests with specified AddressFamily. |
| 1917 HostResolver::RequestInfo info(HostPortPair("er_both", 80)); |
| 1918 info.set_address_family(ADDRESS_FAMILY_IPV4); |
| 1919 ResolveRequest req5(host_resolver.get(), info); |
| 1920 EXPECT_EQ(OK, req5.result()); |
| 1921 EXPECT_EQ("127.0.0.1:80", FirstAddressToString(req5.addrlist())); |
| 1922 EXPECT_EQ(1u, NumberOfAddresses(req5.addrlist())); |
| 1923 |
| 1924 info.set_address_family(ADDRESS_FAMILY_IPV6); |
| 1925 ResolveRequest req6(host_resolver.get(), info); |
| 1926 EXPECT_EQ(OK, req6.result()); |
| 1927 ipv6string = FirstAddressToString(req6.addrlist()); |
| 1928 if (ipv6string != "UNSUPPORTED") |
| 1929 EXPECT_EQ("[::1]:80", ipv6string); |
| 1930 EXPECT_EQ(1u, NumberOfAddresses(req6.addrlist())); |
| 1931 } |
| 1932 |
| 1755 } // namespace net | 1933 } // namespace net |
| OLD | NEW |