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

Side by Side Diff: chrome/browser/extensions/api/cast_channel/cast_socket_unittest.cc

Issue 393023003: Added connection timeout functionality to CastSocket. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: JS API plumbing, switch approach from MessageLoop to Timer, better testing. Created 6 years, 5 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "chrome/browser/extensions/api/cast_channel/cast_socket.h" 5 #include "chrome/browser/extensions/api/cast_channel/cast_socket.h"
6 6
7 #include "base/memory/weak_ptr.h"
7 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
8 #include "base/run_loop.h" 9 #include "base/run_loop.h"
9 #include "base/strings/string_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
10 #include "base/sys_byteorder.h" 11 #include "base/sys_byteorder.h"
12 #include "base/timer/mock_timer.h"
11 #include "chrome/browser/extensions/api/cast_channel/cast_channel.pb.h" 13 #include "chrome/browser/extensions/api/cast_channel/cast_channel.pb.h"
12 #include "chrome/browser/extensions/api/cast_channel/cast_message_util.h" 14 #include "chrome/browser/extensions/api/cast_channel/cast_message_util.h"
13 #include "net/base/address_list.h" 15 #include "net/base/address_list.h"
14 #include "net/base/capturing_net_log.h" 16 #include "net/base/capturing_net_log.h"
15 #include "net/base/net_errors.h" 17 #include "net/base/net_errors.h"
16 #include "net/base/net_util.h" 18 #include "net/base/net_util.h"
17 #include "net/socket/socket_test_util.h" 19 #include "net/socket/socket_test_util.h"
18 #include "net/socket/ssl_client_socket.h" 20 #include "net/socket/ssl_client_socket.h"
19 #include "net/socket/tcp_client_socket.h" 21 #include "net/socket/tcp_client_socket.h"
20 #include "net/ssl/ssl_info.h" 22 #include "net/ssl/ssl_info.h"
21 #include "testing/gmock/include/gmock/gmock.h" 23 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h" 24 #include "testing/gtest/include/gtest/gtest.h"
23 25
26 const int64 kDistantTimeoutMillis = 100000; // 100 seconds (never hit).
27
24 using ::testing::_; 28 using ::testing::_;
25 using ::testing::A; 29 using ::testing::A;
26 using ::testing::DoAll; 30 using ::testing::DoAll;
27 using ::testing::Return; 31 using ::testing::Return;
28 using ::testing::SaveArg; 32 using ::testing::SaveArg;
29 33
30 namespace { 34 namespace {
31 const char* kTestData[4] = { 35 const char* kTestData[4] = {
32 "Hello, World!", 36 "Hello, World!",
33 "Goodbye, World!", 37 "Goodbye, World!",
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 MOCK_METHOD2(OnMessage, void(const CastSocket* socket, 76 MOCK_METHOD2(OnMessage, void(const CastSocket* socket,
73 const MessageInfo& message)); 77 const MessageInfo& message));
74 }; 78 };
75 79
76 class MockTCPSocket : public net::TCPClientSocket { 80 class MockTCPSocket : public net::TCPClientSocket {
77 public: 81 public:
78 explicit MockTCPSocket(const net::MockConnect& connect_data) : 82 explicit MockTCPSocket(const net::MockConnect& connect_data) :
79 TCPClientSocket(net::AddressList(), NULL, net::NetLog::Source()), 83 TCPClientSocket(net::AddressList(), NULL, net::NetLog::Source()),
80 connect_data_(connect_data) { } 84 connect_data_(connect_data) { }
81 85
86 explicit MockTCPSocket(bool do_nothing) :
87 TCPClientSocket(net::AddressList(), NULL, net::NetLog::Source()) {
88 CHECK(do_nothing);
89 do_nothing_ = true;
90 }
91
82 virtual int Connect(const net::CompletionCallback& callback) OVERRIDE { 92 virtual int Connect(const net::CompletionCallback& callback) OVERRIDE {
93 if (do_nothing_) {
94 // Stall the I/O event loop.
95 return net::ERR_IO_PENDING;
96 }
97
83 if (connect_data_.mode == net::ASYNC) { 98 if (connect_data_.mode == net::ASYNC) {
84 CHECK_NE(connect_data_.result, net::ERR_IO_PENDING); 99 CHECK_NE(connect_data_.result, net::ERR_IO_PENDING);
85 base::MessageLoop::current()->PostTask( 100 base::MessageLoop::current()->PostTask(
86 FROM_HERE, 101 FROM_HERE,
87 base::Bind(callback, connect_data_.result)); 102 base::Bind(callback, connect_data_.result));
88 return net::ERR_IO_PENDING; 103 return net::ERR_IO_PENDING;
89 } else { 104 } else {
90 return connect_data_.result; 105 return connect_data_.result;
91 } 106 }
92 } 107 }
(...skipping 12 matching lines...) Expand all
105 int(net::IOBuffer*, int, const net::CompletionCallback&)); 120 int(net::IOBuffer*, int, const net::CompletionCallback&));
106 MOCK_METHOD3(Write, 121 MOCK_METHOD3(Write,
107 int(net::IOBuffer*, int, const net::CompletionCallback&)); 122 int(net::IOBuffer*, int, const net::CompletionCallback&));
108 123
109 virtual void Disconnect() OVERRIDE { 124 virtual void Disconnect() OVERRIDE {
110 // Do nothing in tests 125 // Do nothing in tests
111 } 126 }
112 127
113 private: 128 private:
114 net::MockConnect connect_data_; 129 net::MockConnect connect_data_;
130 bool do_nothing_;
115 }; 131 };
116 132
117 class CompleteHandler { 133 class CompleteHandler {
118 public: 134 public:
119 CompleteHandler() {} 135 CompleteHandler() {}
120 MOCK_METHOD1(OnCloseComplete, void(int result)); 136 MOCK_METHOD1(OnCloseComplete, void(int result));
121 MOCK_METHOD1(OnConnectComplete, void(int result)); 137 MOCK_METHOD1(OnConnectComplete, void(int result));
122 MOCK_METHOD1(OnWriteComplete, void(int result)); 138 MOCK_METHOD1(OnWriteComplete, void(int result));
123 private: 139 private:
124 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); 140 DISALLOW_COPY_AND_ASSIGN(CompleteHandler);
125 }; 141 };
126 142
127 class TestCastSocket : public CastSocket { 143 class TestCastSocket : public CastSocket {
128 public: 144 public:
129 static scoped_ptr<TestCastSocket> Create( 145 static scoped_ptr<TestCastSocket> Create(
130 MockCastSocketDelegate* delegate) { 146 MockCastSocketDelegate* delegate) {
131 return scoped_ptr<TestCastSocket>( 147 return scoped_ptr<TestCastSocket>(
132 new TestCastSocket(delegate, CreateIPEndPoint(), 148 new TestCastSocket(delegate, CreateIPEndPoint(),
133 CHANNEL_AUTH_TYPE_SSL)); 149 CHANNEL_AUTH_TYPE_SSL,
150 kDistantTimeoutMillis));
134 } 151 }
135 152
136 static scoped_ptr<TestCastSocket> CreateSecure( 153 static scoped_ptr<TestCastSocket> CreateSecure(
137 MockCastSocketDelegate* delegate) { 154 MockCastSocketDelegate* delegate) {
138 return scoped_ptr<TestCastSocket>( 155 return scoped_ptr<TestCastSocket>(
139 new TestCastSocket(delegate, CreateIPEndPoint(), 156 new TestCastSocket(delegate, CreateIPEndPoint(),
140 CHANNEL_AUTH_TYPE_SSL_VERIFIED)); 157 CHANNEL_AUTH_TYPE_SSL_VERIFIED,
158 kDistantTimeoutMillis));
141 } 159 }
142 160
143 explicit TestCastSocket(MockCastSocketDelegate* delegate, 161 explicit TestCastSocket(MockCastSocketDelegate* delegate,
144 const net::IPEndPoint& ip_endpoint, 162 const net::IPEndPoint& ip_endpoint,
145 ChannelAuthType channel_auth) : 163 ChannelAuthType channel_auth,
164 int64 timeout_ms) :
146 CastSocket("abcdefg", ip_endpoint, channel_auth, delegate, 165 CastSocket("abcdefg", ip_endpoint, channel_auth, delegate,
147 &capturing_net_log_), 166 &capturing_net_log_, timeout_ms),
148 ip_(ip_endpoint), 167 ip_(ip_endpoint),
149 connect_index_(0), 168 connect_index_(0),
150 extract_cert_result_(true), 169 extract_cert_result_(true),
151 verify_challenge_result_(true) { 170 verify_challenge_result_(true),
171 tcp_unresponsive_(false) {
172 scoped_ptr<base::MockTimer> connect_timeout_timer_owned(
173 new base::MockTimer(false, false));
174 connect_timeout_timer_ = connect_timeout_timer_owned.get();
mark a. foltz 2014/07/17 23:56:49 You are creating a shared ownership of the timer b
Kevin M 2014/07/22 18:51:49 Done.
175 InjectTimerForTesting(connect_timeout_timer_owned.PassAs<base::Timer>());
152 } 176 }
153 177
154 static net::IPEndPoint CreateIPEndPoint() { 178 static net::IPEndPoint CreateIPEndPoint() {
155 net::IPAddressNumber number; 179 net::IPAddressNumber number;
156 number.push_back(192); 180 number.push_back(192);
157 number.push_back(0); 181 number.push_back(0);
158 number.push_back(0); 182 number.push_back(0);
159 number.push_back(1); 183 number.push_back(1);
160 return net::IPEndPoint(number, 8009); 184 return net::IPEndPoint(number, 8009);
161 } 185 }
(...skipping 12 matching lines...) Expand all
174 } 198 }
175 void SetupSsl1Connect(net::IoMode mode, int result) { 199 void SetupSsl1Connect(net::IoMode mode, int result) {
176 ssl_connect_data_[0].reset(new net::MockConnect(mode, result)); 200 ssl_connect_data_[0].reset(new net::MockConnect(mode, result));
177 } 201 }
178 void SetupTcp2Connect(net::IoMode mode, int result) { 202 void SetupTcp2Connect(net::IoMode mode, int result) {
179 tcp_connect_data_[1].reset(new net::MockConnect(mode, result)); 203 tcp_connect_data_[1].reset(new net::MockConnect(mode, result));
180 } 204 }
181 void SetupSsl2Connect(net::IoMode mode, int result) { 205 void SetupSsl2Connect(net::IoMode mode, int result) {
182 ssl_connect_data_[1].reset(new net::MockConnect(mode, result)); 206 ssl_connect_data_[1].reset(new net::MockConnect(mode, result));
183 } 207 }
208 void SetupTcp1ConnectUnresponsive() {
209 tcp_unresponsive_ = true;
210 }
184 void AddWriteResult(const net::MockWrite& write) { 211 void AddWriteResult(const net::MockWrite& write) {
185 writes_.push_back(write); 212 writes_.push_back(write);
186 } 213 }
187 void AddWriteResult(net::IoMode mode, int result) { 214 void AddWriteResult(net::IoMode mode, int result) {
188 AddWriteResult(net::MockWrite(mode, result)); 215 AddWriteResult(net::MockWrite(mode, result));
189 } 216 }
190 void AddWriteResultForMessage(net::IoMode mode, const std::string& msg) { 217 void AddWriteResultForMessage(net::IoMode mode, const std::string& msg) {
191 AddWriteResult(mode, msg.size()); 218 AddWriteResult(mode, msg.size());
192 } 219 }
193 void AddWriteResultForMessage(net::IoMode mode, 220 void AddWriteResultForMessage(net::IoMode mode,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 } 255 }
229 } 256 }
230 257
231 void SetExtractCertResult(bool value) { 258 void SetExtractCertResult(bool value) {
232 extract_cert_result_ = value; 259 extract_cert_result_ = value;
233 } 260 }
234 void SetVerifyChallengeResult(bool value) { 261 void SetVerifyChallengeResult(bool value) {
235 verify_challenge_result_ = value; 262 verify_challenge_result_ = value;
236 } 263 }
237 264
265 void TriggerTimeout() {
266 connect_timeout_timer_->Fire();
267 }
268
238 private: 269 private:
239 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE { 270 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE {
240 net::MockConnect* connect_data = tcp_connect_data_[connect_index_].get(); 271 if (tcp_unresponsive_) {
241 connect_data->peer_addr = ip_; 272 return scoped_ptr<net::TCPClientSocket>(new MockTCPSocket(true));
242 return scoped_ptr<net::TCPClientSocket>(new MockTCPSocket(*connect_data)); 273 } else {
274 net::MockConnect* connect_data = tcp_connect_data_[connect_index_].get();
275 connect_data->peer_addr = ip_;
276 return scoped_ptr<net::TCPClientSocket>(new MockTCPSocket(*connect_data));
277 }
243 } 278 }
244 279
245 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket( 280 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket(
246 scoped_ptr<net::StreamSocket> socket) OVERRIDE { 281 scoped_ptr<net::StreamSocket> socket) OVERRIDE {
247 net::MockConnect* connect_data = ssl_connect_data_[connect_index_].get(); 282 net::MockConnect* connect_data = ssl_connect_data_[connect_index_].get();
248 connect_data->peer_addr = ip_; 283 connect_data->peer_addr = ip_;
249 ++connect_index_; 284 ++connect_index_;
250 285
251 ssl_data_.reset(new net::StaticSocketDataProvider( 286 ssl_data_.reset(new net::StaticSocketDataProvider(
252 reads_.data(), reads_.size(), writes_.data(), writes_.size())); 287 reads_.data(), reads_.size(), writes_.data(), writes_.size()));
(...skipping 22 matching lines...) Expand all
275 // Simulated read / write data 310 // Simulated read / write data
276 std::vector<net::MockWrite> writes_; 311 std::vector<net::MockWrite> writes_;
277 std::vector<net::MockRead> reads_; 312 std::vector<net::MockRead> reads_;
278 scoped_ptr<net::SocketDataProvider> ssl_data_; 313 scoped_ptr<net::SocketDataProvider> ssl_data_;
279 // Number of times Connect method is called 314 // Number of times Connect method is called
280 size_t connect_index_; 315 size_t connect_index_;
281 // Simulated result of peer cert extraction. 316 // Simulated result of peer cert extraction.
282 bool extract_cert_result_; 317 bool extract_cert_result_;
283 // Simulated result of verifying challenge reply. 318 // Simulated result of verifying challenge reply.
284 bool verify_challenge_result_; 319 bool verify_challenge_result_;
320 // If true, makes TCP connection process stall. For timeout testing.
321 bool tcp_unresponsive_;
322 base::MockTimer* connect_timeout_timer_;
285 }; 323 };
286 324
287 class CastSocketTest : public testing::Test { 325 class CastSocketTest : public testing::Test {
288 public: 326 public:
289 CastSocketTest() {} 327 CastSocketTest() {}
290 virtual ~CastSocketTest() {} 328 virtual ~CastSocketTest() {}
291 329
292 virtual void SetUp() OVERRIDE { 330 virtual void SetUp() OVERRIDE {
293 // Create a few test messages 331 // Create a few test messages
294 for (size_t i = 0; i < arraysize(test_messages_); i++) { 332 for (size_t i = 0; i < arraysize(test_messages_); i++) {
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 551
514 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); 552 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
515 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 553 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
516 base::Unretained(&handler_))); 554 base::Unretained(&handler_)));
517 RunPendingTasks(); 555 RunPendingTasks();
518 556
519 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 557 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
520 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); 558 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
521 } 559 }
522 560
561 // Test connection error - timeout
562 TEST_F(CastSocketTest, TestConnectTcpTimeoutError) {
563 CreateCastSocketSecure();
564 socket_->SetupTcp1ConnectUnresponsive();
565 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_TIMED_OUT));
566 EXPECT_CALL(mock_delegate_,
567 OnError(socket_.get(),
568 cast_channel::CHANNEL_ERROR_CONNECT_TIMEOUT));
569 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
570 base::Unretained(&handler_)));
571 RunPendingTasks();
572
573 EXPECT_EQ(cast_channel::READY_STATE_CONNECTING, socket_->ready_state());
574 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
575 socket_->TriggerTimeout();
576 RunPendingTasks();
577
578 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
579 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_TIMEOUT,
580 socket_->error_state());
581 }
582
523 // Test connection error - SSL connect fails (async) 583 // Test connection error - SSL connect fails (async)
524 TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) { 584 TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) {
525 CreateCastSocketSecure(); 585 CreateCastSocketSecure();
526 586
527 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); 587 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
528 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_FAILED); 588 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_FAILED);
529 589
530 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); 590 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
531 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 591 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
532 base::Unretained(&handler_))); 592 base::Unretained(&handler_)));
533 RunPendingTasks(); 593 RunPendingTasks();
534 594
535 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 595 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
536 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); 596 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
537 } 597 }
538 598
539 // Test connection error - SSL connect fails (async) 599 // Test connection error - SSL connect fails (sync)
540 TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) { 600 TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) {
541 CreateCastSocketSecure(); 601 CreateCastSocketSecure();
542 602
543 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); 603 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
544 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_FAILED); 604 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_FAILED);
545 605
546 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); 606 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
547 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 607 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
548 base::Unretained(&handler_))); 608 base::Unretained(&handler_)));
549 RunPendingTasks(); 609 RunPendingTasks();
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
993 ConnectHelper(); 1053 ConnectHelper();
994 1054
995 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 1055 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
996 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, 1056 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE,
997 socket_->error_state()); 1057 socket_->error_state());
998 } 1058 }
999 1059
1000 } // namespace cast_channel 1060 } // namespace cast_channel
1001 } // namespace api 1061 } // namespace api
1002 } // namespace extensions 1062 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698