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
3 // found in the LICENSE file.
5 #include "extensions/browser/api/cast_channel/cast_transport.h"
10 #include "base/test/simple_test_tick_clock.h"
11 #include "extensions/browser/api/cast_channel/cast_framer.h"
12 #include "extensions/browser/api/cast_channel/cast_transport.h"
13 #include "extensions/browser/api/cast_channel/logger.h"
14 #include "extensions/browser/api/cast_channel/logger_util.h"
15 #include "extensions/common/api/cast_channel/cast_channel.pb.h"
16 #include "net/base/capturing_net_log.h"
17 #include "net/base/completion_callback.h"
18 #include "net/base/net_errors.h"
19 #include "testing/gmock/include/gmock/gmock.h"
20 #include "testing/gtest/include/gtest/gtest.h"
24 using testing::InSequence
;
25 using testing::Invoke
;
26 using testing::NotNull
;
27 using testing::Return
;
28 using testing::WithArg
;
30 namespace extensions
{
32 namespace cast_channel
{
34 // Mockable placeholder for write completion events.
35 class CompleteHandler
{
38 MOCK_METHOD1(Complete
, void(int result
));
41 DISALLOW_COPY_AND_ASSIGN(CompleteHandler
);
44 // Creates a CastMessage proto with the bare minimum required fields set.
45 CastMessage
CreateCastMessage() {
47 output
.set_protocol_version(CastMessage::CASTV2_1_0
);
48 output
.set_namespace_("x");
49 output
.set_source_id("source");
50 output
.set_destination_id("destination");
51 output
.set_payload_type(CastMessage::STRING
);
52 output
.set_payload_utf8("payload");
56 // FIFO queue of completion callbacks. Outstanding write operations are
57 // Push()ed into the queue. Callback completion is simulated by invoking
58 // Pop() in the same order as Push().
59 class CompletionQueue
{
62 ~CompletionQueue() { CHECK_EQ(0u, cb_queue_
.size()); }
64 // Enqueues a pending completion callback.
65 void Push(const net::CompletionCallback
& cb
) { cb_queue_
.push(cb
); }
66 // Runs the next callback and removes it from the queue.
68 CHECK_GT(cb_queue_
.size(), 0u);
69 cb_queue_
.front().Run(rv
);
74 std::queue
<net::CompletionCallback
> cb_queue_
;
75 DISALLOW_COPY_AND_ASSIGN(CompletionQueue
);
78 // GMock action that reads data from an IOBuffer and writes it to a string
81 // buf_idx (template parameter 0): 0-based index of the net::IOBuffer
82 // in the function mock arg list.
83 // size_idx (template parameter 1): 0-based index of the byte count arg.
84 // str: pointer to the string which will receive data from the buffer.
85 ACTION_TEMPLATE(ReadBufferToString
,
86 HAS_2_TEMPLATE_PARAMS(int, buf_idx
, int, size_idx
),
87 AND_1_VALUE_PARAMS(str
)) {
88 str
->assign(testing::get
<buf_idx
>(args
)->data(),
89 testing::get
<size_idx
>(args
));
92 // GMock action that writes data from a string to an IOBuffer.
94 // buf_idx (template parameter 0): 0-based index of the IOBuffer arg.
95 // str: the string containing data to be written to the IOBuffer.
96 ACTION_TEMPLATE(FillBufferFromString
,
97 HAS_1_TEMPLATE_PARAMS(int, buf_idx
),
98 AND_1_VALUE_PARAMS(str
)) {
99 memcpy(testing::get
<buf_idx
>(args
)->data(), str
.data(), str
.size());
102 // GMock action that enqueues a write completion callback in a queue.
104 // buf_idx (template parameter 0): 0-based index of the CompletionCallback.
105 // completion_queue: a pointer to the CompletionQueue.
106 ACTION_TEMPLATE(EnqueueCallback
,
107 HAS_1_TEMPLATE_PARAMS(int, cb_idx
),
108 AND_1_VALUE_PARAMS(completion_queue
)) {
109 completion_queue
->Push(testing::get
<cb_idx
>(args
));
112 // Checks if two proto messages are the same.
114 // third_party/cacheinvalidation/overrides/google/cacheinvalidation/deps/gmock.h
115 MATCHER_P(EqualsProto
, message
, "") {
116 std::string expected_serialized
, actual_serialized
;
117 message
.SerializeToString(&expected_serialized
);
118 arg
.SerializeToString(&actual_serialized
);
119 return expected_serialized
== actual_serialized
;
123 class MockCastTransportDelegate
: public CastTransport::Delegate
{
125 MOCK_METHOD3(OnError
,
126 void(const CastSocketInterface
* socket
,
128 const LastErrors
& last_errors
));
129 MOCK_METHOD2(OnMessage
,
130 void(const CastSocketInterface
* socket
,
131 const CastMessage
& message
));
134 class MockCastSocket
: public CastSocketInterface
{
137 net::IPAddressNumber number
;
138 number
.push_back(192);
142 ip_
= net::IPEndPoint(number
, 8009);
145 virtual ~MockCastSocket() {}
147 // The IP endpoint for the destination of the channel.
148 virtual const net::IPEndPoint
& ip_endpoint() const override
{ return ip_
; }
150 // The authentication level requested for the channel.
151 virtual ChannelAuthType
channel_auth() const override
{
152 return CHANNEL_AUTH_TYPE_SSL_VERIFIED
;
155 virtual int id() const override
{ return 1; }
158 int(net::IOBuffer
* buffer
,
160 const net::CompletionCallback
& callback
));
162 int(net::IOBuffer
* buf
,
164 const net::CompletionCallback
& callback
));
165 MOCK_METHOD1(CloseWithError
, void(ChannelError error
));
168 virtual void CloseInternal() {}
172 net::CapturingNetLog capturing_net_log_
;
175 class CastTransportTest
: public testing::Test
{
178 : logger_(new Logger(
179 scoped_ptr
<base::TickClock
>(new base::SimpleTestTickClock
),
180 base::TimeTicks())) {
181 transport_
.reset(new CastTransport(&mock_socket_
, &delegate_
, logger_
));
183 ~CastTransportTest() override
{}
186 MockCastTransportDelegate delegate_
;
187 MockCastSocket mock_socket_
;
188 scoped_refptr
<Logger
> logger_
;
189 scoped_ptr
<CastTransport
> transport_
;
192 // ----------------------------------------------------------------------------
193 // Asynchronous write tests
194 TEST_F(CastTransportTest
, TestFullWriteAsync
) {
195 CompletionQueue socket_cbs
;
196 CompleteHandler write_handler
;
199 CastMessage message
= CreateCastMessage();
200 std::string serialized_message
;
201 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
203 EXPECT_CALL(mock_socket_
, Write(NotNull(), serialized_message
.size(), _
))
204 .WillOnce(DoAll(ReadBufferToString
<0, 1>(&output
),
205 EnqueueCallback
<2>(&socket_cbs
),
206 Return(net::ERR_IO_PENDING
)));
207 EXPECT_CALL(write_handler
, Complete(net::OK
));
208 transport_
->SendMessage(
210 base::Bind(&CompleteHandler::Complete
, base::Unretained(&write_handler
)));
211 socket_cbs
.Pop(serialized_message
.size());
212 EXPECT_EQ(serialized_message
, output
);
215 TEST_F(CastTransportTest
, TestPartialWritesAsync
) {
217 CompletionQueue socket_cbs
;
218 CompleteHandler write_handler
;
221 CastMessage message
= CreateCastMessage();
222 std::string serialized_message
;
223 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
225 // Only one byte is written.
226 EXPECT_CALL(mock_socket_
, Write(NotNull(), serialized_message
.size(), _
))
227 .WillOnce(DoAll(ReadBufferToString
<0, 1>(&output
),
228 EnqueueCallback
<2>(&socket_cbs
),
229 Return(net::ERR_IO_PENDING
)));
230 // Remainder of bytes are written.
231 EXPECT_CALL(mock_socket_
, Write(NotNull(), serialized_message
.size() - 1, _
))
232 .WillOnce(DoAll(ReadBufferToString
<0, 1>(&output
),
233 EnqueueCallback
<2>(&socket_cbs
),
234 Return(net::ERR_IO_PENDING
)));
236 transport_
->SendMessage(
238 base::Bind(&CompleteHandler::Complete
, base::Unretained(&write_handler
)));
239 EXPECT_EQ(serialized_message
, output
);
242 EXPECT_CALL(write_handler
, Complete(net::OK
));
243 socket_cbs
.Pop(serialized_message
.size() - 1);
244 EXPECT_EQ(serialized_message
.substr(1, serialized_message
.size() - 1),
248 TEST_F(CastTransportTest
, TestWriteFailureAsync
) {
249 CompletionQueue socket_cbs
;
250 CompleteHandler write_handler
;
251 CastMessage message
= CreateCastMessage();
252 EXPECT_CALL(mock_socket_
, Write(NotNull(), _
, _
)).WillOnce(
253 DoAll(EnqueueCallback
<2>(&socket_cbs
), Return(net::ERR_IO_PENDING
)));
254 EXPECT_CALL(write_handler
, Complete(net::ERR_FAILED
));
255 transport_
->SendMessage(
257 base::Bind(&CompleteHandler::Complete
, base::Unretained(&write_handler
)));
258 socket_cbs
.Pop(net::ERR_CONNECTION_RESET
);
261 // ----------------------------------------------------------------------------
262 // Synchronous write tests
263 TEST_F(CastTransportTest
, TestFullWriteSync
) {
264 CompleteHandler write_handler
;
266 CastMessage message
= CreateCastMessage();
267 std::string serialized_message
;
268 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
269 EXPECT_CALL(mock_socket_
, Write(NotNull(), serialized_message
.size(), _
))
270 .WillOnce(DoAll(ReadBufferToString
<0, 1>(&output
),
271 Return(serialized_message
.size())));
272 EXPECT_CALL(write_handler
, Complete(net::OK
));
273 transport_
->SendMessage(
275 base::Bind(&CompleteHandler::Complete
, base::Unretained(&write_handler
)));
276 EXPECT_EQ(serialized_message
, output
);
279 TEST_F(CastTransportTest
, TestPartialWritesSync
) {
281 CompleteHandler write_handler
;
284 CastMessage message
= CreateCastMessage();
285 std::string serialized_message
;
286 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
288 // Only one byte is written.
289 EXPECT_CALL(mock_socket_
, Write(NotNull(), serialized_message
.size(), _
))
290 .WillOnce(DoAll(ReadBufferToString
<0, 1>(&output
), Return(1)));
291 // Remainder of bytes are written.
292 EXPECT_CALL(mock_socket_
, Write(NotNull(), serialized_message
.size() - 1, _
))
293 .WillOnce(DoAll(ReadBufferToString
<0, 1>(&output
),
294 Return(serialized_message
.size() - 1)));
296 EXPECT_CALL(write_handler
, Complete(net::OK
));
297 transport_
->SendMessage(
299 base::Bind(&CompleteHandler::Complete
, base::Unretained(&write_handler
)));
300 EXPECT_EQ(serialized_message
.substr(1, serialized_message
.size() - 1),
304 TEST_F(CastTransportTest
, TestWriteFailureSync
) {
305 CompleteHandler write_handler
;
306 CastMessage message
= CreateCastMessage();
307 EXPECT_CALL(mock_socket_
, Write(NotNull(), _
, _
))
308 .WillOnce(Return(net::ERR_CONNECTION_RESET
));
309 EXPECT_CALL(write_handler
, Complete(net::ERR_FAILED
));
310 transport_
->SendMessage(
312 base::Bind(&CompleteHandler::Complete
, base::Unretained(&write_handler
)));
315 // ----------------------------------------------------------------------------
316 // Asynchronous read tests
317 TEST_F(CastTransportTest
, TestFullReadAsync
) {
318 CompletionQueue socket_cbs
;
320 CastMessage message
= CreateCastMessage();
321 std::string serialized_message
;
322 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
324 // Read bytes [0, 3].
325 EXPECT_CALL(mock_socket_
,
326 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
327 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
),
328 EnqueueCallback
<2>(&socket_cbs
),
329 Return(net::ERR_IO_PENDING
)))
330 .RetiresOnSaturation();
331 // Read bytes [4, n].
332 EXPECT_CALL(mock_socket_
,
334 serialized_message
.size() -
335 MessageFramer::MessageHeader::header_size(),
337 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
.substr(
338 MessageFramer::MessageHeader::header_size(),
339 serialized_message
.size() -
340 MessageFramer::MessageHeader::header_size())),
341 EnqueueCallback
<2>(&socket_cbs
),
342 Return(net::ERR_IO_PENDING
)))
343 .RetiresOnSaturation();
345 EXPECT_CALL(delegate_
, OnMessage(&mock_socket_
, EqualsProto(message
)));
346 transport_
->StartReadLoop();
347 socket_cbs
.Pop(MessageFramer::MessageHeader::header_size());
348 EXPECT_CALL(mock_socket_
,
349 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
350 .WillOnce(Return(net::ERR_IO_PENDING
));
351 socket_cbs
.Pop(serialized_message
.size() -
352 MessageFramer::MessageHeader::header_size());
355 TEST_F(CastTransportTest
, TestPartialReadAsync
) {
356 CompletionQueue socket_cbs
;
358 CastMessage message
= CreateCastMessage();
359 std::string serialized_message
;
360 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
362 // Read bytes [0, 3].
363 EXPECT_CALL(mock_socket_
,
364 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
365 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
),
366 EnqueueCallback
<2>(&socket_cbs
),
367 Return(net::ERR_IO_PENDING
)))
368 .RetiresOnSaturation();
369 // Read bytes [4, n-1].
370 EXPECT_CALL(mock_socket_
,
372 serialized_message
.size() -
373 MessageFramer::MessageHeader::header_size(),
375 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
.substr(
376 MessageFramer::MessageHeader::header_size(),
377 serialized_message
.size() -
378 MessageFramer::MessageHeader::header_size() - 1)),
379 EnqueueCallback
<2>(&socket_cbs
),
380 Return(net::ERR_IO_PENDING
)))
381 .RetiresOnSaturation();
383 EXPECT_CALL(mock_socket_
, Read(NotNull(), 1, _
))
384 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
.substr(
385 serialized_message
.size() - 1, 1)),
386 EnqueueCallback
<2>(&socket_cbs
),
387 Return(net::ERR_IO_PENDING
)))
388 .RetiresOnSaturation();
390 EXPECT_CALL(delegate_
, OnMessage(&mock_socket_
, EqualsProto(message
)));
391 transport_
->StartReadLoop();
392 socket_cbs
.Pop(MessageFramer::MessageHeader::header_size());
393 EXPECT_CALL(mock_socket_
,
394 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
395 .WillOnce(Return(net::ERR_IO_PENDING
));
396 socket_cbs
.Pop(serialized_message
.size() -
397 MessageFramer::MessageHeader::header_size() - 1);
401 TEST_F(CastTransportTest
, TestReadErrorInHeaderAsync
) {
402 CompletionQueue socket_cbs
;
404 CastMessage message
= CreateCastMessage();
405 std::string serialized_message
;
406 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
408 // Read bytes [0, 3].
409 EXPECT_CALL(mock_socket_
,
410 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
411 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
),
412 EnqueueCallback
<2>(&socket_cbs
),
413 Return(net::ERR_IO_PENDING
)))
414 .RetiresOnSaturation();
416 EXPECT_CALL(delegate_
,
417 OnError(&mock_socket_
, CHANNEL_ERROR_TRANSPORT_ERROR
, _
));
418 EXPECT_CALL(mock_socket_
, CloseWithError(CHANNEL_ERROR_TRANSPORT_ERROR
));
419 transport_
->StartReadLoop();
420 // Header read failure.
421 socket_cbs
.Pop(net::ERR_CONNECTION_RESET
);
424 TEST_F(CastTransportTest
, TestReadErrorInBodyAsync
) {
425 CompletionQueue socket_cbs
;
427 CastMessage message
= CreateCastMessage();
428 std::string serialized_message
;
429 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
431 // Read bytes [0, 3].
432 EXPECT_CALL(mock_socket_
,
433 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
434 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
),
435 EnqueueCallback
<2>(&socket_cbs
),
436 Return(net::ERR_IO_PENDING
)))
437 .RetiresOnSaturation();
438 // Read bytes [4, n-1].
439 EXPECT_CALL(mock_socket_
,
441 serialized_message
.size() -
442 MessageFramer::MessageHeader::header_size(),
444 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
.substr(
445 MessageFramer::MessageHeader::header_size(),
446 serialized_message
.size() -
447 MessageFramer::MessageHeader::header_size() - 1)),
448 EnqueueCallback
<2>(&socket_cbs
),
449 Return(net::ERR_IO_PENDING
)))
450 .RetiresOnSaturation();
452 EXPECT_CALL(delegate_
,
453 OnError(&mock_socket_
, CHANNEL_ERROR_TRANSPORT_ERROR
, _
));
454 transport_
->StartReadLoop();
455 // Header read is OK.
456 socket_cbs
.Pop(MessageFramer::MessageHeader::header_size());
457 EXPECT_CALL(mock_socket_
, CloseWithError(CHANNEL_ERROR_TRANSPORT_ERROR
));
459 socket_cbs
.Pop(net::ERR_CONNECTION_RESET
);
462 TEST_F(CastTransportTest
, TestReadCorruptedMessageAsync
) {
463 CompletionQueue socket_cbs
;
465 CastMessage message
= CreateCastMessage();
466 std::string serialized_message
;
467 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
469 // Corrupt the serialized message body(set it to X's).
470 for (size_t i
= MessageFramer::MessageHeader::header_size();
471 i
< serialized_message
.size();
473 serialized_message
[i
] = 'x';
476 // Read bytes [0, 3].
477 EXPECT_CALL(mock_socket_
,
478 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
479 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
),
480 EnqueueCallback
<2>(&socket_cbs
),
481 Return(net::ERR_IO_PENDING
)))
482 .RetiresOnSaturation();
483 // Read bytes [4, n].
484 EXPECT_CALL(mock_socket_
,
486 serialized_message
.size() -
487 MessageFramer::MessageHeader::header_size(),
489 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
.substr(
490 MessageFramer::MessageHeader::header_size(),
491 serialized_message
.size() -
492 MessageFramer::MessageHeader::header_size() - 1)),
493 EnqueueCallback
<2>(&socket_cbs
),
494 Return(net::ERR_IO_PENDING
)))
495 .RetiresOnSaturation();
497 EXPECT_CALL(delegate_
,
498 OnError(&mock_socket_
, CHANNEL_ERROR_INVALID_MESSAGE
, _
));
499 transport_
->StartReadLoop();
500 socket_cbs
.Pop(MessageFramer::MessageHeader::header_size());
501 EXPECT_CALL(mock_socket_
, CloseWithError(CHANNEL_ERROR_INVALID_MESSAGE
));
502 socket_cbs
.Pop(serialized_message
.size() -
503 MessageFramer::MessageHeader::header_size());
506 // ----------------------------------------------------------------------------
507 // Synchronous read tests
508 TEST_F(CastTransportTest
, TestFullReadSync
) {
510 CastMessage message
= CreateCastMessage();
511 std::string serialized_message
;
512 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
514 // Read bytes [0, 3].
515 EXPECT_CALL(mock_socket_
,
516 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
517 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
),
518 Return(MessageFramer::MessageHeader::header_size())))
519 .RetiresOnSaturation();
520 // Read bytes [4, n].
521 EXPECT_CALL(mock_socket_
,
523 serialized_message
.size() -
524 MessageFramer::MessageHeader::header_size(),
526 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
.substr(
527 MessageFramer::MessageHeader::header_size(),
528 serialized_message
.size() -
529 MessageFramer::MessageHeader::header_size())),
530 Return(serialized_message
.size() -
531 MessageFramer::MessageHeader::header_size())))
532 .RetiresOnSaturation();
533 EXPECT_CALL(delegate_
, OnMessage(&mock_socket_
, EqualsProto(message
)));
534 EXPECT_CALL(mock_socket_
,
535 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
536 .WillOnce(Return(net::ERR_IO_PENDING
));
537 transport_
->StartReadLoop();
540 TEST_F(CastTransportTest
, TestPartialReadSync
) {
543 CastMessage message
= CreateCastMessage();
544 std::string serialized_message
;
545 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
547 // Read bytes [0, 3].
548 EXPECT_CALL(mock_socket_
,
549 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
550 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
),
551 Return(MessageFramer::MessageHeader::header_size())))
552 .RetiresOnSaturation();
553 // Read bytes [4, n-1].
554 EXPECT_CALL(mock_socket_
,
556 serialized_message
.size() -
557 MessageFramer::MessageHeader::header_size(),
559 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
.substr(
560 MessageFramer::MessageHeader::header_size(),
561 serialized_message
.size() -
562 MessageFramer::MessageHeader::header_size() - 1)),
563 Return(serialized_message
.size() -
564 MessageFramer::MessageHeader::header_size() - 1)))
565 .RetiresOnSaturation();
567 EXPECT_CALL(mock_socket_
, Read(NotNull(), 1, _
))
568 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
.substr(
569 serialized_message
.size() - 1, 1)),
571 .RetiresOnSaturation();
572 EXPECT_CALL(delegate_
, OnMessage(&mock_socket_
, EqualsProto(message
)));
573 EXPECT_CALL(mock_socket_
,
574 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
575 .WillOnce(Return(net::ERR_IO_PENDING
));
576 transport_
->StartReadLoop();
579 TEST_F(CastTransportTest
, TestReadErrorInHeaderSync
) {
580 CastMessage message
= CreateCastMessage();
581 std::string serialized_message
;
582 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
584 // Read bytes [0, 3].
585 EXPECT_CALL(mock_socket_
,
586 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
587 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
),
588 Return(net::ERR_CONNECTION_RESET
)))
589 .RetiresOnSaturation();
590 EXPECT_CALL(delegate_
,
591 OnError(&mock_socket_
, CHANNEL_ERROR_TRANSPORT_ERROR
, _
));
592 EXPECT_CALL(mock_socket_
, CloseWithError(CHANNEL_ERROR_TRANSPORT_ERROR
));
593 transport_
->StartReadLoop();
596 TEST_F(CastTransportTest
, TestReadErrorInBodySync
) {
597 CastMessage message
= CreateCastMessage();
598 std::string serialized_message
;
599 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
601 // Read bytes [0, 3].
602 EXPECT_CALL(mock_socket_
,
603 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
604 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
),
605 Return(MessageFramer::MessageHeader::header_size())))
606 .RetiresOnSaturation();
607 // Read bytes [4, n-1].
608 EXPECT_CALL(mock_socket_
,
610 serialized_message
.size() -
611 MessageFramer::MessageHeader::header_size(),
613 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
.substr(
614 MessageFramer::MessageHeader::header_size(),
615 serialized_message
.size() -
616 MessageFramer::MessageHeader::header_size() - 1)),
617 Return(net::ERR_CONNECTION_RESET
)))
618 .RetiresOnSaturation();
619 EXPECT_CALL(delegate_
,
620 OnError(&mock_socket_
, CHANNEL_ERROR_TRANSPORT_ERROR
, _
));
621 EXPECT_CALL(mock_socket_
, CloseWithError(CHANNEL_ERROR_TRANSPORT_ERROR
));
622 transport_
->StartReadLoop();
625 TEST_F(CastTransportTest
, TestReadCorruptedMessageSync
) {
626 CastMessage message
= CreateCastMessage();
627 std::string serialized_message
;
628 EXPECT_TRUE(MessageFramer::Serialize(message
, &serialized_message
));
630 // Corrupt the serialized message body(set it to X's).
631 for (size_t i
= MessageFramer::MessageHeader::header_size();
632 i
< serialized_message
.size();
634 serialized_message
[i
] = 'x';
637 // Read bytes [0, 3].
638 EXPECT_CALL(mock_socket_
,
639 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _
))
640 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
),
641 Return(MessageFramer::MessageHeader::header_size())))
642 .RetiresOnSaturation();
643 // Read bytes [4, n].
644 EXPECT_CALL(mock_socket_
,
646 serialized_message
.size() -
647 MessageFramer::MessageHeader::header_size(),
649 .WillOnce(DoAll(FillBufferFromString
<0>(serialized_message
.substr(
650 MessageFramer::MessageHeader::header_size(),
651 serialized_message
.size() -
652 MessageFramer::MessageHeader::header_size() - 1)),
653 Return(serialized_message
.size() -
654 MessageFramer::MessageHeader::header_size())))
655 .RetiresOnSaturation();
656 EXPECT_CALL(delegate_
,
657 OnError(&mock_socket_
, CHANNEL_ERROR_INVALID_MESSAGE
, _
));
658 EXPECT_CALL(mock_socket_
, CloseWithError(CHANNEL_ERROR_INVALID_MESSAGE
));
659 transport_
->StartReadLoop();
661 } // namespace cast_channel
662 } // namespace core_api
663 } // namespace extensions