Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(296)

Side by Side Diff: net/quic/quic_packet_creator_test.cc

Issue 1784903003: Remove FEC from send path. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@114770052
Patch Set: Restore accidentally removed OnRttChanged call Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_packet_creator.cc ('k') | net/quic/quic_packet_generator.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_packet_creator.cc ('k') | net/quic/quic_packet_generator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698