OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |