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