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

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

Issue 1495263002: QuicPacketCreator knows when to start FEC protection. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@108738647
Patch Set: Created 5 years 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.cc » ('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/stl_util.h" 9 #include "base/stl_util.h"
10 #include "net/quic/crypto/null_encrypter.h" 10 #include "net/quic/crypto/null_encrypter.h"
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 creator_.max_packet_length()); 177 creator_.max_packet_length());
178 } 178 }
179 179
180 // Returns the number of bytes consumed by the non-data fields of a stream 180 // Returns the number of bytes consumed by the non-data fields of a stream
181 // frame, assuming it is the last frame in the packet 181 // frame, assuming it is the last frame in the packet
182 size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) { 182 size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) {
183 return QuicFramer::GetMinStreamFrameSize(kClientDataStreamId1, kOffset, 183 return QuicFramer::GetMinStreamFrameSize(kClientDataStreamId1, kOffset,
184 true, is_in_fec_group); 184 true, is_in_fec_group);
185 } 185 }
186 186
187 // Enables and turns on FEC protection. Returns true if FEC protection is on.
188 bool SwitchFecProtectionOn(size_t max_packets_per_fec_group) {
189 creator_.set_max_packets_per_fec_group(max_packets_per_fec_group);
190 creator_.MaybeStartFecProtection();
191 return QuicPacketCreatorPeer::IsFecProtected(&creator_);
192 }
193
194 QuicIOVector MakeIOVector(StringPiece s) { 187 QuicIOVector MakeIOVector(StringPiece s) {
195 return ::net::MakeIOVector(s, &iov_); 188 return ::net::MakeIOVector(s, &iov_);
196 } 189 }
197 190
198 static const QuicStreamOffset kOffset = 1u; 191 static const QuicStreamOffset kOffset = 1u;
199 192
200 char buffer_[kMaxPacketSize]; 193 char buffer_[kMaxPacketSize];
201 QuicFrames frames_; 194 QuicFrames frames_;
202 QuicFramer server_framer_; 195 QuicFramer server_framer_;
203 QuicFramer client_framer_; 196 QuicFramer client_framer_;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); 239 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
247 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); 240 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
248 EXPECT_CALL(framer_visitor_, OnPacketComplete()); 241 EXPECT_CALL(framer_visitor_, OnPacketComplete());
249 } 242 }
250 ProcessPacket(serialized.packet); 243 ProcessPacket(serialized.packet);
251 delete serialized.packet; 244 delete serialized.packet;
252 } 245 }
253 } 246 }
254 247
255 TEST_P(QuicPacketCreatorTest, SerializeWithFEC) { 248 TEST_P(QuicPacketCreatorTest, SerializeWithFEC) {
256 // Enable FEC protection, and send FEC packet every 6 packets. 249 // Send FEC packet every 6 packets.
257 EXPECT_TRUE(SwitchFecProtectionOn(6)); 250 creator_.set_max_packets_per_fec_group(6);
258 // Should return false since we do not have enough packets in the FEC group to 251 // Should return false since we do not have enough packets in the FEC group to
259 // trigger an FEC packet. 252 // trigger an FEC packet.
260 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); 253 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
261 254 // Turn on FEC protection.
262 frames_.push_back( 255 QuicFrame frame;
263 QuicFrame(new QuicStreamFrame(0u, false, 0u, StringPiece()))); 256 QuicIOVector io_vector(MakeIOVector("test"));
264 SerializedPacket serialized = SerializeAllFrames(frames_); 257 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame,
265 delete frames_[0].stream_frame; 258 MUST_FEC_PROTECT));
259 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
260 // Serialize the packet.
261 EXPECT_CALL(delegate_, OnSerializedPacket(_))
262 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
263 creator_.Flush();
266 264
267 { 265 {
268 InSequence s; 266 InSequence s;
269 EXPECT_CALL(framer_visitor_, OnPacket()); 267 EXPECT_CALL(framer_visitor_, OnPacket());
270 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); 268 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
271 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); 269 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
272 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); 270 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
273 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); 271 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
274 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); 272 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
275 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); 273 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
276 EXPECT_CALL(framer_visitor_, OnPacketComplete()); 274 EXPECT_CALL(framer_visitor_, OnPacketComplete());
277 } 275 }
278 ProcessPacket(serialized.packet); 276 ProcessPacket(serialized_packet_.packet);
279 delete serialized.packet; 277 ClearSerializedPacket(&serialized_packet_);
280 278
281 // Should return false since we do not have enough packets in the FEC group to 279 // Should return false since we do not have enough packets in the FEC group to
282 // trigger an FEC packet. 280 // trigger an FEC packet.
283 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); 281 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
284 // Should return true since there are packets in the FEC group. 282 // Should return true since there are packets in the FEC group.
285 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); 283 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
286 284
287 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 285 EXPECT_CALL(delegate_, OnSerializedPacket(_))
288 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); 286 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
289 creator_.set_should_fec_protect(true);
290 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, 287 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true,
291 /*is_fec_timeout=*/false); 288 /*is_fec_timeout=*/false);
292 ASSERT_EQ(2u, serialized_packet_.packet_number); 289 ASSERT_EQ(2u, serialized_packet_.packet_number);
293 { 290 {
294 InSequence s; 291 InSequence s;
295 EXPECT_CALL(framer_visitor_, OnPacket()); 292 EXPECT_CALL(framer_visitor_, OnPacket());
296 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); 293 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
297 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); 294 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
298 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); 295 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
299 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); 296 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 ClearSerializedPacket(&serialized_packet_); 430 ClearSerializedPacket(&serialized_packet_);
434 delete ack_frame.ack_frame; 431 delete ack_frame.ack_frame;
435 } 432 }
436 433
437 TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) { 434 TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
438 // Test goal is to test the following sequence (P1 => generate Packet 1): 435 // Test goal is to test the following sequence (P1 => generate Packet 1):
439 // P1 <change seq num length> P2 FEC, 436 // P1 <change seq num length> P2 FEC,
440 // and we expect that packet number length should not change until the end 437 // and we expect that packet number length should not change until the end
441 // of the open FEC group. 438 // of the open FEC group.
442 439
443 // Enable FEC protection, and send FEC packet every 6 packets. 440 // Send FEC packet every 6 packets.
444 EXPECT_TRUE(SwitchFecProtectionOn(6)); 441 creator_.set_max_packets_per_fec_group(6);
445 // Should return false since we do not have enough packets in the FEC group to 442 // Should return false since we do not have enough packets in the FEC group to
446 // trigger an FEC packet. 443 // trigger an FEC packet.
447 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); 444 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
448 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u))));
449 445
450 // Generate Packet 1. 446 // Generate Packet 1.
451 creator_.AddSavedFrame(frames_[0]); 447 QuicFrame frame;
448 QuicIOVector io_vector(MakeIOVector("test"));
449 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame,
450 MUST_FEC_PROTECT));
452 // Change the packet number length mid-FEC group and it should not change. 451 // Change the packet number length mid-FEC group and it should not change.
453 QuicPacketCreatorPeer::SetNextPacketNumberLength(&creator_, 452 QuicPacketCreatorPeer::SetNextPacketNumberLength(&creator_,
454 PACKET_4BYTE_PACKET_NUMBER); 453 PACKET_4BYTE_PACKET_NUMBER);
455 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 454 EXPECT_CALL(delegate_, OnSerializedPacket(_))
456 .WillRepeatedly( 455 .WillRepeatedly(
457 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); 456 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
458 creator_.Flush(); 457 creator_.Flush();
459 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, 458 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
460 serialized_packet_.packet_number_length); 459 serialized_packet_.packet_number_length);
461 460
462 { 461 {
463 InSequence s; 462 InSequence s;
464 EXPECT_CALL(framer_visitor_, OnPacket()); 463 EXPECT_CALL(framer_visitor_, OnPacket());
465 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); 464 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
466 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); 465 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
467 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); 466 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
468 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); 467 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
469 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); 468 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
470 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); 469 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
471 EXPECT_CALL(framer_visitor_, OnPacketComplete()); 470 EXPECT_CALL(framer_visitor_, OnPacketComplete());
472 } 471 }
473 ProcessPacket(serialized_packet_.packet); 472 ProcessPacket(serialized_packet_.packet);
474 ClearSerializedPacket(&serialized_packet_); 473 ClearSerializedPacket(&serialized_packet_);
475 474
476 // Generate Packet 2. 475 // Generate Packet 2.
477 creator_.AddSavedFrame(frames_[0]); 476 ASSERT_TRUE(creator_.ConsumeData(2u, io_vector, 0u, 0u, false, false, &frame,
477 MUST_FEC_PROTECT));
478 creator_.Flush(); 478 creator_.Flush();
479 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, 479 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
480 serialized_packet_.packet_number_length); 480 serialized_packet_.packet_number_length);
481 481
482 { 482 {
483 InSequence s; 483 InSequence s;
484 EXPECT_CALL(framer_visitor_, OnPacket()); 484 EXPECT_CALL(framer_visitor_, OnPacket());
485 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); 485 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
486 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); 486 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
487 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); 487 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
488 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); 488 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
489 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_)); 489 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
490 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); 490 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
491 EXPECT_CALL(framer_visitor_, OnPacketComplete()); 491 EXPECT_CALL(framer_visitor_, OnPacketComplete());
492 } 492 }
493 ProcessPacket(serialized_packet_.packet); 493 ProcessPacket(serialized_packet_.packet);
494 ClearSerializedPacket(&serialized_packet_); 494 ClearSerializedPacket(&serialized_packet_);
495 495
496 // Should return false since we do not have enough packets in the FEC group to 496 // Should return false since we do not have enough packets in the FEC group to
497 // trigger an FEC packet. 497 // trigger an FEC packet.
498 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); 498 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
499 // Should return true since there are packets in the FEC group. 499 // Should return true since there are packets in the FEC group.
500 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); 500 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
501 501
502 // Force generation of FEC packet. 502 // Force generation of FEC packet.
503 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 503 EXPECT_CALL(delegate_, OnSerializedPacket(_))
504 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); 504 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
505 creator_.set_should_fec_protect(true); 505 // Turn off FEC protection.
506 creator_.set_should_fec_protect_next_packet(false);
506 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, 507 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true,
507 /*is_fec_timeout=*/false); 508 /*is_fec_timeout=*/false);
508 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, 509 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
509 serialized_packet_.packet_number_length); 510 serialized_packet_.packet_number_length);
510 ASSERT_EQ(3u, serialized_packet_.packet_number); 511 ASSERT_EQ(3u, serialized_packet_.packet_number);
511 512
512 { 513 {
513 InSequence s; 514 InSequence s;
514 EXPECT_CALL(framer_visitor_, OnPacket()); 515 EXPECT_CALL(framer_visitor_, OnPacket());
515 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); 516 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
516 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); 517 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
517 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); 518 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
518 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); 519 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
519 EXPECT_CALL(framer_visitor_, OnFecData(_)); 520 EXPECT_CALL(framer_visitor_, OnFecData(_));
520 EXPECT_CALL(framer_visitor_, OnPacketComplete()); 521 EXPECT_CALL(framer_visitor_, OnPacketComplete());
521 } 522 }
522 ProcessPacket(serialized_packet_.packet); 523 ProcessPacket(serialized_packet_.packet);
523 ClearSerializedPacket(&serialized_packet_); 524 ClearSerializedPacket(&serialized_packet_);
524 525
525 // Ensure the next FEC group starts using the new packet number length. 526 // Ensure the next FEC group starts using the new packet number length.
526 SerializedPacket serialized = SerializeAllFrames(frames_); 527 ASSERT_TRUE(creator_.ConsumeData(3u, io_vector, 0u, 0u, false, false, &frame,
527 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, serialized.packet_number_length); 528 MUST_FEC_PROTECT));
528 delete frames_[0].ack_frame; 529 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
529 ClearSerializedPacket(&serialized); 530 EXPECT_CALL(delegate_, OnSerializedPacket(_))
531 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
532 creator_.Flush();
533 EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
534 serialized_packet_.packet_number_length);
535 ClearSerializedPacket(&serialized_packet_);
530 } 536 }
531 537
532 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) { 538 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) {
533 // If the original packet number length, the current packet number 539 // If the original packet number length, the current packet number
534 // length, and the configured send packet number length are different, the 540 // length, and the configured send packet number length are different, the
535 // retransmit must sent with the original length and the others do not change. 541 // retransmit must sent with the original length and the others do not change.
536 QuicPacketCreatorPeer::SetNextPacketNumberLength(&creator_, 542 QuicPacketCreatorPeer::SetNextPacketNumberLength(&creator_,
537 PACKET_4BYTE_PACKET_NUMBER); 543 PACKET_4BYTE_PACKET_NUMBER);
538 QuicPacketCreatorPeer::SetPacketNumberLength(&creator_, 544 QuicPacketCreatorPeer::SetPacketNumberLength(&creator_,
539 PACKET_2BYTE_PACKET_NUMBER); 545 PACKET_2BYTE_PACKET_NUMBER);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); 644 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
639 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); 645 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
640 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); 646 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
641 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_)); 647 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
642 EXPECT_CALL(framer_visitor_, OnPacketComplete()); 648 EXPECT_CALL(framer_visitor_, OnPacketComplete());
643 649
644 ProcessPacket(serialized.packet); 650 ProcessPacket(serialized.packet);
645 delete serialized.packet; 651 delete serialized.packet;
646 } 652 }
647 653
648 TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithNoGroup) { 654 TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithGroupInProgress) {
649 // Enable FEC protection. 655 // Send FEC packet every 6 packets.
650 creator_.set_max_packets_per_fec_group(6); 656 creator_.set_max_packets_per_fec_group(6);
651 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecEnabled(&creator_));
652 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
653
654 // Turn on FEC protection. 657 // Turn on FEC protection.
655 creator_.MaybeStartFecProtection(); 658 QuicFrame frame;
659 QuicIOVector io_vector(MakeIOVector("test"));
660 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame,
661 MUST_FEC_PROTECT));
656 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); 662 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
657 // We have no packets in the FEC group, so no FEC packet can be created. 663 EXPECT_CALL(delegate_, OnSerializedPacket(_))
658 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/true)); 664 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket));
659 // Since no packets are in FEC group yet, we should be able to turn FEC 665 creator_.Flush();
660 // off with no trouble.
661 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true,
662 /*is_fec_timeout=*/false);
663 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
664 }
665
666 TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithGroupInProgress) {
667 // Enable FEC protection, and send FEC packet every 6 packets.
668 EXPECT_TRUE(SwitchFecProtectionOn(6));
669 frames_.push_back(
670 QuicFrame(new QuicStreamFrame(0u, false, 0u, StringPiece())));
671 SerializedPacket serialized = SerializeAllFrames(frames_);
672 delete frames_[0].stream_frame;
673 delete serialized.packet;
674
675 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
676 // We do not have enough packets in the FEC group to trigger an FEC packet. 666 // We do not have enough packets in the FEC group to trigger an FEC packet.
677 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); 667 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
678 // Should return true since there are packets in the FEC group. 668 // Should return true since there are packets in the FEC group.
679 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); 669 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
680 670
681 // Switching FEC off should not change creator state, since there is an 671 // Switching FEC off should not change creator state, since there is an
682 // FEC packet under construction. 672 // FEC packet under construction.
683 EXPECT_DFATAL(QuicPacketCreatorPeer::StopFecProtectingPackets(&creator_), 673 EXPECT_DFATAL(QuicPacketCreatorPeer::StopFecProtectingPackets(&creator_),
684 "Cannot stop FEC protection with open FEC group."); 674 "Cannot stop FEC protection with open FEC group.");
685 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); 675 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
686 // Confirm that FEC packet is still under construction. 676 // Confirm that FEC packet is still under construction.
687 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); 677 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
688 678
689 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 679 EXPECT_CALL(delegate_, OnSerializedPacket(_))
690 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); 680 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket));
691 // Switching FEC on/off should work now. 681 // Turn off FEC protection.
682 creator_.set_should_fec_protect_next_packet(false);
692 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, 683 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true,
693 /*is_fec_timeout=*/false); 684 /*is_fec_timeout=*/false);
694 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); 685 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
695 creator_.MaybeStartFecProtection();
696 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
697 } 686 }
698 687
699 TEST_P(QuicPacketCreatorTest, SwitchFecOnWithStreamFrameQueued) { 688 TEST_P(QuicPacketCreatorTest, SwitchFecOnWithStreamFrameQueued) {
700 // Add a stream frame to the creator. 689 // Add a stream frame to the creator.
701 QuicFrame frame; 690 QuicFrame frame;
702 QuicIOVector io_vector(MakeIOVector("test")); 691 QuicIOVector io_vector(MakeIOVector("test"));
703 ASSERT_TRUE( 692 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame,
704 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); 693 MAY_FEC_PROTECT));
694 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
705 ASSERT_TRUE(frame.stream_frame); 695 ASSERT_TRUE(frame.stream_frame);
706 size_t consumed = frame.stream_frame->frame_length; 696 size_t consumed = frame.stream_frame->frame_length;
707 EXPECT_EQ(4u, consumed); 697 EXPECT_EQ(4u, consumed);
708 EXPECT_TRUE(creator_.HasPendingFrames()); 698 EXPECT_TRUE(creator_.HasPendingFrames());
709 699
710 // Enable FEC protection, and send FEC packet every 6 packets. 700 // Enable FEC protection, and send FEC packet every 6 packets.
711 creator_.set_max_packets_per_fec_group(6); 701 creator_.set_max_packets_per_fec_group(6);
712 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecEnabled(&creator_)); 702 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecEnabled(&creator_));
713 EXPECT_DFATAL(QuicPacketCreatorPeer::StartFecProtectingPackets(&creator_), 703 EXPECT_DFATAL(QuicPacketCreatorPeer::StartFecProtectingPackets(&creator_),
714 "Cannot start FEC protection with pending frames."); 704 "Cannot start FEC protection with pending frames.");
715 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); 705 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
716 706
717 // Start FEC protection after current open packet is flushed. 707 // Start FEC protection after current open packet is flushed.
718 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 708 EXPECT_CALL(delegate_, OnSerializedPacket(_))
719 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); 709 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket));
720 creator_.MaybeStartFecProtection(); 710 ASSERT_TRUE(creator_.ConsumeData(2u, io_vector, 0u, 0u, false, false, &frame,
721 EXPECT_FALSE(creator_.HasPendingFrames()); 711 MUST_FEC_PROTECT));
712 ASSERT_TRUE(frame.stream_frame);
713 consumed = frame.stream_frame->frame_length;
714 EXPECT_EQ(4u, consumed);
715 EXPECT_TRUE(creator_.HasPendingFrames());
722 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); 716 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
723 } 717 }
724 718
725 TEST_P(QuicPacketCreatorTest, ConsumeData) { 719 TEST_P(QuicPacketCreatorTest, ConsumeData) {
726 QuicFrame frame; 720 QuicFrame frame;
727 QuicIOVector io_vector(MakeIOVector("test")); 721 QuicIOVector io_vector(MakeIOVector("test"));
728 ASSERT_TRUE( 722 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame,
729 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); 723 MAY_FEC_PROTECT));
730 ASSERT_TRUE(frame.stream_frame); 724 ASSERT_TRUE(frame.stream_frame);
731 size_t consumed = frame.stream_frame->frame_length; 725 size_t consumed = frame.stream_frame->frame_length;
732 EXPECT_EQ(4u, consumed); 726 EXPECT_EQ(4u, consumed);
733 CheckStreamFrame(frame, 1u, "test", 0u, false); 727 CheckStreamFrame(frame, 1u, "test", 0u, false);
734 EXPECT_TRUE(creator_.HasPendingFrames()); 728 EXPECT_TRUE(creator_.HasPendingFrames());
735 } 729 }
736 730
737 TEST_P(QuicPacketCreatorTest, ConsumeDataFin) { 731 TEST_P(QuicPacketCreatorTest, ConsumeDataFin) {
738 QuicFrame frame; 732 QuicFrame frame;
739 QuicIOVector io_vector(MakeIOVector("test")); 733 QuicIOVector io_vector(MakeIOVector("test"));
740 ASSERT_TRUE( 734 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 10u, true, false, &frame,
741 creator_.ConsumeData(1u, io_vector, 0u, 10u, true, false, &frame)); 735 MAY_FEC_PROTECT));
742 ASSERT_TRUE(frame.stream_frame); 736 ASSERT_TRUE(frame.stream_frame);
743 size_t consumed = frame.stream_frame->frame_length; 737 size_t consumed = frame.stream_frame->frame_length;
744 EXPECT_EQ(4u, consumed); 738 EXPECT_EQ(4u, consumed);
745 CheckStreamFrame(frame, 1u, "test", 10u, true); 739 CheckStreamFrame(frame, 1u, "test", 10u, true);
746 EXPECT_TRUE(creator_.HasPendingFrames()); 740 EXPECT_TRUE(creator_.HasPendingFrames());
747 } 741 }
748 742
749 TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) { 743 TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) {
750 QuicFrame frame; 744 QuicFrame frame;
751 QuicIOVector io_vector(nullptr, 0, 0); 745 QuicIOVector io_vector(nullptr, 0, 0);
752 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame)); 746 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame,
747 MAY_FEC_PROTECT));
753 ASSERT_TRUE(frame.stream_frame); 748 ASSERT_TRUE(frame.stream_frame);
754 size_t consumed = frame.stream_frame->frame_length; 749 size_t consumed = frame.stream_frame->frame_length;
755 EXPECT_EQ(0u, consumed); 750 EXPECT_EQ(0u, consumed);
756 CheckStreamFrame(frame, 1u, string(), 0u, true); 751 CheckStreamFrame(frame, 1u, string(), 0u, true);
757 EXPECT_TRUE(creator_.HasPendingFrames()); 752 EXPECT_TRUE(creator_.HasPendingFrames());
758 } 753 }
759 754
755 TEST_P(QuicPacketCreatorTest, ConsumeDataWithFecProtect) {
756 creator_.set_max_packets_per_fec_group(6);
757 QuicFrame frame;
758 QuicIOVector io_vector(MakeIOVector("test"));
759 EXPECT_FALSE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
760 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame,
761 MUST_FEC_PROTECT));
762 ASSERT_TRUE(frame.stream_frame);
763 size_t consumed = frame.stream_frame->frame_length;
764 EXPECT_EQ(4u, consumed);
765 CheckStreamFrame(frame, 1u, "test", 0u, false);
766 EXPECT_TRUE(creator_.HasPendingFrames());
767 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
768 }
769
760 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { 770 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
761 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) 771 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP)
762 + GetEncryptionOverhead(); 772 + GetEncryptionOverhead();
763 for (size_t i = overhead; i < overhead + 100; ++i) { 773 for (size_t i = overhead; i < overhead + 100; ++i) {
764 creator_.SetMaxPacketLength(i); 774 creator_.SetMaxPacketLength(i);
765 const bool should_have_room = i > overhead + GetStreamFrameOverhead( 775 const bool should_have_room = i > overhead + GetStreamFrameOverhead(
766 NOT_IN_FEC_GROUP); 776 NOT_IN_FEC_GROUP);
767 ASSERT_EQ(should_have_room, creator_.HasRoomForStreamFrame( 777 ASSERT_EQ(should_have_room, creator_.HasRoomForStreamFrame(
768 kClientDataStreamId1, kOffset)); 778 kClientDataStreamId1, kOffset));
769 if (should_have_room) { 779 if (should_have_room) {
770 QuicFrame frame; 780 QuicFrame frame;
771 QuicIOVector io_vector(MakeIOVector("testdata")); 781 QuicIOVector io_vector(MakeIOVector("testdata"));
772 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 782 EXPECT_CALL(delegate_, OnSerializedPacket(_))
773 .WillRepeatedly( 783 .WillRepeatedly(
774 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); 784 Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket));
775 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, 785 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u,
776 kOffset, false, false, &frame)); 786 kOffset, false, false, &frame,
787 MAY_FEC_PROTECT));
777 ASSERT_TRUE(frame.stream_frame); 788 ASSERT_TRUE(frame.stream_frame);
778 size_t bytes_consumed = frame.stream_frame->frame_length; 789 size_t bytes_consumed = frame.stream_frame->frame_length;
779 EXPECT_LT(0u, bytes_consumed); 790 EXPECT_LT(0u, bytes_consumed);
780 creator_.Flush(); 791 creator_.Flush();
781 } 792 }
782 } 793 }
783 } 794 }
784 795
785 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { 796 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
786 // Compute the total overhead for a single frame in packet. 797 // Compute the total overhead for a single frame in packet.
(...skipping 20 matching lines...) Expand all
807 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; 818 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
808 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 819 EXPECT_CALL(delegate_, OnSerializedPacket(_))
809 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); 820 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
810 creator_.Flush(); 821 creator_.Flush();
811 ASSERT_TRUE(serialized_packet_.packet); 822 ASSERT_TRUE(serialized_packet_.packet);
812 ClearSerializedPacket(&serialized_packet_); 823 ClearSerializedPacket(&serialized_packet_);
813 } 824 }
814 } 825 }
815 826
816 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { 827 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) {
817 // Enable FEC protection, and send FEC packet every 6 packets. 828 // Send FEC packet every 6 packets.
818 EXPECT_TRUE(SwitchFecProtectionOn(6)); 829 creator_.set_max_packets_per_fec_group(6);
830 // Turn on FEC protection.
831 QuicFrame frame;
832 QuicIOVector io_vector(MakeIOVector("test"));
833 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame,
834 MUST_FEC_PROTECT));
835 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
836 // Serialize the packet.
837 EXPECT_CALL(delegate_, OnSerializedPacket(_))
838 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket));
839 creator_.Flush();
819 // Compute the total overhead for a single frame in packet. 840 // Compute the total overhead for a single frame in packet.
820 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) + 841 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) +
821 GetEncryptionOverhead() + 842 GetEncryptionOverhead() +
822 GetStreamFrameOverhead(IN_FEC_GROUP); 843 GetStreamFrameOverhead(IN_FEC_GROUP);
823 size_t capacity = kDefaultMaxPacketSize - overhead; 844 size_t capacity = kDefaultMaxPacketSize - overhead;
824 // Now, test various sizes around this size. 845 // Now, test various sizes around this size.
825 for (int delta = -5; delta <= 5; ++delta) { 846 for (int delta = -5; delta <= 5; ++delta) {
826 string data(capacity + delta, 'A'); 847 string data(capacity + delta, 'A');
827 size_t bytes_free = delta > 0 ? 0 : 0 - delta; 848 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
828 QuicFrame frame; 849 QuicFrame frame;
(...skipping 28 matching lines...) Expand all
857 for (int delta = -5; delta <= 5; ++delta) { 878 for (int delta = -5; delta <= 5; ++delta) {
858 string data(capacity + delta, 'A'); 879 string data(capacity + delta, 'A');
859 size_t bytes_free = delta > 0 ? 0 : 0 - delta; 880 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
860 881
861 QuicFrame frame; 882 QuicFrame frame;
862 QuicIOVector io_vector(MakeIOVector(data)); 883 QuicIOVector io_vector(MakeIOVector(data));
863 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 884 EXPECT_CALL(delegate_, OnSerializedPacket(_))
864 .WillRepeatedly( 885 .WillRepeatedly(
865 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); 886 Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
866 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, kOffset, 887 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, kOffset,
867 false, true, &frame)); 888 false, true, &frame, MAY_FEC_PROTECT));
868 ASSERT_TRUE(frame.stream_frame); 889 ASSERT_TRUE(frame.stream_frame);
869 size_t bytes_consumed = frame.stream_frame->frame_length; 890 size_t bytes_consumed = frame.stream_frame->frame_length;
870 EXPECT_LT(0u, bytes_consumed); 891 EXPECT_LT(0u, bytes_consumed);
871 creator_.Flush(); 892 creator_.Flush();
872 ASSERT_TRUE(serialized_packet_.packet); 893 ASSERT_TRUE(serialized_packet_.packet);
873 // If there is not enough space in the packet to fit a padding frame 894 // If there is not enough space in the packet to fit a padding frame
874 // (1 byte) and to expand the stream frame (another 2 bytes) the packet 895 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
875 // will not be padded. 896 // will not be padded.
876 if (bytes_free < 3) { 897 if (bytes_free < 3) {
877 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free, 898 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
(...skipping 14 matching lines...) Expand all
892 // Now, test various sizes around this size. 913 // Now, test various sizes around this size.
893 for (int delta = -5; delta <= 5; ++delta) { 914 for (int delta = -5; delta <= 5; ++delta) {
894 string data(capacity + delta, 'A'); 915 string data(capacity + delta, 'A');
895 size_t bytes_free = delta > 0 ? 0 : 0 - delta; 916 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
896 917
897 QuicFrame frame; 918 QuicFrame frame;
898 QuicIOVector io_vector(MakeIOVector(data)); 919 QuicIOVector io_vector(MakeIOVector(data));
899 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 920 EXPECT_CALL(delegate_, OnSerializedPacket(_))
900 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); 921 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
901 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, 922 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u,
902 kOffset, false, false, &frame)); 923 kOffset, false, false, &frame,
924 MAY_FEC_PROTECT));
903 ASSERT_TRUE(frame.stream_frame); 925 ASSERT_TRUE(frame.stream_frame);
904 size_t bytes_consumed = frame.stream_frame->frame_length; 926 size_t bytes_consumed = frame.stream_frame->frame_length;
905 EXPECT_LT(0u, bytes_consumed); 927 EXPECT_LT(0u, bytes_consumed);
906 creator_.Flush(); 928 creator_.Flush();
907 ASSERT_TRUE(serialized_packet_.packet); 929 ASSERT_TRUE(serialized_packet_.packet);
908 if (bytes_free > 0) { 930 if (bytes_free > 0) {
909 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free, 931 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
910 serialized_packet_.packet->length()); 932 serialized_packet_.packet->length());
911 } else { 933 } else {
912 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.packet->length()); 934 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.packet->length());
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
1023 creator_.SetMaxPacketLength(GetPacketLengthForOneStream( 1045 creator_.SetMaxPacketLength(GetPacketLengthForOneStream(
1024 client_framer_.version(), 1046 client_framer_.version(),
1025 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), 1047 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
1026 creator_.connection_id_length(), PACKET_1BYTE_PACKET_NUMBER, 1048 creator_.connection_id_length(), PACKET_1BYTE_PACKET_NUMBER,
1027 NOT_IN_FEC_GROUP, &payload_length)); 1049 NOT_IN_FEC_GROUP, &payload_length));
1028 QuicFrame frame; 1050 QuicFrame frame;
1029 const string too_long_payload(payload_length * 2, 'a'); 1051 const string too_long_payload(payload_length * 2, 'a');
1030 QuicIOVector io_vector(MakeIOVector(too_long_payload)); 1052 QuicIOVector io_vector(MakeIOVector(too_long_payload));
1031 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 1053 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1032 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); 1054 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1033 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame)); 1055 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame,
1056 MAY_FEC_PROTECT));
1034 ASSERT_TRUE(frame.stream_frame); 1057 ASSERT_TRUE(frame.stream_frame);
1035 size_t consumed = frame.stream_frame->frame_length; 1058 size_t consumed = frame.stream_frame->frame_length;
1036 EXPECT_EQ(payload_length, consumed); 1059 EXPECT_EQ(payload_length, consumed);
1037 const string payload(payload_length, 'a'); 1060 const string payload(payload_length, 'a');
1038 CheckStreamFrame(frame, 1u, payload, 0u, false); 1061 CheckStreamFrame(frame, 1u, payload, 0u, false);
1039 creator_.Flush(); 1062 creator_.Flush();
1040 ClearSerializedPacket(&serialized_packet_); 1063 ClearSerializedPacket(&serialized_packet_);
1041 } 1064 }
1042 1065
1043 TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) { 1066 TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
(...skipping 11 matching lines...) Expand all
1055 NOT_IN_FEC_GROUP), 1078 NOT_IN_FEC_GROUP),
1056 creator_.BytesFree()); 1079 creator_.BytesFree());
1057 1080
1058 // Add a variety of frame types and then a padding frame. 1081 // Add a variety of frame types and then a padding frame.
1059 QuicAckFrame ack_frame(MakeAckFrame(0u)); 1082 QuicAckFrame ack_frame(MakeAckFrame(0u));
1060 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); 1083 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
1061 EXPECT_TRUE(creator_.HasPendingFrames()); 1084 EXPECT_TRUE(creator_.HasPendingFrames());
1062 1085
1063 QuicFrame frame; 1086 QuicFrame frame;
1064 QuicIOVector io_vector(MakeIOVector("test")); 1087 QuicIOVector io_vector(MakeIOVector("test"));
1065 ASSERT_TRUE( 1088 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame,
1066 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); 1089 MAY_FEC_PROTECT));
1067 ASSERT_TRUE(frame.stream_frame); 1090 ASSERT_TRUE(frame.stream_frame);
1068 size_t consumed = frame.stream_frame->frame_length; 1091 size_t consumed = frame.stream_frame->frame_length;
1069 EXPECT_EQ(4u, consumed); 1092 EXPECT_EQ(4u, consumed);
1070 EXPECT_TRUE(creator_.HasPendingFrames()); 1093 EXPECT_TRUE(creator_.HasPendingFrames());
1071 1094
1072 QuicPaddingFrame padding_frame; 1095 QuicPaddingFrame padding_frame;
1073 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(padding_frame))); 1096 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(padding_frame)));
1074 EXPECT_TRUE(creator_.HasPendingFrames()); 1097 EXPECT_TRUE(creator_.HasPendingFrames());
1075 EXPECT_EQ(0u, creator_.BytesFree()); 1098 EXPECT_EQ(0u, creator_.BytesFree());
1076 1099
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1116 1139
1117 // Add ack frame to creator. 1140 // Add ack frame to creator.
1118 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); 1141 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
1119 EXPECT_TRUE(creator_.HasPendingFrames()); 1142 EXPECT_TRUE(creator_.HasPendingFrames());
1120 EXPECT_GT(creator_.max_packet_length(), creator_.PacketSize()); 1143 EXPECT_GT(creator_.max_packet_length(), creator_.PacketSize());
1121 EXPECT_LT(0u, creator_.BytesFree()); 1144 EXPECT_LT(0u, creator_.BytesFree());
1122 1145
1123 // Make sure that an additional stream frame can be added to the packet. 1146 // Make sure that an additional stream frame can be added to the packet.
1124 QuicFrame frame; 1147 QuicFrame frame;
1125 QuicIOVector io_vector(MakeIOVector("test")); 1148 QuicIOVector io_vector(MakeIOVector("test"));
1126 ASSERT_TRUE( 1149 ASSERT_TRUE(creator_.ConsumeData(2u, io_vector, 0u, 0u, false, false, &frame,
1127 creator_.ConsumeData(2u, io_vector, 0u, 0u, false, false, &frame)); 1150 MAY_FEC_PROTECT));
1128 ASSERT_TRUE(frame.stream_frame); 1151 ASSERT_TRUE(frame.stream_frame);
1129 size_t consumed = frame.stream_frame->frame_length; 1152 size_t consumed = frame.stream_frame->frame_length;
1130 EXPECT_EQ(4u, consumed); 1153 EXPECT_EQ(4u, consumed);
1131 EXPECT_TRUE(creator_.HasPendingFrames()); 1154 EXPECT_TRUE(creator_.HasPendingFrames());
1132 1155
1133 // Ensure the packet is successfully created, and the packet size estimate 1156 // Ensure the packet is successfully created, and the packet size estimate
1134 // matches the serialized packet length. 1157 // matches the serialized packet length.
1135 EXPECT_CALL(entropy_calculator_, EntropyHash(_)).WillOnce(testing::Return(0)); 1158 EXPECT_CALL(entropy_calculator_, EntropyHash(_)).WillOnce(testing::Return(0));
1136 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 1159 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1137 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); 1160 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1200 delete serialized.packet; 1223 delete serialized.packet;
1201 } 1224 }
1202 // After 64 calls, BoolSource will refresh the bucket - make sure it does. 1225 // After 64 calls, BoolSource will refresh the bucket - make sure it does.
1203 mock_random_.ChangeValue(); 1226 mock_random_.ChangeValue();
1204 } 1227 }
1205 1228
1206 delete frames_[0].stream_frame; 1229 delete frames_[0].stream_frame;
1207 } 1230 }
1208 1231
1209 TEST_P(QuicPacketCreatorTest, ResetFecGroup) { 1232 TEST_P(QuicPacketCreatorTest, ResetFecGroup) {
1210 // Enable FEC protection, and send FEC packet every 6 packets. 1233 // Send FEC packet every 6 packets.
1211 EXPECT_TRUE(SwitchFecProtectionOn(6)); 1234 creator_.set_max_packets_per_fec_group(6);
1212 frames_.push_back( 1235 // Add a stream frame and turn on FEC protection.
1213 QuicFrame(new QuicStreamFrame(0u, false, 0u, StringPiece()))); 1236 QuicFrame frame;
1214 SerializedPacket serialized = SerializeAllFrames(frames_); 1237 QuicIOVector io_vector(MakeIOVector("test"));
1215 delete serialized.packet; 1238 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame,
1239 MUST_FEC_PROTECT));
1240 // Serialize the packet.
1241 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1242 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket));
1243 creator_.Flush();
1216 1244
1217 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); 1245 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
1218 EXPECT_TRUE(creator_.IsFecGroupOpen()); 1246 EXPECT_TRUE(creator_.IsFecGroupOpen());
1219 // We do not have enough packets in the FEC group to trigger an FEC packet. 1247 // We do not have enough packets in the FEC group to trigger an FEC packet.
1220 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); 1248 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
1221 // Should return true since there are packets in the FEC group. 1249 // Should return true since there are packets in the FEC group.
1222 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); 1250 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
1223 1251
1224 // FEC group will be reset if FEC police is alarm trigger but FEC alarm does 1252 // FEC group will be reset if FEC police is alarm trigger but FEC alarm does
1225 // not fire. 1253 // not fire.
1226 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); 1254 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1);
1227 creator_.set_fec_send_policy(FEC_ALARM_TRIGGER); 1255 creator_.set_fec_send_policy(FEC_ALARM_TRIGGER);
1228 creator_.set_should_fec_protect(true); 1256 creator_.set_should_fec_protect_next_packet(true);
1229 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, 1257 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true,
1230 /*is_fec_timeout=*/false); 1258 /*is_fec_timeout=*/false);
1231 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); 1259 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
1232 EXPECT_FALSE(creator_.IsFecGroupOpen()); 1260 EXPECT_FALSE(creator_.IsFecGroupOpen());
1233 // We do not have enough packets in the FEC group to trigger an FEC packet. 1261 // We do not have enough packets in the FEC group to trigger an FEC packet.
1234 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); 1262 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
1235 // Confirm that there is no FEC packet under construction. 1263 // Confirm that there is no FEC packet under construction.
1236 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/true)); 1264 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/true));
1237 1265
1238 EXPECT_DFATAL(serialized = QuicPacketCreatorPeer::SerializeFec( 1266 char buffer[kMaxPacketSize];
1239 &creator_, buffer_, kMaxPacketSize), 1267 EXPECT_DFATAL(
1240 "SerializeFEC called but no group or zero packets in group."); 1268 QuicPacketCreatorPeer::SerializeFec(&creator_, buffer, kMaxPacketSize),
1241 delete serialized.packet; 1269 "SerializeFEC called but no group or zero packets in group.");
1242 1270
1243 // Start a new FEC packet. 1271 // Create and send a new FEC protected packet.
1244 serialized = SerializeAllFrames(frames_); 1272 ASSERT_TRUE(creator_.ConsumeData(2u, io_vector, 0u, 0u, false, false, &frame,
1245 delete frames_[0].stream_frame; 1273 MUST_FEC_PROTECT));
1246 delete serialized.packet; 1274 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1275 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket));
1276 creator_.Flush();
1247 1277
1248 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_)); 1278 EXPECT_TRUE(QuicPacketCreatorPeer::IsFecProtected(&creator_));
1249 EXPECT_TRUE(creator_.IsFecGroupOpen()); 1279 EXPECT_TRUE(creator_.IsFecGroupOpen());
1250 // We do not have enough packets in the FEC group to trigger an FEC packet. 1280 // We do not have enough packets in the FEC group to trigger an FEC packet.
1251 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); 1281 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
1252 // Should return true since there are packets in the FEC group. 1282 // Should return true since there are packets in the FEC group.
1253 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); 1283 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
1254 1284
1255 // Should return false since we do not have enough packets in the FEC group to 1285 // Should return false since we do not have enough packets in the FEC group to
1256 // trigger an FEC packet. 1286 // trigger an FEC packet.
1257 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false)); 1287 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
1258 // Should return true since there are packets in the FEC group. 1288 // Should return true since there are packets in the FEC group.
1259 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true)); 1289 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
1260 1290
1261 // Change FEC policy, send FEC packet and close FEC group. 1291 // Change FEC policy, send FEC packet and close FEC group.
1262 creator_.set_fec_send_policy(FEC_ANY_TRIGGER); 1292 creator_.set_fec_send_policy(FEC_ANY_TRIGGER);
1263 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 1293 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1264 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket)); 1294 .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
1295 creator_.set_should_fec_protect_next_packet(false);
1265 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, 1296 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true,
1266 /*is_fec_timeout=*/false); 1297 /*is_fec_timeout=*/false);
1267 ASSERT_EQ(3u, serialized_packet_.packet_number); 1298 ASSERT_EQ(3u, serialized_packet_.packet_number);
1268 ClearSerializedPacket(&serialized_packet_); 1299 ClearSerializedPacket(&serialized_packet_);
1269 } 1300 }
1270 1301
1271 TEST_P(QuicPacketCreatorTest, ResetFecGroupWithQueuedFrames) { 1302 TEST_P(QuicPacketCreatorTest, ResetFecGroupWithQueuedFrames) {
1272 // Enable FEC protection, and send FEC packet every 6 packets. 1303 // Send FEC packet every 6 packets.
1273 EXPECT_TRUE(SwitchFecProtectionOn(6)); 1304 creator_.set_max_packets_per_fec_group(6);
1274 // Add a stream frame to the creator. 1305 // Add a stream frame to the creator and turn on FEC protection.
1275 QuicFrame frame; 1306 QuicFrame frame;
1276 QuicIOVector io_vector(MakeIOVector("test")); 1307 QuicIOVector io_vector(MakeIOVector("test"));
1277 ASSERT_TRUE( 1308 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame,
1278 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); 1309 MUST_FEC_PROTECT));
1279 ASSERT_TRUE(frame.stream_frame); 1310 ASSERT_TRUE(frame.stream_frame);
1280 size_t consumed = frame.stream_frame->frame_length; 1311 size_t consumed = frame.stream_frame->frame_length;
1281 EXPECT_EQ(4u, consumed); 1312 EXPECT_EQ(4u, consumed);
1282 EXPECT_TRUE(creator_.HasPendingFrames()); 1313 EXPECT_TRUE(creator_.HasPendingFrames());
1283 EXPECT_DFATAL(QuicPacketCreatorPeer::ResetFecGroup(&creator_), 1314 EXPECT_DFATAL(QuicPacketCreatorPeer::ResetFecGroup(&creator_),
1284 "Cannot reset FEC group with pending frames."); 1315 "Cannot reset FEC group with pending frames.");
1285 1316
1286 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 1317 EXPECT_CALL(delegate_, OnSerializedPacket(_))
1287 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket)); 1318 .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket));
1288 creator_.Flush(); 1319 creator_.Flush();
1289 EXPECT_FALSE(creator_.HasPendingFrames()); 1320 EXPECT_FALSE(creator_.HasPendingFrames());
1290 1321
1291 // FEC group will be reset if FEC police is alarm trigger but FEC alarm does 1322 // FEC group will be reset if FEC police is alarm trigger but FEC alarm does
1292 // not fire. 1323 // not fire.
1293 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1); 1324 EXPECT_CALL(delegate_, OnResetFecGroup()).Times(1);
1294 creator_.set_fec_send_policy(FEC_ALARM_TRIGGER); 1325 creator_.set_fec_send_policy(FEC_ALARM_TRIGGER);
1295 creator_.set_should_fec_protect(true); 1326 creator_.set_should_fec_protect_next_packet(true);
1296 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true, 1327 creator_.MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/true,
1297 /*is_fec_timeout=*/false); 1328 /*is_fec_timeout=*/false);
1298 EXPECT_FALSE(creator_.IsFecGroupOpen()); 1329 EXPECT_FALSE(creator_.IsFecGroupOpen());
1299 } 1330 }
1300 1331
1301 } // namespace 1332 } // namespace
1302 } // namespace test 1333 } // namespace test
1303 } // namespace net 1334 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_packet_creator.cc ('k') | net/quic/quic_packet_generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698