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.
5 // Common utilities for Quic tests
7 #ifndef NET_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_
8 #define NET_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_
13 #include "base/strings/string_piece.h"
14 #include "net/quic/congestion_control/send_algorithm_interface.h"
15 #include "net/quic/quic_ack_notifier.h"
16 #include "net/quic/quic_connection.h"
17 #include "net/quic/quic_framer.h"
18 #include "net/quic/quic_session.h"
19 #include "net/quic/quic_spdy_decompressor.h"
20 #include "net/quic/test_tools/mock_clock.h"
21 #include "net/quic/test_tools/mock_random.h"
22 #include "net/spdy/spdy_framer.h"
23 #include "testing/gmock/include/gmock/gmock.h"
29 static const QuicGuid kTestGuid = 42;
30 static const int kTestPort = 123;
32 // Returns the test peer IP address.
33 IPAddressNumber TestPeerIPAddress();
35 // Upper limit on versions we support.
36 QuicVersion QuicVersionMax();
38 // Lower limit on versions we support.
39 QuicVersion QuicVersionMin();
41 // Returns an address for 127.0.0.1.
42 IPAddressNumber Loopback4();
44 void CompareCharArraysWithHexError(const std::string& description,
48 const int expected_len);
50 bool DecodeHexString(const base::StringPiece& hex, std::string* bytes);
52 // Returns the length of a QuicPacket that is capable of holding either a
53 // stream frame or a minimal ack frame. Sets |*payload_length| to the number
54 // of bytes of stream data that will fit in such a packet.
55 size_t GetPacketLengthForOneStream(
58 QuicSequenceNumberLength sequence_number_length,
59 InFecGroup is_in_fec_group,
60 size_t* payload_length);
62 // Returns QuicConfig set to default values.
63 QuicConfig DefaultQuicConfig();
65 // Returns a version vector consisting of |version|.
66 QuicVersionVector SupportedVersions(QuicVersion version);
68 template<typename SaveType>
71 ValueRestore(SaveType* name, SaveType value)
84 DISALLOW_COPY_AND_ASSIGN(ValueRestore);
87 class MockFramerVisitor : public QuicFramerVisitorInterface {
90 virtual ~MockFramerVisitor();
92 MOCK_METHOD1(OnError, void(QuicFramer* framer));
93 // The constructor sets this up to return false by default.
94 MOCK_METHOD1(OnProtocolVersionMismatch, bool(QuicVersion version));
95 MOCK_METHOD0(OnPacket, void());
96 MOCK_METHOD1(OnPublicResetPacket, void(const QuicPublicResetPacket& header));
97 MOCK_METHOD1(OnVersionNegotiationPacket,
98 void(const QuicVersionNegotiationPacket& packet));
99 MOCK_METHOD0(OnRevivedPacket, void());
100 // The constructor sets this up to return true by default.
101 MOCK_METHOD1(OnUnauthenticatedHeader, bool(const QuicPacketHeader& header));
102 // The constructor sets this up to return true by default.
103 MOCK_METHOD1(OnUnauthenticatedPublicHeader, bool(
104 const QuicPacketPublicHeader& header));
105 MOCK_METHOD1(OnPacketHeader, bool(const QuicPacketHeader& header));
106 MOCK_METHOD1(OnFecProtectedPayload, void(base::StringPiece payload));
107 MOCK_METHOD1(OnStreamFrame, bool(const QuicStreamFrame& frame));
108 MOCK_METHOD1(OnAckFrame, bool(const QuicAckFrame& frame));
109 MOCK_METHOD1(OnCongestionFeedbackFrame,
110 bool(const QuicCongestionFeedbackFrame& frame));
111 MOCK_METHOD1(OnFecData, void(const QuicFecData& fec));
112 MOCK_METHOD1(OnRstStreamFrame, bool(const QuicRstStreamFrame& frame));
113 MOCK_METHOD1(OnConnectionCloseFrame,
114 bool(const QuicConnectionCloseFrame& frame));
115 MOCK_METHOD1(OnGoAwayFrame, bool(const QuicGoAwayFrame& frame));
116 MOCK_METHOD0(OnPacketComplete, void());
119 DISALLOW_COPY_AND_ASSIGN(MockFramerVisitor);
122 class NoOpFramerVisitor : public QuicFramerVisitorInterface {
124 NoOpFramerVisitor() {}
126 virtual void OnError(QuicFramer* framer) OVERRIDE {}
127 virtual void OnPacket() OVERRIDE {}
128 virtual void OnPublicResetPacket(
129 const QuicPublicResetPacket& packet) OVERRIDE {}
130 virtual void OnVersionNegotiationPacket(
131 const QuicVersionNegotiationPacket& packet) OVERRIDE {}
132 virtual void OnRevivedPacket() OVERRIDE {}
133 virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE;
134 virtual bool OnUnauthenticatedHeader(const QuicPacketHeader& header) OVERRIDE;
135 virtual bool OnUnauthenticatedPublicHeader(
136 const QuicPacketPublicHeader& header) OVERRIDE;
137 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE;
138 virtual void OnFecProtectedPayload(base::StringPiece payload) OVERRIDE {}
139 virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE;
140 virtual bool OnAckFrame(const QuicAckFrame& frame) OVERRIDE;
141 virtual bool OnCongestionFeedbackFrame(
142 const QuicCongestionFeedbackFrame& frame) OVERRIDE;
143 virtual void OnFecData(const QuicFecData& fec) OVERRIDE {}
144 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE;
145 virtual bool OnConnectionCloseFrame(
146 const QuicConnectionCloseFrame& frame) OVERRIDE;
147 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE;
148 virtual void OnPacketComplete() OVERRIDE {}
151 DISALLOW_COPY_AND_ASSIGN(NoOpFramerVisitor);
154 class FramerVisitorCapturingPublicReset : public NoOpFramerVisitor {
156 FramerVisitorCapturingPublicReset();
157 virtual ~FramerVisitorCapturingPublicReset();
159 virtual void OnPublicResetPacket(
160 const QuicPublicResetPacket& packet) OVERRIDE;
162 const QuicPublicResetPacket public_reset_packet() {
163 return public_reset_packet_;
167 QuicPublicResetPacket public_reset_packet_;
170 class FramerVisitorCapturingFrames : public NoOpFramerVisitor {
172 FramerVisitorCapturingFrames();
173 virtual ~FramerVisitorCapturingFrames();
175 // Reset the visitor to it's initial state.
179 virtual void OnVersionNegotiationPacket(
180 const QuicVersionNegotiationPacket& packet) OVERRIDE;
181 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE;
182 virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE;
183 virtual bool OnAckFrame(const QuicAckFrame& frame) OVERRIDE;
184 virtual bool OnCongestionFeedbackFrame(
185 const QuicCongestionFeedbackFrame& frame) OVERRIDE;
186 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE;
187 virtual bool OnConnectionCloseFrame(
188 const QuicConnectionCloseFrame& frame) OVERRIDE;
189 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE;
191 size_t frame_count() const { return frame_count_; }
192 QuicPacketHeader* header() { return &header_; }
193 const std::vector<QuicStreamFrame>* stream_frames() const {
194 return &stream_frames_;
196 const std::vector<string*>& stream_data() const {
199 QuicAckFrame* ack() { return ack_.get(); }
200 QuicCongestionFeedbackFrame* feedback() { return feedback_.get(); }
201 QuicRstStreamFrame* rst() { return rst_.get(); }
202 QuicConnectionCloseFrame* close() { return close_.get(); }
203 QuicGoAwayFrame* goaway() { return goaway_.get(); }
204 QuicVersionNegotiationPacket* version_negotiation_packet() {
205 return version_negotiation_packet_.get();
210 QuicPacketHeader header_;
211 std::vector<QuicStreamFrame> stream_frames_;
212 std::vector<std::string*> stream_data_;
213 scoped_ptr<QuicAckFrame> ack_;
214 scoped_ptr<QuicCongestionFeedbackFrame> feedback_;
215 scoped_ptr<QuicRstStreamFrame> rst_;
216 scoped_ptr<QuicConnectionCloseFrame> close_;
217 scoped_ptr<QuicGoAwayFrame> goaway_;
218 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
220 DISALLOW_COPY_AND_ASSIGN(FramerVisitorCapturingFrames);
223 class MockConnectionVisitor : public QuicConnectionVisitorInterface {
225 MockConnectionVisitor();
226 virtual ~MockConnectionVisitor();
228 MOCK_METHOD1(OnStreamFrames, bool(const std::vector<QuicStreamFrame>& frame));
229 MOCK_METHOD1(OnRstStream, void(const QuicRstStreamFrame& frame));
230 MOCK_METHOD1(OnGoAway, void(const QuicGoAwayFrame& frame));
231 MOCK_METHOD2(OnConnectionClosed, void(QuicErrorCode error, bool from_peer));
232 MOCK_METHOD0(OnWriteBlocked, void());
233 MOCK_METHOD0(OnCanWrite, bool());
234 MOCK_CONST_METHOD0(HasPendingHandshake, bool());
235 MOCK_METHOD1(OnSuccessfulVersionNegotiation,
236 void(const QuicVersion& version));
237 MOCK_METHOD0(OnConfigNegotiated, void());
240 DISALLOW_COPY_AND_ASSIGN(MockConnectionVisitor);
243 class MockHelper : public QuicConnectionHelperInterface {
246 virtual ~MockHelper();
247 virtual const QuicClock* GetClock() const OVERRIDE;
248 virtual QuicRandom* GetRandomGenerator() OVERRIDE;
249 virtual QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) OVERRIDE;
250 void AdvanceTime(QuicTime::Delta delta);
254 MockRandom random_generator_;
257 class MockConnection : public QuicConnection {
259 // Uses a MockHelper, GUID of 42, and 127.0.0.1:123.
260 explicit MockConnection(bool is_server);
262 // Uses a MockHelper, GUID of 42.
263 MockConnection(IPEndPoint address, bool is_server);
265 // Uses a MockHelper, and 127.0.0.1:123
266 MockConnection(QuicGuid guid, bool is_server);
268 // Uses a Mock helper, GUID of 42, and 127.0.0.1:123.
269 MockConnection(bool is_server, const QuicVersionVector& supported_versions);
271 virtual ~MockConnection();
273 // If the constructor that uses a MockHelper has been used then this method
274 // will advance the time of the MockClock.
275 void AdvanceTime(QuicTime::Delta delta);
277 MOCK_METHOD3(ProcessUdpPacket, void(const IPEndPoint& self_address,
278 const IPEndPoint& peer_address,
279 const QuicEncryptedPacket& packet));
280 MOCK_METHOD1(SendConnectionClose, void(QuicErrorCode error));
281 MOCK_METHOD2(SendConnectionCloseWithDetails, void(QuicErrorCode error,
282 const string& details));
283 MOCK_METHOD3(SendRstStream, void(QuicStreamId id,
284 QuicRstStreamErrorCode error,
285 QuicStreamOffset bytes_written));
286 MOCK_METHOD3(SendGoAway, void(QuicErrorCode error,
287 QuicStreamId last_good_stream_id,
288 const string& reason));
289 MOCK_METHOD0(OnCanWrite, bool());
291 void ProcessUdpPacketInternal(const IPEndPoint& self_address,
292 const IPEndPoint& peer_address,
293 const QuicEncryptedPacket& packet) {
294 QuicConnection::ProcessUdpPacket(self_address, peer_address, packet);
297 virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE {
302 scoped_ptr<QuicPacketWriter> writer_;
303 scoped_ptr<QuicConnectionHelperInterface> helper_;
305 DISALLOW_COPY_AND_ASSIGN(MockConnection);
308 class PacketSavingConnection : public MockConnection {
310 explicit PacketSavingConnection(bool is_server);
312 PacketSavingConnection(bool is_server,
313 const QuicVersionVector& supported_versions);
315 virtual ~PacketSavingConnection();
317 virtual bool SendOrQueuePacket(EncryptionLevel level,
318 const SerializedPacket& packet,
319 TransmissionType transmission_type) OVERRIDE;
321 std::vector<QuicPacket*> packets_;
322 std::vector<QuicEncryptedPacket*> encrypted_packets_;
325 DISALLOW_COPY_AND_ASSIGN(PacketSavingConnection);
328 class MockSession : public QuicSession {
330 explicit MockSession(QuicConnection* connection);
331 virtual ~MockSession();
332 MOCK_METHOD2(OnConnectionClosed, void(QuicErrorCode error, bool from_peer));
333 MOCK_METHOD1(CreateIncomingDataStream, QuicDataStream*(QuicStreamId id));
334 MOCK_METHOD0(GetCryptoStream, QuicCryptoStream*());
335 MOCK_METHOD0(CreateOutgoingDataStream, QuicDataStream*());
336 MOCK_METHOD6(WritevData,
337 QuicConsumedData(QuicStreamId id,
338 const struct iovec* iov,
340 QuicStreamOffset offset,
342 QuicAckNotifier::DelegateInterface*));
343 MOCK_METHOD2(OnStreamHeaders, void(QuicStreamId stream_id,
344 base::StringPiece headers_data));
345 MOCK_METHOD2(OnStreamHeadersPriority, void(QuicStreamId stream_id,
346 QuicPriority priority));
347 MOCK_METHOD3(OnStreamHeadersComplete, void(QuicStreamId stream_id,
350 MOCK_METHOD3(SendRstStream, void(QuicStreamId stream_id,
351 QuicRstStreamErrorCode error,
352 QuicStreamOffset bytes_written));
353 MOCK_METHOD0(IsCryptoHandshakeConfirmed, bool());
355 using QuicSession::ActivateStream;
358 DISALLOW_COPY_AND_ASSIGN(MockSession);
361 class TestSession : public QuicSession {
363 TestSession(QuicConnection* connection, const QuicConfig& config);
364 virtual ~TestSession();
366 MOCK_METHOD1(CreateIncomingDataStream, QuicDataStream*(QuicStreamId id));
367 MOCK_METHOD0(CreateOutgoingDataStream, QuicDataStream*());
369 void SetCryptoStream(QuicCryptoStream* stream);
371 virtual QuicCryptoStream* GetCryptoStream();
374 QuicCryptoStream* crypto_stream_;
375 DISALLOW_COPY_AND_ASSIGN(TestSession);
378 class MockPacketWriter : public QuicPacketWriter {
381 virtual ~MockPacketWriter();
383 MOCK_METHOD4(WritePacket,
384 WriteResult(const char* buffer,
386 const IPAddressNumber& self_address,
387 const IPEndPoint& peer_address));
388 MOCK_CONST_METHOD0(IsWriteBlockedDataBuffered, bool());
389 MOCK_CONST_METHOD0(IsWriteBlocked, bool());
390 MOCK_METHOD0(SetWritable, void());
393 class MockSendAlgorithm : public SendAlgorithmInterface {
396 virtual ~MockSendAlgorithm();
398 MOCK_METHOD2(SetFromConfig, void(const QuicConfig& config, bool is_server));
399 MOCK_METHOD1(SetMaxPacketSize, void(QuicByteCount max_packet_size));
400 MOCK_METHOD3(OnIncomingQuicCongestionFeedbackFrame,
401 void(const QuicCongestionFeedbackFrame&,
402 QuicTime feedback_receive_time,
403 const SentPacketsMap&));
404 MOCK_METHOD2(OnPacketAcked,
405 void(QuicPacketSequenceNumber, QuicByteCount));
406 MOCK_METHOD2(OnPacketLost, void(QuicPacketSequenceNumber, QuicTime));
407 MOCK_METHOD5(OnPacketSent,
408 bool(QuicTime sent_time, QuicPacketSequenceNumber, QuicByteCount,
409 TransmissionType, HasRetransmittableData));
410 MOCK_METHOD1(OnRetransmissionTimeout, void(bool));
411 MOCK_METHOD2(OnPacketAbandoned, void(QuicPacketSequenceNumber sequence_number,
412 QuicByteCount abandoned_bytes));
413 MOCK_METHOD4(TimeUntilSend, QuicTime::Delta(QuicTime now, TransmissionType,
414 HasRetransmittableData,
416 MOCK_CONST_METHOD0(BandwidthEstimate, QuicBandwidth(void));
417 MOCK_METHOD1(UpdateRtt, void(QuicTime::Delta rtt_sample));
418 MOCK_CONST_METHOD0(SmoothedRtt, QuicTime::Delta(void));
419 MOCK_CONST_METHOD0(RetransmissionDelay, QuicTime::Delta(void));
420 MOCK_CONST_METHOD0(GetCongestionWindow, QuicByteCount());
423 DISALLOW_COPY_AND_ASSIGN(MockSendAlgorithm);
426 class TestEntropyCalculator :
427 public QuicReceivedEntropyHashCalculatorInterface {
429 TestEntropyCalculator();
430 virtual ~TestEntropyCalculator();
432 virtual QuicPacketEntropyHash EntropyHash(
433 QuicPacketSequenceNumber sequence_number) const OVERRIDE;
436 class MockEntropyCalculator : public TestEntropyCalculator {
438 MockEntropyCalculator();
439 virtual ~MockEntropyCalculator();
443 QuicPacketEntropyHash(QuicPacketSequenceNumber sequence_number));
446 class TestDecompressorVisitor : public QuicSpdyDecompressor::Visitor {
448 virtual ~TestDecompressorVisitor() {}
449 virtual bool OnDecompressedData(base::StringPiece data) OVERRIDE;
450 virtual void OnDecompressionError() OVERRIDE;
452 string data() { return data_; }
453 bool error() { return error_; }
460 class MockAckNotifierDelegate : public QuicAckNotifier::DelegateInterface {
462 MockAckNotifierDelegate();
464 MOCK_METHOD0(OnAckNotification, void());
467 // Object is ref counted.
468 virtual ~MockAckNotifierDelegate();
474 #endif // NET_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_