| 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/common.h" | 10 #include "blimp/net/common.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 using testing::DoAll; | 22 using testing::DoAll; |
| 23 using testing::Mock; | 23 using testing::Mock; |
| 24 using testing::NotNull; | 24 using testing::NotNull; |
| 25 using testing::Return; | 25 using testing::Return; |
| 26 using testing::SaveArg; | 26 using testing::SaveArg; |
| 27 using testing::WithArg; | 27 using testing::WithArg; |
| 28 | 28 |
| 29 namespace blimp { | 29 namespace blimp { |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 const size_t kTestMaxBufferSize = 1 << 16; // 64KB | |
| 33 | |
| 34 class StreamPacketReaderTest : public testing::Test { | 32 class StreamPacketReaderTest : public testing::Test { |
| 35 public: | 33 public: |
| 36 StreamPacketReaderTest() | 34 StreamPacketReaderTest() |
| 37 : buffer_(new net::GrowableIOBuffer), | 35 : buffer_(new net::GrowableIOBuffer), |
| 38 test_msg_("U WOT M8"), | 36 test_msg_("U WOT M8"), |
| 39 data_reader_(&socket_) { | 37 data_reader_(&socket_) {} |
| 40 buffer_->SetCapacity(kTestMaxBufferSize); | |
| 41 } | |
| 42 | 38 |
| 43 ~StreamPacketReaderTest() override {} | 39 ~StreamPacketReaderTest() override {} |
| 44 | 40 |
| 45 void ReadPacket() { data_reader_.ReadPacket(buffer_, callback_.callback()); } | 41 void ReadPacket() { data_reader_.ReadPacket(buffer_, callback_.callback()); } |
| 46 | 42 |
| 47 protected: | 43 protected: |
| 48 base::MessageLoop message_loop_; | 44 base::MessageLoop message_loop_; |
| 49 scoped_refptr<net::GrowableIOBuffer> buffer_; | 45 scoped_refptr<net::GrowableIOBuffer> buffer_; |
| 50 std::string test_msg_; | 46 std::string test_msg_; |
| 51 net::TestCompletionCallback callback_; | 47 net::TestCompletionCallback callback_; |
| 52 testing::StrictMock<MockStreamSocket> socket_; | 48 testing::StrictMock<MockStreamSocket> socket_; |
| 53 testing::InSequence sequence_; | 49 testing::InSequence sequence_; |
| 54 StreamPacketReader data_reader_; | 50 StreamPacketReader data_reader_; |
| 55 }; | 51 }; |
| 56 | 52 |
| 57 // 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. |
| 58 TEST_F(StreamPacketReaderTest, ReadAsyncHeaderAsyncPayload) { | 54 TEST_F(StreamPacketReaderTest, ReadAsyncHeaderAsyncPayload) { |
| 59 net::CompletionCallback socket_cb; | 55 net::CompletionCallback socket_cb; |
| 60 | 56 |
| 61 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 57 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 62 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 58 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 63 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); | 59 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); |
| 64 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 60 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 65 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_), | 61 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_), |
| 66 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); | 62 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); |
| 67 | 63 |
| 68 ReadPacket(); | 64 ReadPacket(); |
| 69 socket_cb.Run(kPacketHeaderSizeBytes); | 65 socket_cb.Run(kPacketHeaderSizeBytes); |
| 70 socket_cb.Run(test_msg_.size()); | 66 socket_cb.Run(test_msg_.size()); |
| 71 EXPECT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); | 67 ASSERT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); |
| 72 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); | 68 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_.size(), test_msg_)); |
| 73 } | 69 } |
| 74 | 70 |
| 75 // Successful read with 1 async header read and 1 sync payload read. | 71 // Successful read with 1 async header read and 1 sync payload read. |
| 76 TEST_F(StreamPacketReaderTest, ReadAsyncHeaderSyncPayload) { | 72 TEST_F(StreamPacketReaderTest, ReadAsyncHeaderSyncPayload) { |
| 77 net::CompletionCallback socket_cb; | 73 net::CompletionCallback socket_cb; |
| 78 | 74 |
| 79 // Asynchronous payload read expectation. | 75 // Asynchronous payload read expectation. |
| 80 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 76 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 81 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 77 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 82 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); | 78 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); |
| 83 | 79 |
| 84 // Synchronous payload read expectation. Fills the buffer and returns | 80 // Synchronous payload read expectation. Fills the buffer and returns |
| 85 // immediately. | 81 // immediately. |
| 86 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 82 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 87 .WillOnce( | 83 .WillOnce( |
| 88 DoAll(FillBufferFromString<0>(test_msg_), Return(test_msg_.size()))); | 84 DoAll(FillBufferFromString<0>(test_msg_), Return(test_msg_.size()))); |
| 89 | 85 |
| 90 ReadPacket(); | 86 ReadPacket(); |
| 91 EXPECT_FALSE(callback_.have_result()); | 87 EXPECT_FALSE(callback_.have_result()); |
| 92 | 88 |
| 93 socket_cb.Run(kPacketHeaderSizeBytes); | 89 socket_cb.Run(kPacketHeaderSizeBytes); |
| 94 EXPECT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); | 90 ASSERT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); |
| 95 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); | 91 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_.size(), test_msg_)); |
| 96 } | 92 } |
| 97 | 93 |
| 98 // Successful read with 1 sync header read and 1 async payload read. | 94 // Successful read with 1 sync header read and 1 async payload read. |
| 99 TEST_F(StreamPacketReaderTest, ReadSyncHeaderAsyncPayload) { | 95 TEST_F(StreamPacketReaderTest, ReadSyncHeaderAsyncPayload) { |
| 100 net::CompletionCallback socket_cb; | 96 net::CompletionCallback socket_cb; |
| 101 | 97 |
| 102 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 98 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 103 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 99 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 104 Return(kPacketHeaderSizeBytes))); | 100 Return(kPacketHeaderSizeBytes))); |
| 105 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 101 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 106 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_), | 102 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_), |
| 107 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); | 103 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); |
| 108 | 104 |
| 109 ReadPacket(); | 105 ReadPacket(); |
| 110 socket_cb.Run(test_msg_.size()); | 106 socket_cb.Run(test_msg_.size()); |
| 111 EXPECT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); | 107 ASSERT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); |
| 112 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); | 108 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_.size(), test_msg_)); |
| 113 } | 109 } |
| 114 | 110 |
| 115 // Successful read with 1 sync header read and 1 sync payload read. | 111 // Successful read with 1 sync header read and 1 sync payload read. |
| 116 TEST_F(StreamPacketReaderTest, ReadSyncHeaderSyncPayload) { | 112 TEST_F(StreamPacketReaderTest, ReadSyncHeaderSyncPayload) { |
| 117 net::CompletionCallback socket_cb; | 113 net::CompletionCallback socket_cb; |
| 118 | 114 |
| 119 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 115 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 120 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 116 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 121 Return(kPacketHeaderSizeBytes))); | 117 Return(kPacketHeaderSizeBytes))); |
| 122 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 118 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 123 .WillOnce( | 119 .WillOnce( |
| 124 DoAll(FillBufferFromString<0>(test_msg_), Return(test_msg_.size()))); | 120 DoAll(FillBufferFromString<0>(test_msg_), Return(test_msg_.size()))); |
| 125 | 121 |
| 126 ReadPacket(); | 122 ReadPacket(); |
| 127 EXPECT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); | 123 ASSERT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); |
| 128 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); | 124 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_.size(), test_msg_)); |
| 129 } | 125 } |
| 130 | 126 |
| 131 // Successful read of 2 messages, header and payload reads all completing | 127 // Successful read of 2 messages, header and payload reads all completing |
| 132 // synchronously with no partial results. | 128 // synchronously with no partial results. |
| 133 TEST_F(StreamPacketReaderTest, ReadMultipleMessagesSync) { | 129 TEST_F(StreamPacketReaderTest, ReadMultipleMessagesSync) { |
| 134 net::CompletionCallback socket_cb; | 130 net::CompletionCallback socket_cb; |
| 135 std::string test_msg2 = test_msg_ + "SlightlyLongerString"; | 131 std::string test_msg2 = test_msg_ + "SlightlyLongerString"; |
| 136 | 132 |
| 137 // Read the first message's header synchronously. | 133 // Read the first message's header synchronously. |
| 138 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 134 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| (...skipping 13 matching lines...) Expand all Loading... |
| 152 Return(kPacketHeaderSizeBytes))) | 148 Return(kPacketHeaderSizeBytes))) |
| 153 .RetiresOnSaturation(); | 149 .RetiresOnSaturation(); |
| 154 | 150 |
| 155 // Read the second message's payload synchronously. | 151 // Read the second message's payload synchronously. |
| 156 EXPECT_CALL(socket_, Read(NotNull(), test_msg2.size(), _)) | 152 EXPECT_CALL(socket_, Read(NotNull(), test_msg2.size(), _)) |
| 157 .WillOnce( | 153 .WillOnce( |
| 158 DoAll(FillBufferFromString<0>(test_msg2), Return(test_msg2.size()))) | 154 DoAll(FillBufferFromString<0>(test_msg2), Return(test_msg2.size()))) |
| 159 .RetiresOnSaturation(); | 155 .RetiresOnSaturation(); |
| 160 | 156 |
| 161 ReadPacket(); | 157 ReadPacket(); |
| 162 EXPECT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); | 158 ASSERT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); |
| 163 | 159 |
| 164 ReadPacket(); | 160 ReadPacket(); |
| 165 EXPECT_EQ(static_cast<int>(test_msg2.size()), callback_.WaitForResult()); | 161 ASSERT_EQ(static_cast<int>(test_msg2.size()), callback_.WaitForResult()); |
| 166 | 162 |
| 167 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); | 163 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg2.size(), test_msg2)); |
| 168 EXPECT_FALSE(callback_.have_result()); | 164 EXPECT_FALSE(callback_.have_result()); |
| 169 } | 165 } |
| 170 | 166 |
| 171 // Successful read of 2 messages, header and payload reads all completing | 167 // Successful read of 2 messages, header and payload reads all completing |
| 172 // asynchronously with no partial results. | 168 // asynchronously with no partial results. |
| 173 TEST_F(StreamPacketReaderTest, ReadMultipleMessagesAsync) { | 169 TEST_F(StreamPacketReaderTest, ReadMultipleMessagesAsync) { |
| 174 net::TestCompletionCallback read_cb1; | 170 net::TestCompletionCallback read_cb1; |
| 175 net::TestCompletionCallback read_cb2; | 171 net::TestCompletionCallback read_cb2; |
| 176 net::CompletionCallback socket_cb; | 172 net::CompletionCallback socket_cb; |
| 177 | 173 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 195 | 191 |
| 196 // Read a payload asynchronously. | 192 // Read a payload asynchronously. |
| 197 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 193 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 198 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_), | 194 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_), |
| 199 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))) | 195 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))) |
| 200 .RetiresOnSaturation(); | 196 .RetiresOnSaturation(); |
| 201 | 197 |
| 202 data_reader_.ReadPacket(buffer_, read_cb1.callback()); | 198 data_reader_.ReadPacket(buffer_, read_cb1.callback()); |
| 203 socket_cb.Run(kPacketHeaderSizeBytes); | 199 socket_cb.Run(kPacketHeaderSizeBytes); |
| 204 socket_cb.Run(test_msg_.size()); | 200 socket_cb.Run(test_msg_.size()); |
| 205 EXPECT_EQ(static_cast<int>(test_msg_.size()), read_cb1.WaitForResult()); | 201 ASSERT_EQ(static_cast<int>(test_msg_.size()), read_cb1.WaitForResult()); |
| 206 | 202 |
| 207 data_reader_.ReadPacket(buffer_, read_cb2.callback()); | 203 data_reader_.ReadPacket(buffer_, read_cb2.callback()); |
| 208 socket_cb.Run(kPacketHeaderSizeBytes); | 204 socket_cb.Run(kPacketHeaderSizeBytes); |
| 209 socket_cb.Run(test_msg_.size()); | 205 socket_cb.Run(test_msg_.size()); |
| 210 EXPECT_EQ(static_cast<int>(test_msg_.size()), read_cb2.WaitForResult()); | 206 ASSERT_EQ(static_cast<int>(test_msg_.size()), read_cb2.WaitForResult()); |
| 211 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); | 207 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_.size(), test_msg_)); |
| 212 } | 208 } |
| 213 | 209 |
| 214 // Verify that partial header reads are supported. | 210 // Verify that partial header reads are supported. |
| 215 // Read #0: 1 header byte is read. | 211 // Read #0: 1 header byte is read. |
| 216 // Read #1: Remainder of header bytes read. | 212 // Read #1: Remainder of header bytes read. |
| 217 TEST_F(StreamPacketReaderTest, PartialHeaderReadAsync) { | 213 TEST_F(StreamPacketReaderTest, PartialHeaderReadAsync) { |
| 218 net::CompletionCallback cb; | 214 net::CompletionCallback cb; |
| 219 std::string header = EncodeHeader(test_msg_.size()); | 215 std::string header = EncodeHeader(test_msg_.size()); |
| 220 | 216 |
| 221 // The first byte is received (sliced via substr()). | 217 // The first byte is received (sliced via substr()). |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 Return(kPacketHeaderSizeBytes))) | 348 Return(kPacketHeaderSizeBytes))) |
| 353 .RetiresOnSaturation(); | 349 .RetiresOnSaturation(); |
| 354 | 350 |
| 355 ReadPacket(); | 351 ReadPacket(); |
| 356 EXPECT_EQ(net::ERR_INVALID_RESPONSE, callback_.WaitForResult()); | 352 EXPECT_EQ(net::ERR_INVALID_RESPONSE, callback_.WaitForResult()); |
| 357 } | 353 } |
| 358 | 354 |
| 359 // Verify that an illegally large payloads is reported as an erroneous inputs. | 355 // Verify that an illegally large payloads is reported as an erroneous inputs. |
| 360 TEST_F(StreamPacketReaderTest, ReadErrorIllegallyLargePayload) { | 356 TEST_F(StreamPacketReaderTest, ReadErrorIllegallyLargePayload) { |
| 361 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 357 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 362 .WillOnce( | 358 .WillOnce(DoAll( |
| 363 DoAll(FillBufferFromString<0>(EncodeHeader(kTestMaxBufferSize + 1)), | 359 FillBufferFromString<0>(EncodeHeader(kMaxPacketPayloadSizeBytes + 1)), |
| 364 Return(kPacketHeaderSizeBytes))); | 360 Return(kPacketHeaderSizeBytes))); |
| 365 | 361 |
| 366 ReadPacket(); | 362 ReadPacket(); |
| 367 EXPECT_EQ(net::ERR_INVALID_RESPONSE, callback_.WaitForResult()); | 363 EXPECT_EQ(net::ERR_INVALID_RESPONSE, callback_.WaitForResult()); |
| 368 } | 364 } |
| 369 | 365 |
| 370 } // namespace | 366 } // namespace |
| 371 | 367 |
| 372 } // namespace blimp | 368 } // namespace blimp |
| OLD | NEW |