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

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

Issue 9101011: [net/dns] Refactoring of job dispatch in HostResolverImpl in preparation for DnsTransactionFactory. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed license header for the presubmit check.' Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/base/host_resolver_impl.cc ('k') | net/base/net_log_event_type_list.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/base/host_resolver_impl.h" 5 #include "net/base/host_resolver_impl.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
11 #include "base/compiler_specific.h" 11 #include "base/compiler_specific.h"
12 #include "base/memory/ref_counted.h" 12 #include "base/memory/ref_counted.h"
13 #include "base/message_loop.h" 13 #include "base/message_loop.h"
14 #include "base/string_util.h" 14 #include "base/string_util.h"
15 #include "base/stringprintf.h" 15 #include "base/stringprintf.h"
16 #include "base/synchronization/condition_variable.h" 16 #include "base/synchronization/condition_variable.h"
17 #include "base/synchronization/lock.h" 17 #include "base/synchronization/lock.h"
18 #include "base/time.h" 18 #include "base/time.h"
19 #include "net/base/address_list.h" 19 #include "net/base/address_list.h"
20 #include "net/base/completion_callback.h" 20 #include "net/base/completion_callback.h"
21 #include "net/base/host_cache.h" 21 #include "net/base/host_cache.h"
22 #include "net/base/mock_host_resolver.h" 22 #include "net/base/mock_host_resolver.h"
23 #include "net/base/net_errors.h" 23 #include "net/base/net_errors.h"
24 #include "net/base/net_log_unittest.h" 24 #include "net/base/net_log_unittest.h"
25 #include "net/base/net_util.h" 25 #include "net/base/net_util.h"
26 #include "net/base/sys_addrinfo.h" 26 #include "net/base/sys_addrinfo.h"
27 #include "net/base/test_completion_callback.h" 27 #include "net/base/test_completion_callback.h"
28 #include "testing/gtest/include/gtest/gtest.h" 28 #include "testing/gtest/include/gtest/gtest.h"
29 29
30 // TODO(eroman):
31 // - Test mixing async with sync (in particular how does sync update the
32 // cache while an async is already pending).
33
34 namespace net { 30 namespace net {
35 31
36 using base::TimeDelta; 32 using base::TimeDelta;
37 using base::TimeTicks; 33 using base::TimeTicks;
38 34
39 static const size_t kMaxJobs = 10u; 35 static const size_t kMaxJobs = 10u;
40 static const size_t kMaxRetryAttempts = 4u; 36 static const size_t kMaxRetryAttempts = 4u;
41 37
38 PrioritizedDispatcher::Limits DefaultLimits() {
39 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, kMaxJobs);
40 return limits;
41 }
42
43 HostResolverImpl::ProcTaskParams DefaultParams(
44 HostResolverProc* resolver_proc) {
45 return HostResolverImpl::ProcTaskParams(resolver_proc,
46 kMaxRetryAttempts);
47 }
48
42 HostResolverImpl* CreateHostResolverImpl(HostResolverProc* resolver_proc) { 49 HostResolverImpl* CreateHostResolverImpl(HostResolverProc* resolver_proc) {
43 return new HostResolverImpl(resolver_proc, HostCache::CreateDefaultCache(), 50 return new HostResolverImpl(
44 kMaxJobs, kMaxRetryAttempts, NULL); 51 HostCache::CreateDefaultCache(),
52 DefaultLimits(),
53 DefaultParams(resolver_proc),
54 NULL);
55 }
56
57 // This HostResolverImpl will only allow 1 outstanding resolve at a time.
58 HostResolverImpl* CreateSerialHostResolverImpl(
59 HostResolverProc* resolver_proc) {
60 HostResolverImpl::ProcTaskParams params = DefaultParams(resolver_proc);
61 params.max_retry_attempts = 0u;
62
63 PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1);
64
65 return new HostResolverImpl(HostCache::CreateDefaultCache(),
66 limits,
67 params,
68 NULL);
45 } 69 }
46 70
47 // Helper to create a HostResolver::RequestInfo. 71 // Helper to create a HostResolver::RequestInfo.
48 HostResolver::RequestInfo CreateResolverRequest( 72 HostResolver::RequestInfo CreateResolverRequest(
49 const std::string& hostname, 73 const std::string& hostname,
50 RequestPriority priority) { 74 RequestPriority priority) {
51 HostResolver::RequestInfo info(HostPortPair(hostname, 80)); 75 HostResolver::RequestInfo info(HostPortPair(hostname, 80));
52 info.set_priority(priority); 76 info.set_priority(priority);
53 return info; 77 return info;
54 } 78 }
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 addrlist, os_error); 499 addrlist, os_error);
476 } 500 }
477 501
478 private: 502 private:
479 virtual ~WaitingHostResolverProc() {} 503 virtual ~WaitingHostResolverProc() {}
480 504
481 base::WaitableEvent is_waiting_; 505 base::WaitableEvent is_waiting_;
482 base::WaitableEvent is_signaled_; 506 base::WaitableEvent is_signaled_;
483 }; 507 };
484 508
485 TEST_F(HostResolverImplTest, CanceledAsynchronousLookup) { 509 TEST_F(HostResolverImplTest, AbortedAsynchronousLookup) {
486 scoped_refptr<WaitingHostResolverProc> resolver_proc( 510 scoped_refptr<WaitingHostResolverProc> resolver_proc(
487 new WaitingHostResolverProc(NULL)); 511 new WaitingHostResolverProc(NULL));
488 512
489 CapturingNetLog net_log(CapturingNetLog::kUnbounded); 513 CapturingNetLog net_log(CapturingNetLog::kUnbounded);
490 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); 514 CapturingBoundNetLog log(CapturingNetLog::kUnbounded);
491 { 515 {
516 // This resolver will be destroyed while a lookup is running on WorkerPool.
492 scoped_ptr<HostResolver> host_resolver( 517 scoped_ptr<HostResolver> host_resolver(
493 new HostResolverImpl(resolver_proc, 518 new HostResolverImpl(HostCache::CreateDefaultCache(),
494 HostCache::CreateDefaultCache(), 519 DefaultLimits(),
495 kMaxJobs, 520 DefaultParams(resolver_proc),
496 kMaxRetryAttempts,
497 &net_log)); 521 &net_log));
498 AddressList addrlist; 522 AddressList addrlist;
499 const int kPortnum = 80; 523 const int kPortnum = 80;
500 524
501 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum)); 525 HostResolver::RequestInfo info(HostPortPair("just.testing", kPortnum));
502 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL, 526 int err = host_resolver->Resolve(info, &addrlist, callback_, NULL,
503 log.bound()); 527 log.bound());
504 EXPECT_EQ(ERR_IO_PENDING, err); 528 EXPECT_EQ(ERR_IO_PENDING, err);
505 529
506 resolver_proc->Wait(); 530 resolver_proc->Wait();
(...skipping 12 matching lines...) Expand all
519 543
520 CapturingNetLog::EntryList net_log_entries; 544 CapturingNetLog::EntryList net_log_entries;
521 net_log.GetEntries(&net_log_entries); 545 net_log.GetEntries(&net_log_entries);
522 546
523 int pos = ExpectLogContainsSomewhereAfter(net_log_entries, 0, 547 int pos = ExpectLogContainsSomewhereAfter(net_log_entries, 0,
524 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, 548 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST,
525 NetLog::PHASE_BEGIN); 549 NetLog::PHASE_BEGIN);
526 pos = ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, 550 pos = ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1,
527 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB, 551 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB,
528 NetLog::PHASE_BEGIN); 552 NetLog::PHASE_BEGIN);
529 // Both Job and Request need to be cancelled. 553 pos = ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1,
554 NetLog::TYPE_HOST_RESOLVER_IMPL_PROC_TASK,
555 NetLog::PHASE_BEGIN);
556 // Both Request and ProcTask need to be cancelled. (The Job is "aborted".)
530 pos = ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, 557 pos = ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1,
531 NetLog::TYPE_CANCELLED, 558 NetLog::TYPE_CANCELLED,
532 NetLog::PHASE_NONE); 559 NetLog::PHASE_NONE);
533 // Don't care about order in which they end, or when the other one is 560 // Don't care about order in which Request, Job and ProcTask end, or when the
534 // cancelled. 561 // other one is cancelled.
535 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, 562 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1,
536 NetLog::TYPE_CANCELLED, 563 NetLog::TYPE_CANCELLED,
537 NetLog::PHASE_NONE); 564 NetLog::PHASE_NONE);
538 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, 565 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1,
539 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, 566 NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST,
540 NetLog::PHASE_END); 567 NetLog::PHASE_END);
541 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1, 568 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1,
569 NetLog::TYPE_HOST_RESOLVER_IMPL_PROC_TASK,
570 NetLog::PHASE_END);
571 ExpectLogContainsSomewhereAfter(net_log_entries, pos + 1,
542 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB, 572 NetLog::TYPE_HOST_RESOLVER_IMPL_JOB,
543 NetLog::PHASE_END); 573 NetLog::PHASE_END);
544 574
545 EXPECT_FALSE(callback_called_); 575 EXPECT_FALSE(callback_called_);
546 } 576 }
547 577
548 TEST_F(HostResolverImplTest, NumericIPv4Address) { 578 TEST_F(HostResolverImplTest, NumericIPv4Address) {
549 // Stevens says dotted quads with AI_UNSPEC resolve to a single sockaddr_in. 579 // Stevens says dotted quads with AI_UNSPEC resolve to a single sockaddr_in.
550 580
551 scoped_refptr<RuleBasedHostResolverProc> resolver_proc( 581 scoped_refptr<RuleBasedHostResolverProc> resolver_proc(
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 }; 965 };
936 966
937 TEST_F(HostResolverImplTest, StartWithinCallback) { 967 TEST_F(HostResolverImplTest, StartWithinCallback) {
938 // Use a capturing resolver_proc, since the verifier needs to know what calls 968 // Use a capturing resolver_proc, since the verifier needs to know what calls
939 // reached Resolver(). Also, the capturing resolver_proc is initially 969 // reached Resolver(). Also, the capturing resolver_proc is initially
940 // blocked. 970 // blocked.
941 scoped_refptr<CapturingHostResolverProc> resolver_proc( 971 scoped_refptr<CapturingHostResolverProc> resolver_proc(
942 new CapturingHostResolverProc(NULL)); 972 new CapturingHostResolverProc(NULL));
943 973
944 // Turn off caching for this host resolver. 974 // Turn off caching for this host resolver.
945 scoped_ptr<HostResolver> host_resolver( 975 scoped_ptr<HostResolver> host_resolver(new HostResolverImpl(
946 new HostResolverImpl(resolver_proc, NULL, kMaxJobs, kMaxRetryAttempts, 976 NULL, DefaultLimits(), DefaultParams(resolver_proc), NULL));
947 NULL));
948 977
949 // The class will receive callbacks for when each resolve completes. It 978 // The class will receive callbacks for when each resolve completes. It
950 // checks that the right things happened. 979 // checks that the right things happened.
951 StartWithinCallbackVerifier verifier; 980 StartWithinCallbackVerifier verifier;
952 981
953 // Start 4 requests, duplicating hosts "a". Since the resolver_proc is 982 // Start 4 requests, duplicating hosts "a". Since the resolver_proc is
954 // blocked, these should all pile up until we signal it. 983 // blocked, these should all pile up until we signal it.
955 984
956 ResolveRequest req1(host_resolver.get(), "a", 80, &verifier); 985 ResolveRequest req1(host_resolver.get(), "a", 80, &verifier);
957 ResolveRequest req2(host_resolver.get(), "a", 81, &verifier); 986 ResolveRequest req2(host_resolver.get(), "a", 81, &verifier);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1017 // Start a request. 1046 // Start a request.
1018 ResolveRequest req1(host_resolver.get(), "a", 80, &verifier); 1047 ResolveRequest req1(host_resolver.get(), "a", 80, &verifier);
1019 1048
1020 // |verifier| will send quit message once all the requests have finished. 1049 // |verifier| will send quit message once all the requests have finished.
1021 MessageLoop::current()->Run(); 1050 MessageLoop::current()->Run();
1022 } 1051 }
1023 1052
1024 // Test that IP address changes flush the cache. 1053 // Test that IP address changes flush the cache.
1025 TEST_F(HostResolverImplTest, FlushCacheOnIPAddressChange) { 1054 TEST_F(HostResolverImplTest, FlushCacheOnIPAddressChange) {
1026 scoped_ptr<HostResolver> host_resolver( 1055 scoped_ptr<HostResolver> host_resolver(
1027 new HostResolverImpl(NULL, HostCache::CreateDefaultCache(), kMaxJobs, 1056 CreateHostResolverImpl(NULL));
1028 kMaxRetryAttempts, NULL));
1029 1057
1030 AddressList addrlist; 1058 AddressList addrlist;
1031 1059
1032 // Resolve "host1". 1060 // Resolve "host1". Assume that ScopedDefaultHostResolverProc resolves all.
1033 HostResolver::RequestInfo info1(HostPortPair("host1", 70)); 1061 HostResolver::RequestInfo info1(HostPortPair("host1", 70));
1034 TestCompletionCallback callback; 1062 TestCompletionCallback callback;
1035 int rv = host_resolver->Resolve(info1, &addrlist, callback.callback(), NULL, 1063 int rv = host_resolver->Resolve(info1, &addrlist, callback.callback(), NULL,
1036 BoundNetLog()); 1064 BoundNetLog());
1037 EXPECT_EQ(ERR_IO_PENDING, rv); 1065 EXPECT_EQ(ERR_IO_PENDING, rv);
1038 EXPECT_EQ(OK, callback.WaitForResult()); 1066 EXPECT_EQ(OK, callback.WaitForResult());
1039 1067
1040 // Resolve "host1" again -- this time it will be served from cache, but it 1068 // Resolve "host1" again -- this time it will be served from cache, but it
1041 // should still notify of completion. 1069 // should still notify of completion.
1042 rv = host_resolver->Resolve(info1, &addrlist, callback.callback(), NULL, 1070 rv = host_resolver->Resolve(info1, &addrlist, callback.callback(), NULL,
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1076 resolver_proc->Signal(); 1104 resolver_proc->Signal();
1077 1105
1078 EXPECT_EQ(ERR_ABORTED, callback.WaitForResult()); 1106 EXPECT_EQ(ERR_ABORTED, callback.WaitForResult());
1079 EXPECT_EQ(0u, host_resolver->GetHostCache()->size()); 1107 EXPECT_EQ(0u, host_resolver->GetHostCache()->size());
1080 } 1108 }
1081 1109
1082 // Obey pool constraints after IP address has changed. 1110 // Obey pool constraints after IP address has changed.
1083 TEST_F(HostResolverImplTest, ObeyPoolConstraintsAfterIPAddressChange) { 1111 TEST_F(HostResolverImplTest, ObeyPoolConstraintsAfterIPAddressChange) {
1084 scoped_refptr<WaitingHostResolverProc> resolver_proc( 1112 scoped_refptr<WaitingHostResolverProc> resolver_proc(
1085 new WaitingHostResolverProc(CreateCatchAllHostResolverProc())); 1113 new WaitingHostResolverProc(CreateCatchAllHostResolverProc()));
1114
1086 scoped_ptr<HostResolverImpl> host_resolver( 1115 scoped_ptr<HostResolverImpl> host_resolver(
1087 new HostResolverImpl(resolver_proc, HostCache::CreateDefaultCache(), 1116 CreateSerialHostResolverImpl(resolver_proc));
1088 kMaxJobs, kMaxRetryAttempts, NULL));
1089
1090 const size_t kMaxOutstandingJobs = 1u;
1091 const size_t kMaxPendingRequests = 1000000u; // not relevant.
1092 host_resolver->SetPoolConstraints(HostResolverImpl::POOL_NORMAL,
1093 kMaxOutstandingJobs,
1094 kMaxPendingRequests);
1095 1117
1096 // Resolve "host1". 1118 // Resolve "host1".
1097 HostResolver::RequestInfo info(HostPortPair("host1", 70)); 1119 HostResolver::RequestInfo info(HostPortPair("host1", 70));
1098 TestCompletionCallback callback; 1120 TestCompletionCallback callback;
1099 AddressList addrlist; 1121 AddressList addrlist;
1100 int rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, 1122 int rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL,
1101 BoundNetLog()); 1123 BoundNetLog());
1102 EXPECT_EQ(ERR_IO_PENDING, rv); 1124 EXPECT_EQ(ERR_IO_PENDING, rv);
1103 1125
1104 // Must wait before signal to ensure that the two signals don't get merged 1126 // Must wait before signal to ensure that the two signals don't get merged
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1172 resolver_proc->Signal(); // release the thread from WorkerPool for cleanup 1194 resolver_proc->Signal(); // release the thread from WorkerPool for cleanup
1173 EXPECT_EQ(OK, callback.WaitForNestedResult()); 1195 EXPECT_EQ(OK, callback.WaitForNestedResult());
1174 } 1196 }
1175 1197
1176 // Tests that when the maximum threads is set to 1, requests are dequeued 1198 // Tests that when the maximum threads is set to 1, requests are dequeued
1177 // in order of priority. 1199 // in order of priority.
1178 TEST_F(HostResolverImplTest, HigherPriorityRequestsStartedFirst) { 1200 TEST_F(HostResolverImplTest, HigherPriorityRequestsStartedFirst) {
1179 scoped_refptr<CapturingHostResolverProc> resolver_proc( 1201 scoped_refptr<CapturingHostResolverProc> resolver_proc(
1180 new CapturingHostResolverProc(NULL)); 1202 new CapturingHostResolverProc(NULL));
1181 1203
1182 // This HostResolverImpl will only allow 1 outstanding resolve at a time. 1204 scoped_ptr<HostResolverImpl> host_resolver(
1183 size_t kMaxJobs = 1u; 1205 CreateSerialHostResolverImpl(resolver_proc));
1184 const size_t kRetryAttempts = 0u;
1185 scoped_ptr<HostResolver> host_resolver(
1186 new HostResolverImpl(resolver_proc, HostCache::CreateDefaultCache(),
1187 kMaxJobs, kRetryAttempts, NULL));
1188 1206
1189 // Note that at this point the CapturingHostResolverProc is blocked, so any 1207 // Note that at this point the CapturingHostResolverProc is blocked, so any
1190 // requests we make will not complete. 1208 // requests we make will not complete.
1191 1209
1192 HostResolver::RequestInfo req[] = { 1210 HostResolver::RequestInfo req[] = {
1193 CreateResolverRequest("req0", LOW), 1211 CreateResolverRequest("req0", LOW),
1194 CreateResolverRequest("req1", MEDIUM), 1212 CreateResolverRequest("req1", MEDIUM),
1195 CreateResolverRequest("req2", MEDIUM), 1213 CreateResolverRequest("req2", MEDIUM),
1196 CreateResolverRequest("req3", LOW), 1214 CreateResolverRequest("req3", LOW),
1197 CreateResolverRequest("req4", HIGHEST), 1215 CreateResolverRequest("req4", HIGHEST),
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1234 EXPECT_EQ("req2", capture_list[4].hostname); 1252 EXPECT_EQ("req2", capture_list[4].hostname);
1235 EXPECT_EQ("req3", capture_list[5].hostname); 1253 EXPECT_EQ("req3", capture_list[5].hostname);
1236 EXPECT_EQ("req6", capture_list[6].hostname); 1254 EXPECT_EQ("req6", capture_list[6].hostname);
1237 } 1255 }
1238 1256
1239 // Try cancelling a request which has not been attached to a job yet. 1257 // Try cancelling a request which has not been attached to a job yet.
1240 TEST_F(HostResolverImplTest, CancelPendingRequest) { 1258 TEST_F(HostResolverImplTest, CancelPendingRequest) {
1241 scoped_refptr<CapturingHostResolverProc> resolver_proc( 1259 scoped_refptr<CapturingHostResolverProc> resolver_proc(
1242 new CapturingHostResolverProc(NULL)); 1260 new CapturingHostResolverProc(NULL));
1243 1261
1244 // This HostResolverImpl will only allow 1 outstanding resolve at a time. 1262 scoped_ptr<HostResolverImpl> host_resolver(
1245 const size_t kMaxJobs = 1u; 1263 CreateSerialHostResolverImpl(resolver_proc));
1246 const size_t kRetryAttempts = 0u;
1247 scoped_ptr<HostResolver> host_resolver(
1248 new HostResolverImpl(resolver_proc, HostCache::CreateDefaultCache(),
1249 kMaxJobs, kRetryAttempts, NULL));
1250 1264
1251 // Note that at this point the CapturingHostResolverProc is blocked, so any 1265 // Note that at this point the CapturingHostResolverProc is blocked, so any
1252 // requests we make will not complete. 1266 // requests we make will not complete.
1253 1267
1254 HostResolver::RequestInfo req[] = { 1268 HostResolver::RequestInfo req[] = {
1255 CreateResolverRequest("req0", LOWEST), 1269 CreateResolverRequest("req0", LOWEST),
1256 CreateResolverRequest("req1", HIGHEST), // Will cancel. 1270 CreateResolverRequest("req1", HIGHEST), // Will cancel.
1257 CreateResolverRequest("req2", MEDIUM), 1271 CreateResolverRequest("req2", MEDIUM),
1258 CreateResolverRequest("req3", LOW), 1272 CreateResolverRequest("req3", LOW),
1259 CreateResolverRequest("req4", HIGHEST), // Will cancel. 1273 CreateResolverRequest("req4", HIGHEST), // Will cancel.
1260 CreateResolverRequest("req5", LOWEST), // Will cancel. 1274 CreateResolverRequest("req5", LOWEST), // Will cancel.
1261 CreateResolverRequest("req6", MEDIUM), 1275 CreateResolverRequest("req6", MEDIUM),
1262 }; 1276 };
1263 1277
1264 TestCompletionCallback callback[arraysize(req)]; 1278 TestCompletionCallback callback[arraysize(req)];
1265 AddressList addrlist[arraysize(req)]; 1279 AddressList addrlist[arraysize(req)];
1266 HostResolver::RequestHandle handle[arraysize(req)]; 1280 HostResolver::RequestHandle handle[arraysize(req)];
1267 1281
1268 // Start all of the requests. 1282 // Start all of the requests.
1269 for (size_t i = 0; i < arraysize(req); ++i) { 1283 for (size_t i = 0; i < arraysize(req); ++i) {
1270 int rv = host_resolver->Resolve(req[i], &addrlist[i], 1284 int rv = host_resolver->Resolve(req[i], &addrlist[i],
(...skipping 28 matching lines...) Expand all
1299 EXPECT_EQ("req2", capture_list[1].hostname); 1313 EXPECT_EQ("req2", capture_list[1].hostname);
1300 EXPECT_EQ("req6", capture_list[2].hostname); 1314 EXPECT_EQ("req6", capture_list[2].hostname);
1301 EXPECT_EQ("req3", capture_list[3].hostname); 1315 EXPECT_EQ("req3", capture_list[3].hostname);
1302 } 1316 }
1303 1317
1304 // Test that when too many requests are enqueued, old ones start to be aborted. 1318 // Test that when too many requests are enqueued, old ones start to be aborted.
1305 TEST_F(HostResolverImplTest, QueueOverflow) { 1319 TEST_F(HostResolverImplTest, QueueOverflow) {
1306 scoped_refptr<CapturingHostResolverProc> resolver_proc( 1320 scoped_refptr<CapturingHostResolverProc> resolver_proc(
1307 new CapturingHostResolverProc(NULL)); 1321 new CapturingHostResolverProc(NULL));
1308 1322
1309 // This HostResolverImpl will only allow 1 outstanding resolve at a time. 1323 scoped_ptr<HostResolverImpl> host_resolver(
1310 const size_t kMaxOutstandingJobs = 1u; 1324 CreateSerialHostResolverImpl(resolver_proc));
1311 const size_t kRetryAttempts = 0u;
1312 scoped_ptr<HostResolverImpl> host_resolver(new HostResolverImpl(
1313 resolver_proc, HostCache::CreateDefaultCache(), kMaxOutstandingJobs,
1314 kRetryAttempts, NULL));
1315 1325
1316 // Only allow up to 3 requests to be enqueued at a time. 1326 // Allow only 3 queued jobs.
1317 const size_t kMaxPendingRequests = 3u; 1327 const size_t kMaxPendingJobs = 3u;
1318 host_resolver->SetPoolConstraints(HostResolverImpl::POOL_NORMAL, 1328 host_resolver->SetMaxQueuedJobs(kMaxPendingJobs);
1319 kMaxOutstandingJobs,
1320 kMaxPendingRequests);
1321 1329
1322 // Note that at this point the CapturingHostResolverProc is blocked, so any 1330 // Note that at this point the CapturingHostResolverProc is blocked, so any
1323 // requests we make will not complete. 1331 // requests we make will not complete.
1324 1332
1325 HostResolver::RequestInfo req[] = { 1333 HostResolver::RequestInfo req[] = {
1326 CreateResolverRequest("req0", LOWEST), 1334 CreateResolverRequest("req0", LOWEST),
1327 CreateResolverRequest("req1", HIGHEST), 1335 CreateResolverRequest("req1", HIGHEST),
1328 CreateResolverRequest("req2", MEDIUM), 1336 CreateResolverRequest("req2", MEDIUM),
1329 CreateResolverRequest("req3", MEDIUM), 1337 CreateResolverRequest("req3", MEDIUM),
1330 1338
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1381 EXPECT_EQ("req7", capture_list[3].hostname); 1389 EXPECT_EQ("req7", capture_list[3].hostname);
1382 } 1390 }
1383 1391
1384 // Tests that after changing the default AddressFamily to IPV4, requests 1392 // Tests that after changing the default AddressFamily to IPV4, requests
1385 // with UNSPECIFIED address family map to IPV4. 1393 // with UNSPECIFIED address family map to IPV4.
1386 TEST_F(HostResolverImplTest, SetDefaultAddressFamily_IPv4) { 1394 TEST_F(HostResolverImplTest, SetDefaultAddressFamily_IPv4) {
1387 scoped_refptr<CapturingHostResolverProc> resolver_proc( 1395 scoped_refptr<CapturingHostResolverProc> resolver_proc(
1388 new CapturingHostResolverProc(new EchoingHostResolverProc)); 1396 new CapturingHostResolverProc(new EchoingHostResolverProc));
1389 1397
1390 // This HostResolverImpl will only allow 1 outstanding resolve at a time. 1398 // This HostResolverImpl will only allow 1 outstanding resolve at a time.
1391 const size_t kMaxOutstandingJobs = 1u; 1399 scoped_ptr<HostResolverImpl> host_resolver(
1392 const size_t kRetryAttempts = 0u; 1400 CreateSerialHostResolverImpl(resolver_proc));
1393 scoped_ptr<HostResolverImpl> host_resolver(new HostResolverImpl(
1394 resolver_proc, HostCache::CreateDefaultCache(), kMaxOutstandingJobs,
1395 kRetryAttempts, NULL));
1396 1401
1397 host_resolver->SetDefaultAddressFamily(ADDRESS_FAMILY_IPV4); 1402 host_resolver->SetDefaultAddressFamily(ADDRESS_FAMILY_IPV4);
1398 1403
1399 // Note that at this point the CapturingHostResolverProc is blocked, so any 1404 // Note that at this point the CapturingHostResolverProc is blocked, so any
1400 // requests we make will not complete. 1405 // requests we make will not complete.
1401 1406
1402 HostResolver::RequestInfo req[] = { 1407 HostResolver::RequestInfo req[] = {
1403 CreateResolverRequestForAddressFamily("h1", MEDIUM, 1408 CreateResolverRequestForAddressFamily("h1", MEDIUM,
1404 ADDRESS_FAMILY_UNSPECIFIED), 1409 ADDRESS_FAMILY_UNSPECIFIED),
1405 CreateResolverRequestForAddressFamily("h1", MEDIUM, ADDRESS_FAMILY_IPV4), 1410 CreateResolverRequestForAddressFamily("h1", MEDIUM, ADDRESS_FAMILY_IPV4),
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1451 EXPECT_EQ("192.2.104.2", NetAddressToString(addrlist[2].head())); 1456 EXPECT_EQ("192.2.104.2", NetAddressToString(addrlist[2].head()));
1452 } 1457 }
1453 1458
1454 // This is the exact same test as SetDefaultAddressFamily_IPv4, except the order 1459 // This is the exact same test as SetDefaultAddressFamily_IPv4, except the order
1455 // of requests 0 and 1 is flipped, and the default is set to IPv6 in place of 1460 // of requests 0 and 1 is flipped, and the default is set to IPv6 in place of
1456 // IPv4. 1461 // IPv4.
1457 TEST_F(HostResolverImplTest, SetDefaultAddressFamily_IPv6) { 1462 TEST_F(HostResolverImplTest, SetDefaultAddressFamily_IPv6) {
1458 scoped_refptr<CapturingHostResolverProc> resolver_proc( 1463 scoped_refptr<CapturingHostResolverProc> resolver_proc(
1459 new CapturingHostResolverProc(new EchoingHostResolverProc)); 1464 new CapturingHostResolverProc(new EchoingHostResolverProc));
1460 1465
1461 // This HostResolverImpl will only allow 1 outstanding resolve at a time. 1466 scoped_ptr<HostResolverImpl> host_resolver(
1462 const size_t kMaxOutstandingJobs = 1u; 1467 CreateSerialHostResolverImpl(resolver_proc));
1463 const size_t kRetryAttempts = 0u;
1464 scoped_ptr<HostResolverImpl> host_resolver(new HostResolverImpl(
1465 resolver_proc, HostCache::CreateDefaultCache(), kMaxOutstandingJobs,
1466 kRetryAttempts, NULL));
1467 1468
1468 host_resolver->SetDefaultAddressFamily(ADDRESS_FAMILY_IPV6); 1469 host_resolver->SetDefaultAddressFamily(ADDRESS_FAMILY_IPV6);
1469 1470
1470 // Note that at this point the CapturingHostResolverProc is blocked, so any 1471 // Note that at this point the CapturingHostResolverProc is blocked, so any
1471 // requests we make will not complete. 1472 // requests we make will not complete.
1472 1473
1473 HostResolver::RequestInfo req[] = { 1474 HostResolver::RequestInfo req[] = {
1474 CreateResolverRequestForAddressFamily("h1", MEDIUM, ADDRESS_FAMILY_IPV6), 1475 CreateResolverRequestForAddressFamily("h1", MEDIUM, ADDRESS_FAMILY_IPV6),
1475 CreateResolverRequestForAddressFamily("h1", MEDIUM, 1476 CreateResolverRequestForAddressFamily("h1", MEDIUM,
1476 ADDRESS_FAMILY_UNSPECIFIED), 1477 ADDRESS_FAMILY_UNSPECIFIED),
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1566 // Total number of attempts would be 3 and we want the 3rd attempt to resolve 1567 // Total number of attempts would be 3 and we want the 3rd attempt to resolve
1567 // the host. First and second attempt will be forced to sleep until they get 1568 // the host. First and second attempt will be forced to sleep until they get
1568 // word that a resolution has completed. The 3rd resolution attempt will try 1569 // word that a resolution has completed. The 3rd resolution attempt will try
1569 // to get done ASAP, and won't sleep.. 1570 // to get done ASAP, and won't sleep..
1570 int kAttemptNumberToResolve = 3; 1571 int kAttemptNumberToResolve = 3;
1571 int kTotalAttempts = 3; 1572 int kTotalAttempts = 3;
1572 1573
1573 scoped_refptr<LookupAttemptHostResolverProc> resolver_proc( 1574 scoped_refptr<LookupAttemptHostResolverProc> resolver_proc(
1574 new LookupAttemptHostResolverProc( 1575 new LookupAttemptHostResolverProc(
1575 NULL, kAttemptNumberToResolve, kTotalAttempts)); 1576 NULL, kAttemptNumberToResolve, kTotalAttempts));
1576 HostCache* cache = HostCache::CreateDefaultCache(); 1577
1577 scoped_ptr<HostResolverImpl> host_resolver( 1578 HostResolverImpl::ProcTaskParams params = DefaultParams(resolver_proc);
1578 new HostResolverImpl(resolver_proc, cache, kMaxJobs, kMaxRetryAttempts,
1579 NULL));
1580 1579
1581 // Specify smaller interval for unresponsive_delay_ for HostResolverImpl so 1580 // Specify smaller interval for unresponsive_delay_ for HostResolverImpl so
1582 // that unit test runs faster. For example, this test finishes in 1.5 secs 1581 // that unit test runs faster. For example, this test finishes in 1.5 secs
1583 // (500ms * 3). 1582 // (500ms * 3).
1584 TimeDelta kUnresponsiveTime = TimeDelta::FromMilliseconds(500); 1583 params.unresponsive_delay = TimeDelta::FromMilliseconds(500);
1585 host_resolver->set_unresponsive_delay(kUnresponsiveTime); 1584
1585 scoped_ptr<HostResolverImpl> host_resolver(
1586 new HostResolverImpl(HostCache::CreateDefaultCache(),
1587 DefaultLimits(),
1588 params,
1589 NULL));
1586 1590
1587 // Resolve "host1". 1591 // Resolve "host1".
1588 HostResolver::RequestInfo info(HostPortPair("host1", 70)); 1592 HostResolver::RequestInfo info(HostPortPair("host1", 70));
1589 TestCompletionCallback callback; 1593 TestCompletionCallback callback;
1590 AddressList addrlist; 1594 AddressList addrlist;
1591 int rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL, 1595 int rv = host_resolver->Resolve(info, &addrlist, callback.callback(), NULL,
1592 BoundNetLog()); 1596 BoundNetLog());
1593 EXPECT_EQ(ERR_IO_PENDING, rv); 1597 EXPECT_EQ(ERR_IO_PENDING, rv);
1594 1598
1595 // Resolve returns -4 to indicate that 3rd attempt has resolved the host. 1599 // Resolve returns -4 to indicate that 3rd attempt has resolved the host.
1596 EXPECT_EQ(-4, callback.WaitForResult()); 1600 EXPECT_EQ(-4, callback.WaitForResult());
1597 1601
1598 resolver_proc->WaitForAllAttemptsToFinish(TimeDelta::FromMilliseconds(60000)); 1602 resolver_proc->WaitForAllAttemptsToFinish(TimeDelta::FromMilliseconds(60000));
1599 MessageLoop::current()->RunAllPending(); 1603 MessageLoop::current()->RunAllPending();
1600 1604
1601 EXPECT_EQ(resolver_proc->total_attempts_resolved(), kTotalAttempts); 1605 EXPECT_EQ(resolver_proc->total_attempts_resolved(), kTotalAttempts);
1602 EXPECT_EQ(resolver_proc->resolved_attempt_number(), kAttemptNumberToResolve); 1606 EXPECT_EQ(resolver_proc->resolved_attempt_number(), kAttemptNumberToResolve);
1603 } 1607 }
1604 1608
1605 // TODO(cbentzel): Test a mix of requests with different HostResolverFlags. 1609 // TODO(cbentzel): Test a mix of requests with different HostResolverFlags.
1606 1610
1607 } // namespace net 1611 } // namespace net
OLDNEW
« no previous file with comments | « net/base/host_resolver_impl.cc ('k') | net/base/net_log_event_type_list.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698