| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_packet_creator.h" | 5 #include "net/quic/quic_packet_creator.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |