OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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 "net/quic/quic_packet_generator.h" | |
6 | |
7 #include <cstdint> | |
8 #include <memory> | |
9 #include <string> | |
10 | |
11 #include "base/macros.h" | |
12 #include "net/quic/crypto/crypto_protocol.h" | |
13 #include "net/quic/crypto/null_encrypter.h" | |
14 #include "net/quic/crypto/quic_decrypter.h" | |
15 #include "net/quic/crypto/quic_encrypter.h" | |
16 #include "net/quic/quic_flags.h" | |
17 #include "net/quic/quic_simple_buffer_allocator.h" | |
18 #include "net/quic/quic_utils.h" | |
19 #include "net/quic/test_tools/quic_packet_creator_peer.h" | |
20 #include "net/quic/test_tools/quic_packet_generator_peer.h" | |
21 #include "net/quic/test_tools/quic_test_utils.h" | |
22 #include "net/quic/test_tools/simple_quic_framer.h" | |
23 #include "net/test/gtest_util.h" | |
24 #include "testing/gmock/include/gmock/gmock.h" | |
25 #include "testing/gtest/include/gtest/gtest.h" | |
26 | |
27 using base::StringPiece; | |
28 using std::string; | |
29 using std::vector; | |
30 using testing::InSequence; | |
31 using testing::Return; | |
32 using testing::StrictMock; | |
33 using testing::_; | |
34 | |
35 namespace net { | |
36 namespace test { | |
37 namespace { | |
38 | |
39 class MockDelegate : public QuicPacketGenerator::DelegateInterface { | |
40 public: | |
41 MockDelegate() {} | |
42 ~MockDelegate() override {} | |
43 | |
44 MOCK_METHOD2(ShouldGeneratePacket, | |
45 bool(HasRetransmittableData retransmittable, | |
46 IsHandshake handshake)); | |
47 MOCK_METHOD0(GetUpdatedAckFrame, const QuicFrame()); | |
48 MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*)); | |
49 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet)); | |
50 MOCK_METHOD3(OnUnrecoverableError, | |
51 void(QuicErrorCode, const string&, ConnectionCloseSource)); | |
52 | |
53 void SetCanWriteAnything() { | |
54 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true)); | |
55 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _)) | |
56 .WillRepeatedly(Return(true)); | |
57 } | |
58 | |
59 void SetCanNotWrite() { | |
60 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)) | |
61 .WillRepeatedly(Return(false)); | |
62 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _)) | |
63 .WillRepeatedly(Return(false)); | |
64 } | |
65 | |
66 // Use this when only ack frames should be allowed to be written. | |
67 void SetCanWriteOnlyNonRetransmittable() { | |
68 EXPECT_CALL(*this, ShouldGeneratePacket(_, _)) | |
69 .WillRepeatedly(Return(false)); | |
70 EXPECT_CALL(*this, ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, _)) | |
71 .WillRepeatedly(Return(true)); | |
72 } | |
73 | |
74 private: | |
75 DISALLOW_COPY_AND_ASSIGN(MockDelegate); | |
76 }; | |
77 | |
78 // Simple struct for describing the contents of a packet. | |
79 // Useful in conjunction with a SimpleQuicFrame for validating that a packet | |
80 // contains the expected frames. | |
81 struct PacketContents { | |
82 PacketContents() | |
83 : num_ack_frames(0), | |
84 num_connection_close_frames(0), | |
85 num_goaway_frames(0), | |
86 num_rst_stream_frames(0), | |
87 num_stop_waiting_frames(0), | |
88 num_stream_frames(0), | |
89 num_ping_frames(0), | |
90 num_mtu_discovery_frames(0) {} | |
91 | |
92 size_t num_ack_frames; | |
93 size_t num_connection_close_frames; | |
94 size_t num_goaway_frames; | |
95 size_t num_rst_stream_frames; | |
96 size_t num_stop_waiting_frames; | |
97 size_t num_stream_frames; | |
98 size_t num_ping_frames; | |
99 size_t num_mtu_discovery_frames; | |
100 }; | |
101 | |
102 } // namespace | |
103 | |
104 class QuicPacketGeneratorTest : public ::testing::Test { | |
105 public: | |
106 QuicPacketGeneratorTest() | |
107 : framer_(QuicSupportedVersions(), | |
108 QuicTime::Zero(), | |
109 Perspective::IS_CLIENT), | |
110 generator_(42, &framer_, &random_, &buffer_allocator_, &delegate_), | |
111 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)) { | |
112 // TODO(ianswett): Fix this test so it uses a non-null encrypter. | |
113 FLAGS_quic_never_write_unencrypted_data = false; | |
114 } | |
115 | |
116 ~QuicPacketGeneratorTest() override { | |
117 for (SerializedPacket& packet : packets_) { | |
118 delete[] packet.encrypted_buffer; | |
119 QuicUtils::ClearSerializedPacket(&packet); | |
120 } | |
121 } | |
122 | |
123 void SavePacket(SerializedPacket* packet) { | |
124 packet->encrypted_buffer = QuicUtils::CopyBuffer(*packet); | |
125 packets_.push_back(*packet); | |
126 packet->encrypted_buffer = nullptr; | |
127 packet->retransmittable_frames.clear(); | |
128 } | |
129 | |
130 protected: | |
131 QuicRstStreamFrame* CreateRstStreamFrame() { | |
132 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0); | |
133 } | |
134 | |
135 QuicGoAwayFrame* CreateGoAwayFrame() { | |
136 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string()); | |
137 } | |
138 | |
139 void CheckPacketContains(const PacketContents& contents, | |
140 size_t packet_index) { | |
141 ASSERT_GT(packets_.size(), packet_index); | |
142 const SerializedPacket& packet = packets_[packet_index]; | |
143 size_t num_retransmittable_frames = | |
144 contents.num_connection_close_frames + contents.num_goaway_frames + | |
145 contents.num_rst_stream_frames + contents.num_stream_frames + | |
146 contents.num_ping_frames; | |
147 size_t num_frames = | |
148 contents.num_ack_frames + contents.num_stop_waiting_frames + | |
149 contents.num_mtu_discovery_frames + num_retransmittable_frames; | |
150 | |
151 if (num_retransmittable_frames == 0) { | |
152 ASSERT_TRUE(packet.retransmittable_frames.empty()); | |
153 } else { | |
154 ASSERT_FALSE(packet.retransmittable_frames.empty()); | |
155 EXPECT_EQ(num_retransmittable_frames, | |
156 packet.retransmittable_frames.size()); | |
157 } | |
158 | |
159 ASSERT_TRUE(packet.encrypted_buffer != nullptr); | |
160 ASSERT_TRUE(simple_framer_.ProcessPacket( | |
161 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length))); | |
162 EXPECT_EQ(num_frames, simple_framer_.num_frames()); | |
163 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size()); | |
164 EXPECT_EQ(contents.num_connection_close_frames, | |
165 simple_framer_.connection_close_frames().size()); | |
166 EXPECT_EQ(contents.num_goaway_frames, | |
167 simple_framer_.goaway_frames().size()); | |
168 EXPECT_EQ(contents.num_rst_stream_frames, | |
169 simple_framer_.rst_stream_frames().size()); | |
170 EXPECT_EQ(contents.num_stream_frames, | |
171 simple_framer_.stream_frames().size()); | |
172 EXPECT_EQ(contents.num_stop_waiting_frames, | |
173 simple_framer_.stop_waiting_frames().size()); | |
174 | |
175 // From the receiver's perspective, MTU discovery frames are ping frames. | |
176 EXPECT_EQ(contents.num_ping_frames + contents.num_mtu_discovery_frames, | |
177 simple_framer_.ping_frames().size()); | |
178 } | |
179 | |
180 void CheckPacketHasSingleStreamFrame(size_t packet_index) { | |
181 ASSERT_GT(packets_.size(), packet_index); | |
182 const SerializedPacket& packet = packets_[packet_index]; | |
183 ASSERT_FALSE(packet.retransmittable_frames.empty()); | |
184 EXPECT_EQ(1u, packet.retransmittable_frames.size()); | |
185 ASSERT_TRUE(packet.encrypted_buffer != nullptr); | |
186 ASSERT_TRUE(simple_framer_.ProcessPacket( | |
187 QuicEncryptedPacket(packet.encrypted_buffer, packet.encrypted_length))); | |
188 EXPECT_EQ(1u, simple_framer_.num_frames()); | |
189 EXPECT_EQ(1u, simple_framer_.stream_frames().size()); | |
190 } | |
191 | |
192 void CheckAllPacketsHaveSingleStreamFrame() { | |
193 for (size_t i = 0; i < packets_.size(); i++) { | |
194 CheckPacketHasSingleStreamFrame(i); | |
195 } | |
196 } | |
197 | |
198 QuicIOVector CreateData(size_t len) { | |
199 data_array_.reset(new char[len]); | |
200 memset(data_array_.get(), '?', len); | |
201 iov_.iov_base = data_array_.get(); | |
202 iov_.iov_len = len; | |
203 return QuicIOVector(&iov_, 1, len); | |
204 } | |
205 | |
206 QuicIOVector MakeIOVector(StringPiece s) { | |
207 return ::net::MakeIOVector(s, &iov_); | |
208 } | |
209 | |
210 QuicFramer framer_; | |
211 MockRandom random_; | |
212 SimpleBufferAllocator buffer_allocator_; | |
213 StrictMock<MockDelegate> delegate_; | |
214 QuicPacketGenerator generator_; | |
215 QuicPacketCreator* creator_; | |
216 SimpleQuicFramer simple_framer_; | |
217 vector<SerializedPacket> packets_; | |
218 QuicAckFrame ack_frame_; | |
219 | |
220 private: | |
221 std::unique_ptr<char[]> data_array_; | |
222 struct iovec iov_; | |
223 }; | |
224 | |
225 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate { | |
226 public: | |
227 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); | |
228 }; | |
229 | |
230 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { | |
231 delegate_.SetCanNotWrite(); | |
232 | |
233 generator_.SetShouldSendAck(false); | |
234 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
235 } | |
236 | |
237 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { | |
238 StrictMock<MockDebugDelegate> debug_delegate; | |
239 | |
240 generator_.set_debug_delegate(&debug_delegate); | |
241 delegate_.SetCanWriteOnlyNonRetransmittable(); | |
242 generator_.StartBatchOperations(); | |
243 | |
244 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | |
245 .WillOnce(Return(QuicFrame(&ack_frame_))); | |
246 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | |
247 | |
248 generator_.SetShouldSendAck(false); | |
249 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
250 } | |
251 | |
252 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | |
253 delegate_.SetCanWriteOnlyNonRetransmittable(); | |
254 | |
255 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | |
256 .WillOnce(Return(QuicFrame(&ack_frame_))); | |
257 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
258 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
259 | |
260 generator_.SetShouldSendAck(false); | |
261 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
262 | |
263 PacketContents contents; | |
264 contents.num_ack_frames = 1; | |
265 CheckPacketContains(contents, 0); | |
266 } | |
267 | |
268 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { | |
269 // Make sure that calling SetShouldSendAck multiple times does not result in a | |
270 // crash. Previously this would result in multiple QuicFrames queued in the | |
271 // packet generator, with all but the last with internal pointers to freed | |
272 // memory. | |
273 delegate_.SetCanWriteAnything(); | |
274 | |
275 // Only one AckFrame should be created. | |
276 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | |
277 .WillOnce(Return(QuicFrame(&ack_frame_))); | |
278 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
279 .Times(1) | |
280 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
281 | |
282 generator_.StartBatchOperations(); | |
283 generator_.SetShouldSendAck(false); | |
284 generator_.SetShouldSendAck(false); | |
285 generator_.FinishBatchOperations(); | |
286 } | |
287 | |
288 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { | |
289 delegate_.SetCanNotWrite(); | |
290 | |
291 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
292 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
293 } | |
294 | |
295 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) { | |
296 delegate_.SetCanWriteOnlyNonRetransmittable(); | |
297 | |
298 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
299 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
300 } | |
301 | |
302 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { | |
303 delegate_.SetCanWriteAnything(); | |
304 generator_.StartBatchOperations(); | |
305 | |
306 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
307 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
308 } | |
309 | |
310 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { | |
311 delegate_.SetCanNotWrite(); | |
312 generator_.StartBatchOperations(); | |
313 | |
314 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
315 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
316 generator_.FinishBatchOperations(); | |
317 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
318 | |
319 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
320 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
321 generator_.FlushAllQueuedFrames(); | |
322 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
323 | |
324 PacketContents contents; | |
325 contents.num_rst_stream_frames = 1; | |
326 CheckPacketContains(contents, 0); | |
327 } | |
328 | |
329 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { | |
330 delegate_.SetCanWriteAnything(); | |
331 | |
332 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
333 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
334 | |
335 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
336 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
337 | |
338 PacketContents contents; | |
339 contents.num_rst_stream_frames = 1; | |
340 CheckPacketContains(contents, 0); | |
341 } | |
342 | |
343 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | |
344 delegate_.SetCanNotWrite(); | |
345 | |
346 QuicConsumedData consumed = generator_.ConsumeData( | |
347 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr); | |
348 EXPECT_EQ(0u, consumed.bytes_consumed); | |
349 EXPECT_FALSE(consumed.fin_consumed); | |
350 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
351 } | |
352 | |
353 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { | |
354 delegate_.SetCanWriteAnything(); | |
355 generator_.StartBatchOperations(); | |
356 | |
357 QuicConsumedData consumed = generator_.ConsumeData( | |
358 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr); | |
359 EXPECT_EQ(3u, consumed.bytes_consumed); | |
360 EXPECT_TRUE(consumed.fin_consumed); | |
361 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
362 } | |
363 | |
364 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | |
365 delegate_.SetCanWriteAnything(); | |
366 | |
367 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
368 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
369 QuicConsumedData consumed = generator_.ConsumeData( | |
370 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr); | |
371 EXPECT_EQ(3u, consumed.bytes_consumed); | |
372 EXPECT_TRUE(consumed.fin_consumed); | |
373 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
374 | |
375 PacketContents contents; | |
376 contents.num_stream_frames = 1; | |
377 CheckPacketContains(contents, 0); | |
378 } | |
379 | |
380 // Test the behavior of ConsumeData when the data consumed is for the crypto | |
381 // handshake stream. Ensure that the packet is always sent and padded even if | |
382 // the generator operates in batch mode. | |
383 TEST_F(QuicPacketGeneratorTest, ConsumeData_Handshake) { | |
384 delegate_.SetCanWriteAnything(); | |
385 generator_.StartBatchOperations(); | |
386 | |
387 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
388 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
389 QuicConsumedData consumed = generator_.ConsumeData( | |
390 kCryptoStreamId, MakeIOVector("foo"), 0, false, nullptr); | |
391 EXPECT_EQ(3u, consumed.bytes_consumed); | |
392 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
393 | |
394 PacketContents contents; | |
395 contents.num_stream_frames = 1; | |
396 CheckPacketContains(contents, 0); | |
397 | |
398 ASSERT_EQ(1u, packets_.size()); | |
399 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength()); | |
400 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | |
401 } | |
402 | |
403 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) { | |
404 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0, | |
405 false, nullptr), | |
406 "Attempt to consume empty data without FIN."); | |
407 } | |
408 | |
409 TEST_F(QuicPacketGeneratorTest, | |
410 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { | |
411 delegate_.SetCanWriteAnything(); | |
412 generator_.StartBatchOperations(); | |
413 | |
414 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, | |
415 nullptr); | |
416 QuicConsumedData consumed = | |
417 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr); | |
418 EXPECT_EQ(4u, consumed.bytes_consumed); | |
419 EXPECT_FALSE(consumed.fin_consumed); | |
420 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
421 } | |
422 | |
423 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { | |
424 delegate_.SetCanWriteAnything(); | |
425 generator_.StartBatchOperations(); | |
426 | |
427 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, | |
428 nullptr); | |
429 QuicConsumedData consumed = | |
430 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr); | |
431 EXPECT_EQ(4u, consumed.bytes_consumed); | |
432 EXPECT_FALSE(consumed.fin_consumed); | |
433 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
434 | |
435 // Now both frames will be flushed out. | |
436 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
437 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
438 generator_.FinishBatchOperations(); | |
439 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
440 | |
441 PacketContents contents; | |
442 contents.num_stream_frames = 2; | |
443 CheckPacketContains(contents, 0); | |
444 } | |
445 | |
446 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { | |
447 // Set the packet size be enough for two stream frames with 0 stream offset, | |
448 // but not enough for a stream frame of 0 offset and one with non-zero offset. | |
449 size_t length = | |
450 NullEncrypter().GetCiphertextSize(0) + | |
451 GetPacketHeaderSize( | |
452 framer_.version(), creator_->connection_id_length(), kIncludeVersion, | |
453 !kIncludePathId, !kIncludeDiversificationNonce, | |
454 QuicPacketCreatorPeer::NextPacketNumberLength(creator_)) + | |
455 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger | |
456 // than the GetMinStreamFrameSize. | |
457 QuicFramer::GetMinStreamFrameSize(1, 0, false) + 3 + | |
458 QuicFramer::GetMinStreamFrameSize(1, 0, true) + 1; | |
459 generator_.SetMaxPacketLength(length); | |
460 delegate_.SetCanWriteAnything(); | |
461 { | |
462 InSequence dummy; | |
463 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
464 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
465 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
466 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
467 } | |
468 generator_.StartBatchOperations(); | |
469 // Queue enough data to prevent a stream frame with a non-zero offset from | |
470 // fitting. | |
471 QuicConsumedData consumed = generator_.ConsumeData( | |
472 kHeadersStreamId, MakeIOVector("foo"), 0, false, nullptr); | |
473 EXPECT_EQ(3u, consumed.bytes_consumed); | |
474 EXPECT_FALSE(consumed.fin_consumed); | |
475 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
476 | |
477 // This frame will not fit with the existing frame, causing the queued frame | |
478 // to be serialized, and it will be added to a new open packet. | |
479 consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3, | |
480 true, nullptr); | |
481 EXPECT_EQ(3u, consumed.bytes_consumed); | |
482 EXPECT_TRUE(consumed.fin_consumed); | |
483 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
484 | |
485 creator_->Flush(); | |
486 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
487 | |
488 PacketContents contents; | |
489 contents.num_stream_frames = 1; | |
490 CheckPacketContains(contents, 0); | |
491 CheckPacketContains(contents, 1); | |
492 } | |
493 | |
494 TEST_F(QuicPacketGeneratorTest, ConsumeDataFastPath) { | |
495 delegate_.SetCanWriteAnything(); | |
496 | |
497 // Create a 10000 byte IOVector. | |
498 QuicIOVector iov(CreateData(10000)); | |
499 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
500 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
501 QuicConsumedData consumed = | |
502 generator_.ConsumeDataFastPath(kHeadersStreamId, iov, 0, true, nullptr); | |
503 EXPECT_EQ(10000u, consumed.bytes_consumed); | |
504 EXPECT_TRUE(consumed.fin_consumed); | |
505 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
506 | |
507 PacketContents contents; | |
508 contents.num_stream_frames = 1; | |
509 CheckPacketContains(contents, 0); | |
510 } | |
511 | |
512 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { | |
513 delegate_.SetCanNotWrite(); | |
514 | |
515 generator_.SetShouldSendAck(false); | |
516 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
517 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
518 | |
519 delegate_.SetCanWriteAnything(); | |
520 | |
521 generator_.StartBatchOperations(); | |
522 | |
523 // When the first write operation is invoked, the ack frame will be returned. | |
524 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | |
525 .WillOnce(Return(QuicFrame(&ack_frame_))); | |
526 | |
527 // Send some data and a control frame | |
528 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, nullptr); | |
529 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | |
530 | |
531 // All five frames will be flushed out in a single packet. | |
532 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
533 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
534 generator_.FinishBatchOperations(); | |
535 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
536 | |
537 PacketContents contents; | |
538 contents.num_ack_frames = 1; | |
539 contents.num_goaway_frames = 1; | |
540 contents.num_rst_stream_frames = 1; | |
541 contents.num_stream_frames = 1; | |
542 CheckPacketContains(contents, 0); | |
543 } | |
544 | |
545 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { | |
546 delegate_.SetCanNotWrite(); | |
547 | |
548 generator_.SetShouldSendAck(false); | |
549 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
550 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
551 | |
552 delegate_.SetCanWriteAnything(); | |
553 | |
554 generator_.StartBatchOperations(); | |
555 | |
556 // When the first write operation is invoked, the ack frame will be returned. | |
557 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | |
558 .WillOnce(Return(QuicFrame(&ack_frame_))); | |
559 | |
560 { | |
561 InSequence dummy; | |
562 // All five frames will be flushed out in a single packet | |
563 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
564 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
565 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
566 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
567 } | |
568 | |
569 // Send enough data to exceed one packet | |
570 size_t data_len = kDefaultMaxPacketSize + 100; | |
571 QuicConsumedData consumed = | |
572 generator_.ConsumeData(3, CreateData(data_len), 0, true, nullptr); | |
573 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
574 EXPECT_TRUE(consumed.fin_consumed); | |
575 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | |
576 | |
577 generator_.FinishBatchOperations(); | |
578 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
579 | |
580 // The first packet should have the queued data and part of the stream data. | |
581 PacketContents contents; | |
582 contents.num_ack_frames = 1; | |
583 contents.num_rst_stream_frames = 1; | |
584 contents.num_stream_frames = 1; | |
585 CheckPacketContains(contents, 0); | |
586 | |
587 // The second should have the remainder of the stream data. | |
588 PacketContents contents2; | |
589 contents2.num_goaway_frames = 1; | |
590 contents2.num_stream_frames = 1; | |
591 CheckPacketContains(contents2, 1); | |
592 } | |
593 | |
594 TEST_F(QuicPacketGeneratorTest, TestConnectionIdLength) { | |
595 generator_.SetConnectionIdLength(0); | |
596 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID, creator_->connection_id_length()); | |
597 | |
598 for (size_t i = 1; i < 10; i++) { | |
599 generator_.SetConnectionIdLength(i); | |
600 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | |
601 } | |
602 } | |
603 | |
604 // Test whether SetMaxPacketLength() works in the situation when the queue is | |
605 // empty, and we send three packets worth of data. | |
606 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_Initial) { | |
607 delegate_.SetCanWriteAnything(); | |
608 | |
609 // Send enough data for three packets. | |
610 size_t data_len = 3 * kDefaultMaxPacketSize + 1; | |
611 size_t packet_len = kDefaultMaxPacketSize + 100; | |
612 ASSERT_LE(packet_len, kMaxPacketSize); | |
613 generator_.SetMaxPacketLength(packet_len); | |
614 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | |
615 | |
616 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
617 .Times(3) | |
618 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
619 QuicConsumedData consumed = | |
620 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | |
621 /*offset=*/2, | |
622 /*fin=*/true, nullptr); | |
623 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
624 EXPECT_TRUE(consumed.fin_consumed); | |
625 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
626 | |
627 // We expect three packets, and first two of them have to be of packet_len | |
628 // size. We check multiple packets (instead of just one) because we want to | |
629 // ensure that |max_packet_length_| does not get changed incorrectly by the | |
630 // generator after first packet is serialized. | |
631 ASSERT_EQ(3u, packets_.size()); | |
632 EXPECT_EQ(packet_len, packets_[0].encrypted_length); | |
633 EXPECT_EQ(packet_len, packets_[1].encrypted_length); | |
634 CheckAllPacketsHaveSingleStreamFrame(); | |
635 } | |
636 | |
637 // Test whether SetMaxPacketLength() works in the situation when we first write | |
638 // data, then change packet size, then write data again. | |
639 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_Middle) { | |
640 delegate_.SetCanWriteAnything(); | |
641 | |
642 // We send enough data to overflow default packet length, but not the altered | |
643 // one. | |
644 size_t data_len = kDefaultMaxPacketSize; | |
645 size_t packet_len = kDefaultMaxPacketSize + 100; | |
646 ASSERT_LE(packet_len, kMaxPacketSize); | |
647 | |
648 // We expect to see three packets in total. | |
649 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
650 .Times(3) | |
651 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
652 | |
653 // Send two packets before packet size change. | |
654 QuicConsumedData consumed = | |
655 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | |
656 /*offset=*/2, | |
657 /*fin=*/false, nullptr); | |
658 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
659 EXPECT_FALSE(consumed.fin_consumed); | |
660 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
661 | |
662 // Make sure we already have two packets. | |
663 ASSERT_EQ(2u, packets_.size()); | |
664 | |
665 // Increase packet size. | |
666 generator_.SetMaxPacketLength(packet_len); | |
667 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | |
668 | |
669 // Send a packet after packet size change. | |
670 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | |
671 2 + data_len, | |
672 /*fin=*/true, nullptr); | |
673 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
674 EXPECT_TRUE(consumed.fin_consumed); | |
675 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
676 | |
677 // We expect first data chunk to get fragmented, but the second one to fit | |
678 // into a single packet. | |
679 ASSERT_EQ(3u, packets_.size()); | |
680 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | |
681 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length); | |
682 CheckAllPacketsHaveSingleStreamFrame(); | |
683 } | |
684 | |
685 // Test whether SetMaxPacketLength() works correctly when we force the change of | |
686 // the packet size in the middle of the batched packet. | |
687 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) { | |
688 delegate_.SetCanWriteAnything(); | |
689 generator_.StartBatchOperations(); | |
690 | |
691 size_t first_write_len = kDefaultMaxPacketSize / 2; | |
692 size_t packet_len = kDefaultMaxPacketSize + 100; | |
693 size_t second_write_len = packet_len + 1; | |
694 ASSERT_LE(packet_len, kMaxPacketSize); | |
695 | |
696 // First send half of the packet worth of data. We are in the batch mode, so | |
697 // should not cause packet serialization. | |
698 QuicConsumedData consumed = | |
699 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), | |
700 /*offset=*/2, | |
701 /*fin=*/false, nullptr); | |
702 EXPECT_EQ(first_write_len, consumed.bytes_consumed); | |
703 EXPECT_FALSE(consumed.fin_consumed); | |
704 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
705 | |
706 // Make sure we have no packets so far. | |
707 ASSERT_EQ(0u, packets_.size()); | |
708 | |
709 // Expect a packet to be flushed. | |
710 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
711 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
712 | |
713 // Increase packet size after flushing all frames. | |
714 // Ensure it's immediately enacted. | |
715 generator_.FlushAllQueuedFrames(); | |
716 generator_.SetMaxPacketLength(packet_len); | |
717 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | |
718 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
719 | |
720 // We expect to see exactly one packet serialized after that, because we send | |
721 // a value somewhat exceeding new max packet size, and the tail data does not | |
722 // get serialized because we are still in the batch mode. | |
723 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
724 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
725 | |
726 // Send a more than a packet worth of data to the same stream. This should | |
727 // trigger serialization of one packet, and queue another one. | |
728 consumed = | |
729 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), | |
730 /*offset=*/2 + first_write_len, | |
731 /*fin=*/true, nullptr); | |
732 EXPECT_EQ(second_write_len, consumed.bytes_consumed); | |
733 EXPECT_TRUE(consumed.fin_consumed); | |
734 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
735 | |
736 // We expect the first packet to be underfilled, and the second packet be up | |
737 // to the new max packet size. | |
738 ASSERT_EQ(2u, packets_.size()); | |
739 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length); | |
740 EXPECT_EQ(packet_len, packets_[1].encrypted_length); | |
741 | |
742 CheckAllPacketsHaveSingleStreamFrame(); | |
743 } | |
744 | |
745 // Test sending an MTU probe, without any surrounding data. | |
746 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_Simple) { | |
747 delegate_.SetCanWriteAnything(); | |
748 | |
749 const size_t target_mtu = kDefaultMaxPacketSize + 100; | |
750 static_assert(target_mtu < kMaxPacketSize, | |
751 "The MTU probe used by the test exceeds maximum packet size"); | |
752 | |
753 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
754 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
755 | |
756 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); | |
757 | |
758 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
759 ASSERT_EQ(1u, packets_.size()); | |
760 EXPECT_EQ(target_mtu, packets_[0].encrypted_length); | |
761 | |
762 PacketContents contents; | |
763 contents.num_mtu_discovery_frames = 1; | |
764 CheckPacketContains(contents, 0); | |
765 } | |
766 | |
767 // Test sending an MTU probe. Surround it with data, to ensure that it resets | |
768 // the MTU to the value before the probe was sent. | |
769 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_SurroundedByData) { | |
770 delegate_.SetCanWriteAnything(); | |
771 | |
772 const size_t target_mtu = kDefaultMaxPacketSize + 100; | |
773 static_assert(target_mtu < kMaxPacketSize, | |
774 "The MTU probe used by the test exceeds maximum packet size"); | |
775 | |
776 // Send enough data so it would always cause two packets to be sent. | |
777 const size_t data_len = target_mtu + 1; | |
778 | |
779 // Send a total of five packets: two packets before the probe, the probe | |
780 // itself, and two packets after the probe. | |
781 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
782 .Times(5) | |
783 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
784 | |
785 // Send data before the MTU probe. | |
786 QuicConsumedData consumed = | |
787 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | |
788 /*offset=*/2, | |
789 /*fin=*/false, nullptr); | |
790 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
791 EXPECT_FALSE(consumed.fin_consumed); | |
792 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
793 | |
794 // Send the MTU probe. | |
795 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); | |
796 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
797 | |
798 // Send data after the MTU probe. | |
799 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | |
800 /*offset=*/2 + data_len, | |
801 /*fin=*/true, nullptr); | |
802 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
803 EXPECT_TRUE(consumed.fin_consumed); | |
804 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
805 | |
806 ASSERT_EQ(5u, packets_.size()); | |
807 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | |
808 EXPECT_EQ(target_mtu, packets_[2].encrypted_length); | |
809 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length); | |
810 | |
811 PacketContents probe_contents; | |
812 probe_contents.num_mtu_discovery_frames = 1; | |
813 | |
814 CheckPacketHasSingleStreamFrame(0); | |
815 CheckPacketHasSingleStreamFrame(1); | |
816 CheckPacketContains(probe_contents, 2); | |
817 CheckPacketHasSingleStreamFrame(3); | |
818 CheckPacketHasSingleStreamFrame(4); | |
819 } | |
820 | |
821 TEST_F(QuicPacketGeneratorTest, DontCrashOnInvalidStopWaiting) { | |
822 // Test added to ensure the generator does not crash when an invalid frame is | |
823 // added. Because this is an indication of internal programming errors, | |
824 // DFATALs are expected. | |
825 // A 1 byte packet number length can't encode a gap of 1000. | |
826 QuicPacketCreatorPeer::SetPacketNumber(creator_, 1000); | |
827 | |
828 delegate_.SetCanNotWrite(); | |
829 generator_.SetShouldSendAck(true); | |
830 delegate_.SetCanWriteAnything(); | |
831 generator_.StartBatchOperations(); | |
832 | |
833 // Set up frames to write into the creator when control frames are written. | |
834 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | |
835 .WillOnce(Return(QuicFrame(&ack_frame_))); | |
836 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); | |
837 // Generator should have queued control frames, and creator should be empty. | |
838 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
839 EXPECT_FALSE(creator_->HasPendingFrames()); | |
840 | |
841 // This will not serialize any packets, because of the invalid frame. | |
842 EXPECT_CALL(delegate_, | |
843 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, _, | |
844 ConnectionCloseSource::FROM_SELF)); | |
845 EXPECT_DFATAL(generator_.FinishBatchOperations(), | |
846 "packet_number_length 1 is too small " | |
847 "for least_unacked_delta: 1001"); | |
848 } | |
849 | |
850 TEST_F(QuicPacketGeneratorTest, SetCurrentPath) { | |
851 delegate_.SetCanWriteAnything(); | |
852 generator_.StartBatchOperations(); | |
853 | |
854 QuicConsumedData consumed = generator_.ConsumeData( | |
855 kHeadersStreamId, MakeIOVector("foo"), 2, true, nullptr); | |
856 EXPECT_EQ(3u, consumed.bytes_consumed); | |
857 EXPECT_TRUE(consumed.fin_consumed); | |
858 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
859 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | |
860 // Does not change current path. | |
861 generator_.SetCurrentPath(kDefaultPathId, 1, 0); | |
862 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | |
863 | |
864 // Try to switch path when a packet is under construction. | |
865 QuicPathId kTestPathId1 = 1; | |
866 EXPECT_DFATAL(generator_.SetCurrentPath(kTestPathId1, 1, 0), | |
867 "Unable to change paths when a packet is under construction"); | |
868 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | |
869 | |
870 // Try to switch path after current open packet gets serialized. | |
871 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
872 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | |
873 generator_.FlushAllQueuedFrames(); | |
874 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
875 generator_.SetCurrentPath(kTestPathId1, 1, 0); | |
876 EXPECT_EQ(kTestPathId1, QuicPacketCreatorPeer::GetCurrentPath(creator_)); | |
877 } | |
878 | |
879 } // namespace test | |
880 } // namespace net | |
OLD | NEW |