Home | History | Annotate | Download | only in quic
      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
      3 // found in the LICENSE file.
      4 
      5 #include "net/quic/quic_packet_creator.h"
      6 
      7 #include "base/stl_util.h"
      8 #include "net/quic/crypto/null_encrypter.h"
      9 #include "net/quic/crypto/quic_decrypter.h"
     10 #include "net/quic/crypto/quic_encrypter.h"
     11 #include "net/quic/quic_utils.h"
     12 #include "net/quic/test_tools/mock_random.h"
     13 #include "net/quic/test_tools/quic_framer_peer.h"
     14 #include "net/quic/test_tools/quic_packet_creator_peer.h"
     15 #include "net/quic/test_tools/quic_test_utils.h"
     16 #include "net/test/gtest_util.h"
     17 #include "testing/gmock/include/gmock/gmock.h"
     18 
     19 using base::StringPiece;
     20 using std::ostream;
     21 using std::string;
     22 using std::vector;
     23 using testing::DoAll;
     24 using testing::InSequence;
     25 using testing::Return;
     26 using testing::SaveArg;
     27 using testing::_;
     28 
     29 namespace net {
     30 namespace test {
     31 namespace {
     32 
     33 // Run tests with combinations of {QuicVersion, ToggleVersionSerialization}.
     34 struct TestParams {
     35   TestParams(QuicVersion version,
     36              bool version_serialization)
     37       : version(version),
     38         version_serialization(version_serialization) {
     39   }
     40 
     41   friend ostream& operator<<(ostream& os, const TestParams& p) {
     42     os << "{ client_version: " << QuicVersionToString(p.version)
     43        << " include version: " << p.version_serialization << " }";
     44     return os;
     45   }
     46 
     47   QuicVersion version;
     48   bool version_serialization;
     49 };
     50 
     51 // Constructs various test permutations.
     52 vector<TestParams> GetTestParams() {
     53   vector<TestParams> params;
     54   QuicVersionVector all_supported_versions = QuicSupportedVersions();
     55   for (size_t i = 0; i < all_supported_versions.size(); ++i) {
     56     params.push_back(TestParams(all_supported_versions[i], true));
     57     params.push_back(TestParams(all_supported_versions[i], false));
     58   }
     59   return params;
     60 }
     61 
     62 class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> {
     63  protected:
     64   QuicPacketCreatorTest()
     65       : server_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(),
     66                        true),
     67         client_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(),
     68                        false),
     69         sequence_number_(0),
     70         connection_id_(2),
     71         data_("foo"),
     72         creator_(connection_id_, &client_framer_, &mock_random_) {
     73     client_framer_.set_visitor(&framer_visitor_);
     74     client_framer_.set_received_entropy_calculator(&entropy_calculator_);
     75     server_framer_.set_visitor(&framer_visitor_);
     76   }
     77 
     78   virtual ~QuicPacketCreatorTest() OVERRIDE {
     79   }
     80 
     81   void ProcessPacket(QuicPacket* packet) {
     82     scoped_ptr<QuicEncryptedPacket> encrypted(
     83         server_framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number_,
     84                                      *packet));
     85     server_framer_.ProcessPacket(*encrypted);
     86   }
     87 
     88   void CheckStreamFrame(const QuicFrame& frame,
     89                         QuicStreamId stream_id,
     90                         const string& data,
     91                         QuicStreamOffset offset,
     92                         bool fin) {
     93     EXPECT_EQ(STREAM_FRAME, frame.type);
     94     ASSERT_TRUE(frame.stream_frame);
     95     EXPECT_EQ(stream_id, frame.stream_frame->stream_id);
     96     scoped_ptr<string> frame_data(frame.stream_frame->GetDataAsString());
     97     EXPECT_EQ(data, *frame_data);
     98     EXPECT_EQ(offset, frame.stream_frame->offset);
     99     EXPECT_EQ(fin, frame.stream_frame->fin);
    100   }
    101 
    102   // Returns the number of bytes consumed by the header of packet, including
    103   // the version.
    104   size_t GetPacketHeaderOverhead(InFecGroup is_in_fec_group) {
    105     return GetPacketHeaderSize(creator_.connection_id_length(),
    106                                kIncludeVersion,
    107                                creator_.next_sequence_number_length(),
    108                                is_in_fec_group);
    109   }
    110 
    111   // Returns the number of bytes of overhead that will be added to a packet
    112   // of maximum length.
    113   size_t GetEncryptionOverhead() {
    114     return creator_.max_packet_length() - client_framer_.GetMaxPlaintextSize(
    115         creator_.max_packet_length());
    116   }
    117 
    118   // Returns the number of bytes consumed by the non-data fields of a stream
    119   // frame, assuming it is the last frame in the packet
    120   size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) {
    121     return QuicFramer::GetMinStreamFrameSize(client_framer_.version(),
    122                                              kClientDataStreamId1, kOffset,
    123                                              true, is_in_fec_group);
    124   }
    125 
    126   // Enables and turns on FEC protection. Returns true if FEC protection is on.
    127   bool SwitchFecProtectionOn(size_t max_packets_per_fec_group) {
    128     creator_.set_max_packets_per_fec_group(max_packets_per_fec_group);
    129     creator_.StartFecProtectingPackets();
    130     return creator_.IsFecProtected();
    131   }
    132 
    133   static const QuicStreamOffset kOffset = 1u;
    134 
    135   QuicFrames frames_;
    136   QuicFramer server_framer_;
    137   QuicFramer client_framer_;
    138   testing::StrictMock<MockFramerVisitor> framer_visitor_;
    139   QuicPacketSequenceNumber sequence_number_;
    140   QuicConnectionId connection_id_;
    141   string data_;
    142   MockRandom mock_random_;
    143   QuicPacketCreator creator_;
    144   MockEntropyCalculator entropy_calculator_;
    145 };
    146 
    147 // Run all packet creator tests with all supported versions of QUIC, and with
    148 // and without version in the packet header.
    149 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests,
    150                         QuicPacketCreatorTest,
    151                         ::testing::ValuesIn(GetTestParams()));
    152 
    153 TEST_P(QuicPacketCreatorTest, SerializeFrames) {
    154   frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u))));
    155   frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
    156   frames_.push_back(QuicFrame(new QuicStreamFrame(0u, true, 0u, IOVector())));
    157   SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
    158   delete frames_[0].ack_frame;
    159   delete frames_[1].stream_frame;
    160   delete frames_[2].stream_frame;
    161 
    162   {
    163     InSequence s;
    164     EXPECT_CALL(framer_visitor_, OnPacket());
    165     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    166     EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    167     EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    168     EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
    169     EXPECT_CALL(framer_visitor_, OnAckFrame(_));
    170     EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
    171     EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
    172     EXPECT_CALL(framer_visitor_, OnPacketComplete());
    173   }
    174   ProcessPacket(serialized.packet);
    175   delete serialized.packet;
    176 }
    177 
    178 TEST_P(QuicPacketCreatorTest, SerializeWithFEC) {
    179   // Enable FEC protection, and send FEC packet every 6 packets.
    180   EXPECT_TRUE(SwitchFecProtectionOn(6));
    181   // Should return false since we do not have enough packets in the FEC group to
    182   // trigger an FEC packet.
    183   ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
    184 
    185   frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
    186   SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
    187   delete frames_[0].stream_frame;
    188 
    189   {
    190     InSequence s;
    191     EXPECT_CALL(framer_visitor_, OnPacket());
    192     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    193     EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    194     EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    195     EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
    196     EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
    197     EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
    198     EXPECT_CALL(framer_visitor_, OnPacketComplete());
    199   }
    200   ProcessPacket(serialized.packet);
    201   delete serialized.packet;
    202 
    203   // Should return false since we do not have enough packets in the FEC group to
    204   // trigger an FEC packet.
    205   ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
    206   // Should return true since there are packets in the FEC group.
    207   ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
    208 
    209   serialized = creator_.SerializeFec();
    210   ASSERT_EQ(2u, serialized.sequence_number);
    211   {
    212     InSequence s;
    213     EXPECT_CALL(framer_visitor_, OnPacket());
    214     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    215     EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    216     EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    217     EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
    218     EXPECT_CALL(framer_visitor_, OnFecData(_));
    219     EXPECT_CALL(framer_visitor_, OnPacketComplete());
    220   }
    221   ProcessPacket(serialized.packet);
    222   delete serialized.packet;
    223 }
    224 
    225 TEST_P(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) {
    226   frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u))));
    227   creator_.AddSavedFrame(frames_[0]);
    228   creator_.set_next_sequence_number_length(PACKET_4BYTE_SEQUENCE_NUMBER);
    229   SerializedPacket serialized = creator_.SerializePacket();
    230   // The sequence number length will not change mid-packet.
    231   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
    232 
    233   {
    234     InSequence s;
    235     EXPECT_CALL(framer_visitor_, OnPacket());
    236     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    237     EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    238     EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    239     EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
    240     EXPECT_CALL(framer_visitor_, OnAckFrame(_));
    241     EXPECT_CALL(framer_visitor_, OnPacketComplete());
    242   }
    243   ProcessPacket(serialized.packet);
    244   delete serialized.packet;
    245 
    246   creator_.AddSavedFrame(frames_[0]);
    247   serialized = creator_.SerializePacket();
    248   // Now the actual sequence number length should have changed.
    249   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
    250   delete frames_[0].ack_frame;
    251 
    252   {
    253     InSequence s;
    254     EXPECT_CALL(framer_visitor_, OnPacket());
    255     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    256     EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    257     EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    258     EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
    259     EXPECT_CALL(framer_visitor_, OnAckFrame(_));
    260     EXPECT_CALL(framer_visitor_, OnPacketComplete());
    261   }
    262   ProcessPacket(serialized.packet);
    263   delete serialized.packet;
    264 }
    265 
    266 TEST_P(QuicPacketCreatorTest, ChangeSequenceNumberLengthMidPacket) {
    267   if (GetParam().version <= QUIC_VERSION_15) {
    268     return;
    269   }
    270   // Changing the sequence number length with queued frames in the creator
    271   // should hold the change until after any currently queued frames are
    272   // serialized.
    273 
    274   // Packet 1.
    275   // Queue a frame in the creator.
    276   EXPECT_FALSE(creator_.HasPendingFrames());
    277   QuicFrame ack_frame = QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)));
    278   creator_.AddSavedFrame(ack_frame);
    279 
    280   // Now change sequence number length.
    281   creator_.set_next_sequence_number_length(PACKET_4BYTE_SEQUENCE_NUMBER);
    282 
    283   // Add a STOP_WAITING frame since it contains a packet sequence number,
    284   // whose length should be 1.
    285   QuicStopWaitingFrame stop_waiting_frame;
    286   EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&stop_waiting_frame)));
    287   EXPECT_TRUE(creator_.HasPendingFrames());
    288 
    289   // Ensure the packet is successfully created.
    290   SerializedPacket serialized = creator_.SerializePacket();
    291   ASSERT_TRUE(serialized.packet);
    292   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
    293 
    294   // Verify that header in transmitted packet has 1 byte sequence length.
    295   QuicPacketHeader header;
    296   {
    297     InSequence s;
    298     EXPECT_CALL(framer_visitor_, OnPacket());
    299     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    300     EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    301     EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    302     EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce(
    303         DoAll(SaveArg<0>(&header), Return(true)));
    304     EXPECT_CALL(framer_visitor_, OnAckFrame(_));
    305     EXPECT_CALL(framer_visitor_, OnStopWaitingFrame(_));
    306     EXPECT_CALL(framer_visitor_, OnPacketComplete());
    307   }
    308   ProcessPacket(serialized.packet);
    309   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
    310             header.public_header.sequence_number_length);
    311   delete serialized.packet;
    312 
    313   // Packet 2.
    314   EXPECT_FALSE(creator_.HasPendingFrames());
    315   // Generate Packet 2 with one frame -- sequence number length should now
    316   // change to 4 bytes.
    317   EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&stop_waiting_frame)));
    318   EXPECT_TRUE(creator_.HasPendingFrames());
    319 
    320   // Ensure the packet is successfully created.
    321   serialized = creator_.SerializePacket();
    322   ASSERT_TRUE(serialized.packet);
    323   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
    324 
    325   // Verify that header in transmitted packet has 4 byte sequence length.
    326   {
    327     InSequence s;
    328     EXPECT_CALL(framer_visitor_, OnPacket());
    329     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    330     EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    331     EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    332     EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce(
    333         DoAll(SaveArg<0>(&header), Return(true)));
    334     EXPECT_CALL(framer_visitor_, OnStopWaitingFrame(_));
    335     EXPECT_CALL(framer_visitor_, OnPacketComplete());
    336   }
    337   ProcessPacket(serialized.packet);
    338   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
    339             header.public_header.sequence_number_length);
    340 
    341   delete serialized.packet;
    342   delete ack_frame.ack_frame;
    343 }
    344 
    345 TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
    346   // Test goal is to test the following sequence (P1 => generate Packet 1):
    347   // P1 <change seq num length> P2 FEC,
    348   // and we expect that sequence number length should not change until the end
    349   // of the open FEC group.
    350 
    351   // Enable FEC protection, and send FEC packet every 6 packets.
    352   EXPECT_TRUE(SwitchFecProtectionOn(6));
    353   // Should return false since we do not have enough packets in the FEC group to
    354   // trigger an FEC packet.
    355   ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
    356   frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u))));
    357 
    358   // Generate Packet 1.
    359   creator_.AddSavedFrame(frames_[0]);
    360   // Change the sequence number length mid-FEC group and it should not change.
    361   creator_.set_next_sequence_number_length(PACKET_4BYTE_SEQUENCE_NUMBER);
    362   SerializedPacket serialized = creator_.SerializePacket();
    363   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
    364 
    365   {
    366     InSequence s;
    367     EXPECT_CALL(framer_visitor_, OnPacket());
    368     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    369     EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    370     EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    371     EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
    372     EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
    373     EXPECT_CALL(framer_visitor_, OnAckFrame(_));
    374     EXPECT_CALL(framer_visitor_, OnPacketComplete());
    375   }
    376   ProcessPacket(serialized.packet);
    377   delete serialized.packet;
    378 
    379   // Generate Packet 2.
    380   creator_.AddSavedFrame(frames_[0]);
    381   serialized = creator_.SerializePacket();
    382   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
    383 
    384   {
    385     InSequence s;
    386     EXPECT_CALL(framer_visitor_, OnPacket());
    387     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    388     EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    389     EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    390     EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
    391     EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
    392     EXPECT_CALL(framer_visitor_, OnAckFrame(_));
    393     EXPECT_CALL(framer_visitor_, OnPacketComplete());
    394   }
    395   ProcessPacket(serialized.packet);
    396   delete serialized.packet;
    397 
    398   // Should return false since we do not have enough packets in the FEC group to
    399   // trigger an FEC packet.
    400   ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
    401   // Should return true since there are packets in the FEC group.
    402   ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
    403 
    404   // Force generation of FEC packet.
    405   serialized = creator_.SerializeFec();
    406   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
    407   ASSERT_EQ(3u, serialized.sequence_number);
    408 
    409   {
    410     InSequence s;
    411     EXPECT_CALL(framer_visitor_, OnPacket());
    412     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    413     EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    414     EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    415     EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
    416     EXPECT_CALL(framer_visitor_, OnFecData(_));
    417     EXPECT_CALL(framer_visitor_, OnPacketComplete());
    418   }
    419   ProcessPacket(serialized.packet);
    420   delete serialized.packet;
    421 
    422   // Ensure the next FEC group starts using the new sequence number length.
    423   serialized = creator_.SerializeAllFrames(frames_);
    424   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
    425   delete frames_[0].ack_frame;
    426   delete serialized.packet;
    427 }
    428 
    429 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) {
    430   // If the original packet sequence number length, the current sequence number
    431   // length, and the configured send sequence number length are different, the
    432   // retransmit must sent with the original length and the others do not change.
    433   creator_.set_next_sequence_number_length(PACKET_4BYTE_SEQUENCE_NUMBER);
    434   QuicPacketCreatorPeer::SetSequenceNumberLength(&creator_,
    435                                                  PACKET_2BYTE_SEQUENCE_NUMBER);
    436   frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
    437   SerializedPacket serialized =
    438       creator_.ReserializeAllFrames(frames_, PACKET_1BYTE_SEQUENCE_NUMBER);
    439   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
    440             creator_.next_sequence_number_length());
    441   EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
    442             QuicPacketCreatorPeer::GetSequenceNumberLength(&creator_));
    443   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
    444   delete frames_[0].stream_frame;
    445 
    446   {
    447     InSequence s;
    448     EXPECT_CALL(framer_visitor_, OnPacket());
    449     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    450     EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    451     EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    452     EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
    453     EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
    454     EXPECT_CALL(framer_visitor_, OnPacketComplete());
    455   }
    456   ProcessPacket(serialized.packet);
    457   delete serialized.packet;
    458 }
    459 
    460 TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
    461   QuicConnectionCloseFrame frame;
    462   frame.error_code = QUIC_NO_ERROR;
    463   frame.error_details = "error";
    464 
    465   SerializedPacket serialized = creator_.SerializeConnectionClose(&frame);
    466   ASSERT_EQ(1u, serialized.sequence_number);
    467   ASSERT_EQ(1u, creator_.sequence_number());
    468 
    469   InSequence s;
    470   EXPECT_CALL(framer_visitor_, OnPacket());
    471   EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    472   EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    473   EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    474   EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
    475   EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
    476   EXPECT_CALL(framer_visitor_, OnPacketComplete());
    477 
    478   ProcessPacket(serialized.packet);
    479   delete serialized.packet;
    480 }
    481 
    482 TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithNoGroup) {
    483   // Enable FEC protection.
    484   creator_.set_max_packets_per_fec_group(6);
    485   EXPECT_TRUE(creator_.IsFecEnabled());
    486   EXPECT_FALSE(creator_.IsFecProtected());
    487 
    488   // Turn on FEC protection.
    489   creator_.StartFecProtectingPackets();
    490   EXPECT_TRUE(creator_.IsFecProtected());
    491   // We have no packets in the FEC group, so no FEC packet can be created.
    492   EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/true));
    493   // Since no packets are in FEC group yet, we should be able to turn FEC
    494   // off with no trouble.
    495   creator_.StopFecProtectingPackets();
    496   EXPECT_FALSE(creator_.IsFecProtected());
    497 }
    498 
    499 TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithGroupInProgress) {
    500   // Enable FEC protection, and send FEC packet every 6 packets.
    501   EXPECT_TRUE(SwitchFecProtectionOn(6));
    502   frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
    503   SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
    504   delete frames_[0].stream_frame;
    505   delete serialized.packet;
    506 
    507   EXPECT_TRUE(creator_.IsFecProtected());
    508   // We do not have enough packets in the FEC group to trigger an FEC packet.
    509   EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
    510   // Should return true since there are packets in the FEC group.
    511   EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
    512 
    513   // Switching FEC off should not change creator state, since there is an
    514   // FEC packet under construction.
    515   EXPECT_DFATAL(creator_.StopFecProtectingPackets(),
    516                 "Cannot stop FEC protection with open FEC group.");
    517   EXPECT_TRUE(creator_.IsFecProtected());
    518   // Confirm that FEC packet is still under construction.
    519   EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
    520 
    521   serialized = creator_.SerializeFec();
    522   delete serialized.packet;
    523 
    524   // Switching FEC on/off should work now.
    525   creator_.StopFecProtectingPackets();
    526   EXPECT_FALSE(creator_.IsFecProtected());
    527   creator_.StartFecProtectingPackets();
    528   EXPECT_TRUE(creator_.IsFecProtected());
    529 }
    530 
    531 TEST_P(QuicPacketCreatorTest, SwitchFecOnWithStreamFrameQueued) {
    532   // Add a stream frame to the creator.
    533   QuicFrame frame;
    534   size_t consumed = creator_.CreateStreamFrame(
    535       1u, MakeIOVector("test"), 0u, false, &frame);
    536   EXPECT_EQ(4u, consumed);
    537   ASSERT_TRUE(frame.stream_frame);
    538   EXPECT_TRUE(creator_.AddSavedFrame(frame));
    539   EXPECT_TRUE(creator_.HasPendingFrames());
    540 
    541    // Enable FEC protection, and send FEC packet every 6 packets.
    542   creator_.set_max_packets_per_fec_group(6);
    543   EXPECT_TRUE(creator_.IsFecEnabled());
    544   EXPECT_DFATAL(creator_.StartFecProtectingPackets(),
    545                 "Cannot start FEC protection with pending frames.");
    546   EXPECT_FALSE(creator_.IsFecProtected());
    547 
    548   // Serialize packet for transmission.
    549   SerializedPacket serialized = creator_.SerializePacket();
    550   delete serialized.packet;
    551   delete serialized.retransmittable_frames;
    552   EXPECT_FALSE(creator_.HasPendingFrames());
    553 
    554   // Since all pending frames have been serialized, turning FEC on should work.
    555   creator_.StartFecProtectingPackets();
    556   EXPECT_TRUE(creator_.IsFecProtected());
    557 }
    558 
    559 TEST_P(QuicPacketCreatorTest, CreateStreamFrame) {
    560   QuicFrame frame;
    561   size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u,
    562                                                false, &frame);
    563   EXPECT_EQ(4u, consumed);
    564   CheckStreamFrame(frame, 1u, "test", 0u, false);
    565   delete frame.stream_frame;
    566 }
    567 
    568 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFin) {
    569   QuicFrame frame;
    570   size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 10u,
    571                                                true, &frame);
    572   EXPECT_EQ(4u, consumed);
    573   CheckStreamFrame(frame, 1u, "test", 10u, true);
    574   delete frame.stream_frame;
    575 }
    576 
    577 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFinOnly) {
    578   QuicFrame frame;
    579   size_t consumed = creator_.CreateStreamFrame(1u, IOVector(), 0u, true,
    580                                                &frame);
    581   EXPECT_EQ(0u, consumed);
    582   CheckStreamFrame(frame, 1u, string(), 0u, true);
    583   delete frame.stream_frame;
    584 }
    585 
    586 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
    587   const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP)
    588                           + GetEncryptionOverhead();
    589   for (size_t i = overhead; i < overhead + 100; ++i) {
    590     creator_.set_max_packet_length(i);
    591     const bool should_have_room = i > overhead + GetStreamFrameOverhead(
    592         NOT_IN_FEC_GROUP);
    593     ASSERT_EQ(should_have_room, creator_.HasRoomForStreamFrame(
    594                                     kClientDataStreamId1, kOffset));
    595     if (should_have_room) {
    596       QuicFrame frame;
    597       size_t bytes_consumed = creator_.CreateStreamFrame(
    598           kClientDataStreamId1, MakeIOVector("testdata"), kOffset, false,
    599           &frame);
    600       EXPECT_LT(0u, bytes_consumed);
    601       ASSERT_TRUE(creator_.AddSavedFrame(frame));
    602       SerializedPacket serialized_packet = creator_.SerializePacket();
    603       ASSERT_TRUE(serialized_packet.packet);
    604       delete serialized_packet.packet;
    605       delete serialized_packet.retransmittable_frames;
    606     }
    607   }
    608 }
    609 
    610 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
    611   // Compute the total overhead for a single frame in packet.
    612   const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP)
    613       + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP);
    614   size_t capacity = kDefaultMaxPacketSize - overhead;
    615   // Now, test various sizes around this size.
    616   for (int delta = -5; delta <= 5; ++delta) {
    617     string data(capacity + delta, 'A');
    618     size_t bytes_free = delta > 0 ? 0 : 0 - delta;
    619     QuicFrame frame;
    620     size_t bytes_consumed = creator_.CreateStreamFrame(
    621         kClientDataStreamId1, MakeIOVector(data), kOffset, false, &frame);
    622     EXPECT_EQ(capacity - bytes_free, bytes_consumed);
    623 
    624     ASSERT_TRUE(creator_.AddSavedFrame(frame));
    625     // BytesFree() returns bytes available for the next frame, which will
    626     // be two bytes smaller since the stream frame would need to be grown.
    627     EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
    628     size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
    629     EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
    630     SerializedPacket serialized_packet = creator_.SerializePacket();
    631     ASSERT_TRUE(serialized_packet.packet);
    632     delete serialized_packet.packet;
    633     delete serialized_packet.retransmittable_frames;
    634   }
    635 }
    636 
    637 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) {
    638   // Enable FEC protection, and send FEC packet every 6 packets.
    639   EXPECT_TRUE(SwitchFecProtectionOn(6));
    640   // Compute the total overhead for a single frame in packet.
    641   const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP)
    642       + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP);
    643   size_t capacity = kDefaultMaxPacketSize - overhead;
    644   // Now, test various sizes around this size.
    645   for (int delta = -5; delta <= 5; ++delta) {
    646     string data(capacity + delta, 'A');
    647     size_t bytes_free = delta > 0 ? 0 : 0 - delta;
    648     QuicFrame frame;
    649     size_t bytes_consumed = creator_.CreateStreamFrame(
    650         kClientDataStreamId1, MakeIOVector(data), kOffset, false, &frame);
    651     EXPECT_EQ(capacity - bytes_free, bytes_consumed);
    652 
    653     ASSERT_TRUE(creator_.AddSavedFrame(frame));
    654     // BytesFree() returns bytes available for the next frame. Since stream
    655     // frame does not grow for FEC protected packets, this should be the same
    656     // as bytes_free (bound by 0).
    657     EXPECT_EQ(0u, creator_.ExpansionOnNewFrame());
    658     size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0;
    659     EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
    660     SerializedPacket serialized_packet = creator_.SerializePacket();
    661     ASSERT_TRUE(serialized_packet.packet);
    662     delete serialized_packet.packet;
    663     delete serialized_packet.retransmittable_frames;
    664   }
    665 }
    666 
    667 TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
    668   // Compute the total overhead for a single frame in packet.
    669   const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP)
    670       + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP);
    671   ASSERT_GT(kMaxPacketSize, overhead);
    672   size_t capacity = kDefaultMaxPacketSize - overhead;
    673   // Now, test various sizes around this size.
    674   for (int delta = -5; delta <= 5; ++delta) {
    675     string data(capacity + delta, 'A');
    676     size_t bytes_free = delta > 0 ? 0 : 0 - delta;
    677 
    678     QuicFrame frame;
    679     size_t bytes_consumed = creator_.CreateStreamFrame(
    680         kCryptoStreamId, MakeIOVector(data), kOffset, false, &frame);
    681     EXPECT_LT(0u, bytes_consumed);
    682     ASSERT_TRUE(creator_.AddSavedFrame(frame));
    683     SerializedPacket serialized_packet = creator_.SerializePacket();
    684     ASSERT_TRUE(serialized_packet.packet);
    685     // If there is not enough space in the packet to fit a padding frame
    686     // (1 byte) and to expand the stream frame (another 2 bytes) the packet
    687     // will not be padded.
    688     if (bytes_free < 3) {
    689       EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize)
    690                 - bytes_free, serialized_packet.packet->length());
    691     } else {
    692       EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize),
    693                 serialized_packet.packet->length());
    694     }
    695     delete serialized_packet.packet;
    696     delete serialized_packet.retransmittable_frames;
    697   }
    698 }
    699 
    700 TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
    701   // Compute the total overhead for a single frame in packet.
    702   const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP)
    703       + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP);
    704   ASSERT_GT(kDefaultMaxPacketSize, overhead);
    705   size_t capacity = kDefaultMaxPacketSize - overhead;
    706   // Now, test various sizes around this size.
    707   for (int delta = -5; delta <= 5; ++delta) {
    708     string data(capacity + delta, 'A');
    709     size_t bytes_free = delta > 0 ? 0 : 0 - delta;
    710 
    711     QuicFrame frame;
    712     size_t bytes_consumed = creator_.CreateStreamFrame(
    713         kClientDataStreamId1, MakeIOVector(data), kOffset, false, &frame);
    714     EXPECT_LT(0u, bytes_consumed);
    715     ASSERT_TRUE(creator_.AddSavedFrame(frame));
    716     SerializedPacket serialized_packet = creator_.SerializePacket();
    717     ASSERT_TRUE(serialized_packet.packet);
    718     if (bytes_free > 0) {
    719       EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize)
    720                 - bytes_free, serialized_packet.packet->length());
    721     } else {
    722       EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize),
    723                 serialized_packet.packet->length());
    724     }
    725     delete serialized_packet.packet;
    726     delete serialized_packet.retransmittable_frames;
    727   }
    728 }
    729 
    730 TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
    731   QuicFramerPeer::SetIsServer(&client_framer_, true);
    732   QuicVersionVector versions;
    733   versions.push_back(test::QuicVersionMax());
    734   scoped_ptr<QuicEncryptedPacket> encrypted(
    735       creator_.SerializeVersionNegotiationPacket(versions));
    736 
    737   {
    738     InSequence s;
    739     EXPECT_CALL(framer_visitor_, OnPacket());
    740     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    741     EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
    742   }
    743   QuicFramerPeer::SetIsServer(&client_framer_, false);
    744   client_framer_.ProcessPacket(*encrypted);
    745 }
    746 
    747 TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
    748   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
    749             creator_.next_sequence_number_length());
    750 
    751   creator_.set_sequence_number(64);
    752   creator_.UpdateSequenceNumberLength(2, 10000);
    753   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
    754             creator_.next_sequence_number_length());
    755 
    756   creator_.set_sequence_number(64 * 256);
    757   creator_.UpdateSequenceNumberLength(2, 10000);
    758   EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
    759             creator_.next_sequence_number_length());
    760 
    761   creator_.set_sequence_number(64 * 256 * 256);
    762   creator_.UpdateSequenceNumberLength(2, 10000);
    763   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
    764             creator_.next_sequence_number_length());
    765 
    766   creator_.set_sequence_number(GG_UINT64_C(64) * 256 * 256 * 256 * 256);
    767   creator_.UpdateSequenceNumberLength(2, 10000);
    768   EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER,
    769             creator_.next_sequence_number_length());
    770 }
    771 
    772 TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthBandwidth) {
    773   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
    774             creator_.next_sequence_number_length());
    775 
    776   creator_.UpdateSequenceNumberLength(1, 10000);
    777   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
    778             creator_.next_sequence_number_length());
    779 
    780   creator_.UpdateSequenceNumberLength(1, 10000 * 256);
    781   EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
    782             creator_.next_sequence_number_length());
    783 
    784   creator_.UpdateSequenceNumberLength(1, 10000 * 256 * 256);
    785   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
    786             creator_.next_sequence_number_length());
    787 
    788   creator_.UpdateSequenceNumberLength(
    789       1, GG_UINT64_C(1000) * 256 * 256 * 256 * 256);
    790   EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER,
    791             creator_.next_sequence_number_length());
    792 }
    793 
    794 TEST_P(QuicPacketCreatorTest, CreateStreamFrameWithNotifier) {
    795   // Ensure that if CreateStreamFrame does not consume any data (e.g. a FIN only
    796   // frame) then any QuicAckNotifier that is passed in still gets attached to
    797   // the frame.
    798   scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
    799   QuicAckNotifier notifier(delegate.get());
    800   QuicFrame frame;
    801   IOVector empty_iovector;
    802   bool fin = true;
    803   size_t consumed_bytes = creator_.CreateStreamFrameWithNotifier(
    804       1u, empty_iovector, 0u, fin, &notifier, &frame);
    805   EXPECT_EQ(0u, consumed_bytes);
    806   EXPECT_EQ(&notifier, frame.stream_frame->notifier);
    807   delete frame.stream_frame;
    808 }
    809 
    810 TEST_P(QuicPacketCreatorTest, SerializeFrame) {
    811   if (!GetParam().version_serialization) {
    812     creator_.StopSendingVersion();
    813   }
    814   frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
    815   SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
    816   delete frames_[0].stream_frame;
    817 
    818   QuicPacketHeader header;
    819   {
    820     InSequence s;
    821     EXPECT_CALL(framer_visitor_, OnPacket());
    822     EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
    823     EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
    824     EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
    825     EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce(
    826         DoAll(SaveArg<0>(&header), Return(true)));
    827     EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
    828     EXPECT_CALL(framer_visitor_, OnPacketComplete());
    829   }
    830   ProcessPacket(serialized.packet);
    831   EXPECT_EQ(GetParam().version_serialization,
    832             header.public_header.version_flag);
    833   delete serialized.packet;
    834 }
    835 
    836 TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) {
    837   if (!GetParam().version_serialization) {
    838     creator_.StopSendingVersion();
    839   }
    840   // A string larger than fits into a frame.
    841   size_t payload_length;
    842   creator_.set_max_packet_length(GetPacketLengthForOneStream(
    843       client_framer_.version(),
    844       QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
    845       PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP, &payload_length));
    846   QuicFrame frame;
    847   const string too_long_payload(payload_length * 2, 'a');
    848   size_t consumed = creator_.CreateStreamFrame(
    849       1u, MakeIOVector(too_long_payload), 0u, true, &frame);
    850   EXPECT_EQ(payload_length, consumed);
    851   const string payload(payload_length, 'a');
    852   CheckStreamFrame(frame, 1u, payload, 0u, false);
    853   delete frame.stream_frame;
    854 }
    855 
    856 TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) {
    857   if (!GetParam().version_serialization) {
    858     creator_.StopSendingVersion();
    859   }
    860   const size_t max_plaintext_size =
    861       client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
    862   EXPECT_FALSE(creator_.HasPendingFrames());
    863   EXPECT_EQ(max_plaintext_size -
    864             GetPacketHeaderSize(
    865                 creator_.connection_id_length(),
    866                 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
    867                 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
    868             creator_.BytesFree());
    869 
    870   // Add a variety of frame types and then a padding frame.
    871   QuicAckFrame ack_frame(MakeAckFrame(0u, 0u));
    872   EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
    873   EXPECT_TRUE(creator_.HasPendingFrames());
    874 
    875   QuicCongestionFeedbackFrame congestion_feedback;
    876   congestion_feedback.type = kFixRate;
    877   EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&congestion_feedback)));
    878   EXPECT_TRUE(creator_.HasPendingFrames());
    879 
    880   QuicFrame frame;
    881   size_t consumed = creator_.CreateStreamFrame(
    882       1u, MakeIOVector("test"), 0u, false, &frame);
    883   EXPECT_EQ(4u, consumed);
    884   ASSERT_TRUE(frame.stream_frame);
    885   EXPECT_TRUE(creator_.AddSavedFrame(frame));
    886   EXPECT_TRUE(creator_.HasPendingFrames());
    887 
    888   QuicPaddingFrame padding_frame;
    889   EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&padding_frame)));
    890   EXPECT_TRUE(creator_.HasPendingFrames());
    891   EXPECT_EQ(0u, creator_.BytesFree());
    892 
    893   EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
    894 
    895   // Ensure the packet is successfully created.
    896   SerializedPacket serialized = creator_.SerializePacket();
    897   ASSERT_TRUE(serialized.packet);
    898   delete serialized.packet;
    899   ASSERT_TRUE(serialized.retransmittable_frames);
    900   RetransmittableFrames* retransmittable = serialized.retransmittable_frames;
    901   ASSERT_EQ(1u, retransmittable->frames().size());
    902   EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type);
    903   ASSERT_TRUE(retransmittable->frames()[0].stream_frame);
    904   delete serialized.retransmittable_frames;
    905 
    906   EXPECT_FALSE(creator_.HasPendingFrames());
    907   EXPECT_EQ(max_plaintext_size -
    908             GetPacketHeaderSize(
    909                 creator_.connection_id_length(),
    910                 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
    911                 PACKET_1BYTE_SEQUENCE_NUMBER,
    912                 NOT_IN_FEC_GROUP),
    913             creator_.BytesFree());
    914 }
    915 
    916 TEST_P(QuicPacketCreatorTest, SerializeTruncatedAckFrameWithLargePacketSize) {
    917   if (!GetParam().version_serialization) {
    918     creator_.StopSendingVersion();
    919   }
    920   creator_.set_max_packet_length(kMaxPacketSize);
    921   const size_t max_plaintext_size =
    922       client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
    923 
    924   // Serialized length of ack frame with 2000 nack ranges should be limited by
    925   // the number of nack ranges that can be fit in an ack frame.
    926   QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(2000u, 0u);
    927   size_t frame_len = client_framer_.GetSerializedFrameLength(
    928       QuicFrame(&ack_frame), creator_.BytesFree(), true, true,
    929       NOT_IN_FEC_GROUP, PACKET_1BYTE_SEQUENCE_NUMBER);
    930   EXPECT_GT(creator_.BytesFree(), frame_len);
    931   EXPECT_GT(max_plaintext_size, creator_.PacketSize());
    932 
    933   // Add ack frame to creator.
    934   EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
    935   EXPECT_TRUE(creator_.HasPendingFrames());
    936   EXPECT_GT(max_plaintext_size, creator_.PacketSize());
    937   EXPECT_LT(0u, creator_.BytesFree());
    938 
    939   // Make sure that an additional stream frame can be added to the packet.
    940   QuicFrame stream_frame;
    941   size_t consumed = creator_.CreateStreamFrame(
    942       2u, MakeIOVector("test"), 0u, false, &stream_frame);
    943   EXPECT_EQ(4u, consumed);
    944   ASSERT_TRUE(stream_frame.stream_frame);
    945   EXPECT_TRUE(creator_.AddSavedFrame(stream_frame));
    946   EXPECT_TRUE(creator_.HasPendingFrames());
    947 
    948   // Ensure the packet is successfully created, and the packet size estimate
    949   // matches the serialized packet length.
    950   EXPECT_CALL(entropy_calculator_,
    951              EntropyHash(_)).WillOnce(testing::Return(0));
    952   size_t est_packet_size = creator_.PacketSize();
    953   SerializedPacket serialized = creator_.SerializePacket();
    954   ASSERT_TRUE(serialized.packet);
    955   EXPECT_EQ(est_packet_size, serialized.packet->length());
    956   delete serialized.retransmittable_frames;
    957   delete serialized.packet;
    958 }
    959 
    960 TEST_P(QuicPacketCreatorTest, SerializeTruncatedAckFrameWithSmallPacketSize) {
    961   if (!GetParam().version_serialization) {
    962     creator_.StopSendingVersion();
    963   }
    964   creator_.set_max_packet_length(500u);
    965 
    966   const size_t max_plaintext_size =
    967       client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
    968   EXPECT_EQ(max_plaintext_size - creator_.PacketSize(), creator_.BytesFree());
    969 
    970   // Serialized length of ack frame with 2000 nack ranges should be limited by
    971   // the packet size.
    972   QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(2000u, 0u);
    973   size_t frame_len = client_framer_.GetSerializedFrameLength(
    974       QuicFrame(&ack_frame), creator_.BytesFree(), true, true,
    975       NOT_IN_FEC_GROUP, PACKET_1BYTE_SEQUENCE_NUMBER);
    976   EXPECT_EQ(creator_.BytesFree(), frame_len);
    977 
    978   // Add ack frame to creator.
    979   EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
    980   EXPECT_TRUE(creator_.HasPendingFrames());
    981   EXPECT_EQ(max_plaintext_size, creator_.PacketSize());
    982   EXPECT_EQ(0u, creator_.BytesFree());
    983 
    984   // Ensure the packet is successfully created, and the packet size estimate
    985   // may not match the serialized packet length.
    986   EXPECT_CALL(entropy_calculator_,
    987              EntropyHash(_)).WillOnce(Return(0));
    988   size_t est_packet_size = creator_.PacketSize();
    989   SerializedPacket serialized = creator_.SerializePacket();
    990   ASSERT_TRUE(serialized.packet);
    991   EXPECT_GE(est_packet_size, serialized.packet->length());
    992   delete serialized.packet;
    993 }
    994 
    995 
    996 TEST_P(QuicPacketCreatorTest, EntropyFlag) {
    997   frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
    998 
    999   for (int i = 0; i < 2; ++i) {
   1000     for (int j = 0; j < 64; ++j) {
   1001       SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
   1002       // Verify both BoolSource and hash algorithm.
   1003       bool expected_rand_bool =
   1004           (mock_random_.RandUint64() & (GG_UINT64_C(1) << j)) != 0;
   1005       bool observed_rand_bool =
   1006           (serialized.entropy_hash & (1 << ((j+1) % 8))) != 0;
   1007       uint8 rest_of_hash = serialized.entropy_hash & ~(1 << ((j+1) % 8));
   1008       EXPECT_EQ(expected_rand_bool, observed_rand_bool);
   1009       EXPECT_EQ(0, rest_of_hash);
   1010       delete serialized.packet;
   1011     }
   1012     // After 64 calls, BoolSource will refresh the bucket - make sure it does.
   1013     mock_random_.ChangeValue();
   1014   }
   1015 
   1016   delete frames_[0].stream_frame;
   1017 }
   1018 
   1019 }  // namespace
   1020 }  // namespace test
   1021 }  // namespace net
   1022