blob: d2506c6e6b748fb6bca9df63579fdf9866cc343f [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
avib3635452016-10-21 18:33:539#include "base/memory/ptr_util.h"
[email protected]a5b98172014-06-18 07:01:5910#include "base/sha1.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
avib3635452016-10-21 18:33:53362PacketSavingConnection::~PacketSavingConnection() {}
[email protected]044ac2b2012-11-13 21:41:06363
zhongyi4a9d27b2016-01-12 20:08:31364void PacketSavingConnection::SendOrQueuePacket(SerializedPacket* packet) {
avib3635452016-10-21 18:33:53365 encrypted_packets_.push_back(base::MakeUnique<QuicEncryptedPacket>(
rtenneti2cae2072016-02-05 02:21:33366 QuicUtils::CopyBuffer(*packet), packet->encrypted_length, true));
rtenneti31e9fd62014-09-16 05:22:15367 // Transfer ownership of the packet to the SentPacketManager and the
368 // ack notifier to the AckNotifierManager.
fayang70dfb8762016-05-27 16:25:11369 sent_packet_manager_->OnPacketSent(packet, kInvalidPathId, 0,
370 QuicTime::Zero(), NOT_RETRANSMISSION,
371 HAS_RETRANSMITTABLE_DATA);
[email protected]044ac2b2012-11-13 21:41:06372}
373
jri4ee9d762016-04-29 02:04:35374MockQuicSession::MockQuicSession(QuicConnection* connection)
375 : QuicSession(connection, DefaultQuicConfig()) {
376 crypto_stream_.reset(new QuicCryptoStream(this));
377 Initialize();
danzh1401f0a2016-05-19 13:41:10378 ON_CALL(*this, WritevData(_, _, _, _, _, _))
jri4ee9d762016-04-29 02:04:35379 .WillByDefault(testing::Return(QuicConsumedData(0, false)));
380}
381
danzh3134c2562016-08-12 14:07:52382MockQuicSession::~MockQuicSession() {
383 delete connection();
384}
jri4ee9d762016-04-29 02:04:35385
386// static
387QuicConsumedData MockQuicSession::ConsumeAllData(
danzh1401f0a2016-05-19 13:41:10388 ReliableQuicStream* /*stream*/,
jri4ee9d762016-04-29 02:04:35389 QuicStreamId /*id*/,
390 const QuicIOVector& data,
391 QuicStreamOffset /*offset*/,
392 bool fin,
393 QuicAckListenerInterface* /*ack_notifier_delegate*/) {
394 return QuicConsumedData(data.total_length, fin);
395}
396
rtennetib865eb82015-06-17 20:21:46397MockQuicSpdySession::MockQuicSpdySession(QuicConnection* connection)
398 : QuicSpdySession(connection, DefaultQuicConfig()) {
rtennetid39bd762015-06-12 01:05:52399 crypto_stream_.reset(new QuicCryptoStream(this));
400 Initialize();
danzh1401f0a2016-05-19 13:41:10401 ON_CALL(*this, WritevData(_, _, _, _, _, _))
[email protected]cff7b7b2013-01-11 08:49:07402 .WillByDefault(testing::Return(QuicConsumedData(0, false)));
[email protected]044ac2b2012-11-13 21:41:06403}
404
danzh3134c2562016-08-12 14:07:52405MockQuicSpdySession::~MockQuicSpdySession() {
406 delete connection();
407}
[email protected]044ac2b2012-11-13 21:41:06408
rtennetib865eb82015-06-17 20:21:46409TestQuicSpdyServerSession::TestQuicSpdyServerSession(
rtennetid39bd762015-06-12 01:05:52410 QuicConnection* connection,
411 const QuicConfig& config,
rjshaded069aaee2016-03-11 20:42:17412 const QuicCryptoServerConfig* crypto_config,
413 QuicCompressedCertsCache* compressed_certs_cache)
414 : QuicServerSessionBase(config,
415 connection,
416 &visitor_,
mpwb5c8da92016-06-05 20:07:31417 &helper_,
rjshaded069aaee2016-03-11 20:42:17418 crypto_config,
419 compressed_certs_cache) {
rtennetid39bd762015-06-12 01:05:52420 Initialize();
mpwb5c8da92016-06-05 20:07:31421 ON_CALL(helper_, GenerateConnectionIdForReject(_))
422 .WillByDefault(
423 testing::Return(connection->random_generator()->RandUint64()));
ianswett7b88c0a2016-06-10 22:29:58424 ON_CALL(helper_, CanAcceptClientHello(_, _, _))
425 .WillByDefault(testing::Return(true));
[email protected]ccb34212014-07-18 09:27:50426}
[email protected]2532de12013-05-09 12:29:33427
danzh3134c2562016-08-12 14:07:52428TestQuicSpdyServerSession::~TestQuicSpdyServerSession() {
429 delete connection();
430}
[email protected]2532de12013-05-09 12:29:33431
jokulikc971baf92016-01-06 00:36:39432QuicCryptoServerStreamBase*
433TestQuicSpdyServerSession::CreateQuicCryptoServerStream(
rjshaded069aaee2016-03-11 20:42:17434 const QuicCryptoServerConfig* crypto_config,
435 QuicCompressedCertsCache* compressed_certs_cache) {
436 return new QuicCryptoServerStream(crypto_config, compressed_certs_cache,
437 FLAGS_enable_quic_stateless_reject_support,
ianswett6c7b7ed2016-09-13 19:35:27438 this, &helper_);
jokulikc971baf92016-01-06 00:36:39439}
440
rtennetib865eb82015-06-17 20:21:46441QuicCryptoServerStream* TestQuicSpdyServerSession::GetCryptoStream() {
zhongyib8677022015-12-01 05:51:30442 return static_cast<QuicCryptoServerStream*>(
jokulikc971baf92016-01-06 00:36:39443 QuicServerSessionBase::GetCryptoStream());
[email protected]2532de12013-05-09 12:29:33444}
445
rtennetib865eb82015-06-17 20:21:46446TestQuicSpdyClientSession::TestQuicSpdyClientSession(
447 QuicConnection* connection,
448 const QuicConfig& config,
449 const QuicServerId& server_id,
450 QuicCryptoClientConfig* crypto_config)
ckrasic244375a32016-02-04 21:21:22451 : QuicClientSessionBase(connection, &push_promise_index_, config) {
rtennetid39bd762015-06-12 01:05:52452 crypto_stream_.reset(new QuicCryptoClientStream(
453 server_id, this, CryptoTestUtils::ProofVerifyContextForTesting(),
rtenneti2cae2072016-02-05 02:21:33454 crypto_config, this));
rtennetid39bd762015-06-12 01:05:52455 Initialize();
[email protected]90f62f092014-03-24 02:41:23456}
457
rtenneti021e8822015-10-18 23:59:57458TestQuicSpdyClientSession::~TestQuicSpdyClientSession() {}
[email protected]90f62f092014-03-24 02:41:23459
ckrasic244375a32016-02-04 21:21:22460bool TestQuicSpdyClientSession::IsAuthorized(const string& authority) {
461 return true;
462}
463
rtennetib865eb82015-06-17 20:21:46464QuicCryptoClientStream* TestQuicSpdyClientSession::GetCryptoStream() {
rtennetid39bd762015-06-12 01:05:52465 return crypto_stream_.get();
rtennetia2ea9162015-05-15 19:26:44466}
467
[email protected]cbd731e2013-10-24 00:20:39468MockPacketWriter::MockPacketWriter() {
rtenneti493d90ef2015-09-14 04:43:11469 ON_CALL(*this, GetMaxPacketSize(_))
470 .WillByDefault(testing::Return(kMaxPacketSize));
[email protected]cbd731e2013-10-24 00:20:39471}
472
rtenneti021e8822015-10-18 23:59:57473MockPacketWriter::~MockPacketWriter() {}
[email protected]cbd731e2013-10-24 00:20:39474
rtenneti021e8822015-10-18 23:59:57475MockSendAlgorithm::MockSendAlgorithm() {}
[email protected]8d659e22013-01-19 04:26:10476
rtenneti021e8822015-10-18 23:59:57477MockSendAlgorithm::~MockSendAlgorithm() {}
[email protected]8d659e22013-01-19 04:26:10478
rtenneti021e8822015-10-18 23:59:57479MockLossAlgorithm::MockLossAlgorithm() {}
[email protected]3aa9ca72014-02-27 19:39:43480
rtenneti021e8822015-10-18 23:59:57481MockLossAlgorithm::~MockLossAlgorithm() {}
[email protected]3aa9ca72014-02-27 19:39:43482
ckrasicea295fe2015-10-31 05:03:27483MockAckListener::MockAckListener() {}
[email protected]97cf3022013-09-05 14:30:16484
ckrasicea295fe2015-10-31 05:03:27485MockAckListener::~MockAckListener() {}
[email protected]97cf3022013-09-05 14:30:16486
rtenneti021e8822015-10-18 23:59:57487MockNetworkChangeVisitor::MockNetworkChangeVisitor() {}
[email protected]a692ad9d2014-07-18 21:35:24488
rtenneti021e8822015-10-18 23:59:57489MockNetworkChangeVisitor::~MockNetworkChangeVisitor() {}
[email protected]a692ad9d2014-07-18 21:35:24490
[email protected]8b37a092012-10-18 21:53:49491namespace {
492
rjshaded5ced072015-12-18 19:26:02493string HexDumpWithMarks(const char* data,
494 int length,
495 const bool* marks,
496 int mark_length) {
[email protected]8b37a092012-10-18 21:53:49497 static const char kHexChars[] = "0123456789abcdef";
498 static const int kColumns = 4;
499
500 const int kSizeLimit = 1024;
501 if (length > kSizeLimit || mark_length > kSizeLimit) {
502 LOG(ERROR) << "Only dumping first " << kSizeLimit << " bytes.";
503 length = min(length, kSizeLimit);
504 mark_length = min(mark_length, kSizeLimit);
505 }
506
507 string hex;
rjshaded5ced072015-12-18 19:26:02508 for (const char *row = data; length > 0;
[email protected]8b37a092012-10-18 21:53:49509 row += kColumns, length -= kColumns) {
rjshaded5ced072015-12-18 19:26:02510 for (const char* p = row; p < row + 4; ++p) {
[email protected]8b37a092012-10-18 21:53:49511 if (p < row + length) {
512 const bool mark =
513 (marks && (p - data) < mark_length && marks[p - data]);
514 hex += mark ? '*' : ' ';
515 hex += kHexChars[(*p & 0xf0) >> 4];
516 hex += kHexChars[*p & 0x0f];
517 hex += mark ? '*' : ' ';
518 } else {
519 hex += " ";
520 }
521 }
522 hex = hex + " ";
523
rtenneti6f48aa92015-03-16 02:18:48524 for (const char* p = row; p < row + 4 && p < row + length; ++p) {
[email protected]8b37a092012-10-18 21:53:49525 hex += (*p >= 0x20 && *p <= 0x7f) ? (*p) : '.';
rtenneti6f48aa92015-03-16 02:18:48526 }
[email protected]8b37a092012-10-18 21:53:49527
528 hex = hex + '\n';
529 }
530 return hex;
531}
532
533} // namespace
534
martijncc5402d2016-02-16 19:08:58535IPAddress TestPeerIPAddress() {
rjshaded5ced072015-12-18 19:26:02536 return Loopback4();
537}
[email protected]300ccd52014-01-25 08:00:19538
rjshaded5ced072015-12-18 19:26:02539QuicVersion QuicVersionMax() {
danzh3134c2562016-08-12 14:07:52540 return AllSupportedVersions().front();
rjshaded5ced072015-12-18 19:26:02541}
[email protected]b007e632013-10-28 08:39:25542
rjshaded5ced072015-12-18 19:26:02543QuicVersion QuicVersionMin() {
danzh3134c2562016-08-12 14:07:52544 return AllSupportedVersions().back();
rjshaded5ced072015-12-18 19:26:02545}
[email protected]b007e632013-10-28 08:39:25546
martijncc5402d2016-02-16 19:08:58547IPAddress Loopback4() {
eroman36d84e54432016-03-17 03:23:02548 return IPAddress::IPv4Localhost();
[email protected]c05a6d222013-12-16 19:42:03549}
550
martijncc5402d2016-02-16 19:08:58551IPAddress Loopback6() {
eroman36d84e54432016-03-17 03:23:02552 return IPAddress::IPv6Localhost();
[email protected]730b35d72014-06-05 03:23:22553}
554
martijncc5402d2016-02-16 19:08:58555IPAddress Any4() {
eroman36d84e54432016-03-17 03:23:02556 return IPAddress::IPv4AllZeros();
rtennetie0ee6eb2015-05-01 00:55:09557}
558
[email protected]9bb57c72014-03-31 20:36:04559void GenerateBody(string* body, int length) {
560 body->clear();
561 body->reserve(length);
562 for (int i = 0; i < length; ++i) {
563 body->append(1, static_cast<char>(32 + i % (126 - 32)));
564 }
565}
566
rtennetia004d332015-08-28 06:44:57567QuicEncryptedPacket* ConstructEncryptedPacket(QuicConnectionId connection_id,
568 bool version_flag,
jric533399b2016-01-29 07:36:01569 bool multipath_flag,
rtennetia004d332015-08-28 06:44:57570 bool reset_flag,
jric533399b2016-01-29 07:36:01571 QuicPathId path_id,
rtennetia004d332015-08-28 06:44:57572 QuicPacketNumber packet_number,
573 const string& data) {
jric533399b2016-01-29 07:36:01574 return ConstructEncryptedPacket(connection_id, version_flag, multipath_flag,
575 reset_flag, path_id, packet_number, data,
576 PACKET_8BYTE_CONNECTION_ID,
577 PACKET_6BYTE_PACKET_NUMBER);
rtenneti9e0fb502015-03-08 06:07:16578}
579
580QuicEncryptedPacket* ConstructEncryptedPacket(
581 QuicConnectionId connection_id,
582 bool version_flag,
jric533399b2016-01-29 07:36:01583 bool multipath_flag,
rtenneti9e0fb502015-03-08 06:07:16584 bool reset_flag,
jric533399b2016-01-29 07:36:01585 QuicPathId path_id,
rtennetia004d332015-08-28 06:44:57586 QuicPacketNumber packet_number,
rtenneti9e0fb502015-03-08 06:07:16587 const string& data,
588 QuicConnectionIdLength connection_id_length,
rtennetia004d332015-08-28 06:44:57589 QuicPacketNumberLength packet_number_length) {
jric533399b2016-01-29 07:36:01590 return ConstructEncryptedPacket(
591 connection_id, version_flag, multipath_flag, reset_flag, path_id,
592 packet_number, data, connection_id_length, packet_number_length, nullptr);
rchc0815442015-04-18 13:29:46593}
594
595QuicEncryptedPacket* ConstructEncryptedPacket(
596 QuicConnectionId connection_id,
597 bool version_flag,
jric533399b2016-01-29 07:36:01598 bool multipath_flag,
rchc0815442015-04-18 13:29:46599 bool reset_flag,
jric533399b2016-01-29 07:36:01600 QuicPathId path_id,
rtennetia004d332015-08-28 06:44:57601 QuicPacketNumber packet_number,
rchc0815442015-04-18 13:29:46602 const string& data,
603 QuicConnectionIdLength connection_id_length,
rtennetia004d332015-08-28 06:44:57604 QuicPacketNumberLength packet_number_length,
rchc0815442015-04-18 13:29:46605 QuicVersionVector* versions) {
alyssar2adf3ac2016-05-03 17:12:58606 return ConstructEncryptedPacket(connection_id, version_flag, multipath_flag,
607 reset_flag, path_id, packet_number, data,
608 connection_id_length, packet_number_length,
609 versions, Perspective::IS_CLIENT);
610}
611QuicEncryptedPacket* ConstructEncryptedPacket(
612 QuicConnectionId connection_id,
613 bool version_flag,
614 bool multipath_flag,
615 bool reset_flag,
616 QuicPathId path_id,
617 QuicPacketNumber packet_number,
618 const string& data,
619 QuicConnectionIdLength connection_id_length,
620 QuicPacketNumberLength packet_number_length,
621 QuicVersionVector* versions,
622 Perspective perspective) {
[email protected]ffc34bf2014-03-07 02:42:02623 QuicPacketHeader header;
624 header.public_header.connection_id = connection_id;
rtenneti9e0fb502015-03-08 06:07:16625 header.public_header.connection_id_length = connection_id_length;
[email protected]ffc34bf2014-03-07 02:42:02626 header.public_header.version_flag = version_flag;
jric533399b2016-01-29 07:36:01627 header.public_header.multipath_flag = multipath_flag;
[email protected]ffc34bf2014-03-07 02:42:02628 header.public_header.reset_flag = reset_flag;
rtennetia004d332015-08-28 06:44:57629 header.public_header.packet_number_length = packet_number_length;
jric533399b2016-01-29 07:36:01630 header.path_id = path_id;
rtenneti8dd12b22015-10-21 01:26:38631 header.packet_number = packet_number;
[email protected]ffc34bf2014-03-07 02:42:02632 header.entropy_flag = false;
633 header.entropy_hash = 0;
rtennetia4228ea2015-06-04 02:31:44634 QuicStreamFrame stream_frame(1, false, 0, StringPiece(data));
[email protected]ffc34bf2014-03-07 02:42:02635 QuicFrame frame(&stream_frame);
636 QuicFrames frames;
637 frames.push_back(frame);
danzh3134c2562016-08-12 14:07:52638 QuicFramer framer(
639 versions != nullptr ? *versions : CurrentSupportedVersions(),
640 QuicTime::Zero(), perspective);
rchc0815442015-04-18 13:29:46641
danakjad1777e2016-04-16 00:56:42642 std::unique_ptr<QuicPacket> packet(
rtennetib6ac61a52015-02-11 20:20:52643 BuildUnsizedDataPacket(&framer, header, frames));
rtennetibe635732014-10-02 22:51:42644 EXPECT_TRUE(packet != nullptr);
rch99b644c2015-11-04 05:25:28645 char* buffer = new char[kMaxPacketSize];
646 size_t encrypted_length = framer.EncryptPayload(
jric533399b2016-01-29 07:36:01647 ENCRYPTION_NONE, path_id, packet_number, *packet, buffer, kMaxPacketSize);
rch99b644c2015-11-04 05:25:28648 EXPECT_NE(0u, encrypted_length);
649 return new QuicEncryptedPacket(buffer, encrypted_length, true);
[email protected]ffc34bf2014-03-07 02:42:02650}
651
jokulikf2bd55c52016-03-24 22:35:30652QuicReceivedPacket* ConstructReceivedPacket(
653 const QuicEncryptedPacket& encrypted_packet,
654 QuicTime receipt_time) {
655 char* buffer = new char[encrypted_packet.length()];
656 memcpy(buffer, encrypted_packet.data(), encrypted_packet.length());
657 return new QuicReceivedPacket(buffer, encrypted_packet.length(), receipt_time,
658 true);
659}
660
rchc0815442015-04-18 13:29:46661QuicEncryptedPacket* ConstructMisFramedEncryptedPacket(
662 QuicConnectionId connection_id,
663 bool version_flag,
jric533399b2016-01-29 07:36:01664 bool multipath_flag,
rchc0815442015-04-18 13:29:46665 bool reset_flag,
jric533399b2016-01-29 07:36:01666 QuicPathId path_id,
rtennetia004d332015-08-28 06:44:57667 QuicPacketNumber packet_number,
rchc0815442015-04-18 13:29:46668 const string& data,
669 QuicConnectionIdLength connection_id_length,
rtennetia004d332015-08-28 06:44:57670 QuicPacketNumberLength packet_number_length,
alyssar2adf3ac2016-05-03 17:12:58671 QuicVersionVector* versions,
672 Perspective perspective) {
rchc0815442015-04-18 13:29:46673 QuicPacketHeader header;
674 header.public_header.connection_id = connection_id;
675 header.public_header.connection_id_length = connection_id_length;
676 header.public_header.version_flag = version_flag;
jric533399b2016-01-29 07:36:01677 header.public_header.multipath_flag = multipath_flag;
rchc0815442015-04-18 13:29:46678 header.public_header.reset_flag = reset_flag;
rtennetia004d332015-08-28 06:44:57679 header.public_header.packet_number_length = packet_number_length;
jric533399b2016-01-29 07:36:01680 header.path_id = path_id;
rtenneti8dd12b22015-10-21 01:26:38681 header.packet_number = packet_number;
rchc0815442015-04-18 13:29:46682 header.entropy_flag = false;
683 header.entropy_hash = 0;
rtennetia4228ea2015-06-04 02:31:44684 QuicStreamFrame stream_frame(1, false, 0, StringPiece(data));
rtenneti85816fdf2015-05-25 03:01:10685 QuicFrame frame(&stream_frame);
rchc0815442015-04-18 13:29:46686 QuicFrames frames;
rtenneti85816fdf2015-05-25 03:01:10687 frames.push_back(frame);
danzh3134c2562016-08-12 14:07:52688 QuicFramer framer(versions != nullptr ? *versions : AllSupportedVersions(),
alyssar2adf3ac2016-05-03 17:12:58689 QuicTime::Zero(), perspective);
rtenneti85816fdf2015-05-25 03:01:10690
danakjad1777e2016-04-16 00:56:42691 std::unique_ptr<QuicPacket> packet(
rchc0815442015-04-18 13:29:46692 BuildUnsizedDataPacket(&framer, header, frames));
693 EXPECT_TRUE(packet != nullptr);
rtenneti85816fdf2015-05-25 03:01:10694
alyssarc2f70a52016-05-04 13:15:49695 if (framer.version() <= QUIC_VERSION_33) {
696 // Now set the packet's private flags byte to 0xFF, which is an invalid
697 // value.
698 reinterpret_cast<unsigned char*>(
699 packet->mutable_data())[GetStartOfEncryptedData(
700 framer.version(), connection_id_length, version_flag, multipath_flag,
701 false /* no diversification nonce */, packet_number_length)] = 0xFF;
702 } else {
703 // Now set the frame type to 0x1F, which is an invalid frame type.
704 reinterpret_cast<unsigned char*>(
705 packet->mutable_data())[GetStartOfEncryptedData(
706 framer.version(), connection_id_length, version_flag, multipath_flag,
707 false /* no diversification nonce */, packet_number_length)] = 0x1F;
708 }
rtenneti85816fdf2015-05-25 03:01:10709
rch99b644c2015-11-04 05:25:28710 char* buffer = new char[kMaxPacketSize];
711 size_t encrypted_length = framer.EncryptPayload(
jric533399b2016-01-29 07:36:01712 ENCRYPTION_NONE, path_id, packet_number, *packet, buffer, kMaxPacketSize);
rch99b644c2015-11-04 05:25:28713 EXPECT_NE(0u, encrypted_length);
714 return new QuicEncryptedPacket(buffer, encrypted_length, true);
rchc0815442015-04-18 13:29:46715}
716
rjshaded5ced072015-12-18 19:26:02717void CompareCharArraysWithHexError(const string& description,
718 const char* actual,
719 const int actual_len,
720 const char* expected,
721 const int expected_len) {
[email protected]b007e632013-10-28 08:39:25722 EXPECT_EQ(actual_len, expected_len);
[email protected]8b37a092012-10-18 21:53:49723 const int min_len = min(actual_len, expected_len);
724 const int max_len = max(actual_len, expected_len);
danakjad1777e2016-04-16 00:56:42725 std::unique_ptr<bool[]> marks(new bool[max_len]);
[email protected]8b37a092012-10-18 21:53:49726 bool identical = (actual_len == expected_len);
727 for (int i = 0; i < min_len; ++i) {
728 if (actual[i] != expected[i]) {
729 marks[i] = true;
730 identical = false;
731 } else {
732 marks[i] = false;
733 }
734 }
735 for (int i = min_len; i < max_len; ++i) {
736 marks[i] = true;
737 }
rjshaded5ced072015-12-18 19:26:02738 if (identical)
739 return;
jric533399b2016-01-29 07:36:01740 ADD_FAILURE() << "Description:\n"
741 << description << "\n\nExpected:\n"
rjshaded5ced072015-12-18 19:26:02742 << HexDumpWithMarks(expected, expected_len, marks.get(),
743 max_len)
744 << "\nActual:\n"
745 << HexDumpWithMarks(actual, actual_len, marks.get(), max_len);
[email protected]8b37a092012-10-18 21:53:49746}
747
[email protected]b12764d2013-12-02 22:28:30748bool DecodeHexString(const base::StringPiece& hex, std::string* bytes) {
749 bytes->clear();
750 if (hex.empty())
751 return true;
Avi Drissman13fc8932015-12-20 04:40:46752 std::vector<uint8_t> v;
[email protected]b12764d2013-12-02 22:28:30753 if (!base::HexStringToBytes(hex.as_string(), &v))
754 return false;
755 if (!v.empty())
756 bytes->assign(reinterpret_cast<const char*>(&v[0]), v.size());
757 return true;
758}
759
[email protected]d3d15bf2013-01-30 02:51:54760static QuicPacket* ConstructPacketFromHandshakeMessage(
[email protected]3aa9ca72014-02-27 19:39:43761 QuicConnectionId connection_id,
[email protected]14e8106c2013-03-14 16:25:33762 const CryptoHandshakeMessage& message,
763 bool should_include_version) {
[email protected]8b37a092012-10-18 21:53:49764 CryptoFramer crypto_framer;
danakjad1777e2016-04-16 00:56:42765 std::unique_ptr<QuicData> data(
766 crypto_framer.ConstructHandshakeMessage(message));
danzh3134c2562016-08-12 14:07:52767 QuicFramer quic_framer(AllSupportedVersions(), QuicTime::Zero(),
rtenneti6f48aa92015-03-16 02:18:48768 Perspective::IS_CLIENT);
[email protected]8b37a092012-10-18 21:53:49769
770 QuicPacketHeader header;
[email protected]3aa9ca72014-02-27 19:39:43771 header.public_header.connection_id = connection_id;
[email protected]9db443912013-02-25 05:27:03772 header.public_header.reset_flag = false;
[email protected]14e8106c2013-03-14 16:25:33773 header.public_header.version_flag = should_include_version;
rtenneti8dd12b22015-10-21 01:26:38774 header.packet_number = 1;
[email protected]9db443912013-02-25 05:27:03775 header.entropy_flag = false;
776 header.entropy_hash = 0;
[email protected]8b37a092012-10-18 21:53:49777
[email protected]be24ab22012-10-22 03:01:52778 QuicStreamFrame stream_frame(kCryptoStreamId, false, 0,
rtennetia4228ea2015-06-04 02:31:44779 data->AsStringPiece());
[email protected]8b37a092012-10-18 21:53:49780
[email protected]be24ab22012-10-22 03:01:52781 QuicFrame frame(&stream_frame);
782 QuicFrames frames;
783 frames.push_back(frame);
rtennetib6ac61a52015-02-11 20:20:52784 return BuildUnsizedDataPacket(&quic_framer, header, frames);
[email protected]8b37a092012-10-18 21:53:49785}
786
[email protected]3aa9ca72014-02-27 19:39:43787QuicPacket* ConstructHandshakePacket(QuicConnectionId connection_id,
788 QuicTag tag) {
[email protected]d3d15bf2013-01-30 02:51:54789 CryptoHandshakeMessage message;
[email protected]ccc66e8a2013-03-26 08:26:14790 message.set_tag(tag);
[email protected]3aa9ca72014-02-27 19:39:43791 return ConstructPacketFromHandshakeMessage(connection_id, message, false);
[email protected]d3d15bf2013-01-30 02:51:54792}
793
rtennetia004d332015-08-28 06:44:57794size_t GetPacketLengthForOneStream(QuicVersion version,
795 bool include_version,
rchcaec4242016-01-22 20:49:52796 bool include_path_id,
rch012834cf2016-04-26 02:06:37797 bool include_diversification_nonce,
rtennetia004d332015-08-28 06:44:57798 QuicConnectionIdLength connection_id_length,
799 QuicPacketNumberLength packet_number_length,
rtennetia004d332015-08-28 06:44:57800 size_t* payload_length) {
[email protected]f62262b2013-07-05 20:57:30801 *payload_length = 1;
802 const size_t stream_length =
[email protected]5dafdb62013-11-14 01:24:26803 NullEncrypter().GetCiphertextSize(*payload_length) +
[email protected]b064310782013-05-30 21:12:17804 QuicPacketCreator::StreamFramePacketOverhead(
alyssarc2f70a52016-05-04 13:15:49805 version, PACKET_8BYTE_CONNECTION_ID, include_version, include_path_id,
rch012834cf2016-04-26 02:06:37806 include_diversification_nonce, packet_number_length, 0u);
rtennetic14c8ab2015-06-18 05:47:40807 const size_t ack_length =
808 NullEncrypter().GetCiphertextSize(
alyssar2adf3ac2016-05-03 17:12:58809 QuicFramer::GetMinAckFrameSize(version, PACKET_1BYTE_PACKET_NUMBER)) +
alyssarc2f70a52016-05-04 13:15:49810 GetPacketHeaderSize(version, connection_id_length, include_version,
rch012834cf2016-04-26 02:06:37811 include_path_id, include_diversification_nonce,
812 packet_number_length);
[email protected]f62262b2013-07-05 20:57:30813 if (stream_length < ack_length) {
814 *payload_length = 1 + ack_length - stream_length;
815 }
816
[email protected]5dafdb62013-11-14 01:24:26817 return NullEncrypter().GetCiphertextSize(*payload_length) +
rtennetia004d332015-08-28 06:44:57818 QuicPacketCreator::StreamFramePacketOverhead(
alyssarc2f70a52016-05-04 13:15:49819 version, connection_id_length, include_version, include_path_id,
rch012834cf2016-04-26 02:06:37820 include_diversification_nonce, packet_number_length, 0u);
[email protected]5351cc4b2013-03-03 07:22:41821}
822
[email protected]a5b98172014-06-18 07:01:59823TestEntropyCalculator::TestEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31824
[email protected]a5b98172014-06-18 07:01:59825TestEntropyCalculator::~TestEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31826
[email protected]48878092013-07-26 14:51:56827QuicPacketEntropyHash TestEntropyCalculator::EntropyHash(
rtennetia004d332015-08-28 06:44:57828 QuicPacketNumber packet_number) const {
[email protected]9db443912013-02-25 05:27:03829 return 1u;
830}
831
[email protected]a5b98172014-06-18 07:01:59832MockEntropyCalculator::MockEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31833
[email protected]a5b98172014-06-18 07:01:59834MockEntropyCalculator::~MockEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31835
[email protected]b064310782013-05-30 21:12:17836QuicConfig DefaultQuicConfig() {
837 QuicConfig config;
[email protected]7d561352014-06-20 09:09:21838 config.SetInitialStreamFlowControlWindowToSend(
839 kInitialStreamFlowControlWindowForTest);
840 config.SetInitialSessionFlowControlWindowToSend(
841 kInitialSessionFlowControlWindowForTest);
[email protected]b064310782013-05-30 21:12:17842 return config;
843}
844
rtennetia2ea9162015-05-15 19:26:44845QuicConfig DefaultQuicConfigStatelessRejects() {
846 QuicConfig config = DefaultQuicConfig();
847 QuicTagVector copt;
848 copt.push_back(kSREJ);
849 config.SetConnectionOptionsToSend(copt);
850 return config;
851}
852
[email protected]4d640792013-12-18 22:21:08853QuicVersionVector SupportedVersions(QuicVersion version) {
854 QuicVersionVector versions;
855 versions.push_back(version);
856 return versions;
857}
858
rtenneti021e8822015-10-18 23:59:57859MockQuicConnectionDebugVisitor::MockQuicConnectionDebugVisitor() {}
rtenneti95293802015-03-27 18:59:23860
rtenneti021e8822015-10-18 23:59:57861MockQuicConnectionDebugVisitor::~MockQuicConnectionDebugVisitor() {}
rtenneti95293802015-03-27 18:59:23862
fayanga31a74b2015-12-28 17:27:14863MockReceivedPacketManager::MockReceivedPacketManager(QuicConnectionStats* stats)
864 : QuicReceivedPacketManager(stats) {}
865
866MockReceivedPacketManager::~MockReceivedPacketManager() {}
867
rchdaf5a852016-07-26 19:42:50868MockSentPacketManager::MockSentPacketManager() {}
869
870MockSentPacketManager::~MockSentPacketManager() {}
871
872MockConnectionCloseDelegate::MockConnectionCloseDelegate() {}
873
874MockConnectionCloseDelegate::~MockConnectionCloseDelegate() {}
875
rtennetid39bd762015-06-12 01:05:52876void CreateClientSessionForTest(QuicServerId server_id,
877 bool supports_stateless_rejects,
878 QuicTime::Delta connection_start_time,
zhongyib8677022015-12-01 05:51:30879 QuicVersionVector supported_versions,
ckrasica7fd1242016-05-14 20:36:01880 MockQuicConnectionHelper* helper,
rch16c74d1d2016-04-22 06:14:07881 MockAlarmFactory* alarm_factory,
rtennetid39bd762015-06-12 01:05:52882 QuicCryptoClientConfig* crypto_client_config,
883 PacketSavingConnection** client_connection,
rtennetib865eb82015-06-17 20:21:46884 TestQuicSpdyClientSession** client_session) {
rtennetia2ea9162015-05-15 19:26:44885 CHECK(crypto_client_config);
886 CHECK(client_connection);
887 CHECK(client_session);
rtennetia2ea9162015-05-15 19:26:44888 CHECK(!connection_start_time.IsZero())
889 << "Connections must start at non-zero times, otherwise the "
890 << "strike-register will be unhappy.";
891
892 QuicConfig config = supports_stateless_rejects
893 ? DefaultQuicConfigStatelessRejects()
894 : DefaultQuicConfig();
zhongyib8677022015-12-01 05:51:30895 *client_connection = new PacketSavingConnection(
rch16c74d1d2016-04-22 06:14:07896 helper, alarm_factory, Perspective::IS_CLIENT, supported_versions);
rtennetib865eb82015-06-17 20:21:46897 *client_session = new TestQuicSpdyClientSession(
898 *client_connection, config, server_id, crypto_client_config);
rtennetia2ea9162015-05-15 19:26:44899 (*client_connection)->AdvanceTime(connection_start_time);
900}
901
rjshaded069aaee2016-03-11 20:42:17902void CreateServerSessionForTest(
903 QuicServerId server_id,
904 QuicTime::Delta connection_start_time,
905 QuicVersionVector supported_versions,
ckrasica7fd1242016-05-14 20:36:01906 MockQuicConnectionHelper* helper,
rch16c74d1d2016-04-22 06:14:07907 MockAlarmFactory* alarm_factory,
rjshaded069aaee2016-03-11 20:42:17908 QuicCryptoServerConfig* server_crypto_config,
909 QuicCompressedCertsCache* compressed_certs_cache,
910 PacketSavingConnection** server_connection,
911 TestQuicSpdyServerSession** server_session) {
rtennetia2ea9162015-05-15 19:26:44912 CHECK(server_crypto_config);
913 CHECK(server_connection);
914 CHECK(server_session);
rtennetia2ea9162015-05-15 19:26:44915 CHECK(!connection_start_time.IsZero())
916 << "Connections must start at non-zero times, otherwise the "
917 << "strike-register will be unhappy.";
918
zhongyib8677022015-12-01 05:51:30919 *server_connection = new PacketSavingConnection(
rch16c74d1d2016-04-22 06:14:07920 helper, alarm_factory, Perspective::IS_SERVER, supported_versions);
rtennetib865eb82015-06-17 20:21:46921 *server_session = new TestQuicSpdyServerSession(
rjshaded069aaee2016-03-11 20:42:17922 *server_connection, DefaultQuicConfig(), server_crypto_config,
923 compressed_certs_cache);
rtennetia2ea9162015-05-15 19:26:44924
925 // We advance the clock initially because the default time is zero and the
Avi Drissman13fc8932015-12-20 04:40:46926 // strike register worries that we've just overflowed a uint32_t time.
rtennetia2ea9162015-05-15 19:26:44927 (*server_connection)->AdvanceTime(connection_start_time);
928}
929
ckrasic99850b32015-10-16 21:15:58930QuicStreamId QuicClientDataStreamId(int i) {
931 return kClientDataStreamId1 + 2 * i;
932}
933
[email protected]8b37a092012-10-18 21:53:49934} // namespace test
[email protected]8b37a092012-10-18 21:53:49935} // namespace net