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, bool(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, 0));
    140   }
    141 
    142   QuicCongestionFeedbackFrame* CreateFeedbackFrame() {
    143     QuicCongestionFeedbackFrame* frame = new QuicCongestionFeedbackFrame;
    144     frame->type = kFixRate;
    145     frame->fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(42);
    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(
    275       DoAll(SaveArg<0>(&packet_), Return(true)));
    276 
    277   generator_.SetShouldSendAck(false, false);
    278   EXPECT_FALSE(generator_.HasQueuedFrames());
    279 
    280   PacketContents contents;
    281   contents.num_ack_frames = 1;
    282   CheckPacketContains(contents, packet_);
    283 }
    284 
    285 TEST_F(QuicPacketGeneratorTest,
    286        ShouldSendAckWithFeedback_WritableAndShouldNotFlush) {
    287   delegate_.SetCanWriteOnlyNonRetransmittable();
    288   generator_.StartBatchOperations();
    289 
    290   EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
    291   EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
    292       Return(CreateFeedbackFrame()));
    293 
    294   generator_.SetShouldSendAck(true, false);
    295   EXPECT_TRUE(generator_.HasQueuedFrames());
    296 }
    297 
    298 TEST_F(QuicPacketGeneratorTest,
    299        ShouldSendAckWithFeedback_WritableAndShouldFlush) {
    300   delegate_.SetCanWriteOnlyNonRetransmittable();
    301 
    302   EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
    303   EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
    304       Return(CreateFeedbackFrame()));
    305   EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce(
    306       Return(CreateStopWaitingFrame()));
    307 
    308   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    309       DoAll(SaveArg<0>(&packet_), Return(true)));
    310 
    311   generator_.SetShouldSendAck(true, true);
    312   EXPECT_FALSE(generator_.HasQueuedFrames());
    313 
    314   PacketContents contents;
    315   contents.num_ack_frames = 1;
    316   contents.num_feedback_frames = 1;
    317   contents.num_stop_waiting_frames = 1;
    318   CheckPacketContains(contents, packet_);
    319 }
    320 
    321 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) {
    322   delegate_.SetCanNotWrite();
    323 
    324   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    325   EXPECT_TRUE(generator_.HasQueuedFrames());
    326 }
    327 
    328 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) {
    329   delegate_.SetCanWriteOnlyNonRetransmittable();
    330 
    331   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    332   EXPECT_TRUE(generator_.HasQueuedFrames());
    333 }
    334 
    335 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) {
    336   delegate_.SetCanWriteAnything();
    337   generator_.StartBatchOperations();
    338 
    339   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    340   EXPECT_TRUE(generator_.HasQueuedFrames());
    341 }
    342 
    343 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) {
    344   delegate_.SetCanNotWrite();
    345   generator_.StartBatchOperations();
    346 
    347   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    348   EXPECT_TRUE(generator_.HasQueuedFrames());
    349   generator_.FinishBatchOperations();
    350   EXPECT_TRUE(generator_.HasQueuedFrames());
    351 
    352   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    353       DoAll(SaveArg<0>(&packet_), Return(true)));
    354   generator_.FlushAllQueuedFrames();
    355   EXPECT_FALSE(generator_.HasQueuedFrames());
    356 
    357   PacketContents contents;
    358   contents.num_rst_stream_frames = 1;
    359   CheckPacketContains(contents, packet_);
    360 }
    361 
    362 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) {
    363   delegate_.SetCanWriteAnything();
    364 
    365   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    366       DoAll(SaveArg<0>(&packet_), Return(true)));
    367 
    368   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    369   EXPECT_FALSE(generator_.HasQueuedFrames());
    370 
    371   PacketContents contents;
    372   contents.num_rst_stream_frames = 1;
    373   CheckPacketContains(contents, packet_);
    374 }
    375 
    376 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) {
    377   delegate_.SetCanNotWrite();
    378 
    379   QuicConsumedData consumed = generator_.ConsumeData(
    380       kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL);
    381   EXPECT_EQ(0u, consumed.bytes_consumed);
    382   EXPECT_FALSE(consumed.fin_consumed);
    383   EXPECT_FALSE(generator_.HasQueuedFrames());
    384 }
    385 
    386 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) {
    387   delegate_.SetCanWriteAnything();
    388   generator_.StartBatchOperations();
    389 
    390   QuicConsumedData consumed = generator_.ConsumeData(
    391       kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL);
    392   EXPECT_EQ(3u, consumed.bytes_consumed);
    393   EXPECT_TRUE(consumed.fin_consumed);
    394   EXPECT_TRUE(generator_.HasQueuedFrames());
    395 }
    396 
    397 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) {
    398   delegate_.SetCanWriteAnything();
    399 
    400   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    401       DoAll(SaveArg<0>(&packet_), Return(true)));
    402   QuicConsumedData consumed = generator_.ConsumeData(
    403       kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL);
    404   EXPECT_EQ(3u, consumed.bytes_consumed);
    405   EXPECT_TRUE(consumed.fin_consumed);
    406   EXPECT_FALSE(generator_.HasQueuedFrames());
    407 
    408   PacketContents contents;
    409   contents.num_stream_frames = 1;
    410   CheckPacketContains(contents, packet_);
    411 }
    412 
    413 TEST_F(QuicPacketGeneratorTest,
    414        ConsumeDataMultipleTimes_WritableAndShouldNotFlush) {
    415   delegate_.SetCanWriteAnything();
    416   generator_.StartBatchOperations();
    417 
    418   generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true,
    419                          MAY_FEC_PROTECT, NULL);
    420   QuicConsumedData consumed = generator_.ConsumeData(
    421       3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL);
    422   EXPECT_EQ(4u, consumed.bytes_consumed);
    423   EXPECT_FALSE(consumed.fin_consumed);
    424   EXPECT_TRUE(generator_.HasQueuedFrames());
    425 }
    426 
    427 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) {
    428   delegate_.SetCanWriteAnything();
    429   generator_.StartBatchOperations();
    430 
    431   generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true,
    432                          MAY_FEC_PROTECT, NULL);
    433   QuicConsumedData consumed = generator_.ConsumeData(
    434       3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL);
    435   EXPECT_EQ(4u, consumed.bytes_consumed);
    436   EXPECT_FALSE(consumed.fin_consumed);
    437   EXPECT_TRUE(generator_.HasQueuedFrames());
    438 
    439   // Now both frames will be flushed out.
    440   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    441       DoAll(SaveArg<0>(&packet_), Return(true)));
    442   generator_.FinishBatchOperations();
    443   EXPECT_FALSE(generator_.HasQueuedFrames());
    444 
    445   PacketContents contents;
    446   contents.num_stream_frames = 2;
    447   CheckPacketContains(contents, packet_);
    448 }
    449 
    450 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) {
    451   delegate_.SetCanWriteAnything();
    452 
    453   // Send FEC every two packets.
    454   creator_->set_max_packets_per_fec_group(2);
    455 
    456   {
    457     InSequence dummy;
    458     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    459         DoAll(SaveArg<0>(&packet_), Return(true)));
    460     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    461         DoAll(SaveArg<0>(&packet2_), Return(true)));
    462     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    463         DoAll(SaveArg<0>(&packet3_), Return(true)));
    464     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    465         DoAll(SaveArg<0>(&packet4_), Return(true)));
    466     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    467         DoAll(SaveArg<0>(&packet5_), Return(true)));
    468   }
    469 
    470   // Send enough data to create 3 packets: two full and one partial. Send
    471   // with MUST_FEC_PROTECT flag.
    472   size_t data_len = 2 * kDefaultMaxPacketSize + 100;
    473   QuicConsumedData consumed =
    474       generator_.ConsumeData(3, CreateData(data_len), 0, true,
    475                              MUST_FEC_PROTECT, NULL);
    476   EXPECT_EQ(data_len, consumed.bytes_consumed);
    477   EXPECT_TRUE(consumed.fin_consumed);
    478   EXPECT_FALSE(generator_.HasQueuedFrames());
    479 
    480   CheckPacketHasSingleStreamFrame(packet_);
    481   CheckPacketHasSingleStreamFrame(packet2_);
    482   CheckPacketIsFec(packet3_, 1);
    483 
    484   CheckPacketHasSingleStreamFrame(packet4_);
    485   CheckPacketIsFec(packet5_, 4);
    486 }
    487 
    488 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) {
    489   delegate_.SetCanWriteAnything();
    490 
    491   // Enable FEC.
    492   creator_->set_max_packets_per_fec_group(6);
    493   {
    494     InSequence dummy;
    495     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    496         DoAll(SaveArg<0>(&packet_), Return(true)));
    497     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    498         DoAll(SaveArg<0>(&packet2_), Return(true)));
    499     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    500         DoAll(SaveArg<0>(&packet3_), Return(true)));
    501   }
    502 
    503   // Send enough data to create 2 packets: one full and one partial. Send
    504   // with MUST_FEC_PROTECT flag.
    505   size_t data_len = 1 * kDefaultMaxPacketSize + 100;
    506   QuicConsumedData consumed =
    507       generator_.ConsumeData(3, CreateData(data_len), 0, true,
    508                              MUST_FEC_PROTECT, NULL);
    509   EXPECT_EQ(data_len, consumed.bytes_consumed);
    510   EXPECT_TRUE(consumed.fin_consumed);
    511   EXPECT_FALSE(generator_.HasQueuedFrames());
    512 
    513   CheckPacketHasSingleStreamFrame(packet_);
    514   CheckPacketHasSingleStreamFrame(packet2_);
    515   CheckPacketIsFec(packet3_, 1);
    516 }
    517 
    518 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) {
    519   // Set the packet size be enough for two stream frames with 0 stream offset,
    520   // but not enough for a stream frame of 0 offset and one with non-zero offset.
    521   size_t length =
    522       NullEncrypter().GetCiphertextSize(0) +
    523       GetPacketHeaderSize(creator_->connection_id_length(),
    524                           true,
    525                           creator_->next_sequence_number_length(),
    526                           NOT_IN_FEC_GROUP) +
    527       // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger
    528       // than the GetMinStreamFrameSize.
    529       QuicFramer::GetMinStreamFrameSize(framer_.version(), 1, 0, false,
    530                                         NOT_IN_FEC_GROUP) + 3 +
    531       QuicFramer::GetMinStreamFrameSize(framer_.version(), 1, 0, true,
    532                                         NOT_IN_FEC_GROUP) + 1;
    533   creator_->set_max_packet_length(length);
    534   delegate_.SetCanWriteAnything();
    535   {
    536      InSequence dummy;
    537      EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    538          DoAll(SaveArg<0>(&packet_), Return(true)));
    539      EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    540          DoAll(SaveArg<0>(&packet2_), Return(true)));
    541   }
    542   generator_.StartBatchOperations();
    543   // Queue enough data to prevent a stream frame with a non-zero offset from
    544   // fitting.
    545   QuicConsumedData consumed = generator_.ConsumeData(
    546       kHeadersStreamId, MakeIOVector("foo"), 0, false, MAY_FEC_PROTECT, NULL);
    547   EXPECT_EQ(3u, consumed.bytes_consumed);
    548   EXPECT_FALSE(consumed.fin_consumed);
    549   EXPECT_TRUE(generator_.HasQueuedFrames());
    550 
    551   // This frame will not fit with the existing frame, causing the queued frame
    552   // to be serialized, and it will not fit with another frame like it, so it is
    553   // serialized by itself.
    554   consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3,
    555                                     true, MAY_FEC_PROTECT, NULL);
    556   EXPECT_EQ(3u, consumed.bytes_consumed);
    557   EXPECT_TRUE(consumed.fin_consumed);
    558   EXPECT_FALSE(generator_.HasQueuedFrames());
    559 
    560   PacketContents contents;
    561   contents.num_stream_frames = 1;
    562   CheckPacketContains(contents, packet_);
    563   CheckPacketContains(contents, packet2_);
    564 }
    565 
    566 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) {
    567   delegate_.SetCanWriteAnything();
    568   // Enable FEC.
    569   creator_->set_max_packets_per_fec_group(2);
    570   EXPECT_FALSE(creator_->IsFecProtected());
    571 
    572   // Send one unprotected data packet.
    573   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    574         DoAll(SaveArg<0>(&packet_), Return(true)));
    575   QuicConsumedData consumed =
    576       generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT,
    577                              NULL);
    578   EXPECT_EQ(1u, consumed.bytes_consumed);
    579   EXPECT_FALSE(generator_.HasQueuedFrames());
    580   EXPECT_FALSE(creator_->IsFecProtected());
    581   // Verify that one data packet was sent.
    582   PacketContents contents;
    583   contents.num_stream_frames = 1;
    584   CheckPacketContains(contents, packet_);
    585 
    586   {
    587     InSequence dummy;
    588     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    589         DoAll(SaveArg<0>(&packet2_), Return(true)));
    590     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    591         DoAll(SaveArg<0>(&packet3_), Return(true)));
    592     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    593         DoAll(SaveArg<0>(&packet4_), Return(true)));
    594     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    595         DoAll(SaveArg<0>(&packet5_), Return(true)));
    596     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    597         DoAll(SaveArg<0>(&packet6_), Return(true)));
    598   }
    599   // Send enough data to create 3 packets with MUST_FEC_PROTECT flag.
    600   size_t data_len = 2 * kDefaultMaxPacketSize + 100;
    601   consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true,
    602                                     MUST_FEC_PROTECT, NULL);
    603   EXPECT_EQ(data_len, consumed.bytes_consumed);
    604   EXPECT_FALSE(generator_.HasQueuedFrames());
    605 
    606   // Verify that two FEC packets were sent.
    607   CheckPacketHasSingleStreamFrame(packet2_);
    608   CheckPacketHasSingleStreamFrame(packet3_);
    609   CheckPacketIsFec(packet4_, /*fec_group=*/2u);
    610   CheckPacketHasSingleStreamFrame(packet5_);
    611   CheckPacketIsFec(packet6_, /*fec_group=*/5u);  // Sent at the end of stream.
    612 
    613   // Send one unprotected data packet.
    614   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    615         DoAll(SaveArg<0>(&packet7_), Return(true)));
    616   consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
    617                                     MAY_FEC_PROTECT, NULL);
    618   EXPECT_EQ(1u, consumed.bytes_consumed);
    619   EXPECT_FALSE(generator_.HasQueuedFrames());
    620   EXPECT_FALSE(creator_->IsFecProtected());
    621   // Verify that one unprotected data packet was sent.
    622   CheckPacketContains(contents, packet7_);
    623 }
    624 
    625 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) {
    626   delegate_.SetCanWriteAnything();
    627   // Enable FEC.
    628   creator_->set_max_packets_per_fec_group(2);
    629 
    630   generator_.StartBatchOperations();
    631   // Queue enough data to prevent a stream frame with a non-zero offset from
    632   // fitting.
    633   QuicConsumedData consumed = generator_.ConsumeData(
    634       7, CreateData(1u), 0, true, MAY_FEC_PROTECT, NULL);
    635   EXPECT_EQ(1u, consumed.bytes_consumed);
    636   EXPECT_TRUE(creator_->HasPendingFrames());
    637 
    638   // Queue protected data for sending. Should cause queued frames to be flushed.
    639   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    640       DoAll(SaveArg<0>(&packet_), Return(true)));
    641   EXPECT_FALSE(creator_->IsFecProtected());
    642   consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
    643                                     MUST_FEC_PROTECT, NULL);
    644   EXPECT_EQ(1u, consumed.bytes_consumed);
    645   PacketContents contents;
    646   contents.num_stream_frames = 1;
    647   // Transmitted packet was not FEC protected.
    648   CheckPacketContains(contents, packet_);
    649   EXPECT_TRUE(creator_->IsFecProtected());
    650   EXPECT_TRUE(creator_->HasPendingFrames());
    651 }
    652 
    653 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) {
    654   // Enable FEC.
    655   creator_->set_max_packets_per_fec_group(2);
    656 
    657   // Queue control frames in generator.
    658   delegate_.SetCanNotWrite();
    659   generator_.SetShouldSendAck(true, true);
    660   delegate_.SetCanWriteAnything();
    661   generator_.StartBatchOperations();
    662 
    663   // Set up frames to write into the creator when control frames are written.
    664   EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
    665   EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
    666       Return(CreateFeedbackFrame()));
    667   EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce(
    668       Return(CreateStopWaitingFrame()));
    669 
    670   // Generator should have queued control frames, and creator should be empty.
    671   EXPECT_TRUE(generator_.HasQueuedFrames());
    672   EXPECT_FALSE(creator_->HasPendingFrames());
    673   EXPECT_FALSE(creator_->IsFecProtected());
    674 
    675   // Queue protected data for sending. Should cause queued frames to be flushed.
    676   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    677       DoAll(SaveArg<0>(&packet_), Return(true)));
    678   QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
    679                                                      MUST_FEC_PROTECT, NULL);
    680   EXPECT_EQ(1u, consumed.bytes_consumed);
    681   PacketContents contents;
    682   contents.num_ack_frames = 1;
    683   contents.num_feedback_frames = 1;
    684   contents.num_stop_waiting_frames = 1;
    685   CheckPacketContains(contents, packet_);
    686 
    687   // FEC protection should be on in creator.
    688   EXPECT_TRUE(creator_->IsFecProtected());
    689 }
    690 
    691 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) {
    692   delegate_.SetCanWriteAnything();
    693 
    694   // Enable FEC.
    695   creator_->set_max_packets_per_fec_group(2);
    696   EXPECT_FALSE(creator_->IsFecProtected());
    697 
    698   // Queue stream frame to be protected in creator.
    699   generator_.StartBatchOperations();
    700   QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true,
    701                                                      MUST_FEC_PROTECT, NULL);
    702   EXPECT_EQ(1u, consumed.bytes_consumed);
    703   // Creator has a pending protected frame.
    704   EXPECT_TRUE(creator_->HasPendingFrames());
    705   EXPECT_TRUE(creator_->IsFecProtected());
    706 
    707   // Add enough unprotected data to exceed size of current packet, so that
    708   // current packet is sent. Both frames will be sent out in a single packet.
    709   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    710       DoAll(SaveArg<0>(&packet_), Return(true)));
    711   size_t data_len = kDefaultMaxPacketSize;
    712   consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
    713                                     MAY_FEC_PROTECT, NULL);
    714   EXPECT_EQ(data_len, consumed.bytes_consumed);
    715   PacketContents contents;
    716   contents.num_stream_frames = 2u;
    717   contents.fec_group = 1u;
    718   CheckPacketContains(contents, packet_);
    719   // FEC protection should still be on in creator.
    720   EXPECT_TRUE(creator_->IsFecProtected());
    721 }
    722 
    723 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) {
    724   delegate_.SetCanWriteAnything();
    725 
    726   // Enable FEC.
    727   creator_->set_max_packets_per_fec_group(2);
    728   EXPECT_FALSE(creator_->IsFecProtected());
    729 
    730   generator_.StartBatchOperations();
    731   // Send first packet, FEC protected.
    732   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    733       DoAll(SaveArg<0>(&packet_), Return(true)));
    734   // Write enough data to cause a packet to be emitted.
    735   size_t data_len = kDefaultMaxPacketSize;
    736   QuicConsumedData consumed = generator_.ConsumeData(
    737       5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL);
    738   EXPECT_EQ(data_len, consumed.bytes_consumed);
    739   PacketContents contents;
    740   contents.num_stream_frames = 1u;
    741   contents.fec_group = 1u;
    742   CheckPacketContains(contents, packet_);
    743 
    744   // FEC should still be on in creator.
    745   EXPECT_TRUE(creator_->IsFecProtected());
    746 
    747   // Send enough unprotected data to cause second packet to be sent, which gets
    748   // protected because it happens to fall within an open FEC group. Data packet
    749   // will be followed by FEC packet.
    750   {
    751     InSequence dummy;
    752     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    753         DoAll(SaveArg<0>(&packet2_), Return(true)));
    754     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    755         DoAll(SaveArg<0>(&packet3_), Return(true)));
    756   }
    757   consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
    758                                     MAY_FEC_PROTECT, NULL);
    759   EXPECT_EQ(data_len, consumed.bytes_consumed);
    760   contents.num_stream_frames = 2u;
    761   CheckPacketContains(contents, packet2_);
    762   CheckPacketIsFec(packet3_, /*fec_group=*/1u);
    763 
    764   // FEC protection should be off in creator.
    765   EXPECT_FALSE(creator_->IsFecProtected());
    766 }
    767 
    768 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) {
    769   delegate_.SetCanWriteAnything();
    770   generator_.StartBatchOperations();
    771 
    772   // Enable FEC.
    773   creator_->set_max_packets_per_fec_group(2);
    774   EXPECT_FALSE(creator_->IsFecProtected());
    775 
    776   // Queue one byte of FEC protected data.
    777   QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true,
    778                                                      MUST_FEC_PROTECT, NULL);
    779   EXPECT_TRUE(creator_->HasPendingFrames());
    780 
    781   // Add more unprotected data causing first packet to be sent, FEC protected.
    782   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    783       DoAll(SaveArg<0>(&packet_), Return(true)));
    784   size_t data_len = kDefaultMaxPacketSize;
    785   consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
    786                                     MAY_FEC_PROTECT, NULL);
    787   EXPECT_EQ(data_len, consumed.bytes_consumed);
    788   PacketContents contents;
    789   contents.num_stream_frames = 2u;
    790   contents.fec_group = 1u;
    791   CheckPacketContains(contents, packet_);
    792 
    793   // FEC group is still open in creator.
    794   EXPECT_TRUE(creator_->IsFecProtected());
    795 
    796   // Add data that should be protected, large enough to cause second packet to
    797   // be sent. Data packet should be followed by FEC packet.
    798   {
    799     InSequence dummy;
    800     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    801         DoAll(SaveArg<0>(&packet2_), Return(true)));
    802     EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    803         DoAll(SaveArg<0>(&packet3_), Return(true)));
    804   }
    805   consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true,
    806                                     MUST_FEC_PROTECT, NULL);
    807   EXPECT_EQ(data_len, consumed.bytes_consumed);
    808   CheckPacketContains(contents, packet2_);
    809   CheckPacketIsFec(packet3_, /*fec_group=*/1u);
    810 
    811   // FEC protection should remain on in creator.
    812   EXPECT_TRUE(creator_->IsFecProtected());
    813 }
    814 
    815 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) {
    816   delegate_.SetCanNotWrite();
    817 
    818   generator_.SetShouldSendAck(true, false);
    819   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    820   EXPECT_TRUE(generator_.HasQueuedFrames());
    821 
    822   delegate_.SetCanWriteAnything();
    823 
    824   generator_.StartBatchOperations();
    825 
    826   // When the first write operation is invoked, the ack and feedback
    827   // frames will be returned.
    828   EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
    829   EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
    830       Return(CreateFeedbackFrame()));
    831 
    832   // Send some data and a control frame
    833   generator_.ConsumeData(3, MakeIOVector("quux"), 7, false,
    834                          MAY_FEC_PROTECT, NULL);
    835   generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
    836 
    837   // All five frames will be flushed out in a single packet.
    838   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    839       DoAll(SaveArg<0>(&packet_), Return(true)));
    840   generator_.FinishBatchOperations();
    841   EXPECT_FALSE(generator_.HasQueuedFrames());
    842 
    843   PacketContents contents;
    844   contents.num_ack_frames = 1;
    845   contents.num_goaway_frames = 1;
    846   contents.num_feedback_frames = 1;
    847   contents.num_rst_stream_frames = 1;
    848   contents.num_stream_frames = 1;
    849   CheckPacketContains(contents, packet_);
    850 }
    851 
    852 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) {
    853   delegate_.SetCanNotWrite();
    854 
    855   generator_.SetShouldSendAck(true, false);
    856   generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
    857   EXPECT_TRUE(generator_.HasQueuedFrames());
    858 
    859   delegate_.SetCanWriteAnything();
    860 
    861   generator_.StartBatchOperations();
    862 
    863   // When the first write operation is invoked, the ack and feedback
    864   // frames will be returned.
    865   EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
    866   EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
    867       Return(CreateFeedbackFrame()));
    868 
    869   {
    870     InSequence dummy;
    871   // All five frames will be flushed out in a single packet
    872   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    873       DoAll(SaveArg<0>(&packet_), Return(true)));
    874   EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
    875       DoAll(SaveArg<0>(&packet2_), Return(true)));
    876   }
    877 
    878   // Send enough data to exceed one packet
    879   size_t data_len = kDefaultMaxPacketSize + 100;
    880   QuicConsumedData consumed =
    881       generator_.ConsumeData(3, CreateData(data_len), 0, true,
    882                              MAY_FEC_PROTECT, NULL);
    883   EXPECT_EQ(data_len, consumed.bytes_consumed);
    884   EXPECT_TRUE(consumed.fin_consumed);
    885   generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
    886 
    887   generator_.FinishBatchOperations();
    888   EXPECT_FALSE(generator_.HasQueuedFrames());
    889 
    890   // The first packet should have the queued data and part of the stream data.
    891   PacketContents contents;
    892   contents.num_ack_frames = 1;
    893   contents.num_feedback_frames = 1;
    894   contents.num_rst_stream_frames = 1;
    895   contents.num_stream_frames = 1;
    896   CheckPacketContains(contents, packet_);
    897 
    898   // The second should have the remainder of the stream data.
    899   PacketContents contents2;
    900   contents2.num_goaway_frames = 1;
    901   contents2.num_stream_frames = 1;
    902   CheckPacketContains(contents2, packet2_);
    903 }
    904 
    905 }  // namespace test
    906 }  // namespace net
    907