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
3 // found in the LICENSE file.
5 #include "chrome/browser/extensions/api/cast_channel/cast_socket.h"
7 #include "base/message_loop/message_loop.h"
8 #include "base/run_loop.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/sys_byteorder.h"
11 #include "chrome/browser/extensions/api/cast_channel/cast_channel.pb.h"
12 #include "chrome/browser/extensions/api/cast_channel/cast_message_util.h"
13 #include "net/base/address_list.h"
14 #include "net/base/capturing_net_log.h"
15 #include "net/base/net_errors.h"
16 #include "net/base/net_util.h"
17 #include "net/socket/socket_test_util.h"
18 #include "net/socket/ssl_client_socket.h"
19 #include "net/socket/tcp_client_socket.h"
20 #include "net/ssl/ssl_info.h"
21 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h"
26 using ::testing::DoAll;
27 using ::testing::Return;
28 using ::testing::SaveArg;
31 const char* kTestData[4] = {
39 namespace extensions {
41 namespace cast_channel {
43 // Fills in |message| with a string message.
44 static void CreateStringMessage(const std::string& namespace_,
45 const std::string& source_id,
46 const std::string& destination_id,
47 const std::string& data,
48 MessageInfo* message) {
49 message->namespace_ = namespace_;
50 message->source_id = source_id;
51 message->destination_id = destination_id;
52 message->data.reset(new base::StringValue(data));
55 // Fills in |message| with a binary message.
56 static void CreateBinaryMessage(const std::string& namespace_,
57 const std::string& source_id,
58 const std::string& destination_id,
59 const std::string& data,
60 MessageInfo* message) {
61 message->namespace_ = namespace_;
62 message->source_id = source_id;
63 message->destination_id = destination_id;
64 message->data.reset(base::BinaryValue::CreateWithCopiedBuffer(
65 data.c_str(), data.size()));
68 class MockCastSocketDelegate : public CastSocket::Delegate {
70 MOCK_METHOD2(OnError, void(const CastSocket* socket,
72 MOCK_METHOD2(OnMessage, void(const CastSocket* socket,
73 const MessageInfo& message));
76 class MockTCPSocket : public net::TCPClientSocket {
78 explicit MockTCPSocket(const net::MockConnect& connect_data) :
79 TCPClientSocket(net::AddressList(), NULL, net::NetLog::Source()),
80 connect_data_(connect_data) { }
82 virtual int Connect(const net::CompletionCallback& callback) OVERRIDE {
83 if (connect_data_.mode == net::ASYNC) {
84 CHECK_NE(connect_data_.result, net::ERR_IO_PENDING);
85 base::MessageLoop::current()->PostTask(
87 base::Bind(callback, connect_data_.result));
88 return net::ERR_IO_PENDING;
90 return connect_data_.result;
94 virtual bool SetKeepAlive(bool enable, int delay) OVERRIDE {
95 // Always return true in tests
99 virtual bool SetNoDelay(bool no_delay) OVERRIDE {
100 // Always return true in tests
105 int(net::IOBuffer*, int, const net::CompletionCallback&));
107 int(net::IOBuffer*, int, const net::CompletionCallback&));
109 virtual void Disconnect() OVERRIDE {
110 // Do nothing in tests
114 net::MockConnect connect_data_;
117 class CompleteHandler {
120 MOCK_METHOD1(OnCloseComplete, void(int result));
121 MOCK_METHOD1(OnConnectComplete, void(int result));
122 MOCK_METHOD1(OnWriteComplete, void(int result));
124 DISALLOW_COPY_AND_ASSIGN(CompleteHandler);
127 class TestCastSocket : public CastSocket {
129 static scoped_ptr<TestCastSocket> Create(
130 MockCastSocketDelegate* delegate) {
131 return scoped_ptr<TestCastSocket>(
132 new TestCastSocket(delegate, CreateIPEndPoint(),
133 CHANNEL_AUTH_TYPE_SSL));
136 static scoped_ptr<TestCastSocket> CreateSecure(
137 MockCastSocketDelegate* delegate) {
138 return scoped_ptr<TestCastSocket>(
139 new TestCastSocket(delegate, CreateIPEndPoint(),
140 CHANNEL_AUTH_TYPE_SSL_VERIFIED));
143 explicit TestCastSocket(MockCastSocketDelegate* delegate,
144 const net::IPEndPoint& ip_endpoint,
145 ChannelAuthType channel_auth) :
146 CastSocket("abcdefg", ip_endpoint, channel_auth, delegate,
147 &capturing_net_log_),
150 extract_cert_result_(true),
151 verify_challenge_result_(true),
152 verify_challenge_disallow_(false) {
155 static net::IPEndPoint CreateIPEndPoint() {
156 net::IPAddressNumber number;
157 number.push_back(192);
161 return net::IPEndPoint(number, 8009);
164 // Returns the size of the body (in bytes) of the given serialized message.
165 static size_t ComputeBodySize(const std::string& msg) {
166 return msg.length() - CastSocket::MessageHeader::header_size();
169 virtual ~TestCastSocket() {
172 // Helpers to set mock results for various operations.
173 void SetupTcp1Connect(net::IoMode mode, int result) {
174 tcp_connect_data_[0].reset(new net::MockConnect(mode, result));
176 void SetupSsl1Connect(net::IoMode mode, int result) {
177 ssl_connect_data_[0].reset(new net::MockConnect(mode, result));
179 void SetupTcp2Connect(net::IoMode mode, int result) {
180 tcp_connect_data_[1].reset(new net::MockConnect(mode, result));
182 void SetupSsl2Connect(net::IoMode mode, int result) {
183 ssl_connect_data_[1].reset(new net::MockConnect(mode, result));
185 void AddWriteResult(const net::MockWrite& write) {
186 writes_.push_back(write);
188 void AddWriteResult(net::IoMode mode, int result) {
189 AddWriteResult(net::MockWrite(mode, result));
191 void AddWriteResultForMessage(net::IoMode mode, const std::string& msg) {
192 AddWriteResult(mode, msg.size());
194 void AddWriteResultForMessage(net::IoMode mode,
195 const std::string& msg,
197 size_t msg_size = msg.size();
198 for (size_t offset = 0; offset < msg_size; offset += ch_size) {
199 if (offset + ch_size > msg_size)
200 ch_size = msg_size - offset;
201 AddWriteResult(mode, ch_size);
205 void AddReadResult(const net::MockRead& read) {
206 reads_.push_back(read);
208 void AddReadResult(net::IoMode mode, int result) {
209 AddReadResult(net::MockRead(mode, result));
211 void AddReadResult(net::IoMode mode, const char* data, int data_len) {
212 AddReadResult(net::MockRead(mode, data, data_len));
214 void AddReadResultForMessage(net::IoMode mode, const std::string& msg) {
215 size_t body_size = ComputeBodySize(msg);
216 const char* data = msg.c_str();
217 AddReadResult(mode, data, MessageHeader::header_size());
218 AddReadResult(mode, data + MessageHeader::header_size(), body_size);
220 void AddReadResultForMessage(net::IoMode mode,
221 const std::string& msg,
223 size_t msg_size = msg.size();
224 const char* data = msg.c_str();
225 for (size_t offset = 0; offset < msg_size; offset += ch_size) {
226 if (offset + ch_size > msg_size)
227 ch_size = msg_size - offset;
228 AddReadResult(mode, data + offset, ch_size);
232 void SetExtractCertResult(bool value) {
233 extract_cert_result_ = value;
235 void SetVerifyChallengeResult(bool value) {
236 verify_challenge_result_ = value;
239 void DisallowVerifyChallengeResult() { verify_challenge_disallow_ = true; }
242 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE {
243 net::MockConnect* connect_data = tcp_connect_data_[connect_index_].get();
244 connect_data->peer_addr = ip_;
245 return scoped_ptr<net::TCPClientSocket>(new MockTCPSocket(*connect_data));
248 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket(
249 scoped_ptr<net::StreamSocket> socket) OVERRIDE {
250 net::MockConnect* connect_data = ssl_connect_data_[connect_index_].get();
251 connect_data->peer_addr = ip_;
254 ssl_data_.reset(new net::StaticSocketDataProvider(
255 reads_.data(), reads_.size(), writes_.data(), writes_.size()));
256 ssl_data_->set_connect_data(*connect_data);
257 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !!
258 return scoped_ptr<net::SSLClientSocket>(
259 new net::MockTCPClientSocket(
260 net::AddressList(), &capturing_net_log_, ssl_data_.get()));
263 virtual bool ExtractPeerCert(std::string* cert) OVERRIDE {
264 if (extract_cert_result_)
265 cert->assign("dummy_test_cert");
266 return extract_cert_result_;
269 virtual bool VerifyChallengeReply() OVERRIDE {
270 EXPECT_FALSE(verify_challenge_disallow_);
271 return verify_challenge_result_;
274 net::CapturingNetLog capturing_net_log_;
276 // Simulated connect data
277 scoped_ptr<net::MockConnect> tcp_connect_data_[2];
278 scoped_ptr<net::MockConnect> ssl_connect_data_[2];
279 // Simulated read / write data
280 std::vector<net::MockWrite> writes_;
281 std::vector<net::MockRead> reads_;
282 scoped_ptr<net::SocketDataProvider> ssl_data_;
283 // Number of times Connect method is called
284 size_t connect_index_;
285 // Simulated result of peer cert extraction.
286 bool extract_cert_result_;
287 // Simulated result of verifying challenge reply.
288 bool verify_challenge_result_;
289 bool verify_challenge_disallow_;
292 class CastSocketTest : public testing::Test {
295 virtual ~CastSocketTest() {}
297 virtual void SetUp() OVERRIDE {
298 // Create a few test messages
299 for (size_t i = 0; i < arraysize(test_messages_); i++) {
300 CreateStringMessage("urn:cast", "1", "2", kTestData[i],
302 ASSERT_TRUE(MessageInfoToCastMessage(
303 test_messages_[i], &test_protos_[i]));
304 ASSERT_TRUE(CastSocket::Serialize(test_protos_[i], &test_proto_strs_[i]));
308 virtual void TearDown() OVERRIDE {
309 EXPECT_CALL(handler_, OnCloseComplete(net::OK));
310 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete,
311 base::Unretained(&handler_)));
314 // The caller can specify non-standard namespaces by setting "auth_namespace"
315 // (useful for negative test cases.)
316 void SetupAuthMessage(
317 const char* auth_namespace = "urn:x-cast:com.google.cast.tp.deviceauth") {
318 // Create a test auth request.
320 CreateAuthChallengeMessage(&request);
321 ASSERT_TRUE(CastSocket::Serialize(request, &auth_request_));
323 // Create a test auth reply.
326 auth_namespace, "sender-0", "receiver-0", "abcd", &reply);
327 CastMessage reply_msg;
328 ASSERT_TRUE(MessageInfoToCastMessage(reply, &reply_msg));
329 ASSERT_TRUE(CastSocket::Serialize(reply_msg, &auth_reply_));
332 void CreateCastSocket() {
333 socket_ = TestCastSocket::Create(&mock_delegate_);
336 void CreateCastSocketSecure() {
337 socket_ = TestCastSocket::CreateSecure(&mock_delegate_);
340 // Sets up CastSocket::Connect to succeed.
341 // Connecting the socket also starts the read loop; so we add a mock
342 // read result that returns IO_PENDING and callback is never fired.
343 void ConnectHelper() {
344 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
345 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
346 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
348 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
349 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
350 base::Unretained(&handler_)));
355 // Runs all pending tasks in the message loop.
356 void RunPendingTasks() {
357 base::RunLoop run_loop;
358 run_loop.RunUntilIdle();
361 base::MessageLoop message_loop_;
362 MockCastSocketDelegate mock_delegate_;
363 scoped_ptr<TestCastSocket> socket_;
364 CompleteHandler handler_;
365 MessageInfo test_messages_[arraysize(kTestData)];
366 CastMessage test_protos_[arraysize(kTestData)];
367 std::string test_proto_strs_[arraysize(kTestData)];
368 std::string auth_request_;
369 std::string auth_reply_;
372 // Tests connecting and closing the socket.
373 TEST_F(CastSocketTest, TestConnectAndClose) {
377 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
378 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
380 EXPECT_CALL(handler_, OnCloseComplete(net::OK));
381 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete,
382 base::Unretained(&handler_)));
383 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
384 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
387 // Tests that the following connection flow works:
388 // - TCP connection succeeds (async)
389 // - SSL connection succeeds (async)
390 TEST_F(CastSocketTest, TestConnect) {
393 socket_->SetupTcp1Connect(net::ASYNC, net::OK);
394 socket_->SetupSsl1Connect(net::ASYNC, net::OK);
395 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
397 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
398 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
399 base::Unretained(&handler_)));
402 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
403 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
406 // Test that the following connection flow works:
407 // - TCP connection succeeds (async)
408 // - SSL connection fails with cert error (async)
409 // - Cert is extracted successfully
410 // - Second TCP connection succeeds (async)
411 // - Second SSL connection succeeds (async)
412 TEST_F(CastSocketTest, TestConnectTwoStep) {
415 socket_->SetupTcp1Connect(net::ASYNC, net::OK);
416 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
417 socket_->SetupTcp2Connect(net::ASYNC, net::OK);
418 socket_->SetupSsl2Connect(net::ASYNC, net::OK);
419 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
421 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
422 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
423 base::Unretained(&handler_)));
426 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
427 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
430 // Test that the following connection flow works:
431 // - TCP connection succeeds (async)
432 // - SSL connection fails with cert error (async)
433 // - Cert is extracted successfully
434 // - Second TCP connection succeeds (async)
435 // - Second SSL connection fails (async)
436 // - The flow should NOT be tried again
437 TEST_F(CastSocketTest, TestConnectMaxTwoAttempts) {
440 socket_->SetupTcp1Connect(net::ASYNC, net::OK);
441 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
442 socket_->SetupTcp2Connect(net::ASYNC, net::OK);
443 socket_->SetupSsl2Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
445 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID));
446 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
447 base::Unretained(&handler_)));
450 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
451 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
454 // Tests that the following connection flow works:
455 // - TCP connection succeeds (async)
456 // - SSL connection fails with cert error (async)
457 // - Cert is extracted successfully
458 // - Second TCP connection succeeds (async)
459 // - Second SSL connection succeeds (async)
460 // - Challenge request is sent (async)
461 // - Challenge response is received (async)
462 // - Credentials are verified successfuly
463 TEST_F(CastSocketTest, TestConnectFullSecureFlowAsync) {
464 CreateCastSocketSecure();
467 socket_->SetupTcp1Connect(net::ASYNC, net::OK);
468 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
469 socket_->SetupTcp2Connect(net::ASYNC, net::OK);
470 socket_->SetupSsl2Connect(net::ASYNC, net::OK);
471 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_);
472 socket_->AddReadResultForMessage(net::ASYNC, auth_reply_);
473 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
475 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
476 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
477 base::Unretained(&handler_)));
480 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
481 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
484 // Same as TestFullSecureConnectionFlowAsync, but operations are synchronous.
485 TEST_F(CastSocketTest, TestConnectFullSecureFlowSync) {
486 CreateCastSocketSecure();
489 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
490 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_CERT_AUTHORITY_INVALID);
491 socket_->SetupTcp2Connect(net::SYNCHRONOUS, net::OK);
492 socket_->SetupSsl2Connect(net::SYNCHRONOUS, net::OK);
493 socket_->AddWriteResultForMessage(net::SYNCHRONOUS, auth_request_);
494 socket_->AddReadResultForMessage(net::SYNCHRONOUS, auth_reply_);
495 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
497 EXPECT_CALL(handler_, OnConnectComplete(net::OK));
498 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
499 base::Unretained(&handler_)));
502 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
503 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
506 // Test that an AuthMessage with a mangled namespace triggers cancelation
507 // of the connection event loop.
508 TEST_F(CastSocketTest, TestConnectAuthMessageCorrupted) {
509 CreateCastSocketSecure();
510 SetupAuthMessage("bogus_namespace");
512 socket_->SetupTcp1Connect(net::ASYNC, net::OK);
513 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
514 socket_->SetupTcp2Connect(net::ASYNC, net::OK);
515 socket_->SetupSsl2Connect(net::ASYNC, net::OK);
516 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_);
517 socket_->AddReadResultForMessage(net::ASYNC, auth_reply_);
518 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
519 // Guard against VerifyChallengeResult() being triggered.
520 socket_->DisallowVerifyChallengeResult();
522 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
523 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
524 base::Unretained(&handler_)));
527 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
528 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
531 // Test connection error - TCP connect fails (async)
532 TEST_F(CastSocketTest, TestConnectTcpConnectErrorAsync) {
533 CreateCastSocketSecure();
536 socket_->SetupTcp1Connect(net::ASYNC, net::ERR_FAILED);
538 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
539 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
540 base::Unretained(&handler_)));
543 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
544 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
547 // Test connection error - TCP connect fails (sync)
548 TEST_F(CastSocketTest, TestConnectTcpConnectErrorSync) {
549 CreateCastSocketSecure();
552 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::ERR_FAILED);
554 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
555 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
556 base::Unretained(&handler_)));
559 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
560 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
563 // Test connection error - SSL connect fails (async)
564 TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) {
565 CreateCastSocketSecure();
568 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
569 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_FAILED);
571 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
572 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
573 base::Unretained(&handler_)));
576 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
577 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
580 // Test connection error - SSL connect fails (async)
581 TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) {
582 CreateCastSocketSecure();
585 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
586 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_FAILED);
588 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
589 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
590 base::Unretained(&handler_)));
593 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
594 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
597 // Test connection error - cert extraction error (async)
598 TEST_F(CastSocketTest, TestConnectCertExtractionErrorAsync) {
601 socket_->SetupTcp1Connect(net::ASYNC, net::OK);
602 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID);
603 // Set cert extraction to fail
604 socket_->SetExtractCertResult(false);
606 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID));
607 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
608 base::Unretained(&handler_)));
611 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
612 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
615 // Test connection error - cert extraction error (sync)
616 TEST_F(CastSocketTest, TestConnectCertExtractionErrorSync) {
619 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
620 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_CERT_AUTHORITY_INVALID);
621 // Set cert extraction to fail
622 socket_->SetExtractCertResult(false);
624 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID));
625 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
626 base::Unretained(&handler_)));
629 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
630 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
633 // Test connection error - challenge send fails
634 TEST_F(CastSocketTest, TestConnectChallengeSendError) {
635 CreateCastSocketSecure();
638 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
639 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
640 socket_->AddWriteResult(net::SYNCHRONOUS, net::ERR_FAILED);
642 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
643 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
644 base::Unretained(&handler_)));
647 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
648 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
651 // Test connection error - challenge reply receive fails
652 TEST_F(CastSocketTest, TestConnectChallengeReplyReceiveError) {
653 CreateCastSocketSecure();
656 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
657 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
658 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_);
659 socket_->AddReadResult(net::SYNCHRONOUS, net::ERR_FAILED);
661 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
662 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
663 base::Unretained(&handler_)));
666 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
667 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
670 // Test connection error - challenge reply verification fails
671 TEST_F(CastSocketTest, TestConnectChallengeVerificationFails) {
672 CreateCastSocketSecure();
675 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK);
676 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK);
677 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_);
678 socket_->AddReadResultForMessage(net::ASYNC, auth_reply_);
679 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING);
680 socket_->SetVerifyChallengeResult(false);
682 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED));
683 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete,
684 base::Unretained(&handler_)));
687 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
688 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state());
691 // Test write success - single message (async)
692 TEST_F(CastSocketTest, TestWriteAsync) {
694 socket_->AddWriteResultForMessage(net::ASYNC, test_proto_strs_[0]);
698 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
699 socket_->SendMessage(test_messages_[0],
700 base::Bind(&CompleteHandler::OnWriteComplete,
701 base::Unretained(&handler_)));
704 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
705 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
708 // Test write success - single message (sync)
709 TEST_F(CastSocketTest, TestWriteSync) {
711 socket_->AddWriteResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0]);
715 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
716 socket_->SendMessage(test_messages_[0],
717 base::Bind(&CompleteHandler::OnWriteComplete,
718 base::Unretained(&handler_)));
721 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
722 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
725 // Test write success - single message sent in multiple chunks (async)
726 TEST_F(CastSocketTest, TestWriteChunkedAsync) {
728 socket_->AddWriteResultForMessage(net::ASYNC, test_proto_strs_[0], 2);
732 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
733 socket_->SendMessage(test_messages_[0],
734 base::Bind(&CompleteHandler::OnWriteComplete,
735 base::Unretained(&handler_)));
738 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
739 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
742 // Test write success - single message sent in multiple chunks (sync)
743 TEST_F(CastSocketTest, TestWriteChunkedSync) {
745 socket_->AddWriteResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0], 2);
749 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size()));
750 socket_->SendMessage(test_messages_[0],
751 base::Bind(&CompleteHandler::OnWriteComplete,
752 base::Unretained(&handler_)));
755 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
756 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
759 // Test write success - multiple messages (async)
760 TEST_F(CastSocketTest, TestWriteManyAsync) {
762 for (size_t i = 0; i < arraysize(test_messages_); i++) {
763 size_t msg_size = test_proto_strs_[i].size();
764 socket_->AddWriteResult(net::ASYNC, msg_size);
765 EXPECT_CALL(handler_, OnWriteComplete(msg_size));
770 for (size_t i = 0; i < arraysize(test_messages_); i++) {
771 socket_->SendMessage(test_messages_[i],
772 base::Bind(&CompleteHandler::OnWriteComplete,
773 base::Unretained(&handler_)));
777 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
778 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
781 // Test write success - multiple messages (sync)
782 TEST_F(CastSocketTest, TestWriteManySync) {
784 for (size_t i = 0; i < arraysize(test_messages_); i++) {
785 size_t msg_size = test_proto_strs_[i].size();
786 socket_->AddWriteResult(net::SYNCHRONOUS, msg_size);
787 EXPECT_CALL(handler_, OnWriteComplete(msg_size));
792 for (size_t i = 0; i < arraysize(test_messages_); i++) {
793 socket_->SendMessage(test_messages_[i],
794 base::Bind(&CompleteHandler::OnWriteComplete,
795 base::Unretained(&handler_)));
799 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
800 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
803 // Test write error - not connected
804 TEST_F(CastSocketTest, TestWriteErrorNotConnected) {
808 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
809 socket_->SendMessage(test_messages_[0],
810 base::Bind(&CompleteHandler::OnWriteComplete,
811 base::Unretained(&handler_)));
813 EXPECT_EQ(cast_channel::READY_STATE_NONE, socket_->ready_state());
814 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
817 // Test write error - very large message
818 TEST_F(CastSocketTest, TestWriteErrorLargeMessage) {
823 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
824 size_t size = CastSocket::MessageHeader::max_message_size() + 1;
825 test_messages_[0].data.reset(
826 new base::StringValue(std::string(size, 'a')));
827 socket_->SendMessage(test_messages_[0],
828 base::Bind(&CompleteHandler::OnWriteComplete,
829 base::Unretained(&handler_)));
831 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
832 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
836 // Test write error - network error (sync)
837 TEST_F(CastSocketTest, TestWriteNetworkErrorSync) {
839 socket_->AddWriteResult(net::SYNCHRONOUS, net::ERR_FAILED);
843 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
844 EXPECT_CALL(mock_delegate_,
845 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
846 socket_->SendMessage(test_messages_[0],
847 base::Bind(&CompleteHandler::OnWriteComplete,
848 base::Unretained(&handler_)));
851 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
852 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
855 // Test write error - network error (async)
856 TEST_F(CastSocketTest, TestWriteErrorAsync) {
858 socket_->AddWriteResult(net::ASYNC, net::ERR_FAILED);
862 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
863 EXPECT_CALL(mock_delegate_,
864 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
865 socket_->SendMessage(test_messages_[0],
866 base::Bind(&CompleteHandler::OnWriteComplete,
867 base::Unretained(&handler_)));
870 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
871 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
874 // Test write error - 0 bytes written should be considered an error
875 TEST_F(CastSocketTest, TestWriteErrorZeroBytesWritten) {
877 socket_->AddWriteResult(net::SYNCHRONOUS, 0);
881 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
882 EXPECT_CALL(mock_delegate_,
883 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
884 socket_->SendMessage(test_messages_[0],
885 base::Bind(&CompleteHandler::OnWriteComplete,
886 base::Unretained(&handler_)));
889 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
890 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
893 // Test that when an error occurrs in one write, write callback is invoked for
894 // all pending writes with the error
895 TEST_F(CastSocketTest, TestWriteErrorWithMultiplePendingWritesAsync) {
897 socket_->AddWriteResult(net::ASYNC, net::ERR_SOCKET_NOT_CONNECTED);
901 const int num_writes = arraysize(test_messages_);
902 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_SOCKET_NOT_CONNECTED))
904 EXPECT_CALL(mock_delegate_,
905 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
906 for (int i = 0; i < num_writes; i++) {
907 socket_->SendMessage(test_messages_[i],
908 base::Bind(&CompleteHandler::OnWriteComplete,
909 base::Unretained(&handler_)));
913 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
914 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
917 // Test read success - single message (async)
918 TEST_F(CastSocketTest, TestReadAsync) {
920 socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[0]);
921 EXPECT_CALL(mock_delegate_,
922 OnMessage(socket_.get(), A<const MessageInfo&>()));
926 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
927 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
930 // Test read success - single message (sync)
931 TEST_F(CastSocketTest, TestReadSync) {
934 socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0]);
935 EXPECT_CALL(mock_delegate_,
936 OnMessage(socket_.get(), A<const MessageInfo&>()));
939 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
940 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
943 // Test read success - single message received in multiple chunks (async)
944 TEST_F(CastSocketTest, TestReadChunkedAsync) {
947 socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[0], 2);
948 EXPECT_CALL(mock_delegate_,
949 OnMessage(socket_.get(), A<const MessageInfo&>()));
952 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
953 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
956 // Test read success - single message received in multiple chunks (sync)
957 TEST_F(CastSocketTest, TestReadChunkedSync) {
960 socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0], 2);
961 EXPECT_CALL(mock_delegate_,
962 OnMessage(socket_.get(), A<const MessageInfo&>()));
965 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
966 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
969 // Test read success - multiple messages (async)
970 TEST_F(CastSocketTest, TestReadManyAsync) {
973 size_t num_reads = arraysize(test_proto_strs_);
974 for (size_t i = 0; i < num_reads; i++)
975 socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[i]);
976 EXPECT_CALL(mock_delegate_,
977 OnMessage(socket_.get(), A<const MessageInfo&>()))
981 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
982 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
985 // Test read success - multiple messages (sync)
986 TEST_F(CastSocketTest, TestReadManySync) {
989 size_t num_reads = arraysize(test_proto_strs_);
990 for (size_t i = 0; i < num_reads; i++)
991 socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[i]);
992 EXPECT_CALL(mock_delegate_,
993 OnMessage(socket_.get(), A<const MessageInfo&>()))
997 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
998 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
1001 // Test read error - network error (async)
1002 TEST_F(CastSocketTest, TestReadErrorAsync) {
1005 socket_->AddReadResult(net::ASYNC, net::ERR_SOCKET_NOT_CONNECTED);
1006 EXPECT_CALL(mock_delegate_,
1007 OnError(socket_.get(),
1008 cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
1011 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
1012 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
1015 // Test read error - network error (sync)
1016 TEST_F(CastSocketTest, TestReadErrorSync) {
1019 socket_->AddReadResult(net::SYNCHRONOUS, net::ERR_SOCKET_NOT_CONNECTED);
1020 EXPECT_CALL(mock_delegate_,
1021 OnError(socket_.get(),
1022 cast_channel::CHANNEL_ERROR_SOCKET_ERROR));
1025 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
1026 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
1029 // Test read error - header parse error
1030 TEST_F(CastSocketTest, TestReadHeaderParseError) {
1033 uint32 body_size = base::HostToNet32(
1034 CastSocket::MessageHeader::max_message_size() + 1);
1035 // TODO(munjal): Add a method to cast_message_util.h to serialize messages
1036 char header[sizeof(body_size)];
1037 memcpy(&header, &body_size, arraysize(header));
1038 socket_->AddReadResult(net::SYNCHRONOUS, header, arraysize(header));
1039 EXPECT_CALL(mock_delegate_,
1040 OnError(socket_.get(),
1041 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE));
1044 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
1045 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE,
1046 socket_->error_state());
1049 // Test read error - body parse error
1050 TEST_F(CastSocketTest, TestReadBodyParseError) {
1053 char body[] = "some body";
1054 uint32 body_size = base::HostToNet32(arraysize(body));
1055 char header[sizeof(body_size)];
1056 memcpy(&header, &body_size, arraysize(header));
1057 socket_->AddReadResult(net::SYNCHRONOUS, header, arraysize(header));
1058 socket_->AddReadResult(net::SYNCHRONOUS, body, arraysize(body));
1059 EXPECT_CALL(mock_delegate_,
1060 OnError(socket_.get(),
1061 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE));
1064 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
1065 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE,
1066 socket_->error_state());
1069 } // namespace cast_channel
1071 } // namespace extensions