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