quic_test_utils.h revision 010d83a9304c5a91596085d917d248abff47903a
1// 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 NET_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_
8#define NET_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_
9
10#include <string>
11#include <vector>
12
13#include "base/strings/string_piece.h"
14#include "net/quic/congestion_control/loss_detection_interface.h"
15#include "net/quic/congestion_control/send_algorithm_interface.h"
16#include "net/quic/quic_ack_notifier.h"
17#include "net/quic/quic_client_session_base.h"
18#include "net/quic/quic_connection.h"
19#include "net/quic/quic_framer.h"
20#include "net/quic/quic_session.h"
21#include "net/quic/test_tools/mock_clock.h"
22#include "net/quic/test_tools/mock_random.h"
23#include "net/spdy/spdy_framer.h"
24#include "testing/gmock/include/gmock/gmock.h"
25
26namespace net {
27
28namespace test {
29
30static const QuicConnectionId kTestConnectionId = 42;
31static const int kTestPort = 123;
32static const uint32 kInitialFlowControlWindowForTest = 32 * 1024;  // 32 KB
33
34// Returns the test peer IP address.
35IPAddressNumber TestPeerIPAddress();
36
37// Upper limit on versions we support.
38QuicVersion QuicVersionMax();
39
40// Lower limit on versions we support.
41QuicVersion QuicVersionMin();
42
43// Returns an address for 127.0.0.1.
44IPAddressNumber Loopback4();
45
46void GenerateBody(std::string* body, int length);
47
48// Create an encrypted packet for testing.
49QuicEncryptedPacket* ConstructEncryptedPacket(
50    QuicConnectionId connection_id,
51    bool version_flag,
52    bool reset_flag,
53    QuicPacketSequenceNumber sequence_number,
54    const std::string& data);
55
56void CompareCharArraysWithHexError(const std::string& description,
57                                   const char* actual,
58                                   const int actual_len,
59                                   const char* expected,
60                                   const int expected_len);
61
62bool DecodeHexString(const base::StringPiece& hex, std::string* bytes);
63
64// Returns the length of a QuicPacket that is capable of holding either a
65// stream frame or a minimal ack frame.  Sets |*payload_length| to the number
66// of bytes of stream data that will fit in such a packet.
67size_t GetPacketLengthForOneStream(
68    QuicVersion version,
69    bool include_version,
70    QuicSequenceNumberLength sequence_number_length,
71    InFecGroup is_in_fec_group,
72    size_t* payload_length);
73
74// Returns QuicConfig set to default values.
75QuicConfig DefaultQuicConfig();
76
77// Returns a version vector consisting of |version|.
78QuicVersionVector SupportedVersions(QuicVersion version);
79
80// Testing convenience method to construct a QuicAckFrame with all packets
81// from least_unacked to largest_observed acked.
82QuicAckFrame MakeAckFrame(QuicPacketSequenceNumber largest_observed,
83                          QuicPacketSequenceNumber least_unacked);
84
85template<typename SaveType>
86class ValueRestore {
87 public:
88  ValueRestore(SaveType* name, SaveType value)
89      : name_(name),
90        value_(*name) {
91    *name_ = value;
92  }
93  ~ValueRestore() {
94    *name_ = value_;
95  }
96
97 private:
98  SaveType* name_;
99  SaveType value_;
100
101  DISALLOW_COPY_AND_ASSIGN(ValueRestore);
102};
103
104class MockFramerVisitor : public QuicFramerVisitorInterface {
105 public:
106  MockFramerVisitor();
107  virtual ~MockFramerVisitor();
108
109  MOCK_METHOD1(OnError, void(QuicFramer* framer));
110  // The constructor sets this up to return false by default.
111  MOCK_METHOD1(OnProtocolVersionMismatch, bool(QuicVersion version));
112  MOCK_METHOD0(OnPacket, void());
113  MOCK_METHOD1(OnPublicResetPacket, void(const QuicPublicResetPacket& header));
114  MOCK_METHOD1(OnVersionNegotiationPacket,
115               void(const QuicVersionNegotiationPacket& packet));
116  MOCK_METHOD0(OnRevivedPacket, void());
117  // The constructor sets this up to return true by default.
118  MOCK_METHOD1(OnUnauthenticatedHeader, bool(const QuicPacketHeader& header));
119  // The constructor sets this up to return true by default.
120  MOCK_METHOD1(OnUnauthenticatedPublicHeader, bool(
121      const QuicPacketPublicHeader& header));
122  MOCK_METHOD1(OnDecryptedPacket, void(EncryptionLevel level));
123  MOCK_METHOD1(OnPacketHeader, bool(const QuicPacketHeader& header));
124  MOCK_METHOD1(OnFecProtectedPayload, void(base::StringPiece payload));
125  MOCK_METHOD1(OnStreamFrame, bool(const QuicStreamFrame& frame));
126  MOCK_METHOD1(OnAckFrame, bool(const QuicAckFrame& frame));
127  MOCK_METHOD1(OnCongestionFeedbackFrame,
128               bool(const QuicCongestionFeedbackFrame& frame));
129  MOCK_METHOD1(OnStopWaitingFrame, bool(const QuicStopWaitingFrame& frame));
130  MOCK_METHOD1(OnPingFrame, bool(const QuicPingFrame& frame));
131  MOCK_METHOD1(OnFecData, void(const QuicFecData& fec));
132  MOCK_METHOD1(OnRstStreamFrame, bool(const QuicRstStreamFrame& frame));
133  MOCK_METHOD1(OnConnectionCloseFrame,
134               bool(const QuicConnectionCloseFrame& frame));
135  MOCK_METHOD1(OnGoAwayFrame, bool(const QuicGoAwayFrame& frame));
136  MOCK_METHOD1(OnWindowUpdateFrame, bool(const QuicWindowUpdateFrame& frame));
137  MOCK_METHOD1(OnBlockedFrame, bool(const QuicBlockedFrame& frame));
138  MOCK_METHOD0(OnPacketComplete, void());
139
140 private:
141  DISALLOW_COPY_AND_ASSIGN(MockFramerVisitor);
142};
143
144class NoOpFramerVisitor : public QuicFramerVisitorInterface {
145 public:
146  NoOpFramerVisitor() {}
147
148  virtual void OnError(QuicFramer* framer) OVERRIDE {}
149  virtual void OnPacket() OVERRIDE {}
150  virtual void OnPublicResetPacket(
151      const QuicPublicResetPacket& packet) OVERRIDE {}
152  virtual void OnVersionNegotiationPacket(
153      const QuicVersionNegotiationPacket& packet) OVERRIDE {}
154  virtual void OnRevivedPacket() OVERRIDE {}
155  virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE;
156  virtual bool OnUnauthenticatedHeader(const QuicPacketHeader& header) OVERRIDE;
157  virtual bool OnUnauthenticatedPublicHeader(
158      const QuicPacketPublicHeader& header) OVERRIDE;
159  virtual void OnDecryptedPacket(EncryptionLevel level) OVERRIDE {}
160  virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE;
161  virtual void OnFecProtectedPayload(base::StringPiece payload) OVERRIDE {}
162  virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE;
163  virtual bool OnAckFrame(const QuicAckFrame& frame) OVERRIDE;
164  virtual bool OnCongestionFeedbackFrame(
165      const QuicCongestionFeedbackFrame& frame) OVERRIDE;
166  virtual bool OnStopWaitingFrame(
167      const QuicStopWaitingFrame& frame) OVERRIDE;
168  virtual bool OnPingFrame(const QuicPingFrame& frame) OVERRIDE;
169  virtual void OnFecData(const QuicFecData& fec) OVERRIDE {}
170  virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE;
171  virtual bool OnConnectionCloseFrame(
172      const QuicConnectionCloseFrame& frame) OVERRIDE;
173  virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE;
174  virtual bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) OVERRIDE;
175  virtual bool OnBlockedFrame(const QuicBlockedFrame& frame) OVERRIDE;
176  virtual void OnPacketComplete() OVERRIDE {}
177
178 private:
179  DISALLOW_COPY_AND_ASSIGN(NoOpFramerVisitor);
180};
181
182class MockConnectionVisitor : public QuicConnectionVisitorInterface {
183 public:
184  MockConnectionVisitor();
185  virtual ~MockConnectionVisitor();
186
187  MOCK_METHOD1(OnStreamFrames, void(const std::vector<QuicStreamFrame>& frame));
188  MOCK_METHOD1(OnWindowUpdateFrames,
189               void(const std::vector<QuicWindowUpdateFrame>& frame));
190  MOCK_METHOD1(OnBlockedFrames,
191               void(const std::vector<QuicBlockedFrame>& frame));
192  MOCK_METHOD1(OnRstStream, void(const QuicRstStreamFrame& frame));
193  MOCK_METHOD1(OnGoAway, void(const QuicGoAwayFrame& frame));
194  MOCK_METHOD2(OnConnectionClosed, void(QuicErrorCode error, bool from_peer));
195  MOCK_METHOD0(OnWriteBlocked, void());
196  MOCK_METHOD0(OnCanWrite, void());
197  MOCK_CONST_METHOD0(HasPendingWrites, bool());
198  MOCK_CONST_METHOD0(HasPendingHandshake, bool());
199  MOCK_CONST_METHOD0(HasOpenDataStreams, bool());
200  MOCK_METHOD1(OnSuccessfulVersionNegotiation,
201               void(const QuicVersion& version));
202  MOCK_METHOD0(OnConfigNegotiated, void());
203
204 private:
205  DISALLOW_COPY_AND_ASSIGN(MockConnectionVisitor);
206};
207
208class MockHelper : public QuicConnectionHelperInterface {
209 public:
210  MockHelper();
211  virtual ~MockHelper();
212  virtual const QuicClock* GetClock() const OVERRIDE;
213  virtual QuicRandom* GetRandomGenerator() OVERRIDE;
214  virtual QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) OVERRIDE;
215  void AdvanceTime(QuicTime::Delta delta);
216
217 private:
218  MockClock clock_;
219  MockRandom random_generator_;
220
221  DISALLOW_COPY_AND_ASSIGN(MockHelper);
222};
223
224class MockConnection : public QuicConnection {
225 public:
226  // Uses a MockHelper, ConnectionId of 42, and 127.0.0.1:123.
227  explicit MockConnection(bool is_server);
228
229  // Uses a MockHelper, ConnectionId of 42.
230  MockConnection(IPEndPoint address, bool is_server);
231
232  // Uses a MockHelper, and 127.0.0.1:123
233  MockConnection(QuicConnectionId connection_id, bool is_server);
234
235  // Uses a Mock helper, ConnectionId of 42, and 127.0.0.1:123.
236  MockConnection(bool is_server, const QuicVersionVector& supported_versions);
237
238  virtual ~MockConnection();
239
240  // If the constructor that uses a MockHelper has been used then this method
241  // will advance the time of the MockClock.
242  void AdvanceTime(QuicTime::Delta delta);
243
244  MOCK_METHOD3(ProcessUdpPacket, void(const IPEndPoint& self_address,
245                                      const IPEndPoint& peer_address,
246                                      const QuicEncryptedPacket& packet));
247  MOCK_METHOD1(SendConnectionClose, void(QuicErrorCode error));
248  MOCK_METHOD2(SendConnectionCloseWithDetails, void(QuicErrorCode error,
249                                                    const string& details));
250  MOCK_METHOD2(SendConnectionClosePacket, void(QuicErrorCode error,
251                                               const string& details));
252  MOCK_METHOD3(SendRstStream, void(QuicStreamId id,
253                                   QuicRstStreamErrorCode error,
254                                   QuicStreamOffset bytes_written));
255  MOCK_METHOD3(SendGoAway, void(QuicErrorCode error,
256                                QuicStreamId last_good_stream_id,
257                                const string& reason));
258  MOCK_METHOD1(SendBlocked, void(QuicStreamId id));
259  MOCK_METHOD2(SendWindowUpdate, void(QuicStreamId id,
260                                      QuicStreamOffset byte_offset));
261  MOCK_METHOD0(OnCanWrite, void());
262
263  void ProcessUdpPacketInternal(const IPEndPoint& self_address,
264                                const IPEndPoint& peer_address,
265                                const QuicEncryptedPacket& packet) {
266    QuicConnection::ProcessUdpPacket(self_address, peer_address, packet);
267  }
268
269  virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE {
270    return false;
271  }
272
273 private:
274  scoped_ptr<QuicPacketWriter> writer_;
275  scoped_ptr<QuicConnectionHelperInterface> helper_;
276
277  DISALLOW_COPY_AND_ASSIGN(MockConnection);
278};
279
280class PacketSavingConnection : public MockConnection {
281 public:
282  explicit PacketSavingConnection(bool is_server);
283
284  PacketSavingConnection(bool is_server,
285                         const QuicVersionVector& supported_versions);
286
287  virtual ~PacketSavingConnection();
288
289  virtual bool SendOrQueuePacket(EncryptionLevel level,
290                                 const SerializedPacket& packet,
291                                 TransmissionType transmission_type) OVERRIDE;
292
293  std::vector<QuicPacket*> packets_;
294  std::vector<QuicEncryptedPacket*> encrypted_packets_;
295
296 private:
297  DISALLOW_COPY_AND_ASSIGN(PacketSavingConnection);
298};
299
300class MockSession : public QuicSession {
301 public:
302  explicit MockSession(QuicConnection* connection);
303  virtual ~MockSession();
304  MOCK_METHOD2(OnConnectionClosed, void(QuicErrorCode error, bool from_peer));
305  MOCK_METHOD1(CreateIncomingDataStream, QuicDataStream*(QuicStreamId id));
306  MOCK_METHOD0(GetCryptoStream, QuicCryptoStream*());
307  MOCK_METHOD0(CreateOutgoingDataStream, QuicDataStream*());
308  MOCK_METHOD5(WritevData,
309               QuicConsumedData(QuicStreamId id,
310                                const IOVector& data,
311                                QuicStreamOffset offset,
312                                bool fin,
313                                QuicAckNotifier::DelegateInterface*));
314  MOCK_METHOD2(OnStreamHeaders, void(QuicStreamId stream_id,
315                                     base::StringPiece headers_data));
316  MOCK_METHOD2(OnStreamHeadersPriority, void(QuicStreamId stream_id,
317                                             QuicPriority priority));
318  MOCK_METHOD3(OnStreamHeadersComplete, void(QuicStreamId stream_id,
319                                             bool fin,
320                                             size_t frame_len));
321  MOCK_METHOD3(SendRstStream, void(QuicStreamId stream_id,
322                                   QuicRstStreamErrorCode error,
323                                   QuicStreamOffset bytes_written));
324  MOCK_METHOD0(IsCryptoHandshakeConfirmed, bool());
325
326  using QuicSession::ActivateStream;
327
328 private:
329  DISALLOW_COPY_AND_ASSIGN(MockSession);
330};
331
332class TestSession : public QuicSession {
333 public:
334  TestSession(QuicConnection* connection, const QuicConfig& config);
335  virtual ~TestSession();
336
337  MOCK_METHOD1(CreateIncomingDataStream, QuicDataStream*(QuicStreamId id));
338  MOCK_METHOD0(CreateOutgoingDataStream, QuicDataStream*());
339
340  void SetCryptoStream(QuicCryptoStream* stream);
341
342  virtual QuicCryptoStream* GetCryptoStream() OVERRIDE;
343
344 private:
345  QuicCryptoStream* crypto_stream_;
346
347  DISALLOW_COPY_AND_ASSIGN(TestSession);
348};
349
350class TestClientSession : public QuicClientSessionBase {
351 public:
352  TestClientSession(QuicConnection* connection, const QuicConfig& config);
353  virtual ~TestClientSession();
354
355  // QuicClientSessionBase
356  MOCK_METHOD1(OnProofValid,
357               void(const QuicCryptoClientConfig::CachedState& cached));
358  MOCK_METHOD1(OnProofVerifyDetailsAvailable,
359               void(const ProofVerifyDetails& verify_details));
360
361  // TestClientSession
362  MOCK_METHOD1(CreateIncomingDataStream, QuicDataStream*(QuicStreamId id));
363  MOCK_METHOD0(CreateOutgoingDataStream, QuicDataStream*());
364
365  void SetCryptoStream(QuicCryptoStream* stream);
366
367  virtual QuicCryptoStream* GetCryptoStream() OVERRIDE;
368
369 private:
370  QuicCryptoStream* crypto_stream_;
371
372  DISALLOW_COPY_AND_ASSIGN(TestClientSession);
373};
374
375class MockPacketWriter : public QuicPacketWriter {
376 public:
377  MockPacketWriter();
378  virtual ~MockPacketWriter();
379
380  MOCK_METHOD4(WritePacket,
381               WriteResult(const char* buffer,
382                           size_t buf_len,
383                           const IPAddressNumber& self_address,
384                           const IPEndPoint& peer_address));
385  MOCK_CONST_METHOD0(IsWriteBlockedDataBuffered, bool());
386  MOCK_CONST_METHOD0(IsWriteBlocked, bool());
387  MOCK_METHOD0(SetWritable, void());
388
389 private:
390  DISALLOW_COPY_AND_ASSIGN(MockPacketWriter);
391};
392
393class MockSendAlgorithm : public SendAlgorithmInterface {
394 public:
395  MockSendAlgorithm();
396  virtual ~MockSendAlgorithm();
397
398  MOCK_METHOD2(SetFromConfig, void(const QuicConfig& config, bool is_server));
399  MOCK_METHOD1(SetMaxPacketSize, void(QuicByteCount max_packet_size));
400  MOCK_METHOD2(OnIncomingQuicCongestionFeedbackFrame,
401               void(const QuicCongestionFeedbackFrame&,
402                    QuicTime feedback_receive_time));
403  MOCK_METHOD4(OnCongestionEvent, void(bool rtt_updated,
404                                       QuicByteCount bytes_in_flight,
405                                       const CongestionMap& acked_packets,
406                                       const CongestionMap& lost_packets));
407  MOCK_METHOD5(OnPacketSent,
408               bool(QuicTime, QuicByteCount, QuicPacketSequenceNumber,
409                    QuicByteCount, HasRetransmittableData));
410  MOCK_METHOD1(OnRetransmissionTimeout, void(bool));
411  MOCK_METHOD3(TimeUntilSend, QuicTime::Delta(QuicTime now,
412                                              QuicByteCount bytes_in_flight,
413                                              HasRetransmittableData));
414  MOCK_CONST_METHOD0(BandwidthEstimate, QuicBandwidth(void));
415  MOCK_METHOD1(OnRttUpdated, void(QuicPacketSequenceNumber));
416  MOCK_CONST_METHOD0(RetransmissionDelay, QuicTime::Delta(void));
417  MOCK_CONST_METHOD0(GetCongestionWindow, QuicByteCount());
418
419 private:
420  DISALLOW_COPY_AND_ASSIGN(MockSendAlgorithm);
421};
422
423class MockLossAlgorithm : public LossDetectionInterface {
424 public:
425  MockLossAlgorithm();
426  virtual ~MockLossAlgorithm();
427
428  MOCK_CONST_METHOD0(GetLossDetectionType, LossDetectionType());
429  MOCK_METHOD4(DetectLostPackets,
430               SequenceNumberSet(const QuicUnackedPacketMap& unacked_packets,
431                                 const QuicTime& time,
432                                 QuicPacketSequenceNumber largest_observed,
433                                 const RttStats& rtt_stats));
434  MOCK_CONST_METHOD0(GetLossTimeout, QuicTime());
435
436 private:
437  DISALLOW_COPY_AND_ASSIGN(MockLossAlgorithm);
438};
439
440class TestEntropyCalculator :
441      public QuicReceivedEntropyHashCalculatorInterface {
442 public:
443  TestEntropyCalculator();
444  virtual ~TestEntropyCalculator();
445
446  virtual QuicPacketEntropyHash EntropyHash(
447      QuicPacketSequenceNumber sequence_number) const OVERRIDE;
448
449 private:
450  DISALLOW_COPY_AND_ASSIGN(TestEntropyCalculator);
451};
452
453class MockEntropyCalculator : public TestEntropyCalculator {
454 public:
455  MockEntropyCalculator();
456  virtual ~MockEntropyCalculator();
457
458  MOCK_CONST_METHOD1(
459      EntropyHash,
460      QuicPacketEntropyHash(QuicPacketSequenceNumber sequence_number));
461
462 private:
463  DISALLOW_COPY_AND_ASSIGN(MockEntropyCalculator);
464};
465
466class MockAckNotifierDelegate : public QuicAckNotifier::DelegateInterface {
467 public:
468  MockAckNotifierDelegate();
469
470  MOCK_METHOD5(OnAckNotification, void(int num_original_packets,
471                                       int num_original_bytes,
472                                       int num_retransmitted_packets,
473                                       int num_retransmitted_bytes,
474                                       QuicTime::Delta delta_largest_observed));
475
476 protected:
477  // Object is ref counted.
478  virtual ~MockAckNotifierDelegate();
479
480 private:
481  DISALLOW_COPY_AND_ASSIGN(MockAckNotifierDelegate);
482};
483
484}  // namespace test
485}  // namespace net
486
487#endif  // NET_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_
488