| Index: net/quic/quic_packet_creator_test.cc
|
| diff --git a/net/quic/quic_packet_creator_test.cc b/net/quic/quic_packet_creator_test.cc
|
| index 33f2f302717e744e9a645b2760460fd43aba74ca..a39d832226f360d022d996b82b2299de8e6b4a4a 100644
|
| --- a/net/quic/quic_packet_creator_test.cc
|
| +++ b/net/quic/quic_packet_creator_test.cc
|
| @@ -27,6 +27,7 @@ using testing::DoAll;
|
| using testing::InSequence;
|
| using testing::Return;
|
| using testing::SaveArg;
|
| +using testing::StrictMock;
|
| using testing::_;
|
|
|
| namespace net {
|
| @@ -77,7 +78,38 @@ vector<TestParams> GetTestParams() {
|
| return params;
|
| }
|
|
|
| +class MockDelegate : public QuicPacketCreator::DelegateInterface {
|
| + public:
|
| + MockDelegate() {}
|
| + ~MockDelegate() override {}
|
| +
|
| + MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet));
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(MockDelegate);
|
| +};
|
| +
|
| class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> {
|
| + public:
|
| + void ClearSerializedPacket(SerializedPacket* serialized_packet) {
|
| + if (serialized_packet == nullptr) {
|
| + return;
|
| + }
|
| +
|
| + delete serialized_packet->retransmittable_frames;
|
| + delete serialized_packet->packet;
|
| + }
|
| +
|
| + void SaveSerializedPacket(SerializedPacket* serialized_packet) {
|
| + if (serialized_packet == nullptr) {
|
| + return;
|
| + }
|
| +
|
| + serialized_packet_ = *serialized_packet;
|
| + serialized_packet_.packet = serialized_packet->packet->Clone();
|
| + delete serialized_packet->packet;
|
| + }
|
| +
|
| protected:
|
| QuicPacketCreatorTest()
|
| : server_framer_(SupportedVersions(GetParam().version),
|
| @@ -88,7 +120,8 @@ class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> {
|
| Perspective::IS_CLIENT),
|
| connection_id_(2),
|
| data_("foo"),
|
| - creator_(connection_id_, &client_framer_, &mock_random_) {
|
| + creator_(connection_id_, &client_framer_, &mock_random_, &delegate_),
|
| + serialized_packet_(creator_.NoPacket()) {
|
| creator_.set_connection_id_length(GetParam().connection_id_length);
|
| client_framer_.set_visitor(&framer_visitor_);
|
| client_framer_.set_received_entropy_calculator(&entropy_calculator_);
|
| @@ -154,13 +187,15 @@ class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> {
|
| QuicFrames frames_;
|
| QuicFramer server_framer_;
|
| QuicFramer client_framer_;
|
| - testing::StrictMock<MockFramerVisitor> framer_visitor_;
|
| + StrictMock<MockFramerVisitor> framer_visitor_;
|
| + StrictMock<MockDelegate> delegate_;
|
| QuicConnectionId connection_id_;
|
| string data_;
|
| struct iovec iov_;
|
| MockRandom mock_random_;
|
| QuicPacketCreator creator_;
|
| MockEntropyCalculator entropy_calculator_;
|
| + SerializedPacket serialized_packet_;
|
| };
|
|
|
| // Run all packet creator tests with all supported versions of QUIC, and with
|
| @@ -254,11 +289,14 @@ TEST_P(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) {
|
| creator_.AddSavedFrame(frames_[0]);
|
| QuicPacketCreatorPeer::SetNextPacketNumberLength(&creator_,
|
| PACKET_4BYTE_PACKET_NUMBER);
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| +
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillRepeatedly(
|
| + Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
|
| + creator_.Flush();
|
| // The packet number length will not change mid-packet.
|
| - EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, serialized.packet_number_length);
|
| + EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
|
| + serialized_packet_.packet_number_length);
|
|
|
| {
|
| InSequence s;
|
| @@ -270,13 +308,14 @@ TEST_P(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) {
|
| EXPECT_CALL(framer_visitor_, OnAckFrame(_));
|
| EXPECT_CALL(framer_visitor_, OnPacketComplete());
|
| }
|
| - ProcessPacket(serialized.packet);
|
| - delete serialized.packet;
|
| + ProcessPacket(serialized_packet_.packet);
|
| + ClearSerializedPacket(&serialized_packet_);
|
|
|
| creator_.AddSavedFrame(frames_[0]);
|
| - serialized = creator_.SerializePacket(buffer, kMaxPacketSize);
|
| + creator_.Flush();
|
| // Now the actual packet number length should have changed.
|
| - EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, serialized.packet_number_length);
|
| + EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
|
| + serialized_packet_.packet_number_length);
|
| delete frames_[0].ack_frame;
|
|
|
| {
|
| @@ -289,8 +328,8 @@ TEST_P(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) {
|
| EXPECT_CALL(framer_visitor_, OnAckFrame(_));
|
| EXPECT_CALL(framer_visitor_, OnPacketComplete());
|
| }
|
| - ProcessPacket(serialized.packet);
|
| - delete serialized.packet;
|
| + ProcessPacket(serialized_packet_.packet);
|
| + ClearSerializedPacket(&serialized_packet_);
|
| }
|
|
|
| TEST_P(QuicPacketCreatorTest, ChangeSequenceNumberLengthMidPacket) {
|
| @@ -315,11 +354,13 @@ TEST_P(QuicPacketCreatorTest, ChangeSequenceNumberLengthMidPacket) {
|
| EXPECT_TRUE(creator_.HasPendingFrames());
|
|
|
| // Ensure the packet is successfully created.
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - ASSERT_TRUE(serialized.packet);
|
| - EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, serialized.packet_number_length);
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillRepeatedly(
|
| + Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
|
| + creator_.Flush();
|
| + ASSERT_TRUE(serialized_packet_.packet);
|
| + EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
|
| + serialized_packet_.packet_number_length);
|
|
|
| // Verify that header in transmitted packet has 1 byte sequence length.
|
| QuicPacketHeader header;
|
| @@ -335,10 +376,10 @@ TEST_P(QuicPacketCreatorTest, ChangeSequenceNumberLengthMidPacket) {
|
| EXPECT_CALL(framer_visitor_, OnStopWaitingFrame(_));
|
| EXPECT_CALL(framer_visitor_, OnPacketComplete());
|
| }
|
| - ProcessPacket(serialized.packet);
|
| + ProcessPacket(serialized_packet_.packet);
|
| EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
|
| header.public_header.packet_number_length);
|
| - delete serialized.packet;
|
| + ClearSerializedPacket(&serialized_packet_);
|
|
|
| // Packet 2.
|
| EXPECT_FALSE(creator_.HasPendingFrames());
|
| @@ -348,9 +389,10 @@ TEST_P(QuicPacketCreatorTest, ChangeSequenceNumberLengthMidPacket) {
|
| EXPECT_TRUE(creator_.HasPendingFrames());
|
|
|
| // Ensure the packet is successfully created.
|
| - serialized = creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - ASSERT_TRUE(serialized.packet);
|
| - EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, serialized.packet_number_length);
|
| + creator_.Flush();
|
| + ASSERT_TRUE(serialized_packet_.packet);
|
| + EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
|
| + serialized_packet_.packet_number_length);
|
|
|
| // Verify that header in transmitted packet has 4 byte sequence length.
|
| {
|
| @@ -364,11 +406,11 @@ TEST_P(QuicPacketCreatorTest, ChangeSequenceNumberLengthMidPacket) {
|
| EXPECT_CALL(framer_visitor_, OnStopWaitingFrame(_));
|
| EXPECT_CALL(framer_visitor_, OnPacketComplete());
|
| }
|
| - ProcessPacket(serialized.packet);
|
| + ProcessPacket(serialized_packet_.packet);
|
| EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER,
|
| header.public_header.packet_number_length);
|
|
|
| - delete serialized.packet;
|
| + ClearSerializedPacket(&serialized_packet_);
|
| delete ack_frame.ack_frame;
|
| }
|
|
|
| @@ -390,10 +432,12 @@ TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
|
| // Change the packet number length mid-FEC group and it should not change.
|
| QuicPacketCreatorPeer::SetNextPacketNumberLength(&creator_,
|
| PACKET_4BYTE_PACKET_NUMBER);
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, serialized.packet_number_length);
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillRepeatedly(
|
| + Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
|
| + creator_.Flush();
|
| + EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
|
| + serialized_packet_.packet_number_length);
|
|
|
| {
|
| InSequence s;
|
| @@ -406,13 +450,14 @@ TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
|
| EXPECT_CALL(framer_visitor_, OnAckFrame(_));
|
| EXPECT_CALL(framer_visitor_, OnPacketComplete());
|
| }
|
| - ProcessPacket(serialized.packet);
|
| - delete serialized.packet;
|
| + ProcessPacket(serialized_packet_.packet);
|
| + ClearSerializedPacket(&serialized_packet_);
|
|
|
| // Generate Packet 2.
|
| creator_.AddSavedFrame(frames_[0]);
|
| - serialized = creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, serialized.packet_number_length);
|
| + creator_.Flush();
|
| + EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER,
|
| + serialized_packet_.packet_number_length);
|
|
|
| {
|
| InSequence s;
|
| @@ -425,8 +470,8 @@ TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
|
| EXPECT_CALL(framer_visitor_, OnAckFrame(_));
|
| EXPECT_CALL(framer_visitor_, OnPacketComplete());
|
| }
|
| - ProcessPacket(serialized.packet);
|
| - delete serialized.packet;
|
| + ProcessPacket(serialized_packet_.packet);
|
| + ClearSerializedPacket(&serialized_packet_);
|
|
|
| // Should return false since we do not have enough packets in the FEC group to
|
| // trigger an FEC packet.
|
| @@ -435,7 +480,8 @@ TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
|
| ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
|
|
|
| // Force generation of FEC packet.
|
| - serialized = creator_.SerializeFec(buffer, kMaxPacketSize);
|
| + char buffer[kMaxPacketSize];
|
| + SerializedPacket serialized = creator_.SerializeFec(buffer, kMaxPacketSize);
|
| EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, serialized.packet_number_length);
|
| ASSERT_EQ(3u, serialized.packet_number);
|
|
|
| @@ -450,13 +496,13 @@ TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
|
| EXPECT_CALL(framer_visitor_, OnPacketComplete());
|
| }
|
| ProcessPacket(serialized.packet);
|
| - delete serialized.packet;
|
| + ClearSerializedPacket(&serialized);
|
|
|
| // Ensure the next FEC group starts using the new packet number length.
|
| serialized = creator_.SerializeAllFrames(frames_, buffer, kMaxPacketSize);
|
| EXPECT_EQ(PACKET_4BYTE_PACKET_NUMBER, serialized.packet_number_length);
|
| delete frames_[0].ack_frame;
|
| - delete serialized.packet;
|
| + ClearSerializedPacket(&serialized);
|
| }
|
|
|
| TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) {
|
| @@ -646,11 +692,9 @@ TEST_P(QuicPacketCreatorTest, SwitchFecOnWithStreamFrameQueued) {
|
| EXPECT_FALSE(creator_.IsFecProtected());
|
|
|
| // Serialize packet for transmission.
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - delete serialized.packet;
|
| - delete serialized.retransmittable_frames;
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket));
|
| + creator_.Flush();
|
| EXPECT_FALSE(creator_.HasPendingFrames());
|
|
|
| // Since all pending frames have been serialized, turning FEC on should work.
|
| @@ -705,25 +749,24 @@ TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
|
| if (should_have_room) {
|
| QuicFrame frame;
|
| QuicIOVector io_vector(MakeIOVector("testdata"));
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillRepeatedly(
|
| + Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket));
|
| ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u,
|
| kOffset, false, false, &frame));
|
| ASSERT_TRUE(frame.stream_frame);
|
| size_t bytes_consumed = frame.stream_frame->data.length();
|
| EXPECT_LT(0u, bytes_consumed);
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized_packet =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - ASSERT_TRUE(serialized_packet.packet);
|
| - delete serialized_packet.packet;
|
| - delete serialized_packet.retransmittable_frames;
|
| + creator_.Flush();
|
| }
|
| }
|
| }
|
|
|
| TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
|
| // Compute the total overhead for a single frame in packet.
|
| - const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP)
|
| - + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP);
|
| + const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) +
|
| + GetEncryptionOverhead() +
|
| + GetStreamFrameOverhead(NOT_IN_FEC_GROUP);
|
| size_t capacity = kDefaultMaxPacketSize - overhead;
|
| // Now, test various sizes around this size.
|
| for (int delta = -5; delta <= 5; ++delta) {
|
| @@ -731,23 +774,23 @@ TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
|
| size_t bytes_free = delta > 0 ? 0 : 0 - delta;
|
| QuicFrame frame;
|
| QuicIOVector io_vector(MakeIOVector(data));
|
| - ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u,
|
| - kOffset, false, false, &frame));
|
| - ASSERT_TRUE(frame.stream_frame);
|
| - size_t bytes_consumed = frame.stream_frame->data.length();
|
| + UniqueStreamBuffer stream_buffer;
|
| + size_t bytes_consumed = QuicPacketCreatorPeer::CreateStreamFrame(
|
| + &creator_, kClientDataStreamId1, io_vector, 0u, kOffset, false, &frame,
|
| + &stream_buffer);
|
| EXPECT_EQ(capacity - bytes_free, bytes_consumed);
|
|
|
| + ASSERT_TRUE(creator_.AddSavedFrame(frame));
|
| // BytesFree() returns bytes available for the next frame, which will
|
| // be two bytes smaller since the stream frame would need to be grown.
|
| EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
|
| size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
|
| EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized_packet =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - ASSERT_TRUE(serialized_packet.packet);
|
| - delete serialized_packet.packet;
|
| - delete serialized_packet.retransmittable_frames;
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
|
| + creator_.Flush();
|
| + ASSERT_TRUE(serialized_packet_.packet);
|
| + ClearSerializedPacket(&serialized_packet_);
|
| }
|
| }
|
|
|
| @@ -755,8 +798,9 @@ TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) {
|
| // Enable FEC protection, and send FEC packet every 6 packets.
|
| EXPECT_TRUE(SwitchFecProtectionOn(6));
|
| // Compute the total overhead for a single frame in packet.
|
| - const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP)
|
| - + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP);
|
| + const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) +
|
| + GetEncryptionOverhead() +
|
| + GetStreamFrameOverhead(IN_FEC_GROUP);
|
| size_t capacity = kDefaultMaxPacketSize - overhead;
|
| // Now, test various sizes around this size.
|
| for (int delta = -5; delta <= 5; ++delta) {
|
| @@ -764,24 +808,24 @@ TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) {
|
| size_t bytes_free = delta > 0 ? 0 : 0 - delta;
|
| QuicFrame frame;
|
| QuicIOVector io_vector(MakeIOVector(data));
|
| - ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u,
|
| - kOffset, false, false, &frame));
|
| - ASSERT_TRUE(frame.stream_frame);
|
| - size_t bytes_consumed = frame.stream_frame->data.length();;
|
| + UniqueStreamBuffer stream_buffer;
|
| + size_t bytes_consumed = QuicPacketCreatorPeer::CreateStreamFrame(
|
| + &creator_, kClientDataStreamId1, io_vector, 0u, kOffset, false, &frame,
|
| + &stream_buffer);
|
| EXPECT_EQ(capacity - bytes_free, bytes_consumed);
|
|
|
| + ASSERT_TRUE(creator_.AddSavedFrame(frame));
|
| // BytesFree() returns bytes available for the next frame. Since stream
|
| // frame does not grow for FEC protected packets, this should be the same
|
| // as bytes_free (bound by 0).
|
| EXPECT_EQ(0u, creator_.ExpansionOnNewFrame());
|
| size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0;
|
| EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized_packet =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - ASSERT_TRUE(serialized_packet.packet);
|
| - delete serialized_packet.packet;
|
| - delete serialized_packet.retransmittable_frames;
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
|
| + creator_.Flush();
|
| + ASSERT_TRUE(serialized_packet_.packet);
|
| + ClearSerializedPacket(&serialized_packet_);
|
| }
|
| }
|
|
|
| @@ -798,26 +842,26 @@ TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
|
|
|
| QuicFrame frame;
|
| QuicIOVector io_vector(MakeIOVector(data));
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillRepeatedly(
|
| + Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
|
| ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, kOffset,
|
| false, true, &frame));
|
| ASSERT_TRUE(frame.stream_frame);
|
| size_t bytes_consumed = frame.stream_frame->data.length();
|
| EXPECT_LT(0u, bytes_consumed);
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized_packet =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - ASSERT_TRUE(serialized_packet.packet);
|
| + creator_.Flush();
|
| + ASSERT_TRUE(serialized_packet_.packet);
|
| // If there is not enough space in the packet to fit a padding frame
|
| // (1 byte) and to expand the stream frame (another 2 bytes) the packet
|
| // will not be padded.
|
| if (bytes_free < 3) {
|
| EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
|
| - serialized_packet.packet->length());
|
| + serialized_packet_.packet->length());
|
| } else {
|
| - EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet.packet->length());
|
| + EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.packet->length());
|
| }
|
| - delete serialized_packet.packet;
|
| - delete serialized_packet.retransmittable_frames;
|
| + ClearSerializedPacket(&serialized_packet_);
|
| }
|
| }
|
|
|
| @@ -834,23 +878,22 @@ TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
|
|
|
| QuicFrame frame;
|
| QuicIOVector io_vector(MakeIOVector(data));
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
|
| ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u,
|
| kOffset, false, false, &frame));
|
| ASSERT_TRUE(frame.stream_frame);
|
| size_t bytes_consumed = frame.stream_frame->data.length();
|
| EXPECT_LT(0u, bytes_consumed);
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized_packet =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - ASSERT_TRUE(serialized_packet.packet);
|
| + creator_.Flush();
|
| + ASSERT_TRUE(serialized_packet_.packet);
|
| if (bytes_free > 0) {
|
| EXPECT_EQ(kDefaultMaxPacketSize - bytes_free,
|
| - serialized_packet.packet->length());
|
| + serialized_packet_.packet->length());
|
| } else {
|
| - EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet.packet->length());
|
| + EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet_.packet->length());
|
| }
|
| - delete serialized_packet.packet;
|
| - delete serialized_packet.retransmittable_frames;
|
| + ClearSerializedPacket(&serialized_packet_);
|
| }
|
| }
|
|
|
| @@ -969,15 +1012,19 @@ TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) {
|
| QuicFrame frame;
|
| const string too_long_payload(payload_length * 2, 'a');
|
| QuicIOVector io_vector(MakeIOVector(too_long_payload));
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
|
| ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame));
|
| ASSERT_TRUE(frame.stream_frame);
|
| size_t consumed = frame.stream_frame->data.length();
|
| EXPECT_EQ(payload_length, consumed);
|
| const string payload(payload_length, 'a');
|
| CheckStreamFrame(frame, 1u, payload, 0u, false);
|
| + creator_.Flush();
|
| + ClearSerializedPacket(&serialized_packet_);
|
| }
|
|
|
| -TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) {
|
| +TEST_P(QuicPacketCreatorTest, AddFrameAndFlush) {
|
| if (!GetParam().version_serialization) {
|
| creator_.StopSendingVersion();
|
| }
|
| @@ -1010,20 +1057,20 @@ TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) {
|
| EXPECT_TRUE(creator_.HasPendingFrames());
|
| EXPECT_EQ(0u, creator_.BytesFree());
|
|
|
| + // Packet is full. Creator will flush.
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
|
| EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
|
|
|
| // Ensure the packet is successfully created.
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - ASSERT_TRUE(serialized.packet);
|
| - delete serialized.packet;
|
| - ASSERT_TRUE(serialized.retransmittable_frames);
|
| - RetransmittableFrames* retransmittable = serialized.retransmittable_frames;
|
| + ASSERT_TRUE(serialized_packet_.packet);
|
| + ASSERT_TRUE(serialized_packet_.retransmittable_frames);
|
| + RetransmittableFrames* retransmittable =
|
| + serialized_packet_.retransmittable_frames;
|
| ASSERT_EQ(1u, retransmittable->frames().size());
|
| EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type);
|
| ASSERT_TRUE(retransmittable->frames()[0].stream_frame);
|
| - delete serialized.retransmittable_frames;
|
| + ClearSerializedPacket(&serialized_packet_);
|
|
|
| EXPECT_FALSE(creator_.HasPendingFrames());
|
| EXPECT_EQ(max_plaintext_size -
|
| @@ -1067,17 +1114,15 @@ TEST_P(QuicPacketCreatorTest, SerializeTruncatedAckFrameWithLargePacketSize) {
|
|
|
| // Ensure the packet is successfully created, and the packet size estimate
|
| // matches the serialized packet length.
|
| - EXPECT_CALL(entropy_calculator_,
|
| - EntropyHash(_)).WillOnce(testing::Return(0));
|
| + EXPECT_CALL(entropy_calculator_, EntropyHash(_)).WillOnce(testing::Return(0));
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
|
| size_t est_packet_size = creator_.PacketSize();
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - ASSERT_TRUE(serialized.packet);
|
| - EXPECT_EQ(est_packet_size,
|
| - client_framer_.GetMaxPlaintextSize(serialized.packet->length()));
|
| - delete serialized.retransmittable_frames;
|
| - delete serialized.packet;
|
| + creator_.Flush();
|
| + ASSERT_TRUE(serialized_packet_.packet);
|
| + EXPECT_EQ(est_packet_size, client_framer_.GetMaxPlaintextSize(
|
| + serialized_packet_.packet->length()));
|
| + ClearSerializedPacket(&serialized_packet_);
|
| }
|
|
|
| TEST_P(QuicPacketCreatorTest, SerializeTruncatedAckFrameWithSmallPacketSize) {
|
| @@ -1107,16 +1152,15 @@ TEST_P(QuicPacketCreatorTest, SerializeTruncatedAckFrameWithSmallPacketSize) {
|
|
|
| // Ensure the packet is successfully created, and the packet size estimate
|
| // may not match the serialized packet length.
|
| - EXPECT_CALL(entropy_calculator_,
|
| - EntropyHash(_)).WillOnce(Return(0));
|
| + EXPECT_CALL(entropy_calculator_, EntropyHash(_)).WillOnce(Return(0));
|
| size_t est_packet_size = creator_.PacketSize();
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - ASSERT_TRUE(serialized.packet);
|
| - EXPECT_GE(est_packet_size,
|
| - client_framer_.GetMaxPlaintextSize(serialized.packet->length()));
|
| - delete serialized.packet;
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
|
| + creator_.Flush();
|
| + ASSERT_TRUE(serialized_packet_.packet);
|
| + EXPECT_GE(est_packet_size, client_framer_.GetMaxPlaintextSize(
|
| + serialized_packet_.packet->length()));
|
| + ClearSerializedPacket(&serialized_packet_);
|
| }
|
|
|
|
|
| @@ -1212,12 +1256,9 @@ TEST_P(QuicPacketCreatorTest, ResetFecGroupWithQueuedFrames) {
|
| EXPECT_DFATAL(creator_.ResetFecGroup(),
|
| "Cannot reset FEC group with pending frames.");
|
|
|
| - // Serialize packet for transmission.
|
| - char buffer[kMaxPacketSize];
|
| - SerializedPacket serialized =
|
| - creator_.SerializePacket(buffer, kMaxPacketSize);
|
| - delete serialized.packet;
|
| - delete serialized.retransmittable_frames;
|
| + EXPECT_CALL(delegate_, OnSerializedPacket(_))
|
| + .WillOnce(Invoke(this, &QuicPacketCreatorTest::ClearSerializedPacket));
|
| + creator_.Flush();
|
| EXPECT_FALSE(creator_.HasPendingFrames());
|
|
|
| // Close the FEC Group.
|
|
|