quic_test_utils.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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/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" 24 25namespace net { 26 27namespace test { 28 29static const QuicGuid kTestGuid = 42; 30static const int kTestPort = 123; 31 32// Returns the test peer IP address. 33IPAddressNumber TestPeerIPAddress(); 34 35// Upper limit on versions we support. 36QuicVersion QuicVersionMax(); 37 38// Lower limit on versions we support. 39QuicVersion QuicVersionMin(); 40 41// Returns an address for 127.0.0.1. 42IPAddressNumber Loopback4(); 43 44void CompareCharArraysWithHexError(const std::string& description, 45 const char* actual, 46 const int actual_len, 47 const char* expected, 48 const int expected_len); 49 50bool DecodeHexString(const base::StringPiece& hex, std::string* bytes); 51 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. 55size_t GetPacketLengthForOneStream( 56 QuicVersion version, 57 bool include_version, 58 QuicSequenceNumberLength sequence_number_length, 59 InFecGroup is_in_fec_group, 60 size_t* payload_length); 61 62// Returns QuicConfig set to default values. 63QuicConfig DefaultQuicConfig(); 64 65// Returns a version vector consisting of |version|. 66QuicVersionVector SupportedVersions(QuicVersion version); 67 68template<typename SaveType> 69class ValueRestore { 70 public: 71 ValueRestore(SaveType* name, SaveType value) 72 : name_(name), 73 value_(*name) { 74 *name_ = value; 75 } 76 ~ValueRestore() { 77 *name_ = value_; 78 } 79 80 private: 81 SaveType* name_; 82 SaveType value_; 83 84 DISALLOW_COPY_AND_ASSIGN(ValueRestore); 85}; 86 87class MockFramerVisitor : public QuicFramerVisitorInterface { 88 public: 89 MockFramerVisitor(); 90 virtual ~MockFramerVisitor(); 91 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()); 117 118 private: 119 DISALLOW_COPY_AND_ASSIGN(MockFramerVisitor); 120}; 121 122class NoOpFramerVisitor : public QuicFramerVisitorInterface { 123 public: 124 NoOpFramerVisitor() {} 125 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 {} 149 150 private: 151 DISALLOW_COPY_AND_ASSIGN(NoOpFramerVisitor); 152}; 153 154class FramerVisitorCapturingPublicReset : public NoOpFramerVisitor { 155 public: 156 FramerVisitorCapturingPublicReset(); 157 virtual ~FramerVisitorCapturingPublicReset(); 158 159 virtual void OnPublicResetPacket( 160 const QuicPublicResetPacket& packet) OVERRIDE; 161 162 const QuicPublicResetPacket public_reset_packet() { 163 return public_reset_packet_; 164 } 165 166 private: 167 QuicPublicResetPacket public_reset_packet_; 168}; 169 170class FramerVisitorCapturingFrames : public NoOpFramerVisitor { 171 public: 172 FramerVisitorCapturingFrames(); 173 virtual ~FramerVisitorCapturingFrames(); 174 175 // Reset the visitor to it's initial state. 176 void Reset(); 177 178 // NoOpFramerVisitor 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; 190 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_; 195 } 196 const std::vector<string*>& stream_data() const { 197 return stream_data_; 198 } 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(); 206 } 207 208 private: 209 size_t frame_count_; 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_; 219 220 DISALLOW_COPY_AND_ASSIGN(FramerVisitorCapturingFrames); 221}; 222 223class MockConnectionVisitor : public QuicConnectionVisitorInterface { 224 public: 225 MockConnectionVisitor(); 226 virtual ~MockConnectionVisitor(); 227 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()); 238 239 private: 240 DISALLOW_COPY_AND_ASSIGN(MockConnectionVisitor); 241}; 242 243class MockHelper : public QuicConnectionHelperInterface { 244 public: 245 MockHelper(); 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); 251 252 private: 253 MockClock clock_; 254 MockRandom random_generator_; 255}; 256 257class MockConnection : public QuicConnection { 258 public: 259 // Uses a MockHelper, GUID of 42, and 127.0.0.1:123. 260 explicit MockConnection(bool is_server); 261 262 // Uses a MockHelper, GUID of 42. 263 MockConnection(IPEndPoint address, bool is_server); 264 265 // Uses a MockHelper, and 127.0.0.1:123 266 MockConnection(QuicGuid guid, bool is_server); 267 268 // Uses a Mock helper, GUID of 42, and 127.0.0.1:123. 269 MockConnection(bool is_server, const QuicVersionVector& supported_versions); 270 271 virtual ~MockConnection(); 272 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); 276 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()); 290 291 void ProcessUdpPacketInternal(const IPEndPoint& self_address, 292 const IPEndPoint& peer_address, 293 const QuicEncryptedPacket& packet) { 294 QuicConnection::ProcessUdpPacket(self_address, peer_address, packet); 295 } 296 297 virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE { 298 return false; 299 } 300 301 private: 302 scoped_ptr<QuicPacketWriter> writer_; 303 scoped_ptr<QuicConnectionHelperInterface> helper_; 304 305 DISALLOW_COPY_AND_ASSIGN(MockConnection); 306}; 307 308class PacketSavingConnection : public MockConnection { 309 public: 310 explicit PacketSavingConnection(bool is_server); 311 312 PacketSavingConnection(bool is_server, 313 const QuicVersionVector& supported_versions); 314 315 virtual ~PacketSavingConnection(); 316 317 virtual bool SendOrQueuePacket(EncryptionLevel level, 318 const SerializedPacket& packet, 319 TransmissionType transmission_type) OVERRIDE; 320 321 std::vector<QuicPacket*> packets_; 322 std::vector<QuicEncryptedPacket*> encrypted_packets_; 323 324 private: 325 DISALLOW_COPY_AND_ASSIGN(PacketSavingConnection); 326}; 327 328class MockSession : public QuicSession { 329 public: 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, 339 int count, 340 QuicStreamOffset offset, 341 bool fin, 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, 348 bool fin, 349 size_t frame_len)); 350 MOCK_METHOD3(SendRstStream, void(QuicStreamId stream_id, 351 QuicRstStreamErrorCode error, 352 QuicStreamOffset bytes_written)); 353 MOCK_METHOD0(IsCryptoHandshakeConfirmed, bool()); 354 355 using QuicSession::ActivateStream; 356 357 private: 358 DISALLOW_COPY_AND_ASSIGN(MockSession); 359}; 360 361class TestSession : public QuicSession { 362 public: 363 TestSession(QuicConnection* connection, const QuicConfig& config); 364 virtual ~TestSession(); 365 366 MOCK_METHOD1(CreateIncomingDataStream, QuicDataStream*(QuicStreamId id)); 367 MOCK_METHOD0(CreateOutgoingDataStream, QuicDataStream*()); 368 369 void SetCryptoStream(QuicCryptoStream* stream); 370 371 virtual QuicCryptoStream* GetCryptoStream(); 372 373 private: 374 QuicCryptoStream* crypto_stream_; 375 DISALLOW_COPY_AND_ASSIGN(TestSession); 376}; 377 378class MockPacketWriter : public QuicPacketWriter { 379 public: 380 MockPacketWriter(); 381 virtual ~MockPacketWriter(); 382 383 MOCK_METHOD4(WritePacket, 384 WriteResult(const char* buffer, 385 size_t buf_len, 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()); 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_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, 415 IsHandshake)); 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()); 421 422 private: 423 DISALLOW_COPY_AND_ASSIGN(MockSendAlgorithm); 424}; 425 426class TestEntropyCalculator : 427 public QuicReceivedEntropyHashCalculatorInterface { 428 public: 429 TestEntropyCalculator(); 430 virtual ~TestEntropyCalculator(); 431 432 virtual QuicPacketEntropyHash EntropyHash( 433 QuicPacketSequenceNumber sequence_number) const OVERRIDE; 434}; 435 436class MockEntropyCalculator : public TestEntropyCalculator { 437 public: 438 MockEntropyCalculator(); 439 virtual ~MockEntropyCalculator(); 440 441 MOCK_CONST_METHOD1( 442 EntropyHash, 443 QuicPacketEntropyHash(QuicPacketSequenceNumber sequence_number)); 444}; 445 446class TestDecompressorVisitor : public QuicSpdyDecompressor::Visitor { 447 public: 448 virtual ~TestDecompressorVisitor() {} 449 virtual bool OnDecompressedData(base::StringPiece data) OVERRIDE; 450 virtual void OnDecompressionError() OVERRIDE; 451 452 string data() { return data_; } 453 bool error() { return error_; } 454 455 private: 456 string data_; 457 bool error_; 458}; 459 460class MockAckNotifierDelegate : public QuicAckNotifier::DelegateInterface { 461 public: 462 MockAckNotifierDelegate(); 463 464 MOCK_METHOD0(OnAckNotification, void()); 465 466 protected: 467 // Object is ref counted. 468 virtual ~MockAckNotifierDelegate(); 469}; 470 471} // namespace test 472} // namespace net 473 474#endif // NET_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_ 475