quic_test_utils.h revision 3551c9c881056c480085172ff9840cab31610854
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_connection.h" 16#include "net/quic/quic_framer.h" 17#include "net/quic/quic_session.h" 18#include "net/quic/quic_spdy_decompressor.h" 19#include "net/quic/test_tools/mock_clock.h" 20#include "net/quic/test_tools/mock_random.h" 21#include "net/spdy/spdy_framer.h" 22#include "testing/gmock/include/gmock/gmock.h" 23 24namespace net { 25 26namespace test { 27 28void CompareCharArraysWithHexError(const std::string& description, 29 const char* actual, 30 const int actual_len, 31 const char* expected, 32 const int expected_len); 33 34// Returns the length of a QuicPacket that is capable of holding either a 35// stream frame or a minimal ack frame. Sets |*payload_length| to the number 36// of bytes of stream data that will fit in such a packet. 37size_t GetPacketLengthForOneStream( 38 QuicVersion version, 39 bool include_version, 40 QuicSequenceNumberLength sequence_number_length, 41 InFecGroup is_in_fec_group, 42 size_t* payload_length); 43 44// Size in bytes of the stream frame fields for an arbitrary StreamID and 45// offset and the last frame in a packet. 46size_t GetMinStreamFrameSize(QuicVersion version); 47 48// Returns QuicConfig set to default values. 49QuicConfig DefaultQuicConfig(); 50 51class MockFramerVisitor : public QuicFramerVisitorInterface { 52 public: 53 MockFramerVisitor(); 54 ~MockFramerVisitor(); 55 56 MOCK_METHOD1(OnError, void(QuicFramer* framer)); 57 // The constructor sets this up to return false by default. 58 MOCK_METHOD1(OnProtocolVersionMismatch, bool(QuicVersion version)); 59 MOCK_METHOD0(OnPacket, void()); 60 MOCK_METHOD1(OnPublicResetPacket, void(const QuicPublicResetPacket& header)); 61 MOCK_METHOD1(OnVersionNegotiationPacket, 62 void(const QuicVersionNegotiationPacket& packet)); 63 MOCK_METHOD0(OnRevivedPacket, void()); 64 // The constructor sets this up to return true by default. 65 MOCK_METHOD1(OnPacketHeader, bool(const QuicPacketHeader& header)); 66 MOCK_METHOD1(OnFecProtectedPayload, void(base::StringPiece payload)); 67 MOCK_METHOD1(OnStreamFrame, bool(const QuicStreamFrame& frame)); 68 MOCK_METHOD1(OnAckFrame, bool(const QuicAckFrame& frame)); 69 MOCK_METHOD1(OnCongestionFeedbackFrame, 70 bool(const QuicCongestionFeedbackFrame& frame)); 71 MOCK_METHOD1(OnFecData, void(const QuicFecData& fec)); 72 MOCK_METHOD1(OnRstStreamFrame, bool(const QuicRstStreamFrame& frame)); 73 MOCK_METHOD1(OnConnectionCloseFrame, 74 bool(const QuicConnectionCloseFrame& frame)); 75 MOCK_METHOD1(OnGoAwayFrame, bool(const QuicGoAwayFrame& frame)); 76 MOCK_METHOD0(OnPacketComplete, void()); 77 78 private: 79 DISALLOW_COPY_AND_ASSIGN(MockFramerVisitor); 80}; 81 82class NoOpFramerVisitor : public QuicFramerVisitorInterface { 83 public: 84 NoOpFramerVisitor() {} 85 86 virtual void OnError(QuicFramer* framer) OVERRIDE {} 87 virtual void OnPacket() OVERRIDE {} 88 virtual void OnPublicResetPacket( 89 const QuicPublicResetPacket& packet) OVERRIDE {} 90 virtual void OnVersionNegotiationPacket( 91 const QuicVersionNegotiationPacket& packet) OVERRIDE {} 92 virtual void OnRevivedPacket() OVERRIDE {} 93 virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE; 94 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE; 95 virtual void OnFecProtectedPayload(base::StringPiece payload) OVERRIDE {} 96 virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE; 97 virtual bool OnAckFrame(const QuicAckFrame& frame) OVERRIDE; 98 virtual bool OnCongestionFeedbackFrame( 99 const QuicCongestionFeedbackFrame& frame) OVERRIDE; 100 virtual void OnFecData(const QuicFecData& fec) OVERRIDE {} 101 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE; 102 virtual bool OnConnectionCloseFrame( 103 const QuicConnectionCloseFrame& frame) OVERRIDE; 104 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE; 105 virtual void OnPacketComplete() OVERRIDE {} 106 107 private: 108 DISALLOW_COPY_AND_ASSIGN(NoOpFramerVisitor); 109}; 110 111class FramerVisitorCapturingPublicReset : public NoOpFramerVisitor { 112 public: 113 FramerVisitorCapturingPublicReset(); 114 virtual ~FramerVisitorCapturingPublicReset(); 115 116 virtual void OnPublicResetPacket( 117 const QuicPublicResetPacket& packet) OVERRIDE; 118 119 const QuicPublicResetPacket public_reset_packet() { 120 return public_reset_packet_; 121 } 122 123 private: 124 QuicPublicResetPacket public_reset_packet_; 125}; 126 127class FramerVisitorCapturingFrames : public NoOpFramerVisitor { 128 public: 129 FramerVisitorCapturingFrames(); 130 virtual ~FramerVisitorCapturingFrames(); 131 132 // NoOpFramerVisitor 133 virtual void OnVersionNegotiationPacket( 134 const QuicVersionNegotiationPacket& packet) OVERRIDE; 135 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE; 136 virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE; 137 virtual bool OnAckFrame(const QuicAckFrame& frame) OVERRIDE; 138 virtual bool OnCongestionFeedbackFrame( 139 const QuicCongestionFeedbackFrame& frame) OVERRIDE; 140 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE; 141 virtual bool OnConnectionCloseFrame( 142 const QuicConnectionCloseFrame& frame) OVERRIDE; 143 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE; 144 145 size_t frame_count() const { return frame_count_; } 146 QuicPacketHeader* header() { return &header_; } 147 const std::vector<QuicStreamFrame>* stream_frames() const { 148 return &stream_frames_; 149 } 150 QuicAckFrame* ack() { return ack_.get(); } 151 QuicCongestionFeedbackFrame* feedback() { return feedback_.get(); } 152 QuicRstStreamFrame* rst() { return rst_.get(); } 153 QuicConnectionCloseFrame* close() { return close_.get(); } 154 QuicGoAwayFrame* goaway() { return goaway_.get(); } 155 QuicVersionNegotiationPacket* version_negotiation_packet() { 156 return version_negotiation_packet_.get(); 157 } 158 159 private: 160 size_t frame_count_; 161 QuicPacketHeader header_; 162 std::vector<QuicStreamFrame> stream_frames_; 163 scoped_ptr<QuicAckFrame> ack_; 164 scoped_ptr<QuicCongestionFeedbackFrame> feedback_; 165 scoped_ptr<QuicRstStreamFrame> rst_; 166 scoped_ptr<QuicConnectionCloseFrame> close_; 167 scoped_ptr<QuicGoAwayFrame> goaway_; 168 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; 169 170 DISALLOW_COPY_AND_ASSIGN(FramerVisitorCapturingFrames); 171}; 172 173class MockConnectionVisitor : public QuicConnectionVisitorInterface { 174 public: 175 MockConnectionVisitor(); 176 virtual ~MockConnectionVisitor(); 177 178 MOCK_METHOD4(OnPacket, bool(const IPEndPoint& self_address, 179 const IPEndPoint& peer_address, 180 const QuicPacketHeader& header, 181 const std::vector<QuicStreamFrame>& frame)); 182 MOCK_METHOD1(OnRstStream, void(const QuicRstStreamFrame& frame)); 183 MOCK_METHOD1(OnGoAway, void(const QuicGoAwayFrame& frame)); 184 MOCK_METHOD2(ConnectionClose, void(QuicErrorCode error, bool from_peer)); 185 MOCK_METHOD1(OnAck, void(const SequenceNumberSet& acked_packets)); 186 MOCK_METHOD0(OnCanWrite, bool()); 187 188 private: 189 DISALLOW_COPY_AND_ASSIGN(MockConnectionVisitor); 190}; 191 192class MockHelper : public QuicConnectionHelperInterface { 193 public: 194 MockHelper(); 195 virtual ~MockHelper(); 196 197 MOCK_METHOD1(SetConnection, void(QuicConnection* connection)); 198 const QuicClock* GetClock() const; 199 QuicRandom* GetRandomGenerator(); 200 void AdvanceTime(QuicTime::Delta delta); 201 MOCK_METHOD2(WritePacketToWire, int(const QuicEncryptedPacket& packet, 202 int* error)); 203 MOCK_METHOD0(IsWriteBlockedDataBuffered, bool()); 204 MOCK_METHOD1(IsWriteBlocked, bool(int)); 205 virtual QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate); 206 207 private: 208 MockClock clock_; 209 MockRandom random_generator_; 210}; 211 212class MockConnection : public QuicConnection { 213 public: 214 // Uses a MockHelper. 215 MockConnection(QuicGuid guid, IPEndPoint address, bool is_server); 216 MockConnection(QuicGuid guid, 217 IPEndPoint address, 218 QuicConnectionHelperInterface* helper, 219 bool is_server); 220 virtual ~MockConnection(); 221 222 // If the constructor that uses a MockHelper has been used then this method 223 // will advance the time of the MockClock. 224 void AdvanceTime(QuicTime::Delta delta); 225 226 MOCK_METHOD3(ProcessUdpPacket, void(const IPEndPoint& self_address, 227 const IPEndPoint& peer_address, 228 const QuicEncryptedPacket& packet)); 229 MOCK_METHOD1(SendConnectionClose, void(QuicErrorCode error)); 230 MOCK_METHOD2(SendConnectionCloseWithDetails, void(QuicErrorCode error, 231 const string& details)); 232 MOCK_METHOD2(SendRstStream, void(QuicStreamId id, 233 QuicRstStreamErrorCode error)); 234 MOCK_METHOD3(SendGoAway, void(QuicErrorCode error, 235 QuicStreamId last_good_stream_id, 236 const string& reason)); 237 MOCK_METHOD0(OnCanWrite, bool()); 238 239 void ProcessUdpPacketInternal(const IPEndPoint& self_address, 240 const IPEndPoint& peer_address, 241 const QuicEncryptedPacket& packet) { 242 QuicConnection::ProcessUdpPacket(self_address, peer_address, packet); 243 } 244 245 virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE { 246 return false; 247 } 248 249 private: 250 const bool has_mock_helper_; 251 252 DISALLOW_COPY_AND_ASSIGN(MockConnection); 253}; 254 255class PacketSavingConnection : public MockConnection { 256 public: 257 PacketSavingConnection(QuicGuid guid, IPEndPoint address, bool is_server); 258 virtual ~PacketSavingConnection(); 259 260 virtual bool SendOrQueuePacket( 261 EncryptionLevel level, 262 QuicPacketSequenceNumber sequence_number, 263 QuicPacket* packet, 264 QuicPacketEntropyHash entropy_hash, 265 HasRetransmittableData has_retransmittable_data) OVERRIDE; 266 267 std::vector<QuicPacket*> packets_; 268 std::vector<QuicEncryptedPacket*> encrypted_packets_; 269 270 private: 271 DISALLOW_COPY_AND_ASSIGN(PacketSavingConnection); 272}; 273 274class MockSession : public QuicSession { 275 public: 276 MockSession(QuicConnection* connection, bool is_server); 277 virtual ~MockSession(); 278 279 MOCK_METHOD4(OnPacket, bool(const IPEndPoint& self_address, 280 const IPEndPoint& peer_address, 281 const QuicPacketHeader& header, 282 const std::vector<QuicStreamFrame>& frame)); 283 MOCK_METHOD2(ConnectionClose, void(QuicErrorCode error, bool from_peer)); 284 MOCK_METHOD1(CreateIncomingReliableStream, 285 ReliableQuicStream*(QuicStreamId id)); 286 MOCK_METHOD0(GetCryptoStream, QuicCryptoStream*()); 287 MOCK_METHOD0(CreateOutgoingReliableStream, ReliableQuicStream*()); 288 MOCK_METHOD4(WriteData, QuicConsumedData(QuicStreamId id, 289 base::StringPiece data, 290 QuicStreamOffset offset, 291 bool fin)); 292 MOCK_METHOD0(IsHandshakeComplete, bool()); 293 294 private: 295 DISALLOW_COPY_AND_ASSIGN(MockSession); 296}; 297 298class TestSession : public QuicSession { 299 public: 300 TestSession(QuicConnection* connection, 301 const QuicConfig& config, 302 bool is_server); 303 virtual ~TestSession(); 304 305 MOCK_METHOD1(CreateIncomingReliableStream, 306 ReliableQuicStream*(QuicStreamId id)); 307 MOCK_METHOD0(CreateOutgoingReliableStream, ReliableQuicStream*()); 308 309 void SetCryptoStream(QuicCryptoStream* stream); 310 311 virtual QuicCryptoStream* GetCryptoStream(); 312 313 private: 314 QuicCryptoStream* crypto_stream_; 315 DISALLOW_COPY_AND_ASSIGN(TestSession); 316}; 317 318class MockSendAlgorithm : public SendAlgorithmInterface { 319 public: 320 MockSendAlgorithm(); 321 virtual ~MockSendAlgorithm(); 322 323 MOCK_METHOD3(OnIncomingQuicCongestionFeedbackFrame, 324 void(const QuicCongestionFeedbackFrame&, 325 QuicTime feedback_receive_time, 326 const SentPacketsMap&)); 327 MOCK_METHOD3(OnIncomingAck, 328 void(QuicPacketSequenceNumber, QuicByteCount, QuicTime::Delta)); 329 MOCK_METHOD1(OnIncomingLoss, void(QuicTime)); 330 MOCK_METHOD4(SentPacket, void(QuicTime sent_time, QuicPacketSequenceNumber, 331 QuicByteCount, Retransmission)); 332 MOCK_METHOD2(AbandoningPacket, void(QuicPacketSequenceNumber sequence_number, 333 QuicByteCount abandoned_bytes)); 334 MOCK_METHOD4(TimeUntilSend, QuicTime::Delta(QuicTime now, Retransmission, 335 HasRetransmittableData, 336 IsHandshake)); 337 MOCK_METHOD0(BandwidthEstimate, QuicBandwidth(void)); 338 MOCK_METHOD0(SmoothedRtt, QuicTime::Delta(void)); 339 MOCK_METHOD0(RetransmissionDelay, QuicTime::Delta(void)); 340 341 private: 342 DISALLOW_COPY_AND_ASSIGN(MockSendAlgorithm); 343}; 344 345class TestEntropyCalculator : 346 public QuicReceivedEntropyHashCalculatorInterface { 347 public: 348 TestEntropyCalculator() { } 349 virtual ~TestEntropyCalculator() { } 350 351 virtual QuicPacketEntropyHash EntropyHash( 352 QuicPacketSequenceNumber sequence_number) const OVERRIDE; 353}; 354 355class TestDecompressorVisitor : public QuicSpdyDecompressor::Visitor { 356 public: 357 virtual ~TestDecompressorVisitor() {} 358 virtual bool OnDecompressedData(base::StringPiece data) OVERRIDE; 359 virtual void OnDecompressionError() OVERRIDE; 360 361 string data() { return data_; } 362 bool error() { return error_; } 363 364 private: 365 string data_; 366 bool error_; 367}; 368 369} // namespace test 370} // namespace net 371 372#endif // NET_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_ 373