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 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 Loading... | |
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 Loading... | |
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)); |
szym
2012/03/14 15:50:54
Will not work on systems not supporting IPv6, e.g.
| |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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())); | |
szym
2012/03/14 15:50:54
As above.
| |
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)); | |
szym
2012/03/14 15:50:54
Ditto.
| |
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())); | |
szym
2012/03/14 15:50:54
And again.
| |
1917 EXPECT_EQ(1u, NumberOfAddresses(req6.addrlist())); | |
1918 } | |
1919 | |
1755 } // namespace net | 1920 } // namespace net |
OLD | NEW |