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

Side by Side Diff: net/quic/quic_packet_creator_test.cc

Issue 300683008: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_packet_creator.cc ('k') | net/quic/quic_protocol.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_packet_creator.h" 5 #include "net/quic/quic_packet_creator.h"
6 6
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "net/quic/crypto/null_encrypter.h" 8 #include "net/quic/crypto/null_encrypter.h"
9 #include "net/quic/crypto/quic_decrypter.h" 9 #include "net/quic/crypto/quic_decrypter.h"
10 #include "net/quic/crypto/quic_encrypter.h" 10 #include "net/quic/crypto/quic_encrypter.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 QuicPacketCreatorTest() 63 QuicPacketCreatorTest()
64 : server_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(), 64 : server_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(),
65 true), 65 true),
66 client_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(), 66 client_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(),
67 false), 67 false),
68 sequence_number_(0), 68 sequence_number_(0),
69 connection_id_(2), 69 connection_id_(2),
70 data_("foo"), 70 data_("foo"),
71 creator_(connection_id_, &client_framer_, &mock_random_, false) { 71 creator_(connection_id_, &client_framer_, &mock_random_, false) {
72 client_framer_.set_visitor(&framer_visitor_); 72 client_framer_.set_visitor(&framer_visitor_);
73 client_framer_.set_received_entropy_calculator(&entropy_calculator_);
73 server_framer_.set_visitor(&framer_visitor_); 74 server_framer_.set_visitor(&framer_visitor_);
74 } 75 }
75 ~QuicPacketCreatorTest() { 76 ~QuicPacketCreatorTest() {
76 } 77 }
77 78
78 void ProcessPacket(QuicPacket* packet) { 79 void ProcessPacket(QuicPacket* packet) {
79 scoped_ptr<QuicEncryptedPacket> encrypted( 80 scoped_ptr<QuicEncryptedPacket> encrypted(
80 server_framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number_, 81 server_framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number_,
81 *packet)); 82 *packet));
82 server_framer_.ProcessPacket(*encrypted); 83 server_framer_.ProcessPacket(*encrypted);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 125
125 QuicFrames frames_; 126 QuicFrames frames_;
126 QuicFramer server_framer_; 127 QuicFramer server_framer_;
127 QuicFramer client_framer_; 128 QuicFramer client_framer_;
128 testing::StrictMock<MockFramerVisitor> framer_visitor_; 129 testing::StrictMock<MockFramerVisitor> framer_visitor_;
129 QuicPacketSequenceNumber sequence_number_; 130 QuicPacketSequenceNumber sequence_number_;
130 QuicConnectionId connection_id_; 131 QuicConnectionId connection_id_;
131 string data_; 132 string data_;
132 MockRandom mock_random_; 133 MockRandom mock_random_;
133 QuicPacketCreator creator_; 134 QuicPacketCreator creator_;
135 MockEntropyCalculator entropy_calculator_;
134 }; 136 };
135 137
136 // Run all packet creator tests with all supported versions of QUIC, and with 138 // Run all packet creator tests with all supported versions of QUIC, and with
137 // and without version in the packet header. 139 // and without version in the packet header.
138 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests, 140 INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests,
139 QuicPacketCreatorTest, 141 QuicPacketCreatorTest,
140 ::testing::ValuesIn(GetTestParams())); 142 ::testing::ValuesIn(GetTestParams()));
141 143
142 TEST_P(QuicPacketCreatorTest, SerializeFrames) { 144 TEST_P(QuicPacketCreatorTest, SerializeFrames) {
143 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)))); 145 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u))));
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_)); 248 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
247 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_)); 249 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
248 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)); 250 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
249 EXPECT_CALL(framer_visitor_, OnAckFrame(_)); 251 EXPECT_CALL(framer_visitor_, OnAckFrame(_));
250 EXPECT_CALL(framer_visitor_, OnPacketComplete()); 252 EXPECT_CALL(framer_visitor_, OnPacketComplete());
251 } 253 }
252 ProcessPacket(serialized.packet); 254 ProcessPacket(serialized.packet);
253 delete serialized.packet; 255 delete serialized.packet;
254 } 256 }
255 257
258 TEST_P(QuicPacketCreatorTest, ChangeSequenceNumberLengthMidPacket) {
259 if (GetParam().version <= QUIC_VERSION_15) {
260 return;
261 }
262 // Changing the sequence number length with queued frames in the creator
263 // should hold the change until after any currently queued frames are
264 // serialized.
265
266 // Packet 1.
267 // Queue a frame in the creator.
268 EXPECT_FALSE(creator_.HasPendingFrames());
269 QuicFrame ack_frame = QuicFrame(new QuicAckFrame(MakeAckFrame(0u, 0u)));
270 creator_.AddSavedFrame(ack_frame);
271
272 // Now change sequence number length.
273 creator_.options()->send_sequence_number_length =
274 PACKET_4BYTE_SEQUENCE_NUMBER;
275
276 // Add a STOP_WAITING frame since it contains a packet sequence number,
277 // whose length should be 1.
278 QuicStopWaitingFrame stop_waiting_frame;
279 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&stop_waiting_frame)));
280 EXPECT_TRUE(creator_.HasPendingFrames());
281
282 // Ensure the packet is successfully created.
283 SerializedPacket serialized = creator_.SerializePacket();
284 ASSERT_TRUE(serialized.packet);
285 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
286
287 // Verify that header in transmitted packet has 1 byte sequence length.
288 QuicPacketHeader header;
289 {
290 InSequence s;
291 EXPECT_CALL(framer_visitor_, OnPacket());
292 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
293 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
294 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
295 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce(
296 DoAll(SaveArg<0>(&header), Return(true)));
297 EXPECT_CALL(framer_visitor_, OnAckFrame(_));
298 EXPECT_CALL(framer_visitor_, OnStopWaitingFrame(_));
299 EXPECT_CALL(framer_visitor_, OnPacketComplete());
300 }
301 ProcessPacket(serialized.packet);
302 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
303 header.public_header.sequence_number_length);
304 delete serialized.packet;
305
306 // Packet 2.
307 EXPECT_FALSE(creator_.HasPendingFrames());
308 // Generate Packet 2 with one frame -- sequence number length should now
309 // change to 4 bytes.
310 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&stop_waiting_frame)));
311 EXPECT_TRUE(creator_.HasPendingFrames());
312
313 // Ensure the packet is successfully created.
314 serialized = creator_.SerializePacket();
315 ASSERT_TRUE(serialized.packet);
316 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
317
318 // Verify that header in transmitted packet has 4 byte sequence length.
319 {
320 InSequence s;
321 EXPECT_CALL(framer_visitor_, OnPacket());
322 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
323 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
324 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
325 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce(
326 DoAll(SaveArg<0>(&header), Return(true)));
327 EXPECT_CALL(framer_visitor_, OnStopWaitingFrame(_));
328 EXPECT_CALL(framer_visitor_, OnPacketComplete());
329 }
330 ProcessPacket(serialized.packet);
331 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
332 header.public_header.sequence_number_length);
333
334 delete serialized.packet;
335 delete ack_frame.ack_frame;
336 }
337
256 TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) { 338 TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
257 // Test goal is to test the following sequence (P1 => generate Packet 1): 339 // Test goal is to test the following sequence (P1 => generate Packet 1):
258 // P1 <change seq num length> P2 FEC, 340 // P1 <change seq num length> P2 FEC,
259 // and we expect that sequence number length should not change until the end 341 // and we expect that sequence number length should not change until the end
260 // of the open FEC group. 342 // of the open FEC group.
261 343
262 // Enable FEC protection, and send FEC packet every 6 packets. 344 // Enable FEC protection, and send FEC packet every 6 packets.
263 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6)); 345 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(&creator_, 6));
264 // Should return false since we do not have enough packets in the FEC group to 346 // Should return false since we do not have enough packets in the FEC group to
265 // trigger an FEC packet. 347 // trigger an FEC packet.
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 versions.push_back(test::QuicVersionMax()); 728 versions.push_back(test::QuicVersionMax());
647 scoped_ptr<QuicEncryptedPacket> encrypted( 729 scoped_ptr<QuicEncryptedPacket> encrypted(
648 creator_.SerializeVersionNegotiationPacket(versions)); 730 creator_.SerializeVersionNegotiationPacket(versions));
649 731
650 { 732 {
651 InSequence s; 733 InSequence s;
652 EXPECT_CALL(framer_visitor_, OnPacket()); 734 EXPECT_CALL(framer_visitor_, OnPacket());
653 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_)); 735 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
654 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_)); 736 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
655 } 737 }
656 client_framer_.ProcessPacket(*encrypted.get()); 738 client_framer_.ProcessPacket(*encrypted);
657 } 739 }
658 740
659 TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) { 741 TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
660 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, 742 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
661 creator_.options()->send_sequence_number_length); 743 creator_.options()->send_sequence_number_length);
662 744
663 creator_.set_sequence_number(64); 745 creator_.set_sequence_number(64);
664 creator_.UpdateSequenceNumberLength(2, 10000); 746 creator_.UpdateSequenceNumberLength(2, 10000);
665 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, 747 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
666 creator_.options()->send_sequence_number_length); 748 creator_.options()->send_sequence_number_length);
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
818 EXPECT_FALSE(creator_.HasPendingFrames()); 900 EXPECT_FALSE(creator_.HasPendingFrames());
819 EXPECT_EQ(max_plaintext_size - 901 EXPECT_EQ(max_plaintext_size -
820 GetPacketHeaderSize( 902 GetPacketHeaderSize(
821 creator_.options()->send_connection_id_length, 903 creator_.options()->send_connection_id_length,
822 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), 904 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
823 PACKET_1BYTE_SEQUENCE_NUMBER, 905 PACKET_1BYTE_SEQUENCE_NUMBER,
824 NOT_IN_FEC_GROUP), 906 NOT_IN_FEC_GROUP),
825 creator_.BytesFree()); 907 creator_.BytesFree());
826 } 908 }
827 909
910 TEST_P(QuicPacketCreatorTest, SerializeTruncatedAckFrameWithLargePacketSize) {
911 if (!GetParam().version_serialization) {
912 creator_.StopSendingVersion();
913 }
914 creator_.options()->max_packet_length = kMaxPacketSize;
915 const size_t max_plaintext_size =
916 client_framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length);
917
918 // Serialized length of ack frame with 2000 nack ranges should be limited by
919 // the number of nack ranges that can be fit in an ack frame.
920 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(2000u, 0u);
921 size_t frame_len = client_framer_.GetSerializedFrameLength(
922 QuicFrame(&ack_frame), creator_.BytesFree(), true, true,
923 NOT_IN_FEC_GROUP, PACKET_1BYTE_SEQUENCE_NUMBER);
924 EXPECT_GT(creator_.BytesFree(), frame_len);
925 EXPECT_GT(max_plaintext_size, creator_.PacketSize());
926
927 // Add ack frame to creator.
928 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
929 EXPECT_TRUE(creator_.HasPendingFrames());
930 EXPECT_GT(max_plaintext_size, creator_.PacketSize());
931 EXPECT_LT(0u, creator_.BytesFree());
932
933 // Make sure that an additional stream frame can be added to the packet.
934 QuicFrame stream_frame;
935 size_t consumed = creator_.CreateStreamFrame(
936 2u, MakeIOVector("test"), 0u, false, &stream_frame);
937 EXPECT_EQ(4u, consumed);
938 ASSERT_TRUE(stream_frame.stream_frame);
939 EXPECT_TRUE(creator_.AddSavedFrame(stream_frame));
940 EXPECT_TRUE(creator_.HasPendingFrames());
941
942 // Ensure the packet is successfully created, and the packet size estimate
943 // matches the serialized packet length.
944 EXPECT_CALL(entropy_calculator_,
945 EntropyHash(_)).WillOnce(testing::Return(0));
946 size_t est_packet_size = creator_.PacketSize();
947 SerializedPacket serialized = creator_.SerializePacket();
948 ASSERT_TRUE(serialized.packet);
949 EXPECT_EQ(est_packet_size, serialized.packet->length());
950 delete serialized.retransmittable_frames;
951 delete serialized.packet;
952 }
953
954 TEST_P(QuicPacketCreatorTest, SerializeTruncatedAckFrameWithSmallPacketSize) {
955 if (!GetParam().version_serialization) {
956 creator_.StopSendingVersion();
957 }
958 creator_.options()->max_packet_length = 500u;
959 const size_t max_plaintext_size =
960 client_framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length);
961 EXPECT_EQ(max_plaintext_size - creator_.PacketSize(), creator_.BytesFree());
962
963 // Serialized length of ack frame with 2000 nack ranges should be limited by
964 // the packet size.
965 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(2000u, 0u);
966 size_t frame_len = client_framer_.GetSerializedFrameLength(
967 QuicFrame(&ack_frame), creator_.BytesFree(), true, true,
968 NOT_IN_FEC_GROUP, PACKET_1BYTE_SEQUENCE_NUMBER);
969 EXPECT_EQ(creator_.BytesFree(), frame_len);
970
971 // Add ack frame to creator.
972 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
973 EXPECT_TRUE(creator_.HasPendingFrames());
974 EXPECT_EQ(max_plaintext_size, creator_.PacketSize());
975 EXPECT_EQ(0u, creator_.BytesFree());
976
977 // Ensure the packet is successfully created, and the packet size estimate
978 // may not match the serialized packet length.
979 EXPECT_CALL(entropy_calculator_,
980 EntropyHash(_)).WillOnce(Return(0));
981 size_t est_packet_size = creator_.PacketSize();
982 SerializedPacket serialized = creator_.SerializePacket();
983 ASSERT_TRUE(serialized.packet);
984 EXPECT_GE(est_packet_size, serialized.packet->length());
985 delete serialized.packet;
986 }
987
988
828 TEST_P(QuicPacketCreatorTest, EntropyFlag) { 989 TEST_P(QuicPacketCreatorTest, EntropyFlag) {
829 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector()))); 990 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
830 991
831 for (int i = 0; i < 2; ++i) { 992 for (int i = 0; i < 2; ++i) {
832 for (int j = 0; j < 64; ++j) { 993 for (int j = 0; j < 64; ++j) {
833 SerializedPacket serialized = creator_.SerializeAllFrames(frames_); 994 SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
834 // Verify both BoolSource and hash algorithm. 995 // Verify both BoolSource and hash algorithm.
835 bool expected_rand_bool = 996 bool expected_rand_bool =
836 (mock_random_.RandUint64() & (GG_UINT64_C(1) << j)) != 0; 997 (mock_random_.RandUint64() & (GG_UINT64_C(1) << j)) != 0;
837 bool observed_rand_bool = 998 bool observed_rand_bool =
838 (serialized.entropy_hash & (1 << ((j+1) % 8))) != 0; 999 (serialized.entropy_hash & (1 << ((j+1) % 8))) != 0;
839 uint8 rest_of_hash = serialized.entropy_hash & ~(1 << ((j+1) % 8)); 1000 uint8 rest_of_hash = serialized.entropy_hash & ~(1 << ((j+1) % 8));
840 EXPECT_EQ(expected_rand_bool, observed_rand_bool); 1001 EXPECT_EQ(expected_rand_bool, observed_rand_bool);
841 EXPECT_EQ(0, rest_of_hash); 1002 EXPECT_EQ(0, rest_of_hash);
842 delete serialized.packet; 1003 delete serialized.packet;
843 } 1004 }
844 // After 64 calls, BoolSource will refresh the bucket - make sure it does. 1005 // After 64 calls, BoolSource will refresh the bucket - make sure it does.
845 mock_random_.ChangeValue(); 1006 mock_random_.ChangeValue();
846 } 1007 }
847 1008
848 delete frames_[0].stream_frame; 1009 delete frames_[0].stream_frame;
849 } 1010 }
850 1011
851 } // namespace 1012 } // namespace
852 } // namespace test 1013 } // namespace test
853 } // namespace net 1014 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_packet_creator.cc ('k') | net/quic/quic_protocol.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698