blob: 2a6ef34f268548e809c69f3a1f6d76a7dafe0bbf [file] [log] [blame]
[email protected]8b37a092012-10-18 21:53:491// 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/test_tools/quic_test_utils.h"
[email protected]9c0b1352012-11-04 00:03:276
rch16c74d1d2016-04-22 06:14:077#include <memory>
8
[email protected]a5b98172014-06-18 07:01:599#include "base/sha1.h"
[email protected]701bc892013-01-17 04:51:5410#include "base/stl_util.h"
[email protected]b12764d2013-12-02 22:28:3011#include "base/strings/string_number_conversions.h"
rchd4db7c152016-07-29 21:58:1212#include "net/quic/core/crypto/crypto_framer.h"
13#include "net/quic/core/crypto/crypto_handshake.h"
14#include "net/quic/core/crypto/crypto_utils.h"
15#include "net/quic/core/crypto/null_encrypter.h"
16#include "net/quic/core/crypto/quic_decrypter.h"
17#include "net/quic/core/crypto/quic_encrypter.h"
18#include "net/quic/core/quic_data_writer.h"
19#include "net/quic/core/quic_framer.h"
20#include "net/quic/core/quic_packet_creator.h"
21#include "net/quic/core/quic_utils.h"
rtennetid39bd762015-06-12 01:05:5222#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]cbd731e2013-10-24 00:20:3923#include "net/quic/test_tools/quic_connection_peer.h"
[email protected]c244c5a12013-05-07 20:55:0424#include "net/spdy/spdy_frame_builder.h"
rchc99f380c2015-03-26 19:50:5625#include "net/tools/quic/quic_per_connection_packet_writer.h"
[email protected]8b37a092012-10-18 21:53:4926
[email protected]c244c5a12013-05-07 20:55:0427using base::StringPiece;
[email protected]8b37a092012-10-18 21:53:4928using std::max;
29using std::min;
30using std::string;
rchc0815442015-04-18 13:29:4631using testing::Invoke;
[email protected]bc356fe2014-06-19 11:14:1432using testing::_;
[email protected]8b37a092012-10-18 21:53:4933
34namespace net {
martijncc5402d2016-02-16 19:08:5835
[email protected]8b37a092012-10-18 21:53:4936namespace test {
37
rtennetia004d332015-08-28 06:44:5738QuicAckFrame MakeAckFrame(QuicPacketNumber largest_observed) {
[email protected]fb35b0a2014-04-15 21:06:4939 QuicAckFrame ack;
[email protected]310d37b2014-08-02 06:15:3740 ack.largest_observed = largest_observed;
41 ack.entropy_hash = 0;
[email protected]fb35b0a2014-04-15 21:06:4942 return ack;
43}
44
rtennetia004d332015-08-28 06:44:5745QuicAckFrame MakeAckFrameWithNackRanges(size_t num_nack_ranges,
46 QuicPacketNumber least_unacked) {
[email protected]310d37b2014-08-02 06:15:3747 QuicAckFrame ack = MakeAckFrame(2 * num_nack_ranges + least_unacked);
[email protected]aa7e4ef2014-05-28 03:53:1548 // Add enough missing packets to get num_nack_ranges nack ranges.
rtennetia004d332015-08-28 06:44:5749 for (QuicPacketNumber i = 1; i < 2 * num_nack_ranges; i += 2) {
alyssar2adf3ac2016-05-03 17:12:5850 ack.packets.Add(least_unacked + i);
51 }
52 return ack;
53}
54
55QuicAckFrame MakeAckFrameWithAckBlocks(size_t num_ack_blocks,
56 QuicPacketNumber least_unacked) {
57 QuicAckFrame ack = MakeAckFrame(2 * num_ack_blocks + least_unacked);
58 ack.missing = false;
59 // Add enough received packets to get num_ack_blocks ack blocks.
60 for (QuicPacketNumber i = 2; i < 2 * num_ack_blocks + 1; i += 2) {
61 ack.packets.Add(least_unacked + i);
[email protected]aa7e4ef2014-05-28 03:53:1562 }
63 return ack;
64}
65
rtennetib6ac61a52015-02-11 20:20:5266QuicPacket* BuildUnsizedDataPacket(QuicFramer* framer,
67 const QuicPacketHeader& header,
68 const QuicFrames& frames) {
[email protected]9cda5fd2014-06-03 10:20:2869 const size_t max_plaintext_size = framer->GetMaxPlaintextSize(kMaxPacketSize);
alyssarc2f70a52016-05-04 13:15:4970 size_t packet_size = GetPacketHeaderSize(framer->version(), header);
[email protected]9cda5fd2014-06-03 10:20:2871 for (size_t i = 0; i < frames.size(); ++i) {
72 DCHECK_LE(packet_size, max_plaintext_size);
73 bool first_frame = i == 0;
74 bool last_frame = i == frames.size() - 1;
75 const size_t frame_size = framer->GetSerializedFrameLength(
76 frames[i], max_plaintext_size - packet_size, first_frame, last_frame,
rjshaded069aaee2016-03-11 20:42:1777 header.public_header.packet_number_length);
[email protected]9cda5fd2014-06-03 10:20:2878 DCHECK(frame_size);
79 packet_size += frame_size;
80 }
rtenneti16a20772015-02-17 18:58:4881 return BuildUnsizedDataPacket(framer, header, frames, packet_size);
82}
83
84QuicPacket* BuildUnsizedDataPacket(QuicFramer* framer,
85 const QuicPacketHeader& header,
86 const QuicFrames& frames,
87 size_t packet_size) {
88 char* buffer = new char[packet_size];
alyssarc39b80f2015-10-22 17:13:5889 size_t length = framer->BuildDataPacket(header, frames, buffer, packet_size);
90 DCHECK_NE(0u, length);
91 // Re-construct the data packet with data ownership.
92 return new QuicPacket(buffer, length, /* owns_buffer */ true,
rtenneti16a20772015-02-17 18:58:4893 header.public_header.connection_id_length,
94 header.public_header.version_flag,
rchcaec4242016-01-22 20:49:5295 header.public_header.multipath_flag,
rch012834cf2016-04-26 02:06:3796 header.public_header.nonce != nullptr,
rtennetia004d332015-08-28 06:44:5797 header.public_header.packet_number_length);
[email protected]9cda5fd2014-06-03 10:20:2898}
99
rchb1c56982016-09-03 00:06:01100QuicFlagSaver::QuicFlagSaver() {
alyssara72f5352016-10-20 12:45:16101#define QUIC_FLAG(type, flag, value) \
102 CHECK_EQ(value, flag) << "Flag set to an expected value. A prior test is " \
103 "likely setting a flag " \
104 << "without using a QuicFlagSaver";
rchb1c56982016-09-03 00:06:01105#include "net/quic/core/quic_flags_list.h"
106#undef QUIC_FLAG
107}
108
109QuicFlagSaver::~QuicFlagSaver() {
110#define QUIC_FLAG(type, flag, value) flag = value;
111#include "net/quic/core/quic_flags_list.h"
112#undef QUIC_FLAG
113}
114
Avi Drissman13fc8932015-12-20 04:40:46115uint64_t SimpleRandom::RandUint64() {
[email protected]a5b98172014-06-18 07:01:59116 unsigned char hash[base::kSHA1Length];
117 base::SHA1HashBytes(reinterpret_cast<unsigned char*>(&seed_), sizeof(seed_),
118 hash);
119 memcpy(&seed_, hash, sizeof(seed_));
120 return seed_;
121}
122
ianswett6c7b7ed2016-09-13 19:35:27123void SimpleRandom::RandBytes(void* data, size_t len) {
124 uint8_t* real_data = static_cast<uint8_t*>(data);
125 for (size_t offset = 0; offset < len; offset++) {
126 real_data[offset] = RandUint64() & 0xff;
127 }
128}
129
130void SimpleRandom::Reseed(const void* additional_entropy, size_t len) {
131 const uint8_t* real_entropy = static_cast<const uint8_t*>(additional_entropy);
132 for (size_t offset = 0; offset < len; offset++) {
133 // Note: this is not actually a well-established way to incorporate new
134 // entropy, but good enough for tests.
135 seed_ *= real_entropy[len];
136 }
137}
138
[email protected]8b37a092012-10-18 21:53:49139MockFramerVisitor::MockFramerVisitor() {
140 // By default, we want to accept packets.
[email protected]14e8106c2013-03-14 16:25:33141 ON_CALL(*this, OnProtocolVersionMismatch(_))
142 .WillByDefault(testing::Return(false));
143
144 // By default, we want to accept packets.
[email protected]ec86d5462013-11-17 16:04:49145 ON_CALL(*this, OnUnauthenticatedHeader(_))
146 .WillByDefault(testing::Return(true));
147
[email protected]066d8182014-01-04 02:02:45148 ON_CALL(*this, OnUnauthenticatedPublicHeader(_))
149 .WillByDefault(testing::Return(true));
150
rjshaded5ced072015-12-18 19:26:02151 ON_CALL(*this, OnPacketHeader(_)).WillByDefault(testing::Return(true));
[email protected]a57e0272013-04-26 07:31:47152
rjshaded5ced072015-12-18 19:26:02153 ON_CALL(*this, OnStreamFrame(_)).WillByDefault(testing::Return(true));
[email protected]a57e0272013-04-26 07:31:47154
rjshaded5ced072015-12-18 19:26:02155 ON_CALL(*this, OnAckFrame(_)).WillByDefault(testing::Return(true));
[email protected]a57e0272013-04-26 07:31:47156
rjshaded5ced072015-12-18 19:26:02157 ON_CALL(*this, OnStopWaitingFrame(_)).WillByDefault(testing::Return(true));
[email protected]93dd91f2014-02-27 00:09:03158
rjshadef88b3c72016-04-26 15:25:33159 ON_CALL(*this, OnPaddingFrame(_)).WillByDefault(testing::Return(true));
160
rjshaded5ced072015-12-18 19:26:02161 ON_CALL(*this, OnPingFrame(_)).WillByDefault(testing::Return(true));
[email protected]d8c522112014-04-23 09:23:25162
rjshaded5ced072015-12-18 19:26:02163 ON_CALL(*this, OnRstStreamFrame(_)).WillByDefault(testing::Return(true));
[email protected]a57e0272013-04-26 07:31:47164
165 ON_CALL(*this, OnConnectionCloseFrame(_))
166 .WillByDefault(testing::Return(true));
167
rjshaded5ced072015-12-18 19:26:02168 ON_CALL(*this, OnGoAwayFrame(_)).WillByDefault(testing::Return(true));
[email protected]8b37a092012-10-18 21:53:49169}
170
rtenneti021e8822015-10-18 23:59:57171MockFramerVisitor::~MockFramerVisitor() {}
[email protected]8b37a092012-10-18 21:53:49172
[email protected]48878092013-07-26 14:51:56173bool NoOpFramerVisitor::OnProtocolVersionMismatch(QuicVersion version) {
[email protected]14e8106c2013-03-14 16:25:33174 return false;
175}
176
[email protected]066d8182014-01-04 02:02:45177bool NoOpFramerVisitor::OnUnauthenticatedPublicHeader(
178 const QuicPacketPublicHeader& header) {
179 return true;
180}
181
[email protected]ec86d5462013-11-17 16:04:49182bool NoOpFramerVisitor::OnUnauthenticatedHeader(
183 const QuicPacketHeader& header) {
184 return true;
185}
186
[email protected]8b37a092012-10-18 21:53:49187bool NoOpFramerVisitor::OnPacketHeader(const QuicPacketHeader& header) {
188 return true;
189}
190
[email protected]a57e0272013-04-26 07:31:47191bool NoOpFramerVisitor::OnStreamFrame(const QuicStreamFrame& frame) {
192 return true;
193}
194
195bool NoOpFramerVisitor::OnAckFrame(const QuicAckFrame& frame) {
196 return true;
197}
198
rjshaded5ced072015-12-18 19:26:02199bool NoOpFramerVisitor::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) {
[email protected]93dd91f2014-02-27 00:09:03200 return true;
201}
202
rjshadef88b3c72016-04-26 15:25:33203bool NoOpFramerVisitor::OnPaddingFrame(const QuicPaddingFrame& frame) {
204 return true;
205}
206
[email protected]d8c522112014-04-23 09:23:25207bool NoOpFramerVisitor::OnPingFrame(const QuicPingFrame& frame) {
208 return true;
209}
210
rjshaded5ced072015-12-18 19:26:02211bool NoOpFramerVisitor::OnRstStreamFrame(const QuicRstStreamFrame& frame) {
[email protected]a57e0272013-04-26 07:31:47212 return true;
213}
214
215bool NoOpFramerVisitor::OnConnectionCloseFrame(
216 const QuicConnectionCloseFrame& frame) {
217 return true;
218}
219
220bool NoOpFramerVisitor::OnGoAwayFrame(const QuicGoAwayFrame& frame) {
221 return true;
222}
223
[email protected]cb23a922014-02-20 17:42:38224bool NoOpFramerVisitor::OnWindowUpdateFrame(
225 const QuicWindowUpdateFrame& frame) {
226 return true;
227}
228
229bool NoOpFramerVisitor::OnBlockedFrame(const QuicBlockedFrame& frame) {
230 return true;
231}
232
rchcaec4242016-01-22 20:49:52233bool NoOpFramerVisitor::OnPathCloseFrame(const QuicPathCloseFrame& frame) {
234 return true;
235}
236
ckrasica7fd1242016-05-14 20:36:01237MockQuicConnectionVisitor::MockQuicConnectionVisitor() {}
[email protected]8d659e22013-01-19 04:26:10238
ckrasica7fd1242016-05-14 20:36:01239MockQuicConnectionVisitor::~MockQuicConnectionVisitor() {}
[email protected]8d659e22013-01-19 04:26:10240
ckrasica7fd1242016-05-14 20:36:01241MockQuicConnectionHelper::MockQuicConnectionHelper() {}
[email protected]9c0b1352012-11-04 00:03:27242
ckrasica7fd1242016-05-14 20:36:01243MockQuicConnectionHelper::~MockQuicConnectionHelper() {}
[email protected]9c0b1352012-11-04 00:03:27244
ckrasica7fd1242016-05-14 20:36:01245const QuicClock* MockQuicConnectionHelper::GetClock() const {
[email protected]9c0b1352012-11-04 00:03:27246 return &clock_;
247}
248
ckrasica7fd1242016-05-14 20:36:01249QuicRandom* MockQuicConnectionHelper::GetRandomGenerator() {
[email protected]9558c5d32012-12-22 00:08:14250 return &random_generator_;
251}
252
rch16c74d1d2016-04-22 06:14:07253QuicAlarm* MockAlarmFactory::CreateAlarm(QuicAlarm::Delegate* delegate) {
254 return new MockAlarmFactory::TestAlarm(
jdorfman4ea54a22016-01-21 22:12:50255 QuicArenaScopedPtr<QuicAlarm::Delegate>(delegate));
256}
257
rch16c74d1d2016-04-22 06:14:07258QuicArenaScopedPtr<QuicAlarm> MockAlarmFactory::CreateAlarm(
jdorfman4ea54a22016-01-21 22:12:50259 QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
260 QuicConnectionArena* arena) {
261 if (arena != nullptr) {
rch16c74d1d2016-04-22 06:14:07262 return arena->New<MockAlarmFactory::TestAlarm>(std::move(delegate));
jdorfman4ea54a22016-01-21 22:12:50263 } else {
rch16c74d1d2016-04-22 06:14:07264 return QuicArenaScopedPtr<MockAlarmFactory::TestAlarm>(
jdorfman4ea54a22016-01-21 22:12:50265 new TestAlarm(std::move(delegate)));
266 }
[email protected]965dbe62013-08-09 21:34:31267}
268
ckrasica7fd1242016-05-14 20:36:01269QuicBufferAllocator* MockQuicConnectionHelper::GetBufferAllocator() {
jdorfman5a606722016-01-04 17:41:29270 return &buffer_allocator_;
271}
272
ckrasica7fd1242016-05-14 20:36:01273void MockQuicConnectionHelper::AdvanceTime(QuicTime::Delta delta) {
[email protected]fe053f92013-04-23 20:18:55274 clock_.AdvanceTime(delta);
275}
276
ckrasica7fd1242016-05-14 20:36:01277MockQuicConnection::MockQuicConnection(MockQuicConnectionHelper* helper,
278 MockAlarmFactory* alarm_factory,
279 Perspective perspective)
280 : MockQuicConnection(kTestConnectionId,
281 IPEndPoint(TestPeerIPAddress(), kTestPort),
282 helper,
283 alarm_factory,
284 perspective,
danzh3134c2562016-08-12 14:07:52285 AllSupportedVersions()) {}
[email protected]c05a6d222013-12-16 19:42:03286
ckrasica7fd1242016-05-14 20:36:01287MockQuicConnection::MockQuicConnection(IPEndPoint address,
288 MockQuicConnectionHelper* helper,
289 MockAlarmFactory* alarm_factory,
290 Perspective perspective)
291 : MockQuicConnection(kTestConnectionId,
292 address,
293 helper,
294 alarm_factory,
295 perspective,
danzh3134c2562016-08-12 14:07:52296 AllSupportedVersions()) {}
[email protected]044ac2b2012-11-13 21:41:06297
ckrasica7fd1242016-05-14 20:36:01298MockQuicConnection::MockQuicConnection(QuicConnectionId connection_id,
299 MockQuicConnectionHelper* helper,
300 MockAlarmFactory* alarm_factory,
301 Perspective perspective)
302 : MockQuicConnection(connection_id,
303 IPEndPoint(TestPeerIPAddress(), kTestPort),
304 helper,
305 alarm_factory,
306 perspective,
danzh3134c2562016-08-12 14:07:52307 CurrentSupportedVersions()) {}
rchc0815442015-04-18 13:29:46308
ckrasica7fd1242016-05-14 20:36:01309MockQuicConnection::MockQuicConnection(
310 MockQuicConnectionHelper* helper,
311 MockAlarmFactory* alarm_factory,
312 Perspective perspective,
313 const QuicVersionVector& supported_versions)
314 : MockQuicConnection(kTestConnectionId,
315 IPEndPoint(TestPeerIPAddress(), kTestPort),
316 helper,
317 alarm_factory,
318 perspective,
319 supported_versions) {}
rchc0815442015-04-18 13:29:46320
ckrasica7fd1242016-05-14 20:36:01321MockQuicConnection::MockQuicConnection(
322 QuicConnectionId connection_id,
323 IPEndPoint address,
324 MockQuicConnectionHelper* helper,
325 MockAlarmFactory* alarm_factory,
326 Perspective perspective,
327 const QuicVersionVector& supported_versions)
rchc0815442015-04-18 13:29:46328 : QuicConnection(connection_id,
329 address,
rtenneti8a4a0732015-10-18 00:45:51330 helper,
rch16c74d1d2016-04-22 06:14:07331 alarm_factory,
jdorfman90d185f32016-01-15 13:22:47332 new testing::NiceMock<MockPacketWriter>(),
rtennetifb3fa6c2015-03-16 23:04:55333 /* owns_writer= */ true,
334 perspective,
rtenneti8a4a0732015-10-18 00:45:51335 supported_versions) {
rchc0815442015-04-18 13:29:46336 ON_CALL(*this, OnError(_))
337 .WillByDefault(
338 Invoke(this, &PacketSavingConnection::QuicConnection_OnError));
[email protected]4d640792013-12-18 22:21:08339}
340
ckrasica7fd1242016-05-14 20:36:01341MockQuicConnection::~MockQuicConnection() {}
[email protected]044ac2b2012-11-13 21:41:06342
ckrasica7fd1242016-05-14 20:36:01343void MockQuicConnection::AdvanceTime(QuicTime::Delta delta) {
344 static_cast<MockQuicConnectionHelper*>(helper())->AdvanceTime(delta);
[email protected]fe053f92013-04-23 20:18:55345}
346
ckrasica7fd1242016-05-14 20:36:01347PacketSavingConnection::PacketSavingConnection(MockQuicConnectionHelper* helper,
rch16c74d1d2016-04-22 06:14:07348 MockAlarmFactory* alarm_factory,
rtenneti8a4a0732015-10-18 00:45:51349 Perspective perspective)
ckrasica7fd1242016-05-14 20:36:01350 : MockQuicConnection(helper, alarm_factory, perspective) {}
[email protected]044ac2b2012-11-13 21:41:06351
[email protected]4d640792013-12-18 22:21:08352PacketSavingConnection::PacketSavingConnection(
ckrasica7fd1242016-05-14 20:36:01353 MockQuicConnectionHelper* helper,
rch16c74d1d2016-04-22 06:14:07354 MockAlarmFactory* alarm_factory,
rtenneti6f48aa92015-03-16 02:18:48355 Perspective perspective,
[email protected]4d640792013-12-18 22:21:08356 const QuicVersionVector& supported_versions)
ckrasica7fd1242016-05-14 20:36:01357 : MockQuicConnection(helper,
358 alarm_factory,
359 perspective,
360 supported_versions) {}
[email protected]4d640792013-12-18 22:21:08361
[email protected]044ac2b2012-11-13 21:41:06362PacketSavingConnection::~PacketSavingConnection() {
skyostilb8f60ca2016-08-12 12:34:43363 base::STLDeleteElements(&encrypted_packets_);
[email protected]044ac2b2012-11-13 21:41:06364}
365
zhongyi4a9d27b2016-01-12 20:08:31366void PacketSavingConnection::SendOrQueuePacket(SerializedPacket* packet) {
rtenneti2cae2072016-02-05 02:21:33367 encrypted_packets_.push_back(new QuicEncryptedPacket(
368 QuicUtils::CopyBuffer(*packet), packet->encrypted_length, true));
rtenneti31e9fd62014-09-16 05:22:15369 // Transfer ownership of the packet to the SentPacketManager and the
370 // ack notifier to the AckNotifierManager.
fayang70dfb8762016-05-27 16:25:11371 sent_packet_manager_->OnPacketSent(packet, kInvalidPathId, 0,
372 QuicTime::Zero(), NOT_RETRANSMISSION,
373 HAS_RETRANSMITTABLE_DATA);
[email protected]044ac2b2012-11-13 21:41:06374}
375
jri4ee9d762016-04-29 02:04:35376MockQuicSession::MockQuicSession(QuicConnection* connection)
377 : QuicSession(connection, DefaultQuicConfig()) {
378 crypto_stream_.reset(new QuicCryptoStream(this));
379 Initialize();
danzh1401f0a2016-05-19 13:41:10380 ON_CALL(*this, WritevData(_, _, _, _, _, _))
jri4ee9d762016-04-29 02:04:35381 .WillByDefault(testing::Return(QuicConsumedData(0, false)));
382}
383
danzh3134c2562016-08-12 14:07:52384MockQuicSession::~MockQuicSession() {
385 delete connection();
386}
jri4ee9d762016-04-29 02:04:35387
388// static
389QuicConsumedData MockQuicSession::ConsumeAllData(
danzh1401f0a2016-05-19 13:41:10390 ReliableQuicStream* /*stream*/,
jri4ee9d762016-04-29 02:04:35391 QuicStreamId /*id*/,
392 const QuicIOVector& data,
393 QuicStreamOffset /*offset*/,
394 bool fin,
395 QuicAckListenerInterface* /*ack_notifier_delegate*/) {
396 return QuicConsumedData(data.total_length, fin);
397}
398
rtennetib865eb82015-06-17 20:21:46399MockQuicSpdySession::MockQuicSpdySession(QuicConnection* connection)
400 : QuicSpdySession(connection, DefaultQuicConfig()) {
rtennetid39bd762015-06-12 01:05:52401 crypto_stream_.reset(new QuicCryptoStream(this));
402 Initialize();
danzh1401f0a2016-05-19 13:41:10403 ON_CALL(*this, WritevData(_, _, _, _, _, _))
[email protected]cff7b7b2013-01-11 08:49:07404 .WillByDefault(testing::Return(QuicConsumedData(0, false)));
[email protected]044ac2b2012-11-13 21:41:06405}
406
danzh3134c2562016-08-12 14:07:52407MockQuicSpdySession::~MockQuicSpdySession() {
408 delete connection();
409}
[email protected]044ac2b2012-11-13 21:41:06410
rtennetib865eb82015-06-17 20:21:46411TestQuicSpdyServerSession::TestQuicSpdyServerSession(
rtennetid39bd762015-06-12 01:05:52412 QuicConnection* connection,
413 const QuicConfig& config,
rjshaded069aaee2016-03-11 20:42:17414 const QuicCryptoServerConfig* crypto_config,
415 QuicCompressedCertsCache* compressed_certs_cache)
416 : QuicServerSessionBase(config,
417 connection,
418 &visitor_,
mpwb5c8da92016-06-05 20:07:31419 &helper_,
rjshaded069aaee2016-03-11 20:42:17420 crypto_config,
421 compressed_certs_cache) {
rtennetid39bd762015-06-12 01:05:52422 Initialize();
mpwb5c8da92016-06-05 20:07:31423 ON_CALL(helper_, GenerateConnectionIdForReject(_))
424 .WillByDefault(
425 testing::Return(connection->random_generator()->RandUint64()));
ianswett7b88c0a2016-06-10 22:29:58426 ON_CALL(helper_, CanAcceptClientHello(_, _, _))
427 .WillByDefault(testing::Return(true));
[email protected]ccb34212014-07-18 09:27:50428}
[email protected]2532de12013-05-09 12:29:33429
danzh3134c2562016-08-12 14:07:52430TestQuicSpdyServerSession::~TestQuicSpdyServerSession() {
431 delete connection();
432}
[email protected]2532de12013-05-09 12:29:33433
jokulikc971baf92016-01-06 00:36:39434QuicCryptoServerStreamBase*
435TestQuicSpdyServerSession::CreateQuicCryptoServerStream(
rjshaded069aaee2016-03-11 20:42:17436 const QuicCryptoServerConfig* crypto_config,
437 QuicCompressedCertsCache* compressed_certs_cache) {
438 return new QuicCryptoServerStream(crypto_config, compressed_certs_cache,
439 FLAGS_enable_quic_stateless_reject_support,
ianswett6c7b7ed2016-09-13 19:35:27440 this, &helper_);
jokulikc971baf92016-01-06 00:36:39441}
442
rtennetib865eb82015-06-17 20:21:46443QuicCryptoServerStream* TestQuicSpdyServerSession::GetCryptoStream() {
zhongyib8677022015-12-01 05:51:30444 return static_cast<QuicCryptoServerStream*>(
jokulikc971baf92016-01-06 00:36:39445 QuicServerSessionBase::GetCryptoStream());
[email protected]2532de12013-05-09 12:29:33446}
447
rtennetib865eb82015-06-17 20:21:46448TestQuicSpdyClientSession::TestQuicSpdyClientSession(
449 QuicConnection* connection,
450 const QuicConfig& config,
451 const QuicServerId& server_id,
452 QuicCryptoClientConfig* crypto_config)
ckrasic244375a32016-02-04 21:21:22453 : QuicClientSessionBase(connection, &push_promise_index_, config) {
rtennetid39bd762015-06-12 01:05:52454 crypto_stream_.reset(new QuicCryptoClientStream(
455 server_id, this, CryptoTestUtils::ProofVerifyContextForTesting(),
rtenneti2cae2072016-02-05 02:21:33456 crypto_config, this));
rtennetid39bd762015-06-12 01:05:52457 Initialize();
[email protected]90f62f092014-03-24 02:41:23458}
459
rtenneti021e8822015-10-18 23:59:57460TestQuicSpdyClientSession::~TestQuicSpdyClientSession() {}
[email protected]90f62f092014-03-24 02:41:23461
ckrasic244375a32016-02-04 21:21:22462bool TestQuicSpdyClientSession::IsAuthorized(const string& authority) {
463 return true;
464}
465
rtennetib865eb82015-06-17 20:21:46466QuicCryptoClientStream* TestQuicSpdyClientSession::GetCryptoStream() {
rtennetid39bd762015-06-12 01:05:52467 return crypto_stream_.get();
rtennetia2ea9162015-05-15 19:26:44468}
469
[email protected]cbd731e2013-10-24 00:20:39470MockPacketWriter::MockPacketWriter() {
rtenneti493d90ef2015-09-14 04:43:11471 ON_CALL(*this, GetMaxPacketSize(_))
472 .WillByDefault(testing::Return(kMaxPacketSize));
[email protected]cbd731e2013-10-24 00:20:39473}
474
rtenneti021e8822015-10-18 23:59:57475MockPacketWriter::~MockPacketWriter() {}
[email protected]cbd731e2013-10-24 00:20:39476
rtenneti021e8822015-10-18 23:59:57477MockSendAlgorithm::MockSendAlgorithm() {}
[email protected]8d659e22013-01-19 04:26:10478
rtenneti021e8822015-10-18 23:59:57479MockSendAlgorithm::~MockSendAlgorithm() {}
[email protected]8d659e22013-01-19 04:26:10480
rtenneti021e8822015-10-18 23:59:57481MockLossAlgorithm::MockLossAlgorithm() {}
[email protected]3aa9ca72014-02-27 19:39:43482
rtenneti021e8822015-10-18 23:59:57483MockLossAlgorithm::~MockLossAlgorithm() {}
[email protected]3aa9ca72014-02-27 19:39:43484
ckrasicea295fe2015-10-31 05:03:27485MockAckListener::MockAckListener() {}
[email protected]97cf3022013-09-05 14:30:16486
ckrasicea295fe2015-10-31 05:03:27487MockAckListener::~MockAckListener() {}
[email protected]97cf3022013-09-05 14:30:16488
rtenneti021e8822015-10-18 23:59:57489MockNetworkChangeVisitor::MockNetworkChangeVisitor() {}
[email protected]a692ad9d2014-07-18 21:35:24490
rtenneti021e8822015-10-18 23:59:57491MockNetworkChangeVisitor::~MockNetworkChangeVisitor() {}
[email protected]a692ad9d2014-07-18 21:35:24492
[email protected]8b37a092012-10-18 21:53:49493namespace {
494
rjshaded5ced072015-12-18 19:26:02495string HexDumpWithMarks(const char* data,
496 int length,
497 const bool* marks,
498 int mark_length) {
[email protected]8b37a092012-10-18 21:53:49499 static const char kHexChars[] = "0123456789abcdef";
500 static const int kColumns = 4;
501
502 const int kSizeLimit = 1024;
503 if (length > kSizeLimit || mark_length > kSizeLimit) {
504 LOG(ERROR) << "Only dumping first " << kSizeLimit << " bytes.";
505 length = min(length, kSizeLimit);
506 mark_length = min(mark_length, kSizeLimit);
507 }
508
509 string hex;
rjshaded5ced072015-12-18 19:26:02510 for (const char *row = data; length > 0;
[email protected]8b37a092012-10-18 21:53:49511 row += kColumns, length -= kColumns) {
rjshaded5ced072015-12-18 19:26:02512 for (const char* p = row; p < row + 4; ++p) {
[email protected]8b37a092012-10-18 21:53:49513 if (p < row + length) {
514 const bool mark =
515 (marks && (p - data) < mark_length && marks[p - data]);
516 hex += mark ? '*' : ' ';
517 hex += kHexChars[(*p & 0xf0) >> 4];
518 hex += kHexChars[*p & 0x0f];
519 hex += mark ? '*' : ' ';
520 } else {
521 hex += " ";
522 }
523 }
524 hex = hex + " ";
525
rtenneti6f48aa92015-03-16 02:18:48526 for (const char* p = row; p < row + 4 && p < row + length; ++p) {
[email protected]8b37a092012-10-18 21:53:49527 hex += (*p >= 0x20 && *p <= 0x7f) ? (*p) : '.';
rtenneti6f48aa92015-03-16 02:18:48528 }
[email protected]8b37a092012-10-18 21:53:49529
530 hex = hex + '\n';
531 }
532 return hex;
533}
534
535} // namespace
536
martijncc5402d2016-02-16 19:08:58537IPAddress TestPeerIPAddress() {
rjshaded5ced072015-12-18 19:26:02538 return Loopback4();
539}
[email protected]300ccd52014-01-25 08:00:19540
rjshaded5ced072015-12-18 19:26:02541QuicVersion QuicVersionMax() {
danzh3134c2562016-08-12 14:07:52542 return AllSupportedVersions().front();
rjshaded5ced072015-12-18 19:26:02543}
[email protected]b007e632013-10-28 08:39:25544
rjshaded5ced072015-12-18 19:26:02545QuicVersion QuicVersionMin() {
danzh3134c2562016-08-12 14:07:52546 return AllSupportedVersions().back();
rjshaded5ced072015-12-18 19:26:02547}
[email protected]b007e632013-10-28 08:39:25548
martijncc5402d2016-02-16 19:08:58549IPAddress Loopback4() {
eroman36d84e54432016-03-17 03:23:02550 return IPAddress::IPv4Localhost();
[email protected]c05a6d222013-12-16 19:42:03551}
552
martijncc5402d2016-02-16 19:08:58553IPAddress Loopback6() {
eroman36d84e54432016-03-17 03:23:02554 return IPAddress::IPv6Localhost();
[email protected]730b35d72014-06-05 03:23:22555}
556
martijncc5402d2016-02-16 19:08:58557IPAddress Any4() {
eroman36d84e54432016-03-17 03:23:02558 return IPAddress::IPv4AllZeros();
rtennetie0ee6eb2015-05-01 00:55:09559}
560
[email protected]9bb57c72014-03-31 20:36:04561void GenerateBody(string* body, int length) {
562 body->clear();
563 body->reserve(length);
564 for (int i = 0; i < length; ++i) {
565 body->append(1, static_cast<char>(32 + i % (126 - 32)));
566 }
567}
568
rtennetia004d332015-08-28 06:44:57569QuicEncryptedPacket* ConstructEncryptedPacket(QuicConnectionId connection_id,
570 bool version_flag,
jric533399b2016-01-29 07:36:01571 bool multipath_flag,
rtennetia004d332015-08-28 06:44:57572 bool reset_flag,
jric533399b2016-01-29 07:36:01573 QuicPathId path_id,
rtennetia004d332015-08-28 06:44:57574 QuicPacketNumber packet_number,
575 const string& data) {
jric533399b2016-01-29 07:36:01576 return ConstructEncryptedPacket(connection_id, version_flag, multipath_flag,
577 reset_flag, path_id, packet_number, data,
578 PACKET_8BYTE_CONNECTION_ID,
579 PACKET_6BYTE_PACKET_NUMBER);
rtenneti9e0fb502015-03-08 06:07:16580}
581
582QuicEncryptedPacket* ConstructEncryptedPacket(
583 QuicConnectionId connection_id,
584 bool version_flag,
jric533399b2016-01-29 07:36:01585 bool multipath_flag,
rtenneti9e0fb502015-03-08 06:07:16586 bool reset_flag,
jric533399b2016-01-29 07:36:01587 QuicPathId path_id,
rtennetia004d332015-08-28 06:44:57588 QuicPacketNumber packet_number,
rtenneti9e0fb502015-03-08 06:07:16589 const string& data,
590 QuicConnectionIdLength connection_id_length,
rtennetia004d332015-08-28 06:44:57591 QuicPacketNumberLength packet_number_length) {
jric533399b2016-01-29 07:36:01592 return ConstructEncryptedPacket(
593 connection_id, version_flag, multipath_flag, reset_flag, path_id,
594 packet_number, data, connection_id_length, packet_number_length, nullptr);
rchc0815442015-04-18 13:29:46595}
596
597QuicEncryptedPacket* ConstructEncryptedPacket(
598 QuicConnectionId connection_id,
599 bool version_flag,
jric533399b2016-01-29 07:36:01600 bool multipath_flag,
rchc0815442015-04-18 13:29:46601 bool reset_flag,
jric533399b2016-01-29 07:36:01602 QuicPathId path_id,
rtennetia004d332015-08-28 06:44:57603 QuicPacketNumber packet_number,
rchc0815442015-04-18 13:29:46604 const string& data,
605 QuicConnectionIdLength connection_id_length,
rtennetia004d332015-08-28 06:44:57606 QuicPacketNumberLength packet_number_length,
rchc0815442015-04-18 13:29:46607 QuicVersionVector* versions) {
alyssar2adf3ac2016-05-03 17:12:58608 return ConstructEncryptedPacket(connection_id, version_flag, multipath_flag,
609 reset_flag, path_id, packet_number, data,
610 connection_id_length, packet_number_length,
611 versions, Perspective::IS_CLIENT);
612}
613QuicEncryptedPacket* ConstructEncryptedPacket(
614 QuicConnectionId connection_id,
615 bool version_flag,
616 bool multipath_flag,
617 bool reset_flag,
618 QuicPathId path_id,
619 QuicPacketNumber packet_number,
620 const string& data,
621 QuicConnectionIdLength connection_id_length,
622 QuicPacketNumberLength packet_number_length,
623 QuicVersionVector* versions,
624 Perspective perspective) {
[email protected]ffc34bf2014-03-07 02:42:02625 QuicPacketHeader header;
626 header.public_header.connection_id = connection_id;
rtenneti9e0fb502015-03-08 06:07:16627 header.public_header.connection_id_length = connection_id_length;
[email protected]ffc34bf2014-03-07 02:42:02628 header.public_header.version_flag = version_flag;
jric533399b2016-01-29 07:36:01629 header.public_header.multipath_flag = multipath_flag;
[email protected]ffc34bf2014-03-07 02:42:02630 header.public_header.reset_flag = reset_flag;
rtennetia004d332015-08-28 06:44:57631 header.public_header.packet_number_length = packet_number_length;
jric533399b2016-01-29 07:36:01632 header.path_id = path_id;
rtenneti8dd12b22015-10-21 01:26:38633 header.packet_number = packet_number;
[email protected]ffc34bf2014-03-07 02:42:02634 header.entropy_flag = false;
635 header.entropy_hash = 0;
rtennetia4228ea2015-06-04 02:31:44636 QuicStreamFrame stream_frame(1, false, 0, StringPiece(data));
[email protected]ffc34bf2014-03-07 02:42:02637 QuicFrame frame(&stream_frame);
638 QuicFrames frames;
639 frames.push_back(frame);
danzh3134c2562016-08-12 14:07:52640 QuicFramer framer(
641 versions != nullptr ? *versions : CurrentSupportedVersions(),
642 QuicTime::Zero(), perspective);
rchc0815442015-04-18 13:29:46643
danakjad1777e2016-04-16 00:56:42644 std::unique_ptr<QuicPacket> packet(
rtennetib6ac61a52015-02-11 20:20:52645 BuildUnsizedDataPacket(&framer, header, frames));
rtennetibe635732014-10-02 22:51:42646 EXPECT_TRUE(packet != nullptr);
rch99b644c2015-11-04 05:25:28647 char* buffer = new char[kMaxPacketSize];
648 size_t encrypted_length = framer.EncryptPayload(
jric533399b2016-01-29 07:36:01649 ENCRYPTION_NONE, path_id, packet_number, *packet, buffer, kMaxPacketSize);
rch99b644c2015-11-04 05:25:28650 EXPECT_NE(0u, encrypted_length);
651 return new QuicEncryptedPacket(buffer, encrypted_length, true);
[email protected]ffc34bf2014-03-07 02:42:02652}
653
jokulikf2bd55c52016-03-24 22:35:30654QuicReceivedPacket* ConstructReceivedPacket(
655 const QuicEncryptedPacket& encrypted_packet,
656 QuicTime receipt_time) {
657 char* buffer = new char[encrypted_packet.length()];
658 memcpy(buffer, encrypted_packet.data(), encrypted_packet.length());
659 return new QuicReceivedPacket(buffer, encrypted_packet.length(), receipt_time,
660 true);
661}
662
rchc0815442015-04-18 13:29:46663QuicEncryptedPacket* ConstructMisFramedEncryptedPacket(
664 QuicConnectionId connection_id,
665 bool version_flag,
jric533399b2016-01-29 07:36:01666 bool multipath_flag,
rchc0815442015-04-18 13:29:46667 bool reset_flag,
jric533399b2016-01-29 07:36:01668 QuicPathId path_id,
rtennetia004d332015-08-28 06:44:57669 QuicPacketNumber packet_number,
rchc0815442015-04-18 13:29:46670 const string& data,
671 QuicConnectionIdLength connection_id_length,
rtennetia004d332015-08-28 06:44:57672 QuicPacketNumberLength packet_number_length,
alyssar2adf3ac2016-05-03 17:12:58673 QuicVersionVector* versions,
674 Perspective perspective) {
rchc0815442015-04-18 13:29:46675 QuicPacketHeader header;
676 header.public_header.connection_id = connection_id;
677 header.public_header.connection_id_length = connection_id_length;
678 header.public_header.version_flag = version_flag;
jric533399b2016-01-29 07:36:01679 header.public_header.multipath_flag = multipath_flag;
rchc0815442015-04-18 13:29:46680 header.public_header.reset_flag = reset_flag;
rtennetia004d332015-08-28 06:44:57681 header.public_header.packet_number_length = packet_number_length;
jric533399b2016-01-29 07:36:01682 header.path_id = path_id;
rtenneti8dd12b22015-10-21 01:26:38683 header.packet_number = packet_number;
rchc0815442015-04-18 13:29:46684 header.entropy_flag = false;
685 header.entropy_hash = 0;
rtennetia4228ea2015-06-04 02:31:44686 QuicStreamFrame stream_frame(1, false, 0, StringPiece(data));
rtenneti85816fdf2015-05-25 03:01:10687 QuicFrame frame(&stream_frame);
rchc0815442015-04-18 13:29:46688 QuicFrames frames;
rtenneti85816fdf2015-05-25 03:01:10689 frames.push_back(frame);
danzh3134c2562016-08-12 14:07:52690 QuicFramer framer(versions != nullptr ? *versions : AllSupportedVersions(),
alyssar2adf3ac2016-05-03 17:12:58691 QuicTime::Zero(), perspective);
rtenneti85816fdf2015-05-25 03:01:10692
danakjad1777e2016-04-16 00:56:42693 std::unique_ptr<QuicPacket> packet(
rchc0815442015-04-18 13:29:46694 BuildUnsizedDataPacket(&framer, header, frames));
695 EXPECT_TRUE(packet != nullptr);
rtenneti85816fdf2015-05-25 03:01:10696
alyssarc2f70a52016-05-04 13:15:49697 if (framer.version() <= QUIC_VERSION_33) {
698 // Now set the packet's private flags byte to 0xFF, which is an invalid
699 // value.
700 reinterpret_cast<unsigned char*>(
701 packet->mutable_data())[GetStartOfEncryptedData(
702 framer.version(), connection_id_length, version_flag, multipath_flag,
703 false /* no diversification nonce */, packet_number_length)] = 0xFF;
704 } else {
705 // Now set the frame type to 0x1F, which is an invalid frame type.
706 reinterpret_cast<unsigned char*>(
707 packet->mutable_data())[GetStartOfEncryptedData(
708 framer.version(), connection_id_length, version_flag, multipath_flag,
709 false /* no diversification nonce */, packet_number_length)] = 0x1F;
710 }
rtenneti85816fdf2015-05-25 03:01:10711
rch99b644c2015-11-04 05:25:28712 char* buffer = new char[kMaxPacketSize];
713 size_t encrypted_length = framer.EncryptPayload(
jric533399b2016-01-29 07:36:01714 ENCRYPTION_NONE, path_id, packet_number, *packet, buffer, kMaxPacketSize);
rch99b644c2015-11-04 05:25:28715 EXPECT_NE(0u, encrypted_length);
716 return new QuicEncryptedPacket(buffer, encrypted_length, true);
rchc0815442015-04-18 13:29:46717}
718
rjshaded5ced072015-12-18 19:26:02719void CompareCharArraysWithHexError(const string& description,
720 const char* actual,
721 const int actual_len,
722 const char* expected,
723 const int expected_len) {
[email protected]b007e632013-10-28 08:39:25724 EXPECT_EQ(actual_len, expected_len);
[email protected]8b37a092012-10-18 21:53:49725 const int min_len = min(actual_len, expected_len);
726 const int max_len = max(actual_len, expected_len);
danakjad1777e2016-04-16 00:56:42727 std::unique_ptr<bool[]> marks(new bool[max_len]);
[email protected]8b37a092012-10-18 21:53:49728 bool identical = (actual_len == expected_len);
729 for (int i = 0; i < min_len; ++i) {
730 if (actual[i] != expected[i]) {
731 marks[i] = true;
732 identical = false;
733 } else {
734 marks[i] = false;
735 }
736 }
737 for (int i = min_len; i < max_len; ++i) {
738 marks[i] = true;
739 }
rjshaded5ced072015-12-18 19:26:02740 if (identical)
741 return;
jric533399b2016-01-29 07:36:01742 ADD_FAILURE() << "Description:\n"
743 << description << "\n\nExpected:\n"
rjshaded5ced072015-12-18 19:26:02744 << HexDumpWithMarks(expected, expected_len, marks.get(),
745 max_len)
746 << "\nActual:\n"
747 << HexDumpWithMarks(actual, actual_len, marks.get(), max_len);
[email protected]8b37a092012-10-18 21:53:49748}
749
[email protected]b12764d2013-12-02 22:28:30750bool DecodeHexString(const base::StringPiece& hex, std::string* bytes) {
751 bytes->clear();
752 if (hex.empty())
753 return true;
Avi Drissman13fc8932015-12-20 04:40:46754 std::vector<uint8_t> v;
[email protected]b12764d2013-12-02 22:28:30755 if (!base::HexStringToBytes(hex.as_string(), &v))
756 return false;
757 if (!v.empty())
758 bytes->assign(reinterpret_cast<const char*>(&v[0]), v.size());
759 return true;
760}
761
[email protected]d3d15bf2013-01-30 02:51:54762static QuicPacket* ConstructPacketFromHandshakeMessage(
[email protected]3aa9ca72014-02-27 19:39:43763 QuicConnectionId connection_id,
[email protected]14e8106c2013-03-14 16:25:33764 const CryptoHandshakeMessage& message,
765 bool should_include_version) {
[email protected]8b37a092012-10-18 21:53:49766 CryptoFramer crypto_framer;
danakjad1777e2016-04-16 00:56:42767 std::unique_ptr<QuicData> data(
768 crypto_framer.ConstructHandshakeMessage(message));
danzh3134c2562016-08-12 14:07:52769 QuicFramer quic_framer(AllSupportedVersions(), QuicTime::Zero(),
rtenneti6f48aa92015-03-16 02:18:48770 Perspective::IS_CLIENT);
[email protected]8b37a092012-10-18 21:53:49771
772 QuicPacketHeader header;
[email protected]3aa9ca72014-02-27 19:39:43773 header.public_header.connection_id = connection_id;
[email protected]9db443912013-02-25 05:27:03774 header.public_header.reset_flag = false;
[email protected]14e8106c2013-03-14 16:25:33775 header.public_header.version_flag = should_include_version;
rtenneti8dd12b22015-10-21 01:26:38776 header.packet_number = 1;
[email protected]9db443912013-02-25 05:27:03777 header.entropy_flag = false;
778 header.entropy_hash = 0;
[email protected]8b37a092012-10-18 21:53:49779
[email protected]be24ab22012-10-22 03:01:52780 QuicStreamFrame stream_frame(kCryptoStreamId, false, 0,
rtennetia4228ea2015-06-04 02:31:44781 data->AsStringPiece());
[email protected]8b37a092012-10-18 21:53:49782
[email protected]be24ab22012-10-22 03:01:52783 QuicFrame frame(&stream_frame);
784 QuicFrames frames;
785 frames.push_back(frame);
rtennetib6ac61a52015-02-11 20:20:52786 return BuildUnsizedDataPacket(&quic_framer, header, frames);
[email protected]8b37a092012-10-18 21:53:49787}
788
[email protected]3aa9ca72014-02-27 19:39:43789QuicPacket* ConstructHandshakePacket(QuicConnectionId connection_id,
790 QuicTag tag) {
[email protected]d3d15bf2013-01-30 02:51:54791 CryptoHandshakeMessage message;
[email protected]ccc66e8a2013-03-26 08:26:14792 message.set_tag(tag);
[email protected]3aa9ca72014-02-27 19:39:43793 return ConstructPacketFromHandshakeMessage(connection_id, message, false);
[email protected]d3d15bf2013-01-30 02:51:54794}
795
rtennetia004d332015-08-28 06:44:57796size_t GetPacketLengthForOneStream(QuicVersion version,
797 bool include_version,
rchcaec4242016-01-22 20:49:52798 bool include_path_id,
rch012834cf2016-04-26 02:06:37799 bool include_diversification_nonce,
rtennetia004d332015-08-28 06:44:57800 QuicConnectionIdLength connection_id_length,
801 QuicPacketNumberLength packet_number_length,
rtennetia004d332015-08-28 06:44:57802 size_t* payload_length) {
[email protected]f62262b2013-07-05 20:57:30803 *payload_length = 1;
804 const size_t stream_length =
[email protected]5dafdb62013-11-14 01:24:26805 NullEncrypter().GetCiphertextSize(*payload_length) +
[email protected]b064310782013-05-30 21:12:17806 QuicPacketCreator::StreamFramePacketOverhead(
alyssarc2f70a52016-05-04 13:15:49807 version, PACKET_8BYTE_CONNECTION_ID, include_version, include_path_id,
rch012834cf2016-04-26 02:06:37808 include_diversification_nonce, packet_number_length, 0u);
rtennetic14c8ab2015-06-18 05:47:40809 const size_t ack_length =
810 NullEncrypter().GetCiphertextSize(
alyssar2adf3ac2016-05-03 17:12:58811 QuicFramer::GetMinAckFrameSize(version, PACKET_1BYTE_PACKET_NUMBER)) +
alyssarc2f70a52016-05-04 13:15:49812 GetPacketHeaderSize(version, connection_id_length, include_version,
rch012834cf2016-04-26 02:06:37813 include_path_id, include_diversification_nonce,
814 packet_number_length);
[email protected]f62262b2013-07-05 20:57:30815 if (stream_length < ack_length) {
816 *payload_length = 1 + ack_length - stream_length;
817 }
818
[email protected]5dafdb62013-11-14 01:24:26819 return NullEncrypter().GetCiphertextSize(*payload_length) +
rtennetia004d332015-08-28 06:44:57820 QuicPacketCreator::StreamFramePacketOverhead(
alyssarc2f70a52016-05-04 13:15:49821 version, connection_id_length, include_version, include_path_id,
rch012834cf2016-04-26 02:06:37822 include_diversification_nonce, packet_number_length, 0u);
[email protected]5351cc4b2013-03-03 07:22:41823}
824
[email protected]a5b98172014-06-18 07:01:59825TestEntropyCalculator::TestEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31826
[email protected]a5b98172014-06-18 07:01:59827TestEntropyCalculator::~TestEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31828
[email protected]48878092013-07-26 14:51:56829QuicPacketEntropyHash TestEntropyCalculator::EntropyHash(
rtennetia004d332015-08-28 06:44:57830 QuicPacketNumber packet_number) const {
[email protected]9db443912013-02-25 05:27:03831 return 1u;
832}
833
[email protected]a5b98172014-06-18 07:01:59834MockEntropyCalculator::MockEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31835
[email protected]a5b98172014-06-18 07:01:59836MockEntropyCalculator::~MockEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31837
[email protected]b064310782013-05-30 21:12:17838QuicConfig DefaultQuicConfig() {
839 QuicConfig config;
[email protected]7d561352014-06-20 09:09:21840 config.SetInitialStreamFlowControlWindowToSend(
841 kInitialStreamFlowControlWindowForTest);
842 config.SetInitialSessionFlowControlWindowToSend(
843 kInitialSessionFlowControlWindowForTest);
[email protected]b064310782013-05-30 21:12:17844 return config;
845}
846
rtennetia2ea9162015-05-15 19:26:44847QuicConfig DefaultQuicConfigStatelessRejects() {
848 QuicConfig config = DefaultQuicConfig();
849 QuicTagVector copt;
850 copt.push_back(kSREJ);
851 config.SetConnectionOptionsToSend(copt);
852 return config;
853}
854
[email protected]4d640792013-12-18 22:21:08855QuicVersionVector SupportedVersions(QuicVersion version) {
856 QuicVersionVector versions;
857 versions.push_back(version);
858 return versions;
859}
860
rtenneti021e8822015-10-18 23:59:57861MockQuicConnectionDebugVisitor::MockQuicConnectionDebugVisitor() {}
rtenneti95293802015-03-27 18:59:23862
rtenneti021e8822015-10-18 23:59:57863MockQuicConnectionDebugVisitor::~MockQuicConnectionDebugVisitor() {}
rtenneti95293802015-03-27 18:59:23864
fayanga31a74b2015-12-28 17:27:14865MockReceivedPacketManager::MockReceivedPacketManager(QuicConnectionStats* stats)
866 : QuicReceivedPacketManager(stats) {}
867
868MockReceivedPacketManager::~MockReceivedPacketManager() {}
869
rchdaf5a852016-07-26 19:42:50870MockSentPacketManager::MockSentPacketManager() {}
871
872MockSentPacketManager::~MockSentPacketManager() {}
873
874MockConnectionCloseDelegate::MockConnectionCloseDelegate() {}
875
876MockConnectionCloseDelegate::~MockConnectionCloseDelegate() {}
877
rtennetid39bd762015-06-12 01:05:52878void CreateClientSessionForTest(QuicServerId server_id,
879 bool supports_stateless_rejects,
880 QuicTime::Delta connection_start_time,
zhongyib8677022015-12-01 05:51:30881 QuicVersionVector supported_versions,
ckrasica7fd1242016-05-14 20:36:01882 MockQuicConnectionHelper* helper,
rch16c74d1d2016-04-22 06:14:07883 MockAlarmFactory* alarm_factory,
rtennetid39bd762015-06-12 01:05:52884 QuicCryptoClientConfig* crypto_client_config,
885 PacketSavingConnection** client_connection,
rtennetib865eb82015-06-17 20:21:46886 TestQuicSpdyClientSession** client_session) {
rtennetia2ea9162015-05-15 19:26:44887 CHECK(crypto_client_config);
888 CHECK(client_connection);
889 CHECK(client_session);
rtennetia2ea9162015-05-15 19:26:44890 CHECK(!connection_start_time.IsZero())
891 << "Connections must start at non-zero times, otherwise the "
892 << "strike-register will be unhappy.";
893
894 QuicConfig config = supports_stateless_rejects
895 ? DefaultQuicConfigStatelessRejects()
896 : DefaultQuicConfig();
zhongyib8677022015-12-01 05:51:30897 *client_connection = new PacketSavingConnection(
rch16c74d1d2016-04-22 06:14:07898 helper, alarm_factory, Perspective::IS_CLIENT, supported_versions);
rtennetib865eb82015-06-17 20:21:46899 *client_session = new TestQuicSpdyClientSession(
900 *client_connection, config, server_id, crypto_client_config);
rtennetia2ea9162015-05-15 19:26:44901 (*client_connection)->AdvanceTime(connection_start_time);
902}
903
rjshaded069aaee2016-03-11 20:42:17904void CreateServerSessionForTest(
905 QuicServerId server_id,
906 QuicTime::Delta connection_start_time,
907 QuicVersionVector supported_versions,
ckrasica7fd1242016-05-14 20:36:01908 MockQuicConnectionHelper* helper,
rch16c74d1d2016-04-22 06:14:07909 MockAlarmFactory* alarm_factory,
rjshaded069aaee2016-03-11 20:42:17910 QuicCryptoServerConfig* server_crypto_config,
911 QuicCompressedCertsCache* compressed_certs_cache,
912 PacketSavingConnection** server_connection,
913 TestQuicSpdyServerSession** server_session) {
rtennetia2ea9162015-05-15 19:26:44914 CHECK(server_crypto_config);
915 CHECK(server_connection);
916 CHECK(server_session);
rtennetia2ea9162015-05-15 19:26:44917 CHECK(!connection_start_time.IsZero())
918 << "Connections must start at non-zero times, otherwise the "
919 << "strike-register will be unhappy.";
920
zhongyib8677022015-12-01 05:51:30921 *server_connection = new PacketSavingConnection(
rch16c74d1d2016-04-22 06:14:07922 helper, alarm_factory, Perspective::IS_SERVER, supported_versions);
rtennetib865eb82015-06-17 20:21:46923 *server_session = new TestQuicSpdyServerSession(
rjshaded069aaee2016-03-11 20:42:17924 *server_connection, DefaultQuicConfig(), server_crypto_config,
925 compressed_certs_cache);
rtennetia2ea9162015-05-15 19:26:44926
927 // We advance the clock initially because the default time is zero and the
Avi Drissman13fc8932015-12-20 04:40:46928 // strike register worries that we've just overflowed a uint32_t time.
rtennetia2ea9162015-05-15 19:26:44929 (*server_connection)->AdvanceTime(connection_start_time);
930}
931
ckrasic99850b32015-10-16 21:15:58932QuicStreamId QuicClientDataStreamId(int i) {
933 return kClientDataStreamId1 + 2 * i;
934}
935
[email protected]8b37a092012-10-18 21:53:49936} // namespace test
[email protected]8b37a092012-10-18 21:53:49937} // namespace net