| 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 bbd8e8d5b3a8572d99c27488f9ed643bc91e9d89..a307078b4b9b2ae66302a85bc1c96a72369895b4 100644
|
| --- a/net/quic/quic_packet_creator_test.cc
|
| +++ b/net/quic/quic_packet_creator_test.cc
|
| @@ -12,9 +12,11 @@
|
| #include "net/quic/test_tools/mock_random.h"
|
| #include "net/quic/test_tools/quic_packet_creator_peer.h"
|
| #include "net/quic/test_tools/quic_test_utils.h"
|
| +#include "net/test/gtest_util.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
|
|
| using base::StringPiece;
|
| +using std::ostream;
|
| using std::string;
|
| using std::vector;
|
| using testing::DoAll;
|
| @@ -27,11 +29,42 @@ namespace net {
|
| namespace test {
|
| namespace {
|
|
|
| -class QuicPacketCreatorTest : public ::testing::TestWithParam<bool> {
|
| +// Run tests with combinations of {QuicVersion, ToggleVersionSerialization}.
|
| +struct TestParams {
|
| + TestParams(QuicVersion version,
|
| + bool version_serialization)
|
| + : version(version),
|
| + version_serialization(version_serialization) {
|
| + }
|
| +
|
| + friend ostream& operator<<(ostream& os, const TestParams& p) {
|
| + os << "{ client_version: " << QuicVersionToString(p.version)
|
| + << " include version: " << p.version_serialization << " }";
|
| + return os;
|
| + }
|
| +
|
| + QuicVersion version;
|
| + bool version_serialization;
|
| +};
|
| +
|
| +// Constructs various test permutations.
|
| +vector<TestParams> GetTestParams() {
|
| + vector<TestParams> params;
|
| + QuicVersionVector all_supported_versions = QuicSupportedVersions();
|
| + for (size_t i = 0; i < all_supported_versions.size(); ++i) {
|
| + params.push_back(TestParams(all_supported_versions[i], true));
|
| + params.push_back(TestParams(all_supported_versions[i], false));
|
| + }
|
| + return params;
|
| +}
|
| +
|
| +class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> {
|
| protected:
|
| QuicPacketCreatorTest()
|
| - : server_framer_(QuicSupportedVersions(), QuicTime::Zero(), true),
|
| - client_framer_(QuicSupportedVersions(), QuicTime::Zero(), false),
|
| + : server_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(),
|
| + true),
|
| + client_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(),
|
| + false),
|
| sequence_number_(0),
|
| connection_id_(2),
|
| data_("foo"),
|
| @@ -101,7 +134,14 @@ class QuicPacketCreatorTest : public ::testing::TestWithParam<bool> {
|
| QuicPacketCreator creator_;
|
| };
|
|
|
| -TEST_F(QuicPacketCreatorTest, SerializeFrames) {
|
| +// Run all packet creator tests with all supported versions of QUIC, and with
|
| +// and without version in the packet header.
|
| +INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests,
|
| + QuicPacketCreatorTest,
|
| + ::testing::ValuesIn(GetTestParams()));
|
| +
|
| +
|
| +TEST_P(QuicPacketCreatorTest, SerializeFrames) {
|
| frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u))));
|
| frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
|
| frames_.push_back(QuicFrame(new QuicStreamFrame(0u, true, 0u, IOVector())));
|
| @@ -125,9 +165,11 @@ TEST_F(QuicPacketCreatorTest, SerializeFrames) {
|
| delete serialized.packet;
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, SerializeWithFEC) {
|
| +TEST_P(QuicPacketCreatorTest, SerializeWithFEC) {
|
| creator_.options()->max_packets_per_fec_group = 6;
|
| - ASSERT_FALSE(creator_.ShouldSendFec(false));
|
| + // Should return false since we do not have enough packets in the FEC group to
|
| + // trigger an FEC packet.
|
| + ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
|
|
|
| frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
|
| SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
|
| @@ -139,19 +181,35 @@ TEST_F(QuicPacketCreatorTest, SerializeWithFEC) {
|
| EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
|
| EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
|
| EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
|
| - EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
|
| + if (GetParam().version != QUIC_VERSION_13) {
|
| + // FEC is only used for versions > 13.
|
| + EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
|
| + }
|
| EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
|
| EXPECT_CALL(framer_visitor_, OnPacketComplete());
|
| }
|
| ProcessPacket(serialized.packet);
|
| delete serialized.packet;
|
|
|
| - ASSERT_FALSE(creator_.ShouldSendFec(false));
|
| - ASSERT_TRUE(creator_.ShouldSendFec(true));
|
| + // Should return false since we do not have enough packets in the FEC group to
|
| + // trigger an FEC packet.
|
| + ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
|
| + if (GetParam().version == QUIC_VERSION_13) {
|
| + // FEC is only used for versions > 13.
|
| + ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/true));
|
| + } else {
|
| + // Should return true since there are packets in the FEC group.
|
| + ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
|
| + }
|
|
|
| + if (GetParam().version == QUIC_VERSION_13) {
|
| + // FEC is only used for versions > 13.
|
| + EXPECT_DFATAL(creator_.SerializeFec(),
|
| + "SerializeFEC called but no group or zero packets in group.");
|
| + return;
|
| + }
|
| serialized = creator_.SerializeFec();
|
| ASSERT_EQ(2u, serialized.sequence_number);
|
| -
|
| {
|
| InSequence s;
|
| EXPECT_CALL(framer_visitor_, OnPacket());
|
| @@ -165,7 +223,7 @@ TEST_F(QuicPacketCreatorTest, SerializeWithFEC) {
|
| delete serialized.packet;
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) {
|
| +TEST_P(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) {
|
| frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u))));
|
| creator_.AddSavedFrame(frames_[0]);
|
| creator_.options()->send_sequence_number_length =
|
| @@ -205,11 +263,22 @@ TEST_F(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) {
|
| delete serialized.packet;
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
|
| +TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
|
| + if (GetParam().version == QUIC_VERSION_13) {
|
| + // FEC is only used for ver. > 13. This test does not add value for ver. 13.
|
| + return;
|
| + }
|
| + // Test goal is to test the following sequence (P1 => generate Packet 1):
|
| + // P1 <change seq num length> P2 FEC,
|
| + // and we expect that sequence number length should not change until the end
|
| + // of the open FEC group.
|
| creator_.options()->max_packets_per_fec_group = 6;
|
| - ASSERT_FALSE(creator_.ShouldSendFec(false));
|
| -
|
| + // Should return false since we do not have enough packets in the FEC group to
|
| + // trigger an FEC packet.
|
| + ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
|
| frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u))));
|
| +
|
| + // Generate Packet 1.
|
| creator_.AddSavedFrame(frames_[0]);
|
| // Change the sequence number length mid-FEC group and it should not change.
|
| creator_.options()->send_sequence_number_length =
|
| @@ -230,12 +299,34 @@ TEST_F(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
|
| ProcessPacket(serialized.packet);
|
| delete serialized.packet;
|
|
|
| - ASSERT_FALSE(creator_.ShouldSendFec(false));
|
| - ASSERT_TRUE(creator_.ShouldSendFec(true));
|
| + // Generate Packet 2.
|
| + creator_.AddSavedFrame(frames_[0]);
|
| + serialized = creator_.SerializePacket();
|
| + EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
|
|
|
| + {
|
| + InSequence s;
|
| + EXPECT_CALL(framer_visitor_, OnPacket());
|
| + EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
|
| + EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
|
| + EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
|
| + EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
|
| + EXPECT_CALL(framer_visitor_, OnAckFrame(_));
|
| + EXPECT_CALL(framer_visitor_, OnPacketComplete());
|
| + }
|
| + ProcessPacket(serialized.packet);
|
| + delete serialized.packet;
|
| +
|
| + // Should return false since we do not have enough packets in the FEC group to
|
| + // trigger an FEC packet.
|
| + ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
|
| + // Should return true since there are packets in the FEC group.
|
| + ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
|
| +
|
| + // Force generation of FEC packet.
|
| serialized = creator_.SerializeFec();
|
| EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
|
| - ASSERT_EQ(2u, serialized.sequence_number);
|
| + ASSERT_EQ(3u, serialized.sequence_number);
|
|
|
| {
|
| InSequence s;
|
| @@ -256,7 +347,7 @@ TEST_F(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
|
| delete serialized.packet;
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) {
|
| +TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) {
|
| // If the original packet sequence number length, the current sequence number
|
| // length, and the configured send sequence number length are different, the
|
| // retransmit must sent with the original length and the others do not change.
|
| @@ -287,7 +378,7 @@ TEST_F(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) {
|
| delete serialized.packet;
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, SerializeConnectionClose) {
|
| +TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
|
| QuicConnectionCloseFrame frame;
|
| frame.error_code = QUIC_NO_ERROR;
|
| frame.error_details = "error";
|
| @@ -308,7 +399,7 @@ TEST_F(QuicPacketCreatorTest, SerializeConnectionClose) {
|
| delete serialized.packet;
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, CreateStreamFrame) {
|
| +TEST_P(QuicPacketCreatorTest, CreateStreamFrame) {
|
| QuicFrame frame;
|
| size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u,
|
| false, &frame);
|
| @@ -317,7 +408,7 @@ TEST_F(QuicPacketCreatorTest, CreateStreamFrame) {
|
| delete frame.stream_frame;
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, CreateStreamFrameFin) {
|
| +TEST_P(QuicPacketCreatorTest, CreateStreamFrameFin) {
|
| QuicFrame frame;
|
| size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 10u,
|
| true, &frame);
|
| @@ -326,7 +417,7 @@ TEST_F(QuicPacketCreatorTest, CreateStreamFrameFin) {
|
| delete frame.stream_frame;
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, CreateStreamFrameFinOnly) {
|
| +TEST_P(QuicPacketCreatorTest, CreateStreamFrameFinOnly) {
|
| QuicFrame frame;
|
| size_t consumed = creator_.CreateStreamFrame(1u, IOVector(), 0u, true,
|
| &frame);
|
| @@ -335,7 +426,7 @@ TEST_F(QuicPacketCreatorTest, CreateStreamFrameFinOnly) {
|
| delete frame.stream_frame;
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
|
| +TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
|
| const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP)
|
| + GetEncryptionOverhead();
|
| for (size_t i = overhead; i < overhead + 100; ++i) {
|
| @@ -358,7 +449,7 @@ TEST_F(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
|
| }
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, StreamFrameConsumption) {
|
| +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);
|
| @@ -385,7 +476,11 @@ TEST_F(QuicPacketCreatorTest, StreamFrameConsumption) {
|
| }
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, StreamFrameConsumptionInFecProtectedPacket) {
|
| +TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) {
|
| + if (GetParam().version == QUIC_VERSION_13) {
|
| + // Test below tests behavior with version 13.
|
| + return;
|
| + }
|
| // Turn on FEC protection.
|
| creator_.options()->max_packets_per_fec_group = 6;
|
| // Compute the total overhead for a single frame in packet.
|
| @@ -415,7 +510,40 @@ TEST_F(QuicPacketCreatorTest, StreamFrameConsumptionInFecProtectedPacket) {
|
| }
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
|
| +TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFecOnlyVersion13) {
|
| + if (GetParam().version != QUIC_VERSION_13) {
|
| + return;
|
| + }
|
| + // Turn on FEC protection. Behavior should be exactly the same as if FEC was
|
| + // NOT turned on. This test is the same as StreamFrameConsumption above.
|
| + creator_.options()->max_packets_per_fec_group = 6;
|
| + // 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);
|
| + size_t capacity = kDefaultMaxPacketSize - overhead;
|
| + // Now, test various sizes around this size.
|
| + for (int delta = -5; delta <= 5; ++delta) {
|
| + string data(capacity + delta, 'A');
|
| + size_t bytes_free = delta > 0 ? 0 : 0 - delta;
|
| + QuicFrame frame;
|
| + size_t bytes_consumed = creator_.CreateStreamFrame(
|
| + kStreamId, MakeIOVector(data), kOffset, false, &frame);
|
| + 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;
|
| + SerializedPacket serialized_packet = creator_.SerializePacket();
|
| + ASSERT_TRUE(serialized_packet.packet);
|
| + delete serialized_packet.packet;
|
| + delete serialized_packet.retransmittable_frames;
|
| + }
|
| +}
|
| +
|
| +TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
|
| // 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);
|
| @@ -448,7 +576,7 @@ TEST_F(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
|
| }
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
|
| +TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
|
| // 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);
|
| @@ -478,7 +606,7 @@ TEST_F(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
|
| }
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
|
| +TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
|
| QuicPacketCreatorPeer::SetIsServer(&creator_, true);
|
| QuicVersionVector versions;
|
| versions.push_back(test::QuicVersionMax());
|
| @@ -494,7 +622,7 @@ TEST_F(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
|
| client_framer_.ProcessPacket(*encrypted.get());
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
|
| +TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
|
| EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
|
| creator_.options()->send_sequence_number_length);
|
|
|
| @@ -519,7 +647,7 @@ TEST_F(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
|
| creator_.options()->send_sequence_number_length);
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthBandwidth) {
|
| +TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthBandwidth) {
|
| EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
|
| creator_.options()->send_sequence_number_length);
|
|
|
| @@ -541,7 +669,7 @@ TEST_F(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthBandwidth) {
|
| creator_.options()->send_sequence_number_length);
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, CreateStreamFrameWithNotifier) {
|
| +TEST_P(QuicPacketCreatorTest, CreateStreamFrameWithNotifier) {
|
| // Ensure that if CreateStreamFrame does not consume any data (e.g. a FIN only
|
| // frame) then any QuicAckNotifier that is passed in still gets attached to
|
| // the frame.
|
| @@ -557,12 +685,8 @@ TEST_F(QuicPacketCreatorTest, CreateStreamFrameWithNotifier) {
|
| delete frame.stream_frame;
|
| }
|
|
|
| -INSTANTIATE_TEST_CASE_P(ToggleVersionSerialization,
|
| - QuicPacketCreatorTest,
|
| - ::testing::Values(false, true));
|
| -
|
| TEST_P(QuicPacketCreatorTest, SerializeFrame) {
|
| - if (!GetParam()) {
|
| + if (!GetParam().version_serialization) {
|
| creator_.StopSendingVersion();
|
| }
|
| frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
|
| @@ -581,12 +705,13 @@ TEST_P(QuicPacketCreatorTest, SerializeFrame) {
|
| EXPECT_CALL(framer_visitor_, OnPacketComplete());
|
| }
|
| ProcessPacket(serialized.packet);
|
| - EXPECT_EQ(GetParam(), header.public_header.version_flag);
|
| + EXPECT_EQ(GetParam().version_serialization,
|
| + header.public_header.version_flag);
|
| delete serialized.packet;
|
| }
|
|
|
| TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) {
|
| - if (!GetParam()) {
|
| + if (!GetParam().version_serialization) {
|
| creator_.StopSendingVersion();
|
| }
|
| // A string larger than fits into a frame.
|
| @@ -606,7 +731,7 @@ TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) {
|
| }
|
|
|
| TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) {
|
| - if (!GetParam()) {
|
| + if (!GetParam().version_serialization) {
|
| creator_.StopSendingVersion();
|
| }
|
| const size_t max_plaintext_size =
|
| @@ -665,7 +790,7 @@ TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) {
|
| creator_.BytesFree());
|
| }
|
|
|
| -TEST_F(QuicPacketCreatorTest, EntropyFlag) {
|
| +TEST_P(QuicPacketCreatorTest, EntropyFlag) {
|
| frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
|
|
|
| for (int i = 0; i < 2; ++i) {
|
|
|