blob: 4fe4f183b1b99c3e2db58de9205d3200c269ebfe [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]8ba81212013-05-03 13:11:4833 : server_framer_(kQuicVersion1, QuicTime::Zero(), true),
34 client_framer_(kQuicVersion1, QuicTime::Zero(), false),
[email protected]a5061242012-10-23 23:29:3735 id_(1),
36 sequence_number_(0),
37 guid_(2),
38 data_("foo"),
[email protected]14e8106c2013-03-14 16:25:3339 creator_(guid_, &client_framer_, QuicRandom::GetInstance(), false) {
40 client_framer_.set_visitor(&framer_visitor_);
41 server_framer_.set_visitor(&framer_visitor_);
[email protected]a5061242012-10-23 23:29:3742 }
43 ~QuicPacketCreatorTest() {
[email protected]a5061242012-10-23 23:29:3744 }
45
[email protected]c995c572013-01-18 05:43:2046 void ProcessPacket(QuicPacket* packet) {
[email protected]9db443912013-02-25 05:27:0347 scoped_ptr<QuicEncryptedPacket> encrypted(
[email protected]8ba81212013-05-03 13:11:4848 server_framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number_,
49 *packet));
[email protected]14e8106c2013-03-14 16:25:3350 server_framer_.ProcessPacket(*encrypted);
[email protected]fee17f72013-02-03 07:47:4151 }
52
53 void CheckStreamFrame(const QuicFrame& frame, QuicStreamId stream_id,
54 const string& data, QuicStreamOffset offset, bool fin) {
55 EXPECT_EQ(STREAM_FRAME, frame.type);
56 ASSERT_TRUE(frame.stream_frame);
57 EXPECT_EQ(stream_id, frame.stream_frame->stream_id);
58 EXPECT_EQ(data, frame.stream_frame->data);
59 EXPECT_EQ(offset, frame.stream_frame->offset);
60 EXPECT_EQ(fin, frame.stream_frame->fin);
[email protected]a5061242012-10-23 23:29:3761 }
62
[email protected]701bc892013-01-17 04:51:5463 QuicFrames frames_;
[email protected]14e8106c2013-03-14 16:25:3364 QuicFramer server_framer_;
65 QuicFramer client_framer_;
[email protected]a5061242012-10-23 23:29:3766 testing::StrictMock<MockFramerVisitor> framer_visitor_;
67 QuicStreamId id_;
68 QuicPacketSequenceNumber sequence_number_;
69 QuicGuid guid_;
70 string data_;
[email protected]fee17f72013-02-03 07:47:4171 QuicPacketCreator creator_;
[email protected]a5061242012-10-23 23:29:3772};
73
[email protected]c995c572013-01-18 05:43:2074TEST_F(QuicPacketCreatorTest, SerializeFrames) {
[email protected]14e8106c2013-03-14 16:25:3375 frames_.push_back(QuicFrame(new QuicAckFrame(0u, QuicTime::Zero(), 0u)));
[email protected]c995c572013-01-18 05:43:2076 frames_.push_back(QuicFrame(new QuicStreamFrame(
77 0u, false, 0u, StringPiece(""))));
78 frames_.push_back(QuicFrame(new QuicStreamFrame(
79 0u, true, 0u, StringPiece(""))));
[email protected]9db443912013-02-25 05:27:0380 SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
81 delete frames_[0].ack_frame;
82 delete frames_[1].stream_frame;
83 delete frames_[2].stream_frame;
[email protected]a5061242012-10-23 23:29:3784
[email protected]c995c572013-01-18 05:43:2085 {
86 InSequence s;
[email protected]fee17f72013-02-03 07:47:4187 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]c995c572013-01-18 05:43:2088 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
89 EXPECT_CALL(framer_visitor_, OnAckFrame(_));
90 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
91 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
92 EXPECT_CALL(framer_visitor_, OnPacketComplete());
93 }
[email protected]9db443912013-02-25 05:27:0394 ProcessPacket(serialized.packet);
95 delete serialized.packet;
[email protected]a5061242012-10-23 23:29:3796}
97
[email protected]c995c572013-01-18 05:43:2098TEST_F(QuicPacketCreatorTest, SerializeWithFEC) {
[email protected]fee17f72013-02-03 07:47:4199 creator_.options()->max_packets_per_fec_group = 6;
100 ASSERT_FALSE(creator_.ShouldSendFec(false));
101 creator_.MaybeStartFEC();
[email protected]a5061242012-10-23 23:29:37102
[email protected]c995c572013-01-18 05:43:20103 frames_.push_back(QuicFrame(new QuicStreamFrame(
104 0u, false, 0u, StringPiece(""))));
[email protected]9db443912013-02-25 05:27:03105 SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
106 delete frames_[0].stream_frame;
[email protected]a5061242012-10-23 23:29:37107
[email protected]c995c572013-01-18 05:43:20108 {
109 InSequence s;
[email protected]fee17f72013-02-03 07:47:41110 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]c995c572013-01-18 05:43:20111 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
112 EXPECT_CALL(framer_visitor_, OnFecProtectedPayload(_));
113 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
114 EXPECT_CALL(framer_visitor_, OnPacketComplete());
115 }
[email protected]9db443912013-02-25 05:27:03116 ProcessPacket(serialized.packet);
117 delete serialized.packet;
[email protected]a5061242012-10-23 23:29:37118
[email protected]fee17f72013-02-03 07:47:41119 ASSERT_FALSE(creator_.ShouldSendFec(false));
120 ASSERT_TRUE(creator_.ShouldSendFec(true));
[email protected]a5061242012-10-23 23:29:37121
[email protected]9db443912013-02-25 05:27:03122 serialized = creator_.SerializeFec();
123 ASSERT_EQ(2u, serialized.sequence_number);
[email protected]a5061242012-10-23 23:29:37124
[email protected]c995c572013-01-18 05:43:20125 {
126 InSequence s;
[email protected]fee17f72013-02-03 07:47:41127 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]c995c572013-01-18 05:43:20128 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
129 EXPECT_CALL(framer_visitor_, OnFecData(_));
130 EXPECT_CALL(framer_visitor_, OnPacketComplete());
131 }
[email protected]9db443912013-02-25 05:27:03132 ProcessPacket(serialized.packet);
133 delete serialized.packet;
[email protected]a5061242012-10-23 23:29:37134}
135
[email protected]9db443912013-02-25 05:27:03136TEST_F(QuicPacketCreatorTest, SerializeConnectionClose) {
[email protected]c995c572013-01-18 05:43:20137 QuicConnectionCloseFrame frame;
138 frame.error_code = QUIC_NO_ERROR;
[email protected]14e8106c2013-03-14 16:25:33139 frame.ack_frame = QuicAckFrame(0u, QuicTime::Zero(), 0u);
[email protected]a5061242012-10-23 23:29:37140
[email protected]9db443912013-02-25 05:27:03141 SerializedPacket serialized = creator_.SerializeConnectionClose(&frame);
142 ASSERT_EQ(1u, serialized.sequence_number);
[email protected]fee17f72013-02-03 07:47:41143 ASSERT_EQ(1u, creator_.sequence_number());
[email protected]a5061242012-10-23 23:29:37144
145 InSequence s;
[email protected]fee17f72013-02-03 07:47:41146 EXPECT_CALL(framer_visitor_, OnPacket());
[email protected]a5061242012-10-23 23:29:37147 EXPECT_CALL(framer_visitor_, OnPacketHeader(_));
[email protected]c995c572013-01-18 05:43:20148 EXPECT_CALL(framer_visitor_, OnAckFrame(_));
149 EXPECT_CALL(framer_visitor_, OnConnectionCloseFrame(_));
[email protected]a5061242012-10-23 23:29:37150 EXPECT_CALL(framer_visitor_, OnPacketComplete());
151
[email protected]9db443912013-02-25 05:27:03152 ProcessPacket(serialized.packet);
153 delete serialized.packet;
[email protected]a5d4eee22012-12-13 09:09:01154}
155
[email protected]fee17f72013-02-03 07:47:41156TEST_F(QuicPacketCreatorTest, CreateStreamFrame) {
157 QuicFrame frame;
158 size_t consumed = creator_.CreateStreamFrame(1u, "test", 0u, false, &frame);
159 EXPECT_EQ(4u, consumed);
160 CheckStreamFrame(frame, 1u, "test", 0u, false);
161 delete frame.stream_frame;
162}
163
164TEST_F(QuicPacketCreatorTest, CreateStreamFrameFin) {
165 QuicFrame frame;
166 size_t consumed = creator_.CreateStreamFrame(1u, "test", 10u, true, &frame);
167 EXPECT_EQ(4u, consumed);
168 CheckStreamFrame(frame, 1u, "test", 10u, true);
169 delete frame.stream_frame;
170}
171
172TEST_F(QuicPacketCreatorTest, CreateStreamFrameFinOnly) {
173 QuicFrame frame;
174 size_t consumed = creator_.CreateStreamFrame(1u, "", 0u, true, &frame);
175 EXPECT_EQ(0u, consumed);
[email protected]007b3f82013-04-09 08:46:45176 CheckStreamFrame(frame, 1u, std::string(), 0u, true);
[email protected]fee17f72013-02-03 07:47:41177 delete frame.stream_frame;
178}
179
[email protected]14e8106c2013-03-14 16:25:33180TEST_F(QuicPacketCreatorTest, SerializeVersionNegotiationPacket) {
[email protected]74bda142013-03-31 02:49:11181 QuicPacketCreatorPeer::SetIsServer(&creator_, true);
[email protected]14e8106c2013-03-14 16:25:33182 QuicVersionTagList versions;
183 versions.push_back(kQuicVersion1);
184 scoped_ptr<QuicEncryptedPacket> encrypted(
185 creator_.SerializeVersionNegotiationPacket(versions));
186
187 {
188 InSequence s;
189 EXPECT_CALL(framer_visitor_, OnPacket());
190 EXPECT_CALL(framer_visitor_, OnVersionNegotiationPacket(_));
191 }
192 client_framer_.ProcessPacket(*encrypted.get());
193}
194
195INSTANTIATE_TEST_CASE_P(ToggleVersionSerialization,
196 QuicPacketCreatorTest,
197 ::testing::Values(false, true));
198
199TEST_P(QuicPacketCreatorTest, SerializeFrame) {
200 if (!GetParam()) {
201 creator_.StopSendingVersion();
202 }
203 frames_.push_back(QuicFrame(new QuicStreamFrame(
204 0u, false, 0u, StringPiece(""))));
205 SerializedPacket serialized = creator_.SerializeAllFrames(frames_);
206 delete frames_[0].stream_frame;
207
208 QuicPacketHeader header;
209 {
210 InSequence s;
211 EXPECT_CALL(framer_visitor_, OnPacket());
212 EXPECT_CALL(framer_visitor_, OnPacketHeader(_)).WillOnce(
213 DoAll(SaveArg<0>(&header), Return(true)));
214 EXPECT_CALL(framer_visitor_, OnStreamFrame(_));
215 EXPECT_CALL(framer_visitor_, OnPacketComplete());
216 }
217 ProcessPacket(serialized.packet);
218 EXPECT_EQ(GetParam(), header.public_header.version_flag);
219 delete serialized.packet;
220}
221
222TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) {
223 if (!GetParam()) {
224 creator_.StopSendingVersion();
225 }
[email protected]fee17f72013-02-03 07:47:41226 // A string larger than fits into a frame.
[email protected]14e8106c2013-03-14 16:25:33227 creator_.options()->max_packet_length = GetPacketLengthForOneStream(
[email protected]a57e0272013-04-26 07:31:47228 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), 4);
[email protected]fee17f72013-02-03 07:47:41229 QuicFrame frame;
[email protected]a57e0272013-04-26 07:31:47230 size_t consumed = creator_.CreateStreamFrame(1u, "testTooLong", 0u, true,
231 &frame);
232 EXPECT_EQ(4u, consumed);
233 CheckStreamFrame(frame, 1u, "test", 0u, false);
[email protected]fee17f72013-02-03 07:47:41234 delete frame.stream_frame;
235}
236
[email protected]14e8106c2013-03-14 16:25:33237TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) {
238 if (!GetParam()) {
239 creator_.StopSendingVersion();
240 }
[email protected]fee17f72013-02-03 07:47:41241 const size_t max_plaintext_size =
[email protected]14e8106c2013-03-14 16:25:33242 client_framer_.GetMaxPlaintextSize(creator_.options()->max_packet_length);
[email protected]fee17f72013-02-03 07:47:41243 EXPECT_FALSE(creator_.HasPendingFrames());
[email protected]14e8106c2013-03-14 16:25:33244 EXPECT_EQ(max_plaintext_size -
245 GetPacketHeaderSize(
246 QuicPacketCreatorPeer::SendVersionInPacket(&creator_)),
[email protected]5351cc4b2013-03-03 07:22:41247 creator_.BytesFree());
[email protected]fee17f72013-02-03 07:47:41248
249 // Add a variety of frame types and then a padding frame.
250 QuicAckFrame ack_frame;
[email protected]9db443912013-02-25 05:27:03251 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
[email protected]fee17f72013-02-03 07:47:41252 EXPECT_TRUE(creator_.HasPendingFrames());
253
254 QuicCongestionFeedbackFrame congestion_feedback;
255 congestion_feedback.type = kFixRate;
[email protected]9db443912013-02-25 05:27:03256 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&congestion_feedback)));
[email protected]fee17f72013-02-03 07:47:41257 EXPECT_TRUE(creator_.HasPendingFrames());
258
259 QuicFrame frame;
260 size_t consumed = creator_.CreateStreamFrame(1u, "test", 0u, false, &frame);
261 EXPECT_EQ(4u, consumed);
262 ASSERT_TRUE(frame.stream_frame);
[email protected]9db443912013-02-25 05:27:03263 EXPECT_TRUE(creator_.AddSavedFrame(frame));
[email protected]fee17f72013-02-03 07:47:41264 EXPECT_TRUE(creator_.HasPendingFrames());
265
266 QuicPaddingFrame padding_frame;
[email protected]9db443912013-02-25 05:27:03267 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&padding_frame)));
[email protected]fee17f72013-02-03 07:47:41268 EXPECT_TRUE(creator_.HasPendingFrames());
269 EXPECT_EQ(0u, creator_.BytesFree());
270
[email protected]9db443912013-02-25 05:27:03271 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame)));
[email protected]fee17f72013-02-03 07:47:41272
273 // Ensure the packet is successfully created.
[email protected]9db443912013-02-25 05:27:03274 SerializedPacket serialized = creator_.SerializePacket();
275 ASSERT_TRUE(serialized.packet);
276 delete serialized.packet;
277 ASSERT_TRUE(serialized.retransmittable_frames);
278 RetransmittableFrames* retransmittable = serialized.retransmittable_frames;
279 ASSERT_EQ(1u, retransmittable->frames().size());
280 EXPECT_EQ(STREAM_FRAME, retransmittable->frames()[0].type);
281 ASSERT_TRUE(retransmittable->frames()[0].stream_frame);
282 delete serialized.retransmittable_frames;
[email protected]fee17f72013-02-03 07:47:41283
284 EXPECT_FALSE(creator_.HasPendingFrames());
[email protected]14e8106c2013-03-14 16:25:33285 EXPECT_EQ(max_plaintext_size -
286 GetPacketHeaderSize(
287 QuicPacketCreatorPeer::SendVersionInPacket(&creator_)),
[email protected]5351cc4b2013-03-03 07:22:41288 creator_.BytesFree());
[email protected]fee17f72013-02-03 07:47:41289}
290
[email protected]a5061242012-10-23 23:29:37291} // namespace
292} // namespace test
293} // namespace net