| 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/sys_byteorder.h" | 8 #include "base/sys_byteorder.h" |
| 9 #include "blimp/net/common.h" | 9 #include "blimp/net/common.h" |
| 10 #include "blimp/net/stream_packet_reader.h" | 10 #include "blimp/net/stream_packet_reader.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 public: | 34 public: |
| 35 StreamPacketReaderTest() | 35 StreamPacketReaderTest() |
| 36 : buffer_(new net::GrowableIOBuffer), | 36 : buffer_(new net::GrowableIOBuffer), |
| 37 test_msg_("U WOT M8"), | 37 test_msg_("U WOT M8"), |
| 38 data_reader_(&socket_) { | 38 data_reader_(&socket_) { |
| 39 buffer_->SetCapacity(kTestMaxBufferSize); | 39 buffer_->SetCapacity(kTestMaxBufferSize); |
| 40 } | 40 } |
| 41 | 41 |
| 42 ~StreamPacketReaderTest() override {} | 42 ~StreamPacketReaderTest() override {} |
| 43 | 43 |
| 44 int ReadPacket() { | 44 void ReadPacket() { data_reader_.ReadPacket(buffer_, callback_.callback()); } |
| 45 return data_reader_.ReadPacket(buffer_, callback_.callback()); | |
| 46 } | |
| 47 | 45 |
| 48 protected: | 46 protected: |
| 49 scoped_refptr<net::GrowableIOBuffer> buffer_; | 47 scoped_refptr<net::GrowableIOBuffer> buffer_; |
| 50 std::string test_msg_; | 48 std::string test_msg_; |
| 51 net::TestCompletionCallback callback_; | 49 net::TestCompletionCallback callback_; |
| 52 testing::StrictMock<MockStreamSocket> socket_; | 50 testing::StrictMock<MockStreamSocket> socket_; |
| 53 testing::InSequence sequence_; | 51 testing::InSequence sequence_; |
| 54 StreamPacketReader data_reader_; | 52 StreamPacketReader data_reader_; |
| 55 }; | 53 }; |
| 56 | 54 |
| 57 // 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. |
| 58 TEST_F(StreamPacketReaderTest, ReadAsyncHeaderAsyncPayload) { | 56 TEST_F(StreamPacketReaderTest, ReadAsyncHeaderAsyncPayload) { |
| 59 net::CompletionCallback socket_cb; | 57 net::CompletionCallback socket_cb; |
| 60 | 58 |
| 61 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 59 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 62 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 60 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 63 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); | 61 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); |
| 64 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 62 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 65 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_), | 63 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_), |
| 66 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); | 64 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); |
| 67 | 65 |
| 68 EXPECT_EQ(net::ERR_IO_PENDING, ReadPacket()); | 66 ReadPacket(); |
| 69 socket_cb.Run(kPacketHeaderSizeBytes); | 67 socket_cb.Run(kPacketHeaderSizeBytes); |
| 70 socket_cb.Run(test_msg_.size()); | 68 socket_cb.Run(test_msg_.size()); |
| 71 int rv = callback_.WaitForResult(); | 69 EXPECT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); |
| 72 | |
| 73 EXPECT_EQ(rv, static_cast<int>(test_msg_.size())); | |
| 74 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); | 70 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); |
| 75 } | 71 } |
| 76 | 72 |
| 77 // Successful read with 1 async header read and 1 sync payload read. | 73 // Successful read with 1 async header read and 1 sync payload read. |
| 78 TEST_F(StreamPacketReaderTest, ReadAsyncHeaderSyncPayload) { | 74 TEST_F(StreamPacketReaderTest, ReadAsyncHeaderSyncPayload) { |
| 79 net::CompletionCallback socket_cb; | 75 net::CompletionCallback socket_cb; |
| 80 | 76 |
| 81 // Asynchronous payload read expectation. | 77 // Asynchronous payload read expectation. |
| 82 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 78 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 83 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 79 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 84 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); | 80 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); |
| 85 | 81 |
| 86 // Synchronous payload read expectation. Fills the buffer and returns | 82 // Synchronous payload read expectation. Fills the buffer and returns |
| 87 // immediately. | 83 // immediately. |
| 88 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 84 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 89 .WillOnce( | 85 .WillOnce( |
| 90 DoAll(FillBufferFromString<0>(test_msg_), Return(test_msg_.size()))); | 86 DoAll(FillBufferFromString<0>(test_msg_), Return(test_msg_.size()))); |
| 91 | 87 |
| 92 EXPECT_EQ(net::ERR_IO_PENDING, ReadPacket()); | 88 ReadPacket(); |
| 93 EXPECT_FALSE(callback_.have_result()); | 89 EXPECT_FALSE(callback_.have_result()); |
| 94 | 90 |
| 95 socket_cb.Run(kPacketHeaderSizeBytes); | 91 socket_cb.Run(kPacketHeaderSizeBytes); |
| 96 int rv = callback_.WaitForResult(); | 92 EXPECT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); |
| 97 EXPECT_GT(rv, 0); | |
| 98 EXPECT_EQ(rv, static_cast<int>(test_msg_.size())); | |
| 99 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); | 93 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); |
| 100 } | 94 } |
| 101 | 95 |
| 102 // Successful read with 1 sync header read and 1 async payload read. | 96 // Successful read with 1 sync header read and 1 async payload read. |
| 103 TEST_F(StreamPacketReaderTest, ReadSyncHeaderAsyncPayload) { | 97 TEST_F(StreamPacketReaderTest, ReadSyncHeaderAsyncPayload) { |
| 104 net::CompletionCallback socket_cb; | 98 net::CompletionCallback socket_cb; |
| 105 | 99 |
| 106 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 100 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 107 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 101 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 108 Return(kPacketHeaderSizeBytes))); | 102 Return(kPacketHeaderSizeBytes))); |
| 109 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 103 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 110 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_), | 104 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_), |
| 111 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); | 105 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))); |
| 112 | 106 |
| 113 EXPECT_EQ(net::ERR_IO_PENDING, ReadPacket()); | 107 ReadPacket(); |
| 114 socket_cb.Run(test_msg_.size()); | 108 socket_cb.Run(test_msg_.size()); |
| 115 int rv = callback_.WaitForResult(); | 109 EXPECT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); |
| 116 | |
| 117 EXPECT_GT(rv, 0); | |
| 118 EXPECT_EQ(rv, static_cast<int>(test_msg_.size())); | |
| 119 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); | 110 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); |
| 120 } | 111 } |
| 121 | 112 |
| 122 // Successful read with 1 sync header read and 1 sync payload read. | 113 // Successful read with 1 sync header read and 1 sync payload read. |
| 123 TEST_F(StreamPacketReaderTest, ReadSyncHeaderSyncPayload) { | 114 TEST_F(StreamPacketReaderTest, ReadSyncHeaderSyncPayload) { |
| 124 net::CompletionCallback socket_cb; | 115 net::CompletionCallback socket_cb; |
| 125 | 116 |
| 126 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 117 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 127 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 118 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 128 Return(kPacketHeaderSizeBytes))); | 119 Return(kPacketHeaderSizeBytes))); |
| 129 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 120 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 130 .WillOnce( | 121 .WillOnce( |
| 131 DoAll(FillBufferFromString<0>(test_msg_), Return(test_msg_.size()))); | 122 DoAll(FillBufferFromString<0>(test_msg_), Return(test_msg_.size()))); |
| 132 | 123 |
| 133 int rv = ReadPacket(); | 124 ReadPacket(); |
| 134 | 125 EXPECT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); |
| 135 EXPECT_GT(rv, 0); | |
| 136 EXPECT_EQ(rv, static_cast<int>(test_msg_.size())); | |
| 137 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); | 126 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); |
| 138 EXPECT_FALSE(callback_.have_result()); | |
| 139 } | 127 } |
| 140 | 128 |
| 141 // Successful read of 2 messages, header and payload reads all completing | 129 // Successful read of 2 messages, header and payload reads all completing |
| 142 // synchronously with no partial results. | 130 // synchronously with no partial results. |
| 143 TEST_F(StreamPacketReaderTest, ReadMultipleMessagesSync) { | 131 TEST_F(StreamPacketReaderTest, ReadMultipleMessagesSync) { |
| 144 net::CompletionCallback socket_cb; | 132 net::CompletionCallback socket_cb; |
| 145 std::string test_msg2 = test_msg_ + "SlightlyLongerString"; | 133 std::string test_msg2 = test_msg_ + "SlightlyLongerString"; |
| 146 | 134 |
| 147 // Read the first message's header synchronously. | 135 // Read the first message's header synchronously. |
| 148 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 136 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 161 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg2.size())), | 149 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg2.size())), |
| 162 Return(kPacketHeaderSizeBytes))) | 150 Return(kPacketHeaderSizeBytes))) |
| 163 .RetiresOnSaturation(); | 151 .RetiresOnSaturation(); |
| 164 | 152 |
| 165 // Read the second message's payload synchronously. | 153 // Read the second message's payload synchronously. |
| 166 EXPECT_CALL(socket_, Read(NotNull(), test_msg2.size(), _)) | 154 EXPECT_CALL(socket_, Read(NotNull(), test_msg2.size(), _)) |
| 167 .WillOnce( | 155 .WillOnce( |
| 168 DoAll(FillBufferFromString<0>(test_msg2), Return(test_msg2.size()))) | 156 DoAll(FillBufferFromString<0>(test_msg2), Return(test_msg2.size()))) |
| 169 .RetiresOnSaturation(); | 157 .RetiresOnSaturation(); |
| 170 | 158 |
| 171 int rv = ReadPacket(); | 159 ReadPacket(); |
| 160 EXPECT_EQ(callback_.WaitForResult(), static_cast<int>(test_msg_.size())); |
| 172 | 161 |
| 173 EXPECT_GT(rv, 0); | 162 ReadPacket(); |
| 174 EXPECT_EQ(rv, static_cast<int>(test_msg_.size())); | 163 EXPECT_EQ(callback_.WaitForResult(), static_cast<int>(test_msg2.size())); |
| 175 rv = ReadPacket(); | 164 |
| 176 EXPECT_GT(rv, 0); | |
| 177 EXPECT_EQ(rv, static_cast<int>(test_msg2.size())); | |
| 178 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); | 165 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); |
| 179 EXPECT_FALSE(callback_.have_result()); | 166 EXPECT_FALSE(callback_.have_result()); |
| 180 } | 167 } |
| 181 | 168 |
| 182 // Successful read of 2 messages, header and payload reads all completing | 169 // Successful read of 2 messages, header and payload reads all completing |
| 183 // asynchronously with no partial results. | 170 // asynchronously with no partial results. |
| 184 TEST_F(StreamPacketReaderTest, ReadMultipleMessagesAsync) { | 171 TEST_F(StreamPacketReaderTest, ReadMultipleMessagesAsync) { |
| 185 net::TestCompletionCallback read_cb1; | 172 net::TestCompletionCallback read_cb1; |
| 186 net::TestCompletionCallback read_cb2; | 173 net::TestCompletionCallback read_cb2; |
| 187 net::CompletionCallback socket_cb; | 174 net::CompletionCallback socket_cb; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 203 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 190 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 204 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))) | 191 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))) |
| 205 .RetiresOnSaturation(); | 192 .RetiresOnSaturation(); |
| 206 | 193 |
| 207 // Read a payload asynchronously. | 194 // Read a payload asynchronously. |
| 208 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 195 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 209 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_), | 196 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_), |
| 210 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))) | 197 SaveArg<2>(&socket_cb), Return(net::ERR_IO_PENDING))) |
| 211 .RetiresOnSaturation(); | 198 .RetiresOnSaturation(); |
| 212 | 199 |
| 213 EXPECT_EQ(net::ERR_IO_PENDING, | 200 data_reader_.ReadPacket(buffer_, read_cb1.callback()); |
| 214 data_reader_.ReadPacket(buffer_, read_cb1.callback())); | |
| 215 socket_cb.Run(kPacketHeaderSizeBytes); | 201 socket_cb.Run(kPacketHeaderSizeBytes); |
| 216 socket_cb.Run(test_msg_.size()); | 202 socket_cb.Run(test_msg_.size()); |
| 217 int rv = read_cb1.WaitForResult(); | 203 int rv = read_cb1.WaitForResult(); |
| 218 | 204 |
| 219 EXPECT_GT(rv, 0); | 205 EXPECT_GT(rv, 0); |
| 220 EXPECT_EQ(rv, static_cast<int>(test_msg_.size())); | 206 EXPECT_EQ(rv, static_cast<int>(test_msg_.size())); |
| 221 | 207 |
| 222 EXPECT_EQ(net::ERR_IO_PENDING, | 208 data_reader_.ReadPacket(buffer_, read_cb2.callback()); |
| 223 data_reader_.ReadPacket(buffer_, read_cb2.callback())); | |
| 224 socket_cb.Run(kPacketHeaderSizeBytes); | 209 socket_cb.Run(kPacketHeaderSizeBytes); |
| 225 socket_cb.Run(test_msg_.size()); | 210 socket_cb.Run(test_msg_.size()); |
| 226 rv = read_cb2.WaitForResult(); | 211 rv = read_cb2.WaitForResult(); |
| 227 | 212 |
| 228 EXPECT_GT(rv, 0); | 213 EXPECT_GT(rv, 0); |
| 229 EXPECT_EQ(rv, static_cast<int>(test_msg_.size())); | 214 EXPECT_EQ(rv, static_cast<int>(test_msg_.size())); |
| 230 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); | 215 EXPECT_TRUE(BufferStartsWith(buffer_.get(), test_msg_)); |
| 231 } | 216 } |
| 232 | 217 |
| 233 // Verify that partial header reads are supported. | 218 // Verify that partial header reads are supported. |
| 234 // Read #0: 1 header byte is read. | 219 // Read #0: 1 header byte is read. |
| 235 // Read #1: Remainder of header bytes read. | 220 // Read #1: Remainder of header bytes read. |
| 236 TEST_F(StreamPacketReaderTest, PartialHeaderReadAsync) { | 221 TEST_F(StreamPacketReaderTest, PartialHeaderReadAsync) { |
| 237 net::CompletionCallback cb; | 222 net::CompletionCallback cb; |
| 238 std::string header = EncodeHeader(test_msg_.size()); | 223 std::string header = EncodeHeader(test_msg_.size()); |
| 239 | 224 |
| 240 // The first byte is received (sliced via substr()). | 225 // The first byte is received (sliced via substr()). |
| 241 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 226 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 242 .WillOnce(DoAll(FillBufferFromString<0>(header.substr(0, 1)), | 227 .WillOnce(DoAll(FillBufferFromString<0>(header.substr(0, 1)), |
| 243 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); | 228 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); |
| 244 // The remainder is received (sliced via substr()). | 229 // The remainder is received (sliced via substr()). |
| 245 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes - 1, _)) | 230 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes - 1, _)) |
| 246 .WillOnce(DoAll( | 231 .WillOnce(DoAll( |
| 247 FillBufferFromString<0>(header.substr(1, kPacketHeaderSizeBytes - 1)), | 232 FillBufferFromString<0>(header.substr(1, kPacketHeaderSizeBytes - 1)), |
| 248 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); | 233 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); |
| 249 // Verify that we start reading the body once the header has been fully read. | 234 // Verify that we start reading the body once the header has been fully read. |
| 250 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 235 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 251 .WillOnce(Return(net::ERR_IO_PENDING)); | 236 .WillOnce(Return(net::ERR_IO_PENDING)); |
| 252 | 237 |
| 253 EXPECT_EQ(net::ERR_IO_PENDING, ReadPacket()); | 238 ReadPacket(); |
| 254 cb.Run(1); | 239 cb.Run(1); |
| 255 cb.Run(kPacketHeaderSizeBytes - 1); | 240 cb.Run(kPacketHeaderSizeBytes - 1); |
| 256 } | 241 } |
| 257 | 242 |
| 258 // Verify that partial payload reads are supported. | 243 // Verify that partial payload reads are supported. |
| 259 // Read #0: Header is fully read synchronously. | 244 // Read #0: Header is fully read synchronously. |
| 260 // Read #1: First payload byte is read. (Um, it's an acoustic cup modem.) | 245 // Read #1: First payload byte is read. (Um, it's an acoustic cup modem.) |
| 261 // Read #2: Remainder of payload bytes are read. | 246 // Read #2: Remainder of payload bytes are read. |
| 262 TEST_F(StreamPacketReaderTest, PartialPayloadReadAsync) { | 247 TEST_F(StreamPacketReaderTest, PartialPayloadReadAsync) { |
| 263 net::CompletionCallback cb; | 248 net::CompletionCallback cb; |
| 264 | 249 |
| 265 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 250 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 266 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 251 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 267 Return(kPacketHeaderSizeBytes))); | 252 Return(kPacketHeaderSizeBytes))); |
| 268 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 253 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 269 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_.substr(0, 1)), | 254 .WillOnce(DoAll(FillBufferFromString<0>(test_msg_.substr(0, 1)), |
| 270 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); | 255 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); |
| 271 EXPECT_EQ(net::ERR_IO_PENDING, ReadPacket()); | 256 ReadPacket(); |
| 272 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size() - 1, _)) | 257 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size() - 1, _)) |
| 273 .WillOnce(DoAll( | 258 .WillOnce(DoAll( |
| 274 FillBufferFromString<0>(test_msg_.substr(1, test_msg_.size() - 1)), | 259 FillBufferFromString<0>(test_msg_.substr(1, test_msg_.size() - 1)), |
| 275 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); | 260 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); |
| 276 | 261 |
| 277 cb.Run(1); | 262 cb.Run(1); |
| 278 cb.Run(test_msg_.size() - 1); | 263 cb.Run(test_msg_.size() - 1); |
| 279 int rv = callback_.WaitForResult(); | 264 EXPECT_EQ(static_cast<int>(test_msg_.size()), callback_.WaitForResult()); |
| 280 | |
| 281 EXPECT_GT(rv, 0); | |
| 282 EXPECT_EQ(static_cast<int>(test_msg_.size()), rv); | |
| 283 } | 265 } |
| 284 | 266 |
| 285 // Verify that synchronous header read errors are reported correctly. | 267 // Verify that synchronous header read errors are reported correctly. |
| 286 TEST_F(StreamPacketReaderTest, ReadHeaderErrorSync) { | 268 TEST_F(StreamPacketReaderTest, ReadHeaderErrorSync) { |
| 287 net::CompletionCallback cb; | 269 net::CompletionCallback cb; |
| 288 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 270 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 289 .WillOnce(Return(net::ERR_FAILED)); | 271 .WillOnce(Return(net::ERR_FAILED)); |
| 290 EXPECT_EQ(net::ERR_FAILED, ReadPacket()); | 272 ReadPacket(); |
| 273 EXPECT_EQ(net::ERR_FAILED, callback_.WaitForResult()); |
| 291 } | 274 } |
| 292 | 275 |
| 293 // Verify that synchronous payload read errors are reported correctly. | 276 // Verify that synchronous payload read errors are reported correctly. |
| 294 TEST_F(StreamPacketReaderTest, ReadPayloadErrorSync) { | 277 TEST_F(StreamPacketReaderTest, ReadPayloadErrorSync) { |
| 295 net::CompletionCallback cb; | 278 net::CompletionCallback cb; |
| 296 | 279 |
| 297 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 280 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 298 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 281 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 299 Return(kPacketHeaderSizeBytes))); | 282 Return(kPacketHeaderSizeBytes))); |
| 300 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 283 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 301 .WillOnce(Return(net::ERR_FAILED)); | 284 .WillOnce(Return(net::ERR_FAILED)); |
| 302 | 285 |
| 303 EXPECT_EQ(net::ERR_FAILED, ReadPacket()); | 286 ReadPacket(); |
| 287 EXPECT_EQ(net::ERR_FAILED, callback_.WaitForResult()); |
| 304 } | 288 } |
| 305 | 289 |
| 306 // Verify that async header read errors are reported correctly. | 290 // Verify that async header read errors are reported correctly. |
| 307 TEST_F(StreamPacketReaderTest, ReadHeaderErrorAsync) { | 291 TEST_F(StreamPacketReaderTest, ReadHeaderErrorAsync) { |
| 308 net::CompletionCallback cb; | 292 net::CompletionCallback cb; |
| 309 net::TestCompletionCallback test_cb; | 293 net::TestCompletionCallback test_cb; |
| 310 | 294 |
| 311 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 295 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 312 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 296 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 313 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); | 297 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); |
| 314 | 298 |
| 315 EXPECT_EQ(net::ERR_IO_PENDING, ReadPacket()); | 299 ReadPacket(); |
| 316 cb.Run(net::ERR_FAILED); | 300 cb.Run(net::ERR_FAILED); |
| 317 EXPECT_EQ(net::ERR_FAILED, callback_.WaitForResult()); | 301 EXPECT_EQ(net::ERR_FAILED, callback_.WaitForResult()); |
| 318 } | 302 } |
| 319 | 303 |
| 320 // Verify that asynchronous paylod read errors are reported correctly. | 304 // Verify that asynchronous paylod read errors are reported correctly. |
| 321 TEST_F(StreamPacketReaderTest, ReadPayloadErrorAsync) { | 305 TEST_F(StreamPacketReaderTest, ReadPayloadErrorAsync) { |
| 322 net::CompletionCallback cb; | 306 net::CompletionCallback cb; |
| 323 | 307 |
| 324 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 308 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 325 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 309 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 326 Return(kPacketHeaderSizeBytes))); | 310 Return(kPacketHeaderSizeBytes))); |
| 327 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 311 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 328 .WillOnce(DoAll(SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); | 312 .WillOnce(DoAll(SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); |
| 329 | 313 |
| 330 EXPECT_EQ(net::ERR_IO_PENDING, ReadPacket()); | 314 ReadPacket(); |
| 331 cb.Run(net::ERR_FAILED); | 315 cb.Run(net::ERR_FAILED); |
| 332 EXPECT_EQ(net::ERR_FAILED, callback_.WaitForResult()); | 316 EXPECT_EQ(net::ERR_FAILED, callback_.WaitForResult()); |
| 333 } | 317 } |
| 334 | 318 |
| 335 // Verify that async header read completions don't break us if the | 319 // Verify that async header read completions don't break us if the |
| 336 // StreamPacketReader object was destroyed. | 320 // StreamPacketReader object was destroyed. |
| 337 TEST_F(StreamPacketReaderTest, ReaderDeletedDuringAsyncHeaderRead) { | 321 TEST_F(StreamPacketReaderTest, ReaderDeletedDuringAsyncHeaderRead) { |
| 338 net::CompletionCallback cb; | 322 net::CompletionCallback cb; |
| 339 net::TestCompletionCallback test_cb; | 323 net::TestCompletionCallback test_cb; |
| 340 scoped_ptr<StreamPacketReader> reader(new StreamPacketReader(&socket_)); | 324 scoped_ptr<StreamPacketReader> reader(new StreamPacketReader(&socket_)); |
| 341 | 325 |
| 342 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 326 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 343 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 327 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 344 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); | 328 SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); |
| 345 | 329 |
| 346 EXPECT_EQ(net::ERR_IO_PENDING, | 330 reader->ReadPacket(buffer_, callback_.callback()); |
| 347 reader->ReadPacket(buffer_, callback_.callback())); | |
| 348 reader.reset(); // Delete the reader object. | 331 reader.reset(); // Delete the reader object. |
| 349 cb.Run(kPacketHeaderSizeBytes); // Complete the socket operation. | 332 cb.Run(kPacketHeaderSizeBytes); // Complete the socket operation. |
| 350 } | 333 } |
| 351 | 334 |
| 352 // Verify that async payload read completions don't break us if the | 335 // Verify that async payload read completions don't break us if the |
| 353 // StreamPacketReader object was destroyed. | 336 // StreamPacketReader object was destroyed. |
| 354 TEST_F(StreamPacketReaderTest, ReaderDeletedDuringAsyncPayloadRead) { | 337 TEST_F(StreamPacketReaderTest, ReaderDeletedDuringAsyncPayloadRead) { |
| 355 net::CompletionCallback cb; | 338 net::CompletionCallback cb; |
| 356 scoped_ptr<StreamPacketReader> reader(new StreamPacketReader(&socket_)); | 339 scoped_ptr<StreamPacketReader> reader(new StreamPacketReader(&socket_)); |
| 357 | 340 |
| 358 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 341 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 359 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), | 342 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(test_msg_.size())), |
| 360 Return(kPacketHeaderSizeBytes))); | 343 Return(kPacketHeaderSizeBytes))); |
| 361 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) | 344 EXPECT_CALL(socket_, Read(NotNull(), test_msg_.size(), _)) |
| 362 .WillOnce(DoAll(SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); | 345 .WillOnce(DoAll(SaveArg<2>(&cb), Return(net::ERR_IO_PENDING))); |
| 363 EXPECT_EQ(net::ERR_IO_PENDING, | 346 reader->ReadPacket(buffer_, callback_.callback()); |
| 364 reader->ReadPacket(buffer_, callback_.callback())); | |
| 365 | 347 |
| 366 reader.reset(); // Delete the reader object. | 348 reader.reset(); // Delete the reader object. |
| 367 cb.Run(net::ERR_FAILED); // Complete the socket operation. | 349 cb.Run(net::ERR_FAILED); // Complete the socket operation. |
| 368 } | 350 } |
| 369 | 351 |
| 370 // Verify that zero-length payload is reported as an erroneous input. | 352 // Verify that zero-length payload is reported as an erroneous input. |
| 371 TEST_F(StreamPacketReaderTest, ReadWhatIsThisAPacketForAnts) { | 353 TEST_F(StreamPacketReaderTest, ReadWhatIsThisAPacketForAnts) { |
| 372 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 354 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 373 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(0)), | 355 .WillOnce(DoAll(FillBufferFromString<0>(EncodeHeader(0)), |
| 374 Return(kPacketHeaderSizeBytes))) | 356 Return(kPacketHeaderSizeBytes))) |
| 375 .RetiresOnSaturation(); | 357 .RetiresOnSaturation(); |
| 376 | 358 |
| 377 EXPECT_EQ(net::ERR_INVALID_RESPONSE, ReadPacket()); | 359 ReadPacket(); |
| 360 EXPECT_EQ(net::ERR_INVALID_RESPONSE, callback_.WaitForResult()); |
| 378 } | 361 } |
| 379 | 362 |
| 380 // Verify that an illegally large payloads is reported as an erroneous inputs. | 363 // Verify that an illegally large payloads is reported as an erroneous inputs. |
| 381 TEST_F(StreamPacketReaderTest, ReadErrorIllegallyLargePayload) { | 364 TEST_F(StreamPacketReaderTest, ReadErrorIllegallyLargePayload) { |
| 382 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) | 365 EXPECT_CALL(socket_, Read(NotNull(), kPacketHeaderSizeBytes, _)) |
| 383 .WillOnce( | 366 .WillOnce( |
| 384 DoAll(FillBufferFromString<0>(EncodeHeader(kTestMaxBufferSize + 1)), | 367 DoAll(FillBufferFromString<0>(EncodeHeader(kTestMaxBufferSize + 1)), |
| 385 Return(kPacketHeaderSizeBytes))); | 368 Return(kPacketHeaderSizeBytes))); |
| 386 | 369 |
| 387 EXPECT_EQ(net::ERR_INVALID_RESPONSE, ReadPacket()); | 370 ReadPacket(); |
| 371 EXPECT_EQ(net::ERR_INVALID_RESPONSE, callback_.WaitForResult()); |
| 388 } | 372 } |
| 389 | 373 |
| 390 } // namespace | 374 } // namespace |
| 391 | 375 |
| 392 } // namespace blimp | 376 } // namespace blimp |
| OLD | NEW |