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