OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/quic_packet_creator.h" | 5 #include "net/quic/quic_packet_creator.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 params.push_back(TestParams(all_supported_versions[0], true, max)); | 75 params.push_back(TestParams(all_supported_versions[0], true, max)); |
76 return params; | 76 return params; |
77 } | 77 } |
78 | 78 |
79 class MockDelegate : public QuicPacketCreator::DelegateInterface { | 79 class MockDelegate : public QuicPacketCreator::DelegateInterface { |
80 public: | 80 public: |
81 MockDelegate() {} | 81 MockDelegate() {} |
82 ~MockDelegate() override {} | 82 ~MockDelegate() override {} |
83 | 83 |
84 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet)); | 84 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet)); |
85 MOCK_METHOD0(OnResetFecGroup, void()); | |
86 MOCK_METHOD2(OnUnrecoverableError, | 85 MOCK_METHOD2(OnUnrecoverableError, |
87 void(QuicErrorCode, ConnectionCloseSource source)); | 86 void(QuicErrorCode, ConnectionCloseSource source)); |
88 | 87 |
89 private: | 88 private: |
90 DISALLOW_COPY_AND_ASSIGN(MockDelegate); | 89 DISALLOW_COPY_AND_ASSIGN(MockDelegate); |
91 }; | 90 }; |
92 | 91 |
93 class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> { | 92 class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> { |
94 public: | 93 public: |
95 void ClearSerializedPacket(SerializedPacket* serialized_packet) { | 94 void ClearSerializedPacket(SerializedPacket* serialized_packet) { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 ASSERT_TRUE(frame.stream_frame); | 172 ASSERT_TRUE(frame.stream_frame); |
174 EXPECT_EQ(stream_id, frame.stream_frame->stream_id); | 173 EXPECT_EQ(stream_id, frame.stream_frame->stream_id); |
175 EXPECT_EQ(data, StringPiece(frame.stream_frame->frame_buffer, | 174 EXPECT_EQ(data, StringPiece(frame.stream_frame->frame_buffer, |
176 frame.stream_frame->frame_length)); | 175 frame.stream_frame->frame_length)); |
177 EXPECT_EQ(offset, frame.stream_frame->offset); | 176 EXPECT_EQ(offset, frame.stream_frame->offset); |
178 EXPECT_EQ(fin, frame.stream_frame->fin); | 177 EXPECT_EQ(fin, frame.stream_frame->fin); |
179 } | 178 } |
180 | 179 |
181 // Returns the number of bytes consumed by the header of packet, including | 180 // Returns the number of bytes consumed by the header of packet, including |
182 // the version. | 181 // the version. |
183 size_t GetPacketHeaderOverhead(InFecGroup is_in_fec_group) { | 182 size_t GetPacketHeaderOverhead() { |
184 return GetPacketHeaderSize( | 183 return GetPacketHeaderSize( |
185 creator_.connection_id_length(), kIncludeVersion, !kIncludePathId, | 184 creator_.connection_id_length(), kIncludeVersion, !kIncludePathId, |
186 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_), | 185 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_), |
187 is_in_fec_group); | 186 NOT_IN_FEC_GROUP); |
188 } | 187 } |
189 | 188 |
190 // Returns the number of bytes of overhead that will be added to a packet | 189 // Returns the number of bytes of overhead that will be added to a packet |
191 // of maximum length. | 190 // of maximum length. |
192 size_t GetEncryptionOverhead() { | 191 size_t GetEncryptionOverhead() { |
193 return creator_.max_packet_length() - | 192 return creator_.max_packet_length() - |
194 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length()); | 193 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length()); |
195 } | 194 } |
196 | 195 |
197 // Returns the number of bytes consumed by the non-data fields of a stream | 196 // Returns the number of bytes consumed by the non-data fields of a stream |
198 // frame, assuming it is the last frame in the packet | 197 // frame, assuming it is the last frame in the packet |
199 size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) { | 198 size_t GetStreamFrameOverhead() { |
200 return QuicFramer::GetMinStreamFrameSize(kClientDataStreamId1, kOffset, | 199 return QuicFramer::GetMinStreamFrameSize(kClientDataStreamId1, kOffset, |
201 true, is_in_fec_group); | 200 true, NOT_IN_FEC_GROUP); |
202 } | 201 } |
203 | 202 |
204 QuicIOVector MakeIOVector(StringPiece s) { | 203 QuicIOVector MakeIOVector(StringPiece s) { |
205 return ::net::MakeIOVector(s, &iov_); | 204 return ::net::MakeIOVector(s, &iov_); |
206 } | 205 } |
207 | 206 |
208 PendingRetransmission CreateRetransmission( | 207 PendingRetransmission CreateRetransmission( |
209 const QuicFrames& retransmittable_frames, | 208 const QuicFrames& retransmittable_frames, |
210 bool has_crypto_handshake, | 209 bool has_crypto_handshake, |
211 bool needs_padding, | 210 bool needs_padding, |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 266 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
268 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); | 267 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); |
269 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 268 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
270 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 269 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
271 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 270 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
272 } | 271 } |
273 ProcessPacket(serialized); | 272 ProcessPacket(serialized); |
274 } | 273 } |
275 } | 274 } |
276 | 275 |
277 TEST_P(QuicPacketCreatorTest, SerializeWithFEC) { | |
278 // Send FEC packet every 6 packets. | |
279 creator_.set_max_packets_per_fec_group(6); | |
280 // Should return false since we do not have enough packets in the FEC group to | |
281 // trigger an FEC packet. | |
282 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | |
283 // Turn on FEC protection. | |
284 QuicFrame frame; | |
285 QuicIOVector io_vector(MakeIOVector("test")); | |
286 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | |
287 MUST_FEC_PROTECT)); | |
288 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
289 // Serialize the packet. | |
290 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
291 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | |
292 creator_.Flush(); | |
293 | |
294 { | |
295 InSequence s; | |
296 EXPECT_CALL(framer_visitor_, OnPacket()); | |
297 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | |
298 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | |
299 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); | |
300 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | |
301 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); | |
302 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | |
303 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | |
304 } | |
305 ProcessPacket(serialized_packet_); | |
306 DeleteSerializedPacket(); | |
307 | |
308 // Should return false since we do not have enough packets in the FEC group to | |
309 // trigger an FEC packet. | |
310 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | |
311 // Should return true since there are packets in the FEC group. | |
312 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); | |
313 | |
314 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
315 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | |
316 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, | |
317 /*is_fec_timeout=*/false); | |
318 ASSERT_EQ(2u, serialized_packet_.packet_number); | |
319 { | |
320 InSequence s; | |
321 EXPECT_CALL(framer_visitor_, OnPacket()); | |
322 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | |
323 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | |
324 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); | |
325 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | |
326 EXPECT_CALL(framer_visitor_, OnFecData(_)); | |
327 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | |
328 } | |
329 ProcessPacket(serialized_packet_); | |
330 DeleteSerializedPacket(); | |
331 } | |
332 | |
333 TEST_P(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) { | 276 TEST_P(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) { |
334 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u)))); | 277 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u)))); |
335 creator_.AddSavedFrame(frames_[0]); | 278 creator_.AddSavedFrame(frames_[0]); |
336 QuicPacketCreatorPeer::SetNextPacketNumberLength(&creator_, | 279 QuicPacketCreatorPeer::SetNextPacketNumberLength(&creator_, |
337 PACKET_4BYTE_PACKET_NUMBER); | 280 PACKET_4BYTE_PACKET_NUMBER); |
338 | 281 |
339 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 282 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
340 .WillRepeatedly( | 283 .WillRepeatedly( |
341 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 284 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
342 creator_.Flush(); | 285 creator_.Flush(); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 396 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
454 } | 397 } |
455 ProcessPacket(serialized_packet_); | 398 ProcessPacket(serialized_packet_); |
456 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, | 399 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, |
457 header.public_header.packet_number_length); | 400 header.public_header.packet_number_length); |
458 | 401 |
459 DeleteSerializedPacket(); | 402 DeleteSerializedPacket(); |
460 delete ack_frame.ack_frame; | 403 delete ack_frame.ack_frame; |
461 } | 404 } |
462 | 405 |
463 TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) { | |
464 // Test goal is to test the following sequence (P1 => generate Packet 1): | |
465 // P1 <change seq num length> P2 FEC, | |
466 // and we expect that packet number length should not change until the end | |
467 // of the open FEC group. | |
468 | |
469 // Send FEC packet every 6 packets. | |
470 creator_.set_max_packets_per_fec_group(6); | |
471 // Should return false since we do not have enough packets in the FEC group to | |
472 // trigger an FEC packet. | |
473 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | |
474 | |
475 // Generate Packet 1. | |
476 QuicFrame frame; | |
477 QuicIOVector io_vector(MakeIOVector("test")); | |
478 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | |
479 MUST_FEC_PROTECT)); | |
480 // Change the packet number length mid-FEC group and it should not change. | |
481 QuicPacketCreatorPeer::SetNextPacketNumberLength(&creator_, | |
482 PACKET_4BYTE_PACKET_NUMBER); | |
483 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
484 .WillRepeatedly( | |
485 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | |
486 creator_.Flush(); | |
487 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | |
488 serialized_packet_.packet_number_length); | |
489 | |
490 { | |
491 InSequence s; | |
492 EXPECT_CALL(framer_visitor_, OnPacket()); | |
493 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | |
494 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | |
495 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); | |
496 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | |
497 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); | |
498 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | |
499 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | |
500 } | |
501 ProcessPacket(serialized_packet_); | |
502 DeleteSerializedPacket(); | |
503 | |
504 // Generate Packet 2. | |
505 ASSERT_TRUE(creator_.ConsumeData(2u, io_vector, 0u, 0u, false, false, &frame, | |
506 MUST_FEC_PROTECT)); | |
507 creator_.Flush(); | |
508 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | |
509 serialized_packet_.packet_number_length); | |
510 | |
511 { | |
512 InSequence s; | |
513 EXPECT_CALL(framer_visitor_, OnPacket()); | |
514 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | |
515 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | |
516 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); | |
517 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | |
518 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); | |
519 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | |
520 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | |
521 } | |
522 ProcessPacket(serialized_packet_); | |
523 DeleteSerializedPacket(); | |
524 | |
525 // Should return false since we do not have enough packets in the FEC group to | |
526 // trigger an FEC packet. | |
527 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | |
528 // Should return true since there are packets in the FEC group. | |
529 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); | |
530 | |
531 // Force generation of FEC packet. | |
532 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
533 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | |
534 // Turn off FEC protection. | |
535 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, | |
536 /*is_fec_timeout=*/false); | |
537 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | |
538 serialized_packet_.packet_number_length); | |
539 ASSERT_EQ(3u, serialized_packet_.packet_number); | |
540 | |
541 { | |
542 InSequence s; | |
543 EXPECT_CALL(framer_visitor_, OnPacket()); | |
544 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | |
545 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | |
546 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); | |
547 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | |
548 EXPECT_CALL(framer_visitor_, OnFecData(_)); | |
549 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | |
550 } | |
551 ProcessPacket(serialized_packet_); | |
552 DeleteSerializedPacket(); | |
553 | |
554 // Ensure the next FEC group starts using the new packet number length. | |
555 ASSERT_TRUE(creator_.ConsumeData(3u, io_vector, 0u, 0u, false, false, &frame, | |
556 MUST_FEC_PROTECT)); | |
557 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
558 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
559 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | |
560 creator_.Flush(); | |
561 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, | |
562 serialized_packet_.packet_number_length); | |
563 DeleteSerializedPacket(); | |
564 } | |
565 | |
566 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) { | 406 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) { |
567 // If the original packet number length, the current packet number | 407 // If the original packet number length, the current packet number |
568 // length, and the configured send packet number length are different, the | 408 // length, and the configured send packet number length are different, the |
569 // retransmit must sent with the original length and the others do not change. | 409 // retransmit must sent with the original length and the others do not change. |
570 QuicPacketCreatorPeer::SetNextPacketNumberLength(&creator_, | 410 QuicPacketCreatorPeer::SetNextPacketNumberLength(&creator_, |
571 PACKET_4BYTE_PACKET_NUMBER); | 411 PACKET_4BYTE_PACKET_NUMBER); |
572 QuicPacketCreatorPeer::SetPacketNumberLength(&creator_, | 412 QuicPacketCreatorPeer::SetPacketNumberLength(&creator_, |
573 PACKET_2BYTE_PACKET_NUMBER); | 413 PACKET_2BYTE_PACKET_NUMBER); |
574 QuicStreamFrame* stream_frame = | 414 QuicStreamFrame* stream_frame = |
575 new QuicStreamFrame(kCryptoStreamId, /*fin=*/false, 0u, StringPiece()); | 415 new QuicStreamFrame(kCryptoStreamId, /*fin=*/false, 0u, StringPiece()); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 ENCRYPTION_NONE, | 492 ENCRYPTION_NONE, |
653 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_))); | 493 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_))); |
654 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 494 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
655 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 495 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
656 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); | 496 creator_.ReserializeAllFrames(retransmission, buffer, kMaxPacketSize); |
657 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length); | 497 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length); |
658 delete frame.stream_frame; | 498 delete frame.stream_frame; |
659 } | 499 } |
660 | 500 |
661 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPacketAndPadding) { | 501 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPacketAndPadding) { |
662 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + | 502 const size_t overhead = GetPacketHeaderOverhead() + GetEncryptionOverhead() + |
663 GetEncryptionOverhead() + | 503 GetStreamFrameOverhead(); |
664 GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | |
665 size_t capacity = kDefaultMaxPacketSize - overhead; | 504 size_t capacity = kDefaultMaxPacketSize - overhead; |
666 for (int delta = -5; delta <= 0; ++delta) { | 505 for (int delta = -5; delta <= 0; ++delta) { |
667 string data(capacity + delta, 'A'); | 506 string data(capacity + delta, 'A'); |
668 size_t bytes_free = 0 - delta; | 507 size_t bytes_free = 0 - delta; |
669 | 508 |
670 QuicFrame frame; | 509 QuicFrame frame; |
671 QuicIOVector io_vector(MakeIOVector(data)); | 510 QuicIOVector io_vector(MakeIOVector(data)); |
672 UniqueStreamBuffer stream_buffer; | 511 UniqueStreamBuffer stream_buffer; |
673 QuicPacketCreatorPeer::CreateStreamFrame( | 512 QuicPacketCreatorPeer::CreateStreamFrame( |
674 &creator_, kCryptoStreamId, io_vector, 0, kOffset, false, &frame); | 513 &creator_, kCryptoStreamId, io_vector, 0, kOffset, false, &frame); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
715 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); | 554 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); |
716 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); | 555 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); |
717 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); | 556 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); |
718 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); | 557 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); |
719 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); | 558 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); |
720 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 559 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
721 | 560 |
722 ProcessPacket(serialized); | 561 ProcessPacket(serialized); |
723 } | 562 } |
724 | 563 |
725 TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithGroupInProgress) { | |
726 // Send FEC packet every 6 packets. | |
727 creator_.set_max_packets_per_fec_group(6); | |
728 // Turn on FEC protection. | |
729 QuicFrame frame; | |
730 QuicIOVector io_vector(MakeIOVector("test")); | |
731 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | |
732 MUST_FEC_PROTECT)); | |
733 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
734 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
735 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | |
736 creator_.Flush(); | |
737 // We do not have enough packets in the FEC group to trigger an FEC packet. | |
738 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | |
739 // Should return true since there are packets in the FEC group. | |
740 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); | |
741 | |
742 // Switching FEC off should not change creator state, since there is an | |
743 // FEC packet under construction. | |
744 EXPECT_DFATAL(QuicPacketCreatorPeer::StopFecProtectingPackets(&creator_), | |
745 "Cannot stop FEC protection with open FEC group."); | |
746 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
747 // Confirm that FEC packet is still under construction. | |
748 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); | |
749 | |
750 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
751 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | |
752 // Turn off FEC protection. | |
753 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, | |
754 /*is_fec_timeout=*/false); | |
755 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
756 } | |
757 | |
758 TEST_P(QuicPacketCreatorTest, SwitchFecOnWithStreamFrameQueued) { | |
759 // Add a stream frame to the creator. | |
760 QuicFrame frame; | |
761 QuicIOVector io_vector(MakeIOVector("test")); | |
762 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | |
763 MAY_FEC_PROTECT)); | |
764 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
765 ASSERT_TRUE(frame.stream_frame); | |
766 size_t consumed = frame.stream_frame->frame_length; | |
767 EXPECT_EQ(4u, consumed); | |
768 EXPECT_TRUE(creator_.HasPendingFrames()); | |
769 | |
770 // Enable FEC protection, and send FEC packet every 6 packets. | |
771 creator_.set_max_packets_per_fec_group(6); | |
772 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecEnabled(&creator_)); | |
773 EXPECT_DFATAL(QuicPacketCreatorPeer::StartFecProtectingPackets(&creator_), | |
774 "Cannot start FEC protection with pending frames."); | |
775 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
776 | |
777 // Start FEC protection after current open packet is flushed. | |
778 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
779 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | |
780 ASSERT_TRUE(creator_.ConsumeData(2u, io_vector, 0u, 0u, false, false, &frame, | |
781 MUST_FEC_PROTECT)); | |
782 ASSERT_TRUE(frame.stream_frame); | |
783 consumed = frame.stream_frame->frame_length; | |
784 EXPECT_EQ(4u, consumed); | |
785 EXPECT_TRUE(creator_.HasPendingFrames()); | |
786 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
787 } | |
788 | |
789 TEST_P(QuicPacketCreatorTest, ConsumeData) { | 564 TEST_P(QuicPacketCreatorTest, ConsumeData) { |
790 QuicFrame frame; | 565 QuicFrame frame; |
791 QuicIOVector io_vector(MakeIOVector("test")); | 566 QuicIOVector io_vector(MakeIOVector("test")); |
792 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | 567 ASSERT_TRUE( |
793 MAY_FEC_PROTECT)); | 568 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); |
794 ASSERT_TRUE(frame.stream_frame); | 569 ASSERT_TRUE(frame.stream_frame); |
795 size_t consumed = frame.stream_frame->frame_length; | 570 size_t consumed = frame.stream_frame->frame_length; |
796 EXPECT_EQ(4u, consumed); | 571 EXPECT_EQ(4u, consumed); |
797 CheckStreamFrame(frame, 1u, "test", 0u, false); | 572 CheckStreamFrame(frame, 1u, "test", 0u, false); |
798 EXPECT_TRUE(creator_.HasPendingFrames()); | 573 EXPECT_TRUE(creator_.HasPendingFrames()); |
799 } | 574 } |
800 | 575 |
801 TEST_P(QuicPacketCreatorTest, ConsumeDataFin) { | 576 TEST_P(QuicPacketCreatorTest, ConsumeDataFin) { |
802 QuicFrame frame; | 577 QuicFrame frame; |
803 QuicIOVector io_vector(MakeIOVector("test")); | 578 QuicIOVector io_vector(MakeIOVector("test")); |
804 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 10u, true, false, &frame, | 579 ASSERT_TRUE( |
805 MAY_FEC_PROTECT)); | 580 creator_.ConsumeData(1u, io_vector, 0u, 10u, true, false, &frame)); |
806 ASSERT_TRUE(frame.stream_frame); | 581 ASSERT_TRUE(frame.stream_frame); |
807 size_t consumed = frame.stream_frame->frame_length; | 582 size_t consumed = frame.stream_frame->frame_length; |
808 EXPECT_EQ(4u, consumed); | 583 EXPECT_EQ(4u, consumed); |
809 CheckStreamFrame(frame, 1u, "test", 10u, true); | 584 CheckStreamFrame(frame, 1u, "test", 10u, true); |
810 EXPECT_TRUE(creator_.HasPendingFrames()); | 585 EXPECT_TRUE(creator_.HasPendingFrames()); |
811 } | 586 } |
812 | 587 |
813 TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) { | 588 TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) { |
814 QuicFrame frame; | 589 QuicFrame frame; |
815 QuicIOVector io_vector(nullptr, 0, 0); | 590 QuicIOVector io_vector(nullptr, 0, 0); |
816 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame, | 591 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame)); |
817 MAY_FEC_PROTECT)); | |
818 ASSERT_TRUE(frame.stream_frame); | 592 ASSERT_TRUE(frame.stream_frame); |
819 size_t consumed = frame.stream_frame->frame_length; | 593 size_t consumed = frame.stream_frame->frame_length; |
820 EXPECT_EQ(0u, consumed); | 594 EXPECT_EQ(0u, consumed); |
821 CheckStreamFrame(frame, 1u, string(), 0u, true); | 595 CheckStreamFrame(frame, 1u, string(), 0u, true); |
822 EXPECT_TRUE(creator_.HasPendingFrames()); | 596 EXPECT_TRUE(creator_.HasPendingFrames()); |
823 } | 597 } |
824 | 598 |
825 TEST_P(QuicPacketCreatorTest, ConsumeDataWithFecProtect) { | |
826 creator_.set_max_packets_per_fec_group(6); | |
827 QuicFrame frame; | |
828 QuicIOVector io_vector(MakeIOVector("test")); | |
829 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
830 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | |
831 MUST_FEC_PROTECT)); | |
832 ASSERT_TRUE(frame.stream_frame); | |
833 size_t consumed = frame.stream_frame->frame_length; | |
834 EXPECT_EQ(4u, consumed); | |
835 CheckStreamFrame(frame, 1u, "test", 0u, false); | |
836 EXPECT_TRUE(creator_.HasPendingFrames()); | |
837 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
838 } | |
839 | |
840 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { | 599 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { |
841 const size_t overhead = | 600 const size_t overhead = GetPacketHeaderOverhead() + GetEncryptionOverhead(); |
842 GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + GetEncryptionOverhead(); | |
843 for (size_t i = overhead; i < overhead + 100; ++i) { | 601 for (size_t i = overhead; i < overhead + 100; ++i) { |
844 creator_.SetMaxPacketLength(i); | 602 creator_.SetMaxPacketLength(i); |
845 const bool should_have_room = | 603 const bool should_have_room = i > overhead + GetStreamFrameOverhead(); |
846 i > overhead + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | |
847 ASSERT_EQ(should_have_room, | 604 ASSERT_EQ(should_have_room, |
848 creator_.HasRoomForStreamFrame(kClientDataStreamId1, kOffset)); | 605 creator_.HasRoomForStreamFrame(kClientDataStreamId1, kOffset)); |
849 if (should_have_room) { | 606 if (should_have_room) { |
850 QuicFrame frame; | 607 QuicFrame frame; |
851 QuicIOVector io_vector(MakeIOVector("testdata")); | 608 QuicIOVector io_vector(MakeIOVector("testdata")); |
852 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 609 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
853 .WillRepeatedly( | 610 .WillRepeatedly( |
854 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | 611 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); |
855 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, | 612 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, |
856 kOffset, false, false, &frame, | 613 kOffset, false, false, &frame)); |
857 MAY_FEC_PROTECT)); | |
858 ASSERT_TRUE(frame.stream_frame); | 614 ASSERT_TRUE(frame.stream_frame); |
859 size_t bytes_consumed = frame.stream_frame->frame_length; | 615 size_t bytes_consumed = frame.stream_frame->frame_length; |
860 EXPECT_LT(0u, bytes_consumed); | 616 EXPECT_LT(0u, bytes_consumed); |
861 creator_.Flush(); | 617 creator_.Flush(); |
862 } | 618 } |
863 } | 619 } |
864 } | 620 } |
865 | 621 |
866 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { | 622 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { |
867 // Compute the total overhead for a single frame in packet. | 623 // Compute the total overhead for a single frame in packet. |
868 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + | 624 const size_t overhead = GetPacketHeaderOverhead() + GetEncryptionOverhead() + |
869 GetEncryptionOverhead() + | 625 GetStreamFrameOverhead(); |
870 GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | |
871 size_t capacity = kDefaultMaxPacketSize - overhead; | 626 size_t capacity = kDefaultMaxPacketSize - overhead; |
872 // Now, test various sizes around this size. | 627 // Now, test various sizes around this size. |
873 for (int delta = -5; delta <= 5; ++delta) { | 628 for (int delta = -5; delta <= 5; ++delta) { |
874 string data(capacity + delta, 'A'); | 629 string data(capacity + delta, 'A'); |
875 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 630 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
876 QuicFrame frame; | 631 QuicFrame frame; |
877 QuicIOVector io_vector(MakeIOVector(data)); | 632 QuicIOVector io_vector(MakeIOVector(data)); |
878 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, | 633 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, |
879 kOffset, false, false, &frame, | 634 kOffset, false, false, &frame)); |
880 MAY_FEC_PROTECT)); | |
881 ASSERT_TRUE(frame.stream_frame); | 635 ASSERT_TRUE(frame.stream_frame); |
882 | 636 |
883 // BytesFree() returns bytes available for the next frame, which will | 637 // BytesFree() returns bytes available for the next frame, which will |
884 // be two bytes smaller since the stream frame would need to be grown. | 638 // be two bytes smaller since the stream frame would need to be grown. |
885 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame()); | 639 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame()); |
886 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; | 640 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; |
887 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; | 641 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
888 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 642 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
889 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 643 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
890 creator_.Flush(); | 644 creator_.Flush(); |
891 ASSERT_TRUE(serialized_packet_.encrypted_buffer); | 645 ASSERT_TRUE(serialized_packet_.encrypted_buffer); |
892 DeleteSerializedPacket(); | 646 DeleteSerializedPacket(); |
893 } | 647 } |
894 } | 648 } |
895 | 649 |
896 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { | |
897 // Send FEC packet every 6 packets. | |
898 creator_.set_max_packets_per_fec_group(6); | |
899 // Turn on FEC protection. | |
900 QuicFrame frame; | |
901 QuicIOVector io_vector(MakeIOVector("test")); | |
902 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | |
903 MUST_FEC_PROTECT)); | |
904 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
905 | |
906 // Serialize the packet. | |
907 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
908 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | |
909 creator_.Flush(); | |
910 // Compute the total overhead for a single frame in packet. | |
911 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) + | |
912 GetEncryptionOverhead() + | |
913 GetStreamFrameOverhead(IN_FEC_GROUP); | |
914 size_t capacity = kDefaultMaxPacketSize - overhead; | |
915 // Now, test various sizes around this size. | |
916 for (int delta = -5; delta <= 5; ++delta) { | |
917 string data(capacity + delta, 'A'); | |
918 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | |
919 QuicFrame frame; | |
920 QuicIOVector io_vector(MakeIOVector(data)); | |
921 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, | |
922 kOffset, false, false, &frame, | |
923 MUST_FEC_PROTECT)); | |
924 ASSERT_TRUE(frame.stream_frame); | |
925 // BytesFree() returns bytes available for the next frame. Since stream | |
926 // frame does not grow for FEC protected packets, this should be the same | |
927 // as bytes_free (bound by 0). | |
928 EXPECT_EQ(0u, creator_.ExpansionOnNewFrame()); | |
929 size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0; | |
930 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; | |
931 { | |
932 InSequence s; | |
933 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
934 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | |
935 // Every 6th packet will generate an extra FEC packet. | |
936 if (delta == -1 || delta == 5) { | |
937 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
938 .WillOnce( | |
939 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | |
940 } | |
941 } | |
942 creator_.Flush(); | |
943 ASSERT_TRUE(serialized_packet_.encrypted_buffer); | |
944 DeleteSerializedPacket(); | |
945 } | |
946 } | |
947 | |
948 TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) { | 650 TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) { |
949 // Compute the total overhead for a single frame in packet. | 651 // Compute the total overhead for a single frame in packet. |
950 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + | 652 const size_t overhead = GetPacketHeaderOverhead() + GetEncryptionOverhead() + |
951 GetEncryptionOverhead() + | 653 GetStreamFrameOverhead(); |
952 GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | |
953 ASSERT_GT(kMaxPacketSize, overhead); | 654 ASSERT_GT(kMaxPacketSize, overhead); |
954 size_t capacity = kDefaultMaxPacketSize - overhead; | 655 size_t capacity = kDefaultMaxPacketSize - overhead; |
955 // Now, test various sizes around this size. | 656 // Now, test various sizes around this size. |
956 for (int delta = -5; delta <= 5; ++delta) { | 657 for (int delta = -5; delta <= 5; ++delta) { |
957 string data(capacity + delta, 'A'); | 658 string data(capacity + delta, 'A'); |
958 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 659 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
959 | 660 |
960 QuicFrame frame; | 661 QuicFrame frame; |
961 QuicIOVector io_vector(MakeIOVector(data)); | 662 QuicIOVector io_vector(MakeIOVector(data)); |
962 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 663 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
963 .WillRepeatedly( | 664 .WillRepeatedly( |
964 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 665 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
965 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, kOffset, | 666 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, kOffset, |
966 false, true, &frame, MAY_FEC_PROTECT)); | 667 false, true, &frame)); |
967 ASSERT_TRUE(frame.stream_frame); | 668 ASSERT_TRUE(frame.stream_frame); |
968 size_t bytes_consumed = frame.stream_frame->frame_length; | 669 size_t bytes_consumed = frame.stream_frame->frame_length; |
969 EXPECT_LT(0u, bytes_consumed); | 670 EXPECT_LT(0u, bytes_consumed); |
970 creator_.Flush(); | 671 creator_.Flush(); |
971 ASSERT_TRUE(serialized_packet_.encrypted_buffer); | 672 ASSERT_TRUE(serialized_packet_.encrypted_buffer); |
972 // If there is not enough space in the packet to fit a padding frame | 673 // If there is not enough space in the packet to fit a padding frame |
973 // (1 byte) and to expand the stream frame (another 2 bytes) the packet | 674 // (1 byte) and to expand the stream frame (another 2 bytes) the packet |
974 // will not be padded. | 675 // will not be padded. |
975 if (bytes_free < 3) { | 676 if (bytes_free < 3) { |
976 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free, | 677 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free, |
977 serialized_packet_.encrypted_length); | 678 serialized_packet_.encrypted_length); |
978 } else { | 679 } else { |
979 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length); | 680 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length); |
980 } | 681 } |
981 DeleteSerializedPacket(); | 682 DeleteSerializedPacket(); |
982 } | 683 } |
983 } | 684 } |
984 | 685 |
985 TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) { | 686 TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) { |
986 // Compute the total overhead for a single frame in packet. | 687 // Compute the total overhead for a single frame in packet. |
987 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) + | 688 const size_t overhead = GetPacketHeaderOverhead() + GetEncryptionOverhead() + |
988 GetEncryptionOverhead() + | 689 GetStreamFrameOverhead(); |
989 GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | |
990 ASSERT_GT(kDefaultMaxPacketSize, overhead); | 690 ASSERT_GT(kDefaultMaxPacketSize, overhead); |
991 size_t capacity = kDefaultMaxPacketSize - overhead; | 691 size_t capacity = kDefaultMaxPacketSize - overhead; |
992 // Now, test various sizes around this size. | 692 // Now, test various sizes around this size. |
993 for (int delta = -5; delta <= 5; ++delta) { | 693 for (int delta = -5; delta <= 5; ++delta) { |
994 string data(capacity + delta, 'A'); | 694 string data(capacity + delta, 'A'); |
995 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 695 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
996 | 696 |
997 QuicFrame frame; | 697 QuicFrame frame; |
998 QuicIOVector io_vector(MakeIOVector(data)); | 698 QuicIOVector io_vector(MakeIOVector(data)); |
999 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 699 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1000 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 700 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
1001 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, | 701 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, |
1002 kOffset, false, false, &frame, | 702 kOffset, false, false, &frame)); |
1003 MAY_FEC_PROTECT)); | |
1004 ASSERT_TRUE(frame.stream_frame); | 703 ASSERT_TRUE(frame.stream_frame); |
1005 size_t bytes_consumed = frame.stream_frame->frame_length; | 704 size_t bytes_consumed = frame.stream_frame->frame_length; |
1006 EXPECT_LT(0u, bytes_consumed); | 705 EXPECT_LT(0u, bytes_consumed); |
1007 creator_.Flush(); | 706 creator_.Flush(); |
1008 ASSERT_TRUE(serialized_packet_.encrypted_buffer); | 707 ASSERT_TRUE(serialized_packet_.encrypted_buffer); |
1009 if (bytes_free > 0) { | 708 if (bytes_free > 0) { |
1010 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free, | 709 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free, |
1011 serialized_packet_.encrypted_length); | 710 serialized_packet_.encrypted_length); |
1012 } else { | 711 } else { |
1013 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length); | 712 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.encrypted_length); |
(...skipping 16 matching lines...) Expand all Loading... |
1030 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_)); | 729 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_)); |
1031 } | 730 } |
1032 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_CLIENT); | 731 QuicFramerPeer::SetPerspective(&client_framer_, Perspective::IS_CLIENT); |
1033 client_framer_.ProcessPacket(*encrypted); | 732 client_framer_.ProcessPacket(*encrypted); |
1034 } | 733 } |
1035 | 734 |
1036 TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) { | 735 TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) { |
1037 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 736 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1038 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 737 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1039 | 738 |
1040 size_t max_packets_per_fec_group = 10; | 739 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64); |
1041 creator_.set_max_packets_per_fec_group(max_packets_per_fec_group); | |
1042 QuicPacketCreatorPeer::SetPacketNumber(&creator_, | |
1043 64 - max_packets_per_fec_group); | |
1044 creator_.UpdatePacketNumberLength(2, 10000 / kDefaultMaxPacketSize); | 740 creator_.UpdatePacketNumberLength(2, 10000 / kDefaultMaxPacketSize); |
1045 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 741 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1046 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 742 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1047 | 743 |
1048 QuicPacketCreatorPeer::SetPacketNumber(&creator_, | 744 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256); |
1049 64 * 256 - max_packets_per_fec_group); | |
1050 creator_.UpdatePacketNumberLength(2, 10000 / kDefaultMaxPacketSize); | 745 creator_.UpdatePacketNumberLength(2, 10000 / kDefaultMaxPacketSize); |
1051 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, | 746 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, |
1052 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 747 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1053 | 748 |
1054 QuicPacketCreatorPeer::SetPacketNumber( | 749 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 * 256); |
1055 &creator_, 64 * 256 * 256 - max_packets_per_fec_group); | |
1056 creator_.UpdatePacketNumberLength(2, 10000 / kDefaultMaxPacketSize); | 750 creator_.UpdatePacketNumberLength(2, 10000 / kDefaultMaxPacketSize); |
1057 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, | 751 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, |
1058 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 752 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1059 | 753 |
1060 QuicPacketCreatorPeer::SetPacketNumber( | 754 QuicPacketCreatorPeer::SetPacketNumber(&creator_, |
1061 &creator_, | 755 UINT64_C(64) * 256 * 256 * 256 * 256); |
1062 UINT64_C(64) * 256 * 256 * 256 * 256 - max_packets_per_fec_group); | |
1063 creator_.UpdatePacketNumberLength(2, 10000 / kDefaultMaxPacketSize); | 756 creator_.UpdatePacketNumberLength(2, 10000 / kDefaultMaxPacketSize); |
1064 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER, | 757 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER, |
1065 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 758 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1066 } | 759 } |
1067 | 760 |
1068 TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthBandwidth) { | 761 TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthBandwidth) { |
1069 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 762 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1070 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 763 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1071 | 764 |
1072 creator_.UpdatePacketNumberLength(1, 10000 / kDefaultMaxPacketSize); | 765 creator_.UpdatePacketNumberLength(1, 10000 / kDefaultMaxPacketSize); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1124 client_framer_.version(), | 817 client_framer_.version(), |
1125 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 818 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
1126 QuicPacketCreatorPeer::SendPathIdInPacket(&creator_), | 819 QuicPacketCreatorPeer::SendPathIdInPacket(&creator_), |
1127 creator_.connection_id_length(), PACKET_1BYTE_PACKET_NUMBER, | 820 creator_.connection_id_length(), PACKET_1BYTE_PACKET_NUMBER, |
1128 NOT_IN_FEC_GROUP, &payload_length)); | 821 NOT_IN_FEC_GROUP, &payload_length)); |
1129 QuicFrame frame; | 822 QuicFrame frame; |
1130 const string too_long_payload(payload_length * 2, 'a'); | 823 const string too_long_payload(payload_length * 2, 'a'); |
1131 QuicIOVector io_vector(MakeIOVector(too_long_payload)); | 824 QuicIOVector io_vector(MakeIOVector(too_long_payload)); |
1132 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 825 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1133 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 826 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
1134 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame, | 827 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame)); |
1135 MAY_FEC_PROTECT)); | |
1136 ASSERT_TRUE(frame.stream_frame); | 828 ASSERT_TRUE(frame.stream_frame); |
1137 size_t consumed = frame.stream_frame->frame_length; | 829 size_t consumed = frame.stream_frame->frame_length; |
1138 EXPECT_EQ(payload_length, consumed); | 830 EXPECT_EQ(payload_length, consumed); |
1139 const string payload(payload_length, 'a'); | 831 const string payload(payload_length, 'a'); |
1140 CheckStreamFrame(frame, 1u, payload, 0u, false); | 832 CheckStreamFrame(frame, 1u, payload, 0u, false); |
1141 creator_.Flush(); | 833 creator_.Flush(); |
1142 DeleteSerializedPacket(); | 834 DeleteSerializedPacket(); |
1143 } | 835 } |
1144 | 836 |
1145 TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) { | 837 TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) { |
(...skipping 11 matching lines...) Expand all Loading... |
1157 PACKET_1BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP), | 849 PACKET_1BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP), |
1158 creator_.BytesFree()); | 850 creator_.BytesFree()); |
1159 | 851 |
1160 // Add a variety of frame types and then a padding frame. | 852 // Add a variety of frame types and then a padding frame. |
1161 QuicAckFrame ack_frame(MakeAckFrame(0u)); | 853 QuicAckFrame ack_frame(MakeAckFrame(0u)); |
1162 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); | 854 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
1163 EXPECT_TRUE(creator_.HasPendingFrames()); | 855 EXPECT_TRUE(creator_.HasPendingFrames()); |
1164 | 856 |
1165 QuicFrame frame; | 857 QuicFrame frame; |
1166 QuicIOVector io_vector(MakeIOVector("test")); | 858 QuicIOVector io_vector(MakeIOVector("test")); |
1167 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | 859 ASSERT_TRUE( |
1168 MAY_FEC_PROTECT)); | 860 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); |
1169 ASSERT_TRUE(frame.stream_frame); | 861 ASSERT_TRUE(frame.stream_frame); |
1170 size_t consumed = frame.stream_frame->frame_length; | 862 size_t consumed = frame.stream_frame->frame_length; |
1171 EXPECT_EQ(4u, consumed); | 863 EXPECT_EQ(4u, consumed); |
1172 EXPECT_TRUE(creator_.HasPendingFrames()); | 864 EXPECT_TRUE(creator_.HasPendingFrames()); |
1173 | 865 |
1174 QuicPaddingFrame padding_frame; | 866 QuicPaddingFrame padding_frame; |
1175 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(padding_frame))); | 867 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(padding_frame))); |
1176 EXPECT_TRUE(creator_.HasPendingFrames()); | 868 EXPECT_TRUE(creator_.HasPendingFrames()); |
1177 EXPECT_EQ(0u, creator_.BytesFree()); | 869 EXPECT_EQ(0u, creator_.BytesFree()); |
1178 | 870 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1217 | 909 |
1218 // Add ack frame to creator. | 910 // Add ack frame to creator. |
1219 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); | 911 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
1220 EXPECT_TRUE(creator_.HasPendingFrames()); | 912 EXPECT_TRUE(creator_.HasPendingFrames()); |
1221 EXPECT_GT(creator_.max_packet_length(), creator_.PacketSize()); | 913 EXPECT_GT(creator_.max_packet_length(), creator_.PacketSize()); |
1222 EXPECT_LT(0u, creator_.BytesFree()); | 914 EXPECT_LT(0u, creator_.BytesFree()); |
1223 | 915 |
1224 // Make sure that an additional stream frame can be added to the packet. | 916 // Make sure that an additional stream frame can be added to the packet. |
1225 QuicFrame frame; | 917 QuicFrame frame; |
1226 QuicIOVector io_vector(MakeIOVector("test")); | 918 QuicIOVector io_vector(MakeIOVector("test")); |
1227 ASSERT_TRUE(creator_.ConsumeData(2u, io_vector, 0u, 0u, false, false, &frame, | 919 ASSERT_TRUE( |
1228 MAY_FEC_PROTECT)); | 920 creator_.ConsumeData(2u, io_vector, 0u, 0u, false, false, &frame)); |
1229 ASSERT_TRUE(frame.stream_frame); | 921 ASSERT_TRUE(frame.stream_frame); |
1230 size_t consumed = frame.stream_frame->frame_length; | 922 size_t consumed = frame.stream_frame->frame_length; |
1231 EXPECT_EQ(4u, consumed); | 923 EXPECT_EQ(4u, consumed); |
1232 EXPECT_TRUE(creator_.HasPendingFrames()); | 924 EXPECT_TRUE(creator_.HasPendingFrames()); |
1233 | 925 |
1234 // Ensure the packet is successfully created, and the packet size estimate | 926 // Ensure the packet is successfully created, and the packet size estimate |
1235 // matches the serialized packet length. | 927 // matches the serialized packet length. |
1236 EXPECT_CALL(entropy_calculator_, EntropyHash(_)).WillOnce(testing::Return(0)); | 928 EXPECT_CALL(entropy_calculator_, EntropyHash(_)).WillOnce(testing::Return(0)); |
1237 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 929 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1238 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 930 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1298 EXPECT_EQ(expected_rand_bool, observed_rand_bool); | 990 EXPECT_EQ(expected_rand_bool, observed_rand_bool); |
1299 EXPECT_EQ(0, rest_of_hash); | 991 EXPECT_EQ(0, rest_of_hash); |
1300 } | 992 } |
1301 // After 64 calls, BoolSource will refresh the bucket - make sure it does. | 993 // After 64 calls, BoolSource will refresh the bucket - make sure it does. |
1302 mock_random_.ChangeValue(); | 994 mock_random_.ChangeValue(); |
1303 } | 995 } |
1304 | 996 |
1305 delete frames_[0].stream_frame; | 997 delete frames_[0].stream_frame; |
1306 } | 998 } |
1307 | 999 |
1308 TEST_P(QuicPacketCreatorTest, ResetFecGroup) { | |
1309 // Send FEC packet every 6 packets. | |
1310 creator_.set_max_packets_per_fec_group(6); | |
1311 // Add a stream frame and turn on FEC protection. | |
1312 QuicFrame frame; | |
1313 QuicIOVector io_vector(MakeIOVector("test")); | |
1314 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | |
1315 MUST_FEC_PROTECT)); | |
1316 // Serialize the packet. | |
1317 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1318 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | |
1319 creator_.Flush(); | |
1320 | |
1321 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
1322 EXPECT_TRUE(creator_.IsFecGroupOpen()); | |
1323 // We do not have enough packets in the FEC group to trigger an FEC packet. | |
1324 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | |
1325 // Should return true since there are packets in the FEC group. | |
1326 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); | |
1327 | |
1328 // FEC group will be reset if FEC police is alarm trigger but FEC alarm does | |
1329 // not fire. | |
1330 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
1331 creator_.set_fec_send_policy(FEC_ALARM_TRIGGER); | |
1332 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, | |
1333 /*is_fec_timeout=*/false); | |
1334 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
1335 EXPECT_FALSE(creator_.IsFecGroupOpen()); | |
1336 // We do not have enough packets in the FEC group to trigger an FEC packet. | |
1337 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | |
1338 // Confirm that there is no FEC packet under construction. | |
1339 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/true)); | |
1340 | |
1341 char buffer[kMaxPacketSize]; | |
1342 EXPECT_DFATAL( | |
1343 QuicPacketCreatorPeer::SerializeFec(&creator_, buffer, kMaxPacketSize), | |
1344 "SerializeFEC called but no group or zero packets in group."); | |
1345 | |
1346 // Create and send a new FEC protected packet. | |
1347 ASSERT_TRUE(creator_.ConsumeData(2u, io_vector, 0u, 0u, false, false, &frame, | |
1348 MUST_FEC_PROTECT)); | |
1349 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1350 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | |
1351 creator_.Flush(); | |
1352 | |
1353 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
1354 EXPECT_TRUE(creator_.IsFecGroupOpen()); | |
1355 // We do not have enough packets in the FEC group to trigger an FEC packet. | |
1356 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | |
1357 // Should return true since there are packets in the FEC group. | |
1358 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); | |
1359 | |
1360 // Should return false since we do not have enough packets in the FEC group to | |
1361 // trigger an FEC packet. | |
1362 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); | |
1363 // Should return true since there are packets in the FEC group. | |
1364 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); | |
1365 | |
1366 // Change FEC policy, send FEC packet and close FEC group. | |
1367 creator_.set_fec_send_policy(FEC_ANY_TRIGGER); | |
1368 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1369 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | |
1370 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, | |
1371 /*is_fec_timeout=*/false); | |
1372 ASSERT_EQ(3u, serialized_packet_.packet_number); | |
1373 DeleteSerializedPacket(); | |
1374 } | |
1375 | |
1376 TEST_P(QuicPacketCreatorTest, ResetFecGroupWithQueuedFrames) { | |
1377 // Send FEC packet every 6 packets. | |
1378 creator_.set_max_packets_per_fec_group(6); | |
1379 // Add a stream frame to the creator and turn on FEC protection. | |
1380 QuicFrame frame; | |
1381 QuicIOVector io_vector(MakeIOVector("test")); | |
1382 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | |
1383 MUST_FEC_PROTECT)); | |
1384 ASSERT_TRUE(frame.stream_frame); | |
1385 size_t consumed = frame.stream_frame->frame_length; | |
1386 EXPECT_EQ(4u, consumed); | |
1387 EXPECT_TRUE(creator_.HasPendingFrames()); | |
1388 EXPECT_DFATAL(QuicPacketCreatorPeer::ResetFecGroup(&creator_), | |
1389 "Cannot reset FEC group with pending frames."); | |
1390 | |
1391 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1392 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | |
1393 creator_.Flush(); | |
1394 EXPECT_FALSE(creator_.HasPendingFrames()); | |
1395 | |
1396 // FEC group will be reset if FEC police is alarm trigger but FEC alarm does | |
1397 // not fire. | |
1398 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); | |
1399 creator_.set_fec_send_policy(FEC_ALARM_TRIGGER); | |
1400 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, | |
1401 /*is_fec_timeout=*/false); | |
1402 EXPECT_FALSE(creator_.IsFecGroupOpen()); | |
1403 } | |
1404 | |
1405 TEST_P(QuicPacketCreatorTest, SetCurrentPath) { | 1000 TEST_P(QuicPacketCreatorTest, SetCurrentPath) { |
1406 // Current path is the default path. | 1001 // Current path is the default path. |
1407 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | 1002 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); |
1408 EXPECT_EQ(0u, creator_.packet_number()); | 1003 EXPECT_EQ(0u, creator_.packet_number()); |
1409 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1004 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1410 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 1005 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1411 // Add a stream frame to the creator. | 1006 // Add a stream frame to the creator. |
1412 QuicFrame frame; | 1007 QuicFrame frame; |
1413 QuicIOVector io_vector(MakeIOVector("test")); | 1008 QuicIOVector io_vector(MakeIOVector("test")); |
1414 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | 1009 ASSERT_TRUE( |
1415 MAY_FEC_PROTECT)); | 1010 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); |
1416 ASSERT_TRUE(frame.stream_frame); | 1011 ASSERT_TRUE(frame.stream_frame); |
1417 size_t consumed = frame.stream_frame->frame_length; | 1012 size_t consumed = frame.stream_frame->frame_length; |
1418 EXPECT_EQ(4u, consumed); | 1013 EXPECT_EQ(4u, consumed); |
1419 EXPECT_TRUE(creator_.HasPendingFrames()); | 1014 EXPECT_TRUE(creator_.HasPendingFrames()); |
1420 EXPECT_EQ(0u, creator_.packet_number()); | 1015 EXPECT_EQ(0u, creator_.packet_number()); |
1421 | 1016 |
1422 // Change current path. | 1017 // Change current path. |
1423 QuicPathId kPathId1 = 1; | 1018 QuicPathId kPathId1 = 1; |
1424 EXPECT_DFATAL(creator_.SetCurrentPath(kPathId1, 1, 0), | 1019 EXPECT_DFATAL(creator_.SetCurrentPath(kPathId1, 1, 0), |
1425 "Unable to change paths when a packet is under construction"); | 1020 "Unable to change paths when a packet is under construction"); |
(...skipping 10 matching lines...) Expand all Loading... |
1436 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1031 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1437 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 1032 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1438 | 1033 |
1439 // Change current path back. | 1034 // Change current path back. |
1440 creator_.SetCurrentPath(kDefaultPathId, 2, 1); | 1035 creator_.SetCurrentPath(kDefaultPathId, 2, 1); |
1441 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | 1036 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); |
1442 EXPECT_EQ(1u, creator_.packet_number()); | 1037 EXPECT_EQ(1u, creator_.packet_number()); |
1443 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1038 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1444 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 1039 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1445 // Add a stream frame to the creator. | 1040 // Add a stream frame to the creator. |
1446 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | 1041 ASSERT_TRUE( |
1447 MAY_FEC_PROTECT)); | 1042 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); |
1448 ASSERT_TRUE(frame.stream_frame); | 1043 ASSERT_TRUE(frame.stream_frame); |
1449 consumed = frame.stream_frame->frame_length; | 1044 consumed = frame.stream_frame->frame_length; |
1450 EXPECT_EQ(4u, consumed); | 1045 EXPECT_EQ(4u, consumed); |
1451 EXPECT_TRUE(creator_.HasPendingFrames()); | 1046 EXPECT_TRUE(creator_.HasPendingFrames()); |
1452 | 1047 |
1453 // Does not change current path. | 1048 // Does not change current path. |
1454 creator_.SetCurrentPath(kDefaultPathId, 2, 0); | 1049 creator_.SetCurrentPath(kDefaultPathId, 2, 0); |
1455 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | 1050 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); |
1456 EXPECT_TRUE(creator_.HasPendingFrames()); | 1051 EXPECT_TRUE(creator_.HasPendingFrames()); |
1457 EXPECT_EQ(1u, creator_.packet_number()); | 1052 EXPECT_EQ(1u, creator_.packet_number()); |
1458 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1053 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1459 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 1054 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1460 } | 1055 } |
1461 | 1056 |
1462 TEST_P(QuicPacketCreatorTest, SetCurrentPathWithFec) { | |
1463 // Send FEC packet every 6 packets. | |
1464 creator_.set_max_packets_per_fec_group(6); | |
1465 // Current path is the default path. | |
1466 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | |
1467 EXPECT_EQ(0u, creator_.packet_number()); | |
1468 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | |
1469 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | |
1470 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
1471 // Add a stream frame to the creator. | |
1472 QuicFrame frame; | |
1473 QuicIOVector io_vector(MakeIOVector("test")); | |
1474 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | |
1475 MUST_FEC_PROTECT)); | |
1476 ASSERT_TRUE(frame.stream_frame); | |
1477 size_t consumed = frame.stream_frame->frame_length; | |
1478 EXPECT_EQ(4u, consumed); | |
1479 EXPECT_TRUE(creator_.HasPendingFrames()); | |
1480 EXPECT_EQ(0u, creator_.packet_number()); | |
1481 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | |
1482 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | |
1483 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
1484 | |
1485 // Change current path. | |
1486 QuicPathId kPathId1 = 1; | |
1487 EXPECT_DFATAL(creator_.SetCurrentPath(kPathId1, 1, 0), | |
1488 "Unable to change paths when a packet is under construction"); | |
1489 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1490 .Times(2) | |
1491 .WillRepeatedly( | |
1492 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | |
1493 creator_.Flush(); | |
1494 EXPECT_FALSE(creator_.HasPendingFrames()); | |
1495 creator_.SetCurrentPath(kPathId1, 1, 0); | |
1496 EXPECT_EQ(kPathId1, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | |
1497 EXPECT_FALSE(creator_.HasPendingFrames()); | |
1498 EXPECT_EQ(0u, creator_.packet_number()); | |
1499 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | |
1500 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | |
1501 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
1502 | |
1503 // Change current path back. | |
1504 creator_.SetCurrentPath(kDefaultPathId, 3, 2); | |
1505 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | |
1506 // FEC packet consumes a packet number. | |
1507 EXPECT_EQ(2u, creator_.packet_number()); | |
1508 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | |
1509 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | |
1510 // Add a stream frame to the creator. | |
1511 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | |
1512 MUST_FEC_PROTECT)); | |
1513 ASSERT_TRUE(frame.stream_frame); | |
1514 consumed = frame.stream_frame->frame_length; | |
1515 EXPECT_EQ(4u, consumed); | |
1516 EXPECT_TRUE(creator_.HasPendingFrames()); | |
1517 | |
1518 // Does not change current path. | |
1519 creator_.SetCurrentPath(kDefaultPathId, 3, 0); | |
1520 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | |
1521 EXPECT_TRUE(creator_.HasPendingFrames()); | |
1522 // FEC packet consumes a packet number. | |
1523 EXPECT_EQ(2u, creator_.packet_number()); | |
1524 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | |
1525 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | |
1526 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
1527 } | |
1528 | |
1529 TEST_P(QuicPacketCreatorTest, | 1057 TEST_P(QuicPacketCreatorTest, |
1530 SetCurrentPathWithFecAndUpdatePacketSequenceNumberLength) { | 1058 SetCurrentPathAndUpdatePacketSequenceNumberLength) { |
1531 // Send FEC packet every 10 packets. | |
1532 size_t max_packets_per_fec_group = 10; | |
1533 creator_.set_max_packets_per_fec_group(max_packets_per_fec_group); | |
1534 // Current path is the default path. | 1059 // Current path is the default path. |
1535 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | 1060 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); |
1536 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1061 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1537 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 1062 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1538 QuicPacketCreatorPeer::SetPacketNumber( | 1063 QuicPacketCreatorPeer::SetPacketNumber(&creator_, 64 * 256 - 2); |
1539 &creator_, 64 * 256 - max_packets_per_fec_group - 2); | |
1540 // Add a stream frame to the creator and send the packet. | 1064 // Add a stream frame to the creator and send the packet. |
1541 QuicFrame frame; | 1065 QuicFrame frame; |
1542 QuicIOVector io_vector(MakeIOVector("test")); | 1066 QuicIOVector io_vector(MakeIOVector("test")); |
1543 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | 1067 ASSERT_TRUE( |
1544 MUST_FEC_PROTECT)); | 1068 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); |
1545 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 1069 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1546 .Times(2) | 1070 .Times(1) |
1547 .WillRepeatedly( | 1071 .WillRepeatedly( |
1548 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | 1072 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); |
1549 creator_.Flush(); | 1073 creator_.Flush(); |
1550 EXPECT_EQ(64 * 256 - max_packets_per_fec_group - 1, creator_.packet_number()); | 1074 EXPECT_EQ(UINT64_C(64 * 256 - 1), creator_.packet_number()); |
1551 creator_.UpdatePacketNumberLength(2, 10000 / kDefaultMaxPacketSize); | 1075 creator_.UpdatePacketNumberLength(2, 10000 / kDefaultMaxPacketSize); |
1552 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, | 1076 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, |
1553 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 1077 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1554 | 1078 |
1555 // Change current path. | 1079 // Change current path. |
1556 QuicPathId kPathId1 = 1; | 1080 QuicPathId kPathId1 = 1; |
1557 creator_.SetCurrentPath(kPathId1, 1, 0); | 1081 creator_.SetCurrentPath(kPathId1, 1, 0); |
1558 EXPECT_EQ(0u, creator_.packet_number()); | 1082 EXPECT_EQ(0u, creator_.packet_number()); |
1559 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1083 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1560 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 1084 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1561 | 1085 |
1562 // Change current path back. | 1086 // Change current path back. |
1563 creator_.SetCurrentPath(kDefaultPathId, 2, 10000 / kDefaultMaxPacketSize); | 1087 creator_.SetCurrentPath(kDefaultPathId, 2, 10000 / kDefaultMaxPacketSize); |
1564 // FEC packet consumes a packet number. | 1088 EXPECT_EQ(UINT64_C(64 * 256 - 1), creator_.packet_number()); |
1565 EXPECT_EQ(64 * 256 - max_packets_per_fec_group, creator_.packet_number()); | |
1566 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, | 1089 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, |
1567 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 1090 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1568 } | 1091 } |
1569 | 1092 |
1570 TEST_P(QuicPacketCreatorTest, SerializePacketOnDifferentPath) { | 1093 TEST_P(QuicPacketCreatorTest, SerializePacketOnDifferentPath) { |
1571 // Current path is the default path. | 1094 // Current path is the default path. |
1572 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | 1095 EXPECT_EQ(kDefaultPathId, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); |
1573 EXPECT_EQ(0u, creator_.packet_number()); | 1096 EXPECT_EQ(0u, creator_.packet_number()); |
1574 // Add a stream frame to the creator and flush the packet. | 1097 // Add a stream frame to the creator and flush the packet. |
1575 QuicFrame frame; | 1098 QuicFrame frame; |
1576 QuicIOVector io_vector(MakeIOVector("test")); | 1099 QuicIOVector io_vector(MakeIOVector("test")); |
1577 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | 1100 ASSERT_TRUE( |
1578 MAY_FEC_PROTECT)); | 1101 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); |
1579 ASSERT_TRUE(frame.stream_frame); | 1102 ASSERT_TRUE(frame.stream_frame); |
1580 size_t consumed = frame.stream_frame->frame_length; | 1103 size_t consumed = frame.stream_frame->frame_length; |
1581 EXPECT_EQ(4u, consumed); | 1104 EXPECT_EQ(4u, consumed); |
1582 EXPECT_TRUE(creator_.HasPendingFrames()); | 1105 EXPECT_TRUE(creator_.HasPendingFrames()); |
1583 EXPECT_EQ(0u, creator_.packet_number()); | 1106 EXPECT_EQ(0u, creator_.packet_number()); |
1584 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 1107 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
1585 .WillRepeatedly( | 1108 .WillRepeatedly( |
1586 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); | 1109 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); |
1587 creator_.Flush(); | 1110 creator_.Flush(); |
1588 EXPECT_FALSE(creator_.HasPendingFrames()); | 1111 EXPECT_FALSE(creator_.HasPendingFrames()); |
1589 EXPECT_EQ(1u, creator_.packet_number()); | 1112 EXPECT_EQ(1u, creator_.packet_number()); |
1590 // Verify serialized data packet's path id. | 1113 // Verify serialized data packet's path id. |
1591 EXPECT_EQ(kDefaultPathId, serialized_packet_.path_id); | 1114 EXPECT_EQ(kDefaultPathId, serialized_packet_.path_id); |
1592 DeleteSerializedPacket(); | 1115 DeleteSerializedPacket(); |
1593 | 1116 |
1594 // Change to path 1. | 1117 // Change to path 1. |
1595 QuicPathId kPathId1 = 1; | 1118 QuicPathId kPathId1 = 1; |
1596 creator_.SetCurrentPath(kPathId1, 1, 0); | 1119 creator_.SetCurrentPath(kPathId1, 1, 0); |
1597 EXPECT_EQ(kPathId1, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); | 1120 EXPECT_EQ(kPathId1, QuicPacketCreatorPeer::GetCurrentPath(&creator_)); |
1598 EXPECT_FALSE(creator_.HasPendingFrames()); | 1121 EXPECT_FALSE(creator_.HasPendingFrames()); |
1599 EXPECT_EQ(0u, creator_.packet_number()); | 1122 EXPECT_EQ(0u, creator_.packet_number()); |
1600 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1123 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
1601 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); | 1124 QuicPacketCreatorPeer::NextPacketNumberLength(&creator_)); |
1602 | 1125 |
1603 // Add a stream frame to the creator and flush the packet. | 1126 // Add a stream frame to the creator and flush the packet. |
1604 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame, | 1127 ASSERT_TRUE( |
1605 MAY_FEC_PROTECT)); | 1128 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); |
1606 ASSERT_TRUE(frame.stream_frame); | 1129 ASSERT_TRUE(frame.stream_frame); |
1607 consumed = frame.stream_frame->frame_length; | 1130 consumed = frame.stream_frame->frame_length; |
1608 EXPECT_EQ(4u, consumed); | 1131 EXPECT_EQ(4u, consumed); |
1609 EXPECT_TRUE(creator_.HasPendingFrames()); | 1132 EXPECT_TRUE(creator_.HasPendingFrames()); |
1610 creator_.Flush(); | 1133 creator_.Flush(); |
1611 // Verify serialized data packet's path id. | 1134 // Verify serialized data packet's path id. |
1612 EXPECT_EQ(kPathId1, serialized_packet_.path_id); | 1135 EXPECT_EQ(kPathId1, serialized_packet_.path_id); |
1613 DeleteSerializedPacket(); | 1136 DeleteSerializedPacket(); |
1614 } | 1137 } |
1615 | 1138 |
1616 TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) { | 1139 TEST_P(QuicPacketCreatorTest, AddUnencryptedStreamDataClosesConnection) { |
1617 FLAGS_quic_never_write_unencrypted_data = true; | 1140 FLAGS_quic_never_write_unencrypted_data = true; |
1618 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _)); | 1141 EXPECT_CALL(delegate_, OnUnrecoverableError(_, _)); |
1619 QuicStreamFrame stream_frame(kHeadersStreamId, /*fin=*/false, 0u, | 1142 QuicStreamFrame stream_frame(kHeadersStreamId, /*fin=*/false, 0u, |
1620 StringPiece()); | 1143 StringPiece()); |
1621 EXPECT_DFATAL(creator_.AddSavedFrame(QuicFrame(&stream_frame)), | 1144 EXPECT_DFATAL(creator_.AddSavedFrame(QuicFrame(&stream_frame)), |
1622 "Cannot send stream data without encryption."); | 1145 "Cannot send stream data without encryption."); |
1623 } | 1146 } |
1624 | 1147 |
1625 TEST_P(QuicPacketCreatorTest, DontSendUnencryptedFec) { | |
1626 ValueRestore<bool> old_flag(&FLAGS_quic_no_unencrypted_fec, true); | |
1627 // Send FEC packet every 6 packets. | |
1628 creator_.set_max_packets_per_fec_group(6); | |
1629 // Send stream data encrypted with FEC protection. | |
1630 creator_.set_encryption_level(ENCRYPTION_INITIAL); | |
1631 // Turn on FEC protection. | |
1632 QuicFrame frame; | |
1633 QuicIOVector io_vector(MakeIOVector("test")); | |
1634 ASSERT_TRUE(creator_.ConsumeData(kHeadersStreamId, io_vector, 0u, 0u, false, | |
1635 false, &frame, MUST_FEC_PROTECT)); | |
1636 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
1637 // Serialize the packet. | |
1638 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1639 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | |
1640 creator_.Flush(); | |
1641 | |
1642 // The creator will clear the FEC group rather than try to send without | |
1643 // encryption. | |
1644 creator_.set_encryption_level(ENCRYPTION_NONE); | |
1645 EXPECT_CALL(delegate_, OnResetFecGroup()); | |
1646 creator_.MaybeSendFecPacketAndCloseGroup(true, false); | |
1647 } | |
1648 | |
1649 TEST_P(QuicPacketCreatorTest, SerializeUnencryptedFecClosesConnection) { | |
1650 ValueRestore<bool> old_flag(&FLAGS_quic_no_unencrypted_fec, true); | |
1651 // Send FEC packet every 6 packets. | |
1652 creator_.set_max_packets_per_fec_group(6); | |
1653 // Send stream data encrypted with FEC protection. | |
1654 creator_.set_encryption_level(ENCRYPTION_INITIAL); | |
1655 // Turn on FEC protection. | |
1656 QuicFrame frame; | |
1657 QuicIOVector io_vector(MakeIOVector("test")); | |
1658 ASSERT_TRUE(creator_.ConsumeData(kHeadersStreamId, io_vector, 0u, 0u, false, | |
1659 false, &frame, MUST_FEC_PROTECT)); | |
1660 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); | |
1661 // Serialize the packet. | |
1662 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | |
1663 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); | |
1664 creator_.Flush(); | |
1665 | |
1666 // Try to send an FEC packet unencrypted. | |
1667 creator_.set_encryption_level(ENCRYPTION_NONE); | |
1668 EXPECT_CALL(delegate_, OnUnrecoverableError(QUIC_UNENCRYPTED_FEC_DATA, _)); | |
1669 char seralized_fec_buffer[kMaxPacketSize]; | |
1670 EXPECT_DFATAL(QuicPacketCreatorPeer::SerializeFec( | |
1671 &creator_, seralized_fec_buffer, kMaxPacketSize), | |
1672 "SerializeFEC must be called with encryption."); | |
1673 } | |
1674 | |
1675 } // namespace | 1148 } // namespace |
1676 } // namespace test | 1149 } // namespace test |
1677 } // namespace net | 1150 } // namespace net |
OLD | NEW |