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/socket/client_socket_pool_base.h" | 5 #include "net/socket/client_socket_pool_base.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 | 197 |
198 DISALLOW_COPY_AND_ASSIGN(MockClientSocket); | 198 DISALLOW_COPY_AND_ASSIGN(MockClientSocket); |
199 }; | 199 }; |
200 | 200 |
201 class TestConnectJob; | 201 class TestConnectJob; |
202 | 202 |
203 class MockClientSocketFactory : public ClientSocketFactory { | 203 class MockClientSocketFactory : public ClientSocketFactory { |
204 public: | 204 public: |
205 MockClientSocketFactory() : allocation_count_(0) {} | 205 MockClientSocketFactory() : allocation_count_(0) {} |
206 | 206 |
207 scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket( | 207 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket( |
208 DatagramSocket::BindType bind_type, | 208 DatagramSocket::BindType bind_type, |
209 const RandIntCallback& rand_int_cb, | 209 const RandIntCallback& rand_int_cb, |
210 NetLog* net_log, | 210 NetLog* net_log, |
211 const NetLog::Source& source) override { | 211 const NetLog::Source& source) override { |
212 NOTREACHED(); | 212 NOTREACHED(); |
213 return scoped_ptr<DatagramClientSocket>(); | 213 return std::unique_ptr<DatagramClientSocket>(); |
214 } | 214 } |
215 | 215 |
216 scoped_ptr<StreamSocket> CreateTransportClientSocket( | 216 std::unique_ptr<StreamSocket> CreateTransportClientSocket( |
217 const AddressList& addresses, | 217 const AddressList& addresses, |
218 scoped_ptr<SocketPerformanceWatcher> /* socket_performance_watcher */, | 218 std::unique_ptr< |
| 219 SocketPerformanceWatcher> /* socket_performance_watcher */, |
219 NetLog* /* net_log */, | 220 NetLog* /* net_log */, |
220 const NetLog::Source& /*source*/) override { | 221 const NetLog::Source& /*source*/) override { |
221 allocation_count_++; | 222 allocation_count_++; |
222 return scoped_ptr<StreamSocket>(); | 223 return std::unique_ptr<StreamSocket>(); |
223 } | 224 } |
224 | 225 |
225 scoped_ptr<SSLClientSocket> CreateSSLClientSocket( | 226 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket( |
226 scoped_ptr<ClientSocketHandle> transport_socket, | 227 std::unique_ptr<ClientSocketHandle> transport_socket, |
227 const HostPortPair& host_and_port, | 228 const HostPortPair& host_and_port, |
228 const SSLConfig& ssl_config, | 229 const SSLConfig& ssl_config, |
229 const SSLClientSocketContext& context) override { | 230 const SSLClientSocketContext& context) override { |
230 NOTIMPLEMENTED(); | 231 NOTIMPLEMENTED(); |
231 return scoped_ptr<SSLClientSocket>(); | 232 return std::unique_ptr<SSLClientSocket>(); |
232 } | 233 } |
233 | 234 |
234 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); } | 235 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); } |
235 | 236 |
236 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); } | 237 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); } |
237 | 238 |
238 void SignalJobs(); | 239 void SignalJobs(); |
239 | 240 |
240 void SignalJob(size_t job); | 241 void SignalJob(size_t job); |
241 | 242 |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 } | 307 } |
307 } | 308 } |
308 | 309 |
309 private: | 310 private: |
310 // From ConnectJob: | 311 // From ConnectJob: |
311 | 312 |
312 int ConnectInternal() override { | 313 int ConnectInternal() override { |
313 AddressList ignored; | 314 AddressList ignored; |
314 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL, | 315 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL, |
315 NetLog::Source()); | 316 NetLog::Source()); |
316 SetSocket( | 317 SetSocket(std::unique_ptr<StreamSocket>( |
317 scoped_ptr<StreamSocket>(new MockClientSocket(net_log().net_log()))); | 318 new MockClientSocket(net_log().net_log()))); |
318 switch (job_type_) { | 319 switch (job_type_) { |
319 case kMockJob: | 320 case kMockJob: |
320 return DoConnect(true /* successful */, false /* sync */, | 321 return DoConnect(true /* successful */, false /* sync */, |
321 false /* recoverable */); | 322 false /* recoverable */); |
322 case kMockFailingJob: | 323 case kMockFailingJob: |
323 return DoConnect(false /* error */, false /* sync */, | 324 return DoConnect(false /* error */, false /* sync */, |
324 false /* recoverable */); | 325 false /* recoverable */); |
325 case kMockPendingJob: | 326 case kMockPendingJob: |
326 set_load_state(LOAD_STATE_CONNECTING); | 327 set_load_state(LOAD_STATE_CONNECTING); |
327 | 328 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 base::TimeDelta::FromMilliseconds(2)); | 385 base::TimeDelta::FromMilliseconds(2)); |
385 return ERR_IO_PENDING; | 386 return ERR_IO_PENDING; |
386 case kMockUnreadDataJob: { | 387 case kMockUnreadDataJob: { |
387 int ret = DoConnect(true /* successful */, false /* sync */, | 388 int ret = DoConnect(true /* successful */, false /* sync */, |
388 false /* recoverable */); | 389 false /* recoverable */); |
389 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true); | 390 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true); |
390 return ret; | 391 return ret; |
391 } | 392 } |
392 default: | 393 default: |
393 NOTREACHED(); | 394 NOTREACHED(); |
394 SetSocket(scoped_ptr<StreamSocket>()); | 395 SetSocket(std::unique_ptr<StreamSocket>()); |
395 return ERR_FAILED; | 396 return ERR_FAILED; |
396 } | 397 } |
397 } | 398 } |
398 | 399 |
399 int DoConnect(bool succeed, bool was_async, bool recoverable) { | 400 int DoConnect(bool succeed, bool was_async, bool recoverable) { |
400 int result = OK; | 401 int result = OK; |
401 if (succeed) { | 402 if (succeed) { |
402 socket()->Connect(CompletionCallback()); | 403 socket()->Connect(CompletionCallback()); |
403 } else if (recoverable) { | 404 } else if (recoverable) { |
404 result = ERR_PROXY_AUTH_REQUESTED; | 405 result = ERR_PROXY_AUTH_REQUESTED; |
405 } else { | 406 } else { |
406 result = ERR_CONNECTION_FAILED; | 407 result = ERR_CONNECTION_FAILED; |
407 SetSocket(scoped_ptr<StreamSocket>()); | 408 SetSocket(std::unique_ptr<StreamSocket>()); |
408 } | 409 } |
409 | 410 |
410 if (was_async) | 411 if (was_async) |
411 NotifyDelegateOfCompletion(result); | 412 NotifyDelegateOfCompletion(result); |
412 return result; | 413 return result; |
413 } | 414 } |
414 | 415 |
415 bool waiting_success_; | 416 bool waiting_success_; |
416 const JobType job_type_; | 417 const JobType job_type_; |
417 MockClientSocketFactory* const client_socket_factory_; | 418 MockClientSocketFactory* const client_socket_factory_; |
(...skipping 24 matching lines...) Expand all Loading... |
442 job_types_ = job_types; | 443 job_types_ = job_types; |
443 CHECK(!job_types_->empty()); | 444 CHECK(!job_types_->empty()); |
444 } | 445 } |
445 | 446 |
446 void set_timeout_duration(base::TimeDelta timeout_duration) { | 447 void set_timeout_duration(base::TimeDelta timeout_duration) { |
447 timeout_duration_ = timeout_duration; | 448 timeout_duration_ = timeout_duration; |
448 } | 449 } |
449 | 450 |
450 // ConnectJobFactory implementation. | 451 // ConnectJobFactory implementation. |
451 | 452 |
452 scoped_ptr<ConnectJob> NewConnectJob( | 453 std::unique_ptr<ConnectJob> NewConnectJob( |
453 const std::string& group_name, | 454 const std::string& group_name, |
454 const TestClientSocketPoolBase::Request& request, | 455 const TestClientSocketPoolBase::Request& request, |
455 ConnectJob::Delegate* delegate) const override { | 456 ConnectJob::Delegate* delegate) const override { |
456 EXPECT_TRUE(!job_types_ || !job_types_->empty()); | 457 EXPECT_TRUE(!job_types_ || !job_types_->empty()); |
457 TestConnectJob::JobType job_type = job_type_; | 458 TestConnectJob::JobType job_type = job_type_; |
458 if (job_types_ && !job_types_->empty()) { | 459 if (job_types_ && !job_types_->empty()) { |
459 job_type = job_types_->front(); | 460 job_type = job_types_->front(); |
460 job_types_->pop_front(); | 461 job_types_->pop_front(); |
461 } | 462 } |
462 return scoped_ptr<ConnectJob>(new TestConnectJob(job_type, | 463 return std::unique_ptr<ConnectJob>( |
463 group_name, | 464 new TestConnectJob(job_type, group_name, request, timeout_duration_, |
464 request, | 465 delegate, client_socket_factory_, net_log_)); |
465 timeout_duration_, | |
466 delegate, | |
467 client_socket_factory_, | |
468 net_log_)); | |
469 } | 466 } |
470 | 467 |
471 base::TimeDelta ConnectionTimeout() const override { | 468 base::TimeDelta ConnectionTimeout() const override { |
472 return timeout_duration_; | 469 return timeout_duration_; |
473 } | 470 } |
474 | 471 |
475 private: | 472 private: |
476 TestConnectJob::JobType job_type_; | 473 TestConnectJob::JobType job_type_; |
477 std::list<TestConnectJob::JobType>* job_types_; | 474 std::list<TestConnectJob::JobType>* job_types_; |
478 base::TimeDelta timeout_duration_; | 475 base::TimeDelta timeout_duration_; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 | 520 |
524 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log); | 521 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log); |
525 } | 522 } |
526 | 523 |
527 void CancelRequest(const std::string& group_name, | 524 void CancelRequest(const std::string& group_name, |
528 ClientSocketHandle* handle) override { | 525 ClientSocketHandle* handle) override { |
529 base_.CancelRequest(group_name, handle); | 526 base_.CancelRequest(group_name, handle); |
530 } | 527 } |
531 | 528 |
532 void ReleaseSocket(const std::string& group_name, | 529 void ReleaseSocket(const std::string& group_name, |
533 scoped_ptr<StreamSocket> socket, | 530 std::unique_ptr<StreamSocket> socket, |
534 int id) override { | 531 int id) override { |
535 base_.ReleaseSocket(group_name, std::move(socket), id); | 532 base_.ReleaseSocket(group_name, std::move(socket), id); |
536 } | 533 } |
537 | 534 |
538 void FlushWithError(int error) override { base_.FlushWithError(error); } | 535 void FlushWithError(int error) override { base_.FlushWithError(error); } |
539 | 536 |
540 bool IsStalled() const override { return base_.IsStalled(); } | 537 bool IsStalled() const override { return base_.IsStalled(); } |
541 | 538 |
542 void CloseIdleSockets() override { base_.CloseIdleSockets(); } | 539 void CloseIdleSockets() override { base_.CloseIdleSockets(); } |
543 | 540 |
544 int IdleSocketCount() const override { return base_.idle_socket_count(); } | 541 int IdleSocketCount() const override { return base_.idle_socket_count(); } |
545 | 542 |
546 int IdleSocketCountInGroup(const std::string& group_name) const override { | 543 int IdleSocketCountInGroup(const std::string& group_name) const override { |
547 return base_.IdleSocketCountInGroup(group_name); | 544 return base_.IdleSocketCountInGroup(group_name); |
548 } | 545 } |
549 | 546 |
550 LoadState GetLoadState(const std::string& group_name, | 547 LoadState GetLoadState(const std::string& group_name, |
551 const ClientSocketHandle* handle) const override { | 548 const ClientSocketHandle* handle) const override { |
552 return base_.GetLoadState(group_name, handle); | 549 return base_.GetLoadState(group_name, handle); |
553 } | 550 } |
554 | 551 |
555 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override { | 552 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override { |
556 base_.AddHigherLayeredPool(higher_pool); | 553 base_.AddHigherLayeredPool(higher_pool); |
557 } | 554 } |
558 | 555 |
559 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override { | 556 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override { |
560 base_.RemoveHigherLayeredPool(higher_pool); | 557 base_.RemoveHigherLayeredPool(higher_pool); |
561 } | 558 } |
562 | 559 |
563 scoped_ptr<base::DictionaryValue> GetInfoAsValue( | 560 std::unique_ptr<base::DictionaryValue> GetInfoAsValue( |
564 const std::string& name, | 561 const std::string& name, |
565 const std::string& type, | 562 const std::string& type, |
566 bool include_nested_pools) const override { | 563 bool include_nested_pools) const override { |
567 return base_.GetInfoAsValue(name, type); | 564 return base_.GetInfoAsValue(name, type); |
568 } | 565 } |
569 | 566 |
570 base::TimeDelta ConnectionTimeout() const override { | 567 base::TimeDelta ConnectionTimeout() const override { |
571 return base_.ConnectionTimeout(); | 568 return base_.ConnectionTimeout(); |
572 } | 569 } |
573 | 570 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
628 } | 625 } |
629 | 626 |
630 class TestConnectJobDelegate : public ConnectJob::Delegate { | 627 class TestConnectJobDelegate : public ConnectJob::Delegate { |
631 public: | 628 public: |
632 TestConnectJobDelegate() | 629 TestConnectJobDelegate() |
633 : have_result_(false), waiting_for_result_(false), result_(OK) {} | 630 : have_result_(false), waiting_for_result_(false), result_(OK) {} |
634 ~TestConnectJobDelegate() override {} | 631 ~TestConnectJobDelegate() override {} |
635 | 632 |
636 void OnConnectJobComplete(int result, ConnectJob* job) override { | 633 void OnConnectJobComplete(int result, ConnectJob* job) override { |
637 result_ = result; | 634 result_ = result; |
638 scoped_ptr<ConnectJob> owned_job(job); | 635 std::unique_ptr<ConnectJob> owned_job(job); |
639 scoped_ptr<StreamSocket> socket = owned_job->PassSocket(); | 636 std::unique_ptr<StreamSocket> socket = owned_job->PassSocket(); |
640 // socket.get() should be NULL iff result != OK | 637 // socket.get() should be NULL iff result != OK |
641 EXPECT_EQ(socket == NULL, result != OK); | 638 EXPECT_EQ(socket == NULL, result != OK); |
642 have_result_ = true; | 639 have_result_ = true; |
643 if (waiting_for_result_) | 640 if (waiting_for_result_) |
644 base::MessageLoop::current()->QuitWhenIdle(); | 641 base::MessageLoop::current()->QuitWhenIdle(); |
645 } | 642 } |
646 | 643 |
647 int WaitForResult() { | 644 int WaitForResult() { |
648 DCHECK(!waiting_for_result_); | 645 DCHECK(!waiting_for_result_); |
649 while (!have_result_) { | 646 while (!have_result_) { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
720 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) { | 717 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) { |
721 return test_base_.ReleaseOneConnection(keep_alive); | 718 return test_base_.ReleaseOneConnection(keep_alive); |
722 } | 719 } |
723 | 720 |
724 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) { | 721 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) { |
725 test_base_.ReleaseAllConnections(keep_alive); | 722 test_base_.ReleaseAllConnections(keep_alive); |
726 } | 723 } |
727 | 724 |
728 TestSocketRequest* request(int i) { return test_base_.request(i); } | 725 TestSocketRequest* request(int i) { return test_base_.request(i); } |
729 size_t requests_size() const { return test_base_.requests_size(); } | 726 size_t requests_size() const { return test_base_.requests_size(); } |
730 std::vector<scoped_ptr<TestSocketRequest>>* requests() { | 727 std::vector<std::unique_ptr<TestSocketRequest>>* requests() { |
731 return test_base_.requests(); | 728 return test_base_.requests(); |
732 } | 729 } |
733 size_t completion_count() const { return test_base_.completion_count(); } | 730 size_t completion_count() const { return test_base_.completion_count(); } |
734 | 731 |
735 TestNetLog net_log_; | 732 TestNetLog net_log_; |
736 bool connect_backup_jobs_enabled_; | 733 bool connect_backup_jobs_enabled_; |
737 bool cleanup_timer_enabled_; | 734 bool cleanup_timer_enabled_; |
738 MockClientSocketFactory client_socket_factory_; | 735 MockClientSocketFactory client_socket_factory_; |
739 TestConnectJobFactory* connect_job_factory_; | 736 TestConnectJobFactory* connect_job_factory_; |
740 scoped_refptr<TestSocketParams> params_; | 737 scoped_refptr<TestSocketParams> params_; |
741 scoped_ptr<TestClientSocketPool> pool_; | 738 std::unique_ptr<TestClientSocketPool> pool_; |
742 ClientSocketPoolTest test_base_; | 739 ClientSocketPoolTest test_base_; |
743 }; | 740 }; |
744 | 741 |
745 // Even though a timeout is specified, it doesn't time out on a synchronous | 742 // Even though a timeout is specified, it doesn't time out on a synchronous |
746 // completion. | 743 // completion. |
747 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) { | 744 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) { |
748 TestConnectJobDelegate delegate; | 745 TestConnectJobDelegate delegate; |
749 ClientSocketHandle ignored; | 746 ClientSocketHandle ignored; |
750 TestClientSocketPoolBase::Request request( | 747 TestClientSocketPoolBase::Request request( |
751 &ignored, CompletionCallback(), DEFAULT_PRIORITY, | 748 &ignored, CompletionCallback(), DEFAULT_PRIORITY, |
752 ClientSocketPool::RespectLimits::ENABLED, | 749 ClientSocketPool::RespectLimits::ENABLED, |
753 internal::ClientSocketPoolBaseHelper::NORMAL, params_, BoundNetLog()); | 750 internal::ClientSocketPoolBaseHelper::NORMAL, params_, BoundNetLog()); |
754 scoped_ptr<TestConnectJob> job( | 751 std::unique_ptr<TestConnectJob> job( |
755 new TestConnectJob(TestConnectJob::kMockJob, | 752 new TestConnectJob(TestConnectJob::kMockJob, "a", request, |
756 "a", | 753 base::TimeDelta::FromMicroseconds(1), &delegate, |
757 request, | 754 &client_socket_factory_, NULL)); |
758 base::TimeDelta::FromMicroseconds(1), | |
759 &delegate, | |
760 &client_socket_factory_, | |
761 NULL)); | |
762 EXPECT_EQ(OK, job->Connect()); | 755 EXPECT_EQ(OK, job->Connect()); |
763 } | 756 } |
764 | 757 |
765 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { | 758 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { |
766 TestConnectJobDelegate delegate; | 759 TestConnectJobDelegate delegate; |
767 ClientSocketHandle ignored; | 760 ClientSocketHandle ignored; |
768 TestNetLog log; | 761 TestNetLog log; |
769 | 762 |
770 TestClientSocketPoolBase::Request request( | 763 TestClientSocketPoolBase::Request request( |
771 &ignored, CompletionCallback(), DEFAULT_PRIORITY, | 764 &ignored, CompletionCallback(), DEFAULT_PRIORITY, |
(...skipping 3068 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3840 request(1)->handle()->Reset(); | 3833 request(1)->handle()->Reset(); |
3841 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3834 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
3842 | 3835 |
3843 EXPECT_EQ(OK, request(2)->WaitForResult()); | 3836 EXPECT_EQ(OK, request(2)->WaitForResult()); |
3844 EXPECT_FALSE(request(1)->have_result()); | 3837 EXPECT_FALSE(request(1)->have_result()); |
3845 } | 3838 } |
3846 | 3839 |
3847 } // namespace | 3840 } // namespace |
3848 | 3841 |
3849 } // namespace net | 3842 } // namespace net |
OLD | NEW |