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