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

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: Added missing initializer for CastSocket unit tests. Created 6 years, 4 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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 MOCK_METHOD2(OnError, void(const CastSocket* socket, 74 MOCK_METHOD2(OnError, void(const CastSocket* socket,
71 ChannelError error)); 75 ChannelError error));
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),
85 do_nothing_(false) { }
86
87 explicit MockTCPSocket(bool do_nothing) :
88 TCPClientSocket(net::AddressList(), NULL, net::NetLog::Source()) {
89 CHECK(do_nothing);
90 do_nothing_ = do_nothing;
91 }
81 92
82 virtual int Connect(const net::CompletionCallback& callback) OVERRIDE { 93 virtual int Connect(const net::CompletionCallback& callback) OVERRIDE {
94 if (do_nothing_) {
95 // Stall the I/O event loop.
96 return net::ERR_IO_PENDING;
97 }
98
83 if (connect_data_.mode == net::ASYNC) { 99 if (connect_data_.mode == net::ASYNC) {
84 CHECK_NE(connect_data_.result, net::ERR_IO_PENDING); 100 CHECK_NE(connect_data_.result, net::ERR_IO_PENDING);
85 base::MessageLoop::current()->PostTask( 101 base::MessageLoop::current()->PostTask(
86 FROM_HERE, 102 FROM_HERE,
87 base::Bind(callback, connect_data_.result)); 103 base::Bind(callback, connect_data_.result));
88 return net::ERR_IO_PENDING; 104 return net::ERR_IO_PENDING;
89 } else { 105 } else {
90 return connect_data_.result; 106 return connect_data_.result;
91 } 107 }
92 } 108 }
(...skipping 12 matching lines...) Expand all
105 int(net::IOBuffer*, int, const net::CompletionCallback&)); 121 int(net::IOBuffer*, int, const net::CompletionCallback&));
106 MOCK_METHOD3(Write, 122 MOCK_METHOD3(Write,
107 int(net::IOBuffer*, int, const net::CompletionCallback&)); 123 int(net::IOBuffer*, int, const net::CompletionCallback&));
108 124
109 virtual void Disconnect() OVERRIDE { 125 virtual void Disconnect() OVERRIDE {
110 // Do nothing in tests 126 // Do nothing in tests
111 } 127 }
112 128
113 private: 129 private:
114 net::MockConnect connect_data_; 130 net::MockConnect connect_data_;
131 bool do_nothing_;
115 }; 132 };
116 133
117 class CompleteHandler { 134 class CompleteHandler {
118 public: 135 public:
119 CompleteHandler() {} 136 CompleteHandler() {}
120 MOCK_METHOD1(OnCloseComplete, void(int result)); 137 MOCK_METHOD1(OnCloseComplete, void(int result));
121 MOCK_METHOD1(OnConnectComplete, void(int result)); 138 MOCK_METHOD1(OnConnectComplete, void(int result));
122 MOCK_METHOD1(OnWriteComplete, void(int result)); 139 MOCK_METHOD1(OnWriteComplete, void(int result));
123 private: 140 private:
124 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); 141 DISALLOW_COPY_AND_ASSIGN(CompleteHandler);
125 }; 142 };
126 143
127 class TestCastSocket : public CastSocket { 144 class TestCastSocket : public CastSocket {
128 public: 145 public:
129 static scoped_ptr<TestCastSocket> Create( 146 static scoped_ptr<TestCastSocket> Create(
130 MockCastSocketDelegate* delegate) { 147 MockCastSocketDelegate* delegate) {
131 return scoped_ptr<TestCastSocket>( 148 return scoped_ptr<TestCastSocket>(
132 new TestCastSocket(delegate, CreateIPEndPoint(), 149 new TestCastSocket(delegate, CreateIPEndPoint(),
133 CHANNEL_AUTH_TYPE_SSL)); 150 CHANNEL_AUTH_TYPE_SSL,
151 kDistantTimeoutMillis));
134 } 152 }
135 153
136 static scoped_ptr<TestCastSocket> CreateSecure( 154 static scoped_ptr<TestCastSocket> CreateSecure(
137 MockCastSocketDelegate* delegate) { 155 MockCastSocketDelegate* delegate) {
138 return scoped_ptr<TestCastSocket>( 156 return scoped_ptr<TestCastSocket>(
139 new TestCastSocket(delegate, CreateIPEndPoint(), 157 new TestCastSocket(delegate, CreateIPEndPoint(),
140 CHANNEL_AUTH_TYPE_SSL_VERIFIED)); 158 CHANNEL_AUTH_TYPE_SSL_VERIFIED,
159 kDistantTimeoutMillis));
141 } 160 }
142 161
143 explicit TestCastSocket(MockCastSocketDelegate* delegate, 162 explicit TestCastSocket(MockCastSocketDelegate* delegate,
144 const net::IPEndPoint& ip_endpoint, 163 const net::IPEndPoint& ip_endpoint,
145 ChannelAuthType channel_auth) : 164 ChannelAuthType channel_auth,
146 CastSocket("abcdefg", ip_endpoint, channel_auth, delegate, 165 int64 timeout_ms)
147 &capturing_net_log_), 166 : CastSocket("abcdefg",
148 ip_(ip_endpoint), 167 ip_endpoint,
149 connect_index_(0), 168 channel_auth,
150 extract_cert_result_(true), 169 delegate,
151 verify_challenge_result_(true) { 170 &capturing_net_log_,
152 } 171 base::TimeDelta::FromMilliseconds(timeout_ms)),
172 ip_(ip_endpoint),
173 connect_index_(0),
174 extract_cert_result_(true),
175 verify_challenge_result_(true),
176 tcp_unresponsive_(false),
177 mock_timer_(new base::MockTimer(false, false)) {}
153 178
154 static net::IPEndPoint CreateIPEndPoint() { 179 static net::IPEndPoint CreateIPEndPoint() {
155 net::IPAddressNumber number; 180 net::IPAddressNumber number;
156 number.push_back(192); 181 number.push_back(192);
157 number.push_back(0); 182 number.push_back(0);
158 number.push_back(0); 183 number.push_back(0);
159 number.push_back(1); 184 number.push_back(1);
160 return net::IPEndPoint(number, 8009); 185 return net::IPEndPoint(number, 8009);
161 } 186 }
162 187
(...skipping 11 matching lines...) Expand all
174 } 199 }
175 void SetupSsl1Connect(net::IoMode mode, int result) { 200 void SetupSsl1Connect(net::IoMode mode, int result) {
176 ssl_connect_data_[0].reset(new net::MockConnect(mode, result)); 201 ssl_connect_data_[0].reset(new net::MockConnect(mode, result));
177 } 202 }
178 void SetupTcp2Connect(net::IoMode mode, int result) { 203 void SetupTcp2Connect(net::IoMode mode, int result) {
179 tcp_connect_data_[1].reset(new net::MockConnect(mode, result)); 204 tcp_connect_data_[1].reset(new net::MockConnect(mode, result));
180 } 205 }
181 void SetupSsl2Connect(net::IoMode mode, int result) { 206 void SetupSsl2Connect(net::IoMode mode, int result) {
182 ssl_connect_data_[1].reset(new net::MockConnect(mode, result)); 207 ssl_connect_data_[1].reset(new net::MockConnect(mode, result));
183 } 208 }
209 void SetupTcp1ConnectUnresponsive() {
210 tcp_unresponsive_ = true;
211 }
184 void AddWriteResult(const net::MockWrite& write) { 212 void AddWriteResult(const net::MockWrite& write) {
185 writes_.push_back(write); 213 writes_.push_back(write);
186 } 214 }
187 void AddWriteResult(net::IoMode mode, int result) { 215 void AddWriteResult(net::IoMode mode, int result) {
188 AddWriteResult(net::MockWrite(mode, result)); 216 AddWriteResult(net::MockWrite(mode, result));
189 } 217 }
190 void AddWriteResultForMessage(net::IoMode mode, const std::string& msg) { 218 void AddWriteResultForMessage(net::IoMode mode, const std::string& msg) {
191 AddWriteResult(mode, msg.size()); 219 AddWriteResult(mode, msg.size());
192 } 220 }
193 void AddWriteResultForMessage(net::IoMode mode, 221 void AddWriteResultForMessage(net::IoMode mode,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 } 256 }
229 } 257 }
230 258
231 void SetExtractCertResult(bool value) { 259 void SetExtractCertResult(bool value) {
232 extract_cert_result_ = value; 260 extract_cert_result_ = value;
233 } 261 }
234 void SetVerifyChallengeResult(bool value) { 262 void SetVerifyChallengeResult(bool value) {
235 verify_challenge_result_ = value; 263 verify_challenge_result_ = value;
236 } 264 }
237 265
266 void TriggerTimeout() {
267 mock_timer_->Fire();
268 }
269
238 private: 270 private:
239 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE { 271 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE {
240 net::MockConnect* connect_data = tcp_connect_data_[connect_index_].get(); 272 if (tcp_unresponsive_) {
241 connect_data->peer_addr = ip_; 273 return scoped_ptr<net::TCPClientSocket>(new MockTCPSocket(true));
242 return scoped_ptr<net::TCPClientSocket>(new MockTCPSocket(*connect_data)); 274 } else {
275 net::MockConnect* connect_data = tcp_connect_data_[connect_index_].get();
276 connect_data->peer_addr = ip_;
277 return scoped_ptr<net::TCPClientSocket>(new MockTCPSocket(*connect_data));
278 }
243 } 279 }
244 280
245 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket( 281 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket(
246 scoped_ptr<net::StreamSocket> socket) OVERRIDE { 282 scoped_ptr<net::StreamSocket> socket) OVERRIDE {
247 net::MockConnect* connect_data = ssl_connect_data_[connect_index_].get(); 283 net::MockConnect* connect_data = ssl_connect_data_[connect_index_].get();
248 connect_data->peer_addr = ip_; 284 connect_data->peer_addr = ip_;
249 ++connect_index_; 285 ++connect_index_;
250 286
251 ssl_data_.reset(new net::StaticSocketDataProvider( 287 ssl_data_.reset(new net::StaticSocketDataProvider(
252 reads_.data(), reads_.size(), writes_.data(), writes_.size())); 288 reads_.data(), reads_.size(), writes_.data(), writes_.size()));
253 ssl_data_->set_connect_data(*connect_data); 289 ssl_data_->set_connect_data(*connect_data);
254 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !! 290 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !!
255 return scoped_ptr<net::SSLClientSocket>( 291 return scoped_ptr<net::SSLClientSocket>(
256 new net::MockTCPClientSocket( 292 new net::MockTCPClientSocket(
257 net::AddressList(), &capturing_net_log_, ssl_data_.get())); 293 net::AddressList(), &capturing_net_log_, ssl_data_.get()));
258 } 294 }
259 295
260 virtual bool ExtractPeerCert(std::string* cert) OVERRIDE { 296 virtual bool ExtractPeerCert(std::string* cert) OVERRIDE {
261 if (extract_cert_result_) 297 if (extract_cert_result_)
262 cert->assign("dummy_test_cert"); 298 cert->assign("dummy_test_cert");
263 return extract_cert_result_; 299 return extract_cert_result_;
264 } 300 }
265 301
266 virtual bool VerifyChallengeReply() OVERRIDE { 302 virtual bool VerifyChallengeReply() OVERRIDE {
267 return verify_challenge_result_; 303 return verify_challenge_result_;
268 } 304 }
269 305
306 virtual base::Timer* GetTimer() OVERRIDE {
307 return mock_timer_.get();
308 }
309
270 net::CapturingNetLog capturing_net_log_; 310 net::CapturingNetLog capturing_net_log_;
271 net::IPEndPoint ip_; 311 net::IPEndPoint ip_;
272 // Simulated connect data 312 // Simulated connect data
273 scoped_ptr<net::MockConnect> tcp_connect_data_[2]; 313 scoped_ptr<net::MockConnect> tcp_connect_data_[2];
274 scoped_ptr<net::MockConnect> ssl_connect_data_[2]; 314 scoped_ptr<net::MockConnect> ssl_connect_data_[2];
275 // Simulated read / write data 315 // Simulated read / write data
276 std::vector<net::MockWrite> writes_; 316 std::vector<net::MockWrite> writes_;
277 std::vector<net::MockRead> reads_; 317 std::vector<net::MockRead> reads_;
278 scoped_ptr<net::SocketDataProvider> ssl_data_; 318 scoped_ptr<net::SocketDataProvider> ssl_data_;
279 // Number of times Connect method is called 319 // Number of times Connect method is called
280 size_t connect_index_; 320 size_t connect_index_;
281 // Simulated result of peer cert extraction. 321 // Simulated result of peer cert extraction.
282 bool extract_cert_result_; 322 bool extract_cert_result_;
283 // Simulated result of verifying challenge reply. 323 // Simulated result of verifying challenge reply.
284 bool verify_challenge_result_; 324 bool verify_challenge_result_;
325 // If true, makes TCP connection process stall. For timeout testing.
326 bool tcp_unresponsive_;
327 scoped_ptr<base::MockTimer> mock_timer_;
285 }; 328 };
286 329
287 class CastSocketTest : public testing::Test { 330 class CastSocketTest : public testing::Test {
288 public: 331 public:
289 CastSocketTest() {} 332 CastSocketTest() {}
290 virtual ~CastSocketTest() {} 333 virtual ~CastSocketTest() {}
291 334
292 virtual void SetUp() OVERRIDE { 335 virtual void SetUp() OVERRIDE {
293 // Create a few test messages 336 // Create a few test messages
294 for (size_t i = 0; i < arraysize(test_messages_); i++) { 337 for (size_t i = 0; i < arraysize(test_messages_); i++) {
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 556
514 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); 557 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
515 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 558 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
516 base::Unretained(&handler_))); 559 base::Unretained(&handler_)));
517 RunPendingTasks(); 560 RunPendingTasks();
518 561
519 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 562 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
520 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); 563 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
521 } 564 }
522 565
566 // Test connection error - timeout
567 TEST_F(CastSocketTest, TestConnectTcpTimeoutError) {
568 CreateCastSocketSecure();
569 socket_->SetupTcp1ConnectUnresponsive();
570 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_TIMED_OUT));
571 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
572 base::Unretained(&handler_)));
573 RunPendingTasks();
574
575 EXPECT_EQ(cast_channel::READY_STATE_CONNECTING, socket_->ready_state());
576 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
577 socket_->TriggerTimeout();
578 RunPendingTasks();
579
580 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
581 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_TIMEOUT,
582 socket_->error_state());
583 }
584
523 // Test connection error - SSL connect fails (async) 585 // Test connection error - SSL connect fails (async)
524 TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) { 586 TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) {
525 CreateCastSocketSecure(); 587 CreateCastSocketSecure();
526 588
527 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); 589 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
528 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_FAILED); 590 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_FAILED);
529 591
530 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); 592 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
531 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 593 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
532 base::Unretained(&handler_))); 594 base::Unretained(&handler_)));
533 RunPendingTasks(); 595 RunPendingTasks();
534 596
535 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 597 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
536 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); 598 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
537 } 599 }
538 600
539 // Test connection error - SSL connect fails (async) 601 // Test connection error - SSL connect fails (sync)
540 TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) { 602 TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) {
541 CreateCastSocketSecure(); 603 CreateCastSocketSecure();
542 604
543 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); 605 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
544 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_FAILED); 606 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_FAILED);
545 607
546 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); 608 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
547 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, 609 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
548 base::Unretained(&handler_))); 610 base::Unretained(&handler_)));
549 RunPendingTasks(); 611 RunPendingTasks();
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
993 ConnectHelper(); 1055 ConnectHelper();
994 1056
995 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 1057 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
996 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, 1058 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE,
997 socket_->error_state()); 1059 socket_->error_state());
998 } 1060 }
999 1061
1000 } // namespace cast_channel 1062 } // namespace cast_channel
1001 } // namespace api 1063 } // namespace api
1002 } // namespace extensions 1064 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/cast_channel/cast_socket.cc ('k') | chrome/common/extensions/api/cast_channel.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698