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 <string> | |
8 | |
9 #include "net/quic/crypto/crypto_protocol.h" | |
10 #include "net/quic/crypto/null_encrypter.h" | |
11 #include "net/quic/crypto/quic_decrypter.h" | |
12 #include "net/quic/crypto/quic_encrypter.h" | |
13 #include "net/quic/quic_flags.h" | |
14 #include "net/quic/quic_utils.h" | |
15 #include "net/quic/test_tools/quic_packet_creator_peer.h" | |
16 #include "net/quic/test_tools/quic_packet_generator_peer.h" | |
17 #include "net/quic/test_tools/quic_test_utils.h" | |
18 #include "net/quic/test_tools/simple_quic_framer.h" | |
19 #include "net/test/gtest_util.h" | |
20 #include "testing/gmock/include/gmock/gmock.h" | |
21 #include "testing/gtest/include/gtest/gtest.h" | |
22 | |
23 using base::StringPiece; | |
24 using std::string; | |
25 using testing::InSequence; | |
26 using testing::Return; | |
27 using testing::SaveArg; | |
28 using testing::StrictMock; | |
29 using testing::_; | |
30 | |
31 namespace net { | |
32 namespace test { | |
33 namespace { | |
34 | |
35 const int64 kMinFecTimeoutMs = 5u; | |
36 | |
37 class MockDelegate : public QuicPacketGenerator::DelegateInterface { | |
38 public: | |
39 MockDelegate() {} | |
40 ~MockDelegate() override {} | |
41 | |
42 MOCK_METHOD3(ShouldGeneratePacket, | |
43 bool(TransmissionType transmission_type, | |
44 HasRetransmittableData retransmittable, | |
45 IsHandshake handshake)); | |
46 MOCK_METHOD1(PopulateAckFrame, void(QuicAckFrame*)); | |
47 MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*)); | |
48 MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet)); | |
49 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); | |
50 | |
51 void SetCanWriteAnything() { | |
52 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | |
53 .WillRepeatedly(Return(true)); | |
54 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | |
55 NO_RETRANSMITTABLE_DATA, _)) | |
56 .WillRepeatedly(Return(true)); | |
57 } | |
58 | |
59 void SetCanNotWrite() { | |
60 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | |
61 .WillRepeatedly(Return(false)); | |
62 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | |
63 NO_RETRANSMITTABLE_DATA, _)) | |
64 .WillRepeatedly(Return(false)); | |
65 } | |
66 | |
67 // Use this when only ack frames should be allowed to be written. | |
68 void SetCanWriteOnlyNonRetransmittable() { | |
69 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | |
70 .WillRepeatedly(Return(false)); | |
71 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | |
72 NO_RETRANSMITTABLE_DATA, _)) | |
73 .WillRepeatedly(Return(true)); | |
74 } | |
75 | |
76 private: | |
77 DISALLOW_COPY_AND_ASSIGN(MockDelegate); | |
78 }; | |
79 | |
80 // Simple struct for describing the contents of a packet. | |
81 // Useful in conjunction with a SimpleQuicFrame for validating that a packet | |
82 // contains the expected frames. | |
83 struct PacketContents { | |
84 PacketContents() | |
85 : num_ack_frames(0), | |
86 num_connection_close_frames(0), | |
87 num_goaway_frames(0), | |
88 num_rst_stream_frames(0), | |
89 num_stop_waiting_frames(0), | |
90 num_stream_frames(0), | |
91 fec_group(0) { | |
92 } | |
93 | |
94 size_t num_ack_frames; | |
95 size_t num_connection_close_frames; | |
96 size_t num_goaway_frames; | |
97 size_t num_rst_stream_frames; | |
98 size_t num_stop_waiting_frames; | |
99 size_t num_stream_frames; | |
100 | |
101 QuicFecGroupNumber fec_group; | |
102 }; | |
103 | |
104 } // namespace | |
105 | |
106 class QuicPacketGeneratorTest : public ::testing::Test { | |
107 protected: | |
108 QuicPacketGeneratorTest() | |
109 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), | |
110 generator_(42, &framer_, &random_, &delegate_), | |
111 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)), | |
112 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | |
113 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | |
114 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | |
115 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | |
116 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | |
117 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | |
118 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), | |
119 packet8_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr) {} | |
120 | |
121 ~QuicPacketGeneratorTest() override { | |
122 delete packet_.packet; | |
123 delete packet_.retransmittable_frames; | |
124 delete packet2_.packet; | |
125 delete packet2_.retransmittable_frames; | |
126 delete packet3_.packet; | |
127 delete packet3_.retransmittable_frames; | |
128 delete packet4_.packet; | |
129 delete packet4_.retransmittable_frames; | |
130 delete packet5_.packet; | |
131 delete packet5_.retransmittable_frames; | |
132 delete packet6_.packet; | |
133 delete packet6_.retransmittable_frames; | |
134 delete packet7_.packet; | |
135 delete packet7_.retransmittable_frames; | |
136 delete packet8_.packet; | |
137 delete packet8_.retransmittable_frames; | |
138 } | |
139 | |
140 QuicRstStreamFrame* CreateRstStreamFrame() { | |
141 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0); | |
142 } | |
143 | |
144 QuicGoAwayFrame* CreateGoAwayFrame() { | |
145 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string()); | |
146 } | |
147 | |
148 void CheckPacketContains(const PacketContents& contents, | |
149 const SerializedPacket& packet) { | |
150 size_t num_retransmittable_frames = contents.num_connection_close_frames + | |
151 contents.num_goaway_frames + contents.num_rst_stream_frames + | |
152 contents.num_stream_frames; | |
153 size_t num_frames = contents.num_ack_frames + | |
154 contents.num_stop_waiting_frames + | |
155 num_retransmittable_frames; | |
156 | |
157 if (num_retransmittable_frames == 0) { | |
158 ASSERT_TRUE(packet.retransmittable_frames == nullptr); | |
159 } else { | |
160 ASSERT_TRUE(packet.retransmittable_frames != nullptr); | |
161 EXPECT_EQ(num_retransmittable_frames, | |
162 packet.retransmittable_frames->frames().size()); | |
163 } | |
164 | |
165 ASSERT_TRUE(packet.packet != nullptr); | |
166 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); | |
167 EXPECT_EQ(num_frames, simple_framer_.num_frames()); | |
168 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size()); | |
169 EXPECT_EQ(contents.num_connection_close_frames, | |
170 simple_framer_.connection_close_frames().size()); | |
171 EXPECT_EQ(contents.num_goaway_frames, | |
172 simple_framer_.goaway_frames().size()); | |
173 EXPECT_EQ(contents.num_rst_stream_frames, | |
174 simple_framer_.rst_stream_frames().size()); | |
175 EXPECT_EQ(contents.num_stream_frames, | |
176 simple_framer_.stream_frames().size()); | |
177 EXPECT_EQ(contents.num_stop_waiting_frames, | |
178 simple_framer_.stop_waiting_frames().size()); | |
179 EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group); | |
180 } | |
181 | |
182 void CheckPacketHasSingleStreamFrame(const SerializedPacket& packet) { | |
183 ASSERT_TRUE(packet.retransmittable_frames != nullptr); | |
184 EXPECT_EQ(1u, packet.retransmittable_frames->frames().size()); | |
185 ASSERT_TRUE(packet.packet != nullptr); | |
186 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); | |
187 EXPECT_EQ(1u, simple_framer_.num_frames()); | |
188 EXPECT_EQ(1u, simple_framer_.stream_frames().size()); | |
189 } | |
190 | |
191 void CheckPacketIsFec(const SerializedPacket& packet, | |
192 QuicPacketSequenceNumber fec_group) { | |
193 ASSERT_TRUE(packet.retransmittable_frames == nullptr); | |
194 ASSERT_TRUE(packet.packet != nullptr); | |
195 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); | |
196 EXPECT_TRUE(simple_framer_.header().fec_flag); | |
197 EXPECT_EQ(fec_group, simple_framer_.fec_data().fec_group); | |
198 } | |
199 | |
200 IOVector CreateData(size_t len) { | |
201 data_array_.reset(new char[len]); | |
202 memset(data_array_.get(), '?', len); | |
203 IOVector data; | |
204 data.Append(data_array_.get(), len); | |
205 return data; | |
206 } | |
207 | |
208 QuicFramer framer_; | |
209 MockRandom random_; | |
210 StrictMock<MockDelegate> delegate_; | |
211 QuicPacketGenerator generator_; | |
212 QuicPacketCreator* creator_; | |
213 SimpleQuicFramer simple_framer_; | |
214 SerializedPacket packet_; | |
215 SerializedPacket packet2_; | |
216 SerializedPacket packet3_; | |
217 SerializedPacket packet4_; | |
218 SerializedPacket packet5_; | |
219 SerializedPacket packet6_; | |
220 SerializedPacket packet7_; | |
221 SerializedPacket packet8_; | |
222 | |
223 private: | |
224 scoped_ptr<char[]> data_array_; | |
225 }; | |
226 | |
227 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegate { | |
228 public: | |
229 MOCK_METHOD1(OnFrameAddedToPacket, | |
230 void(const QuicFrame&)); | |
231 }; | |
232 | |
233 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { | |
234 delegate_.SetCanNotWrite(); | |
235 | |
236 generator_.SetShouldSendAck(false); | |
237 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
238 } | |
239 | |
240 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { | |
241 StrictMock<MockDebugDelegate> debug_delegate; | |
242 | |
243 generator_.set_debug_delegate(&debug_delegate); | |
244 delegate_.SetCanWriteOnlyNonRetransmittable(); | |
245 generator_.StartBatchOperations(); | |
246 | |
247 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | |
248 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | |
249 | |
250 generator_.SetShouldSendAck(false); | |
251 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
252 } | |
253 | |
254 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | |
255 delegate_.SetCanWriteOnlyNonRetransmittable(); | |
256 | |
257 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | |
258 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | |
259 | |
260 generator_.SetShouldSendAck(false); | |
261 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
262 | |
263 PacketContents contents; | |
264 contents.num_ack_frames = 1; | |
265 CheckPacketContains(contents, packet_); | |
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_, PopulateAckFrame(_)).Times(1); | |
277 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
278 .Times(1) | |
279 .WillOnce(SaveArg<0>(&packet_)); | |
280 | |
281 generator_.StartBatchOperations(); | |
282 generator_.SetShouldSendAck(false); | |
283 generator_.SetShouldSendAck(false); | |
284 generator_.FinishBatchOperations(); | |
285 } | |
286 | |
287 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { | |
288 delegate_.SetCanNotWrite(); | |
289 | |
290 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
291 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
292 } | |
293 | |
294 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) { | |
295 delegate_.SetCanWriteOnlyNonRetransmittable(); | |
296 | |
297 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
298 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
299 } | |
300 | |
301 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { | |
302 delegate_.SetCanWriteAnything(); | |
303 generator_.StartBatchOperations(); | |
304 | |
305 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
306 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
307 } | |
308 | |
309 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { | |
310 delegate_.SetCanNotWrite(); | |
311 generator_.StartBatchOperations(); | |
312 | |
313 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
314 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
315 generator_.FinishBatchOperations(); | |
316 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
317 | |
318 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | |
319 generator_.FlushAllQueuedFrames(); | |
320 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
321 | |
322 PacketContents contents; | |
323 contents.num_rst_stream_frames = 1; | |
324 CheckPacketContains(contents, packet_); | |
325 } | |
326 | |
327 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { | |
328 delegate_.SetCanWriteAnything(); | |
329 | |
330 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | |
331 | |
332 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
333 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
334 | |
335 PacketContents contents; | |
336 contents.num_rst_stream_frames = 1; | |
337 CheckPacketContains(contents, packet_); | |
338 } | |
339 | |
340 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | |
341 delegate_.SetCanNotWrite(); | |
342 | |
343 QuicConsumedData consumed = generator_.ConsumeData( | |
344 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); | |
345 EXPECT_EQ(0u, consumed.bytes_consumed); | |
346 EXPECT_FALSE(consumed.fin_consumed); | |
347 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
348 } | |
349 | |
350 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { | |
351 delegate_.SetCanWriteAnything(); | |
352 generator_.StartBatchOperations(); | |
353 | |
354 QuicConsumedData consumed = generator_.ConsumeData( | |
355 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); | |
356 EXPECT_EQ(3u, consumed.bytes_consumed); | |
357 EXPECT_TRUE(consumed.fin_consumed); | |
358 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
359 } | |
360 | |
361 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | |
362 delegate_.SetCanWriteAnything(); | |
363 | |
364 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | |
365 QuicConsumedData consumed = generator_.ConsumeData( | |
366 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); | |
367 EXPECT_EQ(3u, consumed.bytes_consumed); | |
368 EXPECT_TRUE(consumed.fin_consumed); | |
369 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
370 | |
371 PacketContents contents; | |
372 contents.num_stream_frames = 1; | |
373 CheckPacketContains(contents, packet_); | |
374 } | |
375 | |
376 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) { | |
377 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0, | |
378 false, MAY_FEC_PROTECT, nullptr), | |
379 "Attempt to consume empty data without FIN."); | |
380 } | |
381 | |
382 TEST_F(QuicPacketGeneratorTest, | |
383 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { | |
384 delegate_.SetCanWriteAnything(); | |
385 generator_.StartBatchOperations(); | |
386 | |
387 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, | |
388 MAY_FEC_PROTECT, nullptr); | |
389 QuicConsumedData consumed = generator_.ConsumeData( | |
390 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, nullptr); | |
391 EXPECT_EQ(4u, consumed.bytes_consumed); | |
392 EXPECT_FALSE(consumed.fin_consumed); | |
393 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
394 } | |
395 | |
396 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { | |
397 delegate_.SetCanWriteAnything(); | |
398 generator_.StartBatchOperations(); | |
399 | |
400 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, | |
401 MAY_FEC_PROTECT, nullptr); | |
402 QuicConsumedData consumed = generator_.ConsumeData( | |
403 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, nullptr); | |
404 EXPECT_EQ(4u, consumed.bytes_consumed); | |
405 EXPECT_FALSE(consumed.fin_consumed); | |
406 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
407 | |
408 // Now both frames will be flushed out. | |
409 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | |
410 generator_.FinishBatchOperations(); | |
411 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
412 | |
413 PacketContents contents; | |
414 contents.num_stream_frames = 2; | |
415 CheckPacketContains(contents, packet_); | |
416 } | |
417 | |
418 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecOnMaxGroupSize) { | |
419 delegate_.SetCanWriteAnything(); | |
420 | |
421 // Send FEC every two packets. | |
422 creator_->set_max_packets_per_fec_group(2); | |
423 | |
424 { | |
425 InSequence dummy; | |
426 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
427 SaveArg<0>(&packet_)); | |
428 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
429 SaveArg<0>(&packet2_)); | |
430 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
431 SaveArg<0>(&packet3_)); | |
432 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
433 SaveArg<0>(&packet4_)); | |
434 } | |
435 | |
436 // Send enough data to create 3 packets: two full and one partial. Send with | |
437 // MUST_FEC_PROTECT flag. | |
438 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | |
439 QuicConsumedData consumed = generator_.ConsumeData( | |
440 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
441 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
442 EXPECT_TRUE(consumed.fin_consumed); | |
443 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
444 | |
445 CheckPacketHasSingleStreamFrame(packet_); | |
446 CheckPacketHasSingleStreamFrame(packet2_); | |
447 CheckPacketIsFec(packet3_, 1); | |
448 CheckPacketHasSingleStreamFrame(packet4_); | |
449 EXPECT_TRUE(creator_->IsFecProtected()); | |
450 | |
451 // The FEC packet under construction will be sent when one more packet is sent | |
452 // (since FEC group size is 2), or when OnFecTimeout is called. Send more data | |
453 // with MAY_FEC_PROTECT. This packet should also be protected, and FEC packet | |
454 // is sent since FEC group size is reached. | |
455 { | |
456 InSequence dummy; | |
457 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
458 .WillOnce(SaveArg<0>(&packet5_)); | |
459 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
460 .WillOnce(SaveArg<0>(&packet6_)); | |
461 } | |
462 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
463 nullptr); | |
464 EXPECT_EQ(1u, consumed.bytes_consumed); | |
465 CheckPacketHasSingleStreamFrame(packet5_); | |
466 CheckPacketIsFec(packet6_, 4); | |
467 EXPECT_FALSE(creator_->IsFecProtected()); | |
468 } | |
469 | |
470 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecOnTimeout) { | |
471 delegate_.SetCanWriteAnything(); | |
472 creator_->set_max_packets_per_fec_group(1000); | |
473 | |
474 // Send data with MUST_FEC_PROTECT flag. No FEC packet is emitted, but the | |
475 // creator FEC protects all data. | |
476 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | |
477 QuicConsumedData consumed = generator_.ConsumeData(3, CreateData(1u), 0, true, | |
478 MUST_FEC_PROTECT, nullptr); | |
479 EXPECT_EQ(1u, consumed.bytes_consumed); | |
480 EXPECT_TRUE(consumed.fin_consumed); | |
481 CheckPacketHasSingleStreamFrame(packet_); | |
482 EXPECT_TRUE(creator_->IsFecProtected()); | |
483 | |
484 // Send more data with MAY_FEC_PROTECT. This packet should also be protected, | |
485 // and FEC packet is not yet sent. | |
486 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet2_)); | |
487 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
488 nullptr); | |
489 EXPECT_EQ(1u, consumed.bytes_consumed); | |
490 CheckPacketHasSingleStreamFrame(packet2_); | |
491 EXPECT_TRUE(creator_->IsFecProtected()); | |
492 | |
493 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
494 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet3_)); | |
495 generator_.OnFecTimeout(); | |
496 CheckPacketIsFec(packet3_, 1); | |
497 EXPECT_FALSE(creator_->IsFecProtected()); | |
498 | |
499 // Subsequent data is protected under the next FEC group. Send enough data to | |
500 // create 2 more packets: one full and one partial. | |
501 { | |
502 InSequence dummy; | |
503 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
504 .WillOnce(SaveArg<0>(&packet4_)); | |
505 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
506 .WillOnce(SaveArg<0>(&packet5_)); | |
507 } | |
508 size_t data_len = kDefaultMaxPacketSize + 1; | |
509 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | |
510 MUST_FEC_PROTECT, nullptr); | |
511 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
512 EXPECT_TRUE(consumed.fin_consumed); | |
513 CheckPacketHasSingleStreamFrame(packet4_); | |
514 CheckPacketHasSingleStreamFrame(packet5_); | |
515 EXPECT_TRUE(creator_->IsFecProtected()); | |
516 | |
517 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
518 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet6_)); | |
519 generator_.OnFecTimeout(); | |
520 CheckPacketIsFec(packet6_, 4); | |
521 EXPECT_FALSE(creator_->IsFecProtected()); | |
522 } | |
523 | |
524 TEST_F(QuicPacketGeneratorTest, GetFecTimeoutFiniteOnlyOnFirstPacketInGroup) { | |
525 delegate_.SetCanWriteAnything(); | |
526 creator_->set_max_packets_per_fec_group(6); | |
527 | |
528 // Send enough data to create 2 packets: one full and one partial. Send with | |
529 // MUST_FEC_PROTECT flag. No FEC packet is emitted yet, but the creator FEC | |
530 // protects all data. | |
531 { | |
532 InSequence dummy; | |
533 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
534 SaveArg<0>(&packet_)); | |
535 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
536 SaveArg<0>(&packet2_)); | |
537 } | |
538 size_t data_len = 1 * kDefaultMaxPacketSize + 100; | |
539 QuicConsumedData consumed = generator_.ConsumeData( | |
540 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
541 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
542 EXPECT_TRUE(consumed.fin_consumed); | |
543 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
544 CheckPacketHasSingleStreamFrame(packet_); | |
545 CheckPacketHasSingleStreamFrame(packet2_); | |
546 EXPECT_TRUE(creator_->IsFecProtected()); | |
547 | |
548 // GetFecTimeout returns finite timeout only for first packet in group. | |
549 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs), | |
550 generator_.GetFecTimeout(/*sequence_number=*/1u)); | |
551 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
552 generator_.GetFecTimeout(/*sequence_number=*/2u)); | |
553 | |
554 // Send more data with MAY_FEC_PROTECT. This packet should also be protected, | |
555 // and FEC packet is not yet sent. | |
556 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet3_)); | |
557 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
558 nullptr); | |
559 CheckPacketHasSingleStreamFrame(packet3_); | |
560 EXPECT_TRUE(creator_->IsFecProtected()); | |
561 | |
562 // GetFecTimeout returns finite timeout only for first packet in group. | |
563 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
564 generator_.GetFecTimeout(/*sequence_number=*/3u)); | |
565 | |
566 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
567 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet4_)); | |
568 generator_.OnFecTimeout(); | |
569 CheckPacketIsFec(packet4_, /*fec_group=*/1u); | |
570 EXPECT_FALSE(creator_->IsFecProtected()); | |
571 | |
572 // Subsequent data is protected under the next FEC group. Send enough data to | |
573 // create 2 more packets: one full and one partial. | |
574 { | |
575 InSequence dummy; | |
576 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
577 .WillOnce(SaveArg<0>(&packet5_)); | |
578 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
579 .WillOnce(SaveArg<0>(&packet6_)); | |
580 } | |
581 data_len = kDefaultMaxPacketSize + 1u; | |
582 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | |
583 MUST_FEC_PROTECT, nullptr); | |
584 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
585 EXPECT_TRUE(consumed.fin_consumed); | |
586 CheckPacketHasSingleStreamFrame(packet5_); | |
587 CheckPacketHasSingleStreamFrame(packet6_); | |
588 EXPECT_TRUE(creator_->IsFecProtected()); | |
589 | |
590 // GetFecTimeout returns finite timeout for first packet in the new group. | |
591 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs), | |
592 generator_.GetFecTimeout(/*sequence_number=*/5u)); | |
593 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
594 generator_.GetFecTimeout(/*sequence_number=*/6u)); | |
595 | |
596 // Calling OnFecTimeout should cause the FEC packet to be emitted. | |
597 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet7_)); | |
598 generator_.OnFecTimeout(); | |
599 CheckPacketIsFec(packet7_, /*fec_group=*/5u); | |
600 EXPECT_FALSE(creator_->IsFecProtected()); | |
601 | |
602 // Send more data with MAY_FEC_PROTECT. No FEC protection, so GetFecTimeout | |
603 // returns infinite. | |
604 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet8_)); | |
605 consumed = generator_.ConsumeData(9, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
606 nullptr); | |
607 CheckPacketHasSingleStreamFrame(packet8_); | |
608 EXPECT_FALSE(creator_->IsFecProtected()); | |
609 EXPECT_EQ(QuicTime::Delta::Infinite(), | |
610 generator_.GetFecTimeout(/*sequence_number=*/8u)); | |
611 } | |
612 | |
613 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { | |
614 // Set the packet size be enough for two stream frames with 0 stream offset, | |
615 // but not enough for a stream frame of 0 offset and one with non-zero offset. | |
616 size_t length = | |
617 NullEncrypter().GetCiphertextSize(0) + | |
618 GetPacketHeaderSize(creator_->connection_id_length(), true, | |
619 creator_->next_sequence_number_length(), | |
620 NOT_IN_FEC_GROUP) + | |
621 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger | |
622 // than the GetMinStreamFrameSize. | |
623 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + | |
624 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; | |
625 creator_->set_max_packet_length(length); | |
626 delegate_.SetCanWriteAnything(); | |
627 { | |
628 InSequence dummy; | |
629 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
630 SaveArg<0>(&packet_)); | |
631 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
632 SaveArg<0>(&packet2_)); | |
633 } | |
634 generator_.StartBatchOperations(); | |
635 // Queue enough data to prevent a stream frame with a non-zero offset from | |
636 // fitting. | |
637 QuicConsumedData consumed = | |
638 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 0, false, | |
639 MAY_FEC_PROTECT, nullptr); | |
640 EXPECT_EQ(3u, consumed.bytes_consumed); | |
641 EXPECT_FALSE(consumed.fin_consumed); | |
642 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
643 | |
644 // This frame will not fit with the existing frame, causing the queued frame | |
645 // to be serialized, and it will not fit with another frame like it, so it is | |
646 // serialized by itself. | |
647 consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3, | |
648 true, MAY_FEC_PROTECT, nullptr); | |
649 EXPECT_EQ(3u, consumed.bytes_consumed); | |
650 EXPECT_TRUE(consumed.fin_consumed); | |
651 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
652 | |
653 PacketContents contents; | |
654 contents.num_stream_frames = 1; | |
655 CheckPacketContains(contents, packet_); | |
656 CheckPacketContains(contents, packet2_); | |
657 } | |
658 | |
659 TEST_F(QuicPacketGeneratorTest, NoFecPacketSentWhenBatchEnds) { | |
660 delegate_.SetCanWriteAnything(); | |
661 creator_->set_max_packets_per_fec_group(6); | |
662 | |
663 generator_.StartBatchOperations(); | |
664 | |
665 generator_.ConsumeData(3, MakeIOVector("foo"), 2, true, MUST_FEC_PROTECT, | |
666 nullptr); | |
667 QuicConsumedData consumed = generator_.ConsumeData( | |
668 5, MakeIOVector("quux"), 7, false, MUST_FEC_PROTECT, nullptr); | |
669 EXPECT_EQ(4u, consumed.bytes_consumed); | |
670 EXPECT_FALSE(consumed.fin_consumed); | |
671 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
672 | |
673 // Now both frames will be flushed out, but FEC packet is not yet sent. | |
674 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | |
675 generator_.FinishBatchOperations(); | |
676 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
677 | |
678 PacketContents contents; | |
679 contents.num_stream_frames = 2u; | |
680 contents.fec_group = 1u; | |
681 CheckPacketContains(contents, packet_); | |
682 | |
683 // Forcing FEC timeout causes FEC packet to be emitted. | |
684 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet2_)); | |
685 generator_.OnFecTimeout(); | |
686 CheckPacketIsFec(packet2_, /*fec_group=*/1u); | |
687 } | |
688 | |
689 TEST_F(QuicPacketGeneratorTest, FecTimeoutOnRttChange) { | |
690 EXPECT_EQ(QuicTime::Delta::Zero(), | |
691 QuicPacketGeneratorPeer::GetFecTimeout(&generator_)); | |
692 generator_.OnRttChange(QuicTime::Delta::FromMilliseconds(300)); | |
693 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), | |
694 QuicPacketGeneratorPeer::GetFecTimeout(&generator_)); | |
695 } | |
696 | |
697 TEST_F(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) { | |
698 delegate_.SetCanWriteAnything(); | |
699 creator_->set_max_packets_per_fec_group(50); | |
700 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | |
701 EXPECT_FALSE(creator_->IsFecGroupOpen()); | |
702 | |
703 // On reduced cwnd. | |
704 generator_.OnCongestionWindowChange(7); | |
705 EXPECT_EQ(3u, creator_->max_packets_per_fec_group()); | |
706 | |
707 // On increased cwnd. | |
708 generator_.OnCongestionWindowChange(100); | |
709 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | |
710 | |
711 // On collapsed cwnd. | |
712 generator_.OnCongestionWindowChange(1); | |
713 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | |
714 } | |
715 | |
716 TEST_F(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) { | |
717 delegate_.SetCanWriteAnything(); | |
718 generator_.StartBatchOperations(); | |
719 creator_->set_max_packets_per_fec_group(50); | |
720 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | |
721 EXPECT_FALSE(creator_->IsFecGroupOpen()); | |
722 | |
723 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. 3 packets | |
724 // are sent, one is queued in the creator. | |
725 { | |
726 InSequence dummy; | |
727 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
728 SaveArg<0>(&packet_)); | |
729 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
730 SaveArg<0>(&packet2_)); | |
731 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
732 SaveArg<0>(&packet3_)); | |
733 } | |
734 size_t data_len = 3 * kDefaultMaxPacketSize + 1; | |
735 QuicConsumedData consumed = generator_.ConsumeData( | |
736 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); | |
737 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
738 EXPECT_TRUE(creator_->IsFecGroupOpen()); | |
739 | |
740 // Change FEC groupsize. | |
741 generator_.OnCongestionWindowChange(2); | |
742 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | |
743 | |
744 // Send enough data to trigger one unprotected data packet, causing the FEC | |
745 // packet to also be sent. | |
746 { | |
747 InSequence dummy; | |
748 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
749 SaveArg<0>(&packet4_)); | |
750 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
751 SaveArg<0>(&packet5_)); | |
752 } | |
753 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, | |
754 true, MAY_FEC_PROTECT, nullptr); | |
755 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); | |
756 // Verify that one FEC packet was sent. | |
757 CheckPacketIsFec(packet5_, /*fec_group=*/1u); | |
758 EXPECT_FALSE(creator_->IsFecGroupOpen()); | |
759 EXPECT_FALSE(creator_->IsFecProtected()); | |
760 } | |
761 | |
762 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) { | |
763 delegate_.SetCanWriteAnything(); | |
764 creator_->set_max_packets_per_fec_group(2); | |
765 EXPECT_FALSE(creator_->IsFecProtected()); | |
766 | |
767 // Send one unprotected data packet. | |
768 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
769 SaveArg<0>(&packet_)); | |
770 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | |
771 MAY_FEC_PROTECT, nullptr); | |
772 EXPECT_EQ(1u, consumed.bytes_consumed); | |
773 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
774 EXPECT_FALSE(creator_->IsFecProtected()); | |
775 // Verify that one data packet was sent. | |
776 PacketContents contents; | |
777 contents.num_stream_frames = 1; | |
778 CheckPacketContains(contents, packet_); | |
779 | |
780 { | |
781 InSequence dummy; | |
782 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
783 SaveArg<0>(&packet2_)); | |
784 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
785 SaveArg<0>(&packet3_)); | |
786 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
787 SaveArg<0>(&packet4_)); | |
788 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
789 SaveArg<0>(&packet5_)); | |
790 } | |
791 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. | |
792 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | |
793 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | |
794 MUST_FEC_PROTECT, nullptr); | |
795 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
796 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
797 | |
798 // Verify that packets sent were 3 data and 1 FEC. | |
799 CheckPacketHasSingleStreamFrame(packet2_); | |
800 CheckPacketHasSingleStreamFrame(packet3_); | |
801 CheckPacketIsFec(packet4_, /*fec_group=*/2u); | |
802 CheckPacketHasSingleStreamFrame(packet5_); | |
803 | |
804 // Calling OnFecTimeout should emit the pending FEC packet. | |
805 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet6_)); | |
806 generator_.OnFecTimeout(); | |
807 CheckPacketIsFec(packet6_, /*fec_group=*/5u); | |
808 | |
809 // Send one unprotected data packet. | |
810 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
811 SaveArg<0>(&packet7_)); | |
812 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
813 nullptr); | |
814 EXPECT_EQ(1u, consumed.bytes_consumed); | |
815 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
816 EXPECT_FALSE(creator_->IsFecProtected()); | |
817 // Verify that one unprotected data packet was sent. | |
818 CheckPacketContains(contents, packet7_); | |
819 } | |
820 | |
821 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { | |
822 delegate_.SetCanWriteAnything(); | |
823 // Enable FEC. | |
824 creator_->set_max_packets_per_fec_group(2); | |
825 | |
826 generator_.StartBatchOperations(); | |
827 // Queue enough data to prevent a stream frame with a non-zero offset from | |
828 // fitting. | |
829 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | |
830 MAY_FEC_PROTECT, nullptr); | |
831 EXPECT_EQ(1u, consumed.bytes_consumed); | |
832 EXPECT_TRUE(creator_->HasPendingFrames()); | |
833 | |
834 // Queue protected data for sending. Should cause queued frames to be flushed. | |
835 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
836 SaveArg<0>(&packet_)); | |
837 EXPECT_FALSE(creator_->IsFecProtected()); | |
838 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | |
839 MUST_FEC_PROTECT, nullptr); | |
840 EXPECT_EQ(1u, consumed.bytes_consumed); | |
841 PacketContents contents; | |
842 contents.num_stream_frames = 1; | |
843 // Transmitted packet was not FEC protected. | |
844 CheckPacketContains(contents, packet_); | |
845 EXPECT_TRUE(creator_->IsFecProtected()); | |
846 EXPECT_TRUE(creator_->HasPendingFrames()); | |
847 } | |
848 | |
849 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { | |
850 // Enable FEC. | |
851 creator_->set_max_packets_per_fec_group(2); | |
852 | |
853 // Queue control frames in generator. | |
854 delegate_.SetCanNotWrite(); | |
855 generator_.SetShouldSendAck(true); | |
856 delegate_.SetCanWriteAnything(); | |
857 generator_.StartBatchOperations(); | |
858 | |
859 // Set up frames to write into the creator when control frames are written. | |
860 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | |
861 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); | |
862 | |
863 // Generator should have queued control frames, and creator should be empty. | |
864 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
865 EXPECT_FALSE(creator_->HasPendingFrames()); | |
866 EXPECT_FALSE(creator_->IsFecProtected()); | |
867 | |
868 // Queue protected data for sending. Should cause queued frames to be flushed. | |
869 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
870 SaveArg<0>(&packet_)); | |
871 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | |
872 MUST_FEC_PROTECT, nullptr); | |
873 EXPECT_EQ(1u, consumed.bytes_consumed); | |
874 PacketContents contents; | |
875 contents.num_ack_frames = 1; | |
876 contents.num_stop_waiting_frames = 1; | |
877 CheckPacketContains(contents, packet_); | |
878 | |
879 // FEC protection should be on in creator. | |
880 EXPECT_TRUE(creator_->IsFecProtected()); | |
881 } | |
882 | |
883 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { | |
884 delegate_.SetCanWriteAnything(); | |
885 | |
886 // Enable FEC. | |
887 creator_->set_max_packets_per_fec_group(2); | |
888 EXPECT_FALSE(creator_->IsFecProtected()); | |
889 | |
890 // Queue stream frame to be protected in creator. | |
891 generator_.StartBatchOperations(); | |
892 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | |
893 MUST_FEC_PROTECT, nullptr); | |
894 EXPECT_EQ(1u, consumed.bytes_consumed); | |
895 // Creator has a pending protected frame. | |
896 EXPECT_TRUE(creator_->HasPendingFrames()); | |
897 EXPECT_TRUE(creator_->IsFecProtected()); | |
898 | |
899 // Add enough unprotected data to exceed size of current packet, so that | |
900 // current packet is sent. Both frames will be sent out in a single packet. | |
901 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | |
902 size_t data_len = kDefaultMaxPacketSize; | |
903 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | |
904 MAY_FEC_PROTECT, nullptr); | |
905 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
906 PacketContents contents; | |
907 contents.num_stream_frames = 2u; | |
908 contents.fec_group = 1u; | |
909 CheckPacketContains(contents, packet_); | |
910 // FEC protection should still be on in creator. | |
911 EXPECT_TRUE(creator_->IsFecProtected()); | |
912 } | |
913 | |
914 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { | |
915 delegate_.SetCanWriteAnything(); | |
916 | |
917 // Enable FEC. | |
918 creator_->set_max_packets_per_fec_group(2); | |
919 EXPECT_FALSE(creator_->IsFecProtected()); | |
920 | |
921 // Send first packet, FEC protected. | |
922 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | |
923 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | |
924 MUST_FEC_PROTECT, nullptr); | |
925 EXPECT_EQ(1u, consumed.bytes_consumed); | |
926 PacketContents contents; | |
927 contents.num_stream_frames = 1u; | |
928 contents.fec_group = 1u; | |
929 CheckPacketContains(contents, packet_); | |
930 | |
931 // FEC should still be on in creator. | |
932 EXPECT_TRUE(creator_->IsFecProtected()); | |
933 | |
934 // Send unprotected data to cause second packet to be sent, which gets | |
935 // protected because it happens to fall within an open FEC group. Data packet | |
936 // will be followed by FEC packet. | |
937 { | |
938 InSequence dummy; | |
939 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
940 SaveArg<0>(&packet2_)); | |
941 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
942 SaveArg<0>(&packet3_)); | |
943 } | |
944 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | |
945 nullptr); | |
946 EXPECT_EQ(1u, consumed.bytes_consumed); | |
947 contents.num_stream_frames = 1u; | |
948 CheckPacketContains(contents, packet2_); | |
949 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | |
950 | |
951 // FEC protection should be off in creator. | |
952 EXPECT_FALSE(creator_->IsFecProtected()); | |
953 } | |
954 | |
955 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { | |
956 delegate_.SetCanWriteAnything(); | |
957 generator_.StartBatchOperations(); | |
958 | |
959 // Enable FEC. | |
960 creator_->set_max_packets_per_fec_group(2); | |
961 EXPECT_FALSE(creator_->IsFecProtected()); | |
962 | |
963 // Queue one byte of FEC protected data. | |
964 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | |
965 MUST_FEC_PROTECT, nullptr); | |
966 EXPECT_TRUE(creator_->HasPendingFrames()); | |
967 | |
968 // Add more unprotected data causing first packet to be sent, FEC protected. | |
969 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
970 SaveArg<0>(&packet_)); | |
971 size_t data_len = kDefaultMaxPacketSize; | |
972 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | |
973 MAY_FEC_PROTECT, nullptr); | |
974 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
975 PacketContents contents; | |
976 contents.num_stream_frames = 2u; | |
977 contents.fec_group = 1u; | |
978 CheckPacketContains(contents, packet_); | |
979 | |
980 // FEC group is still open in creator. | |
981 EXPECT_TRUE(creator_->IsFecProtected()); | |
982 | |
983 // Add data that should be protected, large enough to cause second packet to | |
984 // be sent. Data packet should be followed by FEC packet. | |
985 { | |
986 InSequence dummy; | |
987 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
988 SaveArg<0>(&packet2_)); | |
989 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
990 SaveArg<0>(&packet3_)); | |
991 } | |
992 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | |
993 MUST_FEC_PROTECT, nullptr); | |
994 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
995 CheckPacketContains(contents, packet2_); | |
996 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | |
997 | |
998 // FEC protection should remain on in creator. | |
999 EXPECT_TRUE(creator_->IsFecProtected()); | |
1000 } | |
1001 | |
1002 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { | |
1003 delegate_.SetCanNotWrite(); | |
1004 | |
1005 generator_.SetShouldSendAck(false); | |
1006 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
1007 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
1008 | |
1009 delegate_.SetCanWriteAnything(); | |
1010 | |
1011 generator_.StartBatchOperations(); | |
1012 | |
1013 // When the first write operation is invoked, the ack frame will be returned. | |
1014 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | |
1015 | |
1016 // Send some data and a control frame | |
1017 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, | |
1018 nullptr); | |
1019 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | |
1020 | |
1021 // All five frames will be flushed out in a single packet. | |
1022 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); | |
1023 generator_.FinishBatchOperations(); | |
1024 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
1025 | |
1026 PacketContents contents; | |
1027 contents.num_ack_frames = 1; | |
1028 contents.num_goaway_frames = 1; | |
1029 contents.num_rst_stream_frames = 1; | |
1030 contents.num_stream_frames = 1; | |
1031 CheckPacketContains(contents, packet_); | |
1032 } | |
1033 | |
1034 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { | |
1035 delegate_.SetCanNotWrite(); | |
1036 | |
1037 generator_.SetShouldSendAck(false); | |
1038 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | |
1039 EXPECT_TRUE(generator_.HasQueuedFrames()); | |
1040 | |
1041 delegate_.SetCanWriteAnything(); | |
1042 | |
1043 generator_.StartBatchOperations(); | |
1044 | |
1045 // When the first write operation is invoked, the ack frame will be returned. | |
1046 EXPECT_CALL(delegate_, PopulateAckFrame(_)); | |
1047 | |
1048 { | |
1049 InSequence dummy; | |
1050 // All five frames will be flushed out in a single packet | |
1051 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
1052 SaveArg<0>(&packet_)); | |
1053 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | |
1054 SaveArg<0>(&packet2_)); | |
1055 } | |
1056 | |
1057 // Send enough data to exceed one packet | |
1058 size_t data_len = kDefaultMaxPacketSize + 100; | |
1059 QuicConsumedData consumed = generator_.ConsumeData( | |
1060 3, CreateData(data_len), 0, true, MAY_FEC_PROTECT, nullptr); | |
1061 EXPECT_EQ(data_len, consumed.bytes_consumed); | |
1062 EXPECT_TRUE(consumed.fin_consumed); | |
1063 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | |
1064 | |
1065 generator_.FinishBatchOperations(); | |
1066 EXPECT_FALSE(generator_.HasQueuedFrames()); | |
1067 | |
1068 // The first packet should have the queued data and part of the stream data. | |
1069 PacketContents contents; | |
1070 contents.num_ack_frames = 1; | |
1071 contents.num_rst_stream_frames = 1; | |
1072 contents.num_stream_frames = 1; | |
1073 CheckPacketContains(contents, packet_); | |
1074 | |
1075 // The second should have the remainder of the stream data. | |
1076 PacketContents contents2; | |
1077 contents2.num_goaway_frames = 1; | |
1078 contents2.num_stream_frames = 1; | |
1079 CheckPacketContains(contents2, packet2_); | |
1080 } | |
1081 | |
1082 TEST_F(QuicPacketGeneratorTest, TestConnectionIdLength) { | |
1083 generator_.SetConnectionIdLength(0); | |
1084 EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID, creator_->connection_id_length()); | |
1085 generator_.SetConnectionIdLength(1); | |
1086 EXPECT_EQ(PACKET_1BYTE_CONNECTION_ID, creator_->connection_id_length()); | |
1087 generator_.SetConnectionIdLength(2); | |
1088 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); | |
1089 generator_.SetConnectionIdLength(3); | |
1090 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); | |
1091 generator_.SetConnectionIdLength(4); | |
1092 EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); | |
1093 generator_.SetConnectionIdLength(5); | |
1094 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | |
1095 generator_.SetConnectionIdLength(6); | |
1096 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | |
1097 generator_.SetConnectionIdLength(7); | |
1098 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | |
1099 generator_.SetConnectionIdLength(8); | |
1100 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | |
1101 generator_.SetConnectionIdLength(9); | |
1102 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); | |
1103 } | |
1104 | |
1105 } // namespace test | |
1106 } // namespace net | |
OLD | NEW |