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