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_generator.h"
      6 
      7 #include <string>
      8 
      9 #include "net/quic/crypto/crypto_protocol.h"
     10 #include "net/quic/crypto/null_encrypter.h"
     11 #include "net/quic/crypto/quic_decrypter.h"
     12 #include "net/quic/crypto/quic_encrypter.h"
     13 #include "net/quic/quic_utils.h"
     14 #include "net/quic/test_tools/quic_packet_creator_peer.h"
     15 #include "net/quic/test_tools/quic_packet_generator_peer.h"
     16 #include "net/quic/test_tools/quic_test_utils.h"
     17 #include "net/quic/test_tools/simple_quic_framer.h"
     18 #include "testing/gmock/include/gmock/gmock.h"
     19 #include "testing/gtest/include/gtest/gtest.h"
     20 
     21 using base::StringPiece;
     22 using std::string;
     23 using testing::InSequence;
     24 using testing::Return;
     25 using testing::SaveArg;
     26 using testing::StrictMock;
     27 using testing::_;
     28 
     29 namespace net {
     30 namespace test {
     31 namespace {
     32 
     33 class MockDelegate : public QuicPacketGenerator::DelegateInterface {
     34  public:
     35   MockDelegate() {}
     36   virtual ~MockDelegate() OVERRIDE {}
     37 
     38   MOCK_METHOD3(ShouldGeneratePacket,
     39                bool(TransmissionType transmission_type,
     40                     HasRetransmittableData retransmittable,
     41                     IsHandshake handshake));
     42   MOCK_METHOD0(CreateAckFrame, QuicAckFrame*());
     43   MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*());
     44   MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*());
     45   MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet));
     46   MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool));
     47 
     48   void SetCanWriteAnything() {
     49     EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _))
     50         .WillRepeatedly(Return(true));
     51     EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION,
     52                                             NO_RETRANSMITTABLE_DATA, _))
     53         .WillRepeatedly(Return(true));
     54   }
     55 
     56   void SetCanNotWrite() {
     57     EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _))
     58         .WillRepeatedly(Return(false));
     59     EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION,
     60                                             NO_RETRANSMITTABLE_DATA, _))
     61         .WillRepeatedly(Return(false));
     62   }
     63 
     64   // Use this when only ack and feedback frames should be allowed to be written.
     65   void SetCanWriteOnlyNonRetransmittable() {
     66     EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _))
     67         .WillRepeatedly(Return(false));
     68     EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION,
     69                                             NO_RETRANSMITTABLE_DATA, _))
     70         .WillRepeatedly(Return(true));
     71   }
     72 
     73  private:
     74   DISALLOW_COPY_AND_ASSIGN(MockDelegate);
     75 };
     76 
     77 // Simple struct for describing the contents of a packet.
     78 // Useful in conjunction with a SimpleQuicFrame for validating
     79 // that a packet contains the expected frames.
     80 struct PacketContents {
     81   PacketContents()
     82       : num_ack_frames(0),
     83         num_connection_close_frames(0),
     84         num_feedback_frames(0),
     85         num_goaway_frames(0),
     86         num_rst_stream_frames(0),
     87         num_stop_waiting_frames(0),
     88         num_stream_frames(0),
     89         fec_group(0) {
     90   }
     91 
     92   size_t num_ack_frames;
     93   size_t num_connection_close_frames;
     94   size_t num_feedback_frames;
     95   size_t num_goaway_frames;
     96   size_t num_rst_stream_frames;
     97   size_t num_stop_waiting_frames;
     98   size_t num_stream_frames;
     99 
    100   QuicFecGroupNumber fec_group;
    101 };
    102 
    103 }  // namespace
    104 
    105 class QuicPacketGeneratorTest : public ::testing::Test {
    106  protected:
    107   QuicPacketGeneratorTest()
    108       : framer_(QuicSupportedVersions(), QuicTime::Zero(), false),
    109         generator_(42, &framer_, &random_, &delegate_),
    110         creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)),
    111         packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL),
    112         packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL),
    113         packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL),
    114         packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL),
    115         packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL),
    116         packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL),
    117         packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL) {
    118   }
    119 
    120   virtual ~QuicPacketGeneratorTest() OVERRIDE {
    121     delete packet_.packet;
    122     delete packet_.retransmittable_frames;
    123     delete packet2_.packet;
    124     delete packet2_.retransmittable_frames;
    125     delete packet3_.packet;
    126     delete packet3_.retransmittable_frames;
    127     delete packet4_.packet;
    128     delete packet4_.retransmittable_frames;
    129     delete packet5_.packet;
    130     delete packet5_.retransmittable_frames;
    131     delete packet6_.packet;
    132     delete packet6_.retransmittable_frames;
    133     delete packet7_.packet;
    134     delete packet7_.retransmittable_frames;
    135   }
    136 
    137   QuicAckFrame* CreateAckFrame() {
    138     // TODO(rch): Initialize this so it can be verified later.
    139     return new QuicAckFrame(MakeAckFrame(0));
    140   }
    141 
    142   QuicCongestionFeedbackFrame* CreateFeedbackFrame() {
    143     QuicCongestionFeedbackFrame* frame = new QuicCongestionFeedbackFrame;
    144     frame->type = kTCP;
    145     frame->tcp.receive_window = 0x4030;
    146     return frame;
    147   }
    148 
    149   QuicStopWaitingFrame* CreateStopWaitingFrame() {
    150     QuicStopWaitingFrame* frame = new QuicStopWaitingFrame();
    151     frame->entropy_hash = 0;
    152     frame->least_unacked = 0;
    153     return frame;
    154   }
    155 
    156   QuicRstStreamFrame* CreateRstStreamFrame() {
    157     return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0);
    158   }
    159 
    160   QuicGoAwayFrame* CreateGoAwayFrame() {
    161     return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string());
    162   }
    163 
    164   void CheckPacketContains(const PacketContents& contents,
    165                            const SerializedPacket& packet) {
    166     size_t num_retransmittable_frames = contents.num_connection_close_frames +
    167         contents.num_goaway_frames + contents.num_rst_stream_frames +
    168         contents.num_stream_frames;
    169     size_t num_frames = contents.num_feedback_frames + contents.num_ack_frames +
    170         contents.num_stop_waiting_frames + num_retransmittable_frames;
    171 
    172     if (num_retransmittable_frames == 0) {
    173       ASSERT_TRUE(packet.retransmittable_frames == NULL);
    174     } else {
    175       ASSERT_TRUE(packet.retransmittable_frames != NULL);
    176       EXPECT_EQ(num_retransmittable_frames,
    177                 packet.retransmittable_frames->frames().size());
    178     }
    179 
    180     ASSERT_TRUE(packet.packet != NULL);
    181     ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet));
    182     EXPECT_EQ(num_frames, simple_framer_.num_frames());
    183     EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size());
    184     EXPECT_EQ(contents.num_connection_close_frames,
    185               simple_framer_.connection_close_frames().size());
    186     EXPECT_EQ(contents.num_feedback_frames,
    187               simple_framer_.feedback_frames().size());
    188     EXPECT_EQ(contents.num_goaway_frames,
    189               simple_framer_.goaway_frames().size());
    190     EXPECT_EQ(contents.num_rst_stream_frames,
    191               simple_framer_.rst_stream_frames().size());
    192     EXPECT_EQ(contents.num_stream_frames,
    193               simple_framer_.stream_frames().size());
    194     EXPECT_EQ(contents.num_stop_waiting_frames,
    195               simple_framer_.stop_waiting_frames().size());
    196     EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group);
    197   }
    198 
    199   void CheckPacketHasSingleStreamFrame(const SerializedPacket& packet) {
    200     ASSERT_TRUE(packet.retransmittable_frames != NULL);
    201     EXPECT_EQ(1u, packet.retransmittable_frames->frames().size());
    202     ASSERT_TRUE(packet.packet != NULL);
    203     ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet));
    204     EXPECT_EQ(1u, simple_framer_.num_frames());
    205     EXPECT_EQ(1u, simple_framer_.stream_frames().size());
    206   }
    207 
    208   void CheckPacketIsFec(const SerializedPacket& packet,
    209                         QuicPacketSequenceNumber fec_group) {
    210     ASSERT_TRUE(packet.retransmittable_frames == NULL);
    211     ASSERT_TRUE(packet.packet != NULL);
    212     ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet));
    213     EXPECT_TRUE(simple_framer_.header().fec_flag);
    214     EXPECT_EQ(fec_group, simple_framer_.fec_data().fec_group);
    215   }
    216 
    217   IOVector CreateData(size_t len) {
    218     data_array_.reset(new char[len]);
    219     memset(data_array_.get(), '?', len);
    220     IOVector data;
    221     data.Append(data_array_.get(), len);
    222     return data;
    223   }
    224 
    225   QuicFramer framer_;
    226   MockRandom random_;
    227   StrictMock<MockDelegate> delegate_;
    228   QuicPacketGenerator generator_;
    229   QuicPacketCreator* creator_;
    230   SimpleQuicFramer simple_framer_;
    231   SerializedPacket packet_;
    232   SerializedPacket packet2_;
    233   SerializedPacket packet3_;
    234   SerializedPacket packet4_;
    235   SerializedPacket packet5_;
    236   SerializedPacket packet6_;
    237   SerializedPacket packet7_;
    238 
    239  private:
    240   scoped_ptr<char[]> data_array_;
    241 };
    242 
    243 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegate {
    244  public:
    245   MOCK_METHOD1(OnFrameAddedToPacket,
    246                void(const QuicFrame&));
    247 };
    248 
    249 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) {
    250   delegate_.SetCanNotWrite();
    251 
    252   generator_.SetShouldSendAck(false, false);
    253   EXPECT_TRUE(generator_.HasQueuedFrames());
    254 }
    255 
    256 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) {
    257   StrictMock<MockDebugDelegate> debug_delegate;
    258 
    259   generator_.set_debug_delegate(&debug_delegate);
    260   delegate_.SetCanWriteOnlyNonRetransmittable();
    261   generator_.StartBatchOperations();
    262 
    263   EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
    264   EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1);
    265 
    266   generator_.SetShouldSendAck(false, false);
    267   EXPECT_TRUE(generator_.HasQueuedFrames());
    268 }
    269 
    270 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) {
    271   delegate_.SetCanWriteOnlyNonRetransmittable();
    272 
    273   EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
    274   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
    275 
    276   generator_.SetShouldSendAck(false, false);
    277   EXPECT_FALSE(generator_.HasQueuedFrames());
    278 
    279   PacketContents contents;
    280   contents.num_ack_frames = 1;
    281   CheckPacketContains(contents, packet_);
    282 }
    283 
    284 TEST_F(QuicPacketGeneratorTest,
    285        ShouldSendAckWithFeedback_WritableAndShouldNotFlush) {
    286   delegate_.SetCanWriteOnlyNonRetransmittable();
    287   generator_.StartBatchOperations();
    288 
    289   EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
    290   EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
    291       Return(CreateFeedbackFrame()));
    292 
    293   generator_.SetShouldSendAck(true, false);
    294   EXPECT_TRUE(generator_.HasQueuedFrames());
    295 }
    296 
    297 TEST_F(QuicPacketGeneratorTest,
    298        ShouldSendAckWithFeedback_WritableAndShouldFlush) {
    299   delegate_.SetCanWriteOnlyNonRetransmittable();
    300 
    301   EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
    302   EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
    303       Return(CreateFeedbackFrame()));
    304   EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce(
    305       Return(CreateStopWaitingFrame()));
    306 
    307   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
    308 
    309   generator_.SetShouldSendAck(true, true);
    310   EXPECT_FALSE(generator_.HasQueuedFrames());
    311 
    312   PacketContents contents;
    313   contents.num_ack_frames = 1;
    314   contents.num_feedback_frames = 1;
    315   contents.num_stop_waiting_frames = 1;
    316   CheckPacketContains(contents, packet_);
    317 }
    318 
    319 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) {
    320   delegate_.SetCanNotWrite();
    321 
    322   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    323   EXPECT_TRUE(generator_.HasQueuedFrames());
    324 }
    325 
    326 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) {
    327   delegate_.SetCanWriteOnlyNonRetransmittable();
    328 
    329   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    330   EXPECT_TRUE(generator_.HasQueuedFrames());
    331 }
    332 
    333 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) {
    334   delegate_.SetCanWriteAnything();
    335   generator_.StartBatchOperations();
    336 
    337   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    338   EXPECT_TRUE(generator_.HasQueuedFrames());
    339 }
    340 
    341 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) {
    342   delegate_.SetCanNotWrite();
    343   generator_.StartBatchOperations();
    344 
    345   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    346   EXPECT_TRUE(generator_.HasQueuedFrames());
    347   generator_.FinishBatchOperations();
    348   EXPECT_TRUE(generator_.HasQueuedFrames());
    349 
    350   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
    351   generator_.FlushAllQueuedFrames();
    352   EXPECT_FALSE(generator_.HasQueuedFrames());
    353 
    354   PacketContents contents;
    355   contents.num_rst_stream_frames = 1;
    356   CheckPacketContains(contents, packet_);
    357 }
    358 
    359 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) {
    360   delegate_.SetCanWriteAnything();
    361 
    362   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
    363 
    364   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    365   EXPECT_FALSE(generator_.HasQueuedFrames());
    366 
    367   PacketContents contents;
    368   contents.num_rst_stream_frames = 1;
    369   CheckPacketContains(contents, packet_);
    370 }
    371 
    372 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) {
    373   delegate_.SetCanNotWrite();
    374 
    375   QuicConsumedData consumed = generator_.ConsumeData(
    376       kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL);
    377   EXPECT_EQ(0u, consumed.bytes_consumed);
    378   EXPECT_FALSE(consumed.fin_consumed);
    379   EXPECT_FALSE(generator_.HasQueuedFrames());
    380 }
    381 
    382 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) {
    383   delegate_.SetCanWriteAnything();
    384   generator_.StartBatchOperations();
    385 
    386   QuicConsumedData consumed = generator_.ConsumeData(
    387       kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL);
    388   EXPECT_EQ(3u, consumed.bytes_consumed);
    389   EXPECT_TRUE(consumed.fin_consumed);
    390   EXPECT_TRUE(generator_.HasQueuedFrames());
    391 }
    392 
    393 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) {
    394   delegate_.SetCanWriteAnything();
    395 
    396   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
    397   QuicConsumedData consumed = generator_.ConsumeData(
    398       kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL);
    399   EXPECT_EQ(3u, consumed.bytes_consumed);
    400   EXPECT_TRUE(consumed.fin_consumed);
    401   EXPECT_FALSE(generator_.HasQueuedFrames());
    402 
    403   PacketContents contents;
    404   contents.num_stream_frames = 1;
    405   CheckPacketContains(contents, packet_);
    406 }
    407 
    408 TEST_F(QuicPacketGeneratorTest,
    409        ConsumeDataMultipleTimes_WritableAndShouldNotFlush) {
    410   delegate_.SetCanWriteAnything();
    411   generator_.StartBatchOperations();
    412 
    413   generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true,
    414                          MAY_FEC_PROTECT, NULL);
    415   QuicConsumedData consumed = generator_.ConsumeData(
    416       3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL);
    417   EXPECT_EQ(4u, consumed.bytes_consumed);
    418   EXPECT_FALSE(consumed.fin_consumed);
    419   EXPECT_TRUE(generator_.HasQueuedFrames());
    420 }
    421 
    422 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) {
    423   delegate_.SetCanWriteAnything();
    424   generator_.StartBatchOperations();
    425 
    426   generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true,
    427                          MAY_FEC_PROTECT, NULL);
    428   QuicConsumedData consumed = generator_.ConsumeData(
    429       3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL);
    430   EXPECT_EQ(4u, consumed.bytes_consumed);
    431   EXPECT_FALSE(consumed.fin_consumed);
    432   EXPECT_TRUE(generator_.HasQueuedFrames());
    433 
    434   // Now both frames will be flushed out.
    435   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
    436   generator_.FinishBatchOperations();
    437   EXPECT_FALSE(generator_.HasQueuedFrames());
    438 
    439   PacketContents contents;
    440   contents.num_stream_frames = 2;
    441   CheckPacketContains(contents, packet_);
    442 }
    443 
    444 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) {
    445   delegate_.SetCanWriteAnything();
    446 
    447   // Send FEC every two packets.
    448   creator_->set_max_packets_per_fec_group(2);
    449 
    450   {
    451     InSequence dummy;
    452     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    453         SaveArg<0>(&packet_));
    454     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    455         SaveArg<0>(&packet2_));
    456     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    457         SaveArg<0>(&packet3_));
    458     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    459         SaveArg<0>(&packet4_));
    460     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    461         SaveArg<0>(&packet5_));
    462   }
    463 
    464   // Send enough data to create 3 packets: two full and one partial. Send
    465   // with MUST_FEC_PROTECT flag.
    466   size_t data_len = 2 * kDefaultMaxPacketSize + 100;
    467   QuicConsumedData consumed =
    468       generator_.ConsumeData(3, CreateData(data_len), 0, true,
    469                              MUST_FEC_PROTECT, NULL);
    470   EXPECT_EQ(data_len, consumed.bytes_consumed);
    471   EXPECT_TRUE(consumed.fin_consumed);
    472   EXPECT_FALSE(generator_.HasQueuedFrames());
    473 
    474   CheckPacketHasSingleStreamFrame(packet_);
    475   CheckPacketHasSingleStreamFrame(packet2_);
    476   CheckPacketIsFec(packet3_, 1);
    477 
    478   CheckPacketHasSingleStreamFrame(packet4_);
    479   CheckPacketIsFec(packet5_, 4);
    480 }
    481 
    482 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) {
    483   delegate_.SetCanWriteAnything();
    484 
    485   // Enable FEC.
    486   creator_->set_max_packets_per_fec_group(6);
    487   {
    488     InSequence dummy;
    489     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    490         SaveArg<0>(&packet_));
    491     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    492         SaveArg<0>(&packet2_));
    493     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    494         SaveArg<0>(&packet3_));
    495   }
    496 
    497   // Send enough data to create 2 packets: one full and one partial. Send
    498   // with MUST_FEC_PROTECT flag.
    499   size_t data_len = 1 * kDefaultMaxPacketSize + 100;
    500   QuicConsumedData consumed =
    501       generator_.ConsumeData(3, CreateData(data_len), 0, true,
    502                              MUST_FEC_PROTECT, NULL);
    503   EXPECT_EQ(data_len, consumed.bytes_consumed);
    504   EXPECT_TRUE(consumed.fin_consumed);
    505   EXPECT_FALSE(generator_.HasQueuedFrames());
    506 
    507   CheckPacketHasSingleStreamFrame(packet_);
    508   CheckPacketHasSingleStreamFrame(packet2_);
    509   CheckPacketIsFec(packet3_, 1);
    510 }
    511 
    512 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) {
    513   // Set the packet size be enough for two stream frames with 0 stream offset,
    514   // but not enough for a stream frame of 0 offset and one with non-zero offset.
    515   size_t length =
    516       NullEncrypter().GetCiphertextSize(0) +
    517       GetPacketHeaderSize(creator_->connection_id_length(),
    518                           true,
    519                           creator_->next_sequence_number_length(),
    520                           NOT_IN_FEC_GROUP) +
    521       // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger
    522       // than the GetMinStreamFrameSize.
    523       QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 +
    524       QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1;
    525   creator_->set_max_packet_length(length);
    526   delegate_.SetCanWriteAnything();
    527   {
    528      InSequence dummy;
    529      EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    530          SaveArg<0>(&packet_));
    531      EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    532          SaveArg<0>(&packet2_));
    533   }
    534   generator_.StartBatchOperations();
    535   // Queue enough data to prevent a stream frame with a non-zero offset from
    536   // fitting.
    537   QuicConsumedData consumed = generator_.ConsumeData(
    538       kHeadersStreamId, MakeIOVector("foo"), 0, false, MAY_FEC_PROTECT, NULL);
    539   EXPECT_EQ(3u, consumed.bytes_consumed);
    540   EXPECT_FALSE(consumed.fin_consumed);
    541   EXPECT_TRUE(generator_.HasQueuedFrames());
    542 
    543   // This frame will not fit with the existing frame, causing the queued frame
    544   // to be serialized, and it will not fit with another frame like it, so it is
    545   // serialized by itself.
    546   consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3,
    547                                     true, MAY_FEC_PROTECT, NULL);
    548   EXPECT_EQ(3u, consumed.bytes_consumed);
    549   EXPECT_TRUE(consumed.fin_consumed);
    550   EXPECT_FALSE(generator_.HasQueuedFrames());
    551 
    552   PacketContents contents;
    553   contents.num_stream_frames = 1;
    554   CheckPacketContains(contents, packet_);
    555   CheckPacketContains(contents, packet2_);
    556 }
    557 
    558 TEST_F(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) {
    559   delegate_.SetCanWriteAnything();
    560   creator_->set_max_packets_per_fec_group(50);
    561   EXPECT_EQ(50u, creator_->max_packets_per_fec_group());
    562   EXPECT_FALSE(creator_->IsFecGroupOpen());
    563 
    564   // On reduced cwnd.
    565   generator_.OnCongestionWindowChange(7 * kDefaultTCPMSS);
    566   EXPECT_EQ(3u, creator_->max_packets_per_fec_group());
    567 
    568   // On increased cwnd.
    569   generator_.OnCongestionWindowChange(100 * kDefaultTCPMSS);
    570   EXPECT_EQ(50u, creator_->max_packets_per_fec_group());
    571 
    572   // On collapsed cwnd.
    573   generator_.OnCongestionWindowChange(1 * kDefaultTCPMSS);
    574   EXPECT_EQ(2u, creator_->max_packets_per_fec_group());
    575 }
    576 
    577 TEST_F(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) {
    578   delegate_.SetCanWriteAnything();
    579   // TODO(jri): This starting of batch mode should not be required when
    580   // FEC sending is separated from batching operations.
    581   generator_.StartBatchOperations();
    582   creator_->set_max_packets_per_fec_group(50);
    583   EXPECT_EQ(50u, creator_->max_packets_per_fec_group());
    584   EXPECT_FALSE(creator_->IsFecGroupOpen());
    585 
    586   // Send enough data to create 4 packets with MUST_FEC_PROTECT flag.
    587   // 3 packets are sent, one is queued in the creator.
    588   {
    589     InSequence dummy;
    590     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    591         SaveArg<0>(&packet_));
    592     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    593         SaveArg<0>(&packet2_));
    594     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    595         SaveArg<0>(&packet3_));
    596   }
    597   size_t data_len = 3 * kDefaultMaxPacketSize + 1;
    598   QuicConsumedData consumed = generator_.ConsumeData(
    599       7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL);
    600   EXPECT_EQ(data_len, consumed.bytes_consumed);
    601   EXPECT_TRUE(creator_->IsFecGroupOpen());
    602 
    603   // Change FEC groupsize.
    604   generator_.OnCongestionWindowChange(2 * kDefaultTCPMSS);
    605   EXPECT_EQ(2u, creator_->max_packets_per_fec_group());
    606 
    607   // Send enough data to trigger one unprotected data packet,
    608   // causing the FEC packet to also be sent.
    609   {
    610     InSequence dummy;
    611     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    612         SaveArg<0>(&packet4_));
    613     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    614         SaveArg<0>(&packet5_));
    615   }
    616   consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0,
    617                                     true, MAY_FEC_PROTECT, NULL);
    618   EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed);
    619   // Verify that one FEC packet was sent.
    620   CheckPacketIsFec(packet5_, /*fec_group=*/1u);
    621   EXPECT_FALSE(creator_->IsFecGroupOpen());
    622   EXPECT_FALSE(creator_->IsFecProtected());
    623 }
    624 
    625 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) {
    626   delegate_.SetCanWriteAnything();
    627   creator_->set_max_packets_per_fec_group(2);
    628   EXPECT_FALSE(creator_->IsFecProtected());
    629 
    630   // Send one unprotected data packet.
    631   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    632         SaveArg<0>(&packet_));
    633   QuicConsumedData consumed =
    634       generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT,
    635                              NULL);
    636   EXPECT_EQ(1u, consumed.bytes_consumed);
    637   EXPECT_FALSE(generator_.HasQueuedFrames());
    638   EXPECT_FALSE(creator_->IsFecProtected());
    639   // Verify that one data packet was sent.
    640   PacketContents contents;
    641   contents.num_stream_frames = 1;
    642   CheckPacketContains(contents, packet_);
    643 
    644   {
    645     InSequence dummy;
    646     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    647         SaveArg<0>(&packet2_));
    648     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    649         SaveArg<0>(&packet3_));
    650     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    651         SaveArg<0>(&packet4_));
    652     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    653         SaveArg<0>(&packet5_));
    654     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    655         SaveArg<0>(&packet6_));
    656   }
    657   // Send enough data to create 3 packets with MUST_FEC_PROTECT flag.
    658   size_t data_len = 2 * kDefaultMaxPacketSize + 100;
    659   consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true,
    660                                     MUST_FEC_PROTECT, NULL);
    661   EXPECT_EQ(data_len, consumed.bytes_consumed);
    662   EXPECT_FALSE(generator_.HasQueuedFrames());
    663 
    664   // Verify that two FEC packets were sent.
    665   CheckPacketHasSingleStreamFrame(packet2_);
    666   CheckPacketHasSingleStreamFrame(packet3_);
    667   CheckPacketIsFec(packet4_, /*fec_group=*/2u);
    668   CheckPacketHasSingleStreamFrame(packet5_);
    669   CheckPacketIsFec(packet6_, /*fec_group=*/5u);  // Sent at the end of stream.
    670 
    671   // Send one unprotected data packet.
    672   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    673         SaveArg<0>(&packet7_));
    674   consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
    675                                     MAY_FEC_PROTECT, NULL);
    676   EXPECT_EQ(1u, consumed.bytes_consumed);
    677   EXPECT_FALSE(generator_.HasQueuedFrames());
    678   EXPECT_FALSE(creator_->IsFecProtected());
    679   // Verify that one unprotected data packet was sent.
    680   CheckPacketContains(contents, packet7_);
    681 }
    682 
    683 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) {
    684   delegate_.SetCanWriteAnything();
    685   // Enable FEC.
    686   creator_->set_max_packets_per_fec_group(2);
    687 
    688   generator_.StartBatchOperations();
    689   // Queue enough data to prevent a stream frame with a non-zero offset from
    690   // fitting.
    691   QuicConsumedData consumed = generator_.ConsumeData(
    692       7, CreateData(1u), 0, true, MAY_FEC_PROTECT, NULL);
    693   EXPECT_EQ(1u, consumed.bytes_consumed);
    694   EXPECT_TRUE(creator_->HasPendingFrames());
    695 
    696   // Queue protected data for sending. Should cause queued frames to be flushed.
    697   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    698       SaveArg<0>(&packet_));
    699   EXPECT_FALSE(creator_->IsFecProtected());
    700   consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
    701                                     MUST_FEC_PROTECT, NULL);
    702   EXPECT_EQ(1u, consumed.bytes_consumed);
    703   PacketContents contents;
    704   contents.num_stream_frames = 1;
    705   // Transmitted packet was not FEC protected.
    706   CheckPacketContains(contents, packet_);
    707   EXPECT_TRUE(creator_->IsFecProtected());
    708   EXPECT_TRUE(creator_->HasPendingFrames());
    709 }
    710 
    711 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) {
    712   // Enable FEC.
    713   creator_->set_max_packets_per_fec_group(2);
    714 
    715   // Queue control frames in generator.
    716   delegate_.SetCanNotWrite();
    717   generator_.SetShouldSendAck(true, true);
    718   delegate_.SetCanWriteAnything();
    719   generator_.StartBatchOperations();
    720 
    721   // Set up frames to write into the creator when control frames are written.
    722   EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
    723   EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
    724       Return(CreateFeedbackFrame()));
    725   EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce(
    726       Return(CreateStopWaitingFrame()));
    727 
    728   // Generator should have queued control frames, and creator should be empty.
    729   EXPECT_TRUE(generator_.HasQueuedFrames());
    730   EXPECT_FALSE(creator_->HasPendingFrames());
    731   EXPECT_FALSE(creator_->IsFecProtected());
    732 
    733   // Queue protected data for sending. Should cause queued frames to be flushed.
    734   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    735       SaveArg<0>(&packet_));
    736   QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
    737                                                      MUST_FEC_PROTECT, NULL);
    738   EXPECT_EQ(1u, consumed.bytes_consumed);
    739   PacketContents contents;
    740   contents.num_ack_frames = 1;
    741   contents.num_feedback_frames = 1;
    742   contents.num_stop_waiting_frames = 1;
    743   CheckPacketContains(contents, packet_);
    744 
    745   // FEC protection should be on in creator.
    746   EXPECT_TRUE(creator_->IsFecProtected());
    747 }
    748 
    749 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) {
    750   delegate_.SetCanWriteAnything();
    751 
    752   // Enable FEC.
    753   creator_->set_max_packets_per_fec_group(2);
    754   EXPECT_FALSE(creator_->IsFecProtected());
    755 
    756   // Queue stream frame to be protected in creator.
    757   generator_.StartBatchOperations();
    758   QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true,
    759                                                      MUST_FEC_PROTECT, NULL);
    760   EXPECT_EQ(1u, consumed.bytes_consumed);
    761   // Creator has a pending protected frame.
    762   EXPECT_TRUE(creator_->HasPendingFrames());
    763   EXPECT_TRUE(creator_->IsFecProtected());
    764 
    765   // Add enough unprotected data to exceed size of current packet, so that
    766   // current packet is sent. Both frames will be sent out in a single packet.
    767   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
    768   size_t data_len = kDefaultMaxPacketSize;
    769   consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
    770                                     MAY_FEC_PROTECT, NULL);
    771   EXPECT_EQ(data_len, consumed.bytes_consumed);
    772   PacketContents contents;
    773   contents.num_stream_frames = 2u;
    774   contents.fec_group = 1u;
    775   CheckPacketContains(contents, packet_);
    776   // FEC protection should still be on in creator.
    777   EXPECT_TRUE(creator_->IsFecProtected());
    778 }
    779 
    780 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) {
    781   delegate_.SetCanWriteAnything();
    782 
    783   // Enable FEC.
    784   creator_->set_max_packets_per_fec_group(2);
    785   EXPECT_FALSE(creator_->IsFecProtected());
    786 
    787   generator_.StartBatchOperations();
    788   // Send first packet, FEC protected.
    789   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
    790   // Write enough data to cause a packet to be emitted.
    791   size_t data_len = kDefaultMaxPacketSize;
    792   QuicConsumedData consumed = generator_.ConsumeData(
    793       5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL);
    794   EXPECT_EQ(data_len, consumed.bytes_consumed);
    795   PacketContents contents;
    796   contents.num_stream_frames = 1u;
    797   contents.fec_group = 1u;
    798   CheckPacketContains(contents, packet_);
    799 
    800   // FEC should still be on in creator.
    801   EXPECT_TRUE(creator_->IsFecProtected());
    802 
    803   // Send enough unprotected data to cause second packet to be sent, which gets
    804   // protected because it happens to fall within an open FEC group. Data packet
    805   // will be followed by FEC packet.
    806   {
    807     InSequence dummy;
    808     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    809         SaveArg<0>(&packet2_));
    810     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    811         SaveArg<0>(&packet3_));
    812   }
    813   consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
    814                                     MAY_FEC_PROTECT, NULL);
    815   EXPECT_EQ(data_len, consumed.bytes_consumed);
    816   contents.num_stream_frames = 2u;
    817   CheckPacketContains(contents, packet2_);
    818   CheckPacketIsFec(packet3_, /*fec_group=*/1u);
    819 
    820   // FEC protection should be off in creator.
    821   EXPECT_FALSE(creator_->IsFecProtected());
    822 }
    823 
    824 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) {
    825   delegate_.SetCanWriteAnything();
    826   generator_.StartBatchOperations();
    827 
    828   // Enable FEC.
    829   creator_->set_max_packets_per_fec_group(2);
    830   EXPECT_FALSE(creator_->IsFecProtected());
    831 
    832   // Queue one byte of FEC protected data.
    833   QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true,
    834                                                      MUST_FEC_PROTECT, NULL);
    835   EXPECT_TRUE(creator_->HasPendingFrames());
    836 
    837   // Add more unprotected data causing first packet to be sent, FEC protected.
    838   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    839       SaveArg<0>(&packet_));
    840   size_t data_len = kDefaultMaxPacketSize;
    841   consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
    842                                     MAY_FEC_PROTECT, NULL);
    843   EXPECT_EQ(data_len, consumed.bytes_consumed);
    844   PacketContents contents;
    845   contents.num_stream_frames = 2u;
    846   contents.fec_group = 1u;
    847   CheckPacketContains(contents, packet_);
    848 
    849   // FEC group is still open in creator.
    850   EXPECT_TRUE(creator_->IsFecProtected());
    851 
    852   // Add data that should be protected, large enough to cause second packet to
    853   // be sent. Data packet should be followed by FEC packet.
    854   {
    855     InSequence dummy;
    856     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    857         SaveArg<0>(&packet2_));
    858     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    859         SaveArg<0>(&packet3_));
    860   }
    861   consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
    862                                     MUST_FEC_PROTECT, NULL);
    863   EXPECT_EQ(data_len, consumed.bytes_consumed);
    864   CheckPacketContains(contents, packet2_);
    865   CheckPacketIsFec(packet3_, /*fec_group=*/1u);
    866 
    867   // FEC protection should remain on in creator.
    868   EXPECT_TRUE(creator_->IsFecProtected());
    869 }
    870 
    871 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) {
    872   delegate_.SetCanNotWrite();
    873 
    874   generator_.SetShouldSendAck(true, false);
    875   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    876   EXPECT_TRUE(generator_.HasQueuedFrames());
    877 
    878   delegate_.SetCanWriteAnything();
    879 
    880   generator_.StartBatchOperations();
    881 
    882   // When the first write operation is invoked, the ack and feedback
    883   // frames will be returned.
    884   EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
    885   EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
    886       Return(CreateFeedbackFrame()));
    887 
    888   // Send some data and a control frame
    889   generator_.ConsumeData(3, MakeIOVector("quux"), 7, false,
    890                          MAY_FEC_PROTECT, NULL);
    891   generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
    892 
    893   // All five frames will be flushed out in a single packet.
    894   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
    895   generator_.FinishBatchOperations();
    896   EXPECT_FALSE(generator_.HasQueuedFrames());
    897 
    898   PacketContents contents;
    899   contents.num_ack_frames = 1;
    900   contents.num_goaway_frames = 1;
    901   contents.num_feedback_frames = 1;
    902   contents.num_rst_stream_frames = 1;
    903   contents.num_stream_frames = 1;
    904   CheckPacketContains(contents, packet_);
    905 }
    906 
    907 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) {
    908   delegate_.SetCanNotWrite();
    909 
    910   generator_.SetShouldSendAck(true, false);
    911   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    912   EXPECT_TRUE(generator_.HasQueuedFrames());
    913 
    914   delegate_.SetCanWriteAnything();
    915 
    916   generator_.StartBatchOperations();
    917 
    918   // When the first write operation is invoked, the ack and feedback
    919   // frames will be returned.
    920   EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
    921   EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
    922       Return(CreateFeedbackFrame()));
    923 
    924   {
    925     InSequence dummy;
    926     // All five frames will be flushed out in a single packet
    927     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    928         SaveArg<0>(&packet_));
    929     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    930         SaveArg<0>(&packet2_));
    931   }
    932 
    933   // Send enough data to exceed one packet
    934   size_t data_len = kDefaultMaxPacketSize + 100;
    935   QuicConsumedData consumed =
    936       generator_.ConsumeData(3, CreateData(data_len), 0, true,
    937                              MAY_FEC_PROTECT, NULL);
    938   EXPECT_EQ(data_len, consumed.bytes_consumed);
    939   EXPECT_TRUE(consumed.fin_consumed);
    940   generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
    941 
    942   generator_.FinishBatchOperations();
    943   EXPECT_FALSE(generator_.HasQueuedFrames());
    944 
    945   // The first packet should have the queued data and part of the stream data.
    946   PacketContents contents;
    947   contents.num_ack_frames = 1;
    948   contents.num_feedback_frames = 1;
    949   contents.num_rst_stream_frames = 1;
    950   contents.num_stream_frames = 1;
    951   CheckPacketContains(contents, packet_);
    952 
    953   // The second should have the remainder of the stream data.
    954   PacketContents contents2;
    955   contents2.num_goaway_frames = 1;
    956   contents2.num_stream_frames = 1;
    957   CheckPacketContains(contents2, packet2_);
    958 }
    959 
    960 }  // namespace test
    961 }  // namespace net
    962