OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <stddef.h> | 5 #include <stddef.h> |
6 #include <string> | 6 #include <string> |
7 | 7 |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/sys_byteorder.h" | 9 #include "base/sys_byteorder.h" |
| 10 #include "blimp/net/blimp_connection_statistics.h" |
10 #include "blimp/net/common.h" | 11 #include "blimp/net/common.h" |
11 #include "blimp/net/stream_packet_reader.h" | 12 #include "blimp/net/stream_packet_reader.h" |
12 #include "blimp/net/test_common.h" | 13 #include "blimp/net/test_common.h" |
13 #include "net/base/completion_callback.h" | 14 #include "net/base/completion_callback.h" |
14 #include "net/base/io_buffer.h" | 15 #include "net/base/io_buffer.h" |
15 #include "net/base/net_errors.h" | 16 #include "net/base/net_errors.h" |
16 #include "net/base/test_completion_callback.h" | 17 #include "net/base/test_completion_callback.h" |
17 #include "net/socket/socket.h" | 18 #include "net/socket/socket.h" |
18 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
20 | 21 |
21 using testing::_; | 22 using testing::_; |
22 using testing::DoAll; | 23 using testing::DoAll; |
23 using testing::Mock; | 24 using testing::Mock; |
24 using testing::NotNull; | 25 using testing::NotNull; |
25 using testing::Return; | 26 using testing::Return; |
26 using testing::SaveArg; | 27 using testing::SaveArg; |
27 using testing::WithArg; | 28 using testing::WithArg; |
28 | 29 |
29 namespace blimp { | 30 namespace blimp { |
30 namespace { | 31 namespace { |
31 | 32 |
32 class StreamPacketReaderTest : public testing::Test { | 33 class StreamPacketReaderTest : public testing::Test { |
33 public: | 34 public: |
34 StreamPacketReaderTest() | 35 StreamPacketReaderTest() |
35 : buffer_(new net::GrowableIOBuffer), | 36 : buffer_(new net::GrowableIOBuffer), |
36 test_msg_("U WOT M8"), | 37 test_msg_("U WOT M8"), |
37 data_reader_(&socket_) {} | 38 data_reader_(&socket_, &statistics_) {} |
38 | 39 |
39 ~StreamPacketReaderTest() override {} | 40 ~StreamPacketReaderTest() override {} |
40 | 41 |
41 void ReadPacket() { data_reader_.ReadPacket(buffer_, callback_.callback()); } | 42 void ReadPacket() { data_reader_.ReadPacket(buffer_, callback_.callback()); } |
42 | 43 |
43 protected: | 44 protected: |
44 base::MessageLoop message_loop_; | 45 base::MessageLoop message_loop_; |
45 scoped_refptr<net::GrowableIOBuffer> buffer_; | 46 scoped_refptr<net::GrowableIOBuffer> buffer_; |
46 std::string test_msg_; | 47 std::string test_msg_; |
47 net::TestCompletionCallback callback_; | 48 net::TestCompletionCallback callback_; |
48 testing::StrictMock<MockStreamSocket> socket_; | 49 testing::StrictMock<MockStreamSocket> socket_; |
49 testing::InSequence sequence_; | 50 testing::InSequence sequence_; |
| 51 BlimpConnectionStatistics statistics_; |
50 StreamPacketReader data_reader_; | 52 StreamPacketReader data_reader_; |
51 }; | 53 }; |
52 | 54 |
53 // Successful read with 1 async header read and 1 async payload read. | 55 // Successful read with 1 async header read and 1 async payload read. |
54 TEST_F(StreamPacketReaderTest, ReadAsyncHeaderAsyncPayload) { | 56 TEST_F(StreamPacketReaderTest, ReadAsyncHeaderAsyncPayload) { |
55 net::CompletionCallback socket_cb; | 57 net::CompletionCallback socket_cb; |
56 | 58 |
57 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 59 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
58 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 60 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
59 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); | 61 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 .RetiresOnSaturation(); | 151 .RetiresOnSaturation(); |
150 | 152 |
151 // Read the second message's payload synchronously. | 153 // Read the second message's payload synchronously. |
152 EXPECT_CALL(socket_, Read(NotNull(), test_msg2.size(), _)) | 154 EXPECT_CALL(socket_, Read(NotNull(), test_msg2.size(), _)) |
153 .WillOnce( | 155 .WillOnce( |
154 DoAll(FillBufferFromString<0>(test_msg2), Return(test_msg2.size()))) | 156 DoAll(FillBufferFromString<0>(test_msg2), Return(test_msg2.size()))) |
155 .RetiresOnSaturation(); | 157 .RetiresOnSaturation(); |
156 | 158 |
157 ReadPacket(); | 159 ReadPacket(); |
158 ASSERT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); | 160 ASSERT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); |
| 161 EXPECT_EQ(static_cast<int>(test_msg_.size()), |
| 162 statistics_.Get(BlimpConnectionStatistics::BYTES_RECEIVED)); |
159 | 163 |
160 ReadPacket(); | 164 ReadPacket(); |
161 ASSERT_EQ(static_cast<int>(test_msg2.size()), callback_.WaitForResult()); | 165 ASSERT_EQ(static_cast<int>(test_msg2.size()), callback_.WaitForResult()); |
| 166 EXPECT_EQ(static_cast<int>(test_msg_.size() + test_msg2.size()), |
| 167 statistics_.Get(BlimpConnectionStatistics::BYTES_RECEIVED)); |
162 | 168 |
163 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg2.size(), test_msg2)); | 169 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg2.size(), test_msg2)); |
164 EXPECT_FALSE(callback_.have_result()); | 170 EXPECT_FALSE(callback_.have_result()); |
165 } | 171 } |
166 | 172 |
167 // Successful read of 2 messages, header and payload reads all completing | 173 // Successful read of 2 messages, header and payload reads all completing |
168 // asynchronously with no partial results. | 174 // asynchronously with no partial results. |
169 TEST_F(StreamPacketReaderTest, ReadMultipleMessagesAsync) { | 175 TEST_F(StreamPacketReaderTest, ReadMultipleMessagesAsync) { |
170 net::TestCompletionCallback read_cb1; | 176 net::TestCompletionCallback read_cb1; |
171 net::TestCompletionCallback read_cb2; | 177 net::TestCompletionCallback read_cb2; |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 ReadPacket(); | 312 ReadPacket(); |
307 cb.Run(net::ERR_FAILED); | 313 cb.Run(net::ERR_FAILED); |
308 EXPECT_EQ(net::ERR_FAILED, callback_.WaitForResult()); | 314 EXPECT_EQ(net::ERR_FAILED, callback_.WaitForResult()); |
309 } | 315 } |
310 | 316 |
311 // Verify that async header read completions don't break us if the | 317 // Verify that async header read completions don't break us if the |
312 // StreamPacketReader object was destroyed. | 318 // StreamPacketReader object was destroyed. |
313 TEST_F(StreamPacketReaderTest, ReaderDeletedDuringAsyncHeaderRead) { | 319 TEST_F(StreamPacketReaderTest, ReaderDeletedDuringAsyncHeaderRead) { |
314 net::CompletionCallback cb; | 320 net::CompletionCallback cb; |
315 net::TestCompletionCallback test_cb; | 321 net::TestCompletionCallback test_cb; |
316 std::unique_ptr<StreamPacketReader> reader(new StreamPacketReader(&socket_)); | 322 std::unique_ptr<StreamPacketReader> reader( |
| 323 new StreamPacketReader(&socket_, &statistics_)); |
317 | 324 |
318 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 325 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
319 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 326 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
320 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); | 327 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); |
321 | 328 |
322 reader->ReadPacket(buffer_, callback_.callback()); | 329 reader->ReadPacket(buffer_, callback_.callback()); |
323 reader.reset(); // Delete the reader object. | 330 reader.reset(); // Delete the reader object. |
324 cb.Run(kPacketHeaderSizeBytes); // Complete the socket operation. | 331 cb.Run(kPacketHeaderSizeBytes); // Complete the socket operation. |
325 } | 332 } |
326 | 333 |
327 // Verify that async payload read completions don't break us if the | 334 // Verify that async payload read completions don't break us if the |
328 // StreamPacketReader object was destroyed. | 335 // StreamPacketReader object was destroyed. |
329 TEST_F(StreamPacketReaderTest, ReaderDeletedDuringAsyncPayloadRead) { | 336 TEST_F(StreamPacketReaderTest, ReaderDeletedDuringAsyncPayloadRead) { |
330 net::CompletionCallback cb; | 337 net::CompletionCallback cb; |
331 std::unique_ptr<StreamPacketReader> reader(new StreamPacketReader(&socket_)); | 338 std::unique_ptr<StreamPacketReader> reader( |
| 339 new StreamPacketReader(&socket_, &statistics_)); |
332 | 340 |
333 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 341 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
334 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 342 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
335 Return(kPacketHeaderSizeBytes))); | 343 Return(kPacketHeaderSizeBytes))); |
336 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 344 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
337 .WillOnce(DoAll(SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); | 345 .WillOnce(DoAll(SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); |
338 reader->ReadPacket(buffer_, callback_.callback()); | 346 reader->ReadPacket(buffer_, callback_.callback()); |
339 | 347 |
340 reader.reset(); // Delete the reader object. | 348 reader.reset(); // Delete the reader object. |
341 cb.Run(net::ERR_FAILED); // Complete the socket operation. | 349 cb.Run(net::ERR_FAILED); // Complete the socket operation. |
(...skipping 17 matching lines...) Expand all Loading... |
359 FillBufferFromString<0>(EncodeHeader(kMaxPacketPayloadSizeBytes + 1)), | 367 FillBufferFromString<0>(EncodeHeader(kMaxPacketPayloadSizeBytes + 1)), |
360 Return(kPacketHeaderSizeBytes))); | 368 Return(kPacketHeaderSizeBytes))); |
361 | 369 |
362 ReadPacket(); | 370 ReadPacket(); |
363 EXPECT_EQ(net::ERR_INVALID_RESPONSE, callback_.WaitForResult()); | 371 EXPECT_EQ(net::ERR_INVALID_RESPONSE, callback_.WaitForResult()); |
364 } | 372 } |
365 | 373 |
366 } // namespace | 374 } // namespace |
367 | 375 |
368 } // namespace blimp | 376 } // namespace blimp |
OLD | NEW |