blob: 60d48d04a8559aef60fb849392ede8c2bb24fd65 [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"
11#include "net/quic/crypto/quic_random.h"
[email protected]a5061242012-10-23 23:29:3712#include "net/quic/quic_utils.h"
[email protected]14e8106c2013-03-14 16:25:3313#include "net/quic/test_tools/quic_packet_creator_peer.h"
[email protected]a5061242012-10-23 23:29:3714#include "net/quic/test_tools/quic_test_utils.h"
15#include "testing/gmock/include/gmock/gmock.h"
16
[email protected]c995c572013-01-18 05:43:2017using base::StringPiece;
18using std::string;
19using std::vector;
[email protected]14e8106c2013-03-14 16:25:3320using testing::DoAll;
[email protected]a5061242012-10-23 23:29:3721using testing::InSequence;
[email protected]14e8106c2013-03-14 16:25:3322using testing::Return;
23using testing::SaveArg;
[email protected]a5061242012-10-23 23:29:3724using testing::_;
[email protected]a5061242012-10-23 23:29:3725
26namespace net {
27namespace test {
28namespace {
29
[email protected]14e8106c2013-03-14 16:25:3330class QuicPacketCreatorTest : public ::testing::TestWithParam<bool> {
[email protected]a5061242012-10-23 23:29:3731 protected:
32 QuicPacketCreatorTest()
[email protected]14e8106c2013-03-14 16:25:3333 : server_framer_(kQuicVersion1,
34 QuicDecrypter::Create(kNULL),
35 QuicEncrypter::Create(kNULL),
[email protected]74bda142013-03-31 02:49:1136 QuicTime::Zero(),
[email protected]14e8106c2013-03-14 16:25:3337 true),
38 client_framer_(kQuicVersion1,
39 QuicDecrypter::Create(kNULL),
40 QuicEncrypter::Create(kNULL),
[email protected]74bda142013-03-31 02:49:1141 QuicTime::Zero(),
[email protected]14e8106c2013-03-14 16:25:3342 false),
[email protected]a5061242012-10-23 23:29:3743 id_(1),
44 sequence_number_(0),
45 guid_(2),
46 data_("foo"),
[email protected]14e8106c2013-03-14 16:25:3347 creator_(guid_, &client_framer_, QuicRandom::GetInstance(), false) {
48 client_framer_.set_visitor(&framer_visitor_);
49 server_framer_.set_visitor(&framer_visitor_);
[email protected]a5061242012-10-23 23:29:3750 }
51 ~QuicPacketCreatorTest() {
[email protected]a5061242012-10-23 23:29:3752 }
53
[email protected]c995c572013-01-18 05:43:2054 void ProcessPacket(QuicPacket* packet) {
[email protected]9db443912013-02-25 05:27:0355 scoped_ptr<QuicEncryptedPacket> encrypted(
[email protected]14e8106c2013-03-14 16:25:3356 server_framer_.EncryptPacket(sequence_number_, *packet));
57 server_framer_.ProcessPacket(*encrypted);
[email protected]fee17f72013-02-03 07:47:4158 }
59
60 void CheckStreamFrame(const QuicFrame& frame, QuicStreamId stream_id,
61 const string& data, QuicStreamOffset offset, bool fin) {
62 EXPECT_EQ(STREAM_FRAME, frame.type);
63 ASSERT_TRUE(frame.stream_frame);
64 EXPECT_EQ(stream_id, frame.stream_frame->stream_id);
65 EXPECT_EQ(data, frame.stream_frame->data);
66 EXPECT_EQ(offset, frame.stream_frame->offset);
67 EXPECT_EQ(fin, frame.stream_frame->fin);
[email protected]a5061242012-10-23 23:29:3768 }
69
[email protected]701bc892013-01-17 04:51:5470 QuicFrames frames_;
[email protected]14e8106c2013-03-14 16:25:3371 QuicFramer server_framer_;
72 QuicFramer client_framer_;
[email protected]a5061242012-10-23 23:29:3773 testing::StrictMock<MockFramerVisitor> framer_visitor_;
74 QuicStreamId id_;
75 QuicPacketSequenceNumber sequence_number_;
76 QuicGuid guid_;
77 string data_;
[email protected]fee17f72013-02-03 07:47:4178 QuicPacketCreator creator_;
[email protected]a5061242012-10-23 23:29:3779};
80
[email protected]c995c572013-01-18 05:43:2081TEST_F(QuicPacketCreatorTest, SerializeFrames) {
[email protected]14e8106c2013-03-14 16:25:3382 frames_.push_back(QuicFrame(new QuicAckFrame(0u, QuicTime::Zero(), 0u)));
[email protected]c995c572013-01-18 05:43:2083 frames_.push_back(QuicFrame(new QuicStreamFrame(
84 0u, false, 0u, StringPiece(""))));
85 frames_.push_back(QuicFrame(new QuicStreamFrame(
86 0u, true, 0u, StringPiece(""))));
[email protected]9db443912013-02-25 05:27:0387 SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
88 delete frames_[0].ack_frame;
89 delete frames_[1].stream_frame;
90 delete frames_[2].stream_frame;
[email protected]a5061242012-10-23 23:29:3791
[email protected]c995c572013-01-18 05:43:2092 {
93 InSequence s;
[email protected]fee17f72013-02-03 07:47:4194 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]c995c572013-01-18 05:43:2095 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
96 EXPECT_CALL(framer_visitor_, OnAckFrame(_));
97 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
98 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
99 EXPECT_CALL(framer_visitor_, OnPacketComplete());
100 }
[email protected]9db443912013-02-25 05:27:03101 ProcessPacket(serialized.packet);
102 delete serialized.packet;
[email protected]a5061242012-10-23 23:29:37103}
104
[email protected]c995c572013-01-18 05:43:20105TEST_F(QuicPacketCreatorTest, SerializeWithFEC) {
[email protected]fee17f72013-02-03 07:47:41106 creator_.options()->max_packets_per_fec_group = 6;
107 ASSERT_FALSE(creator_.ShouldSendFec(false));
108 creator_.MaybeStartFEC();
[email protected]a5061242012-10-23 23:29:37109
[email protected]c995c572013-01-18 05:43:20110 frames_.push_back(QuicFrame(new QuicStreamFrame(
111 0u, false, 0u, StringPiece(""))));
[email protected]9db443912013-02-25 05:27:03112 SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
113 delete frames_[0].stream_frame;
[email protected]a5061242012-10-23 23:29:37114
[email protected]c995c572013-01-18 05:43:20115 {
116 InSequence s;
[email protected]fee17f72013-02-03 07:47:41117 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]c995c572013-01-18 05:43:20118 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
119 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
120 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
121 EXPECT_CALL(framer_visitor_, OnPacketComplete());
122 }
[email protected]9db443912013-02-25 05:27:03123 ProcessPacket(serialized.packet);
124 delete serialized.packet;
[email protected]a5061242012-10-23 23:29:37125
[email protected]fee17f72013-02-03 07:47:41126 ASSERT_FALSE(creator_.ShouldSendFec(false));
127 ASSERT_TRUE(creator_.ShouldSendFec(true));
[email protected]a5061242012-10-23 23:29:37128
[email protected]9db443912013-02-25 05:27:03129 serialized = creator_.SerializeFec();
130 ASSERT_EQ(2u, serialized.sequence_number);
[email protected]a5061242012-10-23 23:29:37131
[email protected]c995c572013-01-18 05:43:20132 {
133 InSequence s;
[email protected]fee17f72013-02-03 07:47:41134 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]c995c572013-01-18 05:43:20135 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
136 EXPECT_CALL(framer_visitor_, OnFecData(_));
137 EXPECT_CALL(framer_visitor_, OnPacketComplete());
138 }
[email protected]9db443912013-02-25 05:27:03139 ProcessPacket(serialized.packet);
140 delete serialized.packet;
[email protected]a5061242012-10-23 23:29:37141}
142
[email protected]9db443912013-02-25 05:27:03143TEST_F(QuicPacketCreatorTest, SerializeConnectionClose) {
[email protected]c995c572013-01-18 05:43:20144 QuicConnectionCloseFrame frame;
145 frame.error_code = QUIC_NO_ERROR;
[email protected]14e8106c2013-03-14 16:25:33146 frame.ack_frame = QuicAckFrame(0u, QuicTime::Zero(), 0u);
[email protected]a5061242012-10-23 23:29:37147
[email protected]9db443912013-02-25 05:27:03148 SerializedPacket serialized = creator_.SerializeConnectionClose(&frame);
149 ASSERT_EQ(1u, serialized.sequence_number);
[email protected]fee17f72013-02-03 07:47:41150 ASSERT_EQ(1u, creator_.sequence_number());
[email protected]a5061242012-10-23 23:29:37151
152 InSequence s;
[email protected]fee17f72013-02-03 07:47:41153 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]a5061242012-10-23 23:29:37154 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
[email protected]c995c572013-01-18 05:43:20155 EXPECT_CALL(framer_visitor_, OnAckFrame(_));
156 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
[email protected]a5061242012-10-23 23:29:37157 EXPECT_CALL(framer_visitor_, OnPacketComplete());
158
[email protected]9db443912013-02-25 05:27:03159 ProcessPacket(serialized.packet);
160 delete serialized.packet;
[email protected]a5d4eee22012-12-13 09:09:01161}
162
[email protected]fee17f72013-02-03 07:47:41163TEST_F(QuicPacketCreatorTest, CreateStreamFrame) {
164 QuicFrame frame;
165 size_t consumed = creator_.CreateStreamFrame(1u, "test", 0u, false, &frame);
166 EXPECT_EQ(4u, consumed);
167 CheckStreamFrame(frame, 1u, "test", 0u, false);
168 delete frame.stream_frame;
169}
170
171TEST_F(QuicPacketCreatorTest, CreateStreamFrameFin) {
172 QuicFrame frame;
173 size_t consumed = creator_.CreateStreamFrame(1u, "test", 10u, true, &frame);
174 EXPECT_EQ(4u, consumed);
175 CheckStreamFrame(frame, 1u, "test", 10u, true);
176 delete frame.stream_frame;
177}
178
179TEST_F(QuicPacketCreatorTest, CreateStreamFrameFinOnly) {
180 QuicFrame frame;
181 size_t consumed = creator_.CreateStreamFrame(1u, "", 0u, true, &frame);
182 EXPECT_EQ(0u, consumed);
[email protected]007b3f82013-04-09 08:46:45183 CheckStreamFrame(frame, 1u, std::string(), 0u, true);
[email protected]fee17f72013-02-03 07:47:41184 delete frame.stream_frame;
185}
186
[email protected]14e8106c2013-03-14 16:25:33187TEST_F(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
[email protected]74bda142013-03-31 02:49:11188 QuicPacketCreatorPeer::SetIsServer(&creator_, true);
[email protected]14e8106c2013-03-14 16:25:33189 QuicVersionTagList versions;
190 versions.push_back(kQuicVersion1);
191 scoped_ptr<QuicEncryptedPacket> encrypted(
192 creator_.SerializeVersionNegotiationPacket(versions));
193
194 {
195 InSequence s;
196 EXPECT_CALL(framer_visitor_, OnPacket());
197 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
198 }
199 client_framer_.ProcessPacket(*encrypted.get());
200}
201
202INSTANTIATE_TEST_CASE_P(ToggleVersionSerialization,
203 QuicPacketCreatorTest,
204 ::testing::Values(false, true));
205
206TEST_P(QuicPacketCreatorTest, SerializeFrame) {
207 if (!GetParam()) {
208 creator_.StopSendingVersion();
209 }
210 frames_.push_back(QuicFrame(new QuicStreamFrame(
211 0u, false, 0u, StringPiece(""))));
212 SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
213 delete frames_[0].stream_frame;
214
215 QuicPacketHeader header;
216 {
217 InSequence s;
218 EXPECT_CALL(framer_visitor_, OnPacket());
219 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce(
220 DoAll(SaveArg<0>(&header), Return(true)));
221 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
222 EXPECT_CALL(framer_visitor_, OnPacketComplete());
223 }
224 ProcessPacket(serialized.packet);
225 EXPECT_EQ(GetParam(), header.public_header.version_flag);
226 delete serialized.packet;
227}
228
229TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) {
230 if (!GetParam()) {
231 creator_.StopSendingVersion();
232 }
[email protected]fee17f72013-02-03 07:47:41233 // A string larger than fits into a frame.
[email protected]14e8106c2013-03-14 16:25:33234 creator_.options()->max_packet_length = GetPacketLengthForOneStream(
[email protected]a57e0272013-04-26 07:31:47235 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), 4);
[email protected]fee17f72013-02-03 07:47:41236 QuicFrame frame;
[email protected]a57e0272013-04-26 07:31:47237 size_t consumed = creator_.CreateStreamFrame(1u, "testTooLong", 0u, true,
238 &frame);
239 EXPECT_EQ(4u, consumed);
240 CheckStreamFrame(frame, 1u, "test", 0u, false);
[email protected]fee17f72013-02-03 07:47:41241 delete frame.stream_frame;
242}
243
[email protected]14e8106c2013-03-14 16:25:33244TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) {
245 if (!GetParam()) {
246 creator_.StopSendingVersion();
247 }
[email protected]fee17f72013-02-03 07:47:41248 const size_t max_plaintext_size =
[email protected]14e8106c2013-03-14 16:25:33249 client_framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length);
[email protected]fee17f72013-02-03 07:47:41250 EXPECT_FALSE(creator_.HasPendingFrames());
[email protected]14e8106c2013-03-14 16:25:33251 EXPECT_EQ(max_plaintext_size -
252 GetPacketHeaderSize(
253 QuicPacketCreatorPeer::SendVersionInPacket(&creator_)),
[email protected]5351cc4b2013-03-03 07:22:41254 creator_.BytesFree());
[email protected]fee17f72013-02-03 07:47:41255
256 // Add a variety of frame types and then a padding frame.
257 QuicAckFrame ack_frame;
[email protected]9db443912013-02-25 05:27:03258 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
[email protected]fee17f72013-02-03 07:47:41259 EXPECT_TRUE(creator_.HasPendingFrames());
260
261 QuicCongestionFeedbackFrame congestion_feedback;
262 congestion_feedback.type = kFixRate;
[email protected]9db443912013-02-25 05:27:03263 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&congestion_feedback)));
[email protected]fee17f72013-02-03 07:47:41264 EXPECT_TRUE(creator_.HasPendingFrames());
265
266 QuicFrame frame;
267 size_t consumed = creator_.CreateStreamFrame(1u, "test", 0u, false, &frame);
268 EXPECT_EQ(4u, consumed);
269 ASSERT_TRUE(frame.stream_frame);
[email protected]9db443912013-02-25 05:27:03270 EXPECT_TRUE(creator_.AddSavedFrame(frame));
[email protected]fee17f72013-02-03 07:47:41271 EXPECT_TRUE(creator_.HasPendingFrames());
272
273 QuicPaddingFrame padding_frame;
[email protected]9db443912013-02-25 05:27:03274 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&padding_frame)));
[email protected]fee17f72013-02-03 07:47:41275 EXPECT_TRUE(creator_.HasPendingFrames());
276 EXPECT_EQ(0u, creator_.BytesFree());
277
[email protected]9db443912013-02-25 05:27:03278 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
[email protected]fee17f72013-02-03 07:47:41279
280 // Ensure the packet is successfully created.
[email protected]9db443912013-02-25 05:27:03281 SerializedPacket serialized = creator_.SerializePacket();
282 ASSERT_TRUE(serialized.packet);
283 delete serialized.packet;
284 ASSERT_TRUE(serialized.retransmittable_frames);
285 RetransmittableFrames* retransmittable = serialized.retransmittable_frames;
286 ASSERT_EQ(1u, retransmittable->frames().size());
287 EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type);
288 ASSERT_TRUE(retransmittable->frames()[0].stream_frame);
289 delete serialized.retransmittable_frames;
[email protected]fee17f72013-02-03 07:47:41290
291 EXPECT_FALSE(creator_.HasPendingFrames());
[email protected]14e8106c2013-03-14 16:25:33292 EXPECT_EQ(max_plaintext_size -
293 GetPacketHeaderSize(
294 QuicPacketCreatorPeer::SendVersionInPacket(&creator_)),
[email protected]5351cc4b2013-03-03 07:22:41295 creator_.BytesFree());
[email protected]fee17f72013-02-03 07:47:41296}
297
[email protected]a5061242012-10-23 23:29:37298} // namespace
299} // namespace test
300} // namespace net