blob: f428e879a396bc83448ce03a70e7045e683f66f8 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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// Common utilities for Quic tests
6
7#ifndef QUICHE_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_
8#define QUICHE_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_
9
10#include <cstdint>
11#include <memory>
12#include <string>
13#include <utility>
14#include <vector>
15
QUICHE teama6ef0a62019-03-07 20:34:33 -050016#include "net/third_party/quiche/src/quic/core/congestion_control/loss_detection_interface.h"
17#include "net/third_party/quiche/src/quic/core/congestion_control/send_algorithm_interface.h"
18#include "net/third_party/quiche/src/quic/core/http/quic_client_push_promise_index.h"
19#include "net/third_party/quiche/src/quic/core/http/quic_server_session_base.h"
20#include "net/third_party/quiche/src/quic/core/quic_connection.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050021#include "net/third_party/quiche/src/quic/core/quic_framer.h"
22#include "net/third_party/quiche/src/quic/core/quic_packet_writer.h"
23#include "net/third_party/quiche/src/quic/core/quic_sent_packet_manager.h"
24#include "net/third_party/quiche/src/quic/core/quic_simple_buffer_allocator.h"
25#include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice_storage.h"
bncf6f82b12019-10-30 07:01:01 -070026#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050027#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
dschinazi580d30b2019-04-26 15:05:20 -070028#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050029#include "net/third_party/quiche/src/quic/test_tools/mock_clock.h"
30#include "net/third_party/quiche/src/quic/test_tools/mock_quic_session_visitor.h"
31#include "net/third_party/quiche/src/quic/test_tools/mock_random.h"
32
33namespace quic {
34
35namespace test {
36
37// A generic predictable connection ID suited for testing.
38QuicConnectionId TestConnectionId();
39
40// A generic predictable connection ID suited for testing, generated from a
41// given number, such as an index.
42QuicConnectionId TestConnectionId(uint64_t connection_number);
43
QUICHE team8e2e4532019-03-14 14:37:56 -070044// A generic predictable connection ID suited for testing, generated from a
45// given number, such as an index. Guaranteed to be 9 bytes long.
46QuicConnectionId TestConnectionIdNineBytesLong(uint64_t connection_number);
47
QUICHE teama6ef0a62019-03-07 20:34:33 -050048// Extracts the connection number passed to TestConnectionId().
49uint64_t TestConnectionIdToUInt64(QuicConnectionId connection_id);
50
51static const uint16_t kTestPort = 12345;
52static const uint32_t kInitialStreamFlowControlWindowForTest =
53 1024 * 1024; // 1 MB
54static const uint32_t kInitialSessionFlowControlWindowForTest =
55 1536 * 1024; // 1.5 MB
56
57// Returns the test peer IP address.
58QuicIpAddress TestPeerIPAddress();
59
60// Upper limit on versions we support.
61ParsedQuicVersion QuicVersionMax();
62
63// Lower limit on versions we support.
64ParsedQuicVersion QuicVersionMin();
65
66// Upper limit on versions we support.
67// TODO(nharper): Remove this function when it is no longer used.
68QuicTransportVersion QuicTransportVersionMax();
69
70// Lower limit on versions we support.
71// TODO(nharper): Remove this function when it is no longer used.
72QuicTransportVersion QuicTransportVersionMin();
73
74// Create an encrypted packet for testing.
75// If versions == nullptr, uses &AllSupportedVersions().
76// Note that the packet is encrypted with NullEncrypter, so to decrypt the
77// constructed packet, the framer must be set to use NullDecrypter.
78QuicEncryptedPacket* ConstructEncryptedPacket(
79 QuicConnectionId destination_connection_id,
80 QuicConnectionId source_connection_id,
81 bool version_flag,
82 bool reset_flag,
83 uint64_t packet_number,
vasilvvc48c8712019-03-11 13:38:16 -070084 const std::string& data,
fayange3f2f7b2019-09-19 17:01:57 -070085 bool full_padding,
QUICHE teama6ef0a62019-03-07 20:34:33 -050086 QuicConnectionIdIncluded destination_connection_id_included,
87 QuicConnectionIdIncluded source_connection_id_included,
88 QuicPacketNumberLength packet_number_length,
89 ParsedQuicVersionVector* versions,
90 Perspective perspective);
91
fayange3f2f7b2019-09-19 17:01:57 -070092QuicEncryptedPacket* ConstructEncryptedPacket(
93 QuicConnectionId destination_connection_id,
94 QuicConnectionId source_connection_id,
95 bool version_flag,
96 bool reset_flag,
97 uint64_t packet_number,
98 const std::string& data,
99 bool full_padding,
100 QuicConnectionIdIncluded destination_connection_id_included,
101 QuicConnectionIdIncluded source_connection_id_included,
102 QuicPacketNumberLength packet_number_length,
103 ParsedQuicVersionVector* versions);
104
QUICHE teama6ef0a62019-03-07 20:34:33 -0500105// Create an encrypted packet for testing.
106// If versions == nullptr, uses &AllSupportedVersions().
107// Note that the packet is encrypted with NullEncrypter, so to decrypt the
108// constructed packet, the framer must be set to use NullDecrypter.
109QuicEncryptedPacket* ConstructEncryptedPacket(
110 QuicConnectionId destination_connection_id,
111 QuicConnectionId source_connection_id,
112 bool version_flag,
113 bool reset_flag,
114 uint64_t packet_number,
vasilvvc48c8712019-03-11 13:38:16 -0700115 const std::string& data,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500116 QuicConnectionIdIncluded destination_connection_id_included,
117 QuicConnectionIdIncluded source_connection_id_included,
118 QuicPacketNumberLength packet_number_length,
119 ParsedQuicVersionVector* versions);
120
121// This form assumes |versions| == nullptr.
122QuicEncryptedPacket* ConstructEncryptedPacket(
123 QuicConnectionId destination_connection_id,
124 QuicConnectionId source_connection_id,
125 bool version_flag,
126 bool reset_flag,
127 uint64_t packet_number,
vasilvvc48c8712019-03-11 13:38:16 -0700128 const std::string& data,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500129 QuicConnectionIdIncluded destination_connection_id_included,
130 QuicConnectionIdIncluded source_connection_id_included,
131 QuicPacketNumberLength packet_number_length);
132
133// This form assumes |connection_id_length| == PACKET_8BYTE_CONNECTION_ID,
134// |packet_number_length| == PACKET_4BYTE_PACKET_NUMBER and
135// |versions| == nullptr.
136QuicEncryptedPacket* ConstructEncryptedPacket(
137 QuicConnectionId destination_connection_id,
138 QuicConnectionId source_connection_id,
139 bool version_flag,
140 bool reset_flag,
141 uint64_t packet_number,
vasilvvc48c8712019-03-11 13:38:16 -0700142 const std::string& data);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500143
144// Constructs a received packet for testing. The caller must take ownership of
145// the returned pointer.
146QuicReceivedPacket* ConstructReceivedPacket(
147 const QuicEncryptedPacket& encrypted_packet,
148 QuicTime receipt_time);
149
150// Create an encrypted packet for testing whose data portion erroneous.
151// The specific way the data portion is erroneous is not specified, but
152// it is an error that QuicFramer detects.
153// Note that the packet is encrypted with NullEncrypter, so to decrypt the
154// constructed packet, the framer must be set to use NullDecrypter.
155QuicEncryptedPacket* ConstructMisFramedEncryptedPacket(
156 QuicConnectionId destination_connection_id,
157 QuicConnectionId source_connection_id,
158 bool version_flag,
159 bool reset_flag,
160 uint64_t packet_number,
vasilvvc48c8712019-03-11 13:38:16 -0700161 const std::string& data,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500162 QuicConnectionIdIncluded destination_connection_id_included,
163 QuicConnectionIdIncluded source_connection_id_included,
164 QuicPacketNumberLength packet_number_length,
bnc9711a9e2019-11-01 06:31:51 -0700165 ParsedQuicVersion version,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500166 Perspective perspective);
167
vasilvvc48c8712019-03-11 13:38:16 -0700168void CompareCharArraysWithHexError(const std::string& description,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500169 const char* actual,
170 const int actual_len,
171 const char* expected,
172 const int expected_len);
173
QUICHE teama6ef0a62019-03-07 20:34:33 -0500174// Returns QuicConfig set to default values.
175QuicConfig DefaultQuicConfig();
176
QUICHE teama6ef0a62019-03-07 20:34:33 -0500177// Returns a version vector consisting of |version|.
178QuicTransportVersionVector SupportedTransportVersions(
179 QuicTransportVersion version);
180
181ParsedQuicVersionVector SupportedVersions(ParsedQuicVersion version);
182
183struct QuicAckBlock {
184 QuicPacketNumber start; // Included
185 QuicPacketNumber limit; // Excluded
186};
187
188// Testing convenience method to construct a QuicAckFrame with arbitrary ack
189// blocks. Each block is given by a (closed-open) range of packet numbers. e.g.:
190// InitAckFrame({{1, 10}})
191// => 1 ack block acking packet numbers 1 to 9.
192//
193// InitAckFrame({{1, 2}, {3, 4}})
194// => 2 ack blocks acking packet 1 and 3. Packet 2 is missing.
195QuicAckFrame InitAckFrame(const std::vector<QuicAckBlock>& ack_blocks);
196
197// Testing convenience method to construct a QuicAckFrame with 1 ack block which
198// covers packet number range [1, |largest_acked| + 1).
199// Equivalent to InitAckFrame({{1, largest_acked + 1}})
200QuicAckFrame InitAckFrame(uint64_t largest_acked);
201QuicAckFrame InitAckFrame(QuicPacketNumber largest_acked);
202
203// Testing convenience method to construct a QuicAckFrame with |num_ack_blocks|
204// ack blocks of width 1 packet, starting from |least_unacked| + 2.
205QuicAckFrame MakeAckFrameWithAckBlocks(size_t num_ack_blocks,
206 uint64_t least_unacked);
207
nharper965e5922019-09-23 22:33:54 -0700208// Returns the encryption level that corresponds to the header type in
209// |header|. If the header is for GOOGLE_QUIC_PACKET instead of an
210// IETF-invariants packet, this function returns ENCRYPTION_INITIAL.
211EncryptionLevel HeaderToEncryptionLevel(const QuicPacketHeader& header);
212
QUICHE teama6ef0a62019-03-07 20:34:33 -0500213// Returns a QuicPacket that is owned by the caller, and
214// is populated with the fields in |header| and |frames|, or is nullptr if the
215// packet could not be created.
216std::unique_ptr<QuicPacket> BuildUnsizedDataPacket(
217 QuicFramer* framer,
218 const QuicPacketHeader& header,
219 const QuicFrames& frames);
220// Returns a QuicPacket that is owned by the caller, and of size |packet_size|.
221std::unique_ptr<QuicPacket> BuildUnsizedDataPacket(
222 QuicFramer* framer,
223 const QuicPacketHeader& header,
224 const QuicFrames& frames,
225 size_t packet_size);
226
vasilvvc48c8712019-03-11 13:38:16 -0700227// Compute SHA-1 hash of the supplied std::string.
228std::string Sha1Hash(QuicStringPiece data);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500229
bnc5b3c3be2019-06-25 10:37:09 -0700230// Delete |frame| and return true.
231bool ClearControlFrame(const QuicFrame& frame);
232
QUICHE teama6ef0a62019-03-07 20:34:33 -0500233// Simple random number generator used to compute random numbers suitable
vasilvvc2018482019-04-26 15:47:55 -0700234// for pseudo-randomly dropping packets in tests.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500235class SimpleRandom : public QuicRandom {
236 public:
vasilvvc2018482019-04-26 15:47:55 -0700237 SimpleRandom() { set_seed(0); }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500238 SimpleRandom(const SimpleRandom&) = delete;
239 SimpleRandom& operator=(const SimpleRandom&) = delete;
240 ~SimpleRandom() override {}
241
242 // Returns a random number in the range [0, kuint64max].
243 uint64_t RandUint64() override;
244
245 void RandBytes(void* data, size_t len) override;
246
vasilvvc2018482019-04-26 15:47:55 -0700247 void set_seed(uint64_t seed);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500248
249 private:
vasilvvc2018482019-04-26 15:47:55 -0700250 uint8_t buffer_[4096];
251 size_t buffer_offset_;
252 uint8_t key_[32];
253
254 void FillBuffer();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500255};
256
257class MockFramerVisitor : public QuicFramerVisitorInterface {
258 public:
259 MockFramerVisitor();
260 MockFramerVisitor(const MockFramerVisitor&) = delete;
261 MockFramerVisitor& operator=(const MockFramerVisitor&) = delete;
262 ~MockFramerVisitor() override;
263
264 MOCK_METHOD1(OnError, void(QuicFramer* framer));
265 // The constructor sets this up to return false by default.
fayang8aba1ff2019-06-21 12:00:54 -0700266 MOCK_METHOD1(OnProtocolVersionMismatch, bool(ParsedQuicVersion version));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500267 MOCK_METHOD0(OnPacket, void());
268 MOCK_METHOD1(OnPublicResetPacket, void(const QuicPublicResetPacket& header));
269 MOCK_METHOD1(OnVersionNegotiationPacket,
270 void(const QuicVersionNegotiationPacket& packet));
dschinazi244f6dc2019-05-06 15:45:16 -0700271 MOCK_METHOD3(OnRetryPacket,
272 void(QuicConnectionId original_connection_id,
273 QuicConnectionId new_connection_id,
274 QuicStringPiece retry_token));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500275 // The constructor sets this up to return true by default.
276 MOCK_METHOD1(OnUnauthenticatedHeader, bool(const QuicPacketHeader& header));
277 // The constructor sets this up to return true by default.
278 MOCK_METHOD1(OnUnauthenticatedPublicHeader,
279 bool(const QuicPacketHeader& header));
280 MOCK_METHOD1(OnDecryptedPacket, void(EncryptionLevel level));
281 MOCK_METHOD1(OnPacketHeader, bool(const QuicPacketHeader& header));
282 MOCK_METHOD1(OnCoalescedPacket, void(const QuicEncryptedPacket& packet));
dschinazi4b5a68a2019-08-15 15:45:36 -0700283 MOCK_METHOD3(OnUndecryptablePacket,
284 void(const QuicEncryptedPacket& packet,
285 EncryptionLevel decryption_level,
286 bool has_decryption_key));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500287 MOCK_METHOD1(OnStreamFrame, bool(const QuicStreamFrame& frame));
288 MOCK_METHOD1(OnCryptoFrame, bool(const QuicCryptoFrame& frame));
289 MOCK_METHOD2(OnAckFrameStart, bool(QuicPacketNumber, QuicTime::Delta));
290 MOCK_METHOD2(OnAckRange, bool(QuicPacketNumber, QuicPacketNumber));
291 MOCK_METHOD2(OnAckTimestamp, bool(QuicPacketNumber, QuicTime));
292 MOCK_METHOD1(OnAckFrameEnd, bool(QuicPacketNumber));
293 MOCK_METHOD1(OnStopWaitingFrame, bool(const QuicStopWaitingFrame& frame));
294 MOCK_METHOD1(OnPaddingFrame, bool(const QuicPaddingFrame& frame));
295 MOCK_METHOD1(OnPingFrame, bool(const QuicPingFrame& frame));
296 MOCK_METHOD1(OnRstStreamFrame, bool(const QuicRstStreamFrame& frame));
297 MOCK_METHOD1(OnConnectionCloseFrame,
298 bool(const QuicConnectionCloseFrame& frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500299 MOCK_METHOD1(OnNewConnectionIdFrame,
300 bool(const QuicNewConnectionIdFrame& frame));
301 MOCK_METHOD1(OnRetireConnectionIdFrame,
302 bool(const QuicRetireConnectionIdFrame& frame));
303 MOCK_METHOD1(OnNewTokenFrame, bool(const QuicNewTokenFrame& frame));
304 MOCK_METHOD1(OnStopSendingFrame, bool(const QuicStopSendingFrame& frame));
305 MOCK_METHOD1(OnPathChallengeFrame, bool(const QuicPathChallengeFrame& frame));
306 MOCK_METHOD1(OnPathResponseFrame, bool(const QuicPathResponseFrame& frame));
307 MOCK_METHOD1(OnGoAwayFrame, bool(const QuicGoAwayFrame& frame));
fkastenholz3c4eabf2019-04-22 07:49:59 -0700308 MOCK_METHOD1(OnMaxStreamsFrame, bool(const QuicMaxStreamsFrame& frame));
309 MOCK_METHOD1(OnStreamsBlockedFrame,
310 bool(const QuicStreamsBlockedFrame& frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500311 MOCK_METHOD1(OnWindowUpdateFrame, bool(const QuicWindowUpdateFrame& frame));
312 MOCK_METHOD1(OnBlockedFrame, bool(const QuicBlockedFrame& frame));
313 MOCK_METHOD1(OnMessageFrame, bool(const QuicMessageFrame& frame));
314 MOCK_METHOD0(OnPacketComplete, void());
315 MOCK_CONST_METHOD1(IsValidStatelessResetToken, bool(QuicUint128));
316 MOCK_METHOD1(OnAuthenticatedIetfStatelessResetPacket,
317 void(const QuicIetfStatelessResetPacket&));
318};
319
320class NoOpFramerVisitor : public QuicFramerVisitorInterface {
321 public:
322 NoOpFramerVisitor() {}
323 NoOpFramerVisitor(const NoOpFramerVisitor&) = delete;
324 NoOpFramerVisitor& operator=(const NoOpFramerVisitor&) = delete;
325
dschinazi17d42422019-06-18 16:35:07 -0700326 void OnError(QuicFramer* /*framer*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500327 void OnPacket() override {}
dschinazi17d42422019-06-18 16:35:07 -0700328 void OnPublicResetPacket(const QuicPublicResetPacket& /*packet*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500329 void OnVersionNegotiationPacket(
dschinazi17d42422019-06-18 16:35:07 -0700330 const QuicVersionNegotiationPacket& /*packet*/) override {}
331 void OnRetryPacket(QuicConnectionId /*original_connection_id*/,
332 QuicConnectionId /*new_connection_id*/,
333 QuicStringPiece /*retry_token*/) override {}
fayang8aba1ff2019-06-21 12:00:54 -0700334 bool OnProtocolVersionMismatch(ParsedQuicVersion version) override;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500335 bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override;
336 bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override;
dschinazi17d42422019-06-18 16:35:07 -0700337 void OnDecryptedPacket(EncryptionLevel /*level*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500338 bool OnPacketHeader(const QuicPacketHeader& header) override;
339 void OnCoalescedPacket(const QuicEncryptedPacket& packet) override;
dschinazi4b5a68a2019-08-15 15:45:36 -0700340 void OnUndecryptablePacket(const QuicEncryptedPacket& packet,
341 EncryptionLevel decryption_level,
342 bool has_decryption_key) override;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500343 bool OnStreamFrame(const QuicStreamFrame& frame) override;
344 bool OnCryptoFrame(const QuicCryptoFrame& frame) override;
345 bool OnAckFrameStart(QuicPacketNumber largest_acked,
346 QuicTime::Delta ack_delay_time) override;
347 bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override;
348 bool OnAckTimestamp(QuicPacketNumber packet_number,
349 QuicTime timestamp) override;
350 bool OnAckFrameEnd(QuicPacketNumber start) override;
351 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override;
352 bool OnPaddingFrame(const QuicPaddingFrame& frame) override;
353 bool OnPingFrame(const QuicPingFrame& frame) override;
354 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override;
355 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500356 bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override;
357 bool OnRetireConnectionIdFrame(
358 const QuicRetireConnectionIdFrame& frame) override;
359 bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override;
360 bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override;
361 bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override;
362 bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override;
363 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override;
fkastenholz3c4eabf2019-04-22 07:49:59 -0700364 bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override;
365 bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500366 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override;
367 bool OnBlockedFrame(const QuicBlockedFrame& frame) override;
368 bool OnMessageFrame(const QuicMessageFrame& frame) override;
369 void OnPacketComplete() override {}
370 bool IsValidStatelessResetToken(QuicUint128 token) const override;
371 void OnAuthenticatedIetfStatelessResetPacket(
dschinazi17d42422019-06-18 16:35:07 -0700372 const QuicIetfStatelessResetPacket& /*packet*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500373};
374
375class MockQuicConnectionVisitor : public QuicConnectionVisitorInterface {
376 public:
377 MockQuicConnectionVisitor();
378 MockQuicConnectionVisitor(const MockQuicConnectionVisitor&) = delete;
379 MockQuicConnectionVisitor& operator=(const MockQuicConnectionVisitor&) =
380 delete;
381 ~MockQuicConnectionVisitor() override;
382
383 MOCK_METHOD1(OnStreamFrame, void(const QuicStreamFrame& frame));
384 MOCK_METHOD1(OnCryptoFrame, void(const QuicCryptoFrame& frame));
385 MOCK_METHOD1(OnWindowUpdateFrame, void(const QuicWindowUpdateFrame& frame));
386 MOCK_METHOD1(OnBlockedFrame, void(const QuicBlockedFrame& frame));
387 MOCK_METHOD1(OnRstStream, void(const QuicRstStreamFrame& frame));
388 MOCK_METHOD1(OnGoAway, void(const QuicGoAwayFrame& frame));
389 MOCK_METHOD1(OnMessageReceived, void(QuicStringPiece message));
fkastenholz5d880a92019-06-21 09:01:56 -0700390 MOCK_METHOD2(OnConnectionClosed,
391 void(const QuicConnectionCloseFrame& frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500392 ConnectionCloseSource source));
393 MOCK_METHOD0(OnWriteBlocked, void());
394 MOCK_METHOD0(OnCanWrite, void());
QUICHE teamb8343252019-04-29 13:58:01 -0700395 MOCK_METHOD0(SendProbingData, bool());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500396 MOCK_METHOD1(OnCongestionWindowChange, void(QuicTime now));
397 MOCK_METHOD1(OnConnectionMigration, void(AddressChangeType type));
398 MOCK_METHOD0(OnPathDegrading, void());
399 MOCK_CONST_METHOD0(WillingAndAbleToWrite, bool());
400 MOCK_CONST_METHOD0(HasPendingHandshake, bool());
401 MOCK_CONST_METHOD0(ShouldKeepConnectionAlive, bool());
402 MOCK_METHOD1(OnSuccessfulVersionNegotiation,
403 void(const ParsedQuicVersion& version));
zhongyi83161e42019-08-19 09:06:25 -0700404 MOCK_METHOD3(OnPacketReceived,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500405 void(const QuicSocketAddress& self_address,
zhongyi83161e42019-08-19 09:06:25 -0700406 const QuicSocketAddress& peer_address,
407 bool is_connectivity_probe));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500408 MOCK_METHOD0(OnConfigNegotiated, void());
409 MOCK_METHOD0(OnAckNeedsRetransmittableFrame, void());
410 MOCK_METHOD0(SendPing, void());
411 MOCK_CONST_METHOD0(AllowSelfAddressChange, bool());
412 MOCK_METHOD0(OnForwardProgressConfirmed, void());
fkastenholz3c4eabf2019-04-22 07:49:59 -0700413 MOCK_METHOD1(OnMaxStreamsFrame, bool(const QuicMaxStreamsFrame& frame));
414 MOCK_METHOD1(OnStreamsBlockedFrame,
415 bool(const QuicStreamsBlockedFrame& frame));
renjietangeab918f2019-10-28 12:10:32 -0700416 MOCK_METHOD1(OnStopSendingFrame, void(const QuicStopSendingFrame& frame));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500417};
418
419class MockQuicConnectionHelper : public QuicConnectionHelperInterface {
420 public:
421 MockQuicConnectionHelper();
422 MockQuicConnectionHelper(const MockQuicConnectionHelper&) = delete;
423 MockQuicConnectionHelper& operator=(const MockQuicConnectionHelper&) = delete;
424 ~MockQuicConnectionHelper() override;
425 const QuicClock* GetClock() const override;
426 QuicRandom* GetRandomGenerator() override;
427 QuicBufferAllocator* GetStreamSendBufferAllocator() override;
428 void AdvanceTime(QuicTime::Delta delta);
429
430 private:
431 MockClock clock_;
432 MockRandom random_generator_;
433 SimpleBufferAllocator buffer_allocator_;
434};
435
436class MockAlarmFactory : public QuicAlarmFactory {
437 public:
438 QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) override;
439 QuicArenaScopedPtr<QuicAlarm> CreateAlarm(
440 QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
441 QuicConnectionArena* arena) override;
442
443 // No-op alarm implementation
444 class TestAlarm : public QuicAlarm {
445 public:
446 explicit TestAlarm(QuicArenaScopedPtr<QuicAlarm::Delegate> delegate)
447 : QuicAlarm(std::move(delegate)) {}
448
449 void SetImpl() override {}
450 void CancelImpl() override {}
451
452 using QuicAlarm::Fire;
453 };
454
455 void FireAlarm(QuicAlarm* alarm) {
456 reinterpret_cast<TestAlarm*>(alarm)->Fire();
457 }
458};
459
460class MockQuicConnection : public QuicConnection {
461 public:
462 // Uses a ConnectionId of 42 and 127.0.0.1:123.
463 MockQuicConnection(MockQuicConnectionHelper* helper,
464 MockAlarmFactory* alarm_factory,
465 Perspective perspective);
466
467 // Uses a ConnectionId of 42.
468 MockQuicConnection(QuicSocketAddress address,
469 MockQuicConnectionHelper* helper,
470 MockAlarmFactory* alarm_factory,
471 Perspective perspective);
472
473 // Uses 127.0.0.1:123.
474 MockQuicConnection(QuicConnectionId connection_id,
475 MockQuicConnectionHelper* helper,
476 MockAlarmFactory* alarm_factory,
477 Perspective perspective);
478
479 // Uses a ConnectionId of 42, and 127.0.0.1:123.
480 MockQuicConnection(MockQuicConnectionHelper* helper,
481 MockAlarmFactory* alarm_factory,
482 Perspective perspective,
483 const ParsedQuicVersionVector& supported_versions);
484
485 MockQuicConnection(QuicConnectionId connection_id,
486 QuicSocketAddress address,
487 MockQuicConnectionHelper* helper,
488 MockAlarmFactory* alarm_factory,
489 Perspective perspective,
490 const ParsedQuicVersionVector& supported_versions);
491 MockQuicConnection(const MockQuicConnection&) = delete;
492 MockQuicConnection& operator=(const MockQuicConnection&) = delete;
493
494 ~MockQuicConnection() override;
495
496 // If the constructor that uses a MockQuicConnectionHelper has been used then
497 // this method
498 // will advance the time of the MockClock.
499 void AdvanceTime(QuicTime::Delta delta);
500
501 MOCK_METHOD3(ProcessUdpPacket,
502 void(const QuicSocketAddress& self_address,
503 const QuicSocketAddress& peer_address,
504 const QuicReceivedPacket& packet));
505 MOCK_METHOD1(SendConnectionClose, void(QuicErrorCode error));
506 MOCK_METHOD3(CloseConnection,
507 void(QuicErrorCode error,
vasilvvc48c8712019-03-11 13:38:16 -0700508 const std::string& details,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500509 ConnectionCloseBehavior connection_close_behavior));
ianswettdc1e7ab2019-05-03 16:10:44 -0700510 MOCK_METHOD2(SendConnectionClosePacket,
511 void(QuicErrorCode error, const std::string& details));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500512 MOCK_METHOD3(SendRstStream,
513 void(QuicStreamId id,
514 QuicRstStreamErrorCode error,
515 QuicStreamOffset bytes_written));
516 MOCK_METHOD3(SendGoAway,
517 void(QuicErrorCode error,
518 QuicStreamId last_good_stream_id,
vasilvvc48c8712019-03-11 13:38:16 -0700519 const std::string& reason));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500520 MOCK_METHOD1(SendBlocked, void(QuicStreamId id));
521 MOCK_METHOD2(SendWindowUpdate,
522 void(QuicStreamId id, QuicStreamOffset byte_offset));
523 MOCK_METHOD0(OnCanWrite, void());
524 MOCK_METHOD1(SendConnectivityProbingResponsePacket,
525 void(const QuicSocketAddress& peer_address));
526 MOCK_METHOD2(SendConnectivityProbingPacket,
527 bool(QuicPacketWriter* probing_writer,
528 const QuicSocketAddress& peer_address));
529
530 MOCK_METHOD1(OnSendConnectionState, void(const CachedNetworkParameters&));
531 MOCK_METHOD2(ResumeConnectionState,
532 void(const CachedNetworkParameters&, bool));
533 MOCK_METHOD1(SetMaxPacingRate, void(QuicBandwidth));
534
535 MOCK_METHOD2(OnStreamReset, void(QuicStreamId, QuicRstStreamErrorCode));
536 MOCK_METHOD1(SendControlFrame, bool(const QuicFrame& frame));
537 MOCK_METHOD2(SendMessage, MessageStatus(QuicMessageId, QuicMemSliceSpan));
538 MOCK_METHOD3(OnConnectionClosed,
539 void(QuicErrorCode error,
vasilvvc48c8712019-03-11 13:38:16 -0700540 const std::string& error_details,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500541 ConnectionCloseSource source));
542
543 MOCK_METHOD1(OnError, void(QuicFramer* framer));
544 void QuicConnection_OnError(QuicFramer* framer) {
545 QuicConnection::OnError(framer);
546 }
547
548 void ReallyCloseConnection(
549 QuicErrorCode error,
vasilvvc48c8712019-03-11 13:38:16 -0700550 const std::string& details,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500551 ConnectionCloseBehavior connection_close_behavior) {
552 QuicConnection::CloseConnection(error, details, connection_close_behavior);
553 }
554
555 void ReallyProcessUdpPacket(const QuicSocketAddress& self_address,
556 const QuicSocketAddress& peer_address,
557 const QuicReceivedPacket& packet) {
558 QuicConnection::ProcessUdpPacket(self_address, peer_address, packet);
559 }
560
fayang8aba1ff2019-06-21 12:00:54 -0700561 bool OnProtocolVersionMismatch(ParsedQuicVersion version) override;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500562
563 bool ReallySendControlFrame(const QuicFrame& frame) {
564 return QuicConnection::SendControlFrame(frame);
565 }
566
567 bool ReallySendConnectivityProbingPacket(
568 QuicPacketWriter* probing_writer,
569 const QuicSocketAddress& peer_address) {
570 return QuicConnection::SendConnectivityProbingPacket(probing_writer,
571 peer_address);
572 }
573
574 void ReallySendConnectivityProbingResponsePacket(
575 const QuicSocketAddress& peer_address) {
576 QuicConnection::SendConnectivityProbingResponsePacket(peer_address);
577 }
578 MOCK_METHOD1(OnPathResponseFrame, bool(const QuicPathResponseFrame&));
579 MOCK_METHOD1(OnStopSendingFrame, bool(const QuicStopSendingFrame& frame));
580 MOCK_METHOD3(SendCryptoData,
581 size_t(EncryptionLevel, size_t, QuicStreamOffset));
582 size_t QuicConnection_SendCryptoData(EncryptionLevel level,
583 size_t write_length,
584 QuicStreamOffset offset) {
585 return QuicConnection::SendCryptoData(level, write_length, offset);
586 }
587};
588
589class PacketSavingConnection : public MockQuicConnection {
590 public:
591 PacketSavingConnection(MockQuicConnectionHelper* helper,
592 MockAlarmFactory* alarm_factory,
593 Perspective perspective);
594
595 PacketSavingConnection(MockQuicConnectionHelper* helper,
596 MockAlarmFactory* alarm_factory,
597 Perspective perspective,
598 const ParsedQuicVersionVector& supported_versions);
599 PacketSavingConnection(const PacketSavingConnection&) = delete;
600 PacketSavingConnection& operator=(const PacketSavingConnection&) = delete;
601
602 ~PacketSavingConnection() override;
603
604 void SendOrQueuePacket(SerializedPacket* packet) override;
605
606 std::vector<std::unique_ptr<QuicEncryptedPacket>> encrypted_packets_;
607 MockClock clock_;
608};
609
610class MockQuicSession : public QuicSession {
611 public:
612 // Takes ownership of |connection|.
613 MockQuicSession(QuicConnection* connection, bool create_mock_crypto_stream);
614
615 // Takes ownership of |connection|.
616 explicit MockQuicSession(QuicConnection* connection);
617 MockQuicSession(const MockQuicSession&) = delete;
618 MockQuicSession& operator=(const MockQuicSession&) = delete;
619 ~MockQuicSession() override;
620
621 QuicCryptoStream* GetMutableCryptoStream() override;
622 const QuicCryptoStream* GetCryptoStream() const override;
623 void SetCryptoStream(QuicCryptoStream* crypto_stream);
624
fkastenholz5d880a92019-06-21 09:01:56 -0700625 MOCK_METHOD2(OnConnectionClosed,
626 void(const QuicConnectionCloseFrame& frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500627 ConnectionCloseSource source));
628 MOCK_METHOD1(CreateIncomingStream, QuicStream*(QuicStreamId id));
renjietangbaea59c2019-05-29 15:08:14 -0700629 MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(PendingStream* stream));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500630 MOCK_METHOD1(ShouldCreateIncomingStream2, bool(QuicStreamId id));
631 MOCK_METHOD0(ShouldCreateOutgoingBidirectionalStream, bool());
632 MOCK_METHOD0(ShouldCreateOutgoingUnidirectionalStream, bool());
633 MOCK_METHOD5(WritevData,
634 QuicConsumedData(QuicStream* stream,
635 QuicStreamId id,
636 size_t write_length,
637 QuicStreamOffset offset,
638 StreamSendingState state));
639
640 MOCK_METHOD3(SendRstStream,
641 void(QuicStreamId stream_id,
642 QuicRstStreamErrorCode error,
643 QuicStreamOffset bytes_written));
644
645 MOCK_METHOD2(OnStreamHeaders,
646 void(QuicStreamId stream_id, QuicStringPiece headers_data));
647 MOCK_METHOD2(OnStreamHeadersPriority,
648 void(QuicStreamId stream_id, spdy::SpdyPriority priority));
649 MOCK_METHOD3(OnStreamHeadersComplete,
650 void(QuicStreamId stream_id, bool fin, size_t frame_len));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500651 MOCK_CONST_METHOD0(ShouldKeepConnectionAlive, bool());
652 MOCK_METHOD2(SendStopSending, void(uint16_t code, QuicStreamId stream_id));
nharper8a72e4f2019-08-13 19:17:08 -0700653 MOCK_METHOD1(OnCryptoHandshakeEvent, void(QuicSession::CryptoHandshakeEvent));
vasilvvad7424f2019-08-30 00:27:14 -0700654 MOCK_CONST_METHOD0(GetAlpnsToOffer, std::vector<std::string>());
655 MOCK_CONST_METHOD1(SelectAlpn,
656 std::vector<QuicStringPiece>::const_iterator(
657 const std::vector<QuicStringPiece>&));
658 MOCK_METHOD1(OnAlpnSelected, void(QuicStringPiece));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500659
660 using QuicSession::ActivateStream;
661
662 // Returns a QuicConsumedData that indicates all of |write_length| (and |fin|
663 // if set) has been consumed.
664 static QuicConsumedData ConsumeData(QuicStream* stream,
665 QuicStreamId id,
666 size_t write_length,
667 QuicStreamOffset offset,
668 StreamSendingState state);
669
670 private:
671 std::unique_ptr<QuicCryptoStream> crypto_stream_;
672};
673
674class MockQuicCryptoStream : public QuicCryptoStream {
675 public:
676 explicit MockQuicCryptoStream(QuicSession* session);
677
678 ~MockQuicCryptoStream() override;
679
680 bool encryption_established() const override;
681 bool handshake_confirmed() const override;
682 const QuicCryptoNegotiatedParameters& crypto_negotiated_params()
683 const override;
684 CryptoMessageParser* crypto_message_parser() override;
685
686 private:
687 QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> params_;
688 CryptoFramer crypto_framer_;
689};
690
691class MockQuicSpdySession : public QuicSpdySession {
692 public:
693 // Takes ownership of |connection|.
694 explicit MockQuicSpdySession(QuicConnection* connection);
695 // Takes ownership of |connection|.
696 MockQuicSpdySession(QuicConnection* connection,
697 bool create_mock_crypto_stream);
698 MockQuicSpdySession(const MockQuicSpdySession&) = delete;
699 MockQuicSpdySession& operator=(const MockQuicSpdySession&) = delete;
700 ~MockQuicSpdySession() override;
701
702 QuicCryptoStream* GetMutableCryptoStream() override;
703 const QuicCryptoStream* GetCryptoStream() const override;
704 void SetCryptoStream(QuicCryptoStream* crypto_stream);
705
fkastenholz5d880a92019-06-21 09:01:56 -0700706 void ReallyOnConnectionClosed(const QuicConnectionCloseFrame& frame,
QUICHE team396d1092019-03-20 10:21:07 -0700707 ConnectionCloseSource source) {
fkastenholz5d880a92019-06-21 09:01:56 -0700708 QuicSession::OnConnectionClosed(frame, source);
QUICHE team396d1092019-03-20 10:21:07 -0700709 }
710
QUICHE teama6ef0a62019-03-07 20:34:33 -0500711 // From QuicSession.
fkastenholz5d880a92019-06-21 09:01:56 -0700712 MOCK_METHOD2(OnConnectionClosed,
713 void(const QuicConnectionCloseFrame& frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500714 ConnectionCloseSource source));
715 MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(QuicStreamId id));
renjietangbaea59c2019-05-29 15:08:14 -0700716 MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(PendingStream* stream));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500717 MOCK_METHOD0(CreateOutgoingBidirectionalStream, QuicSpdyStream*());
718 MOCK_METHOD0(CreateOutgoingUnidirectionalStream, QuicSpdyStream*());
719 MOCK_METHOD1(ShouldCreateIncomingStream, bool(QuicStreamId id));
720 MOCK_METHOD0(ShouldCreateOutgoingBidirectionalStream, bool());
721 MOCK_METHOD0(ShouldCreateOutgoingUnidirectionalStream, bool());
722 MOCK_METHOD5(WritevData,
723 QuicConsumedData(QuicStream* stream,
724 QuicStreamId id,
725 size_t write_length,
726 QuicStreamOffset offset,
727 StreamSendingState state));
728
729 MOCK_METHOD3(SendRstStream,
730 void(QuicStreamId stream_id,
731 QuicRstStreamErrorCode error,
732 QuicStreamOffset bytes_written));
733
734 MOCK_METHOD2(OnStreamHeaders,
735 void(QuicStreamId stream_id, QuicStringPiece headers_data));
736 MOCK_METHOD2(OnStreamHeadersPriority,
fayang476683a2019-07-25 12:42:16 -0700737 void(QuicStreamId stream_id,
738 const spdy::SpdyStreamPrecedence& precedence));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500739 MOCK_METHOD3(OnStreamHeadersComplete,
740 void(QuicStreamId stream_id, bool fin, size_t frame_len));
741 MOCK_METHOD4(OnStreamHeaderList,
742 void(QuicStreamId stream_id,
743 bool fin,
744 size_t frame_len,
745 const QuicHeaderList& header_list));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500746 MOCK_METHOD2(OnPromiseHeaders,
747 void(QuicStreamId stream_id, QuicStringPiece headers_data));
748 MOCK_METHOD3(OnPromiseHeadersComplete,
749 void(QuicStreamId stream_id,
750 QuicStreamId promised_stream_id,
751 size_t frame_len));
752 MOCK_METHOD4(OnPromiseHeaderList,
753 void(QuicStreamId stream_id,
754 QuicStreamId promised_stream_id,
755 size_t frame_len,
756 const QuicHeaderList& header_list));
757 MOCK_METHOD2(OnPriorityFrame,
fayang476683a2019-07-25 12:42:16 -0700758 void(QuicStreamId id,
759 const spdy::SpdyStreamPrecedence& precedence));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500760
761 MOCK_METHOD1(OnHeadersHeadOfLineBlocking, void(QuicTime::Delta delta));
762 MOCK_METHOD4(
763 OnStreamFrameData,
764 void(QuicStreamId stream_id, const char* data, size_t len, bool fin));
765
766 using QuicSession::ActivateStream;
767
768 private:
769 std::unique_ptr<QuicCryptoStream> crypto_stream_;
770};
771
772class TestQuicSpdyServerSession : public QuicServerSessionBase {
773 public:
774 // Takes ownership of |connection|.
775 TestQuicSpdyServerSession(QuicConnection* connection,
776 const QuicConfig& config,
777 const ParsedQuicVersionVector& supported_versions,
778 const QuicCryptoServerConfig* crypto_config,
779 QuicCompressedCertsCache* compressed_certs_cache);
780 TestQuicSpdyServerSession(const TestQuicSpdyServerSession&) = delete;
781 TestQuicSpdyServerSession& operator=(const TestQuicSpdyServerSession&) =
782 delete;
783 ~TestQuicSpdyServerSession() override;
784
785 MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(QuicStreamId id));
renjietangbaea59c2019-05-29 15:08:14 -0700786 MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(PendingStream* stream));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500787 MOCK_METHOD0(CreateOutgoingBidirectionalStream, QuicSpdyStream*());
788 MOCK_METHOD0(CreateOutgoingUnidirectionalStream, QuicSpdyStream*());
vasilvve6472f62019-10-02 06:50:56 -0700789 MOCK_CONST_METHOD1(SelectAlpn,
790 std::vector<QuicStringPiece>::const_iterator(
791 const std::vector<QuicStringPiece>&));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500792 QuicCryptoServerStreamBase* CreateQuicCryptoServerStream(
793 const QuicCryptoServerConfig* crypto_config,
794 QuicCompressedCertsCache* compressed_certs_cache) override;
795
796 // Override to not send max header list size.
797 void OnCryptoHandshakeEvent(CryptoHandshakeEvent event) override;
798
799 QuicCryptoServerStream* GetMutableCryptoStream() override;
800
801 const QuicCryptoServerStream* GetCryptoStream() const override;
802
803 MockQuicCryptoServerStreamHelper* helper() { return &helper_; }
804
805 private:
806 MockQuicSessionVisitor visitor_;
807 MockQuicCryptoServerStreamHelper helper_;
808};
809
810// A test implementation of QuicClientPushPromiseIndex::Delegate.
811class TestPushPromiseDelegate : public QuicClientPushPromiseIndex::Delegate {
812 public:
813 // |match| sets the validation result for checking whether designated header
814 // fields match for promise request and client request.
815 explicit TestPushPromiseDelegate(bool match);
816
817 bool CheckVary(const spdy::SpdyHeaderBlock& client_request,
818 const spdy::SpdyHeaderBlock& promise_request,
819 const spdy::SpdyHeaderBlock& promise_response) override;
820
821 void OnRendezvousResult(QuicSpdyStream* stream) override;
822
823 QuicSpdyStream* rendezvous_stream() { return rendezvous_stream_; }
824 bool rendezvous_fired() { return rendezvous_fired_; }
825
826 private:
827 bool match_;
828 bool rendezvous_fired_;
829 QuicSpdyStream* rendezvous_stream_;
830};
831
832class TestQuicSpdyClientSession : public QuicSpdyClientSessionBase {
833 public:
834 TestQuicSpdyClientSession(QuicConnection* connection,
835 const QuicConfig& config,
836 const ParsedQuicVersionVector& supported_versions,
837 const QuicServerId& server_id,
838 QuicCryptoClientConfig* crypto_config);
839 TestQuicSpdyClientSession(const TestQuicSpdyClientSession&) = delete;
840 TestQuicSpdyClientSession& operator=(const TestQuicSpdyClientSession&) =
841 delete;
842 ~TestQuicSpdyClientSession() override;
843
vasilvvc48c8712019-03-11 13:38:16 -0700844 bool IsAuthorized(const std::string& authority) override;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500845
846 // QuicSpdyClientSessionBase
847 MOCK_METHOD1(OnProofValid,
848 void(const QuicCryptoClientConfig::CachedState& cached));
849 MOCK_METHOD1(OnProofVerifyDetailsAvailable,
850 void(const ProofVerifyDetails& verify_details));
851
852 // TestQuicSpdyClientSession
853 MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(QuicStreamId id));
renjietangbaea59c2019-05-29 15:08:14 -0700854 MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(PendingStream* stream));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500855 MOCK_METHOD0(CreateOutgoingBidirectionalStream, QuicSpdyStream*());
856 MOCK_METHOD0(CreateOutgoingUnidirectionalStream, QuicSpdyStream*());
857 MOCK_METHOD1(ShouldCreateIncomingStream, bool(QuicStreamId id));
858 MOCK_METHOD0(ShouldCreateOutgoingBidirectionalStream, bool());
859 MOCK_METHOD0(ShouldCreateOutgoingUnidirectionalStream, bool());
vasilvvefc6af82019-10-11 12:46:56 -0700860 MOCK_CONST_METHOD0(GetAlpnsToOffer, std::vector<std::string>());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500861
862 // Override to not send max header list size.
863 void OnCryptoHandshakeEvent(CryptoHandshakeEvent event) override;
864 QuicCryptoClientStream* GetMutableCryptoStream() override;
865 const QuicCryptoClientStream* GetCryptoStream() const override;
866
867 // Override to save sent crypto handshake messages.
868 void OnCryptoHandshakeMessageSent(
869 const CryptoHandshakeMessage& message) override {
870 sent_crypto_handshake_messages_.push_back(message);
871 }
872
873 const std::vector<CryptoHandshakeMessage>& sent_crypto_handshake_messages()
874 const {
875 return sent_crypto_handshake_messages_;
876 }
877
878 private:
879 std::unique_ptr<QuicCryptoClientStream> crypto_stream_;
880 QuicClientPushPromiseIndex push_promise_index_;
881 std::vector<CryptoHandshakeMessage> sent_crypto_handshake_messages_;
882};
883
884class MockPacketWriter : public QuicPacketWriter {
885 public:
886 MockPacketWriter();
887 MockPacketWriter(const MockPacketWriter&) = delete;
888 MockPacketWriter& operator=(const MockPacketWriter&) = delete;
889 ~MockPacketWriter() override;
890
891 MOCK_METHOD5(WritePacket,
892 WriteResult(const char* buffer,
893 size_t buf_len,
894 const QuicIpAddress& self_address,
895 const QuicSocketAddress& peer_address,
896 PerPacketOptions* options));
897 MOCK_CONST_METHOD0(IsWriteBlocked, bool());
898 MOCK_METHOD0(SetWritable, void());
899 MOCK_CONST_METHOD1(GetMaxPacketSize,
900 QuicByteCount(const QuicSocketAddress& peer_address));
901 MOCK_CONST_METHOD0(SupportsReleaseTime, bool());
902 MOCK_CONST_METHOD0(IsBatchMode, bool());
903 MOCK_METHOD2(GetNextWriteLocation,
904 char*(const QuicIpAddress& self_address,
905 const QuicSocketAddress& peer_address));
906 MOCK_METHOD0(Flush, WriteResult());
907};
908
909class MockSendAlgorithm : public SendAlgorithmInterface {
910 public:
911 MockSendAlgorithm();
912 MockSendAlgorithm(const MockSendAlgorithm&) = delete;
913 MockSendAlgorithm& operator=(const MockSendAlgorithm&) = delete;
914 ~MockSendAlgorithm() override;
915
916 MOCK_METHOD2(SetFromConfig,
917 void(const QuicConfig& config, Perspective perspective));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500918 MOCK_METHOD1(SetInitialCongestionWindowInPackets,
919 void(QuicPacketCount packets));
920 MOCK_METHOD1(SetMaxCongestionWindow,
921 void(QuicByteCount max_congestion_window));
922 MOCK_METHOD5(OnCongestionEvent,
923 void(bool rtt_updated,
924 QuicByteCount bytes_in_flight,
925 QuicTime event_time,
926 const AckedPacketVector& acked_packets,
927 const LostPacketVector& lost_packets));
928 MOCK_METHOD5(OnPacketSent,
929 void(QuicTime,
930 QuicByteCount,
931 QuicPacketNumber,
932 QuicByteCount,
933 HasRetransmittableData));
934 MOCK_METHOD1(OnRetransmissionTimeout, void(bool));
935 MOCK_METHOD0(OnConnectionMigration, void());
936 MOCK_METHOD0(RevertRetransmissionTimeout, void());
937 MOCK_METHOD1(CanSend, bool(QuicByteCount));
938 MOCK_CONST_METHOD1(PacingRate, QuicBandwidth(QuicByteCount));
939 MOCK_CONST_METHOD0(BandwidthEstimate, QuicBandwidth(void));
940 MOCK_CONST_METHOD0(HasReliableBandwidthEstimate, bool());
941 MOCK_METHOD1(OnRttUpdated, void(QuicPacketNumber));
942 MOCK_CONST_METHOD0(GetCongestionWindow, QuicByteCount());
vasilvvc48c8712019-03-11 13:38:16 -0700943 MOCK_CONST_METHOD0(GetDebugState, std::string());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500944 MOCK_CONST_METHOD0(InSlowStart, bool());
945 MOCK_CONST_METHOD0(InRecovery, bool());
946 MOCK_CONST_METHOD0(ShouldSendProbingPacket, bool());
947 MOCK_CONST_METHOD0(GetSlowStartThreshold, QuicByteCount());
948 MOCK_CONST_METHOD0(GetCongestionControlType, CongestionControlType());
fayangf1b99dc2019-05-14 06:29:18 -0700949 MOCK_METHOD3(AdjustNetworkParameters,
950 void(QuicBandwidth, QuicTime::Delta, bool));
QUICHE teamfdcfe3b2019-11-06 10:54:25 -0800951 MOCK_METHOD1(AdjustNetworkParameters, void(const NetworkParams&));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500952 MOCK_METHOD1(OnApplicationLimited, void(QuicByteCount));
953};
954
955class MockLossAlgorithm : public LossDetectionInterface {
956 public:
957 MockLossAlgorithm();
958 MockLossAlgorithm(const MockLossAlgorithm&) = delete;
959 MockLossAlgorithm& operator=(const MockLossAlgorithm&) = delete;
960 ~MockLossAlgorithm() override;
961
962 MOCK_CONST_METHOD0(GetLossDetectionType, LossDetectionType());
963 MOCK_METHOD6(DetectLosses,
964 void(const QuicUnackedPacketMap& unacked_packets,
965 QuicTime time,
966 const RttStats& rtt_stats,
967 QuicPacketNumber largest_recently_acked,
968 const AckedPacketVector& packets_acked,
969 LostPacketVector* packets_lost));
970 MOCK_CONST_METHOD0(GetLossTimeout, QuicTime());
fayang19d2d5b2019-09-11 14:22:03 -0700971 MOCK_METHOD5(SpuriousLossDetected,
972 void(const QuicUnackedPacketMap&,
973 const RttStats&,
974 QuicTime,
975 QuicPacketNumber,
976 QuicPacketNumber));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500977};
978
979class MockAckListener : public QuicAckListenerInterface {
980 public:
981 MockAckListener();
982 MockAckListener(const MockAckListener&) = delete;
983 MockAckListener& operator=(const MockAckListener&) = delete;
984
985 MOCK_METHOD2(OnPacketAcked,
986 void(int acked_bytes, QuicTime::Delta ack_delay_time));
987
988 MOCK_METHOD1(OnPacketRetransmitted, void(int retransmitted_bytes));
989
990 protected:
991 // Object is ref counted.
992 ~MockAckListener() override;
993};
994
995class MockNetworkChangeVisitor
996 : public QuicSentPacketManager::NetworkChangeVisitor {
997 public:
998 MockNetworkChangeVisitor();
999 MockNetworkChangeVisitor(const MockNetworkChangeVisitor&) = delete;
1000 MockNetworkChangeVisitor& operator=(const MockNetworkChangeVisitor&) = delete;
1001 ~MockNetworkChangeVisitor() override;
1002
1003 MOCK_METHOD0(OnCongestionChange, void());
1004 MOCK_METHOD1(OnPathMtuIncreased, void(QuicPacketLength));
1005};
1006
1007class MockQuicConnectionDebugVisitor : public QuicConnectionDebugVisitor {
1008 public:
1009 MockQuicConnectionDebugVisitor();
1010 ~MockQuicConnectionDebugVisitor() override;
1011
1012 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&));
1013
fayangcff885a2019-10-22 07:39:04 -07001014 MOCK_METHOD3(OnPacketSent,
1015 void(const SerializedPacket&, TransmissionType, QuicTime));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001016
1017 MOCK_METHOD0(OnPingSent, void());
1018
1019 MOCK_METHOD3(OnPacketReceived,
1020 void(const QuicSocketAddress&,
1021 const QuicSocketAddress&,
1022 const QuicEncryptedPacket&));
1023
1024 MOCK_METHOD1(OnIncorrectConnectionId, void(QuicConnectionId));
1025
1026 MOCK_METHOD1(OnProtocolVersionMismatch, void(ParsedQuicVersion));
1027
1028 MOCK_METHOD1(OnPacketHeader, void(const QuicPacketHeader& header));
1029
1030 MOCK_METHOD1(OnSuccessfulVersionNegotiation, void(const ParsedQuicVersion&));
1031
1032 MOCK_METHOD1(OnStreamFrame, void(const QuicStreamFrame&));
1033
rchb7e6e642019-09-03 21:57:05 -07001034 MOCK_METHOD1(OnCryptoFrame, void(const QuicCryptoFrame&));
1035
QUICHE teama6ef0a62019-03-07 20:34:33 -05001036 MOCK_METHOD1(OnStopWaitingFrame, void(const QuicStopWaitingFrame&));
1037
1038 MOCK_METHOD1(OnRstStreamFrame, void(const QuicRstStreamFrame&));
1039
1040 MOCK_METHOD1(OnConnectionCloseFrame, void(const QuicConnectionCloseFrame&));
1041
rchb7e6e642019-09-03 21:57:05 -07001042 MOCK_METHOD1(OnBlockedFrame, void(const QuicBlockedFrame&));
1043
1044 MOCK_METHOD1(OnNewConnectionIdFrame, void(const QuicNewConnectionIdFrame&));
1045
1046 MOCK_METHOD1(OnRetireConnectionIdFrame,
1047 void(const QuicRetireConnectionIdFrame&));
1048
1049 MOCK_METHOD1(OnNewTokenFrame, void(const QuicNewTokenFrame&));
1050
1051 MOCK_METHOD1(OnMessageFrame, void(const QuicMessageFrame&));
1052
QUICHE teama6ef0a62019-03-07 20:34:33 -05001053 MOCK_METHOD1(OnStopSendingFrame, void(const QuicStopSendingFrame&));
1054
1055 MOCK_METHOD1(OnPathChallengeFrame, void(const QuicPathChallengeFrame&));
1056
1057 MOCK_METHOD1(OnPathResponseFrame, void(const QuicPathResponseFrame&));
1058
1059 MOCK_METHOD1(OnPublicResetPacket, void(const QuicPublicResetPacket&));
1060
1061 MOCK_METHOD1(OnVersionNegotiationPacket,
1062 void(const QuicVersionNegotiationPacket&));
dschinazi244f6dc2019-05-06 15:45:16 -07001063
1064 MOCK_METHOD3(OnRetryPacket,
1065 void(QuicConnectionId, QuicConnectionId, QuicStringPiece));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001066};
1067
1068class MockReceivedPacketManager : public QuicReceivedPacketManager {
1069 public:
1070 explicit MockReceivedPacketManager(QuicConnectionStats* stats);
1071 ~MockReceivedPacketManager() override;
1072
1073 MOCK_METHOD2(RecordPacketReceived,
1074 void(const QuicPacketHeader& header, QuicTime receipt_time));
1075 MOCK_METHOD1(IsMissing, bool(QuicPacketNumber packet_number));
QUICHE teamb23daa72019-03-21 08:37:48 -07001076 MOCK_CONST_METHOD1(IsAwaitingPacket, bool(QuicPacketNumber packet_number));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001077 MOCK_METHOD1(UpdatePacketInformationSentByPeer,
1078 void(const QuicStopWaitingFrame& stop_waiting));
1079 MOCK_CONST_METHOD0(HasNewMissingPackets, bool(void));
1080 MOCK_CONST_METHOD0(ack_frame_updated, bool(void));
1081};
1082
QUICHE teama6ef0a62019-03-07 20:34:33 -05001083class MockPacketCreatorDelegate : public QuicPacketCreator::DelegateInterface {
1084 public:
1085 MockPacketCreatorDelegate();
1086 MockPacketCreatorDelegate(const MockPacketCreatorDelegate&) = delete;
1087 MockPacketCreatorDelegate& operator=(const MockPacketCreatorDelegate&) =
1088 delete;
1089 ~MockPacketCreatorDelegate() override;
1090
1091 MOCK_METHOD0(GetPacketBuffer, char*());
1092 MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet));
fkastenholz85f18902019-05-28 12:47:00 -07001093 MOCK_METHOD2(OnUnrecoverableError, void(QuicErrorCode, const std::string&));
fayangcad11792019-09-16 13:11:44 -07001094 MOCK_METHOD2(ShouldGeneratePacket,
1095 bool(HasRetransmittableData retransmittable,
1096 IsHandshake handshake));
1097 MOCK_METHOD0(MaybeBundleAckOpportunistically, const QuicFrames());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001098};
1099
1100class MockSessionNotifier : public SessionNotifierInterface {
1101 public:
1102 MockSessionNotifier();
1103 ~MockSessionNotifier() override;
1104
QUICHE team9467db02019-05-30 09:38:45 -07001105 MOCK_METHOD3(OnFrameAcked, bool(const QuicFrame&, QuicTime::Delta, QuicTime));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001106 MOCK_METHOD1(OnStreamFrameRetransmitted, void(const QuicStreamFrame&));
1107 MOCK_METHOD1(OnFrameLost, void(const QuicFrame&));
1108 MOCK_METHOD2(RetransmitFrames,
1109 void(const QuicFrames&, TransmissionType type));
1110 MOCK_CONST_METHOD1(IsFrameOutstanding, bool(const QuicFrame&));
1111 MOCK_CONST_METHOD0(HasUnackedCryptoData, bool());
zhongyi1b2f7832019-06-14 13:31:34 -07001112 MOCK_CONST_METHOD0(HasUnackedStreamData, bool());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001113};
1114
1115// Creates a client session for testing.
1116//
1117// server_id: The server id associated with this stream.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001118// connection_start_time: The time to set for the connection clock.
1119// Needed for strike-register nonce verification. The client
1120// connection_start_time should be synchronized witht the server
1121// start time, otherwise nonce verification will fail.
1122// supported_versions: Set of QUIC versions this client supports.
1123// helper: Pointer to the MockQuicConnectionHelper to use for the session.
1124// crypto_client_config: Pointer to the crypto client config.
1125// client_connection: Pointer reference for newly created
1126// connection. This object will be owned by the
1127// client_session.
1128// client_session: Pointer reference for the newly created client
1129// session. The new object will be owned by the caller.
1130void CreateClientSessionForTest(
1131 QuicServerId server_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001132 QuicTime::Delta connection_start_time,
1133 const ParsedQuicVersionVector& supported_versions,
1134 MockQuicConnectionHelper* helper,
1135 MockAlarmFactory* alarm_factory,
1136 QuicCryptoClientConfig* crypto_client_config,
1137 PacketSavingConnection** client_connection,
1138 TestQuicSpdyClientSession** client_session);
1139
1140// Creates a server session for testing.
1141//
1142// server_id: The server id associated with this stream.
1143// connection_start_time: The time to set for the connection clock.
1144// Needed for strike-register nonce verification. The server
1145// connection_start_time should be synchronized witht the client
1146// start time, otherwise nonce verification will fail.
1147// supported_versions: Set of QUIC versions this server supports.
1148// helper: Pointer to the MockQuicConnectionHelper to use for the session.
1149// crypto_server_config: Pointer to the crypto server config.
1150// server_connection: Pointer reference for newly created
1151// connection. This object will be owned by the
1152// server_session.
1153// server_session: Pointer reference for the newly created server
1154// session. The new object will be owned by the caller.
1155void CreateServerSessionForTest(
1156 QuicServerId server_id,
1157 QuicTime::Delta connection_start_time,
1158 ParsedQuicVersionVector supported_versions,
1159 MockQuicConnectionHelper* helper,
1160 MockAlarmFactory* alarm_factory,
1161 QuicCryptoServerConfig* crypto_server_config,
1162 QuicCompressedCertsCache* compressed_certs_cache,
1163 PacketSavingConnection** server_connection,
1164 TestQuicSpdyServerSession** server_session);
1165
1166// Verifies that the relative error of |actual| with respect to |expected| is
1167// no more than |margin|.
wub9343d702019-05-02 17:12:56 -07001168// Please use EXPECT_APPROX_EQ, a wrapper around this function, for better error
1169// report.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001170template <typename T>
1171void ExpectApproxEq(T expected, T actual, float relative_margin) {
1172 // If |relative_margin| > 1 and T is an unsigned type, the comparison will
1173 // underflow.
1174 ASSERT_LE(relative_margin, 1);
1175 ASSERT_GE(relative_margin, 0);
1176
1177 T absolute_margin = expected * relative_margin;
1178
wub9343d702019-05-02 17:12:56 -07001179 EXPECT_GE(expected + absolute_margin, actual) << "actual value too big";
1180 EXPECT_LE(expected - absolute_margin, actual) << "actual value too small";
QUICHE teama6ef0a62019-03-07 20:34:33 -05001181}
1182
wub9343d702019-05-02 17:12:56 -07001183#define EXPECT_APPROX_EQ(expected, actual, relative_margin) \
1184 do { \
1185 SCOPED_TRACE(testing::Message() << "relative_margin:" << relative_margin); \
1186 quic::test::ExpectApproxEq(expected, actual, relative_margin); \
1187 } while (0)
1188
QUICHE teama6ef0a62019-03-07 20:34:33 -05001189template <typename T>
1190QuicHeaderList AsHeaderList(const T& container) {
1191 QuicHeaderList l;
1192 // No need to enforce header list size limits again in this handler.
1193 l.set_max_header_list_size(UINT_MAX);
1194 l.OnHeaderBlockStart();
1195 size_t total_size = 0;
1196 for (auto p : container) {
1197 total_size += p.first.size() + p.second.size();
1198 l.OnHeader(p.first, p.second);
1199 }
1200 l.OnHeaderBlockEnd(total_size, total_size);
1201 return l;
1202}
1203
1204// Utility function that stores |str|'s data in |iov|.
1205inline void MakeIOVector(QuicStringPiece str, struct iovec* iov) {
1206 iov->iov_base = const_cast<char*>(str.data());
1207 iov->iov_len = static_cast<size_t>(str.size());
1208}
1209
1210// Helper functions for stream ids, to allow test logic to abstract over the
1211// HTTP stream numbering scheme (i.e. whether one or two QUIC streams are used
1212// per HTTP transaction).
1213QuicStreamId GetNthClientInitiatedBidirectionalStreamId(
1214 QuicTransportVersion version,
1215 int n);
1216QuicStreamId GetNthServerInitiatedBidirectionalStreamId(
1217 QuicTransportVersion version,
1218 int n);
1219QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(
1220 QuicTransportVersion version,
1221 int n);
renjietang3a1bb802019-06-11 10:42:41 -07001222QuicStreamId GetNthClientInitiatedUnidirectionalStreamId(
1223 QuicTransportVersion version,
1224 int n);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001225
1226StreamType DetermineStreamType(QuicStreamId id,
1227 QuicTransportVersion version,
1228 Perspective perspective,
1229 bool is_incoming,
1230 StreamType default_type);
1231
1232// Utility function that stores message_data in |storage| and returns a
1233// QuicMemSliceSpan.
1234QuicMemSliceSpan MakeSpan(QuicBufferAllocator* allocator,
1235 QuicStringPiece message_data,
1236 QuicMemSliceStorage* storage);
1237
fayang1ed1f762019-06-24 11:40:04 -07001238// Used to compare ReceivedPacketInfo.
1239MATCHER_P(ReceivedPacketInfoEquals, info, "") {
1240 return info.ToString() == arg.ToString();
1241}
1242
1243MATCHER_P(ReceivedPacketInfoConnectionIdEquals, destination_connection_id, "") {
1244 return arg.destination_connection_id == destination_connection_id;
1245}
1246
wubf76cf2a2019-10-11 18:49:07 -07001247MATCHER_P2(InRange, min, max, "") {
1248 return arg >= min && arg <= max;
1249}
1250
bncf6f82b12019-10-30 07:01:01 -07001251// A GMock matcher that prints expected and actual QuicErrorCode strings
1252// upon failure. Example usage:
1253// EXPECT_THAT(stream_->connection_error()), IsError(QUIC_INTERNAL_ERROR));
1254MATCHER_P(IsError,
1255 expected,
1256 QuicStrCat(negation ? "isn't equal to " : "is equal to ",
1257 QuicErrorCodeToString(expected))) {
1258 *result_listener << QuicErrorCodeToString(arg);
1259 return arg == expected;
1260}
1261
1262// Shorthand for IsError(QUIC_NO_ERROR).
1263// Example usage: EXPECT_THAT(stream_->connection_error(), IsQuicNoError());
1264MATCHER(IsQuicNoError,
1265 QuicStrCat(negation ? "isn't equal to " : "is equal to ",
1266 QuicErrorCodeToString(QUIC_NO_ERROR))) {
1267 *result_listener << QuicErrorCodeToString(arg);
1268 return arg == QUIC_NO_ERROR;
1269}
1270
1271// A GMock matcher that prints expected and actual QuicRstStreamErrorCode
1272// strings upon failure. Example usage:
1273// EXPECT_THAT(stream_->stream_error(), IsStreamError(QUIC_INTERNAL_ERROR));
1274MATCHER_P(IsStreamError,
1275 expected,
1276 QuicStrCat(negation ? "isn't equal to " : "is equal to ",
1277 QuicRstStreamErrorCodeToString(expected))) {
1278 *result_listener << QuicRstStreamErrorCodeToString(arg);
1279 return arg == expected;
1280}
1281
1282// Shorthand for IsStreamError(QUIC_STREAM_NO_ERROR). Example usage:
1283// EXPECT_THAT(stream_->stream_error(), IsQuicStreamNoError());
1284MATCHER(IsQuicStreamNoError,
1285 QuicStrCat(negation ? "isn't equal to " : "is equal to ",
1286 QuicRstStreamErrorCodeToString(QUIC_STREAM_NO_ERROR))) {
1287 *result_listener << QuicRstStreamErrorCodeToString(arg);
1288 return arg == QUIC_STREAM_NO_ERROR;
1289}
1290
QUICHE teama6ef0a62019-03-07 20:34:33 -05001291} // namespace test
1292} // namespace quic
1293
1294#endif // QUICHE_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_