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 |