OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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" |
| 10 #include "base/bind_helpers.h" |
9 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
10 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
11 #include "base/message_loop.h" | 13 #include "base/message_loop.h" |
12 #include "base/string_util.h" | 14 #include "base/string_util.h" |
13 #include "base/stringprintf.h" | 15 #include "base/stringprintf.h" |
14 #include "base/synchronization/condition_variable.h" | 16 #include "base/synchronization/condition_variable.h" |
15 #include "base/synchronization/lock.h" | 17 #include "base/synchronization/lock.h" |
16 #include "base/time.h" | 18 #include "base/time.h" |
17 #include "net/base/address_list.h" | 19 #include "net/base/address_list.h" |
18 #include "net/base/completion_callback.h" | 20 #include "net/base/completion_callback.h" |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 virtual ~Delegate() {} | 262 virtual ~Delegate() {} |
261 virtual void OnCompleted(ResolveRequest* resolve) = 0; | 263 virtual void OnCompleted(ResolveRequest* resolve) = 0; |
262 }; | 264 }; |
263 | 265 |
264 ResolveRequest(HostResolver* resolver, | 266 ResolveRequest(HostResolver* resolver, |
265 const std::string& hostname, | 267 const std::string& hostname, |
266 int port, | 268 int port, |
267 Delegate* delegate) | 269 Delegate* delegate) |
268 : info_(HostPortPair(hostname, port)), | 270 : info_(HostPortPair(hostname, port)), |
269 resolver_(resolver), | 271 resolver_(resolver), |
270 delegate_(delegate), | 272 delegate_(delegate) { |
271 ALLOW_THIS_IN_INITIALIZER_LIST( | |
272 callback_(this, &ResolveRequest::OnLookupFinished)) { | |
273 // Start the request. | 273 // Start the request. |
274 int err = resolver->Resolve(info_, &addrlist_, &callback_, &req_, | 274 int err = resolver->Resolve( |
275 BoundNetLog()); | 275 info_, &addrlist_, |
| 276 base::Bind(&ResolveRequest::OnLookupFinished, base::Unretained(this)), |
| 277 &req_, BoundNetLog()); |
276 EXPECT_EQ(ERR_IO_PENDING, err); | 278 EXPECT_EQ(ERR_IO_PENDING, err); |
277 } | 279 } |
278 | 280 |
279 ResolveRequest(HostResolver* resolver, | 281 ResolveRequest(HostResolver* resolver, |
280 const HostResolver::RequestInfo& info, | 282 const HostResolver::RequestInfo& info, |
281 Delegate* delegate) | 283 Delegate* delegate) |
282 : info_(info), resolver_(resolver), delegate_(delegate), | 284 : info_(info), resolver_(resolver), delegate_(delegate) { |
283 ALLOW_THIS_IN_INITIALIZER_LIST( | |
284 callback_(this, &ResolveRequest::OnLookupFinished)) { | |
285 // Start the request. | 285 // Start the request. |
286 int err = resolver->Resolve(info, &addrlist_, &callback_, &req_, | 286 int err = resolver->Resolve( |
287 BoundNetLog()); | 287 info, &addrlist_, |
| 288 base::Bind(&ResolveRequest::OnLookupFinished, |
| 289 base::Unretained(this)), |
| 290 &req_, BoundNetLog()); |
288 EXPECT_EQ(ERR_IO_PENDING, err); | 291 EXPECT_EQ(ERR_IO_PENDING, err); |
289 } | 292 } |
290 | 293 |
291 void Cancel() { | 294 void Cancel() { |
292 resolver_->CancelRequest(req_); | 295 resolver_->CancelRequest(req_); |
293 } | 296 } |
294 | 297 |
295 const std::string& hostname() const { | 298 const std::string& hostname() const { |
296 return info_.hostname(); | 299 return info_.hostname(); |
297 } | 300 } |
(...skipping 24 matching lines...) Expand all Loading... |
322 HostResolver::RequestInfo info_; | 325 HostResolver::RequestInfo info_; |
323 HostResolver::RequestHandle req_; | 326 HostResolver::RequestHandle req_; |
324 | 327 |
325 // The result of the resolve. | 328 // The result of the resolve. |
326 int result_; | 329 int result_; |
327 AddressList addrlist_; | 330 AddressList addrlist_; |
328 | 331 |
329 HostResolver* resolver_; | 332 HostResolver* resolver_; |
330 | 333 |
331 Delegate* delegate_; | 334 Delegate* delegate_; |
332 OldCompletionCallbackImpl<ResolveRequest> callback_; | |
333 | 335 |
334 DISALLOW_COPY_AND_ASSIGN(ResolveRequest); | 336 DISALLOW_COPY_AND_ASSIGN(ResolveRequest); |
335 }; | 337 }; |
336 | 338 |
337 class HostResolverImplTest : public testing::Test { | 339 class HostResolverImplTest : public testing::Test { |
338 public: | 340 public: |
339 HostResolverImplTest() | 341 HostResolverImplTest() |
340 : callback_called_(false), | 342 : callback_called_(false), |
341 ALLOW_THIS_IN_INITIALIZER_LIST( | 343 ALLOW_THIS_IN_INITIALIZER_LIST(callback_( |
342 callback_(this, &HostResolverImplTest::OnLookupFinished)) { | 344 base::Bind(&HostResolverImplTest::OnLookupFinished, |
| 345 base::Unretained(this)))) { |
343 } | 346 } |
344 | 347 |
345 protected: | 348 protected: |
346 bool callback_called_; | |
347 int callback_result_; | |
348 OldCompletionCallbackImpl<HostResolverImplTest> callback_; | |
349 | |
350 private: | |
351 void OnLookupFinished(int result) { | 349 void OnLookupFinished(int result) { |
352 callback_called_ = true; | 350 callback_called_ = true; |
353 callback_result_ = result; | 351 callback_result_ = result; |
354 MessageLoop::current()->Quit(); | 352 MessageLoop::current()->Quit(); |
355 } | 353 } |
| 354 |
| 355 bool callback_called_; |
| 356 int callback_result_; |
| 357 CompletionCallback callback_; |
356 }; | 358 }; |
357 | 359 |
358 TEST_F(HostResolverImplTest, AsynchronousLookup) { | 360 TEST_F(HostResolverImplTest, AsynchronousLookup) { |
359 AddressList addrlist; | 361 AddressList addrlist; |
360 const int kPortnum = 80; | 362 const int kPortnum = 80; |
361 | 363 |
362 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 364 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
363 new RuleBasedHostResolverProc(NULL)); | 365 new RuleBasedHostResolverProc(NULL)); |
364 resolver_proc->AddRule("just.testing", "192.168.1.42"); | 366 resolver_proc->AddRule("just.testing", "192.168.1.42"); |
365 | 367 |
366 scoped_ptr<HostResolver> host_resolver( | 368 scoped_ptr<HostResolver> host_resolver( |
367 CreateHostResolverImpl(resolver_proc)); | 369 CreateHostResolverImpl(resolver_proc)); |
368 | 370 |
369 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); | 371 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); |
370 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 372 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
371 int err = host_resolver->Resolve(info, &addrlist, &callback_, NULL, | 373 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, |
372 log.bound()); | 374 log.bound()); |
373 EXPECT_EQ(ERR_IO_PENDING, err); | 375 EXPECT_EQ(ERR_IO_PENDING, err); |
374 | 376 |
375 CapturingNetLog::EntryList entries; | 377 CapturingNetLog::EntryList entries; |
376 log.GetEntries(&entries); | 378 log.GetEntries(&entries); |
377 | 379 |
378 EXPECT_EQ(1u, entries.size()); | 380 EXPECT_EQ(1u, entries.size()); |
379 EXPECT_TRUE(LogContainsBeginEvent( | 381 EXPECT_TRUE(LogContainsBeginEvent( |
380 entries, 0, NetLog::TYPE_HOST_RESOLVER_IMPL)); | 382 entries, 0, NetLog::TYPE_HOST_RESOLVER_IMPL)); |
381 | 383 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 scoped_ptr<HostResolver> host_resolver( | 453 scoped_ptr<HostResolver> host_resolver( |
452 new HostResolverImpl(resolver_proc, | 454 new HostResolverImpl(resolver_proc, |
453 HostCache::CreateDefaultCache(), | 455 HostCache::CreateDefaultCache(), |
454 kMaxJobs, | 456 kMaxJobs, |
455 kMaxRetryAttempts, | 457 kMaxRetryAttempts, |
456 &net_log)); | 458 &net_log)); |
457 AddressList addrlist; | 459 AddressList addrlist; |
458 const int kPortnum = 80; | 460 const int kPortnum = 80; |
459 | 461 |
460 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); | 462 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); |
461 int err = host_resolver->Resolve(info, &addrlist, &callback_, NULL, | 463 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, |
462 log.bound()); | 464 log.bound()); |
463 EXPECT_EQ(ERR_IO_PENDING, err); | 465 EXPECT_EQ(ERR_IO_PENDING, err); |
464 | 466 |
465 resolver_proc->Wait(); | 467 resolver_proc->Wait(); |
466 } | 468 } |
467 | 469 |
468 resolver_proc->Signal(); | 470 resolver_proc->Signal(); |
469 | 471 |
470 CapturingNetLog::EntryList entries; | 472 CapturingNetLog::EntryList entries; |
471 log.GetEntries(&entries); | 473 log.GetEntries(&entries); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 // Stevens says dotted quads with AI_UNSPEC resolve to a single sockaddr_in. | 510 // Stevens says dotted quads with AI_UNSPEC resolve to a single sockaddr_in. |
509 | 511 |
510 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 512 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
511 new RuleBasedHostResolverProc(NULL)); | 513 new RuleBasedHostResolverProc(NULL)); |
512 resolver_proc->AllowDirectLookup("*"); | 514 resolver_proc->AllowDirectLookup("*"); |
513 | 515 |
514 scoped_ptr<HostResolver> host_resolver( | 516 scoped_ptr<HostResolver> host_resolver( |
515 CreateHostResolverImpl(resolver_proc)); | 517 CreateHostResolverImpl(resolver_proc)); |
516 AddressList addrlist; | 518 AddressList addrlist; |
517 const int kPortnum = 5555; | 519 const int kPortnum = 5555; |
518 TestOldCompletionCallback callback; | 520 TestCompletionCallback callback; |
519 HostResolver::RequestInfo info(HostPortPair("127.1.2.3", kPortnum)); | 521 HostResolver::RequestInfo info(HostPortPair("127.1.2.3", kPortnum)); |
520 int err = host_resolver->Resolve(info, &addrlist, &callback, NULL, | 522 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
521 BoundNetLog()); | 523 BoundNetLog()); |
522 EXPECT_EQ(OK, err); | 524 EXPECT_EQ(OK, err); |
523 | 525 |
524 const struct addrinfo* ainfo = addrlist.head(); | 526 const struct addrinfo* ainfo = addrlist.head(); |
525 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); | 527 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); |
526 EXPECT_EQ(sizeof(struct sockaddr_in), ainfo->ai_addrlen); | 528 EXPECT_EQ(sizeof(struct sockaddr_in), ainfo->ai_addrlen); |
527 | 529 |
528 const struct sockaddr* sa = ainfo->ai_addr; | 530 const struct sockaddr* sa = ainfo->ai_addr; |
529 const struct sockaddr_in* sa_in = (const struct sockaddr_in*) sa; | 531 const struct sockaddr_in* sa_in = (const struct sockaddr_in*) sa; |
530 EXPECT_TRUE(htons(kPortnum) == sa_in->sin_port); | 532 EXPECT_TRUE(htons(kPortnum) == sa_in->sin_port); |
531 EXPECT_TRUE(htonl(0x7f010203) == sa_in->sin_addr.s_addr); | 533 EXPECT_TRUE(htonl(0x7f010203) == sa_in->sin_addr.s_addr); |
532 } | 534 } |
533 | 535 |
534 TEST_F(HostResolverImplTest, NumericIPv6Address) { | 536 TEST_F(HostResolverImplTest, NumericIPv6Address) { |
535 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 537 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
536 new RuleBasedHostResolverProc(NULL)); | 538 new RuleBasedHostResolverProc(NULL)); |
537 resolver_proc->AllowDirectLookup("*"); | 539 resolver_proc->AllowDirectLookup("*"); |
538 | 540 |
539 // Resolve a plain IPv6 address. Don't worry about [brackets], because | 541 // Resolve a plain IPv6 address. Don't worry about [brackets], because |
540 // the caller should have removed them. | 542 // the caller should have removed them. |
541 scoped_ptr<HostResolver> host_resolver( | 543 scoped_ptr<HostResolver> host_resolver( |
542 CreateHostResolverImpl(resolver_proc)); | 544 CreateHostResolverImpl(resolver_proc)); |
543 AddressList addrlist; | 545 AddressList addrlist; |
544 const int kPortnum = 5555; | 546 const int kPortnum = 5555; |
545 TestOldCompletionCallback callback; | 547 TestCompletionCallback callback; |
546 HostResolver::RequestInfo info(HostPortPair("2001:db8::1", kPortnum)); | 548 HostResolver::RequestInfo info(HostPortPair("2001:db8::1", kPortnum)); |
547 int err = host_resolver->Resolve(info, &addrlist, &callback, NULL, | 549 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
548 BoundNetLog()); | 550 BoundNetLog()); |
549 EXPECT_EQ(OK, err); | 551 EXPECT_EQ(OK, err); |
550 | 552 |
551 const struct addrinfo* ainfo = addrlist.head(); | 553 const struct addrinfo* ainfo = addrlist.head(); |
552 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); | 554 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); |
553 EXPECT_EQ(sizeof(struct sockaddr_in6), ainfo->ai_addrlen); | 555 EXPECT_EQ(sizeof(struct sockaddr_in6), ainfo->ai_addrlen); |
554 | 556 |
555 const struct sockaddr* sa = ainfo->ai_addr; | 557 const struct sockaddr* sa = ainfo->ai_addr; |
556 const struct sockaddr_in6* sa_in6 = (const struct sockaddr_in6*) sa; | 558 const struct sockaddr_in6* sa_in6 = (const struct sockaddr_in6*) sa; |
557 EXPECT_TRUE(htons(kPortnum) == sa_in6->sin6_port); | 559 EXPECT_TRUE(htons(kPortnum) == sa_in6->sin6_port); |
558 | 560 |
559 const uint8 expect_addr[] = { | 561 const uint8 expect_addr[] = { |
560 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, | 562 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, |
561 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 | 563 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 |
562 }; | 564 }; |
563 for (int i = 0; i < 16; i++) { | 565 for (int i = 0; i < 16; i++) { |
564 EXPECT_EQ(expect_addr[i], sa_in6->sin6_addr.s6_addr[i]); | 566 EXPECT_EQ(expect_addr[i], sa_in6->sin6_addr.s6_addr[i]); |
565 } | 567 } |
566 } | 568 } |
567 | 569 |
568 TEST_F(HostResolverImplTest, EmptyHost) { | 570 TEST_F(HostResolverImplTest, EmptyHost) { |
569 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 571 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
570 new RuleBasedHostResolverProc(NULL)); | 572 new RuleBasedHostResolverProc(NULL)); |
571 resolver_proc->AllowDirectLookup("*"); | 573 resolver_proc->AllowDirectLookup("*"); |
572 | 574 |
573 scoped_ptr<HostResolver> host_resolver( | 575 scoped_ptr<HostResolver> host_resolver( |
574 CreateHostResolverImpl(resolver_proc)); | 576 CreateHostResolverImpl(resolver_proc)); |
575 AddressList addrlist; | 577 AddressList addrlist; |
576 const int kPortnum = 5555; | 578 const int kPortnum = 5555; |
577 TestOldCompletionCallback callback; | 579 TestCompletionCallback callback; |
578 HostResolver::RequestInfo info(HostPortPair("", kPortnum)); | 580 HostResolver::RequestInfo info(HostPortPair("", kPortnum)); |
579 int err = host_resolver->Resolve(info, &addrlist, &callback, NULL, | 581 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
580 BoundNetLog()); | 582 BoundNetLog()); |
581 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err); | 583 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err); |
582 } | 584 } |
583 | 585 |
584 TEST_F(HostResolverImplTest, LongHost) { | 586 TEST_F(HostResolverImplTest, LongHost) { |
585 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( | 587 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( |
586 new RuleBasedHostResolverProc(NULL)); | 588 new RuleBasedHostResolverProc(NULL)); |
587 resolver_proc->AllowDirectLookup("*"); | 589 resolver_proc->AllowDirectLookup("*"); |
588 | 590 |
589 scoped_ptr<HostResolver> host_resolver( | 591 scoped_ptr<HostResolver> host_resolver( |
590 CreateHostResolverImpl(resolver_proc)); | 592 CreateHostResolverImpl(resolver_proc)); |
591 AddressList addrlist; | 593 AddressList addrlist; |
592 const int kPortnum = 5555; | 594 const int kPortnum = 5555; |
593 std::string hostname(4097, 'a'); | 595 std::string hostname(4097, 'a'); |
594 TestOldCompletionCallback callback; | 596 TestCompletionCallback callback; |
595 HostResolver::RequestInfo info(HostPortPair(hostname, kPortnum)); | 597 HostResolver::RequestInfo info(HostPortPair(hostname, kPortnum)); |
596 int err = host_resolver->Resolve(info, &addrlist, &callback, NULL, | 598 int err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
597 BoundNetLog()); | 599 BoundNetLog()); |
598 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err); | 600 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, err); |
599 } | 601 } |
600 | 602 |
601 // Helper class used by HostResolverImplTest.DeDupeRequests. It receives request | 603 // Helper class used by HostResolverImplTest.DeDupeRequests. It receives request |
602 // completion notifications for all the resolves, so it can tally up and | 604 // completion notifications for all the resolves, so it can tally up and |
603 // determine when we are done. | 605 // determine when we are done. |
604 class DeDupeRequestsVerifier : public ResolveRequest::Delegate { | 606 class DeDupeRequestsVerifier : public ResolveRequest::Delegate { |
605 public: | 607 public: |
606 explicit DeDupeRequestsVerifier(CapturingHostResolverProc* resolver_proc) | 608 explicit DeDupeRequestsVerifier(CapturingHostResolverProc* resolver_proc) |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
930 | 932 |
931 virtual void OnCompleted(ResolveRequest* resolve) { | 933 virtual void OnCompleted(ResolveRequest* resolve) { |
932 EXPECT_EQ("a", resolve->hostname()); | 934 EXPECT_EQ("a", resolve->hostname()); |
933 HostResolver* resolver = resolve->resolver(); | 935 HostResolver* resolver = resolve->resolver(); |
934 | 936 |
935 if (80 == resolve->port()) { | 937 if (80 == resolve->port()) { |
936 // On completing the first request, start another request for "a". | 938 // On completing the first request, start another request for "a". |
937 // Since caching is enabled, this should complete synchronously. | 939 // Since caching is enabled, this should complete synchronously. |
938 | 940 |
939 // Note that |junk_callback| shouldn't be used since we are going to | 941 // Note that |junk_callback| shouldn't be used since we are going to |
940 // complete synchronously. We can't specify NULL though since that would | 942 // complete synchronously. |
941 // mean synchronous mode so we give it a value of 1. | 943 TestCompletionCallback junk_callback; |
942 OldCompletionCallback* junk_callback = | |
943 reinterpret_cast<OldCompletionCallback*> (1); | |
944 AddressList addrlist; | 944 AddressList addrlist; |
945 | 945 |
946 HostResolver::RequestInfo info(HostPortPair("a", 70)); | 946 HostResolver::RequestInfo info(HostPortPair("a", 70)); |
947 int error = resolver->Resolve(info, &addrlist, junk_callback, NULL, | 947 int error = resolver->Resolve(info, &addrlist, junk_callback.callback(), |
948 BoundNetLog()); | 948 NULL, BoundNetLog()); |
949 EXPECT_EQ(OK, error); | 949 EXPECT_EQ(OK, error); |
950 | 950 |
951 // Ok good. Now make sure that if we ask to bypass the cache, it can no | 951 // Ok good. Now make sure that if we ask to bypass the cache, it can no |
952 // longer service the request synchronously. | 952 // longer service the request synchronously. |
953 info = HostResolver::RequestInfo(HostPortPair("a", 71)); | 953 info = HostResolver::RequestInfo(HostPortPair("a", 71)); |
954 info.set_allow_cached_response(false); | 954 info.set_allow_cached_response(false); |
955 final_request_.reset(new ResolveRequest(resolver, info, this)); | 955 final_request_.reset(new ResolveRequest(resolver, info, this)); |
956 } else if (71 == resolve->port()) { | 956 } else if (71 == resolve->port()) { |
957 // Test is done. | 957 // Test is done. |
958 MessageLoop::current()->Quit(); | 958 MessageLoop::current()->Quit(); |
(...skipping 25 matching lines...) Expand all Loading... |
984 // Test that IP address changes flush the cache. | 984 // Test that IP address changes flush the cache. |
985 TEST_F(HostResolverImplTest, FlushCacheOnIPAddressChange) { | 985 TEST_F(HostResolverImplTest, FlushCacheOnIPAddressChange) { |
986 scoped_ptr<HostResolver> host_resolver( | 986 scoped_ptr<HostResolver> host_resolver( |
987 new HostResolverImpl(NULL, HostCache::CreateDefaultCache(), kMaxJobs, | 987 new HostResolverImpl(NULL, HostCache::CreateDefaultCache(), kMaxJobs, |
988 kMaxRetryAttempts, NULL)); | 988 kMaxRetryAttempts, NULL)); |
989 | 989 |
990 AddressList addrlist; | 990 AddressList addrlist; |
991 | 991 |
992 // Resolve "host1". | 992 // Resolve "host1". |
993 HostResolver::RequestInfo info1(HostPortPair("host1", 70)); | 993 HostResolver::RequestInfo info1(HostPortPair("host1", 70)); |
994 TestOldCompletionCallback callback; | 994 TestCompletionCallback callback; |
995 int rv = host_resolver->Resolve(info1, &addrlist, &callback, NULL, | 995 int rv = host_resolver->Resolve(info1, &addrlist, callback.callback(), NULL, |
996 BoundNetLog()); | 996 BoundNetLog()); |
997 EXPECT_EQ(ERR_IO_PENDING, rv); | 997 EXPECT_EQ(ERR_IO_PENDING, rv); |
998 EXPECT_EQ(OK, callback.WaitForResult()); | 998 EXPECT_EQ(OK, callback.WaitForResult()); |
999 | 999 |
1000 // Resolve "host1" again -- this time it will be served from cache, but it | 1000 // Resolve "host1" again -- this time it will be served from cache, but it |
1001 // should still notify of completion. | 1001 // should still notify of completion. |
1002 rv = host_resolver->Resolve(info1, &addrlist, &callback, NULL, BoundNetLog()); | 1002 rv = host_resolver->Resolve(info1, &addrlist, callback.callback(), NULL, |
| 1003 BoundNetLog()); |
1003 ASSERT_EQ(OK, rv); // Should complete synchronously. | 1004 ASSERT_EQ(OK, rv); // Should complete synchronously. |
1004 | 1005 |
1005 // Flush cache by triggering an IP address change. | 1006 // Flush cache by triggering an IP address change. |
1006 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 1007 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
1007 MessageLoop::current()->RunAllPending(); // Notification happens async. | 1008 MessageLoop::current()->RunAllPending(); // Notification happens async. |
1008 | 1009 |
1009 // Resolve "host1" again -- this time it won't be served from cache, so it | 1010 // Resolve "host1" again -- this time it won't be served from cache, so it |
1010 // will complete asynchronously. | 1011 // will complete asynchronously. |
1011 rv = host_resolver->Resolve(info1, &addrlist, &callback, NULL, BoundNetLog()); | 1012 rv = host_resolver->Resolve(info1, &addrlist, callback.callback(), NULL, |
| 1013 BoundNetLog()); |
1012 ASSERT_EQ(ERR_IO_PENDING, rv); // Should complete asynchronously. | 1014 ASSERT_EQ(ERR_IO_PENDING, rv); // Should complete asynchronously. |
1013 EXPECT_EQ(OK, callback.WaitForResult()); | 1015 EXPECT_EQ(OK, callback.WaitForResult()); |
1014 } | 1016 } |
1015 | 1017 |
1016 // Test that IP address changes send ERR_ABORTED to pending requests. | 1018 // Test that IP address changes send ERR_ABORTED to pending requests. |
1017 TEST_F(HostResolverImplTest, AbortOnIPAddressChanged) { | 1019 TEST_F(HostResolverImplTest, AbortOnIPAddressChanged) { |
1018 scoped_refptr<WaitingHostResolverProc> resolver_proc( | 1020 scoped_refptr<WaitingHostResolverProc> resolver_proc( |
1019 new WaitingHostResolverProc(NULL)); | 1021 new WaitingHostResolverProc(NULL)); |
1020 scoped_ptr<HostResolver> host_resolver(CreateHostResolverImpl(resolver_proc)); | 1022 scoped_ptr<HostResolver> host_resolver(CreateHostResolverImpl(resolver_proc)); |
1021 | 1023 |
1022 // Resolve "host1". | 1024 // Resolve "host1". |
1023 HostResolver::RequestInfo info(HostPortPair("host1", 70)); | 1025 HostResolver::RequestInfo info(HostPortPair("host1", 70)); |
1024 TestOldCompletionCallback callback; | 1026 TestCompletionCallback callback; |
1025 AddressList addrlist; | 1027 AddressList addrlist; |
1026 int rv = host_resolver->Resolve(info, &addrlist, &callback, NULL, | 1028 int rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
1027 BoundNetLog()); | 1029 BoundNetLog()); |
1028 EXPECT_EQ(ERR_IO_PENDING, rv); | 1030 EXPECT_EQ(ERR_IO_PENDING, rv); |
1029 | 1031 |
1030 resolver_proc->Wait(); | 1032 resolver_proc->Wait(); |
1031 // Triggering an IP address change. | 1033 // Triggering an IP address change. |
1032 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 1034 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
1033 MessageLoop::current()->RunAllPending(); // Notification happens async. | 1035 MessageLoop::current()->RunAllPending(); // Notification happens async. |
1034 resolver_proc->Signal(); | 1036 resolver_proc->Signal(); |
1035 | 1037 |
1036 EXPECT_EQ(ERR_ABORTED, callback.WaitForResult()); | 1038 EXPECT_EQ(ERR_ABORTED, callback.WaitForResult()); |
1037 EXPECT_EQ(0u, host_resolver->GetHostCache()->size()); | 1039 EXPECT_EQ(0u, host_resolver->GetHostCache()->size()); |
1038 } | 1040 } |
1039 | 1041 |
1040 // Obey pool constraints after IP address has changed. | 1042 // Obey pool constraints after IP address has changed. |
1041 TEST_F(HostResolverImplTest, ObeyPoolConstraintsAfterIPAddressChange) { | 1043 TEST_F(HostResolverImplTest, ObeyPoolConstraintsAfterIPAddressChange) { |
1042 scoped_refptr<WaitingHostResolverProc> resolver_proc( | 1044 scoped_refptr<WaitingHostResolverProc> resolver_proc( |
1043 new WaitingHostResolverProc(CreateCatchAllHostResolverProc())); | 1045 new WaitingHostResolverProc(CreateCatchAllHostResolverProc())); |
1044 scoped_ptr<HostResolverImpl> host_resolver( | 1046 scoped_ptr<HostResolverImpl> host_resolver( |
1045 new HostResolverImpl(resolver_proc, HostCache::CreateDefaultCache(), | 1047 new HostResolverImpl(resolver_proc, HostCache::CreateDefaultCache(), |
1046 kMaxJobs, kMaxRetryAttempts, NULL)); | 1048 kMaxJobs, kMaxRetryAttempts, NULL)); |
1047 | 1049 |
1048 const size_t kMaxOutstandingJobs = 1u; | 1050 const size_t kMaxOutstandingJobs = 1u; |
1049 const size_t kMaxPendingRequests = 1000000u; // not relevant. | 1051 const size_t kMaxPendingRequests = 1000000u; // not relevant. |
1050 host_resolver->SetPoolConstraints(HostResolverImpl::POOL_NORMAL, | 1052 host_resolver->SetPoolConstraints(HostResolverImpl::POOL_NORMAL, |
1051 kMaxOutstandingJobs, | 1053 kMaxOutstandingJobs, |
1052 kMaxPendingRequests); | 1054 kMaxPendingRequests); |
1053 | 1055 |
1054 // Resolve "host1". | 1056 // Resolve "host1". |
1055 HostResolver::RequestInfo info(HostPortPair("host1", 70)); | 1057 HostResolver::RequestInfo info(HostPortPair("host1", 70)); |
1056 TestOldCompletionCallback callback; | 1058 TestCompletionCallback callback; |
1057 AddressList addrlist; | 1059 AddressList addrlist; |
1058 int rv = host_resolver->Resolve(info, &addrlist, &callback, NULL, | 1060 int rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
1059 BoundNetLog()); | 1061 BoundNetLog()); |
1060 EXPECT_EQ(ERR_IO_PENDING, rv); | 1062 EXPECT_EQ(ERR_IO_PENDING, rv); |
1061 | 1063 |
1062 // Must wait before signal to ensure that the two signals don't get merged | 1064 // Must wait before signal to ensure that the two signals don't get merged |
1063 // together. (Worker threads might not start until the last WaitForResult.) | 1065 // together. (Worker threads might not start until the last WaitForResult.) |
1064 resolver_proc->Wait(); | 1066 resolver_proc->Wait(); |
1065 // Triggering an IP address change. | 1067 // Triggering an IP address change. |
1066 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 1068 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
1067 MessageLoop::current()->RunAllPending(); // Notification happens async. | 1069 MessageLoop::current()->RunAllPending(); // Notification happens async. |
1068 resolver_proc->Signal(); | 1070 resolver_proc->Signal(); |
1069 | 1071 |
1070 EXPECT_EQ(ERR_ABORTED, callback.WaitForResult()); | 1072 EXPECT_EQ(ERR_ABORTED, callback.WaitForResult()); |
1071 | 1073 |
1072 rv = host_resolver->Resolve(info, &addrlist, &callback, NULL, | 1074 rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
1073 BoundNetLog()); | 1075 BoundNetLog()); |
1074 EXPECT_EQ(ERR_IO_PENDING, rv); | 1076 EXPECT_EQ(ERR_IO_PENDING, rv); |
1075 resolver_proc->Wait(); | 1077 resolver_proc->Wait(); |
1076 resolver_proc->Signal(); | 1078 resolver_proc->Signal(); |
1077 EXPECT_EQ(OK, callback.WaitForResult()); | 1079 EXPECT_EQ(OK, callback.WaitForResult()); |
1078 } | 1080 } |
1079 | 1081 |
1080 class ResolveWithinCallback : public CallbackRunner< Tuple1<int> > { | 1082 class ResolveWithinCallback { |
1081 public: | 1083 public: |
1082 explicit ResolveWithinCallback(const HostResolver::RequestInfo& info) | 1084 explicit ResolveWithinCallback(const HostResolver::RequestInfo& info) |
1083 : info_(info) {} | 1085 : info_(info) {} |
1084 | 1086 |
1085 virtual void RunWithParams(const Tuple1<int>& params) { | 1087 const CompletionCallback& callback() const { return callback_.callback(); } |
| 1088 |
| 1089 int WaitForResult() { |
| 1090 int result = callback_.WaitForResult(); |
1086 // Ditch the WaitingHostResolverProc so that the subsequent request | 1091 // Ditch the WaitingHostResolverProc so that the subsequent request |
1087 // succeeds. | 1092 // succeeds. |
1088 callback_.RunWithParams(params); | |
1089 host_resolver_.reset( | 1093 host_resolver_.reset( |
1090 CreateHostResolverImpl(CreateCatchAllHostResolverProc())); | 1094 CreateHostResolverImpl(CreateCatchAllHostResolverProc())); |
1091 EXPECT_EQ(ERR_IO_PENDING, | 1095 EXPECT_EQ(ERR_IO_PENDING, |
1092 host_resolver_->Resolve(info_, &addrlist_, &nested_callback_, | 1096 host_resolver_->Resolve(info_, &addrlist_, |
1093 NULL, BoundNetLog())); | 1097 nested_callback_.callback(), NULL, |
1094 } | 1098 BoundNetLog())); |
1095 | 1099 return result; |
1096 int WaitForResult() { | |
1097 return callback_.WaitForResult(); | |
1098 } | 1100 } |
1099 | 1101 |
1100 int WaitForNestedResult() { | 1102 int WaitForNestedResult() { |
1101 return nested_callback_.WaitForResult(); | 1103 return nested_callback_.WaitForResult(); |
1102 } | 1104 } |
1103 | 1105 |
1104 private: | 1106 private: |
1105 const HostResolver::RequestInfo info_; | 1107 const HostResolver::RequestInfo info_; |
1106 AddressList addrlist_; | 1108 AddressList addrlist_; |
1107 TestOldCompletionCallback callback_; | 1109 TestCompletionCallback callback_; |
1108 TestOldCompletionCallback nested_callback_; | 1110 TestCompletionCallback nested_callback_; |
1109 scoped_ptr<HostResolver> host_resolver_; | 1111 scoped_ptr<HostResolver> host_resolver_; |
1110 }; | 1112 }; |
1111 | 1113 |
1112 TEST_F(HostResolverImplTest, OnlyAbortExistingRequestsOnIPAddressChange) { | 1114 TEST_F(HostResolverImplTest, OnlyAbortExistingRequestsOnIPAddressChange) { |
1113 scoped_refptr<WaitingHostResolverProc> resolver_proc( | 1115 scoped_refptr<WaitingHostResolverProc> resolver_proc( |
1114 new WaitingHostResolverProc(CreateCatchAllHostResolverProc())); | 1116 new WaitingHostResolverProc(CreateCatchAllHostResolverProc())); |
1115 scoped_ptr<HostResolver> host_resolver(CreateHostResolverImpl(resolver_proc)); | 1117 scoped_ptr<HostResolver> host_resolver(CreateHostResolverImpl(resolver_proc)); |
1116 | 1118 |
1117 // Resolve "host1". | 1119 // Resolve "host1". |
1118 HostResolver::RequestInfo info(HostPortPair("host1", 70)); | 1120 HostResolver::RequestInfo info(HostPortPair("host1", 70)); |
1119 ResolveWithinCallback callback(info); | 1121 ResolveWithinCallback callback(info); |
1120 AddressList addrlist; | 1122 AddressList addrlist; |
1121 int rv = host_resolver->Resolve(info, &addrlist, &callback, NULL, | 1123 int rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
1122 BoundNetLog()); | 1124 BoundNetLog()); |
1123 EXPECT_EQ(ERR_IO_PENDING, rv); | 1125 EXPECT_EQ(ERR_IO_PENDING, rv); |
1124 | 1126 |
1125 resolver_proc->Wait(); | 1127 resolver_proc->Wait(); |
1126 // Triggering an IP address change. | 1128 // Triggering an IP address change. |
1127 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 1129 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
1128 MessageLoop::current()->RunAllPending(); // Notification happens async. | 1130 MessageLoop::current()->RunAllPending(); // Notification happens async. |
1129 EXPECT_EQ(ERR_ABORTED, callback.WaitForResult()); | 1131 EXPECT_EQ(ERR_ABORTED, callback.WaitForResult()); |
1130 resolver_proc->Signal(); // release the thread from WorkerPool for cleanup | 1132 resolver_proc->Signal(); // release the thread from WorkerPool for cleanup |
1131 EXPECT_EQ(OK, callback.WaitForNestedResult()); | 1133 EXPECT_EQ(OK, callback.WaitForNestedResult()); |
(...skipping 19 matching lines...) Expand all Loading... |
1151 CreateResolverRequest("req0", LOW), | 1153 CreateResolverRequest("req0", LOW), |
1152 CreateResolverRequest("req1", MEDIUM), | 1154 CreateResolverRequest("req1", MEDIUM), |
1153 CreateResolverRequest("req2", MEDIUM), | 1155 CreateResolverRequest("req2", MEDIUM), |
1154 CreateResolverRequest("req3", LOW), | 1156 CreateResolverRequest("req3", LOW), |
1155 CreateResolverRequest("req4", HIGHEST), | 1157 CreateResolverRequest("req4", HIGHEST), |
1156 CreateResolverRequest("req5", LOW), | 1158 CreateResolverRequest("req5", LOW), |
1157 CreateResolverRequest("req6", LOW), | 1159 CreateResolverRequest("req6", LOW), |
1158 CreateResolverRequest("req5", HIGHEST), | 1160 CreateResolverRequest("req5", HIGHEST), |
1159 }; | 1161 }; |
1160 | 1162 |
1161 TestOldCompletionCallback callback[arraysize(req)]; | 1163 TestCompletionCallback callback[arraysize(req)]; |
1162 AddressList addrlist[arraysize(req)]; | 1164 AddressList addrlist[arraysize(req)]; |
1163 | 1165 |
1164 // Start all of the requests. | 1166 // Start all of the requests. |
1165 for (size_t i = 0; i < arraysize(req); ++i) { | 1167 for (size_t i = 0; i < arraysize(req); ++i) { |
1166 int rv = host_resolver->Resolve(req[i], &addrlist[i], | 1168 int rv = host_resolver->Resolve(req[i], &addrlist[i], |
1167 &callback[i], NULL, BoundNetLog()); | 1169 callback[i].callback(), NULL, |
| 1170 BoundNetLog()); |
1168 EXPECT_EQ(ERR_IO_PENDING, rv); | 1171 EXPECT_EQ(ERR_IO_PENDING, rv); |
1169 } | 1172 } |
1170 | 1173 |
1171 // Unblock the resolver thread so the requests can run. | 1174 // Unblock the resolver thread so the requests can run. |
1172 resolver_proc->Signal(); | 1175 resolver_proc->Signal(); |
1173 | 1176 |
1174 // Wait for all the requests to complete succesfully. | 1177 // Wait for all the requests to complete succesfully. |
1175 for (size_t i = 0; i < arraysize(req); ++i) { | 1178 for (size_t i = 0; i < arraysize(req); ++i) { |
1176 EXPECT_EQ(OK, callback[i].WaitForResult()) << "i=" << i; | 1179 EXPECT_EQ(OK, callback[i].WaitForResult()) << "i=" << i; |
1177 } | 1180 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1211 HostResolver::RequestInfo req[] = { | 1214 HostResolver::RequestInfo req[] = { |
1212 CreateResolverRequest("req0", LOWEST), | 1215 CreateResolverRequest("req0", LOWEST), |
1213 CreateResolverRequest("req1", HIGHEST), // Will cancel. | 1216 CreateResolverRequest("req1", HIGHEST), // Will cancel. |
1214 CreateResolverRequest("req2", MEDIUM), | 1217 CreateResolverRequest("req2", MEDIUM), |
1215 CreateResolverRequest("req3", LOW), | 1218 CreateResolverRequest("req3", LOW), |
1216 CreateResolverRequest("req4", HIGHEST), // Will cancel. | 1219 CreateResolverRequest("req4", HIGHEST), // Will cancel. |
1217 CreateResolverRequest("req5", LOWEST), // Will cancel. | 1220 CreateResolverRequest("req5", LOWEST), // Will cancel. |
1218 CreateResolverRequest("req6", MEDIUM), | 1221 CreateResolverRequest("req6", MEDIUM), |
1219 }; | 1222 }; |
1220 | 1223 |
1221 TestOldCompletionCallback callback[arraysize(req)]; | 1224 TestCompletionCallback callback[arraysize(req)]; |
1222 AddressList addrlist[arraysize(req)]; | 1225 AddressList addrlist[arraysize(req)]; |
1223 HostResolver::RequestHandle handle[arraysize(req)]; | 1226 HostResolver::RequestHandle handle[arraysize(req)]; |
1224 | 1227 |
1225 // Start all of the requests. | 1228 // Start all of the requests. |
1226 for (size_t i = 0; i < arraysize(req); ++i) { | 1229 for (size_t i = 0; i < arraysize(req); ++i) { |
1227 int rv = host_resolver->Resolve(req[i], &addrlist[i], | 1230 int rv = host_resolver->Resolve(req[i], &addrlist[i], |
1228 &callback[i], &handle[i], BoundNetLog()); | 1231 callback[i].callback(), &handle[i], |
| 1232 BoundNetLog()); |
1229 EXPECT_EQ(ERR_IO_PENDING, rv); | 1233 EXPECT_EQ(ERR_IO_PENDING, rv); |
1230 } | 1234 } |
1231 | 1235 |
1232 // Cancel some requests | 1236 // Cancel some requests |
1233 host_resolver->CancelRequest(handle[1]); | 1237 host_resolver->CancelRequest(handle[1]); |
1234 host_resolver->CancelRequest(handle[4]); | 1238 host_resolver->CancelRequest(handle[4]); |
1235 host_resolver->CancelRequest(handle[5]); | 1239 host_resolver->CancelRequest(handle[5]); |
1236 handle[1] = handle[4] = handle[5] = NULL; | 1240 handle[1] = handle[4] = handle[5] = NULL; |
1237 | 1241 |
1238 // Unblock the resolver thread so the requests can run. | 1242 // Unblock the resolver thread so the requests can run. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1287 // At this point, there are 3 enqueued requests. | 1291 // At this point, there are 3 enqueued requests. |
1288 // Insertion of subsequent requests will cause evictions | 1292 // Insertion of subsequent requests will cause evictions |
1289 // based on priority. | 1293 // based on priority. |
1290 | 1294 |
1291 CreateResolverRequest("req4", LOW), // Evicts itself! | 1295 CreateResolverRequest("req4", LOW), // Evicts itself! |
1292 CreateResolverRequest("req5", MEDIUM), // Evicts req3 | 1296 CreateResolverRequest("req5", MEDIUM), // Evicts req3 |
1293 CreateResolverRequest("req6", HIGHEST), // Evicts req5. | 1297 CreateResolverRequest("req6", HIGHEST), // Evicts req5. |
1294 CreateResolverRequest("req7", MEDIUM), // Evicts req2. | 1298 CreateResolverRequest("req7", MEDIUM), // Evicts req2. |
1295 }; | 1299 }; |
1296 | 1300 |
1297 TestOldCompletionCallback callback[arraysize(req)]; | 1301 TestCompletionCallback callback[arraysize(req)]; |
1298 AddressList addrlist[arraysize(req)]; | 1302 AddressList addrlist[arraysize(req)]; |
1299 HostResolver::RequestHandle handle[arraysize(req)]; | 1303 HostResolver::RequestHandle handle[arraysize(req)]; |
1300 | 1304 |
1301 // Start all of the requests. | 1305 // Start all of the requests. |
1302 for (size_t i = 0; i < arraysize(req); ++i) { | 1306 for (size_t i = 0; i < arraysize(req); ++i) { |
1303 int rv = host_resolver->Resolve(req[i], &addrlist[i], | 1307 int rv = host_resolver->Resolve(req[i], &addrlist[i], |
1304 &callback[i], &handle[i], BoundNetLog()); | 1308 callback[i].callback(), &handle[i], |
| 1309 BoundNetLog()); |
1305 if (i == 4u) | 1310 if (i == 4u) |
1306 EXPECT_EQ(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, rv); | 1311 EXPECT_EQ(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, rv); |
1307 else | 1312 else |
1308 EXPECT_EQ(ERR_IO_PENDING, rv) << i; | 1313 EXPECT_EQ(ERR_IO_PENDING, rv) << i; |
1309 } | 1314 } |
1310 | 1315 |
1311 // Unblock the resolver thread so the requests can run. | 1316 // Unblock the resolver thread so the requests can run. |
1312 resolver_proc->Signal(); | 1317 resolver_proc->Signal(); |
1313 | 1318 |
1314 // Requests 3, 5, 2 will have been evicted due to queue overflow. | 1319 // Requests 3, 5, 2 will have been evicted due to queue overflow. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1354 // Note that at this point the CapturingHostResolverProc is blocked, so any | 1359 // Note that at this point the CapturingHostResolverProc is blocked, so any |
1355 // requests we make will not complete. | 1360 // requests we make will not complete. |
1356 | 1361 |
1357 HostResolver::RequestInfo req[] = { | 1362 HostResolver::RequestInfo req[] = { |
1358 CreateResolverRequestForAddressFamily("h1", MEDIUM, | 1363 CreateResolverRequestForAddressFamily("h1", MEDIUM, |
1359 ADDRESS_FAMILY_UNSPECIFIED), | 1364 ADDRESS_FAMILY_UNSPECIFIED), |
1360 CreateResolverRequestForAddressFamily("h1", MEDIUM, ADDRESS_FAMILY_IPV4), | 1365 CreateResolverRequestForAddressFamily("h1", MEDIUM, ADDRESS_FAMILY_IPV4), |
1361 CreateResolverRequestForAddressFamily("h1", MEDIUM, ADDRESS_FAMILY_IPV6), | 1366 CreateResolverRequestForAddressFamily("h1", MEDIUM, ADDRESS_FAMILY_IPV6), |
1362 }; | 1367 }; |
1363 | 1368 |
1364 TestOldCompletionCallback callback[arraysize(req)]; | 1369 TestCompletionCallback callback[arraysize(req)]; |
1365 AddressList addrlist[arraysize(req)]; | 1370 AddressList addrlist[arraysize(req)]; |
1366 HostResolver::RequestHandle handle[arraysize(req)]; | 1371 HostResolver::RequestHandle handle[arraysize(req)]; |
1367 | 1372 |
1368 // Start all of the requests. | 1373 // Start all of the requests. |
1369 for (size_t i = 0; i < arraysize(req); ++i) { | 1374 for (size_t i = 0; i < arraysize(req); ++i) { |
1370 int rv = host_resolver->Resolve(req[i], &addrlist[i], | 1375 int rv = host_resolver->Resolve(req[i], &addrlist[i], |
1371 &callback[i], &handle[i], BoundNetLog()); | 1376 callback[i].callback(), &handle[i], |
| 1377 BoundNetLog()); |
1372 EXPECT_EQ(ERR_IO_PENDING, rv) << i; | 1378 EXPECT_EQ(ERR_IO_PENDING, rv) << i; |
1373 } | 1379 } |
1374 | 1380 |
1375 // Unblock the resolver thread so the requests can run. | 1381 // Unblock the resolver thread so the requests can run. |
1376 resolver_proc->Signal(); | 1382 resolver_proc->Signal(); |
1377 | 1383 |
1378 // Wait for all the requests to complete. | 1384 // Wait for all the requests to complete. |
1379 for (size_t i = 0u; i < arraysize(req); ++i) { | 1385 for (size_t i = 0u; i < arraysize(req); ++i) { |
1380 EXPECT_EQ(OK, callback[i].WaitForResult()); | 1386 EXPECT_EQ(OK, callback[i].WaitForResult()); |
1381 } | 1387 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1424 // Note that at this point the CapturingHostResolverProc is blocked, so any | 1430 // Note that at this point the CapturingHostResolverProc is blocked, so any |
1425 // requests we make will not complete. | 1431 // requests we make will not complete. |
1426 | 1432 |
1427 HostResolver::RequestInfo req[] = { | 1433 HostResolver::RequestInfo req[] = { |
1428 CreateResolverRequestForAddressFamily("h1", MEDIUM, ADDRESS_FAMILY_IPV6), | 1434 CreateResolverRequestForAddressFamily("h1", MEDIUM, ADDRESS_FAMILY_IPV6), |
1429 CreateResolverRequestForAddressFamily("h1", MEDIUM, | 1435 CreateResolverRequestForAddressFamily("h1", MEDIUM, |
1430 ADDRESS_FAMILY_UNSPECIFIED), | 1436 ADDRESS_FAMILY_UNSPECIFIED), |
1431 CreateResolverRequestForAddressFamily("h1", MEDIUM, ADDRESS_FAMILY_IPV4), | 1437 CreateResolverRequestForAddressFamily("h1", MEDIUM, ADDRESS_FAMILY_IPV4), |
1432 }; | 1438 }; |
1433 | 1439 |
1434 TestOldCompletionCallback callback[arraysize(req)]; | 1440 TestCompletionCallback callback[arraysize(req)]; |
1435 AddressList addrlist[arraysize(req)]; | 1441 AddressList addrlist[arraysize(req)]; |
1436 HostResolver::RequestHandle handle[arraysize(req)]; | 1442 HostResolver::RequestHandle handle[arraysize(req)]; |
1437 | 1443 |
1438 // Start all of the requests. | 1444 // Start all of the requests. |
1439 for (size_t i = 0; i < arraysize(req); ++i) { | 1445 for (size_t i = 0; i < arraysize(req); ++i) { |
1440 int rv = host_resolver->Resolve(req[i], &addrlist[i], | 1446 int rv = host_resolver->Resolve(req[i], &addrlist[i], |
1441 &callback[i], &handle[i], BoundNetLog()); | 1447 callback[i].callback(), &handle[i], |
| 1448 BoundNetLog()); |
1442 EXPECT_EQ(ERR_IO_PENDING, rv) << i; | 1449 EXPECT_EQ(ERR_IO_PENDING, rv) << i; |
1443 } | 1450 } |
1444 | 1451 |
1445 // Unblock the resolver thread so the requests can run. | 1452 // Unblock the resolver thread so the requests can run. |
1446 resolver_proc->Signal(); | 1453 resolver_proc->Signal(); |
1447 | 1454 |
1448 // Wait for all the requests to complete. | 1455 // Wait for all the requests to complete. |
1449 for (size_t i = 0u; i < arraysize(req); ++i) { | 1456 for (size_t i = 0u; i < arraysize(req); ++i) { |
1450 EXPECT_EQ(OK, callback[i].WaitForResult()); | 1457 EXPECT_EQ(OK, callback[i].WaitForResult()); |
1451 } | 1458 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1486 scoped_ptr<HostResolver> host_resolver( | 1493 scoped_ptr<HostResolver> host_resolver( |
1487 CreateHostResolverImpl(resolver_proc)); | 1494 CreateHostResolverImpl(resolver_proc)); |
1488 | 1495 |
1489 // First hit will miss the cache. | 1496 // First hit will miss the cache. |
1490 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); | 1497 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); |
1491 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); | 1498 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); |
1492 int err = host_resolver->ResolveFromCache(info, &addrlist, log.bound()); | 1499 int err = host_resolver->ResolveFromCache(info, &addrlist, log.bound()); |
1493 EXPECT_EQ(ERR_DNS_CACHE_MISS, err); | 1500 EXPECT_EQ(ERR_DNS_CACHE_MISS, err); |
1494 | 1501 |
1495 // This time, we fetch normally. | 1502 // This time, we fetch normally. |
1496 TestOldCompletionCallback callback; | 1503 TestCompletionCallback callback; |
1497 err = host_resolver->Resolve(info, &addrlist, &callback, NULL, log.bound()); | 1504 err = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
| 1505 log.bound()); |
1498 EXPECT_EQ(ERR_IO_PENDING, err); | 1506 EXPECT_EQ(ERR_IO_PENDING, err); |
1499 err = callback.WaitForResult(); | 1507 err = callback.WaitForResult(); |
1500 EXPECT_EQ(OK, err); | 1508 EXPECT_EQ(OK, err); |
1501 | 1509 |
1502 // Now we should be able to fetch from the cache. | 1510 // Now we should be able to fetch from the cache. |
1503 err = host_resolver->ResolveFromCache(info, &addrlist, log.bound()); | 1511 err = host_resolver->ResolveFromCache(info, &addrlist, log.bound()); |
1504 EXPECT_EQ(OK, err); | 1512 EXPECT_EQ(OK, err); |
1505 | 1513 |
1506 const struct addrinfo* ainfo = addrlist.head(); | 1514 const struct addrinfo* ainfo = addrlist.head(); |
1507 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); | 1515 EXPECT_EQ(static_cast<addrinfo*>(NULL), ainfo->ai_next); |
(...skipping 23 matching lines...) Expand all Loading... |
1531 NULL)); | 1539 NULL)); |
1532 | 1540 |
1533 // Specify smaller interval for unresponsive_delay_ for HostResolverImpl so | 1541 // Specify smaller interval for unresponsive_delay_ for HostResolverImpl so |
1534 // that unit test runs faster. For example, this test finishes in 1.5 secs | 1542 // that unit test runs faster. For example, this test finishes in 1.5 secs |
1535 // (500ms * 3). | 1543 // (500ms * 3). |
1536 TimeDelta kUnresponsiveTime = TimeDelta::FromMilliseconds(500); | 1544 TimeDelta kUnresponsiveTime = TimeDelta::FromMilliseconds(500); |
1537 host_resolver->set_unresponsive_delay(kUnresponsiveTime); | 1545 host_resolver->set_unresponsive_delay(kUnresponsiveTime); |
1538 | 1546 |
1539 // Resolve "host1". | 1547 // Resolve "host1". |
1540 HostResolver::RequestInfo info(HostPortPair("host1", 70)); | 1548 HostResolver::RequestInfo info(HostPortPair("host1", 70)); |
1541 TestOldCompletionCallback callback; | 1549 TestCompletionCallback callback; |
1542 AddressList addrlist; | 1550 AddressList addrlist; |
1543 int rv = host_resolver->Resolve(info, &addrlist, &callback, NULL, | 1551 int rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, |
1544 BoundNetLog()); | 1552 BoundNetLog()); |
1545 EXPECT_EQ(ERR_IO_PENDING, rv); | 1553 EXPECT_EQ(ERR_IO_PENDING, rv); |
1546 | 1554 |
1547 // Resolve returns -4 to indicate that 3rd attempt has resolved the host. | 1555 // Resolve returns -4 to indicate that 3rd attempt has resolved the host. |
1548 EXPECT_EQ(-4, callback.WaitForResult()); | 1556 EXPECT_EQ(-4, callback.WaitForResult()); |
1549 | 1557 |
1550 resolver_proc->WaitForAllAttemptsToFinish(TimeDelta::FromMilliseconds(60000)); | 1558 resolver_proc->WaitForAllAttemptsToFinish(TimeDelta::FromMilliseconds(60000)); |
1551 MessageLoop::current()->RunAllPending(); | 1559 MessageLoop::current()->RunAllPending(); |
1552 | 1560 |
1553 EXPECT_EQ(resolver_proc->total_attempts_resolved(), kTotalAttempts); | 1561 EXPECT_EQ(resolver_proc->total_attempts_resolved(), kTotalAttempts); |
1554 EXPECT_EQ(resolver_proc->resolved_attempt_number(), kAttemptNumberToResolve); | 1562 EXPECT_EQ(resolver_proc->resolved_attempt_number(), kAttemptNumberToResolve); |
1555 } | 1563 } |
1556 | 1564 |
1557 // TODO(cbentzel): Test a mix of requests with different HostResolverFlags. | 1565 // TODO(cbentzel): Test a mix of requests with different HostResolverFlags. |
1558 | 1566 |
1559 } // namespace net | 1567 } // namespace net |
OLD | NEW |