quic_test_utils.h revision 868fa2fe829687343ffae624259930155e16dbd8
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 34void CompareQuicDataWithHexError(const std::string& description, 35 QuicData* actual, 36 QuicData* expected); 37 38// Returns the length of the QuicPacket that will be created if it contains 39// a stream frame that has |payload| bytes. 40size_t GetPacketLengthForOneStream( 41 bool include_version, InFecGroup is_in_fec_group, size_t payload); 42 43string SerializeUncompressedHeaders(const SpdyHeaderBlock& headers); 44 45// Returns QuicConfig set to default values. 46QuicConfig DefaultQuicConfig(); 47 48class MockFramerVisitor : public QuicFramerVisitorInterface { 49 public: 50 MockFramerVisitor(); 51 ~MockFramerVisitor(); 52 53 MOCK_METHOD1(OnError, void(QuicFramer* framer)); 54 // The constructor sets this up to return false by default. 55 MOCK_METHOD1(OnProtocolVersionMismatch, bool(QuicTag version)); 56 MOCK_METHOD0(OnPacket, void()); 57 MOCK_METHOD1(OnPublicResetPacket, void(const QuicPublicResetPacket& header)); 58 MOCK_METHOD1(OnVersionNegotiationPacket, 59 void(const QuicVersionNegotiationPacket& packet)); 60 MOCK_METHOD0(OnRevivedPacket, void()); 61 // The constructor sets this up to return true by default. 62 MOCK_METHOD1(OnPacketHeader, bool(const QuicPacketHeader& header)); 63 MOCK_METHOD1(OnFecProtectedPayload, void(base::StringPiece payload)); 64 MOCK_METHOD1(OnStreamFrame, bool(const QuicStreamFrame& frame)); 65 MOCK_METHOD1(OnAckFrame, bool(const QuicAckFrame& frame)); 66 MOCK_METHOD1(OnCongestionFeedbackFrame, 67 bool(const QuicCongestionFeedbackFrame& frame)); 68 MOCK_METHOD1(OnFecData, void(const QuicFecData& fec)); 69 MOCK_METHOD1(OnRstStreamFrame, bool(const QuicRstStreamFrame& frame)); 70 MOCK_METHOD1(OnConnectionCloseFrame, 71 bool(const QuicConnectionCloseFrame& frame)); 72 MOCK_METHOD1(OnGoAwayFrame, bool(const QuicGoAwayFrame& frame)); 73 MOCK_METHOD0(OnPacketComplete, void()); 74 75 private: 76 DISALLOW_COPY_AND_ASSIGN(MockFramerVisitor); 77}; 78 79class NoOpFramerVisitor : public QuicFramerVisitorInterface { 80 public: 81 NoOpFramerVisitor() {} 82 83 virtual void OnError(QuicFramer* framer) OVERRIDE {} 84 virtual void OnPacket() OVERRIDE {} 85 virtual void OnPublicResetPacket( 86 const QuicPublicResetPacket& packet) OVERRIDE {} 87 virtual void OnVersionNegotiationPacket( 88 const QuicVersionNegotiationPacket& packet) OVERRIDE {} 89 virtual void OnRevivedPacket() OVERRIDE {} 90 virtual bool OnProtocolVersionMismatch(QuicTag version) OVERRIDE; 91 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE; 92 virtual void OnFecProtectedPayload(base::StringPiece payload) OVERRIDE {} 93 virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE; 94 virtual bool OnAckFrame(const QuicAckFrame& frame) OVERRIDE; 95 virtual bool OnCongestionFeedbackFrame( 96 const QuicCongestionFeedbackFrame& frame) OVERRIDE; 97 virtual void OnFecData(const QuicFecData& fec) OVERRIDE {} 98 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE; 99 virtual bool OnConnectionCloseFrame( 100 const QuicConnectionCloseFrame& frame) OVERRIDE; 101 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE; 102 virtual void OnPacketComplete() OVERRIDE {} 103 104 private: 105 DISALLOW_COPY_AND_ASSIGN(NoOpFramerVisitor); 106}; 107 108class FramerVisitorCapturingPublicReset : public NoOpFramerVisitor { 109 public: 110 FramerVisitorCapturingPublicReset(); 111 virtual ~FramerVisitorCapturingPublicReset(); 112 113 virtual void OnPublicResetPacket( 114 const QuicPublicResetPacket& packet) OVERRIDE; 115 116 const QuicPublicResetPacket public_reset_packet() { 117 return public_reset_packet_; 118 } 119 120 private: 121 QuicPublicResetPacket public_reset_packet_; 122}; 123 124class FramerVisitorCapturingFrames : public NoOpFramerVisitor { 125 public: 126 FramerVisitorCapturingFrames(); 127 virtual ~FramerVisitorCapturingFrames(); 128 129 // NoOpFramerVisitor 130 virtual void OnVersionNegotiationPacket( 131 const QuicVersionNegotiationPacket& packet) OVERRIDE; 132 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE; 133 virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE; 134 virtual bool OnAckFrame(const QuicAckFrame& frame) OVERRIDE; 135 virtual bool OnCongestionFeedbackFrame( 136 const QuicCongestionFeedbackFrame& frame) OVERRIDE; 137 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE; 138 virtual bool OnConnectionCloseFrame( 139 const QuicConnectionCloseFrame& frame) OVERRIDE; 140 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE; 141 142 size_t frame_count() const { return frame_count_; } 143 QuicPacketHeader* header() { return &header_; } 144 const std::vector<QuicStreamFrame>* stream_frames() const { 145 return &stream_frames_; 146 } 147 QuicAckFrame* ack() { return ack_.get(); } 148 QuicCongestionFeedbackFrame* feedback() { return feedback_.get(); } 149 QuicRstStreamFrame* rst() { return rst_.get(); } 150 QuicConnectionCloseFrame* close() { return close_.get(); } 151 QuicGoAwayFrame* goaway() { return goaway_.get(); } 152 QuicVersionNegotiationPacket* version_negotiation_packet() { 153 return version_negotiation_packet_.get(); 154 } 155 156 private: 157 size_t frame_count_; 158 QuicPacketHeader header_; 159 std::vector<QuicStreamFrame> stream_frames_; 160 scoped_ptr<QuicAckFrame> ack_; 161 scoped_ptr<QuicCongestionFeedbackFrame> feedback_; 162 scoped_ptr<QuicRstStreamFrame> rst_; 163 scoped_ptr<QuicConnectionCloseFrame> close_; 164 scoped_ptr<QuicGoAwayFrame> goaway_; 165 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; 166 167 DISALLOW_COPY_AND_ASSIGN(FramerVisitorCapturingFrames); 168}; 169 170class MockConnectionVisitor : public QuicConnectionVisitorInterface { 171 public: 172 MockConnectionVisitor(); 173 virtual ~MockConnectionVisitor(); 174 175 MOCK_METHOD4(OnPacket, bool(const IPEndPoint& self_address, 176 const IPEndPoint& peer_address, 177 const QuicPacketHeader& header, 178 const std::vector<QuicStreamFrame>& frame)); 179 MOCK_METHOD1(OnRstStream, void(const QuicRstStreamFrame& frame)); 180 MOCK_METHOD1(OnGoAway, void(const QuicGoAwayFrame& frame)); 181 MOCK_METHOD2(ConnectionClose, void(QuicErrorCode error, bool from_peer)); 182 MOCK_METHOD1(OnAck, void(const SequenceNumberSet& acked_packets)); 183 MOCK_METHOD0(OnCanWrite, bool()); 184 185 private: 186 DISALLOW_COPY_AND_ASSIGN(MockConnectionVisitor); 187}; 188 189class MockHelper : public QuicConnectionHelperInterface { 190 public: 191 MockHelper(); 192 virtual ~MockHelper(); 193 194 MOCK_METHOD1(SetConnection, void(QuicConnection* connection)); 195 const QuicClock* GetClock() const; 196 QuicRandom* GetRandomGenerator(); 197 void AdvanceTime(QuicTime::Delta delta); 198 MOCK_METHOD2(WritePacketToWire, int(const QuicEncryptedPacket& packet, 199 int* error)); 200 MOCK_METHOD0(IsWriteBlockedDataBuffered, bool()); 201 MOCK_METHOD1(IsWriteBlocked, bool(int)); 202 MOCK_METHOD1(SetRetransmissionAlarm, void(QuicTime::Delta delay)); 203 MOCK_METHOD1(SetAckAlarm, void(QuicTime::Delta delay)); 204 MOCK_METHOD1(SetSendAlarm, void(QuicTime alarm_time)); 205 MOCK_METHOD1(SetTimeoutAlarm, void(QuicTime::Delta delay)); 206 MOCK_METHOD0(IsSendAlarmSet, bool()); 207 MOCK_METHOD0(UnregisterSendAlarmIfRegistered, void()); 208 MOCK_METHOD0(ClearAckAlarm, void()); 209 private: 210 MockClock clock_; 211 MockRandom random_generator_; 212}; 213 214class MockConnection : public QuicConnection { 215 public: 216 // Uses a MockHelper. 217 MockConnection(QuicGuid guid, IPEndPoint address, bool is_server); 218 MockConnection(QuicGuid guid, 219 IPEndPoint address, 220 QuicConnectionHelperInterface* helper, 221 bool is_server); 222 virtual ~MockConnection(); 223 224 // If the constructor that uses a MockHelper has been used then this method 225 // will advance the time of the MockClock. 226 void AdvanceTime(QuicTime::Delta delta); 227 228 MOCK_METHOD3(ProcessUdpPacket, void(const IPEndPoint& self_address, 229 const IPEndPoint& peer_address, 230 const QuicEncryptedPacket& packet)); 231 MOCK_METHOD1(SendConnectionClose, void(QuicErrorCode error)); 232 MOCK_METHOD2(SendConnectionCloseWithDetails, void(QuicErrorCode error, 233 const string& details)); 234 MOCK_METHOD2(SendRstStream, void(QuicStreamId id, 235 QuicRstStreamErrorCode error)); 236 MOCK_METHOD3(SendGoAway, void(QuicErrorCode error, 237 QuicStreamId last_good_stream_id, 238 const string& reason)); 239 MOCK_METHOD0(OnCanWrite, bool()); 240 241 void ProcessUdpPacketInternal(const IPEndPoint& self_address, 242 const IPEndPoint& peer_address, 243 const QuicEncryptedPacket& packet) { 244 QuicConnection::ProcessUdpPacket(self_address, peer_address, packet); 245 } 246 247 virtual bool OnProtocolVersionMismatch(QuicTag version) OVERRIDE { 248 return false; 249 } 250 251 private: 252 const bool has_mock_helper_; 253 254 DISALLOW_COPY_AND_ASSIGN(MockConnection); 255}; 256 257class PacketSavingConnection : public MockConnection { 258 public: 259 PacketSavingConnection(QuicGuid guid, IPEndPoint address, bool is_server); 260 virtual ~PacketSavingConnection(); 261 262 virtual bool SendOrQueuePacket( 263 EncryptionLevel level, 264 QuicPacketSequenceNumber sequence_number, 265 QuicPacket* packet, 266 QuicPacketEntropyHash entropy_hash, 267 HasRetransmittableData has_retransmittable_data) OVERRIDE; 268 269 std::vector<QuicPacket*> packets_; 270 std::vector<QuicEncryptedPacket*> encrypted_packets_; 271 272 private: 273 DISALLOW_COPY_AND_ASSIGN(PacketSavingConnection); 274}; 275 276class MockSession : public QuicSession { 277 public: 278 MockSession(QuicConnection* connection, bool is_server); 279 virtual ~MockSession(); 280 281 MOCK_METHOD4(OnPacket, bool(const IPEndPoint& self_address, 282 const IPEndPoint& peer_address, 283 const QuicPacketHeader& header, 284 const std::vector<QuicStreamFrame>& frame)); 285 MOCK_METHOD2(ConnectionClose, void(QuicErrorCode error, bool from_peer)); 286 MOCK_METHOD1(CreateIncomingReliableStream, 287 ReliableQuicStream*(QuicStreamId id)); 288 MOCK_METHOD0(GetCryptoStream, QuicCryptoStream*()); 289 MOCK_METHOD0(CreateOutgoingReliableStream, ReliableQuicStream*()); 290 MOCK_METHOD4(WriteData, QuicConsumedData(QuicStreamId id, 291 base::StringPiece data, 292 QuicStreamOffset offset, 293 bool fin)); 294 MOCK_METHOD0(IsHandshakeComplete, bool()); 295 296 private: 297 DISALLOW_COPY_AND_ASSIGN(MockSession); 298}; 299 300class TestSession : public QuicSession { 301 public: 302 TestSession(QuicConnection* connection, 303 const QuicConfig& config, 304 bool is_server); 305 virtual ~TestSession(); 306 307 MOCK_METHOD1(CreateIncomingReliableStream, 308 ReliableQuicStream*(QuicStreamId id)); 309 MOCK_METHOD0(CreateOutgoingReliableStream, ReliableQuicStream*()); 310 311 void SetCryptoStream(QuicCryptoStream* stream); 312 313 virtual QuicCryptoStream* GetCryptoStream(); 314 315 private: 316 QuicCryptoStream* crypto_stream_; 317 DISALLOW_COPY_AND_ASSIGN(TestSession); 318}; 319 320class MockSendAlgorithm : public SendAlgorithmInterface { 321 public: 322 MockSendAlgorithm(); 323 virtual ~MockSendAlgorithm(); 324 325 MOCK_METHOD3(OnIncomingQuicCongestionFeedbackFrame, 326 void(const QuicCongestionFeedbackFrame&, 327 QuicTime feedback_receive_time, 328 const SentPacketsMap&)); 329 MOCK_METHOD3(OnIncomingAck, 330 void(QuicPacketSequenceNumber, QuicByteCount, QuicTime::Delta)); 331 MOCK_METHOD1(OnIncomingLoss, void(QuicTime)); 332 MOCK_METHOD4(SentPacket, void(QuicTime sent_time, QuicPacketSequenceNumber, 333 QuicByteCount, Retransmission)); 334 MOCK_METHOD2(AbandoningPacket, void(QuicPacketSequenceNumber sequence_number, 335 QuicByteCount abandoned_bytes)); 336 MOCK_METHOD3(TimeUntilSend, QuicTime::Delta(QuicTime now, Retransmission, 337 HasRetransmittableData)); 338 MOCK_METHOD0(BandwidthEstimate, QuicBandwidth(void)); 339 MOCK_METHOD0(SmoothedRtt, 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 ReceivedEntropyHash( 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