blob: e06f2664cfadf1a469e91a6c2ac5eab7318e754b [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
diannahu466377c2017-03-03 18:53:397#include <algorithm>
rch16c74d1d2016-04-22 06:14:078#include <memory>
9
rchd4db7c152016-07-29 21:58:1210#include "net/quic/core/crypto/crypto_framer.h"
11#include "net/quic/core/crypto/crypto_handshake.h"
12#include "net/quic/core/crypto/crypto_utils.h"
13#include "net/quic/core/crypto/null_encrypter.h"
14#include "net/quic/core/crypto/quic_decrypter.h"
15#include "net/quic/core/crypto/quic_encrypter.h"
16#include "net/quic/core/quic_data_writer.h"
17#include "net/quic/core/quic_framer.h"
18#include "net/quic/core/quic_packet_creator.h"
19#include "net/quic/core/quic_utils.h"
danzh75104982017-04-14 21:58:0920#include "net/quic/platform/api/quic_endian.h"
rchfc6809b62017-04-19 01:37:0121#include "net/quic/platform/api/quic_flags.h"
fayangb25a2cd52017-01-13 18:49:1022#include "net/quic/platform/api/quic_logging.h"
fayang8f534ce2017-01-18 21:35:3623#include "net/quic/platform/api/quic_ptr_util.h"
rtennetid39bd762015-06-12 01:05:5224#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]cbd731e2013-10-24 00:20:3925#include "net/quic/test_tools/quic_connection_peer.h"
bnc8f8f7d302017-04-24 18:08:0626#include "net/spdy/core/spdy_frame_builder.h"
rch3ad2c582016-12-21 18:56:0927#include "third_party/boringssl/src/include/openssl/sha.h"
[email protected]8b37a092012-10-18 21:53:4928
[email protected]8b37a092012-10-18 21:53:4929using std::string;
[email protected]bc356fe2014-06-19 11:14:1430using testing::_;
fayang0f698802017-02-08 14:45:1731using testing::Invoke;
[email protected]8b37a092012-10-18 21:53:4932
33namespace net {
34namespace test {
35
rtennetia004d332015-08-28 06:44:5736QuicAckFrame MakeAckFrame(QuicPacketNumber largest_observed) {
[email protected]fb35b0a2014-04-15 21:06:4937 QuicAckFrame ack;
[email protected]310d37b2014-08-02 06:15:3738 ack.largest_observed = largest_observed;
alyssar2adf3ac2016-05-03 17:12:5839 return ack;
40}
41
42QuicAckFrame MakeAckFrameWithAckBlocks(size_t num_ack_blocks,
43 QuicPacketNumber least_unacked) {
44 QuicAckFrame ack = MakeAckFrame(2 * num_ack_blocks + least_unacked);
alyssar2adf3ac2016-05-03 17:12:5845 // Add enough received packets to get num_ack_blocks ack blocks.
46 for (QuicPacketNumber i = 2; i < 2 * num_ack_blocks + 1; i += 2) {
47 ack.packets.Add(least_unacked + i);
[email protected]aa7e4ef2014-05-28 03:53:1548 }
49 return ack;
50}
51
rtennetib6ac61a52015-02-11 20:20:5252QuicPacket* BuildUnsizedDataPacket(QuicFramer* framer,
53 const QuicPacketHeader& header,
54 const QuicFrames& frames) {
[email protected]9cda5fd2014-06-03 10:20:2855 const size_t max_plaintext_size = framer->GetMaxPlaintextSize(kMaxPacketSize);
alyssarc2f70a52016-05-04 13:15:4956 size_t packet_size = GetPacketHeaderSize(framer->version(), header);
[email protected]9cda5fd2014-06-03 10:20:2857 for (size_t i = 0; i < frames.size(); ++i) {
58 DCHECK_LE(packet_size, max_plaintext_size);
59 bool first_frame = i == 0;
60 bool last_frame = i == frames.size() - 1;
61 const size_t frame_size = framer->GetSerializedFrameLength(
62 frames[i], max_plaintext_size - packet_size, first_frame, last_frame,
rjshaded069aaee2016-03-11 20:42:1763 header.public_header.packet_number_length);
[email protected]9cda5fd2014-06-03 10:20:2864 DCHECK(frame_size);
65 packet_size += frame_size;
66 }
rtenneti16a20772015-02-17 18:58:4867 return BuildUnsizedDataPacket(framer, header, frames, packet_size);
68}
69
70QuicPacket* BuildUnsizedDataPacket(QuicFramer* framer,
71 const QuicPacketHeader& header,
72 const QuicFrames& frames,
73 size_t packet_size) {
74 char* buffer = new char[packet_size];
alyssarc39b80f2015-10-22 17:13:5875 size_t length = framer->BuildDataPacket(header, frames, buffer, packet_size);
76 DCHECK_NE(0u, length);
77 // Re-construct the data packet with data ownership.
78 return new QuicPacket(buffer, length, /* owns_buffer */ true,
rtenneti16a20772015-02-17 18:58:4879 header.public_header.connection_id_length,
80 header.public_header.version_flag,
rch012834cf2016-04-26 02:06:3781 header.public_header.nonce != nullptr,
rtennetia004d332015-08-28 06:44:5782 header.public_header.packet_number_length);
[email protected]9cda5fd2014-06-03 10:20:2883}
84
fayang19c30772017-03-09 15:06:1785string Sha1Hash(QuicStringPiece data) {
rch3ad2c582016-12-21 18:56:0986 char buffer[SHA_DIGEST_LENGTH];
87 SHA1(reinterpret_cast<const uint8_t*>(data.data()), data.size(),
88 reinterpret_cast<uint8_t*>(buffer));
89 return string(buffer, arraysize(buffer));
90}
91
Avi Drissman13fc8932015-12-20 04:40:4692uint64_t SimpleRandom::RandUint64() {
rch3ad2c582016-12-21 18:56:0993 string hash =
fayang19c30772017-03-09 15:06:1794 Sha1Hash(QuicStringPiece(reinterpret_cast<char*>(&seed_), sizeof(seed_)));
rch3ad2c582016-12-21 18:56:0995 DCHECK_EQ(static_cast<size_t>(SHA_DIGEST_LENGTH), hash.length());
96 memcpy(&seed_, hash.data(), sizeof(seed_));
[email protected]a5b98172014-06-18 07:01:5997 return seed_;
98}
99
ianswett6c7b7ed2016-09-13 19:35:27100void SimpleRandom::RandBytes(void* data, size_t len) {
101 uint8_t* real_data = static_cast<uint8_t*>(data);
102 for (size_t offset = 0; offset < len; offset++) {
103 real_data[offset] = RandUint64() & 0xff;
104 }
105}
106
107void SimpleRandom::Reseed(const void* additional_entropy, size_t len) {
108 const uint8_t* real_entropy = static_cast<const uint8_t*>(additional_entropy);
109 for (size_t offset = 0; offset < len; offset++) {
110 // Note: this is not actually a well-established way to incorporate new
111 // entropy, but good enough for tests.
112 seed_ *= real_entropy[len];
113 }
114}
115
danzh75104982017-04-14 21:58:09116QuicConnectionId GetPeerInMemoryConnectionId(QuicConnectionId connection_id) {
117 if (FLAGS_quic_restart_flag_quic_big_endian_connection_id_client ==
118 FLAGS_quic_restart_flag_quic_big_endian_connection_id_server) {
119 // Both endpoints have same endianess.
120 return connection_id;
121 }
122 return net::QuicEndian::NetToHost64(connection_id);
123}
124
[email protected]8b37a092012-10-18 21:53:49125MockFramerVisitor::MockFramerVisitor() {
126 // By default, we want to accept packets.
[email protected]14e8106c2013-03-14 16:25:33127 ON_CALL(*this, OnProtocolVersionMismatch(_))
128 .WillByDefault(testing::Return(false));
129
130 // By default, we want to accept packets.
[email protected]ec86d5462013-11-17 16:04:49131 ON_CALL(*this, OnUnauthenticatedHeader(_))
132 .WillByDefault(testing::Return(true));
133
[email protected]066d8182014-01-04 02:02:45134 ON_CALL(*this, OnUnauthenticatedPublicHeader(_))
135 .WillByDefault(testing::Return(true));
136
rjshaded5ced072015-12-18 19:26:02137 ON_CALL(*this, OnPacketHeader(_)).WillByDefault(testing::Return(true));
[email protected]a57e0272013-04-26 07:31:47138
rjshaded5ced072015-12-18 19:26:02139 ON_CALL(*this, OnStreamFrame(_)).WillByDefault(testing::Return(true));
[email protected]a57e0272013-04-26 07:31:47140
rjshaded5ced072015-12-18 19:26:02141 ON_CALL(*this, OnAckFrame(_)).WillByDefault(testing::Return(true));
[email protected]a57e0272013-04-26 07:31:47142
rjshaded5ced072015-12-18 19:26:02143 ON_CALL(*this, OnStopWaitingFrame(_)).WillByDefault(testing::Return(true));
[email protected]93dd91f2014-02-27 00:09:03144
rjshadef88b3c72016-04-26 15:25:33145 ON_CALL(*this, OnPaddingFrame(_)).WillByDefault(testing::Return(true));
146
rjshaded5ced072015-12-18 19:26:02147 ON_CALL(*this, OnPingFrame(_)).WillByDefault(testing::Return(true));
[email protected]d8c522112014-04-23 09:23:25148
rjshaded5ced072015-12-18 19:26:02149 ON_CALL(*this, OnRstStreamFrame(_)).WillByDefault(testing::Return(true));
[email protected]a57e0272013-04-26 07:31:47150
151 ON_CALL(*this, OnConnectionCloseFrame(_))
152 .WillByDefault(testing::Return(true));
153
rjshaded5ced072015-12-18 19:26:02154 ON_CALL(*this, OnGoAwayFrame(_)).WillByDefault(testing::Return(true));
[email protected]8b37a092012-10-18 21:53:49155}
156
rtenneti021e8822015-10-18 23:59:57157MockFramerVisitor::~MockFramerVisitor() {}
[email protected]8b37a092012-10-18 21:53:49158
[email protected]48878092013-07-26 14:51:56159bool NoOpFramerVisitor::OnProtocolVersionMismatch(QuicVersion version) {
[email protected]14e8106c2013-03-14 16:25:33160 return false;
161}
162
[email protected]066d8182014-01-04 02:02:45163bool NoOpFramerVisitor::OnUnauthenticatedPublicHeader(
164 const QuicPacketPublicHeader& header) {
165 return true;
166}
167
[email protected]ec86d5462013-11-17 16:04:49168bool NoOpFramerVisitor::OnUnauthenticatedHeader(
169 const QuicPacketHeader& header) {
170 return true;
171}
172
[email protected]8b37a092012-10-18 21:53:49173bool NoOpFramerVisitor::OnPacketHeader(const QuicPacketHeader& header) {
174 return true;
175}
176
[email protected]a57e0272013-04-26 07:31:47177bool NoOpFramerVisitor::OnStreamFrame(const QuicStreamFrame& frame) {
178 return true;
179}
180
181bool NoOpFramerVisitor::OnAckFrame(const QuicAckFrame& frame) {
182 return true;
183}
184
rjshaded5ced072015-12-18 19:26:02185bool NoOpFramerVisitor::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) {
[email protected]93dd91f2014-02-27 00:09:03186 return true;
187}
188
rjshadef88b3c72016-04-26 15:25:33189bool NoOpFramerVisitor::OnPaddingFrame(const QuicPaddingFrame& frame) {
190 return true;
191}
192
[email protected]d8c522112014-04-23 09:23:25193bool NoOpFramerVisitor::OnPingFrame(const QuicPingFrame& frame) {
194 return true;
195}
196
rjshaded5ced072015-12-18 19:26:02197bool NoOpFramerVisitor::OnRstStreamFrame(const QuicRstStreamFrame& frame) {
[email protected]a57e0272013-04-26 07:31:47198 return true;
199}
200
201bool NoOpFramerVisitor::OnConnectionCloseFrame(
202 const QuicConnectionCloseFrame& frame) {
203 return true;
204}
205
206bool NoOpFramerVisitor::OnGoAwayFrame(const QuicGoAwayFrame& frame) {
207 return true;
208}
209
[email protected]cb23a922014-02-20 17:42:38210bool NoOpFramerVisitor::OnWindowUpdateFrame(
211 const QuicWindowUpdateFrame& frame) {
212 return true;
213}
214
215bool NoOpFramerVisitor::OnBlockedFrame(const QuicBlockedFrame& frame) {
216 return true;
217}
218
ckrasica7fd1242016-05-14 20:36:01219MockQuicConnectionVisitor::MockQuicConnectionVisitor() {}
[email protected]8d659e22013-01-19 04:26:10220
ckrasica7fd1242016-05-14 20:36:01221MockQuicConnectionVisitor::~MockQuicConnectionVisitor() {}
[email protected]8d659e22013-01-19 04:26:10222
ckrasica7fd1242016-05-14 20:36:01223MockQuicConnectionHelper::MockQuicConnectionHelper() {}
[email protected]9c0b1352012-11-04 00:03:27224
ckrasica7fd1242016-05-14 20:36:01225MockQuicConnectionHelper::~MockQuicConnectionHelper() {}
[email protected]9c0b1352012-11-04 00:03:27226
ckrasica7fd1242016-05-14 20:36:01227const QuicClock* MockQuicConnectionHelper::GetClock() const {
[email protected]9c0b1352012-11-04 00:03:27228 return &clock_;
229}
230
ckrasica7fd1242016-05-14 20:36:01231QuicRandom* MockQuicConnectionHelper::GetRandomGenerator() {
[email protected]9558c5d32012-12-22 00:08:14232 return &random_generator_;
233}
234
rch16c74d1d2016-04-22 06:14:07235QuicAlarm* MockAlarmFactory::CreateAlarm(QuicAlarm::Delegate* delegate) {
236 return new MockAlarmFactory::TestAlarm(
jdorfman4ea54a22016-01-21 22:12:50237 QuicArenaScopedPtr<QuicAlarm::Delegate>(delegate));
238}
239
rch16c74d1d2016-04-22 06:14:07240QuicArenaScopedPtr<QuicAlarm> MockAlarmFactory::CreateAlarm(
jdorfman4ea54a22016-01-21 22:12:50241 QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
242 QuicConnectionArena* arena) {
243 if (arena != nullptr) {
fayang0f698802017-02-08 14:45:17244 return arena->New<TestAlarm>(std::move(delegate));
jdorfman4ea54a22016-01-21 22:12:50245 } else {
fayang0f698802017-02-08 14:45:17246 return QuicArenaScopedPtr<TestAlarm>(new TestAlarm(std::move(delegate)));
jdorfman4ea54a22016-01-21 22:12:50247 }
[email protected]965dbe62013-08-09 21:34:31248}
249
ckrasica7fd1242016-05-14 20:36:01250QuicBufferAllocator* MockQuicConnectionHelper::GetBufferAllocator() {
jdorfman5a606722016-01-04 17:41:29251 return &buffer_allocator_;
252}
253
ckrasica7fd1242016-05-14 20:36:01254void MockQuicConnectionHelper::AdvanceTime(QuicTime::Delta delta) {
[email protected]fe053f92013-04-23 20:18:55255 clock_.AdvanceTime(delta);
256}
257
ckrasica7fd1242016-05-14 20:36:01258MockQuicConnection::MockQuicConnection(MockQuicConnectionHelper* helper,
259 MockAlarmFactory* alarm_factory,
260 Perspective perspective)
danzh75104982017-04-14 21:58:09261 : MockQuicConnection(
262 QuicUtils::IsConnectionIdWireFormatBigEndian(perspective)
263 ? QuicEndian::NetToHost64(kTestConnectionId)
264 : kTestConnectionId,
265 QuicSocketAddress(TestPeerIPAddress(), kTestPort),
266 helper,
267 alarm_factory,
268 perspective,
269 AllSupportedVersions()) {}
[email protected]c05a6d222013-12-16 19:42:03270
fayang91ca2012016-11-22 07:42:46271MockQuicConnection::MockQuicConnection(QuicSocketAddress address,
ckrasica7fd1242016-05-14 20:36:01272 MockQuicConnectionHelper* helper,
273 MockAlarmFactory* alarm_factory,
274 Perspective perspective)
danzh75104982017-04-14 21:58:09275 : MockQuicConnection(
276 QuicUtils::IsConnectionIdWireFormatBigEndian(perspective)
277 ? QuicEndian::NetToHost64(kTestConnectionId)
278 : kTestConnectionId,
279 address,
280 helper,
281 alarm_factory,
282 perspective,
283 AllSupportedVersions()) {}
[email protected]044ac2b2012-11-13 21:41:06284
ckrasica7fd1242016-05-14 20:36:01285MockQuicConnection::MockQuicConnection(QuicConnectionId connection_id,
286 MockQuicConnectionHelper* helper,
287 MockAlarmFactory* alarm_factory,
288 Perspective perspective)
289 : MockQuicConnection(connection_id,
fayang91ca2012016-11-22 07:42:46290 QuicSocketAddress(TestPeerIPAddress(), kTestPort),
ckrasica7fd1242016-05-14 20:36:01291 helper,
292 alarm_factory,
293 perspective,
danzh3134c2562016-08-12 14:07:52294 CurrentSupportedVersions()) {}
rchc0815442015-04-18 13:29:46295
ckrasica7fd1242016-05-14 20:36:01296MockQuicConnection::MockQuicConnection(
297 MockQuicConnectionHelper* helper,
298 MockAlarmFactory* alarm_factory,
299 Perspective perspective,
300 const QuicVersionVector& supported_versions)
danzh75104982017-04-14 21:58:09301 : MockQuicConnection(
302 QuicUtils::IsConnectionIdWireFormatBigEndian(perspective)
303 ? QuicEndian::NetToHost64(kTestConnectionId)
304 : kTestConnectionId,
305 QuicSocketAddress(TestPeerIPAddress(), kTestPort),
306 helper,
307 alarm_factory,
308 perspective,
309 supported_versions) {}
rchc0815442015-04-18 13:29:46310
ckrasica7fd1242016-05-14 20:36:01311MockQuicConnection::MockQuicConnection(
312 QuicConnectionId connection_id,
fayang91ca2012016-11-22 07:42:46313 QuicSocketAddress address,
ckrasica7fd1242016-05-14 20:36:01314 MockQuicConnectionHelper* helper,
315 MockAlarmFactory* alarm_factory,
316 Perspective perspective,
317 const QuicVersionVector& supported_versions)
rchc0815442015-04-18 13:29:46318 : QuicConnection(connection_id,
319 address,
rtenneti8a4a0732015-10-18 00:45:51320 helper,
rch16c74d1d2016-04-22 06:14:07321 alarm_factory,
jdorfman90d185f32016-01-15 13:22:47322 new testing::NiceMock<MockPacketWriter>(),
rtennetifb3fa6c2015-03-16 23:04:55323 /* owns_writer= */ true,
324 perspective,
rtenneti8a4a0732015-10-18 00:45:51325 supported_versions) {
rchc0815442015-04-18 13:29:46326 ON_CALL(*this, OnError(_))
327 .WillByDefault(
328 Invoke(this, &PacketSavingConnection::QuicConnection_OnError));
[email protected]4d640792013-12-18 22:21:08329}
330
ckrasica7fd1242016-05-14 20:36:01331MockQuicConnection::~MockQuicConnection() {}
[email protected]044ac2b2012-11-13 21:41:06332
ckrasica7fd1242016-05-14 20:36:01333void MockQuicConnection::AdvanceTime(QuicTime::Delta delta) {
334 static_cast<MockQuicConnectionHelper*>(helper())->AdvanceTime(delta);
[email protected]fe053f92013-04-23 20:18:55335}
336
ianswettdf0fddfd2017-05-25 21:23:39337bool MockQuicConnection::OnProtocolVersionMismatch(QuicVersion version) {
338 return false;
339}
340
ckrasica7fd1242016-05-14 20:36:01341PacketSavingConnection::PacketSavingConnection(MockQuicConnectionHelper* helper,
rch16c74d1d2016-04-22 06:14:07342 MockAlarmFactory* alarm_factory,
rtenneti8a4a0732015-10-18 00:45:51343 Perspective perspective)
ckrasica7fd1242016-05-14 20:36:01344 : MockQuicConnection(helper, alarm_factory, perspective) {}
[email protected]044ac2b2012-11-13 21:41:06345
[email protected]4d640792013-12-18 22:21:08346PacketSavingConnection::PacketSavingConnection(
ckrasica7fd1242016-05-14 20:36:01347 MockQuicConnectionHelper* helper,
rch16c74d1d2016-04-22 06:14:07348 MockAlarmFactory* alarm_factory,
rtenneti6f48aa92015-03-16 02:18:48349 Perspective perspective,
[email protected]4d640792013-12-18 22:21:08350 const QuicVersionVector& supported_versions)
ckrasica7fd1242016-05-14 20:36:01351 : MockQuicConnection(helper,
352 alarm_factory,
353 perspective,
354 supported_versions) {}
[email protected]4d640792013-12-18 22:21:08355
avib3635452016-10-21 18:33:53356PacketSavingConnection::~PacketSavingConnection() {}
[email protected]044ac2b2012-11-13 21:41:06357
zhongyi4a9d27b2016-01-12 20:08:31358void PacketSavingConnection::SendOrQueuePacket(SerializedPacket* packet) {
fayang8f534ce2017-01-18 21:35:36359 encrypted_packets_.push_back(QuicMakeUnique<QuicEncryptedPacket>(
vasilvvbdbe8642016-11-24 17:29:18360 CopyBuffer(*packet), packet->encrypted_length, true));
rtenneti31e9fd62014-09-16 05:22:15361 // Transfer ownership of the packet to the SentPacketManager and the
362 // ack notifier to the AckNotifierManager.
fayangc374bb732017-01-18 20:46:58363 sent_packet_manager_.OnPacketSent(packet, 0, QuicTime::Zero(),
364 NOT_RETRANSMISSION,
365 HAS_RETRANSMITTABLE_DATA);
[email protected]044ac2b2012-11-13 21:41:06366}
367
jri4ee9d762016-04-29 02:04:35368MockQuicSession::MockQuicSession(QuicConnection* connection)
ckrasic32b17dcd2016-10-31 06:15:35369 : QuicSession(connection, nullptr, DefaultQuicConfig()) {
jri4ee9d762016-04-29 02:04:35370 crypto_stream_.reset(new QuicCryptoStream(this));
371 Initialize();
danzh1401f0a2016-05-19 13:41:10372 ON_CALL(*this, WritevData(_, _, _, _, _, _))
jri4ee9d762016-04-29 02:04:35373 .WillByDefault(testing::Return(QuicConsumedData(0, false)));
374}
375
danzh3134c2562016-08-12 14:07:52376MockQuicSession::~MockQuicSession() {
377 delete connection();
378}
jri4ee9d762016-04-29 02:04:35379
ianswettdf0fddfd2017-05-25 21:23:39380QuicCryptoStream* MockQuicSession::GetMutableCryptoStream() {
381 return crypto_stream_.get();
382}
383
384const QuicCryptoStream* MockQuicSession::GetCryptoStream() const {
385 return crypto_stream_.get();
386}
387
jri4ee9d762016-04-29 02:04:35388// static
389QuicConsumedData MockQuicSession::ConsumeAllData(
fayangf66f9f12016-11-08 15:25:41390 QuicStream* /*stream*/,
jri4ee9d762016-04-29 02:04:35391 QuicStreamId /*id*/,
392 const QuicIOVector& data,
393 QuicStreamOffset /*offset*/,
rchfc6809b62017-04-19 01:37:01394 StreamSendingState state,
fayang0aa8bc22016-12-20 23:19:25395 const QuicReferenceCountedPointer<
fayangc26bcdb2016-12-21 15:33:12396 QuicAckListenerInterface>& /*ack_listener*/) {
rchfc6809b62017-04-19 01:37:01397 return QuicConsumedData(data.total_length, state != NO_FIN);
jri4ee9d762016-04-29 02:04:35398}
399
rtennetib865eb82015-06-17 20:21:46400MockQuicSpdySession::MockQuicSpdySession(QuicConnection* connection)
ckrasic32b17dcd2016-10-31 06:15:35401 : QuicSpdySession(connection, nullptr, DefaultQuicConfig()) {
rtennetid39bd762015-06-12 01:05:52402 crypto_stream_.reset(new QuicCryptoStream(this));
403 Initialize();
danzh1401f0a2016-05-19 13:41:10404 ON_CALL(*this, WritevData(_, _, _, _, _, _))
[email protected]cff7b7b2013-01-11 08:49:07405 .WillByDefault(testing::Return(QuicConsumedData(0, false)));
[email protected]044ac2b2012-11-13 21:41:06406}
407
danzh3134c2562016-08-12 14:07:52408MockQuicSpdySession::~MockQuicSpdySession() {
409 delete connection();
410}
[email protected]044ac2b2012-11-13 21:41:06411
ianswettdf0fddfd2017-05-25 21:23:39412QuicCryptoStream* MockQuicSpdySession::GetMutableCryptoStream() {
413 return crypto_stream_.get();
414}
415
416const QuicCryptoStream* MockQuicSpdySession::GetCryptoStream() const {
417 return crypto_stream_.get();
418}
419
420size_t MockQuicSpdySession::WriteHeaders(
421 QuicStreamId id,
422 SpdyHeaderBlock headers,
423 bool fin,
424 SpdyPriority priority,
425 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) {
426 write_headers_ = std::move(headers);
427 return WriteHeadersMock(id, write_headers_, fin, priority, ack_listener);
428}
429
rtennetib865eb82015-06-17 20:21:46430TestQuicSpdyServerSession::TestQuicSpdyServerSession(
rtennetid39bd762015-06-12 01:05:52431 QuicConnection* connection,
432 const QuicConfig& config,
rjshaded069aaee2016-03-11 20:42:17433 const QuicCryptoServerConfig* crypto_config,
434 QuicCompressedCertsCache* compressed_certs_cache)
435 : QuicServerSessionBase(config,
436 connection,
437 &visitor_,
mpwb5c8da92016-06-05 20:07:31438 &helper_,
rjshaded069aaee2016-03-11 20:42:17439 crypto_config,
440 compressed_certs_cache) {
rtennetid39bd762015-06-12 01:05:52441 Initialize();
mpwb5c8da92016-06-05 20:07:31442 ON_CALL(helper_, GenerateConnectionIdForReject(_))
443 .WillByDefault(
444 testing::Return(connection->random_generator()->RandUint64()));
ianswett7b88c0a2016-06-10 22:29:58445 ON_CALL(helper_, CanAcceptClientHello(_, _, _))
446 .WillByDefault(testing::Return(true));
[email protected]ccb34212014-07-18 09:27:50447}
[email protected]2532de12013-05-09 12:29:33448
danzh3134c2562016-08-12 14:07:52449TestQuicSpdyServerSession::~TestQuicSpdyServerSession() {
450 delete connection();
451}
[email protected]2532de12013-05-09 12:29:33452
jokulikc971baf92016-01-06 00:36:39453QuicCryptoServerStreamBase*
454TestQuicSpdyServerSession::CreateQuicCryptoServerStream(
rjshaded069aaee2016-03-11 20:42:17455 const QuicCryptoServerConfig* crypto_config,
456 QuicCompressedCertsCache* compressed_certs_cache) {
rch674c976b2016-12-22 23:36:22457 return new QuicCryptoServerStream(
458 crypto_config, compressed_certs_cache,
459 FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support, this,
460 &helper_);
jokulikc971baf92016-01-06 00:36:39461}
462
rchfc6809b62017-04-19 01:37:01463QuicCryptoServerStream* TestQuicSpdyServerSession::GetMutableCryptoStream() {
zhongyib8677022015-12-01 05:51:30464 return static_cast<QuicCryptoServerStream*>(
rchfc6809b62017-04-19 01:37:01465 QuicServerSessionBase::GetMutableCryptoStream());
466}
467
468const QuicCryptoServerStream* TestQuicSpdyServerSession::GetCryptoStream()
469 const {
470 return static_cast<const QuicCryptoServerStream*>(
jokulikc971baf92016-01-06 00:36:39471 QuicServerSessionBase::GetCryptoStream());
[email protected]2532de12013-05-09 12:29:33472}
473
rtennetib865eb82015-06-17 20:21:46474TestQuicSpdyClientSession::TestQuicSpdyClientSession(
475 QuicConnection* connection,
476 const QuicConfig& config,
477 const QuicServerId& server_id,
478 QuicCryptoClientConfig* crypto_config)
ckrasic244375a32016-02-04 21:21:22479 : QuicClientSessionBase(connection, &push_promise_index_, config) {
rtennetid39bd762015-06-12 01:05:52480 crypto_stream_.reset(new QuicCryptoClientStream(
fayangf5f4cd512017-02-07 16:57:11481 server_id, this, crypto_test_utils::ProofVerifyContextForTesting(),
rtenneti2cae2072016-02-05 02:21:33482 crypto_config, this));
rtennetid39bd762015-06-12 01:05:52483 Initialize();
[email protected]90f62f092014-03-24 02:41:23484}
485
rtenneti021e8822015-10-18 23:59:57486TestQuicSpdyClientSession::~TestQuicSpdyClientSession() {}
[email protected]90f62f092014-03-24 02:41:23487
ckrasic244375a32016-02-04 21:21:22488bool TestQuicSpdyClientSession::IsAuthorized(const string& authority) {
489 return true;
490}
491
rchfc6809b62017-04-19 01:37:01492QuicCryptoClientStream* TestQuicSpdyClientSession::GetMutableCryptoStream() {
493 return crypto_stream_.get();
494}
495
496const QuicCryptoClientStream* TestQuicSpdyClientSession::GetCryptoStream()
497 const {
rtennetid39bd762015-06-12 01:05:52498 return crypto_stream_.get();
rtennetia2ea9162015-05-15 19:26:44499}
500
fayang0f698802017-02-08 14:45:17501TestPushPromiseDelegate::TestPushPromiseDelegate(bool match)
502 : match_(match), rendezvous_fired_(false), rendezvous_stream_(nullptr) {}
503
504bool TestPushPromiseDelegate::CheckVary(
505 const SpdyHeaderBlock& client_request,
506 const SpdyHeaderBlock& promise_request,
507 const SpdyHeaderBlock& promise_response) {
508 QUIC_DVLOG(1) << "match " << match_;
509 return match_;
510}
511
512void TestPushPromiseDelegate::OnRendezvousResult(QuicSpdyStream* stream) {
513 rendezvous_fired_ = true;
514 rendezvous_stream_ = stream;
515}
516
[email protected]cbd731e2013-10-24 00:20:39517MockPacketWriter::MockPacketWriter() {
rtenneti493d90ef2015-09-14 04:43:11518 ON_CALL(*this, GetMaxPacketSize(_))
519 .WillByDefault(testing::Return(kMaxPacketSize));
[email protected]cbd731e2013-10-24 00:20:39520}
521
rtenneti021e8822015-10-18 23:59:57522MockPacketWriter::~MockPacketWriter() {}
[email protected]cbd731e2013-10-24 00:20:39523
rtenneti021e8822015-10-18 23:59:57524MockSendAlgorithm::MockSendAlgorithm() {}
[email protected]8d659e22013-01-19 04:26:10525
rtenneti021e8822015-10-18 23:59:57526MockSendAlgorithm::~MockSendAlgorithm() {}
[email protected]8d659e22013-01-19 04:26:10527
rtenneti021e8822015-10-18 23:59:57528MockLossAlgorithm::MockLossAlgorithm() {}
[email protected]3aa9ca72014-02-27 19:39:43529
rtenneti021e8822015-10-18 23:59:57530MockLossAlgorithm::~MockLossAlgorithm() {}
[email protected]3aa9ca72014-02-27 19:39:43531
ckrasicea295fe2015-10-31 05:03:27532MockAckListener::MockAckListener() {}
[email protected]97cf3022013-09-05 14:30:16533
ckrasicea295fe2015-10-31 05:03:27534MockAckListener::~MockAckListener() {}
[email protected]97cf3022013-09-05 14:30:16535
rtenneti021e8822015-10-18 23:59:57536MockNetworkChangeVisitor::MockNetworkChangeVisitor() {}
[email protected]a692ad9d2014-07-18 21:35:24537
rtenneti021e8822015-10-18 23:59:57538MockNetworkChangeVisitor::~MockNetworkChangeVisitor() {}
[email protected]a692ad9d2014-07-18 21:35:24539
[email protected]8b37a092012-10-18 21:53:49540namespace {
541
rjshaded5ced072015-12-18 19:26:02542string HexDumpWithMarks(const char* data,
543 int length,
544 const bool* marks,
545 int mark_length) {
[email protected]8b37a092012-10-18 21:53:49546 static const char kHexChars[] = "0123456789abcdef";
547 static const int kColumns = 4;
548
549 const int kSizeLimit = 1024;
550 if (length > kSizeLimit || mark_length > kSizeLimit) {
fayangb25a2cd52017-01-13 18:49:10551 QUIC_LOG(ERROR) << "Only dumping first " << kSizeLimit << " bytes.";
diannahu466377c2017-03-03 18:53:39552 length = std::min(length, kSizeLimit);
553 mark_length = std::min(mark_length, kSizeLimit);
[email protected]8b37a092012-10-18 21:53:49554 }
555
556 string hex;
rjshaded5ced072015-12-18 19:26:02557 for (const char *row = data; length > 0;
[email protected]8b37a092012-10-18 21:53:49558 row += kColumns, length -= kColumns) {
rjshaded5ced072015-12-18 19:26:02559 for (const char* p = row; p < row + 4; ++p) {
[email protected]8b37a092012-10-18 21:53:49560 if (p < row + length) {
561 const bool mark =
562 (marks && (p - data) < mark_length && marks[p - data]);
563 hex += mark ? '*' : ' ';
564 hex += kHexChars[(*p & 0xf0) >> 4];
565 hex += kHexChars[*p & 0x0f];
566 hex += mark ? '*' : ' ';
567 } else {
568 hex += " ";
569 }
570 }
571 hex = hex + " ";
572
rtenneti6f48aa92015-03-16 02:18:48573 for (const char* p = row; p < row + 4 && p < row + length; ++p) {
[email protected]8b37a092012-10-18 21:53:49574 hex += (*p >= 0x20 && *p <= 0x7f) ? (*p) : '.';
rtenneti6f48aa92015-03-16 02:18:48575 }
[email protected]8b37a092012-10-18 21:53:49576
577 hex = hex + '\n';
578 }
579 return hex;
580}
581
582} // namespace
583
fayang91ca2012016-11-22 07:42:46584QuicIpAddress TestPeerIPAddress() {
585 return QuicIpAddress::Loopback4();
rjshaded5ced072015-12-18 19:26:02586}
[email protected]300ccd52014-01-25 08:00:19587
rjshaded5ced072015-12-18 19:26:02588QuicVersion QuicVersionMax() {
danzh3134c2562016-08-12 14:07:52589 return AllSupportedVersions().front();
rjshaded5ced072015-12-18 19:26:02590}
[email protected]b007e632013-10-28 08:39:25591
rjshaded5ced072015-12-18 19:26:02592QuicVersion QuicVersionMin() {
danzh3134c2562016-08-12 14:07:52593 return AllSupportedVersions().back();
rjshaded5ced072015-12-18 19:26:02594}
[email protected]b007e632013-10-28 08:39:25595
rtennetia004d332015-08-28 06:44:57596QuicEncryptedPacket* ConstructEncryptedPacket(QuicConnectionId connection_id,
597 bool version_flag,
598 bool reset_flag,
599 QuicPacketNumber packet_number,
600 const string& data) {
ianswettb3d5d902017-03-05 22:40:36601 return ConstructEncryptedPacket(
jokulik14e0d83b2017-03-10 22:09:37602 connection_id, version_flag, reset_flag, packet_number, data,
603 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER);
rtenneti9e0fb502015-03-08 06:07:16604}
605
606QuicEncryptedPacket* ConstructEncryptedPacket(
607 QuicConnectionId connection_id,
608 bool version_flag,
609 bool reset_flag,
rtennetia004d332015-08-28 06:44:57610 QuicPacketNumber packet_number,
rtenneti9e0fb502015-03-08 06:07:16611 const string& data,
612 QuicConnectionIdLength connection_id_length,
rtennetia004d332015-08-28 06:44:57613 QuicPacketNumberLength packet_number_length) {
jokulik14e0d83b2017-03-10 22:09:37614 return ConstructEncryptedPacket(connection_id, version_flag, reset_flag,
615 packet_number, data, connection_id_length,
616 packet_number_length, nullptr);
rchc0815442015-04-18 13:29:46617}
618
619QuicEncryptedPacket* ConstructEncryptedPacket(
620 QuicConnectionId connection_id,
621 bool version_flag,
622 bool reset_flag,
rtennetia004d332015-08-28 06:44:57623 QuicPacketNumber packet_number,
rchc0815442015-04-18 13:29:46624 const string& data,
625 QuicConnectionIdLength connection_id_length,
rtennetia004d332015-08-28 06:44:57626 QuicPacketNumberLength packet_number_length,
rchc0815442015-04-18 13:29:46627 QuicVersionVector* versions) {
jokulik14e0d83b2017-03-10 22:09:37628 return ConstructEncryptedPacket(connection_id, version_flag, reset_flag,
629 packet_number, data, connection_id_length,
630 packet_number_length, versions,
631 Perspective::IS_CLIENT);
alyssar2adf3ac2016-05-03 17:12:58632}
633QuicEncryptedPacket* ConstructEncryptedPacket(
634 QuicConnectionId connection_id,
635 bool version_flag,
alyssar2adf3ac2016-05-03 17:12:58636 bool reset_flag,
alyssar2adf3ac2016-05-03 17:12:58637 QuicPacketNumber packet_number,
638 const string& data,
639 QuicConnectionIdLength connection_id_length,
640 QuicPacketNumberLength packet_number_length,
641 QuicVersionVector* versions,
642 Perspective perspective) {
[email protected]ffc34bf2014-03-07 02:42:02643 QuicPacketHeader header;
644 header.public_header.connection_id = connection_id;
rtenneti9e0fb502015-03-08 06:07:16645 header.public_header.connection_id_length = connection_id_length;
[email protected]ffc34bf2014-03-07 02:42:02646 header.public_header.version_flag = version_flag;
647 header.public_header.reset_flag = reset_flag;
rtennetia004d332015-08-28 06:44:57648 header.public_header.packet_number_length = packet_number_length;
rtenneti8dd12b22015-10-21 01:26:38649 header.packet_number = packet_number;
fayang19c30772017-03-09 15:06:17650 QuicStreamFrame stream_frame(1, false, 0, QuicStringPiece(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(
fayangf5f4cd512017-02-07 16:57:11663 ENCRYPTION_NONE, 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,
680 bool reset_flag,
rtennetia004d332015-08-28 06:44:57681 QuicPacketNumber packet_number,
rchc0815442015-04-18 13:29:46682 const string& data,
683 QuicConnectionIdLength connection_id_length,
rtennetia004d332015-08-28 06:44:57684 QuicPacketNumberLength packet_number_length,
alyssar2adf3ac2016-05-03 17:12:58685 QuicVersionVector* versions,
686 Perspective perspective) {
rchc0815442015-04-18 13:29:46687 QuicPacketHeader header;
688 header.public_header.connection_id = connection_id;
689 header.public_header.connection_id_length = connection_id_length;
690 header.public_header.version_flag = version_flag;
691 header.public_header.reset_flag = reset_flag;
rtennetia004d332015-08-28 06:44:57692 header.public_header.packet_number_length = packet_number_length;
rtenneti8dd12b22015-10-21 01:26:38693 header.packet_number = packet_number;
fayang19c30772017-03-09 15:06:17694 QuicStreamFrame stream_frame(1, false, 0, QuicStringPiece(data));
rtenneti85816fdf2015-05-25 03:01:10695 QuicFrame frame(&stream_frame);
rchc0815442015-04-18 13:29:46696 QuicFrames frames;
rtenneti85816fdf2015-05-25 03:01:10697 frames.push_back(frame);
danzh3134c2562016-08-12 14:07:52698 QuicFramer framer(versions != nullptr ? *versions : AllSupportedVersions(),
alyssar2adf3ac2016-05-03 17:12:58699 QuicTime::Zero(), perspective);
rtenneti85816fdf2015-05-25 03:01:10700
danakjad1777e2016-04-16 00:56:42701 std::unique_ptr<QuicPacket> packet(
rchc0815442015-04-18 13:29:46702 BuildUnsizedDataPacket(&framer, header, frames));
703 EXPECT_TRUE(packet != nullptr);
rtenneti85816fdf2015-05-25 03:01:10704
mpw94250b82016-11-19 18:13:30705 // Now set the frame type to 0x1F, which is an invalid frame type.
706 reinterpret_cast<unsigned char*>(
707 packet->mutable_data())[GetStartOfEncryptedData(
mpw3f859532017-02-16 20:00:31708 framer.version(), connection_id_length, version_flag,
mpw94250b82016-11-19 18:13:30709 false /* no diversification nonce */, packet_number_length)] = 0x1F;
rtenneti85816fdf2015-05-25 03:01:10710
rch99b644c2015-11-04 05:25:28711 char* buffer = new char[kMaxPacketSize];
712 size_t encrypted_length = framer.EncryptPayload(
fayangf5f4cd512017-02-07 16:57:11713 ENCRYPTION_NONE, packet_number, *packet, buffer, kMaxPacketSize);
rch99b644c2015-11-04 05:25:28714 EXPECT_NE(0u, encrypted_length);
715 return new QuicEncryptedPacket(buffer, encrypted_length, true);
rchc0815442015-04-18 13:29:46716}
717
rjshaded5ced072015-12-18 19:26:02718void CompareCharArraysWithHexError(const string& description,
719 const char* actual,
720 const int actual_len,
721 const char* expected,
722 const int expected_len) {
[email protected]b007e632013-10-28 08:39:25723 EXPECT_EQ(actual_len, expected_len);
diannahu466377c2017-03-03 18:53:39724 const int min_len = std::min(actual_len, expected_len);
725 const int max_len = std::max(actual_len, expected_len);
danakjad1777e2016-04-16 00:56:42726 std::unique_ptr<bool[]> marks(new bool[max_len]);
[email protected]8b37a092012-10-18 21:53:49727 bool identical = (actual_len == expected_len);
728 for (int i = 0; i < min_len; ++i) {
729 if (actual[i] != expected[i]) {
730 marks[i] = true;
731 identical = false;
732 } else {
733 marks[i] = false;
734 }
735 }
736 for (int i = min_len; i < max_len; ++i) {
737 marks[i] = true;
738 }
rjshaded5ced072015-12-18 19:26:02739 if (identical)
740 return;
jric533399b2016-01-29 07:36:01741 ADD_FAILURE() << "Description:\n"
742 << description << "\n\nExpected:\n"
rjshaded5ced072015-12-18 19:26:02743 << HexDumpWithMarks(expected, expected_len, marks.get(),
744 max_len)
745 << "\nActual:\n"
746 << HexDumpWithMarks(actual, actual_len, marks.get(), max_len);
[email protected]8b37a092012-10-18 21:53:49747}
748
rtennetia004d332015-08-28 06:44:57749size_t GetPacketLengthForOneStream(QuicVersion version,
750 bool include_version,
rch012834cf2016-04-26 02:06:37751 bool include_diversification_nonce,
rtennetia004d332015-08-28 06:44:57752 QuicConnectionIdLength connection_id_length,
753 QuicPacketNumberLength packet_number_length,
rtennetia004d332015-08-28 06:44:57754 size_t* payload_length) {
[email protected]f62262b2013-07-05 20:57:30755 *payload_length = 1;
756 const size_t stream_length =
rchf58b71b2016-12-21 01:38:31757 NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(*payload_length) +
[email protected]b064310782013-05-30 21:12:17758 QuicPacketCreator::StreamFramePacketOverhead(
mpw3f859532017-02-16 20:00:31759 version, PACKET_8BYTE_CONNECTION_ID, include_version,
rch012834cf2016-04-26 02:06:37760 include_diversification_nonce, packet_number_length, 0u);
rtennetic14c8ab2015-06-18 05:47:40761 const size_t ack_length =
rchf58b71b2016-12-21 01:38:31762 NullEncrypter(Perspective::IS_CLIENT)
763 .GetCiphertextSize(QuicFramer::GetMinAckFrameSize(
764 version, PACKET_1BYTE_PACKET_NUMBER)) +
alyssarc2f70a52016-05-04 13:15:49765 GetPacketHeaderSize(version, connection_id_length, include_version,
mpw3f859532017-02-16 20:00:31766 include_diversification_nonce, packet_number_length);
[email protected]f62262b2013-07-05 20:57:30767 if (stream_length < ack_length) {
768 *payload_length = 1 + ack_length - stream_length;
769 }
770
rchf58b71b2016-12-21 01:38:31771 return NullEncrypter(Perspective::IS_CLIENT)
772 .GetCiphertextSize(*payload_length) +
rtennetia004d332015-08-28 06:44:57773 QuicPacketCreator::StreamFramePacketOverhead(
mpw3f859532017-02-16 20:00:31774 version, connection_id_length, include_version,
rch012834cf2016-04-26 02:06:37775 include_diversification_nonce, packet_number_length, 0u);
[email protected]5351cc4b2013-03-03 07:22:41776}
777
[email protected]b064310782013-05-30 21:12:17778QuicConfig DefaultQuicConfig() {
779 QuicConfig config;
[email protected]7d561352014-06-20 09:09:21780 config.SetInitialStreamFlowControlWindowToSend(
781 kInitialStreamFlowControlWindowForTest);
782 config.SetInitialSessionFlowControlWindowToSend(
783 kInitialSessionFlowControlWindowForTest);
[email protected]b064310782013-05-30 21:12:17784 return config;
785}
786
rtennetia2ea9162015-05-15 19:26:44787QuicConfig DefaultQuicConfigStatelessRejects() {
788 QuicConfig config = DefaultQuicConfig();
789 QuicTagVector copt;
790 copt.push_back(kSREJ);
791 config.SetConnectionOptionsToSend(copt);
792 return config;
793}
794
[email protected]4d640792013-12-18 22:21:08795QuicVersionVector SupportedVersions(QuicVersion version) {
796 QuicVersionVector versions;
797 versions.push_back(version);
798 return versions;
799}
800
rtenneti021e8822015-10-18 23:59:57801MockQuicConnectionDebugVisitor::MockQuicConnectionDebugVisitor() {}
rtenneti95293802015-03-27 18:59:23802
rtenneti021e8822015-10-18 23:59:57803MockQuicConnectionDebugVisitor::~MockQuicConnectionDebugVisitor() {}
rtenneti95293802015-03-27 18:59:23804
fayanga31a74b2015-12-28 17:27:14805MockReceivedPacketManager::MockReceivedPacketManager(QuicConnectionStats* stats)
806 : QuicReceivedPacketManager(stats) {}
807
808MockReceivedPacketManager::~MockReceivedPacketManager() {}
809
rchdaf5a852016-07-26 19:42:50810MockConnectionCloseDelegate::MockConnectionCloseDelegate() {}
811
812MockConnectionCloseDelegate::~MockConnectionCloseDelegate() {}
813
rtennetid39bd762015-06-12 01:05:52814void CreateClientSessionForTest(QuicServerId server_id,
815 bool supports_stateless_rejects,
816 QuicTime::Delta connection_start_time,
zhongyib8677022015-12-01 05:51:30817 QuicVersionVector supported_versions,
ckrasica7fd1242016-05-14 20:36:01818 MockQuicConnectionHelper* helper,
rch16c74d1d2016-04-22 06:14:07819 MockAlarmFactory* alarm_factory,
rtennetid39bd762015-06-12 01:05:52820 QuicCryptoClientConfig* crypto_client_config,
821 PacketSavingConnection** client_connection,
rtennetib865eb82015-06-17 20:21:46822 TestQuicSpdyClientSession** client_session) {
rtennetia2ea9162015-05-15 19:26:44823 CHECK(crypto_client_config);
824 CHECK(client_connection);
825 CHECK(client_session);
rtennetia2ea9162015-05-15 19:26:44826 CHECK(!connection_start_time.IsZero())
827 << "Connections must start at non-zero times, otherwise the "
828 << "strike-register will be unhappy.";
829
830 QuicConfig config = supports_stateless_rejects
831 ? DefaultQuicConfigStatelessRejects()
832 : DefaultQuicConfig();
zhongyib8677022015-12-01 05:51:30833 *client_connection = new PacketSavingConnection(
rch16c74d1d2016-04-22 06:14:07834 helper, alarm_factory, Perspective::IS_CLIENT, supported_versions);
rtennetib865eb82015-06-17 20:21:46835 *client_session = new TestQuicSpdyClientSession(
836 *client_connection, config, server_id, crypto_client_config);
rtennetia2ea9162015-05-15 19:26:44837 (*client_connection)->AdvanceTime(connection_start_time);
838}
839
rjshaded069aaee2016-03-11 20:42:17840void CreateServerSessionForTest(
841 QuicServerId server_id,
842 QuicTime::Delta connection_start_time,
843 QuicVersionVector supported_versions,
ckrasica7fd1242016-05-14 20:36:01844 MockQuicConnectionHelper* helper,
rch16c74d1d2016-04-22 06:14:07845 MockAlarmFactory* alarm_factory,
rjshaded069aaee2016-03-11 20:42:17846 QuicCryptoServerConfig* server_crypto_config,
847 QuicCompressedCertsCache* compressed_certs_cache,
848 PacketSavingConnection** server_connection,
849 TestQuicSpdyServerSession** server_session) {
rtennetia2ea9162015-05-15 19:26:44850 CHECK(server_crypto_config);
851 CHECK(server_connection);
852 CHECK(server_session);
rtennetia2ea9162015-05-15 19:26:44853 CHECK(!connection_start_time.IsZero())
854 << "Connections must start at non-zero times, otherwise the "
855 << "strike-register will be unhappy.";
856
zhongyib8677022015-12-01 05:51:30857 *server_connection = new PacketSavingConnection(
rch16c74d1d2016-04-22 06:14:07858 helper, alarm_factory, Perspective::IS_SERVER, supported_versions);
rtennetib865eb82015-06-17 20:21:46859 *server_session = new TestQuicSpdyServerSession(
rjshaded069aaee2016-03-11 20:42:17860 *server_connection, DefaultQuicConfig(), server_crypto_config,
861 compressed_certs_cache);
rtennetia2ea9162015-05-15 19:26:44862
863 // We advance the clock initially because the default time is zero and the
Avi Drissman13fc8932015-12-20 04:40:46864 // strike register worries that we've just overflowed a uint32_t time.
rtennetia2ea9162015-05-15 19:26:44865 (*server_connection)->AdvanceTime(connection_start_time);
866}
867
ckrasicbf2f59c2017-05-04 23:54:36868QuicStreamId NextStreamId(QuicVersion version) {
869 // TODO(ckrasic) - when version for http stream pairs re-lands, this
870 // will be conditional.
871 return 2;
872}
873
874QuicStreamId GetNthClientInitiatedStreamId(QuicVersion version, int n) {
875 return 5 + NextStreamId(version) * n;
876}
877
878QuicStreamId GetNthServerInitiatedStreamId(QuicVersion version, int n) {
879 return 2 + NextStreamId(version) * n;
ckrasic99850b32015-10-16 21:15:58880}
881
[email protected]8b37a092012-10-18 21:53:49882} // namespace test
[email protected]8b37a092012-10-18 21:53:49883} // namespace net