blob: c38be577b7e1e515762796543a21975b501ea69a [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
[email protected]a5b98172014-06-18 07:01:597#include "base/sha1.h"
[email protected]701bc892013-01-17 04:51:548#include "base/stl_util.h"
[email protected]b12764d2013-12-02 22:28:309#include "base/strings/string_number_conversions.h"
[email protected]8b37a092012-10-18 21:53:4910#include "net/quic/crypto/crypto_framer.h"
[email protected]6f54ab32013-03-02 17:43:3511#include "net/quic/crypto/crypto_handshake.h"
[email protected]872edd9e2013-01-16 08:51:1512#include "net/quic/crypto/crypto_utils.h"
[email protected]5351cc4b2013-03-03 07:22:4113#include "net/quic/crypto/null_encrypter.h"
[email protected]4df69842013-02-27 06:32:1614#include "net/quic/crypto/quic_decrypter.h"
15#include "net/quic/crypto/quic_encrypter.h"
rtenneti16a20772015-02-17 18:58:4816#include "net/quic/quic_data_writer.h"
[email protected]a57e0272013-04-26 07:31:4717#include "net/quic/quic_framer.h"
[email protected]5351cc4b2013-03-03 07:22:4118#include "net/quic/quic_packet_creator.h"
[email protected]79d13dcb2014-02-05 07:23:1319#include "net/quic/quic_utils.h"
rtennetid39bd762015-06-12 01:05:5220#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]cbd731e2013-10-24 00:20:3921#include "net/quic/test_tools/quic_connection_peer.h"
[email protected]c244c5a12013-05-07 20:55:0422#include "net/spdy/spdy_frame_builder.h"
rchc99f380c2015-03-26 19:50:5623#include "net/tools/quic/quic_per_connection_packet_writer.h"
[email protected]8b37a092012-10-18 21:53:4924
[email protected]c244c5a12013-05-07 20:55:0425using base::StringPiece;
[email protected]8b37a092012-10-18 21:53:4926using std::max;
27using std::min;
28using std::string;
[email protected]64c12232014-03-26 05:43:5929using testing::AnyNumber;
rchc0815442015-04-18 13:29:4630using testing::Invoke;
[email protected]bc356fe2014-06-19 11:14:1431using testing::_;
[email protected]8b37a092012-10-18 21:53:4932
33namespace net {
34namespace test {
[email protected]965dbe62013-08-09 21:34:3135namespace {
36
37// No-op alarm implementation used by MockHelper.
38class TestAlarm : public QuicAlarm {
39 public:
40 explicit TestAlarm(QuicAlarm::Delegate* delegate)
41 : QuicAlarm(delegate) {
42 }
43
dchengb03027d2014-10-21 12:00:2044 void SetImpl() override {}
45 void CancelImpl() override {}
[email protected]965dbe62013-08-09 21:34:3146};
47
48} // namespace
[email protected]8b37a092012-10-18 21:53:4949
[email protected]310d37b2014-08-02 06:15:3750QuicAckFrame MakeAckFrame(QuicPacketSequenceNumber largest_observed) {
[email protected]fb35b0a2014-04-15 21:06:4951 QuicAckFrame ack;
[email protected]310d37b2014-08-02 06:15:3752 ack.largest_observed = largest_observed;
53 ack.entropy_hash = 0;
[email protected]fb35b0a2014-04-15 21:06:4954 return ack;
55}
56
[email protected]aa7e4ef2014-05-28 03:53:1557QuicAckFrame MakeAckFrameWithNackRanges(
58 size_t num_nack_ranges, QuicPacketSequenceNumber least_unacked) {
[email protected]310d37b2014-08-02 06:15:3759 QuicAckFrame ack = MakeAckFrame(2 * num_nack_ranges + least_unacked);
[email protected]aa7e4ef2014-05-28 03:53:1560 // Add enough missing packets to get num_nack_ranges nack ranges.
61 for (QuicPacketSequenceNumber i = 1; i < 2 * num_nack_ranges; i += 2) {
[email protected]310d37b2014-08-02 06:15:3762 ack.missing_packets.insert(least_unacked + i);
[email protected]aa7e4ef2014-05-28 03:53:1563 }
64 return ack;
65}
66
rtennetib6ac61a52015-02-11 20:20:5267QuicPacket* BuildUnsizedDataPacket(QuicFramer* framer,
68 const QuicPacketHeader& header,
69 const QuicFrames& frames) {
[email protected]9cda5fd2014-06-03 10:20:2870 const size_t max_plaintext_size = framer->GetMaxPlaintextSize(kMaxPacketSize);
71 size_t packet_size = GetPacketHeaderSize(header);
72 for (size_t i = 0; i < frames.size(); ++i) {
73 DCHECK_LE(packet_size, max_plaintext_size);
74 bool first_frame = i == 0;
75 bool last_frame = i == frames.size() - 1;
76 const size_t frame_size = framer->GetSerializedFrameLength(
77 frames[i], max_plaintext_size - packet_size, first_frame, last_frame,
78 header.is_in_fec_group,
79 header.public_header.sequence_number_length);
80 DCHECK(frame_size);
81 packet_size += frame_size;
82 }
rtenneti16a20772015-02-17 18:58:4883 return BuildUnsizedDataPacket(framer, header, frames, packet_size);
84}
85
86QuicPacket* BuildUnsizedDataPacket(QuicFramer* framer,
87 const QuicPacketHeader& header,
88 const QuicFrames& frames,
89 size_t packet_size) {
90 char* buffer = new char[packet_size];
91 scoped_ptr<QuicPacket> packet(
92 framer->BuildDataPacket(header, frames, buffer, packet_size));
93 DCHECK(packet.get() != nullptr);
94 // Now I have to re-construct the data packet with data ownership.
95 return new QuicPacket(buffer, packet->length(), true,
96 header.public_header.connection_id_length,
97 header.public_header.version_flag,
98 header.public_header.sequence_number_length);
[email protected]9cda5fd2014-06-03 10:20:2899}
100
[email protected]a5b98172014-06-18 07:01:59101uint64 SimpleRandom::RandUint64() {
102 unsigned char hash[base::kSHA1Length];
103 base::SHA1HashBytes(reinterpret_cast<unsigned char*>(&seed_), sizeof(seed_),
104 hash);
105 memcpy(&seed_, hash, sizeof(seed_));
106 return seed_;
107}
108
[email protected]8b37a092012-10-18 21:53:49109MockFramerVisitor::MockFramerVisitor() {
110 // By default, we want to accept packets.
[email protected]14e8106c2013-03-14 16:25:33111 ON_CALL(*this, OnProtocolVersionMismatch(_))
112 .WillByDefault(testing::Return(false));
113
114 // By default, we want to accept packets.
[email protected]ec86d5462013-11-17 16:04:49115 ON_CALL(*this, OnUnauthenticatedHeader(_))
116 .WillByDefault(testing::Return(true));
117
[email protected]066d8182014-01-04 02:02:45118 ON_CALL(*this, OnUnauthenticatedPublicHeader(_))
119 .WillByDefault(testing::Return(true));
120
[email protected]cff7b7b2013-01-11 08:49:07121 ON_CALL(*this, OnPacketHeader(_))
[email protected]8b37a092012-10-18 21:53:49122 .WillByDefault(testing::Return(true));
[email protected]a57e0272013-04-26 07:31:47123
124 ON_CALL(*this, OnStreamFrame(_))
125 .WillByDefault(testing::Return(true));
126
127 ON_CALL(*this, OnAckFrame(_))
128 .WillByDefault(testing::Return(true));
129
[email protected]93dd91f2014-02-27 00:09:03130 ON_CALL(*this, OnStopWaitingFrame(_))
131 .WillByDefault(testing::Return(true));
132
[email protected]d8c522112014-04-23 09:23:25133 ON_CALL(*this, OnPingFrame(_))
134 .WillByDefault(testing::Return(true));
135
[email protected]a57e0272013-04-26 07:31:47136 ON_CALL(*this, OnRstStreamFrame(_))
137 .WillByDefault(testing::Return(true));
138
139 ON_CALL(*this, OnConnectionCloseFrame(_))
140 .WillByDefault(testing::Return(true));
141
142 ON_CALL(*this, OnGoAwayFrame(_))
143 .WillByDefault(testing::Return(true));
[email protected]8b37a092012-10-18 21:53:49144}
145
[email protected]044ac2b2012-11-13 21:41:06146MockFramerVisitor::~MockFramerVisitor() {
147}
[email protected]8b37a092012-10-18 21:53:49148
[email protected]48878092013-07-26 14:51:56149bool NoOpFramerVisitor::OnProtocolVersionMismatch(QuicVersion version) {
[email protected]14e8106c2013-03-14 16:25:33150 return false;
151}
152
[email protected]066d8182014-01-04 02:02:45153bool NoOpFramerVisitor::OnUnauthenticatedPublicHeader(
154 const QuicPacketPublicHeader& header) {
155 return true;
156}
157
[email protected]ec86d5462013-11-17 16:04:49158bool NoOpFramerVisitor::OnUnauthenticatedHeader(
159 const QuicPacketHeader& header) {
160 return true;
161}
162
[email protected]8b37a092012-10-18 21:53:49163bool NoOpFramerVisitor::OnPacketHeader(const QuicPacketHeader& header) {
164 return true;
165}
166
[email protected]a57e0272013-04-26 07:31:47167bool NoOpFramerVisitor::OnStreamFrame(const QuicStreamFrame& frame) {
168 return true;
169}
170
171bool NoOpFramerVisitor::OnAckFrame(const QuicAckFrame& frame) {
172 return true;
173}
174
[email protected]93dd91f2014-02-27 00:09:03175bool NoOpFramerVisitor::OnStopWaitingFrame(
176 const QuicStopWaitingFrame& frame) {
177 return true;
178}
179
[email protected]d8c522112014-04-23 09:23:25180bool NoOpFramerVisitor::OnPingFrame(const QuicPingFrame& frame) {
181 return true;
182}
183
[email protected]a57e0272013-04-26 07:31:47184bool NoOpFramerVisitor::OnRstStreamFrame(
185 const QuicRstStreamFrame& frame) {
186 return true;
187}
188
189bool NoOpFramerVisitor::OnConnectionCloseFrame(
190 const QuicConnectionCloseFrame& frame) {
191 return true;
192}
193
194bool NoOpFramerVisitor::OnGoAwayFrame(const QuicGoAwayFrame& frame) {
195 return true;
196}
197
[email protected]cb23a922014-02-20 17:42:38198bool NoOpFramerVisitor::OnWindowUpdateFrame(
199 const QuicWindowUpdateFrame& frame) {
200 return true;
201}
202
203bool NoOpFramerVisitor::OnBlockedFrame(const QuicBlockedFrame& frame) {
204 return true;
205}
206
[email protected]8d659e22013-01-19 04:26:10207MockConnectionVisitor::MockConnectionVisitor() {
208}
209
210MockConnectionVisitor::~MockConnectionVisitor() {
211}
212
[email protected]9c0b1352012-11-04 00:03:27213MockHelper::MockHelper() {
214}
215
216MockHelper::~MockHelper() {
217}
218
[email protected]97693d12012-11-16 16:05:00219const QuicClock* MockHelper::GetClock() const {
[email protected]9c0b1352012-11-04 00:03:27220 return &clock_;
221}
222
[email protected]9558c5d32012-12-22 00:08:14223QuicRandom* MockHelper::GetRandomGenerator() {
224 return &random_generator_;
225}
226
[email protected]965dbe62013-08-09 21:34:31227QuicAlarm* MockHelper::CreateAlarm(QuicAlarm::Delegate* delegate) {
228 return new TestAlarm(delegate);
229}
230
[email protected]fe053f92013-04-23 20:18:55231void MockHelper::AdvanceTime(QuicTime::Delta delta) {
232 clock_.AdvanceTime(delta);
233}
234
rtenneti3fe4ebbc2014-11-16 16:43:47235QuicPacketWriter* NiceMockPacketWriterFactory::Create(
236 QuicConnection* /*connection*/) const {
237 return new testing::NiceMock<MockPacketWriter>();
238}
[email protected]6d515822014-08-22 01:58:06239
rtenneti6f48aa92015-03-16 02:18:48240MockConnection::MockConnection(Perspective perspective)
rchc0815442015-04-18 13:29:46241 : MockConnection(perspective,
242 /* is_secure= */ false) {
rtenneti8696cf92014-11-14 21:12:12243}
244
rtenneti6f48aa92015-03-16 02:18:48245MockConnection::MockConnection(Perspective perspective, bool is_secure)
rchc0815442015-04-18 13:29:46246 : MockConnection(kTestConnectionId,
rtenneti8696cf92014-11-14 21:12:12247 IPEndPoint(TestPeerIPAddress(), kTestPort),
rtenneti6f48aa92015-03-16 02:18:48248 perspective,
rtenneti8696cf92014-11-14 21:12:12249 is_secure,
rchc0815442015-04-18 13:29:46250 QuicSupportedVersions()) {
[email protected]c05a6d222013-12-16 19:42:03251}
252
rtenneti6f48aa92015-03-16 02:18:48253MockConnection::MockConnection(IPEndPoint address, Perspective perspective)
rchc0815442015-04-18 13:29:46254 : MockConnection(kTestConnectionId,
rtenneti6f48aa92015-03-16 02:18:48255 address,
rtenneti6f48aa92015-03-16 02:18:48256 perspective,
rtenneti8696cf92014-11-14 21:12:12257 /* is_secure= */ false,
rchc0815442015-04-18 13:29:46258 QuicSupportedVersions()) {
[email protected]044ac2b2012-11-13 21:41:06259}
260
[email protected]3aa9ca72014-02-27 19:39:43261MockConnection::MockConnection(QuicConnectionId connection_id,
rtenneti6f48aa92015-03-16 02:18:48262 Perspective perspective)
rchc0815442015-04-18 13:29:46263 : MockConnection(connection_id,
rtenneti6f48aa92015-03-16 02:18:48264 perspective,
rchc0815442015-04-18 13:29:46265 /* is_secure= */ false) {
[email protected]872edd9e2013-01-16 08:51:15266}
267
rtennetifb3fa6c2015-03-16 23:04:55268MockConnection::MockConnection(QuicConnectionId connection_id,
269 Perspective perspective,
270 bool is_secure)
rchc0815442015-04-18 13:29:46271 : MockConnection(connection_id,
rtennetifb3fa6c2015-03-16 23:04:55272 IPEndPoint(TestPeerIPAddress(), kTestPort),
rchc0815442015-04-18 13:29:46273 perspective,
274 is_secure,
275 QuicSupportedVersions()) {
276}
277
278MockConnection::MockConnection(Perspective perspective,
279 const QuicVersionVector& supported_versions)
280 : MockConnection(kTestConnectionId,
281 IPEndPoint(TestPeerIPAddress(), kTestPort),
282 perspective,
283 /* is_secure= */ false,
284 supported_versions) {
285}
286
287MockConnection::MockConnection(QuicConnectionId connection_id,
288 IPEndPoint address,
289 Perspective perspective,
290 bool is_secure,
291 const QuicVersionVector& supported_versions)
292 : QuicConnection(connection_id,
293 address,
rtennetifb3fa6c2015-03-16 23:04:55294 new testing::NiceMock<MockHelper>(),
295 NiceMockPacketWriterFactory(),
296 /* owns_writer= */ true,
297 perspective,
298 is_secure,
rtennetie3779d832014-11-14 02:08:17299 supported_versions),
[email protected]4d640792013-12-18 22:21:08300 helper_(helper()) {
rchc0815442015-04-18 13:29:46301 ON_CALL(*this, OnError(_))
302 .WillByDefault(
303 Invoke(this, &PacketSavingConnection::QuicConnection_OnError));
[email protected]4d640792013-12-18 22:21:08304}
305
[email protected]044ac2b2012-11-13 21:41:06306MockConnection::~MockConnection() {
307}
308
[email protected]fe053f92013-04-23 20:18:55309void MockConnection::AdvanceTime(QuicTime::Delta delta) {
[email protected]fe053f92013-04-23 20:18:55310 static_cast<MockHelper*>(helper())->AdvanceTime(delta);
311}
312
rtenneti6f48aa92015-03-16 02:18:48313PacketSavingConnection::PacketSavingConnection(Perspective perspective)
314 : MockConnection(perspective) {
[email protected]044ac2b2012-11-13 21:41:06315}
316
[email protected]4d640792013-12-18 22:21:08317PacketSavingConnection::PacketSavingConnection(
rtenneti6f48aa92015-03-16 02:18:48318 Perspective perspective,
[email protected]4d640792013-12-18 22:21:08319 const QuicVersionVector& supported_versions)
rtenneti6f48aa92015-03-16 02:18:48320 : MockConnection(perspective, supported_versions) {
[email protected]4d640792013-12-18 22:21:08321}
322
[email protected]044ac2b2012-11-13 21:41:06323PacketSavingConnection::~PacketSavingConnection() {
[email protected]2532de12013-05-09 12:29:33324 STLDeleteElements(&encrypted_packets_);
[email protected]044ac2b2012-11-13 21:41:06325}
326
rtenneti31e9fd62014-09-16 05:22:15327void PacketSavingConnection::SendOrQueuePacket(QueuedPacket packet) {
rtennetie0ee6eb2015-05-01 00:55:09328 if (!packet.serialized_packet.packet->owns_buffer()) {
329 scoped_ptr<QuicEncryptedPacket> encrypted_deleter(
330 packet.serialized_packet.packet);
331 packet.serialized_packet.packet = packet.serialized_packet.packet->Clone();
332 }
rtennetib6ac61a52015-02-11 20:20:52333 encrypted_packets_.push_back(packet.serialized_packet.packet);
rtenneti31e9fd62014-09-16 05:22:15334 // Transfer ownership of the packet to the SentPacketManager and the
335 // ack notifier to the AckNotifierManager.
rtennetia4dcff92014-09-29 18:16:08336 sent_packet_manager_.OnPacketSent(
337 &packet.serialized_packet, 0, QuicTime::Zero(), 1000,
338 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
[email protected]044ac2b2012-11-13 21:41:06339}
340
rtennetib865eb82015-06-17 20:21:46341MockQuicSpdySession::MockQuicSpdySession(QuicConnection* connection)
342 : QuicSpdySession(connection, DefaultQuicConfig()) {
rtennetid39bd762015-06-12 01:05:52343 crypto_stream_.reset(new QuicCryptoStream(this));
344 Initialize();
[email protected]bbb10072014-06-13 07:41:59345 ON_CALL(*this, WritevData(_, _, _, _, _, _))
[email protected]cff7b7b2013-01-11 08:49:07346 .WillByDefault(testing::Return(QuicConsumedData(0, false)));
[email protected]044ac2b2012-11-13 21:41:06347}
348
rtennetib865eb82015-06-17 20:21:46349MockQuicSpdySession::~MockQuicSpdySession() {
[email protected]044ac2b2012-11-13 21:41:06350}
351
rtennetib865eb82015-06-17 20:21:46352TestQuicSpdyServerSession::TestQuicSpdyServerSession(
rtennetid39bd762015-06-12 01:05:52353 QuicConnection* connection,
354 const QuicConfig& config,
355 const QuicCryptoServerConfig* crypto_config)
rtennetib865eb82015-06-17 20:21:46356 : QuicSpdySession(connection, config) {
rtennetid39bd762015-06-12 01:05:52357 crypto_stream_.reset(new QuicCryptoServerStream(crypto_config, this));
358 Initialize();
[email protected]ccb34212014-07-18 09:27:50359}
[email protected]2532de12013-05-09 12:29:33360
rtennetib865eb82015-06-17 20:21:46361TestQuicSpdyServerSession::~TestQuicSpdyServerSession() {
[email protected]2532de12013-05-09 12:29:33362}
363
rtennetib865eb82015-06-17 20:21:46364QuicCryptoServerStream* TestQuicSpdyServerSession::GetCryptoStream() {
rtennetid39bd762015-06-12 01:05:52365 return crypto_stream_.get();
[email protected]2532de12013-05-09 12:29:33366}
367
rtennetib865eb82015-06-17 20:21:46368TestQuicSpdyClientSession::TestQuicSpdyClientSession(
369 QuicConnection* connection,
370 const QuicConfig& config,
371 const QuicServerId& server_id,
372 QuicCryptoClientConfig* crypto_config)
rtennetid39bd762015-06-12 01:05:52373 : QuicClientSessionBase(connection, config) {
374 crypto_stream_.reset(new QuicCryptoClientStream(
375 server_id, this, CryptoTestUtils::ProofVerifyContextForTesting(),
376 crypto_config));
377 Initialize();
[email protected]90f62f092014-03-24 02:41:23378}
379
rtennetib865eb82015-06-17 20:21:46380TestQuicSpdyClientSession::~TestQuicSpdyClientSession() {
381}
[email protected]90f62f092014-03-24 02:41:23382
rtennetib865eb82015-06-17 20:21:46383QuicCryptoClientStream* TestQuicSpdyClientSession::GetCryptoStream() {
rtennetid39bd762015-06-12 01:05:52384 return crypto_stream_.get();
rtennetia2ea9162015-05-15 19:26:44385}
386
[email protected]cbd731e2013-10-24 00:20:39387MockPacketWriter::MockPacketWriter() {
388}
389
390MockPacketWriter::~MockPacketWriter() {
391}
392
[email protected]fee17f72013-02-03 07:47:41393MockSendAlgorithm::MockSendAlgorithm() {
[email protected]8d659e22013-01-19 04:26:10394}
395
[email protected]fee17f72013-02-03 07:47:41396MockSendAlgorithm::~MockSendAlgorithm() {
[email protected]8d659e22013-01-19 04:26:10397}
398
[email protected]3aa9ca72014-02-27 19:39:43399MockLossAlgorithm::MockLossAlgorithm() {
400}
401
402MockLossAlgorithm::~MockLossAlgorithm() {
403}
404
[email protected]97cf3022013-09-05 14:30:16405MockAckNotifierDelegate::MockAckNotifierDelegate() {
406}
407
408MockAckNotifierDelegate::~MockAckNotifierDelegate() {
409}
410
[email protected]a692ad9d2014-07-18 21:35:24411MockNetworkChangeVisitor::MockNetworkChangeVisitor() {
412}
413
414MockNetworkChangeVisitor::~MockNetworkChangeVisitor() {
415}
416
[email protected]8b37a092012-10-18 21:53:49417namespace {
418
419string HexDumpWithMarks(const char* data, int length,
420 const bool* marks, int mark_length) {
421 static const char kHexChars[] = "0123456789abcdef";
422 static const int kColumns = 4;
423
424 const int kSizeLimit = 1024;
425 if (length > kSizeLimit || mark_length > kSizeLimit) {
426 LOG(ERROR) << "Only dumping first " << kSizeLimit << " bytes.";
427 length = min(length, kSizeLimit);
428 mark_length = min(mark_length, kSizeLimit);
429 }
430
431 string hex;
432 for (const char* row = data; length > 0;
433 row += kColumns, length -= kColumns) {
434 for (const char *p = row; p < row + 4; ++p) {
435 if (p < row + length) {
436 const bool mark =
437 (marks && (p - data) < mark_length && marks[p - data]);
438 hex += mark ? '*' : ' ';
439 hex += kHexChars[(*p & 0xf0) >> 4];
440 hex += kHexChars[*p & 0x0f];
441 hex += mark ? '*' : ' ';
442 } else {
443 hex += " ";
444 }
445 }
446 hex = hex + " ";
447
rtenneti6f48aa92015-03-16 02:18:48448 for (const char* p = row; p < row + 4 && p < row + length; ++p) {
[email protected]8b37a092012-10-18 21:53:49449 hex += (*p >= 0x20 && *p <= 0x7f) ? (*p) : '.';
rtenneti6f48aa92015-03-16 02:18:48450 }
[email protected]8b37a092012-10-18 21:53:49451
452 hex = hex + '\n';
453 }
454 return hex;
455}
456
457} // namespace
458
[email protected]300ccd52014-01-25 08:00:19459IPAddressNumber TestPeerIPAddress() { return Loopback4(); }
460
[email protected]b007e632013-10-28 08:39:25461QuicVersion QuicVersionMax() { return QuicSupportedVersions().front(); }
462
463QuicVersion QuicVersionMin() { return QuicSupportedVersions().back(); }
464
[email protected]c05a6d222013-12-16 19:42:03465IPAddressNumber Loopback4() {
[email protected]300ccd52014-01-25 08:00:19466 IPAddressNumber addr;
467 CHECK(ParseIPLiteralToNumber("127.0.0.1", &addr));
[email protected]c05a6d222013-12-16 19:42:03468 return addr;
469}
470
[email protected]730b35d72014-06-05 03:23:22471IPAddressNumber Loopback6() {
472 IPAddressNumber addr;
473 CHECK(ParseIPLiteralToNumber("::1", &addr));
474 return addr;
475}
476
rtennetie0ee6eb2015-05-01 00:55:09477IPAddressNumber Any4() {
478 IPAddressNumber any4;
479 CHECK(net::ParseIPLiteralToNumber("0.0.0.0", &any4));
480 return any4;
481}
482
[email protected]9bb57c72014-03-31 20:36:04483void GenerateBody(string* body, int length) {
484 body->clear();
485 body->reserve(length);
486 for (int i = 0; i < length; ++i) {
487 body->append(1, static_cast<char>(32 + i % (126 - 32)));
488 }
489}
490
[email protected]ffc34bf2014-03-07 02:42:02491QuicEncryptedPacket* ConstructEncryptedPacket(
492 QuicConnectionId connection_id,
493 bool version_flag,
494 bool reset_flag,
495 QuicPacketSequenceNumber sequence_number,
496 const string& data) {
rtenneti9e0fb502015-03-08 06:07:16497 return ConstructEncryptedPacket(
498 connection_id, version_flag, reset_flag, sequence_number, data,
499 PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_SEQUENCE_NUMBER);
500}
501
502QuicEncryptedPacket* ConstructEncryptedPacket(
503 QuicConnectionId connection_id,
504 bool version_flag,
505 bool reset_flag,
506 QuicPacketSequenceNumber sequence_number,
507 const string& data,
508 QuicConnectionIdLength connection_id_length,
509 QuicSequenceNumberLength sequence_number_length) {
rchc0815442015-04-18 13:29:46510 return ConstructEncryptedPacket(connection_id, version_flag, reset_flag,
511 sequence_number, data, connection_id_length,
512 sequence_number_length, nullptr);
513}
514
515QuicEncryptedPacket* ConstructEncryptedPacket(
516 QuicConnectionId connection_id,
517 bool version_flag,
518 bool reset_flag,
519 QuicPacketSequenceNumber sequence_number,
520 const string& data,
521 QuicConnectionIdLength connection_id_length,
522 QuicSequenceNumberLength sequence_number_length,
523 QuicVersionVector* versions) {
[email protected]ffc34bf2014-03-07 02:42:02524 QuicPacketHeader header;
525 header.public_header.connection_id = connection_id;
rtenneti9e0fb502015-03-08 06:07:16526 header.public_header.connection_id_length = connection_id_length;
[email protected]ffc34bf2014-03-07 02:42:02527 header.public_header.version_flag = version_flag;
528 header.public_header.reset_flag = reset_flag;
rtenneti9e0fb502015-03-08 06:07:16529 header.public_header.sequence_number_length = sequence_number_length;
[email protected]ffc34bf2014-03-07 02:42:02530 header.packet_sequence_number = sequence_number;
531 header.entropy_flag = false;
532 header.entropy_hash = 0;
533 header.fec_flag = false;
534 header.is_in_fec_group = NOT_IN_FEC_GROUP;
535 header.fec_group = 0;
rtennetia4228ea2015-06-04 02:31:44536 QuicStreamFrame stream_frame(1, false, 0, StringPiece(data));
[email protected]ffc34bf2014-03-07 02:42:02537 QuicFrame frame(&stream_frame);
538 QuicFrames frames;
539 frames.push_back(frame);
rchc0815442015-04-18 13:29:46540 QuicFramer framer(versions != nullptr ? *versions : QuicSupportedVersions(),
541 QuicTime::Zero(), Perspective::IS_CLIENT);
542
[email protected]ffc34bf2014-03-07 02:42:02543 scoped_ptr<QuicPacket> packet(
rtennetib6ac61a52015-02-11 20:20:52544 BuildUnsizedDataPacket(&framer, header, frames));
rtennetibe635732014-10-02 22:51:42545 EXPECT_TRUE(packet != nullptr);
rtennetie0ee6eb2015-05-01 00:55:09546 char buffer[kMaxPacketSize];
rtennetid7d78b02015-06-17 16:54:34547 scoped_ptr<QuicEncryptedPacket> encrypted(framer.EncryptPayload(
rtennetie0ee6eb2015-05-01 00:55:09548 ENCRYPTION_NONE, sequence_number, *packet, buffer, kMaxPacketSize));
rtennetibe635732014-10-02 22:51:42549 EXPECT_TRUE(encrypted != nullptr);
rtennetie0ee6eb2015-05-01 00:55:09550 return encrypted->Clone();
[email protected]ffc34bf2014-03-07 02:42:02551}
552
rchc0815442015-04-18 13:29:46553QuicEncryptedPacket* ConstructMisFramedEncryptedPacket(
554 QuicConnectionId connection_id,
555 bool version_flag,
556 bool reset_flag,
557 QuicPacketSequenceNumber sequence_number,
558 const string& data,
559 QuicConnectionIdLength connection_id_length,
560 QuicSequenceNumberLength sequence_number_length,
561 QuicVersionVector* versions) {
562 QuicPacketHeader header;
563 header.public_header.connection_id = connection_id;
564 header.public_header.connection_id_length = connection_id_length;
565 header.public_header.version_flag = version_flag;
566 header.public_header.reset_flag = reset_flag;
567 header.public_header.sequence_number_length = sequence_number_length;
568 header.packet_sequence_number = sequence_number;
569 header.entropy_flag = false;
570 header.entropy_hash = 0;
571 header.fec_flag = false;
572 header.is_in_fec_group = NOT_IN_FEC_GROUP;
573 header.fec_group = 0;
rtennetia4228ea2015-06-04 02:31:44574 QuicStreamFrame stream_frame(1, false, 0, StringPiece(data));
rtenneti85816fdf2015-05-25 03:01:10575 QuicFrame frame(&stream_frame);
rchc0815442015-04-18 13:29:46576 QuicFrames frames;
rtenneti85816fdf2015-05-25 03:01:10577 frames.push_back(frame);
578 QuicFramer framer(versions != nullptr ? *versions : QuicSupportedVersions(),
rchc0815442015-04-18 13:29:46579 QuicTime::Zero(), Perspective::IS_CLIENT);
rtenneti85816fdf2015-05-25 03:01:10580
rchc0815442015-04-18 13:29:46581 scoped_ptr<QuicPacket> packet(
582 BuildUnsizedDataPacket(&framer, header, frames));
583 EXPECT_TRUE(packet != nullptr);
rtenneti85816fdf2015-05-25 03:01:10584
585 // Now set the packet's private flags byte to 0xFF, which is an invalid value.
586 reinterpret_cast<unsigned char*>(
587 packet->mutable_data())[GetStartOfEncryptedData(
588 connection_id_length, version_flag, sequence_number_length)] = 0xFF;
589
rtennetie0ee6eb2015-05-01 00:55:09590 char buffer[kMaxPacketSize];
rtennetid7d78b02015-06-17 16:54:34591 scoped_ptr<QuicEncryptedPacket> encrypted(framer.EncryptPayload(
rtennetie0ee6eb2015-05-01 00:55:09592 ENCRYPTION_NONE, sequence_number, *packet, buffer, kMaxPacketSize));
rchc0815442015-04-18 13:29:46593 EXPECT_TRUE(encrypted != nullptr);
rtennetie0ee6eb2015-05-01 00:55:09594 return encrypted->Clone();
rchc0815442015-04-18 13:29:46595}
596
[email protected]8b37a092012-10-18 21:53:49597void CompareCharArraysWithHexError(
598 const string& description,
599 const char* actual,
600 const int actual_len,
601 const char* expected,
602 const int expected_len) {
[email protected]b007e632013-10-28 08:39:25603 EXPECT_EQ(actual_len, expected_len);
[email protected]8b37a092012-10-18 21:53:49604 const int min_len = min(actual_len, expected_len);
605 const int max_len = max(actual_len, expected_len);
[email protected]4356f0f2013-04-07 00:58:17606 scoped_ptr<bool[]> marks(new bool[max_len]);
[email protected]8b37a092012-10-18 21:53:49607 bool identical = (actual_len == expected_len);
608 for (int i = 0; i < min_len; ++i) {
609 if (actual[i] != expected[i]) {
610 marks[i] = true;
611 identical = false;
612 } else {
613 marks[i] = false;
614 }
615 }
616 for (int i = min_len; i < max_len; ++i) {
617 marks[i] = true;
618 }
619 if (identical) return;
620 ADD_FAILURE()
621 << "Description:\n"
622 << description
623 << "\n\nExpected:\n"
624 << HexDumpWithMarks(expected, expected_len, marks.get(), max_len)
625 << "\nActual:\n"
626 << HexDumpWithMarks(actual, actual_len, marks.get(), max_len);
627}
628
[email protected]b12764d2013-12-02 22:28:30629bool DecodeHexString(const base::StringPiece& hex, std::string* bytes) {
630 bytes->clear();
631 if (hex.empty())
632 return true;
633 std::vector<uint8> v;
634 if (!base::HexStringToBytes(hex.as_string(), &v))
635 return false;
636 if (!v.empty())
637 bytes->assign(reinterpret_cast<const char*>(&v[0]), v.size());
638 return true;
639}
640
[email protected]d3d15bf2013-01-30 02:51:54641static QuicPacket* ConstructPacketFromHandshakeMessage(
[email protected]3aa9ca72014-02-27 19:39:43642 QuicConnectionId connection_id,
[email protected]14e8106c2013-03-14 16:25:33643 const CryptoHandshakeMessage& message,
644 bool should_include_version) {
[email protected]8b37a092012-10-18 21:53:49645 CryptoFramer crypto_framer;
[email protected]dc2cc742012-10-21 13:56:13646 scoped_ptr<QuicData> data(crypto_framer.ConstructHandshakeMessage(message));
rtenneti6f48aa92015-03-16 02:18:48647 QuicFramer quic_framer(QuicSupportedVersions(), QuicTime::Zero(),
648 Perspective::IS_CLIENT);
[email protected]8b37a092012-10-18 21:53:49649
650 QuicPacketHeader header;
[email protected]3aa9ca72014-02-27 19:39:43651 header.public_header.connection_id = connection_id;
[email protected]9db443912013-02-25 05:27:03652 header.public_header.reset_flag = false;
[email protected]14e8106c2013-03-14 16:25:33653 header.public_header.version_flag = should_include_version;
[email protected]8b37a092012-10-18 21:53:49654 header.packet_sequence_number = 1;
[email protected]9db443912013-02-25 05:27:03655 header.entropy_flag = false;
656 header.entropy_hash = 0;
657 header.fec_flag = false;
[email protected]8b37a092012-10-18 21:53:49658 header.fec_group = 0;
659
[email protected]be24ab22012-10-22 03:01:52660 QuicStreamFrame stream_frame(kCryptoStreamId, false, 0,
rtennetia4228ea2015-06-04 02:31:44661 data->AsStringPiece());
[email protected]8b37a092012-10-18 21:53:49662
[email protected]be24ab22012-10-22 03:01:52663 QuicFrame frame(&stream_frame);
664 QuicFrames frames;
665 frames.push_back(frame);
rtennetib6ac61a52015-02-11 20:20:52666 return BuildUnsizedDataPacket(&quic_framer, header, frames);
[email protected]8b37a092012-10-18 21:53:49667}
668
[email protected]3aa9ca72014-02-27 19:39:43669QuicPacket* ConstructHandshakePacket(QuicConnectionId connection_id,
670 QuicTag tag) {
[email protected]d3d15bf2013-01-30 02:51:54671 CryptoHandshakeMessage message;
[email protected]ccc66e8a2013-03-26 08:26:14672 message.set_tag(tag);
[email protected]3aa9ca72014-02-27 19:39:43673 return ConstructPacketFromHandshakeMessage(connection_id, message, false);
[email protected]d3d15bf2013-01-30 02:51:54674}
675
[email protected]ea825e02013-08-21 18:12:45676size_t GetPacketLengthForOneStream(
677 QuicVersion version,
678 bool include_version,
rtenneti23186682014-10-30 01:49:33679 QuicConnectionIdLength connection_id_length,
[email protected]ea825e02013-08-21 18:12:45680 QuicSequenceNumberLength sequence_number_length,
681 InFecGroup is_in_fec_group,
682 size_t* payload_length) {
[email protected]f62262b2013-07-05 20:57:30683 *payload_length = 1;
684 const size_t stream_length =
[email protected]5dafdb62013-11-14 01:24:26685 NullEncrypter().GetCiphertextSize(*payload_length) +
[email protected]b064310782013-05-30 21:12:17686 QuicPacketCreator::StreamFramePacketOverhead(
[email protected]310d37b2014-08-02 06:15:37687 PACKET_8BYTE_CONNECTION_ID, include_version,
[email protected]aa7e4ef2014-05-28 03:53:15688 sequence_number_length, 0u, is_in_fec_group);
[email protected]5dafdb62013-11-14 01:24:26689 const size_t ack_length = NullEncrypter().GetCiphertextSize(
[email protected]8e01c062013-10-31 07:35:31690 QuicFramer::GetMinAckFrameSize(
[email protected]310d37b2014-08-02 06:15:37691 sequence_number_length, PACKET_1BYTE_SEQUENCE_NUMBER)) +
rtenneti23186682014-10-30 01:49:33692 GetPacketHeaderSize(connection_id_length, include_version,
[email protected]ea825e02013-08-21 18:12:45693 sequence_number_length, is_in_fec_group);
[email protected]f62262b2013-07-05 20:57:30694 if (stream_length < ack_length) {
695 *payload_length = 1 + ack_length - stream_length;
696 }
697
[email protected]5dafdb62013-11-14 01:24:26698 return NullEncrypter().GetCiphertextSize(*payload_length) +
[email protected]f62262b2013-07-05 20:57:30699 QuicPacketCreator::StreamFramePacketOverhead(
rtenneti23186682014-10-30 01:49:33700 connection_id_length, include_version,
[email protected]aa7e4ef2014-05-28 03:53:15701 sequence_number_length, 0u, is_in_fec_group);
[email protected]5351cc4b2013-03-03 07:22:41702}
703
[email protected]a5b98172014-06-18 07:01:59704TestEntropyCalculator::TestEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31705
[email protected]a5b98172014-06-18 07:01:59706TestEntropyCalculator::~TestEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31707
[email protected]48878092013-07-26 14:51:56708QuicPacketEntropyHash TestEntropyCalculator::EntropyHash(
[email protected]9db443912013-02-25 05:27:03709 QuicPacketSequenceNumber sequence_number) const {
710 return 1u;
711}
712
[email protected]a5b98172014-06-18 07:01:59713MockEntropyCalculator::MockEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31714
[email protected]a5b98172014-06-18 07:01:59715MockEntropyCalculator::~MockEntropyCalculator() {}
[email protected]8e01c062013-10-31 07:35:31716
[email protected]b064310782013-05-30 21:12:17717QuicConfig DefaultQuicConfig() {
718 QuicConfig config;
[email protected]7d561352014-06-20 09:09:21719 config.SetInitialStreamFlowControlWindowToSend(
720 kInitialStreamFlowControlWindowForTest);
721 config.SetInitialSessionFlowControlWindowToSend(
722 kInitialSessionFlowControlWindowForTest);
[email protected]b064310782013-05-30 21:12:17723 return config;
724}
725
rtennetia2ea9162015-05-15 19:26:44726QuicConfig DefaultQuicConfigStatelessRejects() {
727 QuicConfig config = DefaultQuicConfig();
728 QuicTagVector copt;
729 copt.push_back(kSREJ);
730 config.SetConnectionOptionsToSend(copt);
731 return config;
732}
733
[email protected]4d640792013-12-18 22:21:08734QuicVersionVector SupportedVersions(QuicVersion version) {
735 QuicVersionVector versions;
736 versions.push_back(version);
737 return versions;
738}
739
rtennetibe635732014-10-02 22:51:42740TestWriterFactory::TestWriterFactory() : current_writer_(nullptr) {}
[email protected]6d515822014-08-22 01:58:06741TestWriterFactory::~TestWriterFactory() {}
742
rchc99f380c2015-03-26 19:50:56743QuicPacketWriter* TestWriterFactory::Create(QuicPacketWriter* writer,
[email protected]6d515822014-08-22 01:58:06744 QuicConnection* connection) {
745 return new PerConnectionPacketWriter(this, writer, connection);
746}
747
748void TestWriterFactory::OnPacketSent(WriteResult result) {
rtennetibe635732014-10-02 22:51:42749 if (current_writer_ != nullptr && result.status == WRITE_STATUS_ERROR) {
[email protected]ca4e0d92014-08-22 16:33:22750 current_writer_->connection()->OnWriteError(result.error_code);
rtennetibe635732014-10-02 22:51:42751 current_writer_ = nullptr;
[email protected]6d515822014-08-22 01:58:06752 }
753}
754
755void TestWriterFactory::Unregister(PerConnectionPacketWriter* writer) {
756 if (current_writer_ == writer) {
rtennetibe635732014-10-02 22:51:42757 current_writer_ = nullptr;
[email protected]6d515822014-08-22 01:58:06758 }
759}
760
761TestWriterFactory::PerConnectionPacketWriter::PerConnectionPacketWriter(
762 TestWriterFactory* factory,
rchc99f380c2015-03-26 19:50:56763 QuicPacketWriter* writer,
[email protected]6d515822014-08-22 01:58:06764 QuicConnection* connection)
765 : QuicPerConnectionPacketWriter(writer, connection),
766 factory_(factory) {
767}
768
769TestWriterFactory::PerConnectionPacketWriter::~PerConnectionPacketWriter() {
770 factory_->Unregister(this);
771}
772
773WriteResult TestWriterFactory::PerConnectionPacketWriter::WritePacket(
774 const char* buffer,
775 size_t buf_len,
776 const IPAddressNumber& self_address,
777 const IPEndPoint& peer_address) {
rtennetibe635732014-10-02 22:51:42778 // A DCHECK(factory_current_writer_ == nullptr) would be wrong here -- this
779 // class may be used in a setting where connection()->OnPacketSent() is called
780 // in a different way, so TestWriterFactory::OnPacketSent might never be
781 // called.
[email protected]6d515822014-08-22 01:58:06782 factory_->current_writer_ = this;
rtennetia2ea9162015-05-15 19:26:44783 return tools::QuicPerConnectionPacketWriter::WritePacket(
784 buffer, buf_len, self_address, peer_address);
[email protected]6d515822014-08-22 01:58:06785}
786
rtenneti95293802015-03-27 18:59:23787MockQuicConnectionDebugVisitor::MockQuicConnectionDebugVisitor() {
788}
789
790MockQuicConnectionDebugVisitor::~MockQuicConnectionDebugVisitor() {
791}
792
rtennetid39bd762015-06-12 01:05:52793void CreateClientSessionForTest(QuicServerId server_id,
794 bool supports_stateless_rejects,
795 QuicTime::Delta connection_start_time,
796 QuicCryptoClientConfig* crypto_client_config,
797 PacketSavingConnection** client_connection,
rtennetib865eb82015-06-17 20:21:46798 TestQuicSpdyClientSession** client_session) {
rtennetia2ea9162015-05-15 19:26:44799 CHECK(crypto_client_config);
800 CHECK(client_connection);
801 CHECK(client_session);
rtennetia2ea9162015-05-15 19:26:44802 CHECK(!connection_start_time.IsZero())
803 << "Connections must start at non-zero times, otherwise the "
804 << "strike-register will be unhappy.";
805
806 QuicConfig config = supports_stateless_rejects
807 ? DefaultQuicConfigStatelessRejects()
808 : DefaultQuicConfig();
809 *client_connection = new PacketSavingConnection(Perspective::IS_CLIENT);
rtennetib865eb82015-06-17 20:21:46810 *client_session = new TestQuicSpdyClientSession(
811 *client_connection, config, server_id, crypto_client_config);
rtennetia2ea9162015-05-15 19:26:44812 (*client_connection)->AdvanceTime(connection_start_time);
813}
814
rtennetid39bd762015-06-12 01:05:52815void CreateServerSessionForTest(QuicServerId server_id,
816 QuicTime::Delta connection_start_time,
817 QuicCryptoServerConfig* server_crypto_config,
818 PacketSavingConnection** server_connection,
rtennetib865eb82015-06-17 20:21:46819 TestQuicSpdyServerSession** server_session) {
rtennetia2ea9162015-05-15 19:26:44820 CHECK(server_crypto_config);
821 CHECK(server_connection);
822 CHECK(server_session);
rtennetia2ea9162015-05-15 19:26:44823 CHECK(!connection_start_time.IsZero())
824 << "Connections must start at non-zero times, otherwise the "
825 << "strike-register will be unhappy.";
826
827 *server_connection = new PacketSavingConnection(Perspective::IS_SERVER);
rtennetib865eb82015-06-17 20:21:46828 *server_session = new TestQuicSpdyServerSession(
rtennetid39bd762015-06-12 01:05:52829 *server_connection, DefaultQuicConfig(), server_crypto_config);
rtennetia2ea9162015-05-15 19:26:44830
831 // We advance the clock initially because the default time is zero and the
832 // strike register worries that we've just overflowed a uint32 time.
833 (*server_connection)->AdvanceTime(connection_start_time);
834}
835
[email protected]8b37a092012-10-18 21:53:49836} // namespace test
[email protected]8b37a092012-10-18 21:53:49837} // namespace net