| OLD | NEW |
| 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/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" | 7 #include "chrome/browser/extensions/api/cast_channel/cast_channel.pb.h" |
| 12 #include "chrome/browser/extensions/api/cast_channel/cast_message_util.h" | 8 #include "chrome/browser/extensions/api/cast_channel/cast_message_util.h" |
| 13 #include "net/base/address_list.h" | 9 #include "net/base/address_list.h" |
| 14 #include "net/base/capturing_net_log.h" | 10 #include "net/base/capturing_net_log.h" |
| 15 #include "net/base/io_buffer.h" | 11 #include "net/base/io_buffer.h" |
| 16 #include "net/base/net_errors.h" | 12 #include "net/base/net_errors.h" |
| 17 #include "net/base/net_log.h" | 13 #include "net/base/net_log.h" |
| 18 #include "net/socket/socket_test_util.h" | 14 #include "net/socket/socket_test_util.h" |
| 19 #include "net/socket/ssl_client_socket.h" | 15 #include "net/socket/ssl_client_socket.h" |
| 20 #include "net/socket/tcp_client_socket.h" | 16 #include "net/socket/tcp_client_socket.h" |
| 21 #include "net/ssl/ssl_info.h" | 17 #include "net/ssl/ssl_info.h" |
| 22 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
| 23 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 24 | 20 |
| 25 using ::testing::_; | 21 using ::testing::_; |
| 26 using ::testing::A; | 22 using ::testing::A; |
| 27 using ::testing::DoAll; | 23 using ::testing::DoAll; |
| 28 using ::testing::Return; | 24 using ::testing::Return; |
| 29 using ::testing::SaveArg; | 25 using ::testing::SaveArg; |
| 30 | 26 |
| 31 namespace { | |
| 32 const char* kTestData[4] = { | |
| 33 "Hello, World!", | |
| 34 "Goodbye, World!", | |
| 35 "Hello, Sky!", | |
| 36 "Goodbye, Volcano!", | |
| 37 }; | |
| 38 } // namespace | |
| 39 | |
| 40 namespace extensions { | 27 namespace extensions { |
| 41 namespace api { | 28 namespace api { |
| 42 namespace cast_channel { | 29 namespace cast_channel { |
| 43 | 30 |
| 44 // Fills in |message| with a string message. | |
| 45 static void CreateStringMessage(const std::string& namespace_, | |
| 46 const std::string& source_id, | |
| 47 const std::string& destination_id, | |
| 48 const std::string& data, | |
| 49 MessageInfo* message) { | |
| 50 message->namespace_ = namespace_; | |
| 51 message->source_id = source_id; | |
| 52 message->destination_id = destination_id; | |
| 53 message->data.reset(new base::StringValue(data)); | |
| 54 } | |
| 55 | |
| 56 // Fills in |message| with a binary message. | |
| 57 static void CreateBinaryMessage(const std::string& namespace_, | |
| 58 const std::string& source_id, | |
| 59 const std::string& destination_id, | |
| 60 const std::string& data, | |
| 61 MessageInfo* message) { | |
| 62 message->namespace_ = namespace_; | |
| 63 message->source_id = source_id; | |
| 64 message->destination_id = destination_id; | |
| 65 message->data.reset(base::BinaryValue::CreateWithCopiedBuffer( | |
| 66 data.c_str(), data.size())); | |
| 67 } | |
| 68 | |
| 69 // Returns the size of the body (in bytes) of the given serialized message. | |
| 70 static size_t ComputeBodySize(const std::string& msg) { | |
| 71 return msg.length() - kMessageHeaderSize; | |
| 72 } | |
| 73 | |
| 74 class MockCastSocketDelegate : public CastSocket::Delegate { | 31 class MockCastSocketDelegate : public CastSocket::Delegate { |
| 75 public: | 32 public: |
| 76 MOCK_METHOD2(OnError, void(const CastSocket* socket, | 33 MOCK_METHOD2(OnError, void(const CastSocket* socket, |
| 77 ChannelError error)); | 34 ChannelError error)); |
| 78 MOCK_METHOD2(OnMessage, void(const CastSocket* socket, | 35 MOCK_METHOD2(OnMessage, void(const CastSocket* socket, |
| 79 const MessageInfo& message)); | 36 const MessageInfo& message)); |
| 80 }; | 37 }; |
| 81 | 38 |
| 82 class MockTCPSocket : public net::TCPClientSocket { | 39 class MockTCPClientSocket : public net::TCPClientSocket { |
| 83 public: | 40 public: |
| 84 explicit MockTCPSocket(const net::MockConnect& connect_data) : | 41 explicit MockTCPClientSocket() : |
| 85 TCPClientSocket(net::AddressList(), NULL, net::NetLog::Source()), | 42 TCPClientSocket(net::AddressList(), NULL, net::NetLog::Source()) { } |
| 86 connect_data_(connect_data) { } | 43 virtual ~MockTCPClientSocket() { } |
| 87 | 44 |
| 88 virtual int Connect(const net::CompletionCallback& callback) OVERRIDE { | 45 MOCK_METHOD1(Connect, int(const net::CompletionCallback& callback)); |
| 89 if (connect_data_.mode == net::ASYNC) { | 46 MOCK_METHOD2(SetKeepAlive, bool(bool, int)); |
| 90 CHECK_NE(connect_data_.result, net::ERR_IO_PENDING); | 47 MOCK_METHOD1(SetNoDelay, bool(bool)); |
| 91 base::MessageLoop::current()->PostTask( | 48 MOCK_METHOD3(Read, int(net::IOBuffer* buf, int buf_len, |
| 92 FROM_HERE, | 49 const net::CompletionCallback& callback)); |
| 93 base::Bind(callback, connect_data_.result)); | 50 MOCK_METHOD3(Write, int(net::IOBuffer* buf, int buf_len, |
| 94 return net::ERR_IO_PENDING; | 51 const net::CompletionCallback& callback)); |
| 95 } else { | 52 MOCK_METHOD0(Disconnect, void()); |
| 96 return connect_data_.result; | 53 }; |
| 97 } | |
| 98 } | |
| 99 | 54 |
| 100 virtual bool SetKeepAlive(bool enable, int delay) OVERRIDE { | 55 class MockSSLClientSocket : public net::MockClientSocket { |
| 101 // Always return true in tests | 56 public: |
| 102 return true; | 57 MockSSLClientSocket() : MockClientSocket(net::BoundNetLog()) { } |
| 103 } | 58 virtual ~MockSSLClientSocket() { } |
| 104 | 59 |
| 105 virtual bool SetNoDelay(bool no_delay) OVERRIDE { | 60 MOCK_METHOD1(Connect, int(const net::CompletionCallback& callback)); |
| 106 // Always return true in tests | 61 MOCK_METHOD3(Read, int(net::IOBuffer* buf, int buf_len, |
| 107 return true; | 62 const net::CompletionCallback& callback)); |
| 108 } | 63 MOCK_METHOD3(Write, int(net::IOBuffer* buf, int buf_len, |
| 109 | 64 const net::CompletionCallback& callback)); |
| 110 MOCK_METHOD3(Read, | 65 MOCK_METHOD0(Disconnect, void()); |
| 111 int(net::IOBuffer*, int, const net::CompletionCallback&)); | 66 MOCK_CONST_METHOD0(WasEverUsed, bool()); |
| 112 MOCK_METHOD3(Write, | 67 MOCK_CONST_METHOD0(UsingTCPFastOpen, bool()); |
| 113 int(net::IOBuffer*, int, const net::CompletionCallback&)); | 68 MOCK_CONST_METHOD0(WasNpnNegotiated, bool()); |
| 114 | 69 MOCK_METHOD1(GetSSLInfo, bool(net::SSLInfo*)); |
| 115 virtual void Disconnect() OVERRIDE { | |
| 116 // Do nothing in tests | |
| 117 } | |
| 118 | |
| 119 private: | |
| 120 net::MockConnect connect_data_; | |
| 121 }; | 70 }; |
| 122 | 71 |
| 123 class CompleteHandler { | 72 class CompleteHandler { |
| 124 public: | 73 public: |
| 125 CompleteHandler() {} | 74 CompleteHandler() {} |
| 126 MOCK_METHOD1(OnCloseComplete, void(int result)); | 75 MOCK_METHOD1(OnCloseComplete, void(int result)); |
| 127 MOCK_METHOD1(OnConnectComplete, void(int result)); | 76 MOCK_METHOD1(OnConnectComplete, void(int result)); |
| 128 MOCK_METHOD1(OnWriteComplete, void(int result)); | 77 MOCK_METHOD1(OnWriteComplete, void(int result)); |
| 129 private: | 78 private: |
| 130 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); | 79 DISALLOW_COPY_AND_ASSIGN(CompleteHandler); |
| 131 }; | 80 }; |
| 132 | 81 |
| 133 class TestCastSocket : public CastSocket { | 82 class TestCastSocket : public CastSocket { |
| 134 public: | 83 public: |
| 135 static scoped_ptr<TestCastSocket> Create( | 84 static scoped_ptr<TestCastSocket> Create( |
| 136 MockCastSocketDelegate* delegate) { | 85 MockCastSocketDelegate* delegate) { |
| 137 return scoped_ptr<TestCastSocket>( | 86 return scoped_ptr<TestCastSocket>( |
| 138 new TestCastSocket(delegate, "cast://192.0.0.1:8009")); | 87 new TestCastSocket(delegate, "cast://192.0.0.1:8009")); |
| 139 } | 88 } |
| 140 | 89 |
| 141 static scoped_ptr<TestCastSocket> CreateSecure( | 90 static scoped_ptr<TestCastSocket> CreateSecure( |
| 142 MockCastSocketDelegate* delegate) { | 91 MockCastSocketDelegate* delegate) { |
| 143 return scoped_ptr<TestCastSocket>( | 92 return scoped_ptr<TestCastSocket>( |
| 144 new TestCastSocket(delegate, "casts://192.0.0.1:8009")); | 93 new TestCastSocket(delegate, "casts://192.0.0.1:8009")); |
| 145 } | 94 } |
| 146 | 95 |
| 147 explicit TestCastSocket(MockCastSocketDelegate* delegate, | 96 explicit TestCastSocket(MockCastSocketDelegate* delegate, |
| 148 const std::string& url) : | 97 const std::string& url) : |
| 149 CastSocket("abcdefg", GURL(url), delegate, | 98 CastSocket("abcdefg", GURL(url), delegate, |
| 150 &capturing_net_log_), | 99 &capturing_net_log_), |
| 151 ip_(CreateIPEndPoint()), | 100 mock_tcp_socket_(new MockTCPClientSocket()), |
| 152 connect_index_(0), | 101 mock_ssl_socket_(new MockSSLClientSocket()), |
| 153 extract_cert_result_(true), | 102 owns_tcp_socket_(true), |
| 154 verify_challenge_result_(true) { | 103 owns_ssl_socket_(true), |
| 155 } | 104 extract_cert_result_(true), |
| 156 | 105 send_auth_challenge_result_(net::ERR_IO_PENDING), |
| 157 static net::IPEndPoint CreateIPEndPoint() { | 106 read_auth_challenge_reply_result_(net::ERR_IO_PENDING), |
| 158 net::IPAddressNumber number; | 107 challenge_reply_result_(true) { |
| 159 number.push_back(192); | |
| 160 number.push_back(0); | |
| 161 number.push_back(0); | |
| 162 number.push_back(1); | |
| 163 return net::IPEndPoint(number, 8009); | |
| 164 } | 108 } |
| 165 | 109 |
| 166 virtual ~TestCastSocket() { | 110 virtual ~TestCastSocket() { |
| 167 } | 111 if (owns_tcp_socket_) { |
| 168 | 112 DCHECK(mock_tcp_socket_); |
| 169 // Helpers to set mock results for various operations. | 113 delete mock_tcp_socket_; |
| 170 void SetupTcp1Connect(net::IoMode mode, int result) { | 114 } |
| 171 tcp_connect_data_[0].reset(new net::MockConnect(mode, result)); | 115 if (owns_ssl_socket_) { |
| 172 } | 116 DCHECK(mock_ssl_socket_); |
| 173 void SetupSsl1Connect(net::IoMode mode, int result) { | 117 delete mock_ssl_socket_; |
| 174 ssl_connect_data_[0].reset(new net::MockConnect(mode, result)); | |
| 175 } | |
| 176 void SetupTcp2Connect(net::IoMode mode, int result) { | |
| 177 tcp_connect_data_[1].reset(new net::MockConnect(mode, result)); | |
| 178 } | |
| 179 void SetupSsl2Connect(net::IoMode mode, int result) { | |
| 180 ssl_connect_data_[1].reset(new net::MockConnect(mode, result)); | |
| 181 } | |
| 182 void AddWriteResult(const net::MockWrite& write) { | |
| 183 writes_.push_back(write); | |
| 184 } | |
| 185 void AddWriteResult(net::IoMode mode, int result) { | |
| 186 AddWriteResult(net::MockWrite(mode, result)); | |
| 187 } | |
| 188 void AddWriteResultForMessage(net::IoMode mode, const std::string& msg) { | |
| 189 AddWriteResult(mode, msg.size()); | |
| 190 } | |
| 191 void AddWriteResultForMessage(net::IoMode mode, | |
| 192 const std::string& msg, | |
| 193 size_t ch_size) { | |
| 194 size_t msg_size = msg.size(); | |
| 195 for (size_t offset = 0; offset < msg_size; offset += ch_size) { | |
| 196 if (offset + ch_size > msg_size) | |
| 197 ch_size = msg_size - offset; | |
| 198 AddWriteResult(mode, ch_size); | |
| 199 } | 118 } |
| 200 } | 119 } |
| 201 | 120 |
| 202 void AddReadResult(const net::MockRead& read) { | 121 virtual void Close(const net::CompletionCallback& callback) OVERRIDE { |
| 203 reads_.push_back(read); | 122 if (!owns_tcp_socket_) |
| 123 mock_tcp_socket_ = NULL; |
| 124 if (!owns_ssl_socket_) |
| 125 mock_ssl_socket_ = NULL; |
| 126 CastSocket::Close(callback); |
| 204 } | 127 } |
| 205 void AddReadResult(net::IoMode mode, int result) { | 128 |
| 206 AddReadResult(net::MockRead(mode, result)); | 129 void CreateNewSockets() { |
| 207 } | 130 owns_tcp_socket_ = true; |
| 208 void AddReadResult(net::IoMode mode, const char* data, int data_len) { | 131 mock_tcp_socket_ = new MockTCPClientSocket(); |
| 209 AddReadResult(net::MockRead(mode, data, data_len)); | 132 owns_ssl_socket_ = true; |
| 210 } | 133 mock_ssl_socket_ = new MockSSLClientSocket(); |
| 211 void AddReadResultForMessage(net::IoMode mode, const std::string& msg) { | |
| 212 size_t body_size = ComputeBodySize(msg); | |
| 213 const char* data = msg.c_str(); | |
| 214 AddReadResult(mode, data, kMessageHeaderSize); | |
| 215 AddReadResult(mode, data + kMessageHeaderSize, body_size); | |
| 216 } | |
| 217 void AddReadResultForMessage(net::IoMode mode, | |
| 218 const std::string& msg, | |
| 219 size_t ch_size) { | |
| 220 size_t msg_size = msg.size(); | |
| 221 const char* data = msg.c_str(); | |
| 222 for (size_t offset = 0; offset < msg_size; offset += ch_size) { | |
| 223 if (offset + ch_size > msg_size) | |
| 224 ch_size = msg_size - offset; | |
| 225 AddReadResult(mode, data + offset, ch_size); | |
| 226 } | |
| 227 } | 134 } |
| 228 | 135 |
| 229 void SetExtractCertResult(bool value) { | 136 void SetExtractCertResult(bool value) { |
| 230 extract_cert_result_ = value; | 137 extract_cert_result_ = value; |
| 231 } | 138 } |
| 232 void SetVerifyChallengeResult(bool value) { | 139 |
| 233 verify_challenge_result_ = value; | 140 void SetSendAuthChallengeResult(int result) { |
| 141 send_auth_challenge_result_ = result; |
| 234 } | 142 } |
| 235 | 143 |
| 236 private: | 144 void SetReadAuthChallengeReplyResult(int result) { |
| 237 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE { | 145 read_auth_challenge_reply_result_ = result; |
| 238 net::MockConnect* connect_data = tcp_connect_data_[connect_index_].get(); | |
| 239 connect_data->peer_addr = ip_; | |
| 240 return scoped_ptr<net::TCPClientSocket>(new MockTCPSocket(*connect_data)); | |
| 241 } | 146 } |
| 242 | 147 |
| 243 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket( | 148 void SetChallengeReplyResult(bool value) { |
| 244 scoped_ptr<net::StreamSocket> socket) OVERRIDE { | 149 challenge_reply_result_ = value; |
| 245 net::MockConnect* connect_data = ssl_connect_data_[connect_index_].get(); | 150 } |
| 246 connect_data->peer_addr = ip_; | |
| 247 ++connect_index_; | |
| 248 | 151 |
| 249 ssl_data_.reset(new net::StaticSocketDataProvider( | 152 MockTCPClientSocket* mock_tcp_socket_; |
| 250 reads_.data(), reads_.size(), writes_.data(), writes_.size())); | 153 MockSSLClientSocket* mock_ssl_socket_; |
| 251 ssl_data_->set_connect_data(*connect_data); | 154 |
| 252 // NOTE: net::MockTCPClientSocket inherits from net::SSLClientSocket !! | 155 protected: |
| 253 return scoped_ptr<net::SSLClientSocket>( | 156 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket() OVERRIDE { |
| 254 new net::MockTCPClientSocket( | 157 owns_tcp_socket_ = false; |
| 255 net::AddressList(), &capturing_net_log_, ssl_data_.get())); | 158 return scoped_ptr<net::TCPClientSocket>(mock_tcp_socket_); |
| 159 } |
| 160 |
| 161 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket() OVERRIDE { |
| 162 owns_ssl_socket_ = false; |
| 163 return scoped_ptr<net::SSLClientSocket>(mock_ssl_socket_); |
| 256 } | 164 } |
| 257 | 165 |
| 258 virtual bool ExtractPeerCert(std::string* cert) OVERRIDE { | 166 virtual bool ExtractPeerCert(std::string* cert) OVERRIDE { |
| 259 if (extract_cert_result_) | 167 if (extract_cert_result_) |
| 260 cert->assign("dummy_test_cert"); | 168 cert->assign("dummy_test_cert"); |
| 261 return extract_cert_result_; | 169 return extract_cert_result_; |
| 262 } | 170 } |
| 263 | 171 |
| 264 virtual bool VerifyChallengeReply() OVERRIDE { | 172 virtual int SendAuthChallenge() OVERRIDE { |
| 265 return verify_challenge_result_; | 173 return send_auth_challenge_result_; |
| 266 } | 174 } |
| 267 | 175 |
| 176 virtual int ReadAuthChallengeReply() OVERRIDE { |
| 177 return read_auth_challenge_reply_result_; |
| 178 } |
| 179 |
| 180 virtual bool VerifyChallengeReply() OVERRIDE { |
| 181 return challenge_reply_result_; |
| 182 } |
| 183 |
| 184 private: |
| 268 net::CapturingNetLog capturing_net_log_; | 185 net::CapturingNetLog capturing_net_log_; |
| 269 net::IPEndPoint ip_; | 186 // Whether this object or the parent owns |mock_tcp_socket_|. |
| 270 // Simulated connect data | 187 bool owns_tcp_socket_; |
| 271 scoped_ptr<net::MockConnect> tcp_connect_data_[2]; | 188 // Whether this object or the parent owns |mock_ssl_socket_|. |
| 272 scoped_ptr<net::MockConnect> ssl_connect_data_[2]; | 189 bool owns_ssl_socket_; |
| 273 // Simulated read / write data | |
| 274 std::vector<net::MockWrite> writes_; | |
| 275 std::vector<net::MockRead> reads_; | |
| 276 scoped_ptr<net::SocketDataProvider> ssl_data_; | |
| 277 // Number of times Connect method is called | |
| 278 size_t connect_index_; | |
| 279 // Simulated result of peer cert extraction. | 190 // Simulated result of peer cert extraction. |
| 280 bool extract_cert_result_; | 191 bool extract_cert_result_; |
| 192 // Simulated result to be returned by SendAuthChallenge. |
| 193 int send_auth_challenge_result_; |
| 194 // Simulated result to be returned by ReadAuthChallengeReply. |
| 195 int read_auth_challenge_reply_result_; |
| 281 // Simulated result of verifying challenge reply. | 196 // Simulated result of verifying challenge reply. |
| 282 bool verify_challenge_result_; | 197 bool challenge_reply_result_; |
| 283 }; | 198 }; |
| 284 | 199 |
| 285 class CastSocketTest : public testing::Test { | 200 class CastSocketTest : public testing::Test { |
| 286 public: | 201 public: |
| 287 CastSocketTest() {} | 202 CastSocketTest() {} |
| 288 virtual ~CastSocketTest() {} | 203 virtual ~CastSocketTest() {} |
| 289 | 204 |
| 290 virtual void SetUp() OVERRIDE { | 205 virtual void SetUp() OVERRIDE { |
| 291 // Create a few test messages | 206 test_message_.namespace_ = "urn:test"; |
| 292 for (size_t i = 0; i < arraysize(test_messages_); i++) { | 207 test_message_.source_id = "1"; |
| 293 CreateStringMessage("urn:cast", "1", "2", kTestData[i], | 208 test_message_.destination_id = "2"; |
| 294 &test_messages_[i]); | 209 test_message_.data.reset(new base::StringValue("Hello, World!")); |
| 295 ASSERT_TRUE(MessageInfoToCastMessage( | 210 ASSERT_TRUE(MessageInfoToCastMessage(test_message_, &test_proto_)); |
| 296 test_messages_[i], &test_protos_[i])); | |
| 297 ASSERT_TRUE(CastSocket::Serialize(test_protos_[i], &test_proto_strs_[i])); | |
| 298 } | |
| 299 | |
| 300 // Create a test auth request. | |
| 301 CastMessage request; | |
| 302 CreateAuthChallengeMessage(&request); | |
| 303 ASSERT_TRUE(CastSocket::Serialize(request, &auth_request_)); | |
| 304 | |
| 305 // Create a test auth reply. | |
| 306 MessageInfo reply; | |
| 307 CreateBinaryMessage("urn:x-cast:com.google.cast.tp.deviceauth", | |
| 308 "sender-0", | |
| 309 "receiver-0", | |
| 310 "abcd", | |
| 311 &reply); | |
| 312 CastMessage reply_msg; | |
| 313 ASSERT_TRUE(MessageInfoToCastMessage(reply, &reply_msg)); | |
| 314 ASSERT_TRUE(CastSocket::Serialize(reply_msg, &auth_reply_)); | |
| 315 } | 211 } |
| 316 | 212 |
| 317 virtual void TearDown() OVERRIDE { | 213 virtual void TearDown() OVERRIDE { |
| 318 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); | 214 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); |
| 319 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, | 215 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, |
| 320 base::Unretained(&handler_))); | 216 base::Unretained(&handler_))); |
| 321 } | 217 } |
| 322 | 218 |
| 323 void CreateCastSocket() { | 219 void CreateCastSocket() { |
| 324 socket_ = TestCastSocket::Create(&mock_delegate_); | 220 socket_ = TestCastSocket::Create(&mock_delegate_); |
| 325 } | 221 } |
| 326 | 222 |
| 327 void CreateCastSocketSecure() { | 223 void CreateCastSocketSecure() { |
| 328 socket_ = TestCastSocket::CreateSecure(&mock_delegate_); | 224 socket_ = TestCastSocket::CreateSecure(&mock_delegate_); |
| 329 } | 225 } |
| 330 | 226 |
| 227 // Sets an expectation that TCPClientSocket::Connect is called and |
| 228 // returns |result| and stores the callback passed to it in |callback|. |
| 229 void ExpectTcpConnect(net::CompletionCallback* callback, int result) { |
| 230 EXPECT_CALL(mock_tcp_socket(), Connect(A<const net::CompletionCallback&>())) |
| 231 .Times(1) |
| 232 .WillOnce(DoAll(SaveArg<0>(callback), Return(result))); |
| 233 EXPECT_CALL(mock_tcp_socket(), SetKeepAlive(_, _)) |
| 234 .WillOnce(Return(true)); |
| 235 } |
| 236 |
| 237 // Same as ExpectTcpConnect but to return net::ERR_IO_PENDING. |
| 238 void ExpectTcpConnectPending(net::CompletionCallback* callback) { |
| 239 ExpectTcpConnect(callback, net::ERR_IO_PENDING); |
| 240 } |
| 241 |
| 242 // Sets an expectation that SSLClientSocket::Connect is called and |
| 243 // returns |result| and stores the callback passed to it in |callback|. |
| 244 void ExpectSslConnect(net::CompletionCallback* callback, int result) { |
| 245 EXPECT_CALL(mock_ssl_socket(), Connect(A<const net::CompletionCallback&>())) |
| 246 .Times(1) |
| 247 .WillOnce(DoAll(SaveArg<0>(callback), Return(result))); |
| 248 } |
| 249 |
| 250 // Same as ExpectSslConnect but to return net::ERR_IO_PENDING. |
| 251 void ExpectSslConnectPending(net::CompletionCallback* callback) { |
| 252 ExpectSslConnect(callback, net::ERR_IO_PENDING); |
| 253 } |
| 254 |
| 255 // Sets an expectation that SSLClientSocket::Read is called |times| number |
| 256 // of times and returns net::ERR_IO_PENDING. |
| 257 void ExpectSslRead(int times) { |
| 258 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(), |
| 259 A<int>(), |
| 260 A<const net::CompletionCallback&>())) |
| 261 .Times(times) |
| 262 .WillOnce(Return(net::ERR_IO_PENDING)); |
| 263 } |
| 264 |
| 331 // Sets up CastSocket::Connect to succeed. | 265 // Sets up CastSocket::Connect to succeed. |
| 332 // Connecting the socket also starts the read loop; so we add a mock | 266 // Connecting the socket also starts the read loop; we expect the call to |
| 333 // read result that returns IO_PENDING and callback is never fired. | 267 // Read(), but never fire the read callback. |
| 334 void ConnectHelper() { | 268 void ConnectHelper() { |
| 335 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); | 269 net::CompletionCallback connect_callback1; |
| 336 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK); | 270 net::CompletionCallback connect_callback2; |
| 337 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING); | |
| 338 | 271 |
| 272 ExpectTcpConnect(&connect_callback1, net::OK); |
| 273 ExpectSslConnect(&connect_callback2, net::OK); |
| 339 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | 274 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
| 275 ExpectSslRead(1); |
| 276 |
| 340 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | 277 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 341 base::Unretained(&handler_))); | 278 base::Unretained(&handler_))); |
| 342 RunPendingTasks(); | 279 |
| 280 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 281 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 343 } | 282 } |
| 344 | 283 |
| 345 protected: | 284 protected: |
| 346 // Runs all pending tasks in the message loop. | 285 MockTCPClientSocket& mock_tcp_socket() { |
| 347 void RunPendingTasks() { | 286 MockTCPClientSocket* mock_socket = socket_->mock_tcp_socket_; |
| 348 base::RunLoop run_loop; | 287 DCHECK(mock_socket); |
| 349 run_loop.RunUntilIdle(); | 288 return *mock_socket; |
| 350 } | 289 } |
| 351 | 290 |
| 352 base::MessageLoop message_loop_; | 291 MockSSLClientSocket& mock_ssl_socket() { |
| 292 MockSSLClientSocket* mock_socket = socket_->mock_ssl_socket_; |
| 293 DCHECK(mock_socket); |
| 294 return *mock_socket; |
| 295 } |
| 296 |
| 297 void CallOnChallengeEvent(int result) { |
| 298 socket_->OnChallengeEvent(result); |
| 299 } |
| 300 |
| 353 MockCastSocketDelegate mock_delegate_; | 301 MockCastSocketDelegate mock_delegate_; |
| 354 scoped_ptr<TestCastSocket> socket_; | 302 scoped_ptr<TestCastSocket> socket_; |
| 355 CompleteHandler handler_; | 303 CompleteHandler handler_; |
| 356 MessageInfo test_messages_[arraysize(kTestData)]; | 304 MessageInfo test_message_; |
| 357 CastMessage test_protos_[arraysize(kTestData)]; | 305 CastMessage test_proto_; |
| 358 std::string test_proto_strs_[arraysize(kTestData)]; | |
| 359 std::string auth_request_; | |
| 360 std::string auth_reply_; | |
| 361 }; | 306 }; |
| 362 | 307 |
| 363 // Tests URL parsing and validation. | 308 // Tests URL parsing and validation. |
| 364 TEST_F(CastSocketTest, TestCastURLs) { | 309 TEST_F(CastSocketTest, TestCastURLs) { |
| 365 CreateCastSocket(); | 310 CreateCastSocket(); |
| 366 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:8009"))); | 311 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:8009"))); |
| 367 EXPECT_FALSE(socket_->auth_required()); | 312 EXPECT_FALSE(socket_->auth_required()); |
| 368 EXPECT_EQ(socket_->ip_endpoint_.ToString(), "192.0.0.1:8009"); | 313 EXPECT_EQ(socket_->ip_endpoint_.ToString(), "192.0.0.1:8009"); |
| 369 | 314 |
| 370 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("casts://192.0.0.1:12345"))); | 315 EXPECT_TRUE(socket_->ParseChannelUrl(GURL("casts://192.0.0.1:12345"))); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 383 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast::"))); | 328 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast::"))); |
| 384 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1"))); | 329 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1"))); |
| 385 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://:"))); | 330 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://:"))); |
| 386 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:"))); | 331 EXPECT_FALSE(socket_->ParseChannelUrl(GURL("cast://192.0.0.1:"))); |
| 387 } | 332 } |
| 388 | 333 |
| 389 // Tests connecting and closing the socket. | 334 // Tests connecting and closing the socket. |
| 390 TEST_F(CastSocketTest, TestConnectAndClose) { | 335 TEST_F(CastSocketTest, TestConnectAndClose) { |
| 391 CreateCastSocket(); | 336 CreateCastSocket(); |
| 392 ConnectHelper(); | 337 ConnectHelper(); |
| 393 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 394 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 395 | 338 |
| 396 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); | 339 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); |
| 397 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, | 340 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, |
| 398 base::Unretained(&handler_))); | 341 base::Unretained(&handler_))); |
| 399 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | 342 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 400 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 343 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 401 } | 344 } |
| 402 | 345 |
| 403 // Tests that the following connection flow works: | 346 // Tests that the following connection flow works: |
| 404 // - TCP connection succeeds (async) | 347 // - TCP connection succeeds (async) |
| 405 // - SSL connection succeeds (async) | 348 // - SSL connection succeeds (async) |
| 406 TEST_F(CastSocketTest, TestConnect) { | 349 TEST_F(CastSocketTest, TestConnect) { |
| 407 CreateCastSocket(); | 350 CreateCastSocket(); |
| 408 socket_->SetupTcp1Connect(net::ASYNC, net::OK); | |
| 409 socket_->SetupSsl1Connect(net::ASYNC, net::OK); | |
| 410 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING); | |
| 411 | 351 |
| 352 net::CompletionCallback connect_callback1; |
| 353 net::CompletionCallback connect_callback2; |
| 354 |
| 355 ExpectTcpConnectPending(&connect_callback1); |
| 356 ExpectSslConnectPending(&connect_callback2); |
| 412 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | 357 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
| 358 ExpectSslRead(1); |
| 359 |
| 413 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | 360 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 414 base::Unretained(&handler_))); | 361 base::Unretained(&handler_))); |
| 415 RunPendingTasks(); | 362 connect_callback1.Run(net::OK); |
| 363 connect_callback2.Run(net::OK); |
| 416 | 364 |
| 417 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 365 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 418 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 366 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 419 } | 367 } |
| 420 | 368 |
| 421 // Test that the following connection flow works: | 369 // Test that the following connection flow works: |
| 422 // - TCP connection succeeds (async) | 370 // - TCP connection succeeds (async) |
| 423 // - SSL connection fails with cert error (async) | 371 // - SSL connection fails with cert error (async) |
| 424 // - Cert is extracted successfully | 372 // - Cert is extracted successfully |
| 425 // - Second TCP connection succeeds (async) | 373 // - Second TCP connection succeeds (async) |
| 426 // - Second SSL connection succeeds (async) | 374 // - Second SSL connection succeeds (async) |
| 427 TEST_F(CastSocketTest, TestConnectTwoStep) { | 375 TEST_F(CastSocketTest, TestTwoStepConnect) { |
| 428 CreateCastSocket(); | 376 CreateCastSocket(); |
| 429 socket_->SetupTcp1Connect(net::ASYNC, net::OK); | |
| 430 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID); | |
| 431 socket_->SetupTcp2Connect(net::ASYNC, net::OK); | |
| 432 socket_->SetupSsl2Connect(net::ASYNC, net::OK); | |
| 433 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING); | |
| 434 | 377 |
| 435 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | 378 // Expectations for the initial connect call |
| 379 net::CompletionCallback tcp_connect_callback1; |
| 380 net::CompletionCallback ssl_connect_callback1; |
| 381 |
| 382 ExpectTcpConnectPending(&tcp_connect_callback1); |
| 383 ExpectSslConnectPending(&ssl_connect_callback1); |
| 384 |
| 385 // Start connect flow |
| 436 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | 386 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 437 base::Unretained(&handler_))); | 387 base::Unretained(&handler_))); |
| 438 RunPendingTasks(); | 388 tcp_connect_callback1.Run(net::OK); |
| 389 |
| 390 // Expectations for the second connect call |
| 391 socket_->CreateNewSockets(); |
| 392 net::CompletionCallback tcp_connect_callback2; |
| 393 net::CompletionCallback ssl_connect_callback2; |
| 394 ExpectTcpConnectPending(&tcp_connect_callback2); |
| 395 ExpectSslConnectPending(&ssl_connect_callback2); |
| 396 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
| 397 ExpectSslRead(1); |
| 398 |
| 399 // Trigger callbacks for the first connect |
| 400 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID); |
| 401 |
| 402 // Trigger callbacks for the second connect |
| 403 tcp_connect_callback2.Run(net::OK); |
| 404 ssl_connect_callback2.Run(net::OK); |
| 439 | 405 |
| 440 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 406 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 441 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 407 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 442 } | 408 } |
| 443 | 409 |
| 444 // Test that the following connection flow works: | 410 // Test that the following connection flow works: |
| 445 // - TCP connection succeeds (async) | 411 // - TCP connection succeeds (async) |
| 446 // - SSL connection fails with cert error (async) | 412 // - SSL connection fails with cert error (async) |
| 447 // - Cert is extracted successfully | 413 // - Cert is extracted successfully |
| 448 // - Second TCP connection succeeds (async) | 414 // - Second TCP connection succeeds (async) |
| 449 // - Second SSL connection fails (async) | 415 // - Second SSL connection fails (async) |
| 450 // - The flow should NOT be tried again | 416 // - The flow should NOT be tried again |
| 451 TEST_F(CastSocketTest, TestConnectMaxTwoAttempts) { | 417 TEST_F(CastSocketTest, TestMaxTwoConnectAttempts) { |
| 452 CreateCastSocket(); | 418 CreateCastSocket(); |
| 453 socket_->SetupTcp1Connect(net::ASYNC, net::OK); | 419 |
| 454 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID); | 420 net::CompletionCallback tcp_connect_callback1; |
| 455 socket_->SetupTcp2Connect(net::ASYNC, net::OK); | 421 net::CompletionCallback ssl_connect_callback1; |
| 456 socket_->SetupSsl2Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID); | 422 |
| 457 | 423 // Expectations for the initial connect call |
| 424 ExpectTcpConnectPending(&tcp_connect_callback1); |
| 425 ExpectSslConnectPending(&ssl_connect_callback1); |
| 426 |
| 427 // Start connect flow |
| 428 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 429 base::Unretained(&handler_))); |
| 430 tcp_connect_callback1.Run(net::OK); |
| 431 |
| 432 socket_->CreateNewSockets(); |
| 433 net::CompletionCallback tcp_connect_callback2; |
| 434 net::CompletionCallback ssl_connect_callback2; |
| 435 |
| 436 // Expectations for the second connect call |
| 437 ExpectTcpConnectPending(&tcp_connect_callback2); |
| 438 ExpectSslConnectPending(&ssl_connect_callback2); |
| 458 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); | 439 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); |
| 459 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | 440 |
| 460 base::Unretained(&handler_))); | 441 // Trigger callbacks for the first connect |
| 461 RunPendingTasks(); | 442 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID); |
| 443 |
| 444 // Trigger callbacks for the second connect |
| 445 tcp_connect_callback2.Run(net::OK); |
| 446 ssl_connect_callback2.Run(net::ERR_CERT_AUTHORITY_INVALID); |
| 447 |
| 448 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 449 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); |
| 450 } |
| 451 |
| 452 // Test that when cert extraction fails the connection flow stops. |
| 453 TEST_F(CastSocketTest, TestCertExtractionFailure) { |
| 454 CreateCastSocket(); |
| 455 |
| 456 net::CompletionCallback connect_callback1; |
| 457 net::CompletionCallback connect_callback2; |
| 458 |
| 459 ExpectTcpConnectPending(&connect_callback1); |
| 460 ExpectSslConnectPending(&connect_callback2); |
| 461 |
| 462 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 463 base::Unretained(&handler_))); |
| 464 connect_callback1.Run(net::OK); |
| 465 |
| 466 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); |
| 467 |
| 468 // Set cert extraction to fail |
| 469 socket_->SetExtractCertResult(false); |
| 470 // Attempt to connect results in ERR_CERT_AUTHORTY_INVALID |
| 471 connect_callback2.Run(net::ERR_CERT_AUTHORITY_INVALID); |
| 462 | 472 |
| 463 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | 473 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 464 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); | 474 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); |
| 465 } | 475 } |
| 466 | 476 |
| 467 // Tests that the following connection flow works: | 477 // Tests that the following connection flow works: |
| 468 // - TCP connection succeeds (async) | 478 // - TCP connection succeeds (async) |
| 469 // - SSL connection fails with cert error (async) | 479 // - SSL connection fails with cert error (async) |
| 470 // - Cert is extracted successfully | 480 // - Cert is extracted successfully |
| 471 // - Second TCP connection succeeds (async) | 481 // - Second TCP connection succeeds (async) |
| 472 // - Second SSL connection succeeds (async) | 482 // - Second SSL connection succeeds (async) |
| 473 // - Challenge request is sent (async) | 483 // - Challenge request is sent (async) |
| 474 // - Challenge response is received (async) | 484 // - Challenge response is received (async) |
| 475 // - Credentials are verified successfuly | 485 // - Credentials are verified successfuly |
| 476 TEST_F(CastSocketTest, TestConnectFullSecureFlowAsync) { | 486 TEST_F(CastSocketTest, TestFullSecureConnectionFlowAsync) { |
| 477 CreateCastSocketSecure(); | 487 CreateCastSocketSecure(); |
| 478 | 488 |
| 479 socket_->SetupTcp1Connect(net::ASYNC, net::OK); | 489 net::CompletionCallback tcp_connect_callback1; |
| 480 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID); | 490 net::CompletionCallback ssl_connect_callback1; |
| 481 socket_->SetupTcp2Connect(net::ASYNC, net::OK); | 491 |
| 482 socket_->SetupSsl2Connect(net::ASYNC, net::OK); | 492 // Expectations for the initial connect call |
| 483 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_); | 493 ExpectTcpConnectPending(&tcp_connect_callback1); |
| 484 socket_->AddReadResultForMessage(net::ASYNC, auth_reply_); | 494 ExpectSslConnectPending(&ssl_connect_callback1); |
| 485 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING); | 495 |
| 486 | 496 // Start connect flow |
| 487 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | 497 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 488 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | 498 base::Unretained(&handler_))); |
| 489 base::Unretained(&handler_))); | 499 tcp_connect_callback1.Run(net::OK); |
| 490 RunPendingTasks(); | 500 |
| 491 | 501 socket_->CreateNewSockets(); |
| 492 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 502 net::CompletionCallback tcp_connect_callback2; |
| 493 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 503 net::CompletionCallback ssl_connect_callback2; |
| 494 } | 504 |
| 495 | 505 // Expectations for the second connect call |
| 496 // Same as TestFullSecureConnectionFlowAsync, but operations are synchronous. | 506 ExpectTcpConnectPending(&tcp_connect_callback2); |
| 497 TEST_F(CastSocketTest, TestConnectFullSecureFlowSync) { | 507 ExpectSslConnectPending(&ssl_connect_callback2); |
| 508 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
| 509 |
| 510 // Trigger callbacks for the first connect |
| 511 ssl_connect_callback1.Run(net::ERR_CERT_AUTHORITY_INVALID); |
| 512 |
| 513 // Trigger callbacks for the second connect |
| 514 tcp_connect_callback2.Run(net::OK); |
| 515 ssl_connect_callback2.Run(net::OK); |
| 516 |
| 517 // Trigger callbacks for auth events. |
| 518 CallOnChallengeEvent(net::OK); // Sent challenge |
| 519 CallOnChallengeEvent(net::OK); // Received reply |
| 520 |
| 521 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 522 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 523 } |
| 524 |
| 525 // Same as TestFullSecureConnectionFlowAsync, but operations are synchronous. |
| 526 TEST_F(CastSocketTest, TestFullSecureConnectionFlowSync) { |
| 498 CreateCastSocketSecure(); | 527 CreateCastSocketSecure(); |
| 499 | 528 |
| 500 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); | 529 net::CompletionCallback tcp_connect_callback; |
| 501 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_CERT_AUTHORITY_INVALID); | 530 net::CompletionCallback ssl_connect_callback; |
| 502 socket_->SetupTcp2Connect(net::SYNCHRONOUS, net::OK); | 531 |
| 503 socket_->SetupSsl2Connect(net::SYNCHRONOUS, net::OK); | 532 // Expectations for the connect calls |
| 504 socket_->AddWriteResultForMessage(net::SYNCHRONOUS, auth_request_); | 533 ExpectTcpConnect(&tcp_connect_callback, net::OK); |
| 505 socket_->AddReadResultForMessage(net::SYNCHRONOUS, auth_reply_); | 534 ExpectSslConnect(&ssl_connect_callback, net::OK); |
| 506 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING); | 535 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
| 507 | 536 |
| 508 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); | 537 socket_->SetSendAuthChallengeResult(net::OK); |
| 509 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | 538 socket_->SetReadAuthChallengeReplyResult(net::OK); |
| 510 base::Unretained(&handler_))); | 539 |
| 511 RunPendingTasks(); | 540 // Start connect flow |
| 512 | 541 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 513 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 542 base::Unretained(&handler_))); |
| 514 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 543 |
| 515 } | 544 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 516 | 545 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 517 // Test connection error - TCP connect fails (async) | 546 } |
| 518 TEST_F(CastSocketTest, TestConnectTcpConnectErrorAsync) { | 547 |
| 519 CreateCastSocketSecure(); | 548 // Tests writing a single message where the completion is signaled via |
| 520 | 549 // callback. |
| 521 socket_->SetupTcp1Connect(net::ASYNC, net::ERR_FAILED); | 550 TEST_F(CastSocketTest, TestWriteViaCallback) { |
| 522 | 551 CreateCastSocket(); |
| 523 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); | |
| 524 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
| 525 base::Unretained(&handler_))); | |
| 526 RunPendingTasks(); | |
| 527 | |
| 528 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 529 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); | |
| 530 } | |
| 531 | |
| 532 // Test connection error - TCP connect fails (sync) | |
| 533 TEST_F(CastSocketTest, TestConnectTcpConnectErrorSync) { | |
| 534 CreateCastSocketSecure(); | |
| 535 | |
| 536 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::ERR_FAILED); | |
| 537 | |
| 538 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); | |
| 539 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
| 540 base::Unretained(&handler_))); | |
| 541 RunPendingTasks(); | |
| 542 | |
| 543 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 544 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); | |
| 545 } | |
| 546 | |
| 547 // Test connection error - SSL connect fails (async) | |
| 548 TEST_F(CastSocketTest, TestConnectSslConnectErrorAsync) { | |
| 549 CreateCastSocketSecure(); | |
| 550 | |
| 551 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); | |
| 552 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_FAILED); | |
| 553 | |
| 554 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); | |
| 555 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
| 556 base::Unretained(&handler_))); | |
| 557 RunPendingTasks(); | |
| 558 | |
| 559 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 560 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); | |
| 561 } | |
| 562 | |
| 563 // Test connection error - SSL connect fails (async) | |
| 564 TEST_F(CastSocketTest, TestConnectSslConnectErrorSync) { | |
| 565 CreateCastSocketSecure(); | |
| 566 | |
| 567 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); | |
| 568 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_FAILED); | |
| 569 | |
| 570 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); | |
| 571 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
| 572 base::Unretained(&handler_))); | |
| 573 RunPendingTasks(); | |
| 574 | |
| 575 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 576 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); | |
| 577 } | |
| 578 | |
| 579 // Test connection error - cert extraction error (async) | |
| 580 TEST_F(CastSocketTest, TestConnectCertExtractionErrorAsync) { | |
| 581 CreateCastSocket(); | |
| 582 socket_->SetupTcp1Connect(net::ASYNC, net::OK); | |
| 583 socket_->SetupSsl1Connect(net::ASYNC, net::ERR_CERT_AUTHORITY_INVALID); | |
| 584 // Set cert extraction to fail | |
| 585 socket_->SetExtractCertResult(false); | |
| 586 | |
| 587 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); | |
| 588 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
| 589 base::Unretained(&handler_))); | |
| 590 RunPendingTasks(); | |
| 591 | |
| 592 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 593 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); | |
| 594 } | |
| 595 | |
| 596 // Test connection error - cert extraction error (sync) | |
| 597 TEST_F(CastSocketTest, TestConnectCertExtractionErrorSync) { | |
| 598 CreateCastSocket(); | |
| 599 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); | |
| 600 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::ERR_CERT_AUTHORITY_INVALID); | |
| 601 // Set cert extraction to fail | |
| 602 socket_->SetExtractCertResult(false); | |
| 603 | |
| 604 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_CERT_AUTHORITY_INVALID)); | |
| 605 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
| 606 base::Unretained(&handler_))); | |
| 607 RunPendingTasks(); | |
| 608 | |
| 609 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 610 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); | |
| 611 } | |
| 612 | |
| 613 // Test connection error - challenge send fails | |
| 614 TEST_F(CastSocketTest, TestConnectChallengeSendError) { | |
| 615 CreateCastSocketSecure(); | |
| 616 | |
| 617 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); | |
| 618 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK); | |
| 619 socket_->AddWriteResult(net::SYNCHRONOUS, net::ERR_FAILED); | |
| 620 | |
| 621 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); | |
| 622 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
| 623 base::Unretained(&handler_))); | |
| 624 RunPendingTasks(); | |
| 625 | |
| 626 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 627 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); | |
| 628 } | |
| 629 | |
| 630 // Test connection error - challenge reply receive fails | |
| 631 TEST_F(CastSocketTest, TestConnectChallengeReplyReceiveError) { | |
| 632 CreateCastSocketSecure(); | |
| 633 | |
| 634 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); | |
| 635 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK); | |
| 636 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_); | |
| 637 socket_->AddReadResult(net::SYNCHRONOUS, net::ERR_FAILED); | |
| 638 | |
| 639 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); | |
| 640 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
| 641 base::Unretained(&handler_))); | |
| 642 RunPendingTasks(); | |
| 643 | |
| 644 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 645 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); | |
| 646 } | |
| 647 | |
| 648 // Test connection error - challenge reply verification fails | |
| 649 TEST_F(CastSocketTest, TestConnectChallengeVerificationFails) { | |
| 650 CreateCastSocketSecure(); | |
| 651 | |
| 652 socket_->SetupTcp1Connect(net::SYNCHRONOUS, net::OK); | |
| 653 socket_->SetupSsl1Connect(net::SYNCHRONOUS, net::OK); | |
| 654 socket_->AddWriteResultForMessage(net::ASYNC, auth_request_); | |
| 655 socket_->AddReadResultForMessage(net::ASYNC, auth_reply_); | |
| 656 socket_->AddReadResult(net::ASYNC, net::ERR_IO_PENDING); | |
| 657 socket_->SetVerifyChallengeResult(false); | |
| 658 | |
| 659 EXPECT_CALL(handler_, OnConnectComplete(net::ERR_FAILED)); | |
| 660 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, | |
| 661 base::Unretained(&handler_))); | |
| 662 RunPendingTasks(); | |
| 663 | |
| 664 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 665 EXPECT_EQ(cast_channel::CHANNEL_ERROR_CONNECT_ERROR, socket_->error_state()); | |
| 666 } | |
| 667 | |
| 668 // Test write success - single message (async) | |
| 669 TEST_F(CastSocketTest, TestWriteAsync) { | |
| 670 CreateCastSocket(); | |
| 671 socket_->AddWriteResultForMessage(net::ASYNC, test_proto_strs_[0]); | |
| 672 ConnectHelper(); | 552 ConnectHelper(); |
| 673 | 553 |
| 674 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size())); | 554 net::CompletionCallback write_callback; |
| 675 socket_->SendMessage(test_messages_[0], | 555 |
| 556 EXPECT_CALL(mock_ssl_socket(), |
| 557 Write(A<net::IOBuffer*>(), |
| 558 39, |
| 559 A<const net::CompletionCallback&>())) |
| 560 .Times(1) |
| 561 .WillOnce(DoAll(SaveArg<2>(&write_callback), |
| 562 Return(net::ERR_IO_PENDING))); |
| 563 EXPECT_CALL(handler_, OnWriteComplete(39)); |
| 564 socket_->SendMessage(test_message_, |
| 676 base::Bind(&CompleteHandler::OnWriteComplete, | 565 base::Bind(&CompleteHandler::OnWriteComplete, |
| 677 base::Unretained(&handler_))); | 566 base::Unretained(&handler_))); |
| 678 RunPendingTasks(); | 567 write_callback.Run(39); |
| 679 | 568 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 680 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 569 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 681 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 570 } |
| 682 } | 571 |
| 683 | 572 // Tests writing a single message where the Write() returns directly. |
| 684 // Test write success - single message (sync) | 573 TEST_F(CastSocketTest, TestWrite) { |
| 685 TEST_F(CastSocketTest, TestWriteSync) { | 574 CreateCastSocket(); |
| 686 CreateCastSocket(); | |
| 687 socket_->AddWriteResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0]); | |
| 688 ConnectHelper(); | 575 ConnectHelper(); |
| 689 | 576 |
| 690 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size())); | 577 EXPECT_CALL(mock_ssl_socket(), |
| 691 socket_->SendMessage(test_messages_[0], | 578 Write(A<net::IOBuffer*>(), |
| 579 39, |
| 580 A<const net::CompletionCallback&>())) |
| 581 .Times(1) |
| 582 .WillOnce(Return(39)); |
| 583 EXPECT_CALL(handler_, OnWriteComplete(39)); |
| 584 socket_->SendMessage(test_message_, |
| 585 base::Bind(&CompleteHandler::OnWriteComplete, |
| 586 base::Unretained(&handler_))); |
| 587 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 588 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 589 } |
| 590 |
| 591 // Tests writing multiple messages. |
| 592 TEST_F(CastSocketTest, TestWriteMany) { |
| 593 CreateCastSocket(); |
| 594 ConnectHelper(); |
| 595 std::string messages[4]; |
| 596 messages[0] = "Hello, World!"; |
| 597 messages[1] = "Goodbye, World!"; |
| 598 messages[2] = "Hello, Sky!"; |
| 599 messages[3] = "Goodbye, Volcano!"; |
| 600 int sizes[4] = {39, 41, 37, 43}; |
| 601 MessageInfo message_info[4]; |
| 602 net::CompletionCallback write_callback; |
| 603 |
| 604 for (int i = 0; i < 4; i++) { |
| 605 EXPECT_CALL(mock_ssl_socket(), |
| 606 Write(A<net::IOBuffer*>(), |
| 607 sizes[i], |
| 608 A<const net::CompletionCallback&>())) |
| 609 .WillRepeatedly(DoAll(SaveArg<2>(&write_callback), |
| 610 Return(net::ERR_IO_PENDING))); |
| 611 EXPECT_CALL(handler_, OnWriteComplete(sizes[i])); |
| 612 } |
| 613 |
| 614 for (int i = 0; i < 4; i++) { |
| 615 message_info[i].namespace_ = "urn:test"; |
| 616 message_info[i].source_id = "1"; |
| 617 message_info[i].destination_id = "2"; |
| 618 message_info[i].data.reset(new base::StringValue(messages[i])); |
| 619 socket_->SendMessage(message_info[i], |
| 620 base::Bind(&CompleteHandler::OnWriteComplete, |
| 621 base::Unretained(&handler_))); |
| 622 } |
| 623 for (int i = 0; i < 4; i++) { |
| 624 write_callback.Run(sizes[i]); |
| 625 } |
| 626 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 627 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 628 } |
| 629 |
| 630 // Tests error on writing. |
| 631 TEST_F(CastSocketTest, TestWriteError) { |
| 632 CreateCastSocket(); |
| 633 ConnectHelper(); |
| 634 net::CompletionCallback write_callback; |
| 635 |
| 636 EXPECT_CALL(mock_ssl_socket(), |
| 637 Write(A<net::IOBuffer*>(), |
| 638 39, |
| 639 A<const net::CompletionCallback&>())) |
| 640 .Times(1) |
| 641 .WillOnce(DoAll(SaveArg<2>(&write_callback), |
| 642 Return(net::ERR_SOCKET_NOT_CONNECTED))); |
| 643 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_SOCKET_NOT_CONNECTED)); |
| 644 EXPECT_CALL(mock_delegate_, |
| 645 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); |
| 646 socket_->SendMessage(test_message_, |
| 692 base::Bind(&CompleteHandler::OnWriteComplete, | 647 base::Bind(&CompleteHandler::OnWriteComplete, |
| 693 base::Unretained(&handler_))); | 648 base::Unretained(&handler_))); |
| 694 RunPendingTasks(); | 649 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 695 | 650 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); |
| 696 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 651 } |
| 697 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 652 |
| 698 } | 653 // Tests reading a single message. |
| 699 | 654 TEST_F(CastSocketTest, TestRead) { |
| 700 // Test write success - single message sent in multiple chunks (async) | 655 CreateCastSocket(); |
| 701 TEST_F(CastSocketTest, TestWriteChunkedAsync) { | 656 |
| 702 CreateCastSocket(); | 657 net::CompletionCallback connect_callback1; |
| 703 socket_->AddWriteResultForMessage(net::ASYNC, test_proto_strs_[0], 2); | 658 net::CompletionCallback connect_callback2; |
| 704 ConnectHelper(); | 659 net::CompletionCallback read_callback; |
| 705 | 660 |
| 706 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size())); | 661 std::string message_data; |
| 707 socket_->SendMessage(test_messages_[0], | 662 ASSERT_TRUE(CastSocket::Serialize(test_proto_, &message_data)); |
| 708 base::Bind(&CompleteHandler::OnWriteComplete, | 663 |
| 709 base::Unretained(&handler_))); | 664 ExpectTcpConnect(&connect_callback1, net::ERR_IO_PENDING); |
| 710 RunPendingTasks(); | 665 ExpectSslConnect(&connect_callback2, net::ERR_IO_PENDING); |
| 711 | 666 |
| 712 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 667 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
| 713 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 668 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(), |
| 714 } | 669 A<int>(), |
| 715 | 670 A<const net::CompletionCallback&>())) |
| 716 // Test write success - single message sent in multiple chunks (sync) | 671 .Times(3) |
| 717 TEST_F(CastSocketTest, TestWriteChunkedSync) { | 672 .WillRepeatedly(DoAll(SaveArg<2>(&read_callback), |
| 718 CreateCastSocket(); | 673 Return(net::ERR_IO_PENDING))); |
| 719 socket_->AddWriteResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0], 2); | 674 |
| 720 ConnectHelper(); | 675 // Expect the test message to be read and invoke the delegate. |
| 721 | 676 EXPECT_CALL(mock_delegate_, |
| 722 EXPECT_CALL(handler_, OnWriteComplete(test_proto_strs_[0].size())); | 677 OnMessage(socket_.get(), A<const MessageInfo&>())); |
| 723 socket_->SendMessage(test_messages_[0], | 678 |
| 724 base::Bind(&CompleteHandler::OnWriteComplete, | 679 // Connect the socket. |
| 725 base::Unretained(&handler_))); | 680 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 726 RunPendingTasks(); | 681 base::Unretained(&handler_))); |
| 727 | 682 connect_callback1.Run(net::OK); |
| 728 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 683 connect_callback2.Run(net::OK); |
| 729 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 684 |
| 730 } | 685 // Put the test header and message into the io_buffers and invoke the read |
| 731 | 686 // callbacks. |
| 732 // Test write success - multiple messages (async) | 687 memcpy(socket_->header_read_buffer_->StartOfBuffer(), |
| 733 TEST_F(CastSocketTest, TestWriteManyAsync) { | 688 message_data.c_str(), 4); |
| 734 CreateCastSocket(); | 689 read_callback.Run(4); |
| 735 for (size_t i = 0; i < arraysize(test_messages_); i++) { | 690 memcpy(socket_->body_read_buffer_->StartOfBuffer(), |
| 736 size_t msg_size = test_proto_strs_[i].size(); | 691 message_data.c_str() + 4, 35); |
| 737 socket_->AddWriteResult(net::ASYNC, msg_size); | 692 read_callback.Run(35); |
| 738 EXPECT_CALL(handler_, OnWriteComplete(msg_size)); | 693 |
| 739 } | 694 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 740 ConnectHelper(); | 695 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 741 | 696 } |
| 742 for (size_t i = 0; i < arraysize(test_messages_); i++) { | 697 |
| 743 socket_->SendMessage(test_messages_[i], | 698 // Tests reading multiple messages. |
| 744 base::Bind(&CompleteHandler::OnWriteComplete, | 699 TEST_F(CastSocketTest, TestReadMany) { |
| 745 base::Unretained(&handler_))); | 700 CreateCastSocket(); |
| 746 } | 701 |
| 747 RunPendingTasks(); | 702 net::CompletionCallback connect_callback1; |
| 748 | 703 net::CompletionCallback connect_callback2; |
| 749 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 704 net::CompletionCallback read_callback; |
| 750 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 705 |
| 751 } | 706 std::string messages[4]; |
| 752 | 707 messages[0] = "Hello, World!"; |
| 753 // Test write success - multiple messages (sync) | 708 messages[1] = "Goodbye, World!"; |
| 754 TEST_F(CastSocketTest, TestWriteManySync) { | 709 messages[2] = "Hello, Sky!"; |
| 755 CreateCastSocket(); | 710 messages[3] = "Goodbye, Volcano!"; |
| 756 for (size_t i = 0; i < arraysize(test_messages_); i++) { | 711 int sizes[4] = {35, 37, 33, 39}; |
| 757 size_t msg_size = test_proto_strs_[i].size(); | 712 std::string message_data[4]; |
| 758 socket_->AddWriteResult(net::SYNCHRONOUS, msg_size); | 713 |
| 759 EXPECT_CALL(handler_, OnWriteComplete(msg_size)); | 714 // Set up test data |
| 760 } | 715 for (int i = 0; i < 4; i++) { |
| 761 ConnectHelper(); | 716 test_proto_.set_payload_utf8(messages[i]); |
| 762 | 717 ASSERT_TRUE(CastSocket::Serialize(test_proto_, &message_data[i])); |
| 763 for (size_t i = 0; i < arraysize(test_messages_); i++) { | 718 } |
| 764 socket_->SendMessage(test_messages_[i], | 719 |
| 765 base::Bind(&CompleteHandler::OnWriteComplete, | 720 ExpectTcpConnect(&connect_callback1, net::ERR_IO_PENDING); |
| 766 base::Unretained(&handler_))); | 721 ExpectSslConnect(&connect_callback2, net::ERR_IO_PENDING); |
| 767 } | 722 |
| 768 RunPendingTasks(); | 723 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
| 769 | 724 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(), |
| 770 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 725 A<int>(), |
| 771 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 726 A<const net::CompletionCallback&>())) |
| 772 } | 727 .Times(9) |
| 773 | 728 .WillRepeatedly(DoAll(SaveArg<2>(&read_callback), |
| 774 // Test write error - not connected | 729 Return(net::ERR_IO_PENDING))); |
| 775 TEST_F(CastSocketTest, TestWriteErrorNotConnected) { | 730 |
| 776 CreateCastSocket(); | 731 // Expect the test messages to be read and invoke the delegate. |
| 777 | 732 EXPECT_CALL(mock_delegate_, OnMessage(socket_.get(), |
| 778 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); | 733 A<const MessageInfo&>())) |
| 779 socket_->SendMessage(test_messages_[0], | 734 .Times(4); |
| 780 base::Bind(&CompleteHandler::OnWriteComplete, | 735 |
| 781 base::Unretained(&handler_))); | 736 // Connect the socket. |
| 782 | 737 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 783 EXPECT_EQ(cast_channel::READY_STATE_NONE, socket_->ready_state()); | 738 base::Unretained(&handler_))); |
| 784 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 739 connect_callback1.Run(net::OK); |
| 785 } | 740 connect_callback2.Run(net::OK); |
| 786 | 741 |
| 787 // Test write error - very large message | 742 // Put the test headers and messages into the io_buffer and invoke the read |
| 788 TEST_F(CastSocketTest, TestWriteErrorLargeMessage) { | 743 // callbacks. |
| 789 CreateCastSocket(); | 744 for (int i = 0; i < 4; i++) { |
| 790 ConnectHelper(); | 745 memcpy(socket_->header_read_buffer_->StartOfBuffer(), |
| 791 | 746 message_data[i].c_str(), 4); |
| 792 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); | 747 read_callback.Run(4); |
| 793 size_t size = kMaxMessageSize + 1; | 748 memcpy(socket_->body_read_buffer_->StartOfBuffer(), |
| 794 test_messages_[0].data.reset( | 749 message_data[i].c_str() + 4, sizes[i]); |
| 795 new base::StringValue(std::string(size, 'a'))); | 750 read_callback.Run(sizes[i]); |
| 796 socket_->SendMessage(test_messages_[0], | 751 } |
| 797 base::Bind(&CompleteHandler::OnWriteComplete, | 752 |
| 798 base::Unretained(&handler_))); | 753 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 799 | 754 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 800 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 755 } |
| 801 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 756 |
| 802 | 757 // Tests error on reading. |
| 803 } | 758 TEST_F(CastSocketTest, TestReadError) { |
| 804 | 759 CreateCastSocket(); |
| 805 // Test write error - network error (sync) | 760 |
| 806 TEST_F(CastSocketTest, TestWriteNetworkErrorSync) { | 761 net::CompletionCallback connect_callback1; |
| 807 CreateCastSocket(); | 762 net::CompletionCallback connect_callback2; |
| 808 socket_->AddWriteResult(net::SYNCHRONOUS, net::ERR_FAILED); | 763 net::CompletionCallback read_callback; |
| 809 ConnectHelper(); | 764 |
| 810 | 765 ExpectTcpConnect(&connect_callback1, net::ERR_IO_PENDING); |
| 811 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); | 766 ExpectSslConnect(&connect_callback2, net::ERR_IO_PENDING); |
| 767 |
| 768 EXPECT_CALL(handler_, OnConnectComplete(net::OK)); |
| 769 EXPECT_CALL(mock_ssl_socket(), Read(A<net::IOBuffer*>(), |
| 770 A<int>(), |
| 771 A<const net::CompletionCallback&>())) |
| 772 .WillOnce(DoAll(SaveArg<2>(&read_callback), |
| 773 Return(net::ERR_IO_PENDING))); |
| 812 EXPECT_CALL(mock_delegate_, | 774 EXPECT_CALL(mock_delegate_, |
| 813 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); | 775 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); |
| 814 socket_->SendMessage(test_messages_[0], | 776 |
| 815 base::Bind(&CompleteHandler::OnWriteComplete, | 777 // Connect the socket. |
| 816 base::Unretained(&handler_))); | 778 socket_->Connect(base::Bind(&CompleteHandler::OnConnectComplete, |
| 817 RunPendingTasks(); | 779 base::Unretained(&handler_))); |
| 780 connect_callback1.Run(net::OK); |
| 781 connect_callback2.Run(net::OK); |
| 782 |
| 783 // Cause an error. |
| 784 read_callback.Run(net::ERR_SOCKET_NOT_CONNECTED); |
| 818 | 785 |
| 819 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | 786 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 820 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); | 787 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); |
| 821 } | 788 } |
| 822 | 789 |
| 823 // Test write error - network error (async) | |
| 824 TEST_F(CastSocketTest, TestWriteErrorAsync) { | |
| 825 CreateCastSocket(); | |
| 826 socket_->AddWriteResult(net::ASYNC, net::ERR_FAILED); | |
| 827 ConnectHelper(); | |
| 828 | |
| 829 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); | |
| 830 EXPECT_CALL(mock_delegate_, | |
| 831 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); | |
| 832 socket_->SendMessage(test_messages_[0], | |
| 833 base::Bind(&CompleteHandler::OnWriteComplete, | |
| 834 base::Unretained(&handler_))); | |
| 835 RunPendingTasks(); | |
| 836 | |
| 837 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 838 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); | |
| 839 } | |
| 840 | |
| 841 // Test write error - 0 bytes written should be considered an error | |
| 842 TEST_F(CastSocketTest, TestWriteErrorZeroBytesWritten) { | |
| 843 CreateCastSocket(); | |
| 844 socket_->AddWriteResult(net::SYNCHRONOUS, 0); | |
| 845 ConnectHelper(); | |
| 846 | |
| 847 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); | |
| 848 EXPECT_CALL(mock_delegate_, | |
| 849 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); | |
| 850 socket_->SendMessage(test_messages_[0], | |
| 851 base::Bind(&CompleteHandler::OnWriteComplete, | |
| 852 base::Unretained(&handler_))); | |
| 853 RunPendingTasks(); | |
| 854 | |
| 855 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 856 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); | |
| 857 } | |
| 858 | |
| 859 // Test that when an error occurrs in one write, write callback is invoked for | |
| 860 // all pending writes with the error | |
| 861 TEST_F(CastSocketTest, TestWriteErrorWithMultiplePendingWritesAsync) { | |
| 862 CreateCastSocket(); | |
| 863 socket_->AddWriteResult(net::ASYNC, net::ERR_SOCKET_NOT_CONNECTED); | |
| 864 ConnectHelper(); | |
| 865 | |
| 866 const int num_writes = arraysize(test_messages_); | |
| 867 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_SOCKET_NOT_CONNECTED)) | |
| 868 .Times(num_writes); | |
| 869 EXPECT_CALL(mock_delegate_, | |
| 870 OnError(socket_.get(), cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); | |
| 871 for (int i = 0; i < num_writes; i++) { | |
| 872 socket_->SendMessage(test_messages_[i], | |
| 873 base::Bind(&CompleteHandler::OnWriteComplete, | |
| 874 base::Unretained(&handler_))); | |
| 875 } | |
| 876 RunPendingTasks(); | |
| 877 | |
| 878 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 879 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); | |
| 880 } | |
| 881 | |
| 882 // Test read success - single message (async) | |
| 883 TEST_F(CastSocketTest, TestReadAsync) { | |
| 884 CreateCastSocket(); | |
| 885 socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[0]); | |
| 886 EXPECT_CALL(mock_delegate_, | |
| 887 OnMessage(socket_.get(), A<const MessageInfo&>())); | |
| 888 ConnectHelper(); | |
| 889 | |
| 890 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 891 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 892 } | |
| 893 | |
| 894 // Test read success - single message (sync) | |
| 895 TEST_F(CastSocketTest, TestReadSync) { | |
| 896 CreateCastSocket(); | |
| 897 socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0]); | |
| 898 EXPECT_CALL(mock_delegate_, | |
| 899 OnMessage(socket_.get(), A<const MessageInfo&>())); | |
| 900 ConnectHelper(); | |
| 901 | |
| 902 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 903 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 904 } | |
| 905 | |
| 906 // Test read success - single message received in multiple chunks (async) | |
| 907 TEST_F(CastSocketTest, TestReadChunkedAsync) { | |
| 908 CreateCastSocket(); | |
| 909 socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[0], 2); | |
| 910 EXPECT_CALL(mock_delegate_, | |
| 911 OnMessage(socket_.get(), A<const MessageInfo&>())); | |
| 912 ConnectHelper(); | |
| 913 | |
| 914 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 915 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 916 } | |
| 917 | |
| 918 // Test read success - single message received in multiple chunks (sync) | |
| 919 TEST_F(CastSocketTest, TestReadChunkedSync) { | |
| 920 CreateCastSocket(); | |
| 921 socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[0], 2); | |
| 922 EXPECT_CALL(mock_delegate_, | |
| 923 OnMessage(socket_.get(), A<const MessageInfo&>())); | |
| 924 ConnectHelper(); | |
| 925 | |
| 926 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 927 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 928 } | |
| 929 | |
| 930 // Test read success - multiple messages (async) | |
| 931 TEST_F(CastSocketTest, TestReadManyAsync) { | |
| 932 CreateCastSocket(); | |
| 933 size_t num_reads = arraysize(test_proto_strs_); | |
| 934 for (size_t i = 0; i < num_reads; i++) | |
| 935 socket_->AddReadResultForMessage(net::ASYNC, test_proto_strs_[i]); | |
| 936 EXPECT_CALL(mock_delegate_, | |
| 937 OnMessage(socket_.get(), A<const MessageInfo&>())) | |
| 938 .Times(num_reads); | |
| 939 ConnectHelper(); | |
| 940 | |
| 941 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 942 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 943 } | |
| 944 | |
| 945 // Test read success - multiple messages (sync) | |
| 946 TEST_F(CastSocketTest, TestReadManySync) { | |
| 947 CreateCastSocket(); | |
| 948 size_t num_reads = arraysize(test_proto_strs_); | |
| 949 for (size_t i = 0; i < num_reads; i++) | |
| 950 socket_->AddReadResultForMessage(net::SYNCHRONOUS, test_proto_strs_[i]); | |
| 951 EXPECT_CALL(mock_delegate_, | |
| 952 OnMessage(socket_.get(), A<const MessageInfo&>())) | |
| 953 .Times(num_reads); | |
| 954 ConnectHelper(); | |
| 955 | |
| 956 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | |
| 957 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | |
| 958 } | |
| 959 | |
| 960 // Test read error - network error (async) | |
| 961 TEST_F(CastSocketTest, TestReadErrorAsync) { | |
| 962 CreateCastSocket(); | |
| 963 socket_->AddReadResult(net::ASYNC, net::ERR_SOCKET_NOT_CONNECTED); | |
| 964 EXPECT_CALL(mock_delegate_, | |
| 965 OnError(socket_.get(), | |
| 966 cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); | |
| 967 ConnectHelper(); | |
| 968 | |
| 969 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 970 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); | |
| 971 } | |
| 972 | |
| 973 // Test read error - network error (sync) | |
| 974 TEST_F(CastSocketTest, TestReadErrorSync) { | |
| 975 CreateCastSocket(); | |
| 976 socket_->AddReadResult(net::SYNCHRONOUS, net::ERR_SOCKET_NOT_CONNECTED); | |
| 977 EXPECT_CALL(mock_delegate_, | |
| 978 OnError(socket_.get(), | |
| 979 cast_channel::CHANNEL_ERROR_SOCKET_ERROR)); | |
| 980 ConnectHelper(); | |
| 981 | |
| 982 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 983 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); | |
| 984 } | |
| 985 | |
| 986 // Test read error - header parse error | |
| 987 TEST_F(CastSocketTest, TestReadHeaderParseError) { | |
| 988 CreateCastSocket(); | |
| 989 uint32 body_size = base::HostToNet32(kMaxMessageSize + 1); | |
| 990 // TODO(munjal): Add a method to cast_message_util.h to serialize messages | |
| 991 char header[sizeof(body_size)]; | |
| 992 memcpy(&header, &body_size, arraysize(header)); | |
| 993 socket_->AddReadResult(net::SYNCHRONOUS, header, arraysize(header)); | |
| 994 EXPECT_CALL(mock_delegate_, | |
| 995 OnError(socket_.get(), | |
| 996 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE)); | |
| 997 ConnectHelper(); | |
| 998 | |
| 999 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 1000 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, | |
| 1001 socket_->error_state()); | |
| 1002 } | |
| 1003 | |
| 1004 // Test read error - body parse error | |
| 1005 TEST_F(CastSocketTest, TestReadBodyParseError) { | |
| 1006 CreateCastSocket(); | |
| 1007 char body[] = "some body"; | |
| 1008 uint32 body_size = base::HostToNet32(arraysize(body)); | |
| 1009 char header[sizeof(body_size)]; | |
| 1010 memcpy(&header, &body_size, arraysize(header)); | |
| 1011 socket_->AddReadResult(net::SYNCHRONOUS, header, arraysize(header)); | |
| 1012 socket_->AddReadResult(net::SYNCHRONOUS, body, arraysize(body)); | |
| 1013 EXPECT_CALL(mock_delegate_, | |
| 1014 OnError(socket_.get(), | |
| 1015 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE)); | |
| 1016 ConnectHelper(); | |
| 1017 | |
| 1018 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | |
| 1019 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, | |
| 1020 socket_->error_state()); | |
| 1021 } | |
| 1022 | |
| 1023 } // namespace cast_channel | 790 } // namespace cast_channel |
| 1024 } // namespace api | 791 } // namespace api |
| 1025 } // namespace extensions | 792 } // namespace extensions |
| OLD | NEW |