Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Unified Diff: net/quic/quic_packet_creator_test.cc

Issue 242593002: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Build fix. Use uint32 instead of int Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/quic_packet_creator.cc ('k') | net/quic/quic_packet_generator.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « net/quic/quic_packet_creator.cc ('k') | net/quic/quic_packet_generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698