Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(114)

Side by Side Diff: extensions/browser/api/cast_channel/cast_transport_unittest.cc

Issue 555283002: Create new class "CastTransport", which encapsulates the message read and write event loops. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added unit tests to CL Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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.
4
5 #include "extensions/browser/api/cast_channel/cast_transport.h"
6
7 #include <stddef.h>
8 #include <queue>
9
10 #include "base/test/simple_test_tick_clock.h"
11 #include "extensions/browser/api/cast_channel/cast_channel.pb.h"
12 #include "extensions/browser/api/cast_channel/cast_framer.h"
13 #include "extensions/browser/api/cast_channel/cast_transport.h"
14 #include "extensions/browser/api/cast_channel/logger.h"
15 #include "extensions/browser/api/cast_channel/logger_util.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"
21
22 using testing::_;
23 using testing::DoAll;
24 using testing::InSequence;
25 using testing::Invoke;
26 using testing::NotNull;
27 using testing::Return;
28 using testing::WithArg;
29
30 namespace extensions {
31 namespace core_api {
32 namespace cast_channel {
33 namespace {
34 // Mockable placeholder for write completion events.
35 class CompleteHandler {
36 public:
37 CompleteHandler() {}
38 MOCK_METHOD1(Complete, void(int result));
39
40 private:
41 DISALLOW_COPY_AND_ASSIGN(CompleteHandler);
42 };
43
44 // Creates a CastMessage proto with the bare minimum required fields set.
45 CastMessage CreateCastMessage() {
46 CastMessage output;
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");
53 return output;
54 }
55
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 {
60 public:
61 CompletionQueue() {}
62 ~CompletionQueue() { CHECK_EQ(0u, cb_queue_.size()); }
63
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.
67 void Pop(int rv) {
68 CHECK_GT(cb_queue_.size(), 0u);
69 cb_queue_.front().Run(rv);
70 cb_queue_.pop();
71 }
72
73 private:
74 std::queue<net::CompletionCallback> cb_queue_;
75 DISALLOW_COPY_AND_ASSIGN(CompletionQueue);
76 };
77
78 // GMock action that reads data from an IOBuffer and writes it to a string
79 // variable.
80 //
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));
90 }
91
92 // GMock action that writes data from a string to an IOBuffer.
93 //
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());
100 }
101
102 // Checks if two proto messages are the same.
103 // From
104 // third_party/cacheinvalidation/overrides/google/cacheinvalidation/deps/gmock.h
105 MATCHER_P(EqualsProto, message, "") {
106 std::string expected_serialized, actual_serialized;
107 message.SerializeToString(&expected_serialized);
108 arg.SerializeToString(&actual_serialized);
109 return expected_serialized == actual_serialized;
110 }
111 } // namespace
112
113 class MockCastTransportDelegate : public CastTransport::Delegate {
114 public:
115 MOCK_METHOD3(OnError,
116 void(const CastSocketPlaceholder* socket,
117 ChannelError error,
118 const LastErrors& last_errors));
119 MOCK_METHOD2(OnMessage,
120 void(const CastSocketPlaceholder* socket,
121 const CastMessage& message));
122 };
123
124 class MockCastSocket : public CastSocketPlaceholder {
125 public:
126 MockCastSocket() {
127 net::IPAddressNumber number;
128 number.push_back(192);
129 number.push_back(0);
130 number.push_back(0);
131 number.push_back(1);
132 ip_ = net::IPEndPoint(number, 8009);
133 }
134
135 virtual ~MockCastSocket() {}
136
137 // The IP endpoint for the destination of the channel.
138 virtual const net::IPEndPoint& ip_endpoint() const OVERRIDE { return ip_; }
139
140 // The authentication level requested for the channel.
141 virtual ChannelAuthType channel_auth() const OVERRIDE {
142 return CHANNEL_AUTH_TYPE_SSL_VERIFIED;
143 }
144
145 virtual int id() const OVERRIDE { return 1; }
146
147 MOCK_METHOD3(Write,
148 int(net::IOBuffer* buffer,
149 size_t size,
150 const net::CompletionCallback& callback));
151 MOCK_METHOD3(Read,
152 int(net::IOBuffer* buf,
153 int buf_len,
154 const net::CompletionCallback& callback));
155 MOCK_METHOD1(Close, void(const net::CompletionCallback& callback));
156 MOCK_METHOD1(CloseWithError, void(ChannelError error));
157
158 protected:
159 virtual void CloseInternal() {}
160
161 private:
162 net::IPEndPoint ip_;
163 net::CapturingNetLog capturing_net_log_;
164 };
165
166 class CastTransportTest : public testing::Test {
167 public:
168 CastTransportTest()
169 : logger_(new Logger(
170 scoped_ptr<base::TickClock>(new base::SimpleTestTickClock),
171 base::TimeTicks())) {
172 transport_.reset(new CastTransport(&mock_socket_, &delegate_, logger_));
173 }
174 virtual ~CastTransportTest() {}
175
176 protected:
177 MockCastTransportDelegate delegate_;
178 MockCastSocket mock_socket_;
179 scoped_refptr<Logger> logger_;
180 scoped_ptr<CastTransport> transport_;
181 };
182
183 // ----------------------------------------------------------------------------
184 // Asynchronous write tests
185 TEST_F(CastTransportTest, TestFullWriteAsync) {
186 CompletionQueue socket_cbs;
187 CompleteHandler write_handler;
188 std::string output;
189
190 CastMessage message = CreateCastMessage();
191 std::string serialized_message;
192 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
193
194 EXPECT_CALL(mock_socket_, Write(NotNull(), serialized_message.size(), _))
195 .WillOnce(DoAll(ReadBufferToString<0, 1>(&output),
196 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
197 Return(net::ERR_IO_PENDING)));
198 EXPECT_CALL(write_handler, Complete(net::OK));
199 transport_->SendMessage(
200 message,
201 base::Bind(&CompleteHandler::Complete, base::Unretained(&write_handler)));
202 socket_cbs.Pop(serialized_message.size());
203 EXPECT_EQ(serialized_message, output);
204 }
205
206 TEST_F(CastTransportTest, TestPartialWritesAsync) {
207 InSequence seq;
208 CompletionQueue socket_cbs;
209 CompleteHandler write_handler;
210 std::string output;
211
212 CastMessage message = CreateCastMessage();
213 std::string serialized_message;
214 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
215
216 // Only one byte is written.
217 EXPECT_CALL(mock_socket_, Write(NotNull(), serialized_message.size(), _))
218 .WillOnce(DoAll(ReadBufferToString<0, 1>(&output),
219 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
220 Return(net::ERR_IO_PENDING)));
221 // Remainder of bytes are written.
222 EXPECT_CALL(mock_socket_, Write(NotNull(), serialized_message.size() - 1, _))
223 .WillOnce(DoAll(ReadBufferToString<0, 1>(&output),
224 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
225 Return(net::ERR_IO_PENDING)));
226
227 transport_->SendMessage(
228 message,
229 base::Bind(&CompleteHandler::Complete, base::Unretained(&write_handler)));
230 EXPECT_EQ(serialized_message, output);
231 socket_cbs.Pop(1);
232
233 EXPECT_CALL(write_handler, Complete(net::OK));
234 socket_cbs.Pop(serialized_message.size() - 1);
235 EXPECT_EQ(serialized_message.substr(1, serialized_message.size() - 1),
236 output);
237 }
238
239 TEST_F(CastTransportTest, TestWriteFailureAsync) {
240 CompletionQueue socket_cbs;
241 CompleteHandler write_handler;
242 CastMessage message = CreateCastMessage();
243 EXPECT_CALL(mock_socket_, Write(NotNull(), _, _))
244 .WillOnce(DoAll(WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
245 Return(net::ERR_IO_PENDING)));
246 EXPECT_CALL(write_handler, Complete(net::ERR_FAILED));
247 transport_->SendMessage(
248 message,
249 base::Bind(&CompleteHandler::Complete, base::Unretained(&write_handler)));
250 socket_cbs.Pop(net::ERR_CONNECTION_RESET);
251 }
252
253 // ----------------------------------------------------------------------------
254 // Synchronous write tests
255 TEST_F(CastTransportTest, TestFullWriteSync) {
256 CompleteHandler write_handler;
257 std::string output;
258 CastMessage message = CreateCastMessage();
259 std::string serialized_message;
260 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
261 EXPECT_CALL(mock_socket_, Write(NotNull(), serialized_message.size(), _))
262 .WillOnce(DoAll(ReadBufferToString<0, 1>(&output),
263 Return(serialized_message.size())));
264 EXPECT_CALL(write_handler, Complete(net::OK));
265 transport_->SendMessage(
266 message,
267 base::Bind(&CompleteHandler::Complete, base::Unretained(&write_handler)));
268 EXPECT_EQ(serialized_message, output);
269 }
270
271 TEST_F(CastTransportTest, TestPartialWritesSync) {
272 InSequence seq;
273 CompleteHandler write_handler;
274 std::string output;
275
276 CastMessage message = CreateCastMessage();
277 std::string serialized_message;
278 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
279
280 // Only one byte is written.
281 EXPECT_CALL(mock_socket_, Write(NotNull(), serialized_message.size(), _))
282 .WillOnce(DoAll(ReadBufferToString<0, 1>(&output), Return(1)));
283 // Remainder of bytes are written.
284 EXPECT_CALL(mock_socket_, Write(NotNull(), serialized_message.size() - 1, _))
285 .WillOnce(DoAll(ReadBufferToString<0, 1>(&output),
286 Return(serialized_message.size() - 1)));
287
288 EXPECT_CALL(write_handler, Complete(net::OK));
289 transport_->SendMessage(
290 message,
291 base::Bind(&CompleteHandler::Complete, base::Unretained(&write_handler)));
292 EXPECT_EQ(serialized_message.substr(1, serialized_message.size() - 1),
293 output);
294 }
295
296 TEST_F(CastTransportTest, TestWriteFailureSync) {
297 CompleteHandler write_handler;
298 CastMessage message = CreateCastMessage();
299 EXPECT_CALL(mock_socket_, Write(NotNull(), _, _))
300 .WillOnce(Return(net::ERR_CONNECTION_RESET));
301 EXPECT_CALL(write_handler, Complete(net::ERR_FAILED));
302 transport_->SendMessage(
303 message,
304 base::Bind(&CompleteHandler::Complete, base::Unretained(&write_handler)));
305 }
306
307 // ----------------------------------------------------------------------------
308 // Asynchronous read tests
309 TEST_F(CastTransportTest, TestFullReadAsync) {
310 CompletionQueue socket_cbs;
311
312 CastMessage message = CreateCastMessage();
313 std::string serialized_message;
314 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
315
316 // Read bytes [0, 3].
317 EXPECT_CALL(mock_socket_,
318 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
319 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message),
320 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
321 Return(net::ERR_IO_PENDING)))
322 .RetiresOnSaturation();
323 // Read bytes [4, n].
324 EXPECT_CALL(mock_socket_,
325 Read(NotNull(),
326 serialized_message.size() -
327 MessageFramer::MessageHeader::header_size(),
328 _))
329 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message.substr(
330 MessageFramer::MessageHeader::header_size(),
331 serialized_message.size() -
332 MessageFramer::MessageHeader::header_size())),
333 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
334 Return(net::ERR_IO_PENDING)))
335 .RetiresOnSaturation();
336
337 EXPECT_CALL(delegate_, OnMessage(&mock_socket_, EqualsProto(message)));
338 transport_->StartReadLoop();
339 socket_cbs.Pop(MessageFramer::MessageHeader::header_size());
340 EXPECT_CALL(mock_socket_,
341 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
342 .WillOnce(Return(net::ERR_IO_PENDING));
343 socket_cbs.Pop(serialized_message.size() -
344 MessageFramer::MessageHeader::header_size());
345 }
346
347 TEST_F(CastTransportTest, TestPartialReadAsync) {
348 CompletionQueue socket_cbs;
349
350 CastMessage message = CreateCastMessage();
351 std::string serialized_message;
352 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
353
354 // Read bytes [0, 3].
355 EXPECT_CALL(mock_socket_,
356 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
357 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message),
358 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
359 Return(net::ERR_IO_PENDING)))
360 .RetiresOnSaturation();
361 // Read bytes [4, n-1].
362 EXPECT_CALL(mock_socket_,
363 Read(NotNull(),
364 serialized_message.size() -
365 MessageFramer::MessageHeader::header_size(),
366 _))
367 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message.substr(
368 MessageFramer::MessageHeader::header_size(),
369 serialized_message.size() -
370 MessageFramer::MessageHeader::header_size() - 1)),
371 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
372 Return(net::ERR_IO_PENDING)))
373 .RetiresOnSaturation();
374 // Read final byte.
375 EXPECT_CALL(mock_socket_, Read(NotNull(), 1, _))
376 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message.substr(
377 serialized_message.size() - 1, 1)),
378 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
379 Return(net::ERR_IO_PENDING)))
380 .RetiresOnSaturation();
381
382 EXPECT_CALL(delegate_, OnMessage(&mock_socket_, EqualsProto(message)));
383 transport_->StartReadLoop();
384 socket_cbs.Pop(MessageFramer::MessageHeader::header_size());
385 EXPECT_CALL(mock_socket_,
386 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
387 .WillOnce(Return(net::ERR_IO_PENDING));
388 socket_cbs.Pop(serialized_message.size() -
389 MessageFramer::MessageHeader::header_size() - 1);
390 socket_cbs.Pop(1);
391 }
392
393 TEST_F(CastTransportTest, TestReadErrorInHeaderAsync) {
394 CompletionQueue socket_cbs;
395
396 CastMessage message = CreateCastMessage();
397 std::string serialized_message;
398 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
399
400 // Read bytes [0, 3].
401 EXPECT_CALL(mock_socket_,
402 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
403 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message),
404 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
405 Return(net::ERR_IO_PENDING)))
406 .RetiresOnSaturation();
407
408 EXPECT_CALL(delegate_,
409 OnError(&mock_socket_, CHANNEL_ERROR_TRANSPORT_ERROR, _));
410 transport_->StartReadLoop();
411 // Header read failure.
412 socket_cbs.Pop(net::ERR_CONNECTION_RESET);
413 }
414
415 TEST_F(CastTransportTest, TestReadErrorInBodyAsync) {
416 CompletionQueue socket_cbs;
417
418 CastMessage message = CreateCastMessage();
419 std::string serialized_message;
420 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
421
422 // Read bytes [0, 3].
423 EXPECT_CALL(mock_socket_,
424 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
425 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message),
426 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
427 Return(net::ERR_IO_PENDING)))
428 .RetiresOnSaturation();
429 // Read bytes [4, n-1].
430 EXPECT_CALL(mock_socket_,
431 Read(NotNull(),
432 serialized_message.size() -
433 MessageFramer::MessageHeader::header_size(),
434 _))
435 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message.substr(
436 MessageFramer::MessageHeader::header_size(),
437 serialized_message.size() -
438 MessageFramer::MessageHeader::header_size() - 1)),
439 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
440 Return(net::ERR_IO_PENDING)))
441 .RetiresOnSaturation();
442
443 EXPECT_CALL(delegate_,
444 OnError(&mock_socket_, CHANNEL_ERROR_TRANSPORT_ERROR, _));
445 transport_->StartReadLoop();
446 // Header read is OK.
447 socket_cbs.Pop(MessageFramer::MessageHeader::header_size());
448 // Body read fails.
449 socket_cbs.Pop(net::ERR_CONNECTION_RESET);
450 }
451
452 TEST_F(CastTransportTest, TestReadCorruptedMessageAsync) {
453 CompletionQueue socket_cbs;
454
455 CastMessage message = CreateCastMessage();
456 std::string serialized_message;
457 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
458
459 // Corrupt the serialized message body(set it to X's).
460 for (size_t i = MessageFramer::MessageHeader::header_size();
461 i < serialized_message.size();
462 ++i) {
463 serialized_message[i] = 'x';
464 }
465
466 // Read bytes [0, 3].
467 EXPECT_CALL(mock_socket_,
468 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
469 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message),
470 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
471 Return(net::ERR_IO_PENDING)))
472 .RetiresOnSaturation();
473 // Read bytes [4, n].
474 EXPECT_CALL(mock_socket_,
475 Read(NotNull(),
476 serialized_message.size() -
477 MessageFramer::MessageHeader::header_size(),
478 _))
479 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message.substr(
480 MessageFramer::MessageHeader::header_size(),
481 serialized_message.size() -
482 MessageFramer::MessageHeader::header_size() - 1)),
483 WithArg<2>(Invoke(&socket_cbs, &CompletionQueue::Push)),
484 Return(net::ERR_IO_PENDING)))
485 .RetiresOnSaturation();
486
487 EXPECT_CALL(delegate_,
488 OnError(&mock_socket_, CHANNEL_ERROR_INVALID_MESSAGE, _));
489 transport_->StartReadLoop();
490 socket_cbs.Pop(MessageFramer::MessageHeader::header_size());
491 socket_cbs.Pop(serialized_message.size() -
492 MessageFramer::MessageHeader::header_size());
493 }
494
495 // ----------------------------------------------------------------------------
496 // Synchronous read tests
497 TEST_F(CastTransportTest, TestFullReadSync) {
498 InSequence s;
499 CastMessage message = CreateCastMessage();
500 std::string serialized_message;
501 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
502
503 // Read bytes [0, 3].
504 EXPECT_CALL(mock_socket_,
505 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
506 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message),
507 Return(MessageFramer::MessageHeader::header_size())))
508 .RetiresOnSaturation();
509 // Read bytes [4, n].
510 EXPECT_CALL(mock_socket_,
511 Read(NotNull(),
512 serialized_message.size() -
513 MessageFramer::MessageHeader::header_size(),
514 _))
515 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message.substr(
516 MessageFramer::MessageHeader::header_size(),
517 serialized_message.size() -
518 MessageFramer::MessageHeader::header_size())),
519 Return(serialized_message.size() -
520 MessageFramer::MessageHeader::header_size())))
521 .RetiresOnSaturation();
522 EXPECT_CALL(delegate_, OnMessage(&mock_socket_, EqualsProto(message)));
523 EXPECT_CALL(mock_socket_,
524 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
525 .WillOnce(Return(net::ERR_IO_PENDING));
526 transport_->StartReadLoop();
527 }
528
529 TEST_F(CastTransportTest, TestPartialReadSync) {
530 InSequence s;
531
532 CastMessage message = CreateCastMessage();
533 std::string serialized_message;
534 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
535
536 // Read bytes [0, 3].
537 EXPECT_CALL(mock_socket_,
538 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
539 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message),
540 Return(MessageFramer::MessageHeader::header_size())))
541 .RetiresOnSaturation();
542 // Read bytes [4, n-1].
543 EXPECT_CALL(mock_socket_,
544 Read(NotNull(),
545 serialized_message.size() -
546 MessageFramer::MessageHeader::header_size(),
547 _))
548 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message.substr(
549 MessageFramer::MessageHeader::header_size(),
550 serialized_message.size() -
551 MessageFramer::MessageHeader::header_size() - 1)),
552 Return(serialized_message.size() -
553 MessageFramer::MessageHeader::header_size() - 1)))
554 .RetiresOnSaturation();
555 // Read final byte.
556 EXPECT_CALL(mock_socket_, Read(NotNull(), 1, _))
557 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message.substr(
558 serialized_message.size() - 1, 1)),
559 Return(1)))
560 .RetiresOnSaturation();
561 EXPECT_CALL(delegate_, OnMessage(&mock_socket_, EqualsProto(message)));
562 EXPECT_CALL(mock_socket_,
563 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
564 .WillOnce(Return(net::ERR_IO_PENDING));
565 transport_->StartReadLoop();
566 }
567
568 TEST_F(CastTransportTest, TestReadErrorInHeaderSync) {
569 CastMessage message = CreateCastMessage();
570 std::string serialized_message;
571 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
572
573 // Read bytes [0, 3].
574 EXPECT_CALL(mock_socket_,
575 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
576 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message),
577 Return(net::ERR_CONNECTION_RESET)))
578 .RetiresOnSaturation();
579 EXPECT_CALL(delegate_,
580 OnError(&mock_socket_, CHANNEL_ERROR_TRANSPORT_ERROR, _));
581 transport_->StartReadLoop();
582 }
583
584 TEST_F(CastTransportTest, TestReadErrorInBodySync) {
585 CastMessage message = CreateCastMessage();
586 std::string serialized_message;
587 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
588
589 // Read bytes [0, 3].
590 EXPECT_CALL(mock_socket_,
591 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
592 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message),
593 Return(MessageFramer::MessageHeader::header_size())))
594 .RetiresOnSaturation();
595 // Read bytes [4, n-1].
596 EXPECT_CALL(mock_socket_,
597 Read(NotNull(),
598 serialized_message.size() -
599 MessageFramer::MessageHeader::header_size(),
600 _))
601 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message.substr(
602 MessageFramer::MessageHeader::header_size(),
603 serialized_message.size() -
604 MessageFramer::MessageHeader::header_size() - 1)),
605 Return(net::ERR_CONNECTION_RESET)))
606 .RetiresOnSaturation();
607 EXPECT_CALL(delegate_,
608 OnError(&mock_socket_, CHANNEL_ERROR_TRANSPORT_ERROR, _));
609 transport_->StartReadLoop();
610 }
611
612 TEST_F(CastTransportTest, TestReadCorruptedMessageSync) {
613 CastMessage message = CreateCastMessage();
614 std::string serialized_message;
615 EXPECT_TRUE(MessageFramer::Serialize(message, &serialized_message));
616
617 // Corrupt the serialized message body(set it to X's).
618 for (size_t i = MessageFramer::MessageHeader::header_size();
619 i < serialized_message.size();
620 ++i) {
621 serialized_message[i] = 'x';
622 }
623
624 // Read bytes [0, 3].
625 EXPECT_CALL(mock_socket_,
626 Read(NotNull(), MessageFramer::MessageHeader::header_size(), _))
627 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message),
628 Return(MessageFramer::MessageHeader::header_size())))
629 .RetiresOnSaturation();
630 // Read bytes [4, n].
631 EXPECT_CALL(mock_socket_,
632 Read(NotNull(),
633 serialized_message.size() -
634 MessageFramer::MessageHeader::header_size(),
635 _))
636 .WillOnce(DoAll(FillBufferFromString<0>(serialized_message.substr(
637 MessageFramer::MessageHeader::header_size(),
638 serialized_message.size() -
639 MessageFramer::MessageHeader::header_size() - 1)),
640 Return(serialized_message.size() -
641 MessageFramer::MessageHeader::header_size())))
642 .RetiresOnSaturation();
643 EXPECT_CALL(delegate_,
644 OnError(&mock_socket_, CHANNEL_ERROR_INVALID_MESSAGE, _));
645 transport_->StartReadLoop();
646 }
647 } // namespace cast_channel
648 } // namespace core_api
649 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698