| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "extensions/browser/api/cast_channel/cast_socket.h" | 5 #include "extensions/browser/api/cast_channel/cast_socket.h" |
| 6 | 6 |
| 7 #include <vector> |
| 8 |
| 7 #include "base/memory/weak_ptr.h" | 9 #include "base/memory/weak_ptr.h" |
| 8 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| 9 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
| 10 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 11 #include "base/sys_byteorder.h" | 13 #include "base/sys_byteorder.h" |
| 12 #include "base/test/simple_test_tick_clock.h" | 14 #include "base/test/simple_test_tick_clock.h" |
| 13 #include "base/timer/mock_timer.h" | 15 #include "base/timer/mock_timer.h" |
| 14 #include "extensions/browser/api/cast_channel/cast_channel.pb.h" | 16 #include "extensions/browser/api/cast_channel/cast_channel.pb.h" |
| 15 #include "extensions/browser/api/cast_channel/cast_message_util.h" | 17 #include "extensions/browser/api/cast_channel/cast_message_util.h" |
| 18 #include "extensions/browser/api/cast_channel/cast_socket_framer.h" |
| 16 #include "extensions/browser/api/cast_channel/logger.h" | 19 #include "extensions/browser/api/cast_channel/logger.h" |
| 17 #include "net/base/address_list.h" | 20 #include "net/base/address_list.h" |
| 18 #include "net/base/capturing_net_log.h" | 21 #include "net/base/capturing_net_log.h" |
| 19 #include "net/base/net_errors.h" | 22 #include "net/base/net_errors.h" |
| 20 #include "net/base/net_util.h" | 23 #include "net/base/net_util.h" |
| 21 #include "net/socket/socket_test_util.h" | 24 #include "net/socket/socket_test_util.h" |
| 22 #include "net/socket/ssl_client_socket.h" | 25 #include "net/socket/ssl_client_socket.h" |
| 23 #include "net/socket/tcp_client_socket.h" | 26 #include "net/socket/tcp_client_socket.h" |
| 24 #include "net/ssl/ssl_info.h" | 27 #include "net/ssl/ssl_info.h" |
| 25 #include "testing/gmock/include/gmock/gmock.h" | 28 #include "testing/gmock/include/gmock/gmock.h" |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 net::IPAddressNumber number; | 194 net::IPAddressNumber number; |
| 192 number.push_back(192); | 195 number.push_back(192); |
| 193 number.push_back(0); | 196 number.push_back(0); |
| 194 number.push_back(0); | 197 number.push_back(0); |
| 195 number.push_back(1); | 198 number.push_back(1); |
| 196 return net::IPEndPoint(number, 8009); | 199 return net::IPEndPoint(number, 8009); |
| 197 } | 200 } |
| 198 | 201 |
| 199 // Returns the size of the body (in bytes) of the given serialized message. | 202 // Returns the size of the body (in bytes) of the given serialized message. |
| 200 static size_t ComputeBodySize(const std::string& msg) { | 203 static size_t ComputeBodySize(const std::string& msg) { |
| 201 return msg.length() - CastSocket::MessageHeader::header_size(); | 204 return msg.length() - MessageFramer::MessageHeader::header_size(); |
| 202 } | 205 } |
| 203 | 206 |
| 204 virtual ~TestCastSocket() { | 207 virtual ~TestCastSocket() { |
| 205 } | 208 } |
| 206 | 209 |
| 207 // Helpers to set mock results for various operations. | 210 // Helpers to set mock results for various operations. |
| 208 void SetupTcp1Connect(net::IoMode mode, int result) { | 211 void SetupTcp1Connect(net::IoMode mode, int result) { |
| 209 tcp_connect_data_[0].reset(new net::MockConnect(mode, result)); | 212 tcp_connect_data_[0].reset(new net::MockConnect(mode, result)); |
| 210 } | 213 } |
| 211 void SetupSsl1Connect(net::IoMode mode, int result) { | 214 void SetupSsl1Connect(net::IoMode mode, int result) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 } | 248 } |
| 246 void AddReadResult(net::IoMode mode, int result) { | 249 void AddReadResult(net::IoMode mode, int result) { |
| 247 AddReadResult(net::MockRead(mode, result)); | 250 AddReadResult(net::MockRead(mode, result)); |
| 248 } | 251 } |
| 249 void AddReadResult(net::IoMode mode, const char* data, int data_len) { | 252 void AddReadResult(net::IoMode mode, const char* data, int data_len) { |
| 250 AddReadResult(net::MockRead(mode, data, data_len)); | 253 AddReadResult(net::MockRead(mode, data, data_len)); |
| 251 } | 254 } |
| 252 void AddReadResultForMessage(net::IoMode mode, const std::string& msg) { | 255 void AddReadResultForMessage(net::IoMode mode, const std::string& msg) { |
| 253 size_t body_size = ComputeBodySize(msg); | 256 size_t body_size = ComputeBodySize(msg); |
| 254 const char* data = msg.c_str(); | 257 const char* data = msg.c_str(); |
| 255 AddReadResult(mode, data, MessageHeader::header_size()); | 258 AddReadResult(mode, data, MessageFramer::MessageHeader::header_size()); |
| 256 AddReadResult(mode, data + MessageHeader::header_size(), body_size); | 259 AddReadResult( |
| 260 mode, data + MessageFramer::MessageHeader::header_size(), body_size); |
| 257 } | 261 } |
| 258 void AddReadResultForMessage(net::IoMode mode, | 262 void AddReadResultForMessage(net::IoMode mode, |
| 259 const std::string& msg, | 263 const std::string& msg, |
| 260 size_t ch_size) { | 264 size_t ch_size) { |
| 261 size_t msg_size = msg.size(); | 265 size_t msg_size = msg.size(); |
| 262 const char* data = msg.c_str(); | 266 const char* data = msg.c_str(); |
| 263 for (size_t offset = 0; offset < msg_size; offset += ch_size) { | 267 for (size_t offset = 0; offset < msg_size; offset += ch_size) { |
| 264 if (offset + ch_size > msg_size) | 268 if (offset + ch_size > msg_size) |
| 265 ch_size = msg_size - offset; | 269 ch_size = msg_size - offset; |
| 266 AddReadResult(mode, data + offset, ch_size); | 270 AddReadResult(mode, data + offset, ch_size); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 base::TimeTicks())) {} | 354 base::TimeTicks())) {} |
| 351 virtual ~CastSocketTest() {} | 355 virtual ~CastSocketTest() {} |
| 352 | 356 |
| 353 virtual void SetUp() OVERRIDE { | 357 virtual void SetUp() OVERRIDE { |
| 354 // Create a few test messages | 358 // Create a few test messages |
| 355 for (size_t i = 0; i < arraysize(test_messages_); i++) { | 359 for (size_t i = 0; i < arraysize(test_messages_); i++) { |
| 356 CreateStringMessage("urn:cast", "1", "2", kTestData[i], | 360 CreateStringMessage("urn:cast", "1", "2", kTestData[i], |
| 357 &test_messages_[i]); | 361 &test_messages_[i]); |
| 358 ASSERT_TRUE(MessageInfoToCastMessage( | 362 ASSERT_TRUE(MessageInfoToCastMessage( |
| 359 test_messages_[i], &test_protos_[i])); | 363 test_messages_[i], &test_protos_[i])); |
| 360 ASSERT_TRUE(CastSocket::Serialize(test_protos_[i], &test_proto_strs_[i])); | 364 ASSERT_TRUE( |
| 365 MessageFramer::Serialize(test_protos_[i], &test_proto_strs_[i])); |
| 361 } | 366 } |
| 362 } | 367 } |
| 363 | 368 |
| 364 virtual void TearDown() OVERRIDE { | 369 virtual void TearDown() OVERRIDE { |
| 365 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); | 370 if (socket_.get()) { |
| 366 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, | 371 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); |
| 367 base::Unretained(&handler_))); | 372 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, |
| 373 base::Unretained(&handler_))); |
| 374 } |
| 368 } | 375 } |
| 369 | 376 |
| 370 // The caller can specify non-standard namespaces by setting "auth_namespace" | 377 // The caller can specify non-standard namespaces by setting "auth_namespace" |
| 371 // (useful for negative test cases.) | 378 // (useful for negative test cases.) |
| 372 void SetupAuthMessage( | 379 void SetupAuthMessage( |
| 373 const char* auth_namespace = "urn:x-cast:com.google.cast.tp.deviceauth") { | 380 const char* auth_namespace = "urn:x-cast:com.google.cast.tp.deviceauth") { |
| 374 // Create a test auth request. | 381 // Create a test auth request. |
| 375 CastMessage request; | 382 CastMessage request; |
| 376 CreateAuthChallengeMessage(&request); | 383 CreateAuthChallengeMessage(&request); |
| 377 ASSERT_TRUE(CastSocket::Serialize(request, &auth_request_)); | 384 ASSERT_TRUE(MessageFramer::Serialize(request, &auth_request_)); |
| 378 | 385 |
| 379 // Create a test auth reply. | 386 // Create a test auth reply. |
| 380 MessageInfo reply; | 387 MessageInfo reply; |
| 381 CreateBinaryMessage( | 388 CreateBinaryMessage( |
| 382 auth_namespace, "sender-0", "receiver-0", "abcd", &reply); | 389 auth_namespace, "sender-0", "receiver-0", "abcd", &reply); |
| 383 CastMessage reply_msg; | 390 CastMessage reply_msg; |
| 384 ASSERT_TRUE(MessageInfoToCastMessage(reply, &reply_msg)); | 391 ASSERT_TRUE(MessageInfoToCastMessage(reply, &reply_msg)); |
| 385 ASSERT_TRUE(CastSocket::Serialize(reply_msg, &auth_reply_)); | 392 ASSERT_TRUE(MessageFramer::Serialize(reply_msg, &auth_reply_)); |
| 386 } | 393 } |
| 387 | 394 |
| 388 void CreateCastSocket() { | 395 void CreateCastSocket() { |
| 389 socket_ = TestCastSocket::Create(&mock_delegate_, logger_.get()); | 396 socket_ = TestCastSocket::Create(&mock_delegate_, logger_.get()); |
| 390 } | 397 } |
| 391 | 398 |
| 392 void CreateCastSocketSecure() { | 399 void CreateCastSocketSecure() { |
| 393 socket_ = TestCastSocket::CreateSecure(&mock_delegate_, logger_.get()); | 400 socket_ = TestCastSocket::CreateSecure(&mock_delegate_, logger_.get()); |
| 394 } | 401 } |
| 395 | 402 |
| (...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 938 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 945 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 939 } | 946 } |
| 940 | 947 |
| 941 // Test write error - very large message | 948 // Test write error - very large message |
| 942 TEST_F(CastSocketTest, TestWriteErrorLargeMessage) { | 949 TEST_F(CastSocketTest, TestWriteErrorLargeMessage) { |
| 943 CreateCastSocket(); | 950 CreateCastSocket(); |
| 944 ConnectHelper(); | 951 ConnectHelper(); |
| 945 SetupAuthMessage(); | 952 SetupAuthMessage(); |
| 946 | 953 |
| 947 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); | 954 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); |
| 948 size_t size = CastSocket::MessageHeader::max_message_size() + 1; | 955 size_t size = MessageFramer::MessageHeader::max_message_size() + 1; |
| 949 test_messages_[0].data.reset( | 956 test_messages_[0].data.reset( |
| 950 new base::StringValue(std::string(size, 'a'))); | 957 new base::StringValue(std::string(size, 'a'))); |
| 951 socket_->SendMessage(test_messages_[0], | 958 socket_->SendMessage(test_messages_[0], |
| 952 base::Bind(&CompleteHandler::OnWriteComplete, | 959 base::Bind(&CompleteHandler::OnWriteComplete, |
| 953 base::Unretained(&handler_))); | 960 base::Unretained(&handler_))); |
| 954 | 961 |
| 955 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); | 962 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); |
| 956 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); | 963 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); |
| 957 } | 964 } |
| 958 | 965 |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1156 ConnectHelper(); | 1163 ConnectHelper(); |
| 1157 | 1164 |
| 1158 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | 1165 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 1159 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); | 1166 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); |
| 1160 } | 1167 } |
| 1161 | 1168 |
| 1162 // Test read error - header parse error | 1169 // Test read error - header parse error |
| 1163 TEST_F(CastSocketTest, TestReadHeaderParseError) { | 1170 TEST_F(CastSocketTest, TestReadHeaderParseError) { |
| 1164 CreateCastSocket(); | 1171 CreateCastSocket(); |
| 1165 SetupAuthMessage(); | 1172 SetupAuthMessage(); |
| 1166 uint32 body_size = base::HostToNet32( | 1173 |
| 1167 CastSocket::MessageHeader::max_message_size() + 1); | 1174 uint32 body_size = |
| 1175 base::HostToNet32(MessageFramer::MessageHeader::max_message_size() + 1); |
| 1168 // TODO(munjal): Add a method to cast_message_util.h to serialize messages | 1176 // TODO(munjal): Add a method to cast_message_util.h to serialize messages |
| 1169 char header[sizeof(body_size)]; | 1177 char header[sizeof(body_size)]; |
| 1170 memcpy(&header, &body_size, arraysize(header)); | 1178 memcpy(&header, &body_size, arraysize(header)); |
| 1171 socket_->AddReadResult(net::SYNCHRONOUS, header, arraysize(header)); | 1179 socket_->AddReadResult(net::SYNCHRONOUS, header, arraysize(header)); |
| 1172 EXPECT_CALL(mock_delegate_, | 1180 EXPECT_CALL(mock_delegate_, |
| 1173 OnError(socket_.get(), | 1181 OnError(socket_.get(), |
| 1174 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, | 1182 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, |
| 1175 A<const LastErrors&>())); | 1183 A<const LastErrors&>())); |
| 1176 ConnectHelper(); | 1184 ConnectHelper(); |
| 1177 | 1185 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1194 OnError(socket_.get(), | 1202 OnError(socket_.get(), |
| 1195 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, | 1203 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, |
| 1196 A<const LastErrors&>())); | 1204 A<const LastErrors&>())); |
| 1197 ConnectHelper(); | 1205 ConnectHelper(); |
| 1198 | 1206 |
| 1199 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); | 1207 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); |
| 1200 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, | 1208 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, |
| 1201 socket_->error_state()); | 1209 socket_->error_state()); |
| 1202 } | 1210 } |
| 1203 | 1211 |
| 1212 TEST_F(CastSocketTest, TestMessageFramerCompleteMessage) { |
| 1213 scoped_refptr<net::GrowableIOBuffer> buffer(new net::GrowableIOBuffer); |
| 1214 MessageFramer framer(buffer); |
| 1215 ChannelError error; |
| 1216 size_t message_length; |
| 1217 |
| 1218 buffer->SetCapacity(MessageFramer::MessageHeader::max_message_size()); |
| 1219 uint32 packet_len = test_proto_strs_[0].size(); |
| 1220 memcpy(buffer->StartOfBuffer(), test_proto_strs_[0].data(), packet_len); |
| 1221 |
| 1222 // Receive 1 byte of the header, framer demands 3 more bytes. |
| 1223 EXPECT_EQ(4u, framer.BytesRequested()); |
| 1224 EXPECT_EQ(NULL, framer.Ingest(1, &message_length, &error).get()); |
| 1225 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, error); |
| 1226 EXPECT_EQ(3u, framer.BytesRequested()); |
| 1227 |
| 1228 // Ingest remaining 3, expect that the framer has moved on to requesting the |
| 1229 // body contents. |
| 1230 EXPECT_EQ(NULL, framer.Ingest(3, &message_length, &error).get()); |
| 1231 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, error); |
| 1232 EXPECT_EQ(packet_len - MessageFramer::MessageHeader::header_size(), |
| 1233 framer.BytesRequested()); |
| 1234 |
| 1235 // Remainder of packet sent over the wire. |
| 1236 scoped_ptr<CastMessage> message; |
| 1237 message = framer.Ingest(framer.BytesRequested(), &message_length, &error); |
| 1238 EXPECT_NE(static_cast<CastMessage*>(NULL), message.get()); |
| 1239 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, error); |
| 1240 EXPECT_EQ(message->SerializeAsString(), test_protos_[0].SerializeAsString()); |
| 1241 EXPECT_EQ(4u, framer.BytesRequested()); |
| 1242 EXPECT_EQ(message->SerializeAsString().size(), message_length); |
| 1243 } |
| 1204 } // namespace cast_channel | 1244 } // namespace cast_channel |
| 1205 } // namespace core_api | 1245 } // namespace core_api |
| 1206 } // namespace extensions | 1246 } // namespace extensions |
| OLD | NEW |