blob: 08727629df9ee6ade3f7e51be09b26a259ee5236 [file] [log] [blame]
[email protected]a5061242012-10-23 23:29:371// 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
3// found in the LICENSE file.
4
5#include "net/quic/quic_packet_creator.h"
6
7#include "base/stl_util.h"
8#include "net/quic/crypto/null_encrypter.h"
[email protected]9db443912013-02-25 05:27:039#include "net/quic/crypto/quic_decrypter.h"
10#include "net/quic/crypto/quic_encrypter.h"
[email protected]a5061242012-10-23 23:29:3711#include "net/quic/quic_utils.h"
[email protected]457d6952013-12-13 09:24:5812#include "net/quic/test_tools/mock_random.h"
[email protected]bbb10072014-06-13 07:41:5913#include "net/quic/test_tools/quic_framer_peer.h"
[email protected]14e8106c2013-03-14 16:25:3314#include "net/quic/test_tools/quic_packet_creator_peer.h"
[email protected]a5061242012-10-23 23:29:3715#include "net/quic/test_tools/quic_test_utils.h"
[email protected]51cc1342014-04-18 23:44:3716#include "net/test/gtest_util.h"
[email protected]a5061242012-10-23 23:29:3717#include "testing/gmock/include/gmock/gmock.h"
18
[email protected]c995c572013-01-18 05:43:2019using base::StringPiece;
[email protected]51cc1342014-04-18 23:44:3720using std::ostream;
[email protected]c995c572013-01-18 05:43:2021using std::string;
22using std::vector;
[email protected]14e8106c2013-03-14 16:25:3323using testing::DoAll;
[email protected]a5061242012-10-23 23:29:3724using testing::InSequence;
[email protected]14e8106c2013-03-14 16:25:3325using testing::Return;
26using testing::SaveArg;
[email protected]a5061242012-10-23 23:29:3727using testing::_;
[email protected]a5061242012-10-23 23:29:3728
29namespace net {
30namespace test {
31namespace {
32
[email protected]51cc1342014-04-18 23:44:3733// Run tests with combinations of {QuicVersion, ToggleVersionSerialization}.
34struct TestParams {
35 TestParams(QuicVersion version,
36 bool version_serialization)
37 : version(version),
38 version_serialization(version_serialization) {
39 }
40
41 friend ostream& operator<<(ostream& os, const TestParams& p) {
42 os << "{ client_version: " << QuicVersionToString(p.version)
43 << " include version: " << p.version_serialization << " }";
44 return os;
45 }
46
47 QuicVersion version;
48 bool version_serialization;
49};
50
51// Constructs various test permutations.
52vector<TestParams> GetTestParams() {
53 vector<TestParams> params;
54 QuicVersionVector all_supported_versions = QuicSupportedVersions();
55 for (size_t i = 0; i < all_supported_versions.size(); ++i) {
56 params.push_back(TestParams(all_supported_versions[i], true));
57 params.push_back(TestParams(all_supported_versions[i], false));
58 }
59 return params;
60}
61
62class QuicPacketCreatorTest : public ::testing::TestWithParam<TestParams> {
[email protected]a5061242012-10-23 23:29:3763 protected:
64 QuicPacketCreatorTest()
[email protected]51cc1342014-04-18 23:44:3765 : server_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(),
66 true),
67 client_framer_(SupportedVersions(GetParam().version), QuicTime::Zero(),
68 false),
[email protected]a5061242012-10-23 23:29:3769 sequence_number_(0),
[email protected]3aa9ca72014-02-27 19:39:4370 connection_id_(2),
[email protected]a5061242012-10-23 23:29:3771 data_("foo"),
[email protected]bbb10072014-06-13 07:41:5972 creator_(connection_id_, &client_framer_, &mock_random_) {
[email protected]14e8106c2013-03-14 16:25:3373 client_framer_.set_visitor(&framer_visitor_);
[email protected]aa7e4ef2014-05-28 03:53:1574 client_framer_.set_received_entropy_calculator(&entropy_calculator_);
[email protected]14e8106c2013-03-14 16:25:3375 server_framer_.set_visitor(&framer_visitor_);
[email protected]a5061242012-10-23 23:29:3776 }
[email protected]d8bbef62014-06-12 08:02:5077
mostynbba063d6032014-10-09 11:01:1378 virtual ~QuicPacketCreatorTest() override {
[email protected]a5061242012-10-23 23:29:3779 }
80
[email protected]c995c572013-01-18 05:43:2081 void ProcessPacket(QuicPacket* packet) {
[email protected]9db443912013-02-25 05:27:0382 scoped_ptr<QuicEncryptedPacket> encrypted(
[email protected]8ba81212013-05-03 13:11:4883 server_framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number_,
84 *packet));
[email protected]14e8106c2013-03-14 16:25:3385 server_framer_.ProcessPacket(*encrypted);
[email protected]fee17f72013-02-03 07:47:4186 }
87
[email protected]583bcbcf2013-10-28 01:51:1588 void CheckStreamFrame(const QuicFrame& frame,
89 QuicStreamId stream_id,
90 const string& data,
91 QuicStreamOffset offset,
92 bool fin) {
[email protected]fee17f72013-02-03 07:47:4193 EXPECT_EQ(STREAM_FRAME, frame.type);
94 ASSERT_TRUE(frame.stream_frame);
95 EXPECT_EQ(stream_id, frame.stream_frame->stream_id);
[email protected]5dafdb62013-11-14 01:24:2696 scoped_ptr<string> frame_data(frame.stream_frame->GetDataAsString());
97 EXPECT_EQ(data, *frame_data);
[email protected]fee17f72013-02-03 07:47:4198 EXPECT_EQ(offset, frame.stream_frame->offset);
99 EXPECT_EQ(fin, frame.stream_frame->fin);
[email protected]a5061242012-10-23 23:29:37100 }
101
[email protected]583bcbcf2013-10-28 01:51:15102 // Returns the number of bytes consumed by the header of packet, including
[email protected]98a9d1252014-04-04 00:43:59103 // the version.
104 size_t GetPacketHeaderOverhead(InFecGroup is_in_fec_group) {
[email protected]9cda5fd2014-06-03 10:20:28105 return GetPacketHeaderSize(creator_.connection_id_length(),
[email protected]583bcbcf2013-10-28 01:51:15106 kIncludeVersion,
[email protected]9cda5fd2014-06-03 10:20:28107 creator_.next_sequence_number_length(),
[email protected]98a9d1252014-04-04 00:43:59108 is_in_fec_group);
[email protected]583bcbcf2013-10-28 01:51:15109 }
110
111 // Returns the number of bytes of overhead that will be added to a packet
112 // of maximum length.
113 size_t GetEncryptionOverhead() {
[email protected]9cda5fd2014-06-03 10:20:28114 return creator_.max_packet_length() - client_framer_.GetMaxPlaintextSize(
115 creator_.max_packet_length());
[email protected]583bcbcf2013-10-28 01:51:15116 }
117
118 // Returns the number of bytes consumed by the non-data fields of a stream
119 // frame, assuming it is the last frame in the packet
[email protected]98a9d1252014-04-04 00:43:59120 size_t GetStreamFrameOverhead(InFecGroup is_in_fec_group) {
[email protected]310d37b2014-08-02 06:15:37121 return QuicFramer::GetMinStreamFrameSize(kClientDataStreamId1, kOffset,
[email protected]66ae5962014-05-22 11:13:05122 true, is_in_fec_group);
[email protected]583bcbcf2013-10-28 01:51:15123 }
[email protected]d8bbef62014-06-12 08:02:50124
125 // Enables and turns on FEC protection. Returns true if FEC protection is on.
126 bool SwitchFecProtectionOn(size_t max_packets_per_fec_group) {
127 creator_.set_max_packets_per_fec_group(max_packets_per_fec_group);
128 creator_.StartFecProtectingPackets();
129 return creator_.IsFecProtected();
130 }
131
[email protected]583bcbcf2013-10-28 01:51:15132 static const QuicStreamOffset kOffset = 1u;
133
[email protected]701bc892013-01-17 04:51:54134 QuicFrames frames_;
[email protected]14e8106c2013-03-14 16:25:33135 QuicFramer server_framer_;
136 QuicFramer client_framer_;
[email protected]a5061242012-10-23 23:29:37137 testing::StrictMock<MockFramerVisitor> framer_visitor_;
[email protected]a5061242012-10-23 23:29:37138 QuicPacketSequenceNumber sequence_number_;
[email protected]3aa9ca72014-02-27 19:39:43139 QuicConnectionId connection_id_;
[email protected]a5061242012-10-23 23:29:37140 string data_;
[email protected]457d6952013-12-13 09:24:58141 MockRandom mock_random_;
[email protected]fee17f72013-02-03 07:47:41142 QuicPacketCreator creator_;
[email protected]aa7e4ef2014-05-28 03:53:15143 MockEntropyCalculator entropy_calculator_;
[email protected]a5061242012-10-23 23:29:37144};
145
[email protected]51cc1342014-04-18 23:44:37146// Run all packet creator tests with all supported versions of QUIC, and with
147// and without version in the packet header.
148INSTANTIATE_TEST_CASE_P(QuicPacketCreatorTests,
149 QuicPacketCreatorTest,
150 ::testing::ValuesIn(GetTestParams()));
151
[email protected]51cc1342014-04-18 23:44:37152TEST_P(QuicPacketCreatorTest, SerializeFrames) {
[email protected]310d37b2014-08-02 06:15:37153 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u))));
[email protected]5dafdb62013-11-14 01:24:26154 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
155 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, true, 0u, IOVector())));
[email protected]9db443912013-02-25 05:27:03156 SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
157 delete frames_[0].ack_frame;
158 delete frames_[1].stream_frame;
159 delete frames_[2].stream_frame;
[email protected]a5061242012-10-23 23:29:37160
[email protected]c995c572013-01-18 05:43:20161 {
162 InSequence s;
[email protected]fee17f72013-02-03 07:47:41163 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]066d8182014-01-04 02:02:45164 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
[email protected]ec86d5462013-11-17 16:04:49165 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
[email protected]42a3eba2014-04-30 10:52:55166 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
[email protected]c995c572013-01-18 05:43:20167 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
168 EXPECT_CALL(framer_visitor_, OnAckFrame(_));
169 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
170 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
171 EXPECT_CALL(framer_visitor_, OnPacketComplete());
172 }
[email protected]9db443912013-02-25 05:27:03173 ProcessPacket(serialized.packet);
174 delete serialized.packet;
[email protected]a5061242012-10-23 23:29:37175}
176
[email protected]51cc1342014-04-18 23:44:37177TEST_P(QuicPacketCreatorTest, SerializeWithFEC) {
[email protected]ce7bb1412014-05-17 15:51:33178 // Enable FEC protection, and send FEC packet every 6 packets.
[email protected]d8bbef62014-06-12 08:02:50179 EXPECT_TRUE(SwitchFecProtectionOn(6));
[email protected]51cc1342014-04-18 23:44:37180 // Should return false since we do not have enough packets in the FEC group to
181 // trigger an FEC packet.
182 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
[email protected]a5061242012-10-23 23:29:37183
[email protected]5dafdb62013-11-14 01:24:26184 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
[email protected]9db443912013-02-25 05:27:03185 SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
186 delete frames_[0].stream_frame;
[email protected]a5061242012-10-23 23:29:37187
[email protected]c995c572013-01-18 05:43:20188 {
189 InSequence s;
[email protected]fee17f72013-02-03 07:47:41190 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]066d8182014-01-04 02:02:45191 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
[email protected]ec86d5462013-11-17 16:04:49192 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
[email protected]42a3eba2014-04-30 10:52:55193 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
[email protected]c995c572013-01-18 05:43:20194 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
[email protected]08da9adb2014-04-24 08:33:31195 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
[email protected]c995c572013-01-18 05:43:20196 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
197 EXPECT_CALL(framer_visitor_, OnPacketComplete());
198 }
[email protected]9db443912013-02-25 05:27:03199 ProcessPacket(serialized.packet);
200 delete serialized.packet;
[email protected]a5061242012-10-23 23:29:37201
[email protected]51cc1342014-04-18 23:44:37202 // Should return false since we do not have enough packets in the FEC group to
203 // trigger an FEC packet.
204 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
[email protected]08da9adb2014-04-24 08:33:31205 // Should return true since there are packets in the FEC group.
206 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
[email protected]a5061242012-10-23 23:29:37207
[email protected]9db443912013-02-25 05:27:03208 serialized = creator_.SerializeFec();
209 ASSERT_EQ(2u, serialized.sequence_number);
[email protected]c995c572013-01-18 05:43:20210 {
211 InSequence s;
[email protected]fee17f72013-02-03 07:47:41212 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]066d8182014-01-04 02:02:45213 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
[email protected]ec86d5462013-11-17 16:04:49214 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
[email protected]42a3eba2014-04-30 10:52:55215 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
[email protected]c995c572013-01-18 05:43:20216 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
217 EXPECT_CALL(framer_visitor_, OnFecData(_));
218 EXPECT_CALL(framer_visitor_, OnPacketComplete());
219 }
[email protected]9db443912013-02-25 05:27:03220 ProcessPacket(serialized.packet);
221 delete serialized.packet;
[email protected]a5061242012-10-23 23:29:37222}
223
[email protected]51cc1342014-04-18 23:44:37224TEST_P(QuicPacketCreatorTest, SerializeChangingSequenceNumberLength) {
[email protected]310d37b2014-08-02 06:15:37225 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u))));
[email protected]ea825e02013-08-21 18:12:45226 creator_.AddSavedFrame(frames_[0]);
[email protected]9cda5fd2014-06-03 10:20:28227 creator_.set_next_sequence_number_length(PACKET_4BYTE_SEQUENCE_NUMBER);
[email protected]ea825e02013-08-21 18:12:45228 SerializedPacket serialized = creator_.SerializePacket();
229 // The sequence number length will not change mid-packet.
230 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
231
232 {
233 InSequence s;
234 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]066d8182014-01-04 02:02:45235 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
[email protected]ec86d5462013-11-17 16:04:49236 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
[email protected]42a3eba2014-04-30 10:52:55237 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
[email protected]ea825e02013-08-21 18:12:45238 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
239 EXPECT_CALL(framer_visitor_, OnAckFrame(_));
240 EXPECT_CALL(framer_visitor_, OnPacketComplete());
241 }
242 ProcessPacket(serialized.packet);
243 delete serialized.packet;
244
245 creator_.AddSavedFrame(frames_[0]);
246 serialized = creator_.SerializePacket();
247 // Now the actual sequence number length should have changed.
248 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
249 delete frames_[0].ack_frame;
250
251 {
252 InSequence s;
253 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]066d8182014-01-04 02:02:45254 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
[email protected]ec86d5462013-11-17 16:04:49255 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
[email protected]42a3eba2014-04-30 10:52:55256 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
[email protected]ea825e02013-08-21 18:12:45257 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
258 EXPECT_CALL(framer_visitor_, OnAckFrame(_));
259 EXPECT_CALL(framer_visitor_, OnPacketComplete());
260 }
261 ProcessPacket(serialized.packet);
262 delete serialized.packet;
263}
264
[email protected]aa7e4ef2014-05-28 03:53:15265TEST_P(QuicPacketCreatorTest, ChangeSequenceNumberLengthMidPacket) {
[email protected]aa7e4ef2014-05-28 03:53:15266 // Changing the sequence number length with queued frames in the creator
267 // should hold the change until after any currently queued frames are
268 // serialized.
269
270 // Packet 1.
271 // Queue a frame in the creator.
272 EXPECT_FALSE(creator_.HasPendingFrames());
[email protected]310d37b2014-08-02 06:15:37273 QuicFrame ack_frame = QuicFrame(new QuicAckFrame(MakeAckFrame(0u)));
[email protected]aa7e4ef2014-05-28 03:53:15274 creator_.AddSavedFrame(ack_frame);
275
276 // Now change sequence number length.
[email protected]9cda5fd2014-06-03 10:20:28277 creator_.set_next_sequence_number_length(PACKET_4BYTE_SEQUENCE_NUMBER);
[email protected]aa7e4ef2014-05-28 03:53:15278
279 // Add a STOP_WAITING frame since it contains a packet sequence number,
280 // whose length should be 1.
281 QuicStopWaitingFrame stop_waiting_frame;
282 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&stop_waiting_frame)));
283 EXPECT_TRUE(creator_.HasPendingFrames());
284
285 // Ensure the packet is successfully created.
286 SerializedPacket serialized = creator_.SerializePacket();
287 ASSERT_TRUE(serialized.packet);
288 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
289
290 // Verify that header in transmitted packet has 1 byte sequence length.
291 QuicPacketHeader header;
292 {
293 InSequence s;
294 EXPECT_CALL(framer_visitor_, OnPacket());
295 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
296 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
297 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
298 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce(
299 DoAll(SaveArg<0>(&header), Return(true)));
300 EXPECT_CALL(framer_visitor_, OnAckFrame(_));
301 EXPECT_CALL(framer_visitor_, OnStopWaitingFrame(_));
302 EXPECT_CALL(framer_visitor_, OnPacketComplete());
303 }
304 ProcessPacket(serialized.packet);
305 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
306 header.public_header.sequence_number_length);
307 delete serialized.packet;
308
309 // Packet 2.
310 EXPECT_FALSE(creator_.HasPendingFrames());
311 // Generate Packet 2 with one frame -- sequence number length should now
312 // change to 4 bytes.
313 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&stop_waiting_frame)));
314 EXPECT_TRUE(creator_.HasPendingFrames());
315
316 // Ensure the packet is successfully created.
317 serialized = creator_.SerializePacket();
318 ASSERT_TRUE(serialized.packet);
319 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
320
321 // Verify that header in transmitted packet has 4 byte sequence length.
322 {
323 InSequence s;
324 EXPECT_CALL(framer_visitor_, OnPacket());
325 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
326 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
327 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
328 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce(
329 DoAll(SaveArg<0>(&header), Return(true)));
330 EXPECT_CALL(framer_visitor_, OnStopWaitingFrame(_));
331 EXPECT_CALL(framer_visitor_, OnPacketComplete());
332 }
333 ProcessPacket(serialized.packet);
334 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
335 header.public_header.sequence_number_length);
336
337 delete serialized.packet;
338 delete ack_frame.ack_frame;
339}
340
[email protected]51cc1342014-04-18 23:44:37341TEST_P(QuicPacketCreatorTest, SerializeWithFECChangingSequenceNumberLength) {
[email protected]51cc1342014-04-18 23:44:37342 // Test goal is to test the following sequence (P1 => generate Packet 1):
343 // P1 <change seq num length> P2 FEC,
344 // and we expect that sequence number length should not change until the end
345 // of the open FEC group.
[email protected]ce7bb1412014-05-17 15:51:33346
347 // Enable FEC protection, and send FEC packet every 6 packets.
[email protected]d8bbef62014-06-12 08:02:50348 EXPECT_TRUE(SwitchFecProtectionOn(6));
[email protected]51cc1342014-04-18 23:44:37349 // Should return false since we do not have enough packets in the FEC group to
350 // trigger an FEC packet.
351 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
[email protected]310d37b2014-08-02 06:15:37352 frames_.push_back(QuicFrame(new QuicAckFrame(MakeAckFrame(0u))));
[email protected]51cc1342014-04-18 23:44:37353
354 // Generate Packet 1.
[email protected]ea825e02013-08-21 18:12:45355 creator_.AddSavedFrame(frames_[0]);
356 // Change the sequence number length mid-FEC group and it should not change.
[email protected]9cda5fd2014-06-03 10:20:28357 creator_.set_next_sequence_number_length(PACKET_4BYTE_SEQUENCE_NUMBER);
[email protected]ea825e02013-08-21 18:12:45358 SerializedPacket serialized = creator_.SerializePacket();
359 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
360
361 {
362 InSequence s;
363 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]066d8182014-01-04 02:02:45364 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
[email protected]ec86d5462013-11-17 16:04:49365 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
[email protected]42a3eba2014-04-30 10:52:55366 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
[email protected]ea825e02013-08-21 18:12:45367 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
368 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
369 EXPECT_CALL(framer_visitor_, OnAckFrame(_));
370 EXPECT_CALL(framer_visitor_, OnPacketComplete());
371 }
372 ProcessPacket(serialized.packet);
373 delete serialized.packet;
374
[email protected]51cc1342014-04-18 23:44:37375 // Generate Packet 2.
376 creator_.AddSavedFrame(frames_[0]);
377 serialized = creator_.SerializePacket();
378 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
[email protected]ea825e02013-08-21 18:12:45379
[email protected]51cc1342014-04-18 23:44:37380 {
381 InSequence s;
382 EXPECT_CALL(framer_visitor_, OnPacket());
383 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
384 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
[email protected]42a3eba2014-04-30 10:52:55385 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
[email protected]51cc1342014-04-18 23:44:37386 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
387 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
388 EXPECT_CALL(framer_visitor_, OnAckFrame(_));
389 EXPECT_CALL(framer_visitor_, OnPacketComplete());
390 }
391 ProcessPacket(serialized.packet);
392 delete serialized.packet;
393
394 // Should return false since we do not have enough packets in the FEC group to
395 // trigger an FEC packet.
396 ASSERT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
397 // Should return true since there are packets in the FEC group.
398 ASSERT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
399
400 // Force generation of FEC packet.
[email protected]ea825e02013-08-21 18:12:45401 serialized = creator_.SerializeFec();
402 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
[email protected]51cc1342014-04-18 23:44:37403 ASSERT_EQ(3u, serialized.sequence_number);
[email protected]ea825e02013-08-21 18:12:45404
405 {
406 InSequence s;
407 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]066d8182014-01-04 02:02:45408 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
[email protected]ec86d5462013-11-17 16:04:49409 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
[email protected]42a3eba2014-04-30 10:52:55410 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
[email protected]ea825e02013-08-21 18:12:45411 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
412 EXPECT_CALL(framer_visitor_, OnFecData(_));
413 EXPECT_CALL(framer_visitor_, OnPacketComplete());
414 }
415 ProcessPacket(serialized.packet);
416 delete serialized.packet;
417
418 // Ensure the next FEC group starts using the new sequence number length.
419 serialized = creator_.SerializeAllFrames(frames_);
420 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
[email protected]8e01c062013-10-31 07:35:31421 delete frames_[0].ack_frame;
[email protected]ea825e02013-08-21 18:12:45422 delete serialized.packet;
423}
424
[email protected]51cc1342014-04-18 23:44:37425TEST_P(QuicPacketCreatorTest, ReserializeFramesWithSequenceNumberLength) {
[email protected]ea825e02013-08-21 18:12:45426 // If the original packet sequence number length, the current sequence number
427 // length, and the configured send sequence number length are different, the
428 // retransmit must sent with the original length and the others do not change.
[email protected]9cda5fd2014-06-03 10:20:28429 creator_.set_next_sequence_number_length(PACKET_4BYTE_SEQUENCE_NUMBER);
[email protected]ea825e02013-08-21 18:12:45430 QuicPacketCreatorPeer::SetSequenceNumberLength(&creator_,
431 PACKET_2BYTE_SEQUENCE_NUMBER);
[email protected]5dafdb62013-11-14 01:24:26432 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
[email protected]ea825e02013-08-21 18:12:45433 SerializedPacket serialized =
434 creator_.ReserializeAllFrames(frames_, PACKET_1BYTE_SEQUENCE_NUMBER);
435 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
[email protected]9cda5fd2014-06-03 10:20:28436 creator_.next_sequence_number_length());
[email protected]ea825e02013-08-21 18:12:45437 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
438 QuicPacketCreatorPeer::GetSequenceNumberLength(&creator_));
439 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, serialized.sequence_number_length);
440 delete frames_[0].stream_frame;
441
442 {
443 InSequence s;
444 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]066d8182014-01-04 02:02:45445 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
[email protected]ec86d5462013-11-17 16:04:49446 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
[email protected]42a3eba2014-04-30 10:52:55447 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
[email protected]ea825e02013-08-21 18:12:45448 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
449 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
450 EXPECT_CALL(framer_visitor_, OnPacketComplete());
451 }
452 ProcessPacket(serialized.packet);
453 delete serialized.packet;
454}
455
[email protected]51cc1342014-04-18 23:44:37456TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
[email protected]8e01c062013-10-31 07:35:31457 QuicConnectionCloseFrame frame;
458 frame.error_code = QUIC_NO_ERROR;
459 frame.error_details = "error";
[email protected]8e01c062013-10-31 07:35:31460
461 SerializedPacket serialized = creator_.SerializeConnectionClose(&frame);
462 ASSERT_EQ(1u, serialized.sequence_number);
463 ASSERT_EQ(1u, creator_.sequence_number());
464
465 InSequence s;
466 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]066d8182014-01-04 02:02:45467 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
[email protected]ec86d5462013-11-17 16:04:49468 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
[email protected]42a3eba2014-04-30 10:52:55469 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
[email protected]8e01c062013-10-31 07:35:31470 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
471 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
472 EXPECT_CALL(framer_visitor_, OnPacketComplete());
473
474 ProcessPacket(serialized.packet);
475 delete serialized.packet;
476}
477
[email protected]ce7bb1412014-05-17 15:51:33478TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithNoGroup) {
479 // Enable FEC protection.
480 creator_.set_max_packets_per_fec_group(6);
481 EXPECT_TRUE(creator_.IsFecEnabled());
482 EXPECT_FALSE(creator_.IsFecProtected());
483
484 // Turn on FEC protection.
485 creator_.StartFecProtectingPackets();
486 EXPECT_TRUE(creator_.IsFecProtected());
487 // We have no packets in the FEC group, so no FEC packet can be created.
488 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/true));
489 // Since no packets are in FEC group yet, we should be able to turn FEC
490 // off with no trouble.
491 creator_.StopFecProtectingPackets();
492 EXPECT_FALSE(creator_.IsFecProtected());
493}
494
495TEST_P(QuicPacketCreatorTest, SwitchFecOnOffWithGroupInProgress) {
496 // Enable FEC protection, and send FEC packet every 6 packets.
[email protected]d8bbef62014-06-12 08:02:50497 EXPECT_TRUE(SwitchFecProtectionOn(6));
[email protected]ce7bb1412014-05-17 15:51:33498 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
499 SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
500 delete frames_[0].stream_frame;
501 delete serialized.packet;
502
503 EXPECT_TRUE(creator_.IsFecProtected());
504 // We do not have enough packets in the FEC group to trigger an FEC packet.
505 EXPECT_FALSE(creator_.ShouldSendFec(/*force_close=*/false));
506 // Should return true since there are packets in the FEC group.
507 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
508
509 // Switching FEC off should not change creator state, since there is an
510 // FEC packet under construction.
511 EXPECT_DFATAL(creator_.StopFecProtectingPackets(),
512 "Cannot stop FEC protection with open FEC group.");
513 EXPECT_TRUE(creator_.IsFecProtected());
514 // Confirm that FEC packet is still under construction.
515 EXPECT_TRUE(creator_.ShouldSendFec(/*force_close=*/true));
516
517 serialized = creator_.SerializeFec();
518 delete serialized.packet;
519
520 // Switching FEC on/off should work now.
521 creator_.StopFecProtectingPackets();
522 EXPECT_FALSE(creator_.IsFecProtected());
523 creator_.StartFecProtectingPackets();
524 EXPECT_TRUE(creator_.IsFecProtected());
525}
526
527TEST_P(QuicPacketCreatorTest, SwitchFecOnWithStreamFrameQueued) {
528 // Add a stream frame to the creator.
529 QuicFrame frame;
530 size_t consumed = creator_.CreateStreamFrame(
531 1u, MakeIOVector("test"), 0u, false, &frame);
532 EXPECT_EQ(4u, consumed);
533 ASSERT_TRUE(frame.stream_frame);
534 EXPECT_TRUE(creator_.AddSavedFrame(frame));
535 EXPECT_TRUE(creator_.HasPendingFrames());
536
[email protected]cc1aa272014-06-30 19:48:22537 // Enable FEC protection, and send FEC packet every 6 packets.
[email protected]ce7bb1412014-05-17 15:51:33538 creator_.set_max_packets_per_fec_group(6);
539 EXPECT_TRUE(creator_.IsFecEnabled());
540 EXPECT_DFATAL(creator_.StartFecProtectingPackets(),
541 "Cannot start FEC protection with pending frames.");
542 EXPECT_FALSE(creator_.IsFecProtected());
543
544 // Serialize packet for transmission.
545 SerializedPacket serialized = creator_.SerializePacket();
546 delete serialized.packet;
547 delete serialized.retransmittable_frames;
548 EXPECT_FALSE(creator_.HasPendingFrames());
549
550 // Since all pending frames have been serialized, turning FEC on should work.
551 creator_.StartFecProtectingPackets();
552 EXPECT_TRUE(creator_.IsFecProtected());
553}
554
[email protected]51cc1342014-04-18 23:44:37555TEST_P(QuicPacketCreatorTest, CreateStreamFrame) {
[email protected]fee17f72013-02-03 07:47:41556 QuicFrame frame;
[email protected]5dafdb62013-11-14 01:24:26557 size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 0u,
558 false, &frame);
[email protected]fee17f72013-02-03 07:47:41559 EXPECT_EQ(4u, consumed);
560 CheckStreamFrame(frame, 1u, "test", 0u, false);
561 delete frame.stream_frame;
562}
563
[email protected]51cc1342014-04-18 23:44:37564TEST_P(QuicPacketCreatorTest, CreateStreamFrameFin) {
[email protected]fee17f72013-02-03 07:47:41565 QuicFrame frame;
[email protected]5dafdb62013-11-14 01:24:26566 size_t consumed = creator_.CreateStreamFrame(1u, MakeIOVector("test"), 10u,
567 true, &frame);
[email protected]fee17f72013-02-03 07:47:41568 EXPECT_EQ(4u, consumed);
569 CheckStreamFrame(frame, 1u, "test", 10u, true);
570 delete frame.stream_frame;
571}
572
[email protected]51cc1342014-04-18 23:44:37573TEST_P(QuicPacketCreatorTest, CreateStreamFrameFinOnly) {
[email protected]fee17f72013-02-03 07:47:41574 QuicFrame frame;
[email protected]5dafdb62013-11-14 01:24:26575 size_t consumed = creator_.CreateStreamFrame(1u, IOVector(), 0u, true,
576 &frame);
[email protected]fee17f72013-02-03 07:47:41577 EXPECT_EQ(0u, consumed);
[email protected]0bbeb6972013-05-23 04:10:21578 CheckStreamFrame(frame, 1u, string(), 0u, true);
[email protected]fee17f72013-02-03 07:47:41579 delete frame.stream_frame;
580}
581
[email protected]51cc1342014-04-18 23:44:37582TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {
[email protected]98a9d1252014-04-04 00:43:59583 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP)
584 + GetEncryptionOverhead();
[email protected]583bcbcf2013-10-28 01:51:15585 for (size_t i = overhead; i < overhead + 100; ++i) {
[email protected]9cda5fd2014-06-03 10:20:28586 creator_.set_max_packet_length(i);
[email protected]98a9d1252014-04-04 00:43:59587 const bool should_have_room = i > overhead + GetStreamFrameOverhead(
588 NOT_IN_FEC_GROUP);
[email protected]66ae5962014-05-22 11:13:05589 ASSERT_EQ(should_have_room, creator_.HasRoomForStreamFrame(
590 kClientDataStreamId1, kOffset));
[email protected]3e60db82013-08-05 19:43:06591 if (should_have_room) {
592 QuicFrame frame;
593 size_t bytes_consumed = creator_.CreateStreamFrame(
[email protected]66ae5962014-05-22 11:13:05594 kClientDataStreamId1, MakeIOVector("testdata"), kOffset, false,
595 &frame);
[email protected]3e60db82013-08-05 19:43:06596 EXPECT_LT(0u, bytes_consumed);
597 ASSERT_TRUE(creator_.AddSavedFrame(frame));
598 SerializedPacket serialized_packet = creator_.SerializePacket();
599 ASSERT_TRUE(serialized_packet.packet);
600 delete serialized_packet.packet;
601 delete serialized_packet.retransmittable_frames;
602 }
603 }
604}
605
[email protected]51cc1342014-04-18 23:44:37606TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) {
[email protected]583bcbcf2013-10-28 01:51:15607 // Compute the total overhead for a single frame in packet.
[email protected]98a9d1252014-04-04 00:43:59608 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP)
609 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP);
[email protected]8e01c062013-10-31 07:35:31610 size_t capacity = kDefaultMaxPacketSize - overhead;
[email protected]583bcbcf2013-10-28 01:51:15611 // Now, test various sizes around this size.
612 for (int delta = -5; delta <= 5; ++delta) {
613 string data(capacity + delta, 'A');
614 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
615 QuicFrame frame;
616 size_t bytes_consumed = creator_.CreateStreamFrame(
[email protected]66ae5962014-05-22 11:13:05617 kClientDataStreamId1, MakeIOVector(data), kOffset, false, &frame);
[email protected]583bcbcf2013-10-28 01:51:15618 EXPECT_EQ(capacity - bytes_free, bytes_consumed);
619
620 ASSERT_TRUE(creator_.AddSavedFrame(frame));
621 // BytesFree() returns bytes available for the next frame, which will
622 // be two bytes smaller since the stream frame would need to be grown.
[email protected]98a9d1252014-04-04 00:43:59623 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame());
[email protected]583bcbcf2013-10-28 01:51:15624 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2;
625 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
626 SerializedPacket serialized_packet = creator_.SerializePacket();
627 ASSERT_TRUE(serialized_packet.packet);
628 delete serialized_packet.packet;
629 delete serialized_packet.retransmittable_frames;
630 }
631}
632
[email protected]51cc1342014-04-18 23:44:37633TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) {
[email protected]ce7bb1412014-05-17 15:51:33634 // Enable FEC protection, and send FEC packet every 6 packets.
[email protected]d8bbef62014-06-12 08:02:50635 EXPECT_TRUE(SwitchFecProtectionOn(6));
[email protected]98a9d1252014-04-04 00:43:59636 // Compute the total overhead for a single frame in packet.
637 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP)
638 + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP);
639 size_t capacity = kDefaultMaxPacketSize - overhead;
640 // Now, test various sizes around this size.
641 for (int delta = -5; delta <= 5; ++delta) {
642 string data(capacity + delta, 'A');
643 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
644 QuicFrame frame;
645 size_t bytes_consumed = creator_.CreateStreamFrame(
[email protected]66ae5962014-05-22 11:13:05646 kClientDataStreamId1, MakeIOVector(data), kOffset, false, &frame);
[email protected]98a9d1252014-04-04 00:43:59647 EXPECT_EQ(capacity - bytes_free, bytes_consumed);
648
649 ASSERT_TRUE(creator_.AddSavedFrame(frame));
650 // BytesFree() returns bytes available for the next frame. Since stream
651 // frame does not grow for FEC protected packets, this should be the same
652 // as bytes_free (bound by 0).
653 EXPECT_EQ(0u, creator_.ExpansionOnNewFrame());
654 size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0;
655 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta;
656 SerializedPacket serialized_packet = creator_.SerializePacket();
657 ASSERT_TRUE(serialized_packet.packet);
658 delete serialized_packet.packet;
659 delete serialized_packet.retransmittable_frames;
660 }
661}
662
[email protected]51cc1342014-04-18 23:44:37663TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) {
[email protected]583bcbcf2013-10-28 01:51:15664 // Compute the total overhead for a single frame in packet.
[email protected]98a9d1252014-04-04 00:43:59665 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP)
666 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP);
[email protected]583bcbcf2013-10-28 01:51:15667 ASSERT_GT(kMaxPacketSize, overhead);
[email protected]8e01c062013-10-31 07:35:31668 size_t capacity = kDefaultMaxPacketSize - overhead;
[email protected]583bcbcf2013-10-28 01:51:15669 // Now, test various sizes around this size.
670 for (int delta = -5; delta <= 5; ++delta) {
671 string data(capacity + delta, 'A');
672 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
673
674 QuicFrame frame;
675 size_t bytes_consumed = creator_.CreateStreamFrame(
[email protected]66ae5962014-05-22 11:13:05676 kCryptoStreamId, MakeIOVector(data), kOffset, false, &frame);
[email protected]583bcbcf2013-10-28 01:51:15677 EXPECT_LT(0u, bytes_consumed);
678 ASSERT_TRUE(creator_.AddSavedFrame(frame));
679 SerializedPacket serialized_packet = creator_.SerializePacket();
680 ASSERT_TRUE(serialized_packet.packet);
681 // If there is not enough space in the packet to fit a padding frame
682 // (1 byte) and to expand the stream frame (another 2 bytes) the packet
683 // will not be padded.
684 if (bytes_free < 3) {
[email protected]8e01c062013-10-31 07:35:31685 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize)
686 - bytes_free, serialized_packet.packet->length());
[email protected]583bcbcf2013-10-28 01:51:15687 } else {
[email protected]8e01c062013-10-31 07:35:31688 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize),
[email protected]583bcbcf2013-10-28 01:51:15689 serialized_packet.packet->length());
690 }
691 delete serialized_packet.packet;
692 delete serialized_packet.retransmittable_frames;
693 }
694}
695
[email protected]51cc1342014-04-18 23:44:37696TEST_P(QuicPacketCreatorTest, NonCryptoStreamFramePacketNonPadding) {
[email protected]583bcbcf2013-10-28 01:51:15697 // Compute the total overhead for a single frame in packet.
[email protected]98a9d1252014-04-04 00:43:59698 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP)
699 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP);
[email protected]8e01c062013-10-31 07:35:31700 ASSERT_GT(kDefaultMaxPacketSize, overhead);
701 size_t capacity = kDefaultMaxPacketSize - overhead;
[email protected]583bcbcf2013-10-28 01:51:15702 // Now, test various sizes around this size.
703 for (int delta = -5; delta <= 5; ++delta) {
704 string data(capacity + delta, 'A');
705 size_t bytes_free = delta > 0 ? 0 : 0 - delta;
706
707 QuicFrame frame;
708 size_t bytes_consumed = creator_.CreateStreamFrame(
[email protected]66ae5962014-05-22 11:13:05709 kClientDataStreamId1, MakeIOVector(data), kOffset, false, &frame);
[email protected]583bcbcf2013-10-28 01:51:15710 EXPECT_LT(0u, bytes_consumed);
711 ASSERT_TRUE(creator_.AddSavedFrame(frame));
712 SerializedPacket serialized_packet = creator_.SerializePacket();
713 ASSERT_TRUE(serialized_packet.packet);
714 if (bytes_free > 0) {
[email protected]8e01c062013-10-31 07:35:31715 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize)
716 - bytes_free, serialized_packet.packet->length());
[email protected]583bcbcf2013-10-28 01:51:15717 } else {
[email protected]8e01c062013-10-31 07:35:31718 EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize),
[email protected]583bcbcf2013-10-28 01:51:15719 serialized_packet.packet->length());
720 }
721 delete serialized_packet.packet;
722 delete serialized_packet.retransmittable_frames;
723 }
724}
725
[email protected]51cc1342014-04-18 23:44:37726TEST_P(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
[email protected]bbb10072014-06-13 07:41:59727 QuicFramerPeer::SetIsServer(&client_framer_, true);
[email protected]48878092013-07-26 14:51:56728 QuicVersionVector versions;
[email protected]b007e632013-10-28 08:39:25729 versions.push_back(test::QuicVersionMax());
[email protected]14e8106c2013-03-14 16:25:33730 scoped_ptr<QuicEncryptedPacket> encrypted(
731 creator_.SerializeVersionNegotiationPacket(versions));
732
733 {
734 InSequence s;
735 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]066d8182014-01-04 02:02:45736 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
[email protected]14e8106c2013-03-14 16:25:33737 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
738 }
[email protected]bbb10072014-06-13 07:41:59739 QuicFramerPeer::SetIsServer(&client_framer_, false);
[email protected]aa7e4ef2014-05-28 03:53:15740 client_framer_.ProcessPacket(*encrypted);
[email protected]14e8106c2013-03-14 16:25:33741}
742
[email protected]51cc1342014-04-18 23:44:37743TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthLeastAwaiting) {
[email protected]24e5bc52013-09-18 15:36:58744 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
[email protected]9cda5fd2014-06-03 10:20:28745 creator_.next_sequence_number_length());
[email protected]24e5bc52013-09-18 15:36:58746
[email protected]a692ad9d2014-07-18 21:35:24747 size_t max_packets_per_fec_group = 10;
748 creator_.set_max_packets_per_fec_group(max_packets_per_fec_group);
749 creator_.set_sequence_number(64 - max_packets_per_fec_group);
[email protected]24e5bc52013-09-18 15:36:58750 creator_.UpdateSequenceNumberLength(2, 10000);
751 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
[email protected]9cda5fd2014-06-03 10:20:28752 creator_.next_sequence_number_length());
[email protected]24e5bc52013-09-18 15:36:58753
[email protected]a692ad9d2014-07-18 21:35:24754 creator_.set_sequence_number(64 * 256 - max_packets_per_fec_group);
[email protected]24e5bc52013-09-18 15:36:58755 creator_.UpdateSequenceNumberLength(2, 10000);
756 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
[email protected]9cda5fd2014-06-03 10:20:28757 creator_.next_sequence_number_length());
[email protected]24e5bc52013-09-18 15:36:58758
[email protected]a692ad9d2014-07-18 21:35:24759 creator_.set_sequence_number(64 * 256 * 256 - max_packets_per_fec_group);
[email protected]24e5bc52013-09-18 15:36:58760 creator_.UpdateSequenceNumberLength(2, 10000);
761 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
[email protected]9cda5fd2014-06-03 10:20:28762 creator_.next_sequence_number_length());
[email protected]24e5bc52013-09-18 15:36:58763
[email protected]a692ad9d2014-07-18 21:35:24764 creator_.set_sequence_number(
765 GG_UINT64_C(64) * 256 * 256 * 256 * 256 - max_packets_per_fec_group);
[email protected]24e5bc52013-09-18 15:36:58766 creator_.UpdateSequenceNumberLength(2, 10000);
767 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER,
[email protected]9cda5fd2014-06-03 10:20:28768 creator_.next_sequence_number_length());
[email protected]24e5bc52013-09-18 15:36:58769}
770
[email protected]51cc1342014-04-18 23:44:37771TEST_P(QuicPacketCreatorTest, UpdatePacketSequenceNumberLengthBandwidth) {
[email protected]24e5bc52013-09-18 15:36:58772 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
[email protected]9cda5fd2014-06-03 10:20:28773 creator_.next_sequence_number_length());
[email protected]24e5bc52013-09-18 15:36:58774
775 creator_.UpdateSequenceNumberLength(1, 10000);
776 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
[email protected]9cda5fd2014-06-03 10:20:28777 creator_.next_sequence_number_length());
[email protected]24e5bc52013-09-18 15:36:58778
779 creator_.UpdateSequenceNumberLength(1, 10000 * 256);
780 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
[email protected]9cda5fd2014-06-03 10:20:28781 creator_.next_sequence_number_length());
[email protected]24e5bc52013-09-18 15:36:58782
783 creator_.UpdateSequenceNumberLength(1, 10000 * 256 * 256);
784 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
[email protected]9cda5fd2014-06-03 10:20:28785 creator_.next_sequence_number_length());
[email protected]24e5bc52013-09-18 15:36:58786
787 creator_.UpdateSequenceNumberLength(
788 1, GG_UINT64_C(1000) * 256 * 256 * 256 * 256);
789 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER,
[email protected]9cda5fd2014-06-03 10:20:28790 creator_.next_sequence_number_length());
[email protected]24e5bc52013-09-18 15:36:58791}
792
[email protected]51cc1342014-04-18 23:44:37793TEST_P(QuicPacketCreatorTest, CreateStreamFrameWithNotifier) {
[email protected]e6ccc1a62013-12-02 07:02:12794 // Ensure that if CreateStreamFrame does not consume any data (e.g. a FIN only
795 // frame) then any QuicAckNotifier that is passed in still gets attached to
796 // the frame.
[email protected]14a95752014-01-08 19:01:52797 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
798 QuicAckNotifier notifier(delegate.get());
[email protected]e6ccc1a62013-12-02 07:02:12799 QuicFrame frame;
800 IOVector empty_iovector;
801 bool fin = true;
802 size_t consumed_bytes = creator_.CreateStreamFrameWithNotifier(
803 1u, empty_iovector, 0u, fin, &notifier, &frame);
804 EXPECT_EQ(0u, consumed_bytes);
805 EXPECT_EQ(&notifier, frame.stream_frame->notifier);
806 delete frame.stream_frame;
807}
808
[email protected]14e8106c2013-03-14 16:25:33809TEST_P(QuicPacketCreatorTest, SerializeFrame) {
[email protected]51cc1342014-04-18 23:44:37810 if (!GetParam().version_serialization) {
[email protected]14e8106c2013-03-14 16:25:33811 creator_.StopSendingVersion();
812 }
[email protected]5dafdb62013-11-14 01:24:26813 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
[email protected]14e8106c2013-03-14 16:25:33814 SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
815 delete frames_[0].stream_frame;
816
817 QuicPacketHeader header;
818 {
819 InSequence s;
820 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]066d8182014-01-04 02:02:45821 EXPECT_CALL(framer_visitor_, OnUnauthenticatedPublicHeader(_));
[email protected]ec86d5462013-11-17 16:04:49822 EXPECT_CALL(framer_visitor_, OnUnauthenticatedHeader(_));
[email protected]42a3eba2014-04-30 10:52:55823 EXPECT_CALL(framer_visitor_, OnDecryptedPacket(_));
[email protected]14e8106c2013-03-14 16:25:33824 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce(
825 DoAll(SaveArg<0>(&header), Return(true)));
826 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
827 EXPECT_CALL(framer_visitor_, OnPacketComplete());
828 }
829 ProcessPacket(serialized.packet);
[email protected]51cc1342014-04-18 23:44:37830 EXPECT_EQ(GetParam().version_serialization,
831 header.public_header.version_flag);
[email protected]14e8106c2013-03-14 16:25:33832 delete serialized.packet;
833}
834
835TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) {
[email protected]51cc1342014-04-18 23:44:37836 if (!GetParam().version_serialization) {
[email protected]14e8106c2013-03-14 16:25:33837 creator_.StopSendingVersion();
838 }
[email protected]fee17f72013-02-03 07:47:41839 // A string larger than fits into a frame.
[email protected]f62262b2013-07-05 20:57:30840 size_t payload_length;
[email protected]9cda5fd2014-06-03 10:20:28841 creator_.set_max_packet_length(GetPacketLengthForOneStream(
[email protected]3e60db82013-08-05 19:43:06842 client_framer_.version(),
[email protected]b064310782013-05-30 21:12:17843 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
[email protected]9cda5fd2014-06-03 10:20:28844 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP, &payload_length));
[email protected]fee17f72013-02-03 07:47:41845 QuicFrame frame;
[email protected]f62262b2013-07-05 20:57:30846 const string too_long_payload(payload_length * 2, 'a');
847 size_t consumed = creator_.CreateStreamFrame(
[email protected]5dafdb62013-11-14 01:24:26848 1u, MakeIOVector(too_long_payload), 0u, true, &frame);
[email protected]f62262b2013-07-05 20:57:30849 EXPECT_EQ(payload_length, consumed);
850 const string payload(payload_length, 'a');
851 CheckStreamFrame(frame, 1u, payload, 0u, false);
[email protected]fee17f72013-02-03 07:47:41852 delete frame.stream_frame;
853}
854
[email protected]14e8106c2013-03-14 16:25:33855TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) {
[email protected]51cc1342014-04-18 23:44:37856 if (!GetParam().version_serialization) {
[email protected]14e8106c2013-03-14 16:25:33857 creator_.StopSendingVersion();
858 }
[email protected]fee17f72013-02-03 07:47:41859 const size_t max_plaintext_size =
[email protected]9cda5fd2014-06-03 10:20:28860 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
[email protected]fee17f72013-02-03 07:47:41861 EXPECT_FALSE(creator_.HasPendingFrames());
[email protected]14e8106c2013-03-14 16:25:33862 EXPECT_EQ(max_plaintext_size -
863 GetPacketHeaderSize(
[email protected]9cda5fd2014-06-03 10:20:28864 creator_.connection_id_length(),
[email protected]b064310782013-05-30 21:12:17865 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
[email protected]ea825e02013-08-21 18:12:45866 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
[email protected]5351cc4b2013-03-03 07:22:41867 creator_.BytesFree());
[email protected]fee17f72013-02-03 07:47:41868
869 // Add a variety of frame types and then a padding frame.
[email protected]310d37b2014-08-02 06:15:37870 QuicAckFrame ack_frame(MakeAckFrame(0u));
[email protected]9db443912013-02-25 05:27:03871 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
[email protected]fee17f72013-02-03 07:47:41872 EXPECT_TRUE(creator_.HasPendingFrames());
873
874 QuicCongestionFeedbackFrame congestion_feedback;
[email protected]310d37b2014-08-02 06:15:37875 congestion_feedback.type = kTCP;
876 congestion_feedback.tcp.receive_window = 0x4030;
[email protected]9db443912013-02-25 05:27:03877 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&congestion_feedback)));
[email protected]fee17f72013-02-03 07:47:41878 EXPECT_TRUE(creator_.HasPendingFrames());
879
880 QuicFrame frame;
[email protected]5dafdb62013-11-14 01:24:26881 size_t consumed = creator_.CreateStreamFrame(
882 1u, MakeIOVector("test"), 0u, false, &frame);
[email protected]fee17f72013-02-03 07:47:41883 EXPECT_EQ(4u, consumed);
884 ASSERT_TRUE(frame.stream_frame);
[email protected]9db443912013-02-25 05:27:03885 EXPECT_TRUE(creator_.AddSavedFrame(frame));
[email protected]fee17f72013-02-03 07:47:41886 EXPECT_TRUE(creator_.HasPendingFrames());
887
888 QuicPaddingFrame padding_frame;
[email protected]9db443912013-02-25 05:27:03889 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&padding_frame)));
[email protected]fee17f72013-02-03 07:47:41890 EXPECT_TRUE(creator_.HasPendingFrames());
891 EXPECT_EQ(0u, creator_.BytesFree());
892
[email protected]9db443912013-02-25 05:27:03893 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
[email protected]fee17f72013-02-03 07:47:41894
895 // Ensure the packet is successfully created.
[email protected]9db443912013-02-25 05:27:03896 SerializedPacket serialized = creator_.SerializePacket();
897 ASSERT_TRUE(serialized.packet);
898 delete serialized.packet;
899 ASSERT_TRUE(serialized.retransmittable_frames);
900 RetransmittableFrames* retransmittable = serialized.retransmittable_frames;
901 ASSERT_EQ(1u, retransmittable->frames().size());
902 EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type);
903 ASSERT_TRUE(retransmittable->frames()[0].stream_frame);
904 delete serialized.retransmittable_frames;
[email protected]fee17f72013-02-03 07:47:41905
906 EXPECT_FALSE(creator_.HasPendingFrames());
[email protected]14e8106c2013-03-14 16:25:33907 EXPECT_EQ(max_plaintext_size -
908 GetPacketHeaderSize(
[email protected]9cda5fd2014-06-03 10:20:28909 creator_.connection_id_length(),
[email protected]b064310782013-05-30 21:12:17910 QuicPacketCreatorPeer::SendVersionInPacket(&creator_),
[email protected]ea825e02013-08-21 18:12:45911 PACKET_1BYTE_SEQUENCE_NUMBER,
[email protected]b064310782013-05-30 21:12:17912 NOT_IN_FEC_GROUP),
[email protected]5351cc4b2013-03-03 07:22:41913 creator_.BytesFree());
[email protected]fee17f72013-02-03 07:47:41914}
915
[email protected]aa7e4ef2014-05-28 03:53:15916TEST_P(QuicPacketCreatorTest, SerializeTruncatedAckFrameWithLargePacketSize) {
917 if (!GetParam().version_serialization) {
918 creator_.StopSendingVersion();
919 }
[email protected]9cda5fd2014-06-03 10:20:28920 creator_.set_max_packet_length(kMaxPacketSize);
[email protected]aa7e4ef2014-05-28 03:53:15921 const size_t max_plaintext_size =
[email protected]9cda5fd2014-06-03 10:20:28922 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
[email protected]aa7e4ef2014-05-28 03:53:15923
924 // Serialized length of ack frame with 2000 nack ranges should be limited by
925 // the number of nack ranges that can be fit in an ack frame.
926 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(2000u, 0u);
927 size_t frame_len = client_framer_.GetSerializedFrameLength(
928 QuicFrame(&ack_frame), creator_.BytesFree(), true, true,
929 NOT_IN_FEC_GROUP, PACKET_1BYTE_SEQUENCE_NUMBER);
930 EXPECT_GT(creator_.BytesFree(), frame_len);
931 EXPECT_GT(max_plaintext_size, creator_.PacketSize());
932
933 // Add ack frame to creator.
934 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
935 EXPECT_TRUE(creator_.HasPendingFrames());
936 EXPECT_GT(max_plaintext_size, creator_.PacketSize());
937 EXPECT_LT(0u, creator_.BytesFree());
938
939 // Make sure that an additional stream frame can be added to the packet.
940 QuicFrame stream_frame;
941 size_t consumed = creator_.CreateStreamFrame(
942 2u, MakeIOVector("test"), 0u, false, &stream_frame);
943 EXPECT_EQ(4u, consumed);
944 ASSERT_TRUE(stream_frame.stream_frame);
945 EXPECT_TRUE(creator_.AddSavedFrame(stream_frame));
946 EXPECT_TRUE(creator_.HasPendingFrames());
947
948 // Ensure the packet is successfully created, and the packet size estimate
949 // matches the serialized packet length.
950 EXPECT_CALL(entropy_calculator_,
951 EntropyHash(_)).WillOnce(testing::Return(0));
952 size_t est_packet_size = creator_.PacketSize();
953 SerializedPacket serialized = creator_.SerializePacket();
954 ASSERT_TRUE(serialized.packet);
955 EXPECT_EQ(est_packet_size, serialized.packet->length());
956 delete serialized.retransmittable_frames;
957 delete serialized.packet;
958}
959
960TEST_P(QuicPacketCreatorTest, SerializeTruncatedAckFrameWithSmallPacketSize) {
961 if (!GetParam().version_serialization) {
962 creator_.StopSendingVersion();
963 }
[email protected]9cda5fd2014-06-03 10:20:28964 creator_.set_max_packet_length(500u);
965
[email protected]aa7e4ef2014-05-28 03:53:15966 const size_t max_plaintext_size =
[email protected]9cda5fd2014-06-03 10:20:28967 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length());
[email protected]aa7e4ef2014-05-28 03:53:15968 EXPECT_EQ(max_plaintext_size - creator_.PacketSize(), creator_.BytesFree());
969
970 // Serialized length of ack frame with 2000 nack ranges should be limited by
971 // the packet size.
972 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(2000u, 0u);
973 size_t frame_len = client_framer_.GetSerializedFrameLength(
974 QuicFrame(&ack_frame), creator_.BytesFree(), true, true,
975 NOT_IN_FEC_GROUP, PACKET_1BYTE_SEQUENCE_NUMBER);
976 EXPECT_EQ(creator_.BytesFree(), frame_len);
977
978 // Add ack frame to creator.
979 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
980 EXPECT_TRUE(creator_.HasPendingFrames());
981 EXPECT_EQ(max_plaintext_size, creator_.PacketSize());
982 EXPECT_EQ(0u, creator_.BytesFree());
983
984 // Ensure the packet is successfully created, and the packet size estimate
985 // may not match the serialized packet length.
986 EXPECT_CALL(entropy_calculator_,
987 EntropyHash(_)).WillOnce(Return(0));
988 size_t est_packet_size = creator_.PacketSize();
989 SerializedPacket serialized = creator_.SerializePacket();
990 ASSERT_TRUE(serialized.packet);
991 EXPECT_GE(est_packet_size, serialized.packet->length());
992 delete serialized.packet;
993}
994
995
[email protected]51cc1342014-04-18 23:44:37996TEST_P(QuicPacketCreatorTest, EntropyFlag) {
[email protected]457d6952013-12-13 09:24:58997 frames_.push_back(QuicFrame(new QuicStreamFrame(0u, false, 0u, IOVector())));
998
999 for (int i = 0; i < 2; ++i) {
1000 for (int j = 0; j < 64; ++j) {
1001 SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
1002 // Verify both BoolSource and hash algorithm.
1003 bool expected_rand_bool =
1004 (mock_random_.RandUint64() & (GG_UINT64_C(1) << j)) != 0;
1005 bool observed_rand_bool =
1006 (serialized.entropy_hash & (1 << ((j+1) % 8))) != 0;
1007 uint8 rest_of_hash = serialized.entropy_hash & ~(1 << ((j+1) % 8));
1008 EXPECT_EQ(expected_rand_bool, observed_rand_bool);
1009 EXPECT_EQ(0, rest_of_hash);
1010 delete serialized.packet;
1011 }
1012 // After 64 calls, BoolSource will refresh the bucket - make sure it does.
1013 mock_random_.ChangeValue();
1014 }
1015
1016 delete frames_[0].stream_frame;
1017}
1018
[email protected]a5061242012-10-23 23:29:371019} // namespace
1020} // namespace test
1021} // namespace net