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

Side by Side Diff: net/base/host_resolver_impl_unittest.cc

Issue 9667025: [net/dns] Serve requests from HOSTS file if possible. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added NumberOfAddresses checks. Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/base/host_resolver_impl.cc ('k') | net/base/net_log_event_type_list.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 or empty string if
544 // the list is empty.
545 std::string FirstAddressToString(const AddressList& addr_list) {
546 const struct addrinfo* ai = addr_list.head();
547 if (!ai)
548 return "";
549 return NetAddressToStringWithPort(ai);
550 }
551
552 // Returns the number of addresses in |addr_list|.
553 unsigned NumberOfAddresses(const AddressList& addr_list) {
554 unsigned count = 0;
555 for (const struct addrinfo* ai = addr_list.head();
556 ai != NULL;
557 ai = ai->ai_next) {
558 ++count;
559 }
560 return count;
561 }
562
563 } // namespace net
564
494 TEST_F(HostResolverImplTest, AsynchronousLookup) { 565 TEST_F(HostResolverImplTest, AsynchronousLookup) {
495 AddressList addrlist; 566 AddressList addrlist;
496 const int kPortnum = 80;
497 567
498 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( 568 scoped_refptr<RuleBasedHostResolverProc> resolver_proc(
499 new RuleBasedHostResolverProc(NULL)); 569 new RuleBasedHostResolverProc(NULL));
500 resolver_proc->AddRule("just.testing", "192.168.1.42"); 570 resolver_proc->AddRule("just.testing", "192.168.1.42");
501 571
502 scoped_ptr<HostResolver> host_resolver( 572 scoped_ptr<HostResolver> host_resolver(
503 CreateHostResolverImpl(resolver_proc)); 573 CreateHostResolverImpl(resolver_proc));
504 574
505 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); 575 HostResolver::RequestInfo info(HostPortPair("just.testing", 80));
506 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); 576 CapturingBoundNetLog log(CapturingNetLog::kUnbounded);
507 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, 577 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL,
508 log.bound()); 578 log.bound());
509 EXPECT_EQ(ERR_IO_PENDING, err); 579 EXPECT_EQ(ERR_IO_PENDING, err);
510 580
511 CapturingNetLog::EntryList entries; 581 CapturingNetLog::EntryList entries;
512 log.GetEntries(&entries); 582 log.GetEntries(&entries);
513 583
514 EXPECT_EQ(1u, entries.size()); 584 EXPECT_EQ(1u, entries.size());
515 EXPECT_TRUE(LogContainsBeginEvent( 585 EXPECT_TRUE(LogContainsBeginEvent(
516 entries, 0, NetLog::TYPE_HOST_RESOLVER_IMPL)); 586 entries, 0, NetLog::TYPE_HOST_RESOLVER_IMPL));
517 587
518 MessageLoop::current()->Run(); 588 MessageLoop::current()->Run();
519 589
520 ASSERT_TRUE(callback_called_); 590 ASSERT_TRUE(callback_called_);
521 ASSERT_EQ(OK, callback_result_); 591 ASSERT_EQ(OK, callback_result_);
522 592
523 log.GetEntries(&entries); 593 log.GetEntries(&entries);
524 594
525 EXPECT_EQ(2u, entries.size()); 595 EXPECT_EQ(2u, entries.size());
526 EXPECT_TRUE(LogContainsEndEvent( 596 EXPECT_TRUE(LogContainsEndEvent(
527 entries, 1, NetLog::TYPE_HOST_RESOLVER_IMPL)); 597 entries, 1, NetLog::TYPE_HOST_RESOLVER_IMPL));
528 598
529 const struct addrinfo* ainfo = addrlist.head(); 599 EXPECT_EQ("192.168.1.42:80", FirstAddressToString(addrlist));
530 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); 600 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 } 601 }
538 602
539 TEST_F(HostResolverImplTest, FailedAsynchronousLookup) { 603 TEST_F(HostResolverImplTest, FailedAsynchronousLookup) {
540 AddressList addrlist; 604 AddressList addrlist;
541 const int kPortnum = 80;
542
543 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( 605 scoped_refptr<RuleBasedHostResolverProc> resolver_proc(
544 new RuleBasedHostResolverProc(NULL)); 606 new RuleBasedHostResolverProc(NULL));
545 resolver_proc->AddSimulatedFailure("just.testing"); 607 resolver_proc->AddSimulatedFailure("just.testing");
546 608
547 scoped_ptr<HostResolver> host_resolver(CreateHostResolverImpl(resolver_proc)); 609 scoped_ptr<HostResolver> host_resolver(CreateHostResolverImpl(resolver_proc));
548 610
549 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); 611 HostResolver::RequestInfo info(HostPortPair("just.testing", 80));
550 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); 612 CapturingBoundNetLog log(CapturingNetLog::kUnbounded);
551 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, 613 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL,
552 log.bound()); 614 log.bound());
553 EXPECT_EQ(ERR_IO_PENDING, err); 615 EXPECT_EQ(ERR_IO_PENDING, err);
554 616
555 CapturingNetLog::EntryList entries; 617 CapturingNetLog::EntryList entries;
556 log.GetEntries(&entries); 618 log.GetEntries(&entries);
557 619
558 EXPECT_EQ(1u, entries.size()); 620 EXPECT_EQ(1u, entries.size());
559 EXPECT_TRUE(LogContainsBeginEvent( 621 EXPECT_TRUE(LogContainsBeginEvent(
(...skipping 23 matching lines...) Expand all
583 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); 645 CapturingBoundNetLog log(CapturingNetLog::kUnbounded);
584 { 646 {
585 // This resolver will be destroyed while a lookup is running on WorkerPool. 647 // This resolver will be destroyed while a lookup is running on WorkerPool.
586 scoped_ptr<HostResolver> host_resolver( 648 scoped_ptr<HostResolver> host_resolver(
587 new HostResolverImpl(HostCache::CreateDefaultCache(), 649 new HostResolverImpl(HostCache::CreateDefaultCache(),
588 DefaultLimits(), 650 DefaultLimits(),
589 DefaultParams(resolver_proc), 651 DefaultParams(resolver_proc),
590 scoped_ptr<DnsConfigService>(NULL), 652 scoped_ptr<DnsConfigService>(NULL),
591 &net_log)); 653 &net_log));
592 AddressList addrlist; 654 AddressList addrlist;
593 const int kPortnum = 80; 655 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, 656 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL,
597 log.bound()); 657 log.bound());
598 EXPECT_EQ(ERR_IO_PENDING, err); 658 EXPECT_EQ(ERR_IO_PENDING, err);
599 659
600 resolver_proc->Wait(); 660 resolver_proc->Wait();
601 } 661 }
602 662
603 resolver_proc->Signal(); 663 resolver_proc->Signal();
604 664
605 CapturingNetLog::EntryList entries; 665 CapturingNetLog::EntryList entries;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 TEST_F(HostResolverImplTest, NumericIPv4Address) { 705 TEST_F(HostResolverImplTest, NumericIPv4Address) {
646 // Stevens says dotted quads with AI_UNSPEC resolve to a single sockaddr_in. 706 // Stevens says dotted quads with AI_UNSPEC resolve to a single sockaddr_in.
647 707
648 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( 708 scoped_refptr<RuleBasedHostResolverProc> resolver_proc(
649 new RuleBasedHostResolverProc(NULL)); 709 new RuleBasedHostResolverProc(NULL));
650 resolver_proc->AllowDirectLookup("*"); 710 resolver_proc->AllowDirectLookup("*");
651 711
652 scoped_ptr<HostResolver> host_resolver( 712 scoped_ptr<HostResolver> host_resolver(
653 CreateHostResolverImpl(resolver_proc)); 713 CreateHostResolverImpl(resolver_proc));
654 AddressList addrlist; 714 AddressList addrlist;
655 const int kPortnum = 5555;
656 TestCompletionCallback callback; 715 TestCompletionCallback callback;
657 HostResolver::RequestInfo info(HostPortPair("127.1.2.3", kPortnum)); 716 HostResolver::RequestInfo info(HostPortPair("127.1.2.3", 5555));
658 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, 717 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL,
659 BoundNetLog()); 718 BoundNetLog());
660 EXPECT_EQ(OK, err); 719 EXPECT_EQ(OK, err);
661 720
662 const struct addrinfo* ainfo = addrlist.head(); 721 EXPECT_EQ("127.1.2.3:5555", FirstAddressToString(addrlist));
663 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); 722 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 } 723 }
671 724
672 TEST_F(HostResolverImplTest, NumericIPv6Address) { 725 TEST_F(HostResolverImplTest, NumericIPv6Address) {
673 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( 726 scoped_refptr<RuleBasedHostResolverProc> resolver_proc(
674 new RuleBasedHostResolverProc(NULL)); 727 new RuleBasedHostResolverProc(NULL));
675 resolver_proc->AllowDirectLookup("*"); 728 resolver_proc->AllowDirectLookup("*");
676 729
677 // Resolve a plain IPv6 address. Don't worry about [brackets], because 730 // Resolve a plain IPv6 address. Don't worry about [brackets], because
678 // the caller should have removed them. 731 // the caller should have removed them.
679 scoped_ptr<HostResolver> host_resolver( 732 scoped_ptr<HostResolver> host_resolver(
680 CreateHostResolverImpl(resolver_proc)); 733 CreateHostResolverImpl(resolver_proc));
681 AddressList addrlist; 734 AddressList addrlist;
682 const int kPortnum = 5555;
683 TestCompletionCallback callback; 735 TestCompletionCallback callback;
684 HostResolver::RequestInfo info(HostPortPair("2001:db8::1", kPortnum)); 736 HostResolver::RequestInfo info(HostPortPair("2001:db8::1", 5555));
685 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, 737 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL,
686 BoundNetLog()); 738 BoundNetLog());
687 EXPECT_EQ(OK, err); 739 EXPECT_EQ(OK, err);
688 740
689 const struct addrinfo* ainfo = addrlist.head(); 741 EXPECT_EQ("[2001:db8::1]:5555", FirstAddressToString(addrlist));
690 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); 742 EXPECT_EQ(1u, NumberOfAddresses(addrlist));
691 EXPECT_EQ(sizeof(struct sockaddr_in6),
692 static_cast<size_t>(ainfo->ai_addrlen));
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 } 743 }
706 744
707 TEST_F(HostResolverImplTest, EmptyHost) { 745 TEST_F(HostResolverImplTest, EmptyHost) {
708 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( 746 scoped_refptr<RuleBasedHostResolverProc> resolver_proc(
709 new RuleBasedHostResolverProc(NULL)); 747 new RuleBasedHostResolverProc(NULL));
710 resolver_proc->AllowDirectLookup("*"); 748 resolver_proc->AllowDirectLookup("*");
711 749
712 scoped_ptr<HostResolver> host_resolver( 750 scoped_ptr<HostResolver> host_resolver(
713 CreateHostResolverImpl(resolver_proc)); 751 CreateHostResolverImpl(resolver_proc));
714 AddressList addrlist; 752 AddressList addrlist;
715 const int kPortnum = 5555;
716 TestCompletionCallback callback; 753 TestCompletionCallback callback;
717 HostResolver::RequestInfo info(HostPortPair("", kPortnum)); 754 HostResolver::RequestInfo info(HostPortPair("", 5555));
718 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, 755 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL,
719 BoundNetLog()); 756 BoundNetLog());
720 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err); 757 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err);
721 } 758 }
722 759
723 TEST_F(HostResolverImplTest, LongHost) { 760 TEST_F(HostResolverImplTest, LongHost) {
724 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( 761 scoped_refptr<RuleBasedHostResolverProc> resolver_proc(
725 new RuleBasedHostResolverProc(NULL)); 762 new RuleBasedHostResolverProc(NULL));
726 resolver_proc->AllowDirectLookup("*"); 763 resolver_proc->AllowDirectLookup("*");
727 764
728 scoped_ptr<HostResolver> host_resolver( 765 scoped_ptr<HostResolver> host_resolver(
729 CreateHostResolverImpl(resolver_proc)); 766 CreateHostResolverImpl(resolver_proc));
730 AddressList addrlist; 767 AddressList addrlist;
731 const int kPortnum = 5555;
732 std::string hostname(4097, 'a'); 768 std::string hostname(4097, 'a');
733 TestCompletionCallback callback; 769 TestCompletionCallback callback;
734 HostResolver::RequestInfo info(HostPortPair(hostname, kPortnum)); 770 HostResolver::RequestInfo info(HostPortPair(hostname, 5555));
735 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, 771 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL,
736 BoundNetLog()); 772 BoundNetLog());
737 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err); 773 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err);
738 } 774 }
739 775
740 // Helper class used by HostResolverImplTest.DeDupeRequests. It receives request 776 // Helper class used by HostResolverImplTest.DeDupeRequests. It receives request
741 // completion notifications for all the resolves, so it can tally up and 777 // completion notifications for all the resolves, so it can tally up and
742 // determine when we are done. 778 // determine when we are done.
743 class DeDupeRequestsVerifier : public ResolveRequest::Delegate { 779 class DeDupeRequestsVerifier : public ResolveRequest::Delegate {
744 public: 780 public:
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
863 req3.Cancel(); 899 req3.Cancel();
864 req5.Cancel(); 900 req5.Cancel();
865 901
866 // Ready, Set, GO!!! 902 // Ready, Set, GO!!!
867 resolver_proc->Signal(); 903 resolver_proc->Signal();
868 904
869 // |verifier| will send quit message once all the requests have finished. 905 // |verifier| will send quit message once all the requests have finished.
870 MessageLoop::current()->Run(); 906 MessageLoop::current()->Run();
871 } 907 }
872 908
873 // Helper class used by HostResolverImplTest.CanceledRequestsReleaseJobSlots. 909 // Delegate which allows to wait for specific number of requests to complete.
910 // Used by HostResolverImplTest.CanceledRequestsReleaseJobSlots and .DnsTask.
874 class CountingDelegate : public ResolveRequest::Delegate { 911 class CountingDelegate : public ResolveRequest::Delegate {
875 public: 912 public:
876 CountingDelegate() : num_completions_(0) {} 913 CountingDelegate() : num_completions_(0), awaited_num_completions_(0) {}
877 914
878 virtual void OnCompleted(ResolveRequest* resolve) OVERRIDE { 915 virtual void OnCompleted(ResolveRequest* resolve) OVERRIDE {
879 ++num_completions_; 916 ++num_completions_;
880 MessageLoop::current()->Quit(); 917 if (num_completions_ == awaited_num_completions_)
918 MessageLoop::current()->Quit();
881 } 919 }
882 920
883 unsigned num_completions() const { return num_completions_; } 921 unsigned num_completions() const { return num_completions_; }
884 922
923 void WaitForCompletions(unsigned completions) {
924 ASSERT_LT(num_completions_, completions);
925 awaited_num_completions_ = completions;
926 MessageLoop::current()->Run();
927 EXPECT_EQ(completions, num_completions_);
928 }
929
885 private: 930 private:
886 unsigned num_completions_; 931 unsigned num_completions_;
932 unsigned awaited_num_completions_;
887 }; 933 };
888 934
889 TEST_F(HostResolverImplTest, CanceledRequestsReleaseJobSlots) { 935 TEST_F(HostResolverImplTest, CanceledRequestsReleaseJobSlots) {
890 scoped_refptr<CountingHostResolverProc> resolver_proc( 936 scoped_refptr<CountingHostResolverProc> resolver_proc(
891 new CountingHostResolverProc(NULL)); 937 new CountingHostResolverProc(NULL));
892 938
893 scoped_ptr<HostResolverImpl> host_resolver( 939 scoped_ptr<HostResolverImpl> host_resolver(
894 CreateHostResolverImpl(resolver_proc)); 940 CreateHostResolverImpl(resolver_proc));
895 941
896 CountingDelegate delegate; 942 CountingDelegate delegate;
(...skipping 14 matching lines...) Expand all
911 // Cancel all but last two. 957 // Cancel all but last two.
912 for (unsigned i = 0; i < requests.size() - 2; ++i) { 958 for (unsigned i = 0; i < requests.size() - 2; ++i) {
913 requests[i]->Cancel(); 959 requests[i]->Cancel();
914 } 960 }
915 961
916 EXPECT_TRUE(resolver_proc->WaitFor(kMaxJobs + 1)); 962 EXPECT_TRUE(resolver_proc->WaitFor(kMaxJobs + 1));
917 EXPECT_EQ(0u, delegate.num_completions()); 963 EXPECT_EQ(0u, delegate.num_completions());
918 964
919 resolver_proc->SignalAll(); 965 resolver_proc->SignalAll();
920 966
921 while (delegate.num_completions() < 2) 967 delegate.WaitForCompletions(2);
922 MessageLoop::current()->Run();
923 968
924 EXPECT_EQ(0u, host_resolver->num_running_jobs_for_tests()); 969 EXPECT_EQ(0u, host_resolver->num_running_jobs_for_tests());
925 } 970 }
926 971
927 // Helper class used by HostResolverImplTest.CancelWithinCallback. 972 // Helper class used by HostResolverImplTest.CancelWithinCallback.
928 class CancelWithinCallbackVerifier : public ResolveRequest::Delegate { 973 class CancelWithinCallbackVerifier : public ResolveRequest::Delegate {
929 public: 974 public:
930 CancelWithinCallbackVerifier() 975 CancelWithinCallbackVerifier()
931 : req_to_cancel1_(NULL), req_to_cancel2_(NULL), num_completions_(0) { 976 : req_to_cancel1_(NULL), req_to_cancel2_(NULL), num_completions_(0) {
932 } 977 }
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after
1587 EXPECT_EQ(ADDRESS_FAMILY_IPV4, capture_list[0].address_family); 1632 EXPECT_EQ(ADDRESS_FAMILY_IPV4, capture_list[0].address_family);
1588 1633
1589 EXPECT_EQ("h1", capture_list[1].hostname); 1634 EXPECT_EQ("h1", capture_list[1].hostname);
1590 EXPECT_EQ(ADDRESS_FAMILY_IPV6, capture_list[1].address_family); 1635 EXPECT_EQ(ADDRESS_FAMILY_IPV6, capture_list[1].address_family);
1591 1636
1592 // Now check that the correct resolved IP addresses were returned. 1637 // Now check that the correct resolved IP addresses were returned.
1593 // Addresses take the form: 192.x.y.z 1638 // Addresses take the form: 192.x.y.z
1594 // x = length of hostname 1639 // x = length of hostname
1595 // y = ASCII value of hostname[0] 1640 // y = ASCII value of hostname[0]
1596 // z = value of address family 1641 // z = value of address family
1597 EXPECT_EQ("192.2.104.1", NetAddressToString(addrlist[0].head())); 1642 EXPECT_EQ("192.2.104.1:80", FirstAddressToString(addrlist[0]));
1598 EXPECT_EQ("192.2.104.1", NetAddressToString(addrlist[1].head())); 1643 EXPECT_EQ("192.2.104.1:80", FirstAddressToString(addrlist[1]));
1599 EXPECT_EQ("192.2.104.2", NetAddressToString(addrlist[2].head())); 1644 EXPECT_EQ("192.2.104.2:80", FirstAddressToString(addrlist[2]));
1645 EXPECT_EQ(1u, NumberOfAddresses(addrlist[0]));
1646 EXPECT_EQ(1u, NumberOfAddresses(addrlist[1]));
1647 EXPECT_EQ(1u, NumberOfAddresses(addrlist[2]));
1600 } 1648 }
1601 1649
1602 // This is the exact same test as SetDefaultAddressFamily_IPv4, except the order 1650 // 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 1651 // of requests 0 and 1 is flipped, and the default is set to IPv6 in place of
1604 // IPv4. 1652 // IPv4.
1605 TEST_F(HostResolverImplTest, SetDefaultAddressFamily_IPv6) { 1653 TEST_F(HostResolverImplTest, SetDefaultAddressFamily_IPv6) {
1606 scoped_refptr<CapturingHostResolverProc> resolver_proc( 1654 scoped_refptr<CapturingHostResolverProc> resolver_proc(
1607 new CapturingHostResolverProc(new EchoingHostResolverProc)); 1655 new CapturingHostResolverProc(new EchoingHostResolverProc));
1608 1656
1609 scoped_ptr<HostResolverImpl> host_resolver( 1657 scoped_ptr<HostResolverImpl> host_resolver(
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1654 EXPECT_EQ(ADDRESS_FAMILY_IPV6, capture_list[0].address_family); 1702 EXPECT_EQ(ADDRESS_FAMILY_IPV6, capture_list[0].address_family);
1655 1703
1656 EXPECT_EQ("h1", capture_list[1].hostname); 1704 EXPECT_EQ("h1", capture_list[1].hostname);
1657 EXPECT_EQ(ADDRESS_FAMILY_IPV4, capture_list[1].address_family); 1705 EXPECT_EQ(ADDRESS_FAMILY_IPV4, capture_list[1].address_family);
1658 1706
1659 // Now check that the correct resolved IP addresses were returned. 1707 // Now check that the correct resolved IP addresses were returned.
1660 // Addresses take the form: 192.x.y.z 1708 // Addresses take the form: 192.x.y.z
1661 // x = length of hostname 1709 // x = length of hostname
1662 // y = ASCII value of hostname[0] 1710 // y = ASCII value of hostname[0]
1663 // z = value of address family 1711 // z = value of address family
1664 EXPECT_EQ("192.2.104.2", NetAddressToString(addrlist[0].head())); 1712 EXPECT_EQ("192.2.104.2:80", FirstAddressToString(addrlist[0]));
1665 EXPECT_EQ("192.2.104.2", NetAddressToString(addrlist[1].head())); 1713 EXPECT_EQ("192.2.104.2:80", FirstAddressToString(addrlist[1]));
1666 EXPECT_EQ("192.2.104.1", NetAddressToString(addrlist[2].head())); 1714 EXPECT_EQ("192.2.104.1:80", FirstAddressToString(addrlist[2]));
1715 EXPECT_EQ(1u, NumberOfAddresses(addrlist[0]));
1716 EXPECT_EQ(1u, NumberOfAddresses(addrlist[1]));
1717 EXPECT_EQ(1u, NumberOfAddresses(addrlist[2]));
1667 } 1718 }
1668 1719
1669 TEST_F(HostResolverImplTest, DisallowNonCachedResponses) { 1720 TEST_F(HostResolverImplTest, DisallowNonCachedResponses) {
1670 AddressList addrlist; 1721 AddressList addrlist;
1671 const int kPortnum = 80;
1672 1722
1673 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( 1723 scoped_refptr<RuleBasedHostResolverProc> resolver_proc(
1674 new RuleBasedHostResolverProc(NULL)); 1724 new RuleBasedHostResolverProc(NULL));
1675 resolver_proc->AddRule("just.testing", "192.168.1.42"); 1725 resolver_proc->AddRule("just.testing", "192.168.1.42");
1676 1726
1677 scoped_ptr<HostResolver> host_resolver( 1727 scoped_ptr<HostResolver> host_resolver(
1678 CreateHostResolverImpl(resolver_proc)); 1728 CreateHostResolverImpl(resolver_proc));
1679 1729
1680 // First hit will miss the cache. 1730 // First hit will miss the cache.
1681 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); 1731 HostResolver::RequestInfo info(HostPortPair("just.testing", 80));
1682 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); 1732 CapturingBoundNetLog log(CapturingNetLog::kUnbounded);
1683 int err = host_resolver->ResolveFromCache(info, &addrlist, log.bound()); 1733 int err = host_resolver->ResolveFromCache(info, &addrlist, log.bound());
1684 EXPECT_EQ(ERR_DNS_CACHE_MISS, err); 1734 EXPECT_EQ(ERR_DNS_CACHE_MISS, err);
1685 1735
1686 // This time, we fetch normally. 1736 // This time, we fetch normally.
1687 TestCompletionCallback callback; 1737 TestCompletionCallback callback;
1688 err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, 1738 err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL,
1689 log.bound()); 1739 log.bound());
1690 EXPECT_EQ(ERR_IO_PENDING, err); 1740 EXPECT_EQ(ERR_IO_PENDING, err);
1691 err = callback.WaitForResult(); 1741 err = callback.WaitForResult();
1692 EXPECT_EQ(OK, err); 1742 EXPECT_EQ(OK, err);
1693 1743
1694 // Now we should be able to fetch from the cache. 1744 // Now we should be able to fetch from the cache.
1695 err = host_resolver->ResolveFromCache(info, &addrlist, log.bound()); 1745 err = host_resolver->ResolveFromCache(info, &addrlist, log.bound());
1696 EXPECT_EQ(OK, err); 1746 EXPECT_EQ(OK, err);
1697 1747
1698 const struct addrinfo* ainfo = addrlist.head(); 1748 EXPECT_EQ("192.168.1.42:80", FirstAddressToString(addrlist));
1699 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); 1749 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 } 1750 }
1707 1751
1708 // Test the retry attempts simulating host resolver proc that takes too long. 1752 // Test the retry attempts simulating host resolver proc that takes too long.
1709 TEST_F(HostResolverImplTest, MultipleAttempts) { 1753 TEST_F(HostResolverImplTest, MultipleAttempts) {
1710 // Total number of attempts would be 3 and we want the 3rd attempt to resolve 1754 // 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 1755 // 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 1756 // word that a resolution has completed. The 3rd resolution attempt will try
1713 // to get done ASAP, and won't sleep.. 1757 // to get done ASAP, and won't sleep..
1714 int kAttemptNumberToResolve = 3; 1758 int kAttemptNumberToResolve = 3;
1715 int kTotalAttempts = 3; 1759 int kTotalAttempts = 3;
(...skipping 27 matching lines...) Expand all
1743 // Resolve returns -4 to indicate that 3rd attempt has resolved the host. 1787 // Resolve returns -4 to indicate that 3rd attempt has resolved the host.
1744 EXPECT_EQ(-4, callback.WaitForResult()); 1788 EXPECT_EQ(-4, callback.WaitForResult());
1745 1789
1746 resolver_proc->WaitForAllAttemptsToFinish(TimeDelta::FromMilliseconds(60000)); 1790 resolver_proc->WaitForAllAttemptsToFinish(TimeDelta::FromMilliseconds(60000));
1747 MessageLoop::current()->RunAllPending(); 1791 MessageLoop::current()->RunAllPending();
1748 1792
1749 EXPECT_EQ(resolver_proc->total_attempts_resolved(), kTotalAttempts); 1793 EXPECT_EQ(resolver_proc->total_attempts_resolved(), kTotalAttempts);
1750 EXPECT_EQ(resolver_proc->resolved_attempt_number(), kAttemptNumberToResolve); 1794 EXPECT_EQ(resolver_proc->resolved_attempt_number(), kAttemptNumberToResolve);
1751 } 1795 }
1752 1796
1797 DnsConfig CreateValidDnsConfig() {
1798 IPAddressNumber dns_ip;
1799 bool rv = ParseIPLiteralToNumber("192.168.1.0", &dns_ip);
1800 EXPECT_TRUE(rv);
1801
1802 DnsConfig config;
1803 config.nameservers.push_back(IPEndPoint(dns_ip,
1804 dns_protocol::kDefaultPort));
1805 EXPECT_TRUE(config.IsValid());
1806 return config;
1807 }
1808
1809 // TODO(szym): Test AbortAllInProgressJobs due to DnsConfig change.
1810
1753 // TODO(cbentzel): Test a mix of requests with different HostResolverFlags. 1811 // TODO(cbentzel): Test a mix of requests with different HostResolverFlags.
1754 1812
1813 // Test successful and fallback resolutions in HostResolverImpl::DnsTask.
1814 TEST_F(HostResolverImplTest, DnsTask) {
1815 scoped_refptr<RuleBasedHostResolverProc> resolver_proc(
1816 new RuleBasedHostResolverProc(NULL));
1817 scoped_ptr<HostResolverImpl> host_resolver(CreateHostResolverImpl(
1818 resolver_proc));
1819
1820 resolver_proc->AddRule("er_succeed", "192.168.1.101");
1821 resolver_proc->AddRule("nx_succeed", "192.168.1.102");
1822 resolver_proc->AddSimulatedFailure("ok_fail");
1823 resolver_proc->AddSimulatedFailure("er_fail");
1824 resolver_proc->AddSimulatedFailure("nx_fail");
1825
1826 CountingDelegate delegate;
1827
1828 // Initially there is no config, so client should not be invoked.
1829 ResolveRequest req1(host_resolver.get(), "ok_fail", 80, &delegate);
1830
1831 delegate.WaitForCompletions(1);
1832 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, req1.result());
1833
1834 host_resolver->set_dns_client_for_tests(
1835 CreateMockDnsClient(CreateValidDnsConfig()));
1836
1837 ResolveRequest req2(host_resolver.get(), "ok_fail", 80, &delegate);
1838 ResolveRequest req3(host_resolver.get(), "er_fail", 80, &delegate);
1839 ResolveRequest req4(host_resolver.get(), "nx_fail", 80, &delegate);
1840 ResolveRequest req5(host_resolver.get(), "er_succeed", 80, &delegate);
1841 ResolveRequest req6(host_resolver.get(), "nx_succeed", 80, &delegate);
1842
1843 delegate.WaitForCompletions(6);
1844 EXPECT_EQ(OK, req2.result());
1845 // Resolved by MockDnsClient.
1846 EXPECT_EQ("127.0.0.1:80", FirstAddressToString(req2.addrlist()));
1847 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, req3.result());
1848 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, req4.result());
1849 EXPECT_EQ(OK, req5.result());
1850 EXPECT_EQ("192.168.1.101:80", FirstAddressToString(req5.addrlist()));
1851 EXPECT_EQ(OK, req6.result());
1852 EXPECT_EQ("192.168.1.102:80", FirstAddressToString(req6.addrlist()));
1853 }
1854
1855 TEST_F(HostResolverImplTest, ServeFromHosts) {
1856 scoped_refptr<RuleBasedHostResolverProc> resolver_proc(
1857 new RuleBasedHostResolverProc(NULL));
1858 MockDnsConfigService* config_service = new MockDnsConfigService();
1859 scoped_ptr<HostResolverImpl> host_resolver(
1860 CreateHostResolverImplWithDnsConfig(
1861 resolver_proc,
1862 scoped_ptr<DnsConfigService>(config_service)));
1863
1864 resolver_proc->AddSimulatedFailure("*");
1865
1866 DnsConfig config = CreateValidDnsConfig();
1867 host_resolver->set_dns_client_for_tests(CreateMockDnsClient(config));
1868
1869 CountingDelegate delegate;
1870
1871 ResolveRequest req1(host_resolver.get(), "er_ipv4", 80, &delegate);
1872 delegate.WaitForCompletions(1);
1873 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, req1.result());
1874
1875 IPAddressNumber local_ipv4, local_ipv6;
1876 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &local_ipv4));
1877 ASSERT_TRUE(ParseIPLiteralToNumber("::1", &local_ipv6));
1878
1879 DnsHosts hosts;
1880 hosts[DnsHostsKey("er_ipv4", ADDRESS_FAMILY_IPV4)] = local_ipv4;
1881 hosts[DnsHostsKey("er_ipv6", ADDRESS_FAMILY_IPV6)] = local_ipv6;
1882 hosts[DnsHostsKey("er_both", ADDRESS_FAMILY_IPV4)] = local_ipv4;
1883 hosts[DnsHostsKey("er_both", ADDRESS_FAMILY_IPV6)] = local_ipv6;
1884
1885 config_service->ChangeConfig(config);
1886 config_service->ChangeHosts(hosts);
1887
1888 ResolveRequest req2(host_resolver.get(), "er_ipv4", 80);
1889 EXPECT_EQ(OK, req2.result());
1890 EXPECT_EQ("127.0.0.1:80", FirstAddressToString(req2.addrlist()));
1891
1892 ResolveRequest req3(host_resolver.get(), "er_ipv6", 80);
1893 EXPECT_EQ(OK, req3.result());
1894 EXPECT_EQ("[::1]:80", FirstAddressToString(req3.addrlist()));
1895
1896 ResolveRequest req4(host_resolver.get(), "er_both", 80);
1897 EXPECT_EQ(OK, req4.result());
1898 // Either result is satisfactory. http://crbug.com/117850
1899 const addrinfo* addr = req4.addrlist().head();
1900 if (addr->ai_addrlen == sizeof(struct sockaddr_in))
1901 EXPECT_EQ("127.0.0.1", NetAddressToString(addr));
1902 else
1903 EXPECT_EQ("::1", NetAddressToString(addr));
1904
1905 // Requests with specified AddressFamily.
1906 HostResolver::RequestInfo info(HostPortPair("er_both", 80));
1907 info.set_address_family(ADDRESS_FAMILY_IPV4);
1908 ResolveRequest req5(host_resolver.get(), info);
1909 EXPECT_EQ(OK, req5.result());
1910 EXPECT_EQ("127.0.0.1:80", FirstAddressToString(req5.addrlist()));
1911 EXPECT_EQ(1u, NumberOfAddresses(req5.addrlist()));
1912
1913 info.set_address_family(ADDRESS_FAMILY_IPV6);
1914 ResolveRequest req6(host_resolver.get(), info);
1915 EXPECT_EQ(OK, req6.result());
1916 EXPECT_EQ("[::1]:80", FirstAddressToString(req6.addrlist()));
1917 EXPECT_EQ(1u, NumberOfAddresses(req6.addrlist()));
1918 }
1919
1755 } // namespace net 1920 } // namespace net
OLDNEW
« no previous file with comments | « net/base/host_resolver_impl.cc ('k') | net/base/net_log_event_type_list.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698