Index: net/quic/quic_packet_generator_test.cc |
diff --git a/net/quic/quic_packet_generator_test.cc b/net/quic/quic_packet_generator_test.cc |
deleted file mode 100644 |
index 26f165897d90a3102d230f8e53a8f0344da2984f..0000000000000000000000000000000000000000 |
--- a/net/quic/quic_packet_generator_test.cc |
+++ /dev/null |
@@ -1,1106 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/quic/quic_packet_generator.h" |
- |
-#include <string> |
- |
-#include "net/quic/crypto/crypto_protocol.h" |
-#include "net/quic/crypto/null_encrypter.h" |
-#include "net/quic/crypto/quic_decrypter.h" |
-#include "net/quic/crypto/quic_encrypter.h" |
-#include "net/quic/quic_flags.h" |
-#include "net/quic/quic_utils.h" |
-#include "net/quic/test_tools/quic_packet_creator_peer.h" |
-#include "net/quic/test_tools/quic_packet_generator_peer.h" |
-#include "net/quic/test_tools/quic_test_utils.h" |
-#include "net/quic/test_tools/simple_quic_framer.h" |
-#include "net/test/gtest_util.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using base::StringPiece; |
-using std::string; |
-using testing::InSequence; |
-using testing::Return; |
-using testing::SaveArg; |
-using testing::StrictMock; |
-using testing::_; |
- |
-namespace net { |
-namespace test { |
-namespace { |
- |
-const int64 kMinFecTimeoutMs = 5u; |
- |
-class MockDelegate : public QuicPacketGenerator::DelegateInterface { |
- public: |
- MockDelegate() {} |
- ~MockDelegate() override {} |
- |
- MOCK_METHOD3(ShouldGeneratePacket, |
- bool(TransmissionType transmission_type, |
- HasRetransmittableData retransmittable, |
- IsHandshake handshake)); |
- MOCK_METHOD1(PopulateAckFrame, void(QuicAckFrame*)); |
- MOCK_METHOD1(PopulateStopWaitingFrame, void(QuicStopWaitingFrame*)); |
- MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet)); |
- MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); |
- |
- void SetCanWriteAnything() { |
- EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
- .WillRepeatedly(Return(true)); |
- EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, |
- NO_RETRANSMITTABLE_DATA, _)) |
- .WillRepeatedly(Return(true)); |
- } |
- |
- void SetCanNotWrite() { |
- EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
- .WillRepeatedly(Return(false)); |
- EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, |
- NO_RETRANSMITTABLE_DATA, _)) |
- .WillRepeatedly(Return(false)); |
- } |
- |
- // Use this when only ack frames should be allowed to be written. |
- void SetCanWriteOnlyNonRetransmittable() { |
- EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
- .WillRepeatedly(Return(false)); |
- EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, |
- NO_RETRANSMITTABLE_DATA, _)) |
- .WillRepeatedly(Return(true)); |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(MockDelegate); |
-}; |
- |
-// Simple struct for describing the contents of a packet. |
-// Useful in conjunction with a SimpleQuicFrame for validating that a packet |
-// contains the expected frames. |
-struct PacketContents { |
- PacketContents() |
- : num_ack_frames(0), |
- num_connection_close_frames(0), |
- num_goaway_frames(0), |
- num_rst_stream_frames(0), |
- num_stop_waiting_frames(0), |
- num_stream_frames(0), |
- fec_group(0) { |
- } |
- |
- size_t num_ack_frames; |
- size_t num_connection_close_frames; |
- size_t num_goaway_frames; |
- size_t num_rst_stream_frames; |
- size_t num_stop_waiting_frames; |
- size_t num_stream_frames; |
- |
- QuicFecGroupNumber fec_group; |
-}; |
- |
-} // namespace |
- |
-class QuicPacketGeneratorTest : public ::testing::Test { |
- protected: |
- QuicPacketGeneratorTest() |
- : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), |
- generator_(42, &framer_, &random_, &delegate_), |
- creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)), |
- packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
- packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
- packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
- packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
- packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
- packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
- packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), |
- packet8_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr) {} |
- |
- ~QuicPacketGeneratorTest() override { |
- delete packet_.packet; |
- delete packet_.retransmittable_frames; |
- delete packet2_.packet; |
- delete packet2_.retransmittable_frames; |
- delete packet3_.packet; |
- delete packet3_.retransmittable_frames; |
- delete packet4_.packet; |
- delete packet4_.retransmittable_frames; |
- delete packet5_.packet; |
- delete packet5_.retransmittable_frames; |
- delete packet6_.packet; |
- delete packet6_.retransmittable_frames; |
- delete packet7_.packet; |
- delete packet7_.retransmittable_frames; |
- delete packet8_.packet; |
- delete packet8_.retransmittable_frames; |
- } |
- |
- QuicRstStreamFrame* CreateRstStreamFrame() { |
- return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0); |
- } |
- |
- QuicGoAwayFrame* CreateGoAwayFrame() { |
- return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string()); |
- } |
- |
- void CheckPacketContains(const PacketContents& contents, |
- const SerializedPacket& packet) { |
- size_t num_retransmittable_frames = contents.num_connection_close_frames + |
- contents.num_goaway_frames + contents.num_rst_stream_frames + |
- contents.num_stream_frames; |
- size_t num_frames = contents.num_ack_frames + |
- contents.num_stop_waiting_frames + |
- num_retransmittable_frames; |
- |
- if (num_retransmittable_frames == 0) { |
- ASSERT_TRUE(packet.retransmittable_frames == nullptr); |
- } else { |
- ASSERT_TRUE(packet.retransmittable_frames != nullptr); |
- EXPECT_EQ(num_retransmittable_frames, |
- packet.retransmittable_frames->frames().size()); |
- } |
- |
- ASSERT_TRUE(packet.packet != nullptr); |
- ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); |
- EXPECT_EQ(num_frames, simple_framer_.num_frames()); |
- EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size()); |
- EXPECT_EQ(contents.num_connection_close_frames, |
- simple_framer_.connection_close_frames().size()); |
- EXPECT_EQ(contents.num_goaway_frames, |
- simple_framer_.goaway_frames().size()); |
- EXPECT_EQ(contents.num_rst_stream_frames, |
- simple_framer_.rst_stream_frames().size()); |
- EXPECT_EQ(contents.num_stream_frames, |
- simple_framer_.stream_frames().size()); |
- EXPECT_EQ(contents.num_stop_waiting_frames, |
- simple_framer_.stop_waiting_frames().size()); |
- EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group); |
- } |
- |
- void CheckPacketHasSingleStreamFrame(const SerializedPacket& packet) { |
- ASSERT_TRUE(packet.retransmittable_frames != nullptr); |
- EXPECT_EQ(1u, packet.retransmittable_frames->frames().size()); |
- ASSERT_TRUE(packet.packet != nullptr); |
- ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); |
- EXPECT_EQ(1u, simple_framer_.num_frames()); |
- EXPECT_EQ(1u, simple_framer_.stream_frames().size()); |
- } |
- |
- void CheckPacketIsFec(const SerializedPacket& packet, |
- QuicPacketSequenceNumber fec_group) { |
- ASSERT_TRUE(packet.retransmittable_frames == nullptr); |
- ASSERT_TRUE(packet.packet != nullptr); |
- ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); |
- EXPECT_TRUE(simple_framer_.header().fec_flag); |
- EXPECT_EQ(fec_group, simple_framer_.fec_data().fec_group); |
- } |
- |
- IOVector CreateData(size_t len) { |
- data_array_.reset(new char[len]); |
- memset(data_array_.get(), '?', len); |
- IOVector data; |
- data.Append(data_array_.get(), len); |
- return data; |
- } |
- |
- QuicFramer framer_; |
- MockRandom random_; |
- StrictMock<MockDelegate> delegate_; |
- QuicPacketGenerator generator_; |
- QuicPacketCreator* creator_; |
- SimpleQuicFramer simple_framer_; |
- SerializedPacket packet_; |
- SerializedPacket packet2_; |
- SerializedPacket packet3_; |
- SerializedPacket packet4_; |
- SerializedPacket packet5_; |
- SerializedPacket packet6_; |
- SerializedPacket packet7_; |
- SerializedPacket packet8_; |
- |
- private: |
- scoped_ptr<char[]> data_array_; |
-}; |
- |
-class MockDebugDelegate : public QuicPacketGenerator::DebugDelegate { |
- public: |
- MOCK_METHOD1(OnFrameAddedToPacket, |
- void(const QuicFrame&)); |
-}; |
- |
-TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { |
- delegate_.SetCanNotWrite(); |
- |
- generator_.SetShouldSendAck(false); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { |
- StrictMock<MockDebugDelegate> debug_delegate; |
- |
- generator_.set_debug_delegate(&debug_delegate); |
- delegate_.SetCanWriteOnlyNonRetransmittable(); |
- generator_.StartBatchOperations(); |
- |
- EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
- EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); |
- |
- generator_.SetShouldSendAck(false); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
- delegate_.SetCanWriteOnlyNonRetransmittable(); |
- |
- EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
- |
- generator_.SetShouldSendAck(false); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- |
- PacketContents contents; |
- contents.num_ack_frames = 1; |
- CheckPacketContains(contents, packet_); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { |
- // Make sure that calling SetShouldSendAck multiple times does not result in a |
- // crash. Previously this would result in multiple QuicFrames queued in the |
- // packet generator, with all but the last with internal pointers to freed |
- // memory. |
- delegate_.SetCanWriteAnything(); |
- |
- // Only one AckFrame should be created. |
- EXPECT_CALL(delegate_, PopulateAckFrame(_)).Times(1); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
- .Times(1) |
- .WillOnce(SaveArg<0>(&packet_)); |
- |
- generator_.StartBatchOperations(); |
- generator_.SetShouldSendAck(false); |
- generator_.SetShouldSendAck(false); |
- generator_.FinishBatchOperations(); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { |
- delegate_.SetCanNotWrite(); |
- |
- generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) { |
- delegate_.SetCanWriteOnlyNonRetransmittable(); |
- |
- generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { |
- delegate_.SetCanWriteAnything(); |
- generator_.StartBatchOperations(); |
- |
- generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { |
- delegate_.SetCanNotWrite(); |
- generator_.StartBatchOperations(); |
- |
- generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
- generator_.FinishBatchOperations(); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
- |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
- generator_.FlushAllQueuedFrames(); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- |
- PacketContents contents; |
- contents.num_rst_stream_frames = 1; |
- CheckPacketContains(contents, packet_); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { |
- delegate_.SetCanWriteAnything(); |
- |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
- |
- generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- |
- PacketContents contents; |
- contents.num_rst_stream_frames = 1; |
- CheckPacketContains(contents, packet_); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { |
- delegate_.SetCanNotWrite(); |
- |
- QuicConsumedData consumed = generator_.ConsumeData( |
- kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(0u, consumed.bytes_consumed); |
- EXPECT_FALSE(consumed.fin_consumed); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { |
- delegate_.SetCanWriteAnything(); |
- generator_.StartBatchOperations(); |
- |
- QuicConsumedData consumed = generator_.ConsumeData( |
- kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(3u, consumed.bytes_consumed); |
- EXPECT_TRUE(consumed.fin_consumed); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { |
- delegate_.SetCanWriteAnything(); |
- |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
- QuicConsumedData consumed = generator_.ConsumeData( |
- kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(3u, consumed.bytes_consumed); |
- EXPECT_TRUE(consumed.fin_consumed); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- |
- PacketContents contents; |
- contents.num_stream_frames = 1; |
- CheckPacketContains(contents, packet_); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) { |
- EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0, |
- false, MAY_FEC_PROTECT, nullptr), |
- "Attempt to consume empty data without FIN."); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, |
- ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { |
- delegate_.SetCanWriteAnything(); |
- generator_.StartBatchOperations(); |
- |
- generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, |
- MAY_FEC_PROTECT, nullptr); |
- QuicConsumedData consumed = generator_.ConsumeData( |
- 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(4u, consumed.bytes_consumed); |
- EXPECT_FALSE(consumed.fin_consumed); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { |
- delegate_.SetCanWriteAnything(); |
- generator_.StartBatchOperations(); |
- |
- generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, |
- MAY_FEC_PROTECT, nullptr); |
- QuicConsumedData consumed = generator_.ConsumeData( |
- 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(4u, consumed.bytes_consumed); |
- EXPECT_FALSE(consumed.fin_consumed); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
- |
- // Now both frames will be flushed out. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
- generator_.FinishBatchOperations(); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- |
- PacketContents contents; |
- contents.num_stream_frames = 2; |
- CheckPacketContains(contents, packet_); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecOnMaxGroupSize) { |
- delegate_.SetCanWriteAnything(); |
- |
- // Send FEC every two packets. |
- creator_->set_max_packets_per_fec_group(2); |
- |
- { |
- InSequence dummy; |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet2_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet3_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet4_)); |
- } |
- |
- // Send enough data to create 3 packets: two full and one partial. Send with |
- // MUST_FEC_PROTECT flag. |
- size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
- QuicConsumedData consumed = generator_.ConsumeData( |
- 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(data_len, consumed.bytes_consumed); |
- EXPECT_TRUE(consumed.fin_consumed); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- |
- CheckPacketHasSingleStreamFrame(packet_); |
- CheckPacketHasSingleStreamFrame(packet2_); |
- CheckPacketIsFec(packet3_, 1); |
- CheckPacketHasSingleStreamFrame(packet4_); |
- EXPECT_TRUE(creator_->IsFecProtected()); |
- |
- // The FEC packet under construction will be sent when one more packet is sent |
- // (since FEC group size is 2), or when OnFecTimeout is called. Send more data |
- // with MAY_FEC_PROTECT. This packet should also be protected, and FEC packet |
- // is sent since FEC group size is reached. |
- { |
- InSequence dummy; |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
- .WillOnce(SaveArg<0>(&packet5_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
- .WillOnce(SaveArg<0>(&packet6_)); |
- } |
- consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
- nullptr); |
- EXPECT_EQ(1u, consumed.bytes_consumed); |
- CheckPacketHasSingleStreamFrame(packet5_); |
- CheckPacketIsFec(packet6_, 4); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecOnTimeout) { |
- delegate_.SetCanWriteAnything(); |
- creator_->set_max_packets_per_fec_group(1000); |
- |
- // Send data with MUST_FEC_PROTECT flag. No FEC packet is emitted, but the |
- // creator FEC protects all data. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
- QuicConsumedData consumed = generator_.ConsumeData(3, CreateData(1u), 0, true, |
- MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(1u, consumed.bytes_consumed); |
- EXPECT_TRUE(consumed.fin_consumed); |
- CheckPacketHasSingleStreamFrame(packet_); |
- EXPECT_TRUE(creator_->IsFecProtected()); |
- |
- // Send more data with MAY_FEC_PROTECT. This packet should also be protected, |
- // and FEC packet is not yet sent. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet2_)); |
- consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
- nullptr); |
- EXPECT_EQ(1u, consumed.bytes_consumed); |
- CheckPacketHasSingleStreamFrame(packet2_); |
- EXPECT_TRUE(creator_->IsFecProtected()); |
- |
- // Calling OnFecTimeout should cause the FEC packet to be emitted. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet3_)); |
- generator_.OnFecTimeout(); |
- CheckPacketIsFec(packet3_, 1); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
- |
- // Subsequent data is protected under the next FEC group. Send enough data to |
- // create 2 more packets: one full and one partial. |
- { |
- InSequence dummy; |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
- .WillOnce(SaveArg<0>(&packet4_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
- .WillOnce(SaveArg<0>(&packet5_)); |
- } |
- size_t data_len = kDefaultMaxPacketSize + 1; |
- consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
- MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(data_len, consumed.bytes_consumed); |
- EXPECT_TRUE(consumed.fin_consumed); |
- CheckPacketHasSingleStreamFrame(packet4_); |
- CheckPacketHasSingleStreamFrame(packet5_); |
- EXPECT_TRUE(creator_->IsFecProtected()); |
- |
- // Calling OnFecTimeout should cause the FEC packet to be emitted. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet6_)); |
- generator_.OnFecTimeout(); |
- CheckPacketIsFec(packet6_, 4); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, GetFecTimeoutFiniteOnlyOnFirstPacketInGroup) { |
- delegate_.SetCanWriteAnything(); |
- creator_->set_max_packets_per_fec_group(6); |
- |
- // Send enough data to create 2 packets: one full and one partial. Send with |
- // MUST_FEC_PROTECT flag. No FEC packet is emitted yet, but the creator FEC |
- // protects all data. |
- { |
- InSequence dummy; |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet2_)); |
- } |
- size_t data_len = 1 * kDefaultMaxPacketSize + 100; |
- QuicConsumedData consumed = generator_.ConsumeData( |
- 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(data_len, consumed.bytes_consumed); |
- EXPECT_TRUE(consumed.fin_consumed); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- CheckPacketHasSingleStreamFrame(packet_); |
- CheckPacketHasSingleStreamFrame(packet2_); |
- EXPECT_TRUE(creator_->IsFecProtected()); |
- |
- // GetFecTimeout returns finite timeout only for first packet in group. |
- EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs), |
- generator_.GetFecTimeout(/*sequence_number=*/1u)); |
- EXPECT_EQ(QuicTime::Delta::Infinite(), |
- generator_.GetFecTimeout(/*sequence_number=*/2u)); |
- |
- // Send more data with MAY_FEC_PROTECT. This packet should also be protected, |
- // and FEC packet is not yet sent. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet3_)); |
- consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
- nullptr); |
- CheckPacketHasSingleStreamFrame(packet3_); |
- EXPECT_TRUE(creator_->IsFecProtected()); |
- |
- // GetFecTimeout returns finite timeout only for first packet in group. |
- EXPECT_EQ(QuicTime::Delta::Infinite(), |
- generator_.GetFecTimeout(/*sequence_number=*/3u)); |
- |
- // Calling OnFecTimeout should cause the FEC packet to be emitted. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet4_)); |
- generator_.OnFecTimeout(); |
- CheckPacketIsFec(packet4_, /*fec_group=*/1u); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
- |
- // Subsequent data is protected under the next FEC group. Send enough data to |
- // create 2 more packets: one full and one partial. |
- { |
- InSequence dummy; |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
- .WillOnce(SaveArg<0>(&packet5_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
- .WillOnce(SaveArg<0>(&packet6_)); |
- } |
- data_len = kDefaultMaxPacketSize + 1u; |
- consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
- MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(data_len, consumed.bytes_consumed); |
- EXPECT_TRUE(consumed.fin_consumed); |
- CheckPacketHasSingleStreamFrame(packet5_); |
- CheckPacketHasSingleStreamFrame(packet6_); |
- EXPECT_TRUE(creator_->IsFecProtected()); |
- |
- // GetFecTimeout returns finite timeout for first packet in the new group. |
- EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs), |
- generator_.GetFecTimeout(/*sequence_number=*/5u)); |
- EXPECT_EQ(QuicTime::Delta::Infinite(), |
- generator_.GetFecTimeout(/*sequence_number=*/6u)); |
- |
- // Calling OnFecTimeout should cause the FEC packet to be emitted. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet7_)); |
- generator_.OnFecTimeout(); |
- CheckPacketIsFec(packet7_, /*fec_group=*/5u); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
- |
- // Send more data with MAY_FEC_PROTECT. No FEC protection, so GetFecTimeout |
- // returns infinite. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet8_)); |
- consumed = generator_.ConsumeData(9, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
- nullptr); |
- CheckPacketHasSingleStreamFrame(packet8_); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
- EXPECT_EQ(QuicTime::Delta::Infinite(), |
- generator_.GetFecTimeout(/*sequence_number=*/8u)); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { |
- // Set the packet size be enough for two stream frames with 0 stream offset, |
- // but not enough for a stream frame of 0 offset and one with non-zero offset. |
- size_t length = |
- NullEncrypter().GetCiphertextSize(0) + |
- GetPacketHeaderSize(creator_->connection_id_length(), true, |
- creator_->next_sequence_number_length(), |
- NOT_IN_FEC_GROUP) + |
- // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger |
- // than the GetMinStreamFrameSize. |
- QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + |
- QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; |
- creator_->set_max_packet_length(length); |
- delegate_.SetCanWriteAnything(); |
- { |
- InSequence dummy; |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet2_)); |
- } |
- generator_.StartBatchOperations(); |
- // Queue enough data to prevent a stream frame with a non-zero offset from |
- // fitting. |
- QuicConsumedData consumed = |
- generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 0, false, |
- MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(3u, consumed.bytes_consumed); |
- EXPECT_FALSE(consumed.fin_consumed); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
- |
- // This frame will not fit with the existing frame, causing the queued frame |
- // to be serialized, and it will not fit with another frame like it, so it is |
- // serialized by itself. |
- consumed = generator_.ConsumeData(kHeadersStreamId, MakeIOVector("bar"), 3, |
- true, MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(3u, consumed.bytes_consumed); |
- EXPECT_TRUE(consumed.fin_consumed); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- |
- PacketContents contents; |
- contents.num_stream_frames = 1; |
- CheckPacketContains(contents, packet_); |
- CheckPacketContains(contents, packet2_); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, NoFecPacketSentWhenBatchEnds) { |
- delegate_.SetCanWriteAnything(); |
- creator_->set_max_packets_per_fec_group(6); |
- |
- generator_.StartBatchOperations(); |
- |
- generator_.ConsumeData(3, MakeIOVector("foo"), 2, true, MUST_FEC_PROTECT, |
- nullptr); |
- QuicConsumedData consumed = generator_.ConsumeData( |
- 5, MakeIOVector("quux"), 7, false, MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(4u, consumed.bytes_consumed); |
- EXPECT_FALSE(consumed.fin_consumed); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
- |
- // Now both frames will be flushed out, but FEC packet is not yet sent. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
- generator_.FinishBatchOperations(); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- |
- PacketContents contents; |
- contents.num_stream_frames = 2u; |
- contents.fec_group = 1u; |
- CheckPacketContains(contents, packet_); |
- |
- // Forcing FEC timeout causes FEC packet to be emitted. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet2_)); |
- generator_.OnFecTimeout(); |
- CheckPacketIsFec(packet2_, /*fec_group=*/1u); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, FecTimeoutOnRttChange) { |
- EXPECT_EQ(QuicTime::Delta::Zero(), |
- QuicPacketGeneratorPeer::GetFecTimeout(&generator_)); |
- generator_.OnRttChange(QuicTime::Delta::FromMilliseconds(300)); |
- EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), |
- QuicPacketGeneratorPeer::GetFecTimeout(&generator_)); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) { |
- delegate_.SetCanWriteAnything(); |
- creator_->set_max_packets_per_fec_group(50); |
- EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
- EXPECT_FALSE(creator_->IsFecGroupOpen()); |
- |
- // On reduced cwnd. |
- generator_.OnCongestionWindowChange(7); |
- EXPECT_EQ(3u, creator_->max_packets_per_fec_group()); |
- |
- // On increased cwnd. |
- generator_.OnCongestionWindowChange(100); |
- EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
- |
- // On collapsed cwnd. |
- generator_.OnCongestionWindowChange(1); |
- EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) { |
- delegate_.SetCanWriteAnything(); |
- generator_.StartBatchOperations(); |
- creator_->set_max_packets_per_fec_group(50); |
- EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
- EXPECT_FALSE(creator_->IsFecGroupOpen()); |
- |
- // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. 3 packets |
- // are sent, one is queued in the creator. |
- { |
- InSequence dummy; |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet2_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet3_)); |
- } |
- size_t data_len = 3 * kDefaultMaxPacketSize + 1; |
- QuicConsumedData consumed = generator_.ConsumeData( |
- 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(data_len, consumed.bytes_consumed); |
- EXPECT_TRUE(creator_->IsFecGroupOpen()); |
- |
- // Change FEC groupsize. |
- generator_.OnCongestionWindowChange(2); |
- EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); |
- |
- // Send enough data to trigger one unprotected data packet, causing the FEC |
- // packet to also be sent. |
- { |
- InSequence dummy; |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet4_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet5_)); |
- } |
- consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, |
- true, MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); |
- // Verify that one FEC packet was sent. |
- CheckPacketIsFec(packet5_, /*fec_group=*/1u); |
- EXPECT_FALSE(creator_->IsFecGroupOpen()); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) { |
- delegate_.SetCanWriteAnything(); |
- creator_->set_max_packets_per_fec_group(2); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
- |
- // Send one unprotected data packet. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet_)); |
- QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
- MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(1u, consumed.bytes_consumed); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
- // Verify that one data packet was sent. |
- PacketContents contents; |
- contents.num_stream_frames = 1; |
- CheckPacketContains(contents, packet_); |
- |
- { |
- InSequence dummy; |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet2_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet3_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet4_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet5_)); |
- } |
- // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. |
- size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
- consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
- MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(data_len, consumed.bytes_consumed); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- |
- // Verify that packets sent were 3 data and 1 FEC. |
- CheckPacketHasSingleStreamFrame(packet2_); |
- CheckPacketHasSingleStreamFrame(packet3_); |
- CheckPacketIsFec(packet4_, /*fec_group=*/2u); |
- CheckPacketHasSingleStreamFrame(packet5_); |
- |
- // Calling OnFecTimeout should emit the pending FEC packet. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet6_)); |
- generator_.OnFecTimeout(); |
- CheckPacketIsFec(packet6_, /*fec_group=*/5u); |
- |
- // Send one unprotected data packet. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet7_)); |
- consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
- nullptr); |
- EXPECT_EQ(1u, consumed.bytes_consumed); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
- // Verify that one unprotected data packet was sent. |
- CheckPacketContains(contents, packet7_); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { |
- delegate_.SetCanWriteAnything(); |
- // Enable FEC. |
- creator_->set_max_packets_per_fec_group(2); |
- |
- generator_.StartBatchOperations(); |
- // Queue enough data to prevent a stream frame with a non-zero offset from |
- // fitting. |
- QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
- MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(1u, consumed.bytes_consumed); |
- EXPECT_TRUE(creator_->HasPendingFrames()); |
- |
- // Queue protected data for sending. Should cause queued frames to be flushed. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet_)); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
- consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
- MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(1u, consumed.bytes_consumed); |
- PacketContents contents; |
- contents.num_stream_frames = 1; |
- // Transmitted packet was not FEC protected. |
- CheckPacketContains(contents, packet_); |
- EXPECT_TRUE(creator_->IsFecProtected()); |
- EXPECT_TRUE(creator_->HasPendingFrames()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { |
- // Enable FEC. |
- creator_->set_max_packets_per_fec_group(2); |
- |
- // Queue control frames in generator. |
- delegate_.SetCanNotWrite(); |
- generator_.SetShouldSendAck(true); |
- delegate_.SetCanWriteAnything(); |
- generator_.StartBatchOperations(); |
- |
- // Set up frames to write into the creator when control frames are written. |
- EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
- EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); |
- |
- // Generator should have queued control frames, and creator should be empty. |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
- EXPECT_FALSE(creator_->HasPendingFrames()); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
- |
- // Queue protected data for sending. Should cause queued frames to be flushed. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet_)); |
- QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
- MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(1u, consumed.bytes_consumed); |
- PacketContents contents; |
- contents.num_ack_frames = 1; |
- contents.num_stop_waiting_frames = 1; |
- CheckPacketContains(contents, packet_); |
- |
- // FEC protection should be on in creator. |
- EXPECT_TRUE(creator_->IsFecProtected()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { |
- delegate_.SetCanWriteAnything(); |
- |
- // Enable FEC. |
- creator_->set_max_packets_per_fec_group(2); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
- |
- // Queue stream frame to be protected in creator. |
- generator_.StartBatchOperations(); |
- QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
- MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(1u, consumed.bytes_consumed); |
- // Creator has a pending protected frame. |
- EXPECT_TRUE(creator_->HasPendingFrames()); |
- EXPECT_TRUE(creator_->IsFecProtected()); |
- |
- // Add enough unprotected data to exceed size of current packet, so that |
- // current packet is sent. Both frames will be sent out in a single packet. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
- size_t data_len = kDefaultMaxPacketSize; |
- consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
- MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(data_len, consumed.bytes_consumed); |
- PacketContents contents; |
- contents.num_stream_frames = 2u; |
- contents.fec_group = 1u; |
- CheckPacketContains(contents, packet_); |
- // FEC protection should still be on in creator. |
- EXPECT_TRUE(creator_->IsFecProtected()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { |
- delegate_.SetCanWriteAnything(); |
- |
- // Enable FEC. |
- creator_->set_max_packets_per_fec_group(2); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
- |
- // Send first packet, FEC protected. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
- QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
- MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(1u, consumed.bytes_consumed); |
- PacketContents contents; |
- contents.num_stream_frames = 1u; |
- contents.fec_group = 1u; |
- CheckPacketContains(contents, packet_); |
- |
- // FEC should still be on in creator. |
- EXPECT_TRUE(creator_->IsFecProtected()); |
- |
- // Send unprotected data to cause second packet to be sent, which gets |
- // protected because it happens to fall within an open FEC group. Data packet |
- // will be followed by FEC packet. |
- { |
- InSequence dummy; |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet2_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet3_)); |
- } |
- consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
- nullptr); |
- EXPECT_EQ(1u, consumed.bytes_consumed); |
- contents.num_stream_frames = 1u; |
- CheckPacketContains(contents, packet2_); |
- CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
- |
- // FEC protection should be off in creator. |
- EXPECT_FALSE(creator_->IsFecProtected()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { |
- delegate_.SetCanWriteAnything(); |
- generator_.StartBatchOperations(); |
- |
- // Enable FEC. |
- creator_->set_max_packets_per_fec_group(2); |
- EXPECT_FALSE(creator_->IsFecProtected()); |
- |
- // Queue one byte of FEC protected data. |
- QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
- MUST_FEC_PROTECT, nullptr); |
- EXPECT_TRUE(creator_->HasPendingFrames()); |
- |
- // Add more unprotected data causing first packet to be sent, FEC protected. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet_)); |
- size_t data_len = kDefaultMaxPacketSize; |
- consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
- MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(data_len, consumed.bytes_consumed); |
- PacketContents contents; |
- contents.num_stream_frames = 2u; |
- contents.fec_group = 1u; |
- CheckPacketContains(contents, packet_); |
- |
- // FEC group is still open in creator. |
- EXPECT_TRUE(creator_->IsFecProtected()); |
- |
- // Add data that should be protected, large enough to cause second packet to |
- // be sent. Data packet should be followed by FEC packet. |
- { |
- InSequence dummy; |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet2_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet3_)); |
- } |
- consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
- MUST_FEC_PROTECT, nullptr); |
- EXPECT_EQ(data_len, consumed.bytes_consumed); |
- CheckPacketContains(contents, packet2_); |
- CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
- |
- // FEC protection should remain on in creator. |
- EXPECT_TRUE(creator_->IsFecProtected()); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { |
- delegate_.SetCanNotWrite(); |
- |
- generator_.SetShouldSendAck(false); |
- generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
- |
- delegate_.SetCanWriteAnything(); |
- |
- generator_.StartBatchOperations(); |
- |
- // When the first write operation is invoked, the ack frame will be returned. |
- EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
- |
- // Send some data and a control frame |
- generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, |
- nullptr); |
- generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
- |
- // All five frames will be flushed out in a single packet. |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
- generator_.FinishBatchOperations(); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- |
- PacketContents contents; |
- contents.num_ack_frames = 1; |
- contents.num_goaway_frames = 1; |
- contents.num_rst_stream_frames = 1; |
- contents.num_stream_frames = 1; |
- CheckPacketContains(contents, packet_); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { |
- delegate_.SetCanNotWrite(); |
- |
- generator_.SetShouldSendAck(false); |
- generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
- EXPECT_TRUE(generator_.HasQueuedFrames()); |
- |
- delegate_.SetCanWriteAnything(); |
- |
- generator_.StartBatchOperations(); |
- |
- // When the first write operation is invoked, the ack frame will be returned. |
- EXPECT_CALL(delegate_, PopulateAckFrame(_)); |
- |
- { |
- InSequence dummy; |
- // All five frames will be flushed out in a single packet |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet_)); |
- EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
- SaveArg<0>(&packet2_)); |
- } |
- |
- // Send enough data to exceed one packet |
- size_t data_len = kDefaultMaxPacketSize + 100; |
- QuicConsumedData consumed = generator_.ConsumeData( |
- 3, CreateData(data_len), 0, true, MAY_FEC_PROTECT, nullptr); |
- EXPECT_EQ(data_len, consumed.bytes_consumed); |
- EXPECT_TRUE(consumed.fin_consumed); |
- generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
- |
- generator_.FinishBatchOperations(); |
- EXPECT_FALSE(generator_.HasQueuedFrames()); |
- |
- // The first packet should have the queued data and part of the stream data. |
- PacketContents contents; |
- contents.num_ack_frames = 1; |
- contents.num_rst_stream_frames = 1; |
- contents.num_stream_frames = 1; |
- CheckPacketContains(contents, packet_); |
- |
- // The second should have the remainder of the stream data. |
- PacketContents contents2; |
- contents2.num_goaway_frames = 1; |
- contents2.num_stream_frames = 1; |
- CheckPacketContains(contents2, packet2_); |
-} |
- |
-TEST_F(QuicPacketGeneratorTest, TestConnectionIdLength) { |
- generator_.SetConnectionIdLength(0); |
- EXPECT_EQ(PACKET_0BYTE_CONNECTION_ID, creator_->connection_id_length()); |
- generator_.SetConnectionIdLength(1); |
- EXPECT_EQ(PACKET_1BYTE_CONNECTION_ID, creator_->connection_id_length()); |
- generator_.SetConnectionIdLength(2); |
- EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); |
- generator_.SetConnectionIdLength(3); |
- EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); |
- generator_.SetConnectionIdLength(4); |
- EXPECT_EQ(PACKET_4BYTE_CONNECTION_ID, creator_->connection_id_length()); |
- generator_.SetConnectionIdLength(5); |
- EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
- generator_.SetConnectionIdLength(6); |
- EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
- generator_.SetConnectionIdLength(7); |
- EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
- generator_.SetConnectionIdLength(8); |
- EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
- generator_.SetConnectionIdLength(9); |
- EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); |
-} |
- |
-} // namespace test |
-} // namespace net |