blob: c97fe1f7696460ff1903731350b5dc4eab2801fb [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)
ckrasic32b17dcd2016-10-31 06:15:35375 : QuicSession(connection, nullptr, DefaultQuicConfig()) {
jri4ee9d762016-04-29 02:04:35376 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(
fayangf66f9f12016-11-08 15:25:41388 QuicStream* /*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)
ckrasic32b17dcd2016-10-31 06:15:35398 : QuicSpdySession(connection, nullptr, 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
zhongyi1cbc95b2016-11-12 01:42:49446TestPushPromiseDelegate::TestPushPromiseDelegate(bool match)
447 : match_(match), rendezvous_fired_(false), rendezvous_stream_(nullptr) {}
448
449bool TestPushPromiseDelegate::CheckVary(
450 const SpdyHeaderBlock& client_request,
451 const SpdyHeaderBlock& promise_request,
452 const SpdyHeaderBlock& promise_response) {
453 DVLOG(1) << "match " << match_;
454 return match_;
455}
456
457void TestPushPromiseDelegate::OnRendezvousResult(QuicSpdyStream* stream) {
458 rendezvous_fired_ = true;
459 rendezvous_stream_ = stream;
460}
461
rtennetib865eb82015-06-17 20:21:46462TestQuicSpdyClientSession::TestQuicSpdyClientSession(
463 QuicConnection* connection,
464 const QuicConfig& config,
465 const QuicServerId& server_id,
466 QuicCryptoClientConfig* crypto_config)
ckrasic244375a32016-02-04 21:21:22467 : QuicClientSessionBase(connection, &push_promise_index_, config) {
rtennetid39bd762015-06-12 01:05:52468 crypto_stream_.reset(new QuicCryptoClientStream(
469 server_id, this, CryptoTestUtils::ProofVerifyContextForTesting(),
rtenneti2cae2072016-02-05 02:21:33470 crypto_config, this));
rtennetid39bd762015-06-12 01:05:52471 Initialize();
[email protected]90f62f092014-03-24 02:41:23472}
473
rtenneti021e8822015-10-18 23:59:57474TestQuicSpdyClientSession::~TestQuicSpdyClientSession() {}
[email protected]90f62f092014-03-24 02:41:23475
ckrasic244375a32016-02-04 21:21:22476bool TestQuicSpdyClientSession::IsAuthorized(const string& authority) {
477 return true;
478}
479
rtennetib865eb82015-06-17 20:21:46480QuicCryptoClientStream* TestQuicSpdyClientSession::GetCryptoStream() {
rtennetid39bd762015-06-12 01:05:52481 return crypto_stream_.get();
rtennetia2ea9162015-05-15 19:26:44482}
483
[email protected]cbd731e2013-10-24 00:20:39484MockPacketWriter::MockPacketWriter() {
rtenneti493d90ef2015-09-14 04:43:11485 ON_CALL(*this, GetMaxPacketSize(_))
486 .WillByDefault(testing::Return(kMaxPacketSize));
[email protected]cbd731e2013-10-24 00:20:39487}
488
rtenneti021e8822015-10-18 23:59:57489MockPacketWriter::~MockPacketWriter() {}
[email protected]cbd731e2013-10-24 00:20:39490
rtenneti021e8822015-10-18 23:59:57491MockSendAlgorithm::MockSendAlgorithm() {}
[email protected]8d659e22013-01-19 04:26:10492
rtenneti021e8822015-10-18 23:59:57493MockSendAlgorithm::~MockSendAlgorithm() {}
[email protected]8d659e22013-01-19 04:26:10494
rtenneti021e8822015-10-18 23:59:57495MockLossAlgorithm::MockLossAlgorithm() {}
[email protected]3aa9ca72014-02-27 19:39:43496
rtenneti021e8822015-10-18 23:59:57497MockLossAlgorithm::~MockLossAlgorithm() {}
[email protected]3aa9ca72014-02-27 19:39:43498
ckrasicea295fe2015-10-31 05:03:27499MockAckListener::MockAckListener() {}
[email protected]97cf3022013-09-05 14:30:16500
ckrasicea295fe2015-10-31 05:03:27501MockAckListener::~MockAckListener() {}
[email protected]97cf3022013-09-05 14:30:16502
rtenneti021e8822015-10-18 23:59:57503MockNetworkChangeVisitor::MockNetworkChangeVisitor() {}
[email protected]a692ad9d2014-07-18 21:35:24504
rtenneti021e8822015-10-18 23:59:57505MockNetworkChangeVisitor::~MockNetworkChangeVisitor() {}
[email protected]a692ad9d2014-07-18 21:35:24506
[email protected]8b37a092012-10-18 21:53:49507namespace {
508
rjshaded5ced072015-12-18 19:26:02509string HexDumpWithMarks(const char* data,
510 int length,
511 const bool* marks,
512 int mark_length) {
[email protected]8b37a092012-10-18 21:53:49513 static const char kHexChars[] = "0123456789abcdef";
514 static const int kColumns = 4;
515
516 const int kSizeLimit = 1024;
517 if (length > kSizeLimit || mark_length > kSizeLimit) {
518 LOG(ERROR) << "Only dumping first " << kSizeLimit << " bytes.";
519 length = min(length, kSizeLimit);
520 mark_length = min(mark_length, kSizeLimit);
521 }
522
523 string hex;
rjshaded5ced072015-12-18 19:26:02524 for (const char *row = data; length > 0;
[email protected]8b37a092012-10-18 21:53:49525 row += kColumns, length -= kColumns) {
rjshaded5ced072015-12-18 19:26:02526 for (const char* p = row; p < row + 4; ++p) {
[email protected]8b37a092012-10-18 21:53:49527 if (p < row + length) {
528 const bool mark =
529 (marks && (p - data) < mark_length && marks[p - data]);
530 hex += mark ? '*' : ' ';
531 hex += kHexChars[(*p & 0xf0) >> 4];
532 hex += kHexChars[*p & 0x0f];
533 hex += mark ? '*' : ' ';
534 } else {
535 hex += " ";
536 }
537 }
538 hex = hex + " ";
539
rtenneti6f48aa92015-03-16 02:18:48540 for (const char* p = row; p < row + 4 && p < row + length; ++p) {
[email protected]8b37a092012-10-18 21:53:49541 hex += (*p >= 0x20 && *p <= 0x7f) ? (*p) : '.';
rtenneti6f48aa92015-03-16 02:18:48542 }
[email protected]8b37a092012-10-18 21:53:49543
544 hex = hex + '\n';
545 }
546 return hex;
547}
548
549} // namespace
550
martijncc5402d2016-02-16 19:08:58551IPAddress TestPeerIPAddress() {
rjshaded5ced072015-12-18 19:26:02552 return Loopback4();
553}
[email protected]300ccd52014-01-25 08:00:19554
rjshaded5ced072015-12-18 19:26:02555QuicVersion QuicVersionMax() {
danzh3134c2562016-08-12 14:07:52556 return AllSupportedVersions().front();
rjshaded5ced072015-12-18 19:26:02557}
[email protected]b007e632013-10-28 08:39:25558
rjshaded5ced072015-12-18 19:26:02559QuicVersion QuicVersionMin() {
danzh3134c2562016-08-12 14:07:52560 return AllSupportedVersions().back();
rjshaded5ced072015-12-18 19:26:02561}
[email protected]b007e632013-10-28 08:39:25562
martijncc5402d2016-02-16 19:08:58563IPAddress Loopback4() {
eroman36d84e54432016-03-17 03:23:02564 return IPAddress::IPv4Localhost();
[email protected]c05a6d222013-12-16 19:42:03565}
566
martijncc5402d2016-02-16 19:08:58567IPAddress Loopback6() {
eroman36d84e54432016-03-17 03:23:02568 return IPAddress::IPv6Localhost();
[email protected]730b35d72014-06-05 03:23:22569}
570
martijncc5402d2016-02-16 19:08:58571IPAddress Any4() {
eroman36d84e54432016-03-17 03:23:02572 return IPAddress::IPv4AllZeros();
rtennetie0ee6eb2015-05-01 00:55:09573}
574
[email protected]9bb57c72014-03-31 20:36:04575void GenerateBody(string* body, int length) {
576 body->clear();
577 body->reserve(length);
578 for (int i = 0; i < length; ++i) {
579 body->append(1, static_cast<char>(32 + i % (126 - 32)));
580 }
581}
582
rtennetia004d332015-08-28 06:44:57583QuicEncryptedPacket* ConstructEncryptedPacket(QuicConnectionId connection_id,
584 bool version_flag,
jric533399b2016-01-29 07:36:01585 bool multipath_flag,
rtennetia004d332015-08-28 06:44:57586 bool reset_flag,
jric533399b2016-01-29 07:36:01587 QuicPathId path_id,
rtennetia004d332015-08-28 06:44:57588 QuicPacketNumber packet_number,
589 const string& data) {
jric533399b2016-01-29 07:36:01590 return ConstructEncryptedPacket(connection_id, version_flag, multipath_flag,
591 reset_flag, path_id, packet_number, data,
592 PACKET_8BYTE_CONNECTION_ID,
593 PACKET_6BYTE_PACKET_NUMBER);
rtenneti9e0fb502015-03-08 06:07:16594}
595
596QuicEncryptedPacket* ConstructEncryptedPacket(
597 QuicConnectionId connection_id,
598 bool version_flag,
jric533399b2016-01-29 07:36:01599 bool multipath_flag,
rtenneti9e0fb502015-03-08 06:07:16600 bool reset_flag,
jric533399b2016-01-29 07:36:01601 QuicPathId path_id,
rtennetia004d332015-08-28 06:44:57602 QuicPacketNumber packet_number,
rtenneti9e0fb502015-03-08 06:07:16603 const string& data,
604 QuicConnectionIdLength connection_id_length,
rtennetia004d332015-08-28 06:44:57605 QuicPacketNumberLength packet_number_length) {
jric533399b2016-01-29 07:36:01606 return ConstructEncryptedPacket(
607 connection_id, version_flag, multipath_flag, reset_flag, path_id,
608 packet_number, data, connection_id_length, packet_number_length, nullptr);
rchc0815442015-04-18 13:29:46609}
610
611QuicEncryptedPacket* ConstructEncryptedPacket(
612 QuicConnectionId connection_id,
613 bool version_flag,
jric533399b2016-01-29 07:36:01614 bool multipath_flag,
rchc0815442015-04-18 13:29:46615 bool reset_flag,
jric533399b2016-01-29 07:36:01616 QuicPathId path_id,
rtennetia004d332015-08-28 06:44:57617 QuicPacketNumber packet_number,
rchc0815442015-04-18 13:29:46618 const string& data,
619 QuicConnectionIdLength connection_id_length,
rtennetia004d332015-08-28 06:44:57620 QuicPacketNumberLength packet_number_length,
rchc0815442015-04-18 13:29:46621 QuicVersionVector* versions) {
alyssar2adf3ac2016-05-03 17:12:58622 return ConstructEncryptedPacket(connection_id, version_flag, multipath_flag,
623 reset_flag, path_id, packet_number, data,
624 connection_id_length, packet_number_length,
625 versions, Perspective::IS_CLIENT);
626}
627QuicEncryptedPacket* ConstructEncryptedPacket(
628 QuicConnectionId connection_id,
629 bool version_flag,
630 bool multipath_flag,
631 bool reset_flag,
632 QuicPathId path_id,
633 QuicPacketNumber packet_number,
634 const string& data,
635 QuicConnectionIdLength connection_id_length,
636 QuicPacketNumberLength packet_number_length,
637 QuicVersionVector* versions,
638 Perspective perspective) {
[email protected]ffc34bf2014-03-07 02:42:02639 QuicPacketHeader header;
640 header.public_header.connection_id = connection_id;
rtenneti9e0fb502015-03-08 06:07:16641 header.public_header.connection_id_length = connection_id_length;
[email protected]ffc34bf2014-03-07 02:42:02642 header.public_header.version_flag = version_flag;
jric533399b2016-01-29 07:36:01643 header.public_header.multipath_flag = multipath_flag;
[email protected]ffc34bf2014-03-07 02:42:02644 header.public_header.reset_flag = reset_flag;
rtennetia004d332015-08-28 06:44:57645 header.public_header.packet_number_length = packet_number_length;
jric533399b2016-01-29 07:36:01646 header.path_id = path_id;
rtenneti8dd12b22015-10-21 01:26:38647 header.packet_number = packet_number;
[email protected]ffc34bf2014-03-07 02:42:02648 header.entropy_flag = false;
649 header.entropy_hash = 0;
rtennetia4228ea2015-06-04 02:31:44650 QuicStreamFrame stream_frame(1, false, 0, StringPiece(data));
[email protected]ffc34bf2014-03-07 02:42:02651 QuicFrame frame(&stream_frame);
652 QuicFrames frames;
653 frames.push_back(frame);
danzh3134c2562016-08-12 14:07:52654 QuicFramer framer(
655 versions != nullptr ? *versions : CurrentSupportedVersions(),
656 QuicTime::Zero(), perspective);
rchc0815442015-04-18 13:29:46657
danakjad1777e2016-04-16 00:56:42658 std::unique_ptr<QuicPacket> packet(
rtennetib6ac61a52015-02-11 20:20:52659 BuildUnsizedDataPacket(&framer, header, frames));
rtennetibe635732014-10-02 22:51:42660 EXPECT_TRUE(packet != nullptr);
rch99b644c2015-11-04 05:25:28661 char* buffer = new char[kMaxPacketSize];
662 size_t encrypted_length = framer.EncryptPayload(
jric533399b2016-01-29 07:36:01663 ENCRYPTION_NONE, path_id, packet_number, *packet, buffer, kMaxPacketSize);
rch99b644c2015-11-04 05:25:28664 EXPECT_NE(0u, encrypted_length);
665 return new QuicEncryptedPacket(buffer, encrypted_length, true);
[email protected]ffc34bf2014-03-07 02:42:02666}
667
jokulikf2bd55c52016-03-24 22:35:30668QuicReceivedPacket* ConstructReceivedPacket(
669 const QuicEncryptedPacket& encrypted_packet,
670 QuicTime receipt_time) {
671 char* buffer = new char[encrypted_packet.length()];
672 memcpy(buffer, encrypted_packet.data(), encrypted_packet.length());
673 return new QuicReceivedPacket(buffer, encrypted_packet.length(), receipt_time,
674 true);
675}
676
rchc0815442015-04-18 13:29:46677QuicEncryptedPacket* ConstructMisFramedEncryptedPacket(
678 QuicConnectionId connection_id,
679 bool version_flag,
jric533399b2016-01-29 07:36:01680 bool multipath_flag,
rchc0815442015-04-18 13:29:46681 bool reset_flag,
jric533399b2016-01-29 07:36:01682 QuicPathId path_id,
rtennetia004d332015-08-28 06:44:57683 QuicPacketNumber packet_number,
rchc0815442015-04-18 13:29:46684 const string& data,
685 QuicConnectionIdLength connection_id_length,
rtennetia004d332015-08-28 06:44:57686 QuicPacketNumberLength packet_number_length,
alyssar2adf3ac2016-05-03 17:12:58687 QuicVersionVector* versions,
688 Perspective perspective) {
rchc0815442015-04-18 13:29:46689 QuicPacketHeader header;
690 header.public_header.connection_id = connection_id;
691 header.public_header.connection_id_length = connection_id_length;
692 header.public_header.version_flag = version_flag;
jric533399b2016-01-29 07:36:01693 header.public_header.multipath_flag = multipath_flag;
rchc0815442015-04-18 13:29:46694 header.public_header.reset_flag = reset_flag;
rtennetia004d332015-08-28 06:44:57695 header.public_header.packet_number_length = packet_number_length;
jric533399b2016-01-29 07:36:01696 header.path_id = path_id;
rtenneti8dd12b22015-10-21 01:26:38697 header.packet_number = packet_number;
rchc0815442015-04-18 13:29:46698 header.entropy_flag = false;
699 header.entropy_hash = 0;
rtennetia4228ea2015-06-04 02:31:44700 QuicStreamFrame stream_frame(1, false, 0, StringPiece(data));
rtenneti85816fdf2015-05-25 03:01:10701 QuicFrame frame(&stream_frame);
rchc0815442015-04-18 13:29:46702 QuicFrames frames;
rtenneti85816fdf2015-05-25 03:01:10703 frames.push_back(frame);
danzh3134c2562016-08-12 14:07:52704 QuicFramer framer(versions != nullptr ? *versions : AllSupportedVersions(),
alyssar2adf3ac2016-05-03 17:12:58705 QuicTime::Zero(), perspective);
rtenneti85816fdf2015-05-25 03:01:10706
danakjad1777e2016-04-16 00:56:42707 std::unique_ptr<QuicPacket> packet(
rchc0815442015-04-18 13:29:46708 BuildUnsizedDataPacket(&framer, header, frames));
709 EXPECT_TRUE(packet != nullptr);
rtenneti85816fdf2015-05-25 03:01:10710
alyssarc2f70a52016-05-04 13:15:49711 if (framer.version() <= QUIC_VERSION_33) {
712 // Now set the packet's private flags byte to 0xFF, which is an invalid
713 // value.
714 reinterpret_cast<unsigned char*>(
715 packet->mutable_data())[GetStartOfEncryptedData(
716 framer.version(), connection_id_length, version_flag, multipath_flag,
717 false /* no diversification nonce */, packet_number_length)] = 0xFF;
718 } else {
719 // Now set the frame type to 0x1F, which is an invalid frame type.
720 reinterpret_cast<unsigned char*>(
721 packet->mutable_data())[GetStartOfEncryptedData(
722 framer.version(), connection_id_length, version_flag, multipath_flag,
723 false /* no diversification nonce */, packet_number_length)] = 0x1F;
724 }
rtenneti85816fdf2015-05-25 03:01:10725
rch99b644c2015-11-04 05:25:28726 char* buffer = new char[kMaxPacketSize];
727 size_t encrypted_length = framer.EncryptPayload(
jric533399b2016-01-29 07:36:01728 ENCRYPTION_NONE, path_id, packet_number, *packet, buffer, kMaxPacketSize);
rch99b644c2015-11-04 05:25:28729 EXPECT_NE(0u, encrypted_length);
730 return new QuicEncryptedPacket(buffer, encrypted_length, true);
rchc0815442015-04-18 13:29:46731}
732
rjshaded5ced072015-12-18 19:26:02733void CompareCharArraysWithHexError(const string& description,
734 const char* actual,
735 const int actual_len,
736 const char* expected,
737 const int expected_len) {
[email protected]b007e632013-10-28 08:39:25738 EXPECT_EQ(actual_len, expected_len);
[email protected]8b37a092012-10-18 21:53:49739 const int min_len = min(actual_len, expected_len);
740 const int max_len = max(actual_len, expected_len);
danakjad1777e2016-04-16 00:56:42741 std::unique_ptr<bool[]> marks(new bool[max_len]);
[email protected]8b37a092012-10-18 21:53:49742 bool identical = (actual_len == expected_len);
743 for (int i = 0; i < min_len; ++i) {
744 if (actual[i] != expected[i]) {
745 marks[i] = true;
746 identical = false;
747 } else {
748 marks[i] = false;
749 }
750 }
751 for (int i = min_len; i < max_len; ++i) {
752 marks[i] = true;
753 }
rjshaded5ced072015-12-18 19:26:02754 if (identical)
755 return;
jric533399b2016-01-29 07:36:01756 ADD_FAILURE() << "Description:\n"
757 << description << "\n\nExpected:\n"
rjshaded5ced072015-12-18 19:26:02758 << HexDumpWithMarks(expected, expected_len, marks.get(),
759 max_len)
760 << "\nActual:\n"
761 << HexDumpWithMarks(actual, actual_len, marks.get(), max_len);
[email protected]8b37a092012-10-18 21:53:49762}
763
[email protected]b12764d2013-12-02 22:28:30764bool DecodeHexString(const base::StringPiece& hex, std::string* bytes) {
765 bytes->clear();
766 if (hex.empty())
767 return true;
Avi Drissman13fc8932015-12-20 04:40:46768 std::vector<uint8_t> v;
[email protected]b12764d2013-12-02 22:28:30769 if (!base::HexStringToBytes(hex.as_string(), &v))
770 return false;
771 if (!v.empty())
772 bytes->assign(reinterpret_cast<const char*>(&v[0]), v.size());
773 return true;
774}
775
[email protected]d3d15bf2013-01-30 02:51:54776static QuicPacket* ConstructPacketFromHandshakeMessage(
[email protected]3aa9ca72014-02-27 19:39:43777 QuicConnectionId connection_id,
[email protected]14e8106c2013-03-14 16:25:33778 const CryptoHandshakeMessage& message,
779 bool should_include_version) {
[email protected]8b37a092012-10-18 21:53:49780 CryptoFramer crypto_framer;
danakjad1777e2016-04-16 00:56:42781 std::unique_ptr<QuicData> data(
782 crypto_framer.ConstructHandshakeMessage(message));
danzh3134c2562016-08-12 14:07:52783 QuicFramer quic_framer(AllSupportedVersions(), QuicTime::Zero(),
rtenneti6f48aa92015-03-16 02:18:48784 Perspective::IS_CLIENT);
[email protected]8b37a092012-10-18 21:53:49785
786 QuicPacketHeader header;
[email protected]3aa9ca72014-02-27 19:39:43787 header.public_header.connection_id = connection_id;
[email protected]9db443912013-02-25 05:27:03788 header.public_header.reset_flag = false;
[email protected]14e8106c2013-03-14 16:25:33789 header.public_header.version_flag = should_include_version;
rtenneti8dd12b22015-10-21 01:26:38790 header.packet_number = 1;
[email protected]9db443912013-02-25 05:27:03791 header.entropy_flag = false;
792 header.entropy_hash = 0;
[email protected]8b37a092012-10-18 21:53:49793
[email protected]be24ab22012-10-22 03:01:52794 QuicStreamFrame stream_frame(kCryptoStreamId, false, 0,
rtennetia4228ea2015-06-04 02:31:44795 data->AsStringPiece());
[email protected]8b37a092012-10-18 21:53:49796
[email protected]be24ab22012-10-22 03:01:52797 QuicFrame frame(&stream_frame);
798 QuicFrames frames;
799 frames.push_back(frame);
rtennetib6ac61a52015-02-11 20:20:52800 return BuildUnsizedDataPacket(&quic_framer, header, frames);
[email protected]8b37a092012-10-18 21:53:49801}
802
[email protected]3aa9ca72014-02-27 19:39:43803QuicPacket* ConstructHandshakePacket(QuicConnectionId connection_id,
804 QuicTag tag) {
[email protected]d3d15bf2013-01-30 02:51:54805 CryptoHandshakeMessage message;
[email protected]ccc66e8a2013-03-26 08:26:14806 message.set_tag(tag);
[email protected]3aa9ca72014-02-27 19:39:43807 return ConstructPacketFromHandshakeMessage(connection_id, message, false);
[email protected]d3d15bf2013-01-30 02:51:54808}
809
rtennetia004d332015-08-28 06:44:57810size_t GetPacketLengthForOneStream(QuicVersion version,
811 bool include_version,
rchcaec4242016-01-22 20:49:52812 bool include_path_id,
rch012834cf2016-04-26 02:06:37813 bool include_diversification_nonce,
rtennetia004d332015-08-28 06:44:57814 QuicConnectionIdLength connection_id_length,
815 QuicPacketNumberLength packet_number_length,
rtennetia004d332015-08-28 06:44:57816 size_t* payload_length) {
[email protected]f62262b2013-07-05 20:57:30817 *payload_length = 1;
818 const size_t stream_length =
[email protected]5dafdb62013-11-14 01:24:26819 NullEncrypter().GetCiphertextSize(*payload_length) +
[email protected]b064310782013-05-30 21:12:17820 QuicPacketCreator::StreamFramePacketOverhead(
alyssarc2f70a52016-05-04 13:15:49821 version, PACKET_8BYTE_CONNECTION_ID, include_version, include_path_id,
rch012834cf2016-04-26 02:06:37822 include_diversification_nonce, packet_number_length, 0u);
rtennetic14c8ab2015-06-18 05:47:40823 const size_t ack_length =
824 NullEncrypter().GetCiphertextSize(
alyssar2adf3ac2016-05-03 17:12:58825 QuicFramer::GetMinAckFrameSize(version, PACKET_1BYTE_PACKET_NUMBER)) +
alyssarc2f70a52016-05-04 13:15:49826 GetPacketHeaderSize(version, connection_id_length, include_version,
rch012834cf2016-04-26 02:06:37827 include_path_id, include_diversification_nonce,
828 packet_number_length);
[email protected]f62262b2013-07-05 20:57:30829 if (stream_length < ack_length) {
830 *payload_length = 1 + ack_length - stream_length;
831 }
832
[email protected]5dafdb62013-11-14 01:24:26833 return NullEncrypter().GetCiphertextSize(*payload_length) +
rtennetia004d332015-08-28 06:44:57834 QuicPacketCreator::StreamFramePacketOverhead(
alyssarc2f70a52016-05-04 13:15:49835 version, connection_id_length, include_version, include_path_id,
rch012834cf2016-04-26 02:06:37836 include_diversification_nonce, packet_number_length, 0u);
[email protected]5351cc4b2013-03-03 07:22:41837}
838
[email protected]a5b98172014-06-18 07:01:59839TestEntropyCalculator::TestEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31840
[email protected]a5b98172014-06-18 07:01:59841TestEntropyCalculator::~TestEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31842
[email protected]48878092013-07-26 14:51:56843QuicPacketEntropyHash TestEntropyCalculator::EntropyHash(
rtennetia004d332015-08-28 06:44:57844 QuicPacketNumber packet_number) const {
[email protected]9db443912013-02-25 05:27:03845 return 1u;
846}
847
[email protected]a5b98172014-06-18 07:01:59848MockEntropyCalculator::MockEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31849
[email protected]a5b98172014-06-18 07:01:59850MockEntropyCalculator::~MockEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31851
[email protected]b064310782013-05-30 21:12:17852QuicConfig DefaultQuicConfig() {
853 QuicConfig config;
[email protected]7d561352014-06-20 09:09:21854 config.SetInitialStreamFlowControlWindowToSend(
855 kInitialStreamFlowControlWindowForTest);
856 config.SetInitialSessionFlowControlWindowToSend(
857 kInitialSessionFlowControlWindowForTest);
[email protected]b064310782013-05-30 21:12:17858 return config;
859}
860
rtennetia2ea9162015-05-15 19:26:44861QuicConfig DefaultQuicConfigStatelessRejects() {
862 QuicConfig config = DefaultQuicConfig();
863 QuicTagVector copt;
864 copt.push_back(kSREJ);
865 config.SetConnectionOptionsToSend(copt);
866 return config;
867}
868
[email protected]4d640792013-12-18 22:21:08869QuicVersionVector SupportedVersions(QuicVersion version) {
870 QuicVersionVector versions;
871 versions.push_back(version);
872 return versions;
873}
874
rtenneti021e8822015-10-18 23:59:57875MockQuicConnectionDebugVisitor::MockQuicConnectionDebugVisitor() {}
rtenneti95293802015-03-27 18:59:23876
rtenneti021e8822015-10-18 23:59:57877MockQuicConnectionDebugVisitor::~MockQuicConnectionDebugVisitor() {}
rtenneti95293802015-03-27 18:59:23878
fayanga31a74b2015-12-28 17:27:14879MockReceivedPacketManager::MockReceivedPacketManager(QuicConnectionStats* stats)
880 : QuicReceivedPacketManager(stats) {}
881
882MockReceivedPacketManager::~MockReceivedPacketManager() {}
883
rchdaf5a852016-07-26 19:42:50884MockSentPacketManager::MockSentPacketManager() {}
885
886MockSentPacketManager::~MockSentPacketManager() {}
887
888MockConnectionCloseDelegate::MockConnectionCloseDelegate() {}
889
890MockConnectionCloseDelegate::~MockConnectionCloseDelegate() {}
891
rtennetid39bd762015-06-12 01:05:52892void CreateClientSessionForTest(QuicServerId server_id,
893 bool supports_stateless_rejects,
894 QuicTime::Delta connection_start_time,
zhongyib8677022015-12-01 05:51:30895 QuicVersionVector supported_versions,
ckrasica7fd1242016-05-14 20:36:01896 MockQuicConnectionHelper* helper,
rch16c74d1d2016-04-22 06:14:07897 MockAlarmFactory* alarm_factory,
rtennetid39bd762015-06-12 01:05:52898 QuicCryptoClientConfig* crypto_client_config,
899 PacketSavingConnection** client_connection,
rtennetib865eb82015-06-17 20:21:46900 TestQuicSpdyClientSession** client_session) {
rtennetia2ea9162015-05-15 19:26:44901 CHECK(crypto_client_config);
902 CHECK(client_connection);
903 CHECK(client_session);
rtennetia2ea9162015-05-15 19:26:44904 CHECK(!connection_start_time.IsZero())
905 << "Connections must start at non-zero times, otherwise the "
906 << "strike-register will be unhappy.";
907
908 QuicConfig config = supports_stateless_rejects
909 ? DefaultQuicConfigStatelessRejects()
910 : DefaultQuicConfig();
zhongyib8677022015-12-01 05:51:30911 *client_connection = new PacketSavingConnection(
rch16c74d1d2016-04-22 06:14:07912 helper, alarm_factory, Perspective::IS_CLIENT, supported_versions);
rtennetib865eb82015-06-17 20:21:46913 *client_session = new TestQuicSpdyClientSession(
914 *client_connection, config, server_id, crypto_client_config);
rtennetia2ea9162015-05-15 19:26:44915 (*client_connection)->AdvanceTime(connection_start_time);
916}
917
rjshaded069aaee2016-03-11 20:42:17918void CreateServerSessionForTest(
919 QuicServerId server_id,
920 QuicTime::Delta connection_start_time,
921 QuicVersionVector supported_versions,
ckrasica7fd1242016-05-14 20:36:01922 MockQuicConnectionHelper* helper,
rch16c74d1d2016-04-22 06:14:07923 MockAlarmFactory* alarm_factory,
rjshaded069aaee2016-03-11 20:42:17924 QuicCryptoServerConfig* server_crypto_config,
925 QuicCompressedCertsCache* compressed_certs_cache,
926 PacketSavingConnection** server_connection,
927 TestQuicSpdyServerSession** server_session) {
rtennetia2ea9162015-05-15 19:26:44928 CHECK(server_crypto_config);
929 CHECK(server_connection);
930 CHECK(server_session);
rtennetia2ea9162015-05-15 19:26:44931 CHECK(!connection_start_time.IsZero())
932 << "Connections must start at non-zero times, otherwise the "
933 << "strike-register will be unhappy.";
934
zhongyib8677022015-12-01 05:51:30935 *server_connection = new PacketSavingConnection(
rch16c74d1d2016-04-22 06:14:07936 helper, alarm_factory, Perspective::IS_SERVER, supported_versions);
rtennetib865eb82015-06-17 20:21:46937 *server_session = new TestQuicSpdyServerSession(
rjshaded069aaee2016-03-11 20:42:17938 *server_connection, DefaultQuicConfig(), server_crypto_config,
939 compressed_certs_cache);
rtennetia2ea9162015-05-15 19:26:44940
941 // We advance the clock initially because the default time is zero and the
Avi Drissman13fc8932015-12-20 04:40:46942 // strike register worries that we've just overflowed a uint32_t time.
rtennetia2ea9162015-05-15 19:26:44943 (*server_connection)->AdvanceTime(connection_start_time);
944}
945
ckrasic99850b32015-10-16 21:15:58946QuicStreamId QuicClientDataStreamId(int i) {
947 return kClientDataStreamId1 + 2 * i;
948}
949
[email protected]8b37a092012-10-18 21:53:49950} // namespace test
[email protected]8b37a092012-10-18 21:53:49951} // namespace net