| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | // Common utilities for Quic tests | 
 |  | 
 | #ifndef QUICHE_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_ | 
 | #define QUICHE_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_ | 
 |  | 
 | #include <cstdint> | 
 | #include <memory> | 
 | #include <string> | 
 | #include <utility> | 
 | #include <vector> | 
 |  | 
 | #include "net/third_party/quiche/src/quic/core/congestion_control/loss_detection_interface.h" | 
 | #include "net/third_party/quiche/src/quic/core/congestion_control/send_algorithm_interface.h" | 
 | #include "net/third_party/quiche/src/quic/core/http/quic_client_push_promise_index.h" | 
 | #include "net/third_party/quiche/src/quic/core/http/quic_server_session_base.h" | 
 | #include "net/third_party/quiche/src/quic/core/http/quic_spdy_session.h" | 
 | #include "net/third_party/quiche/src/quic/core/quic_connection.h" | 
 | #include "net/third_party/quiche/src/quic/core/quic_framer.h" | 
 | #include "net/third_party/quiche/src/quic/core/quic_packet_writer.h" | 
 | #include "net/third_party/quiche/src/quic/core/quic_sent_packet_manager.h" | 
 | #include "net/third_party/quiche/src/quic/core/quic_simple_buffer_allocator.h" | 
 | #include "net/third_party/quiche/src/quic/core/quic_types.h" | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice_storage.h" | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_test.h" | 
 | #include "net/third_party/quiche/src/quic/test_tools/mock_clock.h" | 
 | #include "net/third_party/quiche/src/quic/test_tools/mock_quic_session_visitor.h" | 
 | #include "net/third_party/quiche/src/quic/test_tools/mock_random.h" | 
 | #include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.h" | 
 | #include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" | 
 |  | 
 | namespace quic { | 
 |  | 
 | namespace test { | 
 |  | 
 | // A generic predictable connection ID suited for testing. | 
 | QuicConnectionId TestConnectionId(); | 
 |  | 
 | // A generic predictable connection ID suited for testing, generated from a | 
 | // given number, such as an index. | 
 | QuicConnectionId TestConnectionId(uint64_t connection_number); | 
 |  | 
 | // A generic predictable connection ID suited for testing, generated from a | 
 | // given number, such as an index. Guaranteed to be 9 bytes long. | 
 | QuicConnectionId TestConnectionIdNineBytesLong(uint64_t connection_number); | 
 |  | 
 | // Extracts the connection number passed to TestConnectionId(). | 
 | uint64_t TestConnectionIdToUInt64(QuicConnectionId connection_id); | 
 |  | 
 | static const uint16_t kTestPort = 12345; | 
 | static const uint32_t kInitialStreamFlowControlWindowForTest = | 
 |     1024 * 1024;  // 1 MB | 
 | static const uint32_t kInitialSessionFlowControlWindowForTest = | 
 |     1536 * 1024;  // 1.5 MB | 
 |  | 
 | // Returns the test peer IP address. | 
 | QuicIpAddress TestPeerIPAddress(); | 
 |  | 
 | // Upper limit on versions we support. | 
 | ParsedQuicVersion QuicVersionMax(); | 
 |  | 
 | // Lower limit on versions we support. | 
 | ParsedQuicVersion QuicVersionMin(); | 
 |  | 
 | // Upper limit on versions we support. | 
 | // TODO(nharper): Remove this function when it is no longer used. | 
 | QuicTransportVersion QuicTransportVersionMax(); | 
 |  | 
 | // Lower limit on versions we support. | 
 | // TODO(nharper): Remove this function when it is no longer used. | 
 | QuicTransportVersion QuicTransportVersionMin(); | 
 |  | 
 | // Create an encrypted packet for testing. | 
 | // If versions == nullptr, uses &AllSupportedVersions(). | 
 | // Note that the packet is encrypted with NullEncrypter, so to decrypt the | 
 | // constructed packet, the framer must be set to use NullDecrypter. | 
 | QuicEncryptedPacket* ConstructEncryptedPacket( | 
 |     QuicConnectionId destination_connection_id, | 
 |     QuicConnectionId source_connection_id, | 
 |     bool version_flag, | 
 |     bool reset_flag, | 
 |     uint64_t packet_number, | 
 |     const std::string& data, | 
 |     bool full_padding, | 
 |     QuicConnectionIdIncluded destination_connection_id_included, | 
 |     QuicConnectionIdIncluded source_connection_id_included, | 
 |     QuicPacketNumberLength packet_number_length, | 
 |     ParsedQuicVersionVector* versions, | 
 |     Perspective perspective); | 
 |  | 
 | QuicEncryptedPacket* ConstructEncryptedPacket( | 
 |     QuicConnectionId destination_connection_id, | 
 |     QuicConnectionId source_connection_id, | 
 |     bool version_flag, | 
 |     bool reset_flag, | 
 |     uint64_t packet_number, | 
 |     const std::string& data, | 
 |     bool full_padding, | 
 |     QuicConnectionIdIncluded destination_connection_id_included, | 
 |     QuicConnectionIdIncluded source_connection_id_included, | 
 |     QuicPacketNumberLength packet_number_length, | 
 |     ParsedQuicVersionVector* versions); | 
 |  | 
 | // Create an encrypted packet for testing. | 
 | // If versions == nullptr, uses &AllSupportedVersions(). | 
 | // Note that the packet is encrypted with NullEncrypter, so to decrypt the | 
 | // constructed packet, the framer must be set to use NullDecrypter. | 
 | QuicEncryptedPacket* ConstructEncryptedPacket( | 
 |     QuicConnectionId destination_connection_id, | 
 |     QuicConnectionId source_connection_id, | 
 |     bool version_flag, | 
 |     bool reset_flag, | 
 |     uint64_t packet_number, | 
 |     const std::string& data, | 
 |     QuicConnectionIdIncluded destination_connection_id_included, | 
 |     QuicConnectionIdIncluded source_connection_id_included, | 
 |     QuicPacketNumberLength packet_number_length, | 
 |     ParsedQuicVersionVector* versions); | 
 |  | 
 | // This form assumes |versions| == nullptr. | 
 | QuicEncryptedPacket* ConstructEncryptedPacket( | 
 |     QuicConnectionId destination_connection_id, | 
 |     QuicConnectionId source_connection_id, | 
 |     bool version_flag, | 
 |     bool reset_flag, | 
 |     uint64_t packet_number, | 
 |     const std::string& data, | 
 |     QuicConnectionIdIncluded destination_connection_id_included, | 
 |     QuicConnectionIdIncluded source_connection_id_included, | 
 |     QuicPacketNumberLength packet_number_length); | 
 |  | 
 | // This form assumes |connection_id_length| == PACKET_8BYTE_CONNECTION_ID, | 
 | // |packet_number_length| == PACKET_4BYTE_PACKET_NUMBER and | 
 | // |versions| == nullptr. | 
 | QuicEncryptedPacket* ConstructEncryptedPacket( | 
 |     QuicConnectionId destination_connection_id, | 
 |     QuicConnectionId source_connection_id, | 
 |     bool version_flag, | 
 |     bool reset_flag, | 
 |     uint64_t packet_number, | 
 |     const std::string& data); | 
 |  | 
 | // Constructs a received packet for testing. The caller must take ownership of | 
 | // the returned pointer. | 
 | QuicReceivedPacket* ConstructReceivedPacket( | 
 |     const QuicEncryptedPacket& encrypted_packet, | 
 |     QuicTime receipt_time); | 
 |  | 
 | // Create an encrypted packet for testing whose data portion erroneous. | 
 | // The specific way the data portion is erroneous is not specified, but | 
 | // it is an error that QuicFramer detects. | 
 | // Note that the packet is encrypted with NullEncrypter, so to decrypt the | 
 | // constructed packet, the framer must be set to use NullDecrypter. | 
 | QuicEncryptedPacket* ConstructMisFramedEncryptedPacket( | 
 |     QuicConnectionId destination_connection_id, | 
 |     QuicConnectionId source_connection_id, | 
 |     bool version_flag, | 
 |     bool reset_flag, | 
 |     uint64_t packet_number, | 
 |     const std::string& data, | 
 |     QuicConnectionIdIncluded destination_connection_id_included, | 
 |     QuicConnectionIdIncluded source_connection_id_included, | 
 |     QuicPacketNumberLength packet_number_length, | 
 |     ParsedQuicVersion version, | 
 |     Perspective perspective); | 
 |  | 
 | // Returns QuicConfig set to default values. | 
 | QuicConfig DefaultQuicConfig(); | 
 |  | 
 | ParsedQuicVersionVector SupportedVersions(ParsedQuicVersion version); | 
 |  | 
 | struct QuicAckBlock { | 
 |   QuicPacketNumber start;  // Included | 
 |   QuicPacketNumber limit;  // Excluded | 
 | }; | 
 |  | 
 | // Testing convenience method to construct a QuicAckFrame with arbitrary ack | 
 | // blocks. Each block is given by a (closed-open) range of packet numbers. e.g.: | 
 | // InitAckFrame({{1, 10}}) | 
 | //   => 1 ack block acking packet numbers 1 to 9. | 
 | // | 
 | // InitAckFrame({{1, 2}, {3, 4}}) | 
 | //   => 2 ack blocks acking packet 1 and 3. Packet 2 is missing. | 
 | QuicAckFrame InitAckFrame(const std::vector<QuicAckBlock>& ack_blocks); | 
 |  | 
 | // Testing convenience method to construct a QuicAckFrame with 1 ack block which | 
 | // covers packet number range [1, |largest_acked| + 1). | 
 | // Equivalent to InitAckFrame({{1, largest_acked + 1}}) | 
 | QuicAckFrame InitAckFrame(uint64_t largest_acked); | 
 | QuicAckFrame InitAckFrame(QuicPacketNumber largest_acked); | 
 |  | 
 | // Testing convenience method to construct a QuicAckFrame with |num_ack_blocks| | 
 | // ack blocks of width 1 packet, starting from |least_unacked| + 2. | 
 | QuicAckFrame MakeAckFrameWithAckBlocks(size_t num_ack_blocks, | 
 |                                        uint64_t least_unacked); | 
 |  | 
 | // Testing convenice method to construct a QuicAckFrame with |largest_acked|, | 
 | // ack blocks of width 1 packet and |gap_size|. | 
 | QuicAckFrame MakeAckFrameWithGaps(uint64_t gap_size, | 
 |                                   size_t max_num_gaps, | 
 |                                   uint64_t largest_acked); | 
 |  | 
 | // Returns the encryption level that corresponds to the header type in | 
 | // |header|. If the header is for GOOGLE_QUIC_PACKET instead of an | 
 | // IETF-invariants packet, this function returns ENCRYPTION_INITIAL. | 
 | EncryptionLevel HeaderToEncryptionLevel(const QuicPacketHeader& header); | 
 |  | 
 | // Returns a QuicPacket that is owned by the caller, and | 
 | // is populated with the fields in |header| and |frames|, or is nullptr if the | 
 | // packet could not be created. | 
 | std::unique_ptr<QuicPacket> BuildUnsizedDataPacket( | 
 |     QuicFramer* framer, | 
 |     const QuicPacketHeader& header, | 
 |     const QuicFrames& frames); | 
 | // Returns a QuicPacket that is owned by the caller, and of size |packet_size|. | 
 | std::unique_ptr<QuicPacket> BuildUnsizedDataPacket( | 
 |     QuicFramer* framer, | 
 |     const QuicPacketHeader& header, | 
 |     const QuicFrames& frames, | 
 |     size_t packet_size); | 
 |  | 
 | // Compute SHA-1 hash of the supplied std::string. | 
 | std::string Sha1Hash(quiche::QuicheStringPiece data); | 
 |  | 
 | // Delete |frame| and return true. | 
 | bool ClearControlFrame(const QuicFrame& frame); | 
 |  | 
 | // Simple random number generator used to compute random numbers suitable | 
 | // for pseudo-randomly dropping packets in tests. | 
 | class SimpleRandom : public QuicRandom { | 
 |  public: | 
 |   SimpleRandom() { set_seed(0); } | 
 |   SimpleRandom(const SimpleRandom&) = delete; | 
 |   SimpleRandom& operator=(const SimpleRandom&) = delete; | 
 |   ~SimpleRandom() override {} | 
 |  | 
 |   // Returns a random number in the range [0, kuint64max]. | 
 |   uint64_t RandUint64() override; | 
 |  | 
 |   void RandBytes(void* data, size_t len) override; | 
 |  | 
 |   void set_seed(uint64_t seed); | 
 |  | 
 |  private: | 
 |   uint8_t buffer_[4096]; | 
 |   size_t buffer_offset_; | 
 |   uint8_t key_[32]; | 
 |  | 
 |   void FillBuffer(); | 
 | }; | 
 |  | 
 | class MockFramerVisitor : public QuicFramerVisitorInterface { | 
 |  public: | 
 |   MockFramerVisitor(); | 
 |   MockFramerVisitor(const MockFramerVisitor&) = delete; | 
 |   MockFramerVisitor& operator=(const MockFramerVisitor&) = delete; | 
 |   ~MockFramerVisitor() override; | 
 |  | 
 |   MOCK_METHOD1(OnError, void(QuicFramer* framer)); | 
 |   // The constructor sets this up to return false by default. | 
 |   MOCK_METHOD1(OnProtocolVersionMismatch, bool(ParsedQuicVersion version)); | 
 |   MOCK_METHOD0(OnPacket, void()); | 
 |   MOCK_METHOD1(OnPublicResetPacket, void(const QuicPublicResetPacket& header)); | 
 |   MOCK_METHOD1(OnVersionNegotiationPacket, | 
 |                void(const QuicVersionNegotiationPacket& packet)); | 
 |   MOCK_METHOD5(OnRetryPacket, | 
 |                void(QuicConnectionId original_connection_id, | 
 |                     QuicConnectionId new_connection_id, | 
 |                     quiche::QuicheStringPiece retry_token, | 
 |                     quiche::QuicheStringPiece retry_integrity_tag, | 
 |                     quiche::QuicheStringPiece retry_without_tag)); | 
 |   // The constructor sets this up to return true by default. | 
 |   MOCK_METHOD1(OnUnauthenticatedHeader, bool(const QuicPacketHeader& header)); | 
 |   // The constructor sets this up to return true by default. | 
 |   MOCK_METHOD1(OnUnauthenticatedPublicHeader, | 
 |                bool(const QuicPacketHeader& header)); | 
 |   MOCK_METHOD1(OnDecryptedPacket, void(EncryptionLevel level)); | 
 |   MOCK_METHOD1(OnPacketHeader, bool(const QuicPacketHeader& header)); | 
 |   MOCK_METHOD1(OnCoalescedPacket, void(const QuicEncryptedPacket& packet)); | 
 |   MOCK_METHOD3(OnUndecryptablePacket, | 
 |                void(const QuicEncryptedPacket& packet, | 
 |                     EncryptionLevel decryption_level, | 
 |                     bool has_decryption_key)); | 
 |   MOCK_METHOD1(OnStreamFrame, bool(const QuicStreamFrame& frame)); | 
 |   MOCK_METHOD1(OnCryptoFrame, bool(const QuicCryptoFrame& frame)); | 
 |   MOCK_METHOD2(OnAckFrameStart, bool(QuicPacketNumber, QuicTime::Delta)); | 
 |   MOCK_METHOD2(OnAckRange, bool(QuicPacketNumber, QuicPacketNumber)); | 
 |   MOCK_METHOD2(OnAckTimestamp, bool(QuicPacketNumber, QuicTime)); | 
 |   MOCK_METHOD1(OnAckFrameEnd, bool(QuicPacketNumber)); | 
 |   MOCK_METHOD1(OnStopWaitingFrame, bool(const QuicStopWaitingFrame& frame)); | 
 |   MOCK_METHOD1(OnPaddingFrame, bool(const QuicPaddingFrame& frame)); | 
 |   MOCK_METHOD1(OnPingFrame, bool(const QuicPingFrame& frame)); | 
 |   MOCK_METHOD1(OnRstStreamFrame, bool(const QuicRstStreamFrame& frame)); | 
 |   MOCK_METHOD1(OnConnectionCloseFrame, | 
 |                bool(const QuicConnectionCloseFrame& frame)); | 
 |   MOCK_METHOD1(OnNewConnectionIdFrame, | 
 |                bool(const QuicNewConnectionIdFrame& frame)); | 
 |   MOCK_METHOD1(OnRetireConnectionIdFrame, | 
 |                bool(const QuicRetireConnectionIdFrame& frame)); | 
 |   MOCK_METHOD1(OnNewTokenFrame, bool(const QuicNewTokenFrame& frame)); | 
 |   MOCK_METHOD1(OnStopSendingFrame, bool(const QuicStopSendingFrame& frame)); | 
 |   MOCK_METHOD1(OnPathChallengeFrame, bool(const QuicPathChallengeFrame& frame)); | 
 |   MOCK_METHOD1(OnPathResponseFrame, bool(const QuicPathResponseFrame& frame)); | 
 |   MOCK_METHOD1(OnGoAwayFrame, bool(const QuicGoAwayFrame& frame)); | 
 |   MOCK_METHOD1(OnMaxStreamsFrame, bool(const QuicMaxStreamsFrame& frame)); | 
 |   MOCK_METHOD1(OnStreamsBlockedFrame, | 
 |                bool(const QuicStreamsBlockedFrame& frame)); | 
 |   MOCK_METHOD1(OnWindowUpdateFrame, bool(const QuicWindowUpdateFrame& frame)); | 
 |   MOCK_METHOD1(OnBlockedFrame, bool(const QuicBlockedFrame& frame)); | 
 |   MOCK_METHOD1(OnMessageFrame, bool(const QuicMessageFrame& frame)); | 
 |   MOCK_METHOD1(OnHandshakeDoneFrame, bool(const QuicHandshakeDoneFrame& frame)); | 
 |   MOCK_METHOD0(OnPacketComplete, void()); | 
 |   MOCK_CONST_METHOD1(IsValidStatelessResetToken, bool(QuicUint128)); | 
 |   MOCK_METHOD1(OnAuthenticatedIetfStatelessResetPacket, | 
 |                void(const QuicIetfStatelessResetPacket&)); | 
 | }; | 
 |  | 
 | class NoOpFramerVisitor : public QuicFramerVisitorInterface { | 
 |  public: | 
 |   NoOpFramerVisitor() {} | 
 |   NoOpFramerVisitor(const NoOpFramerVisitor&) = delete; | 
 |   NoOpFramerVisitor& operator=(const NoOpFramerVisitor&) = delete; | 
 |  | 
 |   void OnError(QuicFramer* /*framer*/) override {} | 
 |   void OnPacket() override {} | 
 |   void OnPublicResetPacket(const QuicPublicResetPacket& /*packet*/) override {} | 
 |   void OnVersionNegotiationPacket( | 
 |       const QuicVersionNegotiationPacket& /*packet*/) override {} | 
 |   void OnRetryPacket(QuicConnectionId /*original_connection_id*/, | 
 |                      QuicConnectionId /*new_connection_id*/, | 
 |                      quiche::QuicheStringPiece /*retry_token*/, | 
 |                      quiche::QuicheStringPiece /*retry_integrity_tag*/, | 
 |                      quiche::QuicheStringPiece /*retry_without_tag*/) override { | 
 |   } | 
 |   bool OnProtocolVersionMismatch(ParsedQuicVersion version) override; | 
 |   bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override; | 
 |   bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override; | 
 |   void OnDecryptedPacket(EncryptionLevel /*level*/) override {} | 
 |   bool OnPacketHeader(const QuicPacketHeader& header) override; | 
 |   void OnCoalescedPacket(const QuicEncryptedPacket& packet) override; | 
 |   void OnUndecryptablePacket(const QuicEncryptedPacket& packet, | 
 |                              EncryptionLevel decryption_level, | 
 |                              bool has_decryption_key) override; | 
 |   bool OnStreamFrame(const QuicStreamFrame& frame) override; | 
 |   bool OnCryptoFrame(const QuicCryptoFrame& frame) override; | 
 |   bool OnAckFrameStart(QuicPacketNumber largest_acked, | 
 |                        QuicTime::Delta ack_delay_time) override; | 
 |   bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override; | 
 |   bool OnAckTimestamp(QuicPacketNumber packet_number, | 
 |                       QuicTime timestamp) override; | 
 |   bool OnAckFrameEnd(QuicPacketNumber start) override; | 
 |   bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override; | 
 |   bool OnPaddingFrame(const QuicPaddingFrame& frame) override; | 
 |   bool OnPingFrame(const QuicPingFrame& frame) override; | 
 |   bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override; | 
 |   bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override; | 
 |   bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override; | 
 |   bool OnRetireConnectionIdFrame( | 
 |       const QuicRetireConnectionIdFrame& frame) override; | 
 |   bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override; | 
 |   bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override; | 
 |   bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override; | 
 |   bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override; | 
 |   bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override; | 
 |   bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override; | 
 |   bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override; | 
 |   bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override; | 
 |   bool OnBlockedFrame(const QuicBlockedFrame& frame) override; | 
 |   bool OnMessageFrame(const QuicMessageFrame& frame) override; | 
 |   bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override; | 
 |   void OnPacketComplete() override {} | 
 |   bool IsValidStatelessResetToken(QuicUint128 token) const override; | 
 |   void OnAuthenticatedIetfStatelessResetPacket( | 
 |       const QuicIetfStatelessResetPacket& /*packet*/) override {} | 
 | }; | 
 |  | 
 | class MockQuicConnectionVisitor : public QuicConnectionVisitorInterface { | 
 |  public: | 
 |   MockQuicConnectionVisitor(); | 
 |   MockQuicConnectionVisitor(const MockQuicConnectionVisitor&) = delete; | 
 |   MockQuicConnectionVisitor& operator=(const MockQuicConnectionVisitor&) = | 
 |       delete; | 
 |   ~MockQuicConnectionVisitor() override; | 
 |  | 
 |   MOCK_METHOD1(OnStreamFrame, void(const QuicStreamFrame& frame)); | 
 |   MOCK_METHOD1(OnCryptoFrame, void(const QuicCryptoFrame& frame)); | 
 |   MOCK_METHOD1(OnWindowUpdateFrame, void(const QuicWindowUpdateFrame& frame)); | 
 |   MOCK_METHOD1(OnBlockedFrame, void(const QuicBlockedFrame& frame)); | 
 |   MOCK_METHOD1(OnRstStream, void(const QuicRstStreamFrame& frame)); | 
 |   MOCK_METHOD1(OnGoAway, void(const QuicGoAwayFrame& frame)); | 
 |   MOCK_METHOD1(OnMessageReceived, void(quiche::QuicheStringPiece message)); | 
 |   MOCK_METHOD0(OnHandshakeDoneReceived, void()); | 
 |   MOCK_METHOD2(OnConnectionClosed, | 
 |                void(const QuicConnectionCloseFrame& frame, | 
 |                     ConnectionCloseSource source)); | 
 |   MOCK_METHOD0(OnWriteBlocked, void()); | 
 |   MOCK_METHOD0(OnCanWrite, void()); | 
 |   MOCK_METHOD0(SendProbingData, bool()); | 
 |   MOCK_METHOD1(OnCongestionWindowChange, void(QuicTime now)); | 
 |   MOCK_METHOD1(OnConnectionMigration, void(AddressChangeType type)); | 
 |   MOCK_METHOD0(OnPathDegrading, void()); | 
 |   MOCK_CONST_METHOD0(WillingAndAbleToWrite, bool()); | 
 |   MOCK_CONST_METHOD0(HasPendingHandshake, bool()); | 
 |   MOCK_CONST_METHOD0(ShouldKeepConnectionAlive, bool()); | 
 |   MOCK_METHOD1(OnSuccessfulVersionNegotiation, | 
 |                void(const ParsedQuicVersion& version)); | 
 |   MOCK_METHOD3(OnPacketReceived, | 
 |                void(const QuicSocketAddress& self_address, | 
 |                     const QuicSocketAddress& peer_address, | 
 |                     bool is_connectivity_probe)); | 
 |   MOCK_METHOD0(OnConfigNegotiated, void()); | 
 |   MOCK_METHOD0(OnAckNeedsRetransmittableFrame, void()); | 
 |   MOCK_METHOD0(SendPing, void()); | 
 |   MOCK_CONST_METHOD0(AllowSelfAddressChange, bool()); | 
 |   MOCK_CONST_METHOD0(GetHandshakeState, HandshakeState()); | 
 |   MOCK_METHOD0(OnForwardProgressConfirmed, void()); | 
 |   MOCK_METHOD1(OnMaxStreamsFrame, bool(const QuicMaxStreamsFrame& frame)); | 
 |   MOCK_METHOD1(OnStreamsBlockedFrame, | 
 |                bool(const QuicStreamsBlockedFrame& frame)); | 
 |   MOCK_METHOD1(OnStopSendingFrame, void(const QuicStopSendingFrame& frame)); | 
 |   MOCK_METHOD1(OnPacketDecrypted, void(EncryptionLevel)); | 
 |   MOCK_METHOD0(OnOneRttPacketAcknowledged, void()); | 
 | }; | 
 |  | 
 | class MockQuicConnectionHelper : public QuicConnectionHelperInterface { | 
 |  public: | 
 |   MockQuicConnectionHelper(); | 
 |   MockQuicConnectionHelper(const MockQuicConnectionHelper&) = delete; | 
 |   MockQuicConnectionHelper& operator=(const MockQuicConnectionHelper&) = delete; | 
 |   ~MockQuicConnectionHelper() override; | 
 |   const QuicClock* GetClock() const override; | 
 |   QuicRandom* GetRandomGenerator() override; | 
 |   QuicBufferAllocator* GetStreamSendBufferAllocator() override; | 
 |   void AdvanceTime(QuicTime::Delta delta); | 
 |  | 
 |  private: | 
 |   MockClock clock_; | 
 |   MockRandom random_generator_; | 
 |   SimpleBufferAllocator buffer_allocator_; | 
 | }; | 
 |  | 
 | class MockAlarmFactory : public QuicAlarmFactory { | 
 |  public: | 
 |   QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) override; | 
 |   QuicArenaScopedPtr<QuicAlarm> CreateAlarm( | 
 |       QuicArenaScopedPtr<QuicAlarm::Delegate> delegate, | 
 |       QuicConnectionArena* arena) override; | 
 |  | 
 |   // No-op alarm implementation | 
 |   class TestAlarm : public QuicAlarm { | 
 |    public: | 
 |     explicit TestAlarm(QuicArenaScopedPtr<QuicAlarm::Delegate> delegate) | 
 |         : QuicAlarm(std::move(delegate)) {} | 
 |  | 
 |     void SetImpl() override {} | 
 |     void CancelImpl() override {} | 
 |  | 
 |     using QuicAlarm::Fire; | 
 |   }; | 
 |  | 
 |   void FireAlarm(QuicAlarm* alarm) { | 
 |     reinterpret_cast<TestAlarm*>(alarm)->Fire(); | 
 |   } | 
 | }; | 
 |  | 
 | class MockQuicConnection : public QuicConnection { | 
 |  public: | 
 |   // Uses a ConnectionId of 42 and 127.0.0.1:123. | 
 |   MockQuicConnection(MockQuicConnectionHelper* helper, | 
 |                      MockAlarmFactory* alarm_factory, | 
 |                      Perspective perspective); | 
 |  | 
 |   // Uses a ConnectionId of 42. | 
 |   MockQuicConnection(QuicSocketAddress address, | 
 |                      MockQuicConnectionHelper* helper, | 
 |                      MockAlarmFactory* alarm_factory, | 
 |                      Perspective perspective); | 
 |  | 
 |   // Uses 127.0.0.1:123. | 
 |   MockQuicConnection(QuicConnectionId connection_id, | 
 |                      MockQuicConnectionHelper* helper, | 
 |                      MockAlarmFactory* alarm_factory, | 
 |                      Perspective perspective); | 
 |  | 
 |   // Uses a ConnectionId of 42, and 127.0.0.1:123. | 
 |   MockQuicConnection(MockQuicConnectionHelper* helper, | 
 |                      MockAlarmFactory* alarm_factory, | 
 |                      Perspective perspective, | 
 |                      const ParsedQuicVersionVector& supported_versions); | 
 |  | 
 |   MockQuicConnection(QuicConnectionId connection_id, | 
 |                      QuicSocketAddress address, | 
 |                      MockQuicConnectionHelper* helper, | 
 |                      MockAlarmFactory* alarm_factory, | 
 |                      Perspective perspective, | 
 |                      const ParsedQuicVersionVector& supported_versions); | 
 |   MockQuicConnection(const MockQuicConnection&) = delete; | 
 |   MockQuicConnection& operator=(const MockQuicConnection&) = delete; | 
 |  | 
 |   ~MockQuicConnection() override; | 
 |  | 
 |   // If the constructor that uses a MockQuicConnectionHelper has been used then | 
 |   // this method | 
 |   // will advance the time of the MockClock. | 
 |   void AdvanceTime(QuicTime::Delta delta); | 
 |  | 
 |   MOCK_METHOD3(ProcessUdpPacket, | 
 |                void(const QuicSocketAddress& self_address, | 
 |                     const QuicSocketAddress& peer_address, | 
 |                     const QuicReceivedPacket& packet)); | 
 |   MOCK_METHOD1(SendConnectionClose, void(QuicErrorCode error)); | 
 |   MOCK_METHOD3(CloseConnection, | 
 |                void(QuicErrorCode error, | 
 |                     const std::string& details, | 
 |                     ConnectionCloseBehavior connection_close_behavior)); | 
 |   MOCK_METHOD2(SendConnectionClosePacket, | 
 |                void(QuicErrorCode error, const std::string& details)); | 
 |   MOCK_METHOD3(SendRstStream, | 
 |                void(QuicStreamId id, | 
 |                     QuicRstStreamErrorCode error, | 
 |                     QuicStreamOffset bytes_written)); | 
 |   MOCK_METHOD3(SendGoAway, | 
 |                void(QuicErrorCode error, | 
 |                     QuicStreamId last_good_stream_id, | 
 |                     const std::string& reason)); | 
 |   MOCK_METHOD1(SendBlocked, void(QuicStreamId id)); | 
 |   MOCK_METHOD2(SendWindowUpdate, | 
 |                void(QuicStreamId id, QuicStreamOffset byte_offset)); | 
 |   MOCK_METHOD0(OnCanWrite, void()); | 
 |   MOCK_METHOD1(SendConnectivityProbingResponsePacket, | 
 |                void(const QuicSocketAddress& peer_address)); | 
 |   MOCK_METHOD2(SendConnectivityProbingPacket, | 
 |                bool(QuicPacketWriter* probing_writer, | 
 |                     const QuicSocketAddress& peer_address)); | 
 |  | 
 |   MOCK_METHOD1(OnSendConnectionState, void(const CachedNetworkParameters&)); | 
 |   MOCK_METHOD2(ResumeConnectionState, | 
 |                void(const CachedNetworkParameters&, bool)); | 
 |   MOCK_METHOD1(SetMaxPacingRate, void(QuicBandwidth)); | 
 |  | 
 |   MOCK_METHOD2(OnStreamReset, void(QuicStreamId, QuicRstStreamErrorCode)); | 
 |   MOCK_METHOD1(SendControlFrame, bool(const QuicFrame& frame)); | 
 |   MOCK_METHOD3(SendMessage, | 
 |                MessageStatus(QuicMessageId, QuicMemSliceSpan, bool)); | 
 |   MOCK_METHOD3(OnConnectionClosed, | 
 |                void(QuicErrorCode error, | 
 |                     const std::string& error_details, | 
 |                     ConnectionCloseSource source)); | 
 |  | 
 |   MOCK_METHOD1(OnError, void(QuicFramer* framer)); | 
 |   void QuicConnection_OnError(QuicFramer* framer) { | 
 |     QuicConnection::OnError(framer); | 
 |   } | 
 |  | 
 |   void ReallyCloseConnection( | 
 |       QuicErrorCode error, | 
 |       const std::string& details, | 
 |       ConnectionCloseBehavior connection_close_behavior) { | 
 |     QuicConnection::CloseConnection(error, details, connection_close_behavior); | 
 |   } | 
 |  | 
 |   void ReallyProcessUdpPacket(const QuicSocketAddress& self_address, | 
 |                               const QuicSocketAddress& peer_address, | 
 |                               const QuicReceivedPacket& packet) { | 
 |     QuicConnection::ProcessUdpPacket(self_address, peer_address, packet); | 
 |   } | 
 |  | 
 |   bool OnProtocolVersionMismatch(ParsedQuicVersion version) override; | 
 |  | 
 |   bool ReallySendControlFrame(const QuicFrame& frame) { | 
 |     return QuicConnection::SendControlFrame(frame); | 
 |   } | 
 |  | 
 |   bool ReallySendConnectivityProbingPacket( | 
 |       QuicPacketWriter* probing_writer, | 
 |       const QuicSocketAddress& peer_address) { | 
 |     return QuicConnection::SendConnectivityProbingPacket(probing_writer, | 
 |                                                          peer_address); | 
 |   } | 
 |  | 
 |   void ReallySendConnectivityProbingResponsePacket( | 
 |       const QuicSocketAddress& peer_address) { | 
 |     QuicConnection::SendConnectivityProbingResponsePacket(peer_address); | 
 |   } | 
 |   MOCK_METHOD1(OnPathResponseFrame, bool(const QuicPathResponseFrame&)); | 
 |   MOCK_METHOD1(OnStopSendingFrame, bool(const QuicStopSendingFrame& frame)); | 
 |   MOCK_METHOD3(SendCryptoData, | 
 |                size_t(EncryptionLevel, size_t, QuicStreamOffset)); | 
 |   size_t QuicConnection_SendCryptoData(EncryptionLevel level, | 
 |                                        size_t write_length, | 
 |                                        QuicStreamOffset offset) { | 
 |     return QuicConnection::SendCryptoData(level, write_length, offset); | 
 |   } | 
 | }; | 
 |  | 
 | class PacketSavingConnection : public MockQuicConnection { | 
 |  public: | 
 |   PacketSavingConnection(MockQuicConnectionHelper* helper, | 
 |                          MockAlarmFactory* alarm_factory, | 
 |                          Perspective perspective); | 
 |  | 
 |   PacketSavingConnection(MockQuicConnectionHelper* helper, | 
 |                          MockAlarmFactory* alarm_factory, | 
 |                          Perspective perspective, | 
 |                          const ParsedQuicVersionVector& supported_versions); | 
 |   PacketSavingConnection(const PacketSavingConnection&) = delete; | 
 |   PacketSavingConnection& operator=(const PacketSavingConnection&) = delete; | 
 |  | 
 |   ~PacketSavingConnection() override; | 
 |  | 
 |   void SendOrQueuePacket(SerializedPacket* packet) override; | 
 |  | 
 |   std::vector<std::unique_ptr<QuicEncryptedPacket>> encrypted_packets_; | 
 |   MockClock clock_; | 
 | }; | 
 |  | 
 | class MockQuicSession : public QuicSession { | 
 |  public: | 
 |   // Takes ownership of |connection|. | 
 |   MockQuicSession(QuicConnection* connection, bool create_mock_crypto_stream); | 
 |  | 
 |   // Takes ownership of |connection|. | 
 |   explicit MockQuicSession(QuicConnection* connection); | 
 |   MockQuicSession(const MockQuicSession&) = delete; | 
 |   MockQuicSession& operator=(const MockQuicSession&) = delete; | 
 |   ~MockQuicSession() override; | 
 |  | 
 |   QuicCryptoStream* GetMutableCryptoStream() override; | 
 |   const QuicCryptoStream* GetCryptoStream() const override; | 
 |   void SetCryptoStream(QuicCryptoStream* crypto_stream); | 
 |  | 
 |   MOCK_METHOD2(OnConnectionClosed, | 
 |                void(const QuicConnectionCloseFrame& frame, | 
 |                     ConnectionCloseSource source)); | 
 |   MOCK_METHOD1(CreateIncomingStream, QuicStream*(QuicStreamId id)); | 
 |   MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(PendingStream* stream)); | 
 |   MOCK_METHOD1(ShouldCreateIncomingStream2, bool(QuicStreamId id)); | 
 |   MOCK_METHOD0(ShouldCreateOutgoingBidirectionalStream, bool()); | 
 |   MOCK_METHOD0(ShouldCreateOutgoingUnidirectionalStream, bool()); | 
 |   MOCK_METHOD6(WritevData, | 
 |                QuicConsumedData(QuicStreamId id, | 
 |                                 size_t write_length, | 
 |                                 QuicStreamOffset offset, | 
 |                                 StreamSendingState state, | 
 |                                 TransmissionType type, | 
 |                                 quiche::QuicheOptional<EncryptionLevel> level)); | 
 |  | 
 |   MOCK_METHOD3(SendRstStream, | 
 |                void(QuicStreamId stream_id, | 
 |                     QuicRstStreamErrorCode error, | 
 |                     QuicStreamOffset bytes_written)); | 
 |  | 
 |   MOCK_METHOD2(OnStreamHeaders, | 
 |                void(QuicStreamId stream_id, | 
 |                     quiche::QuicheStringPiece headers_data)); | 
 |   MOCK_METHOD2(OnStreamHeadersPriority, | 
 |                void(QuicStreamId stream_id, spdy::SpdyPriority priority)); | 
 |   MOCK_METHOD3(OnStreamHeadersComplete, | 
 |                void(QuicStreamId stream_id, bool fin, size_t frame_len)); | 
 |   MOCK_CONST_METHOD0(ShouldKeepConnectionAlive, bool()); | 
 |   MOCK_METHOD2(SendStopSending, void(uint16_t code, QuicStreamId stream_id)); | 
 |   MOCK_CONST_METHOD0(GetAlpnsToOffer, std::vector<std::string>()); | 
 |   MOCK_CONST_METHOD1(SelectAlpn, | 
 |                      std::vector<quiche::QuicheStringPiece>::const_iterator( | 
 |                          const std::vector<quiche::QuicheStringPiece>&)); | 
 |   MOCK_METHOD1(OnAlpnSelected, void(quiche::QuicheStringPiece)); | 
 |  | 
 |   using QuicSession::ActivateStream; | 
 |  | 
 |   // Returns a QuicConsumedData that indicates all of |write_length| (and |fin| | 
 |   // if set) has been consumed. | 
 |   QuicConsumedData ConsumeData(QuicStreamId id, | 
 |                                size_t write_length, | 
 |                                QuicStreamOffset offset, | 
 |                                StreamSendingState state, | 
 |                                TransmissionType type, | 
 |                                quiche::QuicheOptional<EncryptionLevel> level); | 
 |  | 
 |   void ReallySendRstStream(QuicStreamId id, | 
 |                            QuicRstStreamErrorCode error, | 
 |                            QuicStreamOffset bytes_written) { | 
 |     QuicSession::SendRstStream(id, error, bytes_written); | 
 |   } | 
 |  | 
 |  private: | 
 |   std::unique_ptr<QuicCryptoStream> crypto_stream_; | 
 | }; | 
 |  | 
 | class MockQuicCryptoStream : public QuicCryptoStream { | 
 |  public: | 
 |   explicit MockQuicCryptoStream(QuicSession* session); | 
 |  | 
 |   ~MockQuicCryptoStream() override; | 
 |  | 
 |   bool encryption_established() const override; | 
 |   bool one_rtt_keys_available() const override; | 
 |   const QuicCryptoNegotiatedParameters& crypto_negotiated_params() | 
 |       const override; | 
 |   CryptoMessageParser* crypto_message_parser() override; | 
 |   void OnPacketDecrypted(EncryptionLevel /*level*/) override {} | 
 |   void OnOneRttPacketAcknowledged() override {} | 
 |   void OnHandshakeDoneReceived() override {} | 
 |   HandshakeState GetHandshakeState() const override { return HANDSHAKE_START; } | 
 |  | 
 |  private: | 
 |   QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> params_; | 
 |   CryptoFramer crypto_framer_; | 
 | }; | 
 |  | 
 | class MockQuicSpdySession : public QuicSpdySession { | 
 |  public: | 
 |   // Takes ownership of |connection|. | 
 |   explicit MockQuicSpdySession(QuicConnection* connection); | 
 |   // Takes ownership of |connection|. | 
 |   MockQuicSpdySession(QuicConnection* connection, | 
 |                       bool create_mock_crypto_stream); | 
 |   MockQuicSpdySession(const MockQuicSpdySession&) = delete; | 
 |   MockQuicSpdySession& operator=(const MockQuicSpdySession&) = delete; | 
 |   ~MockQuicSpdySession() override; | 
 |  | 
 |   QuicCryptoStream* GetMutableCryptoStream() override; | 
 |   const QuicCryptoStream* GetCryptoStream() const override; | 
 |   void SetCryptoStream(QuicCryptoStream* crypto_stream); | 
 |  | 
 |   void ReallyOnConnectionClosed(const QuicConnectionCloseFrame& frame, | 
 |                                 ConnectionCloseSource source) { | 
 |     QuicSession::OnConnectionClosed(frame, source); | 
 |   } | 
 |  | 
 |   // From QuicSession. | 
 |   MOCK_METHOD2(OnConnectionClosed, | 
 |                void(const QuicConnectionCloseFrame& frame, | 
 |                     ConnectionCloseSource source)); | 
 |   MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(QuicStreamId id)); | 
 |   MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(PendingStream* stream)); | 
 |   MOCK_METHOD0(CreateOutgoingBidirectionalStream, QuicSpdyStream*()); | 
 |   MOCK_METHOD0(CreateOutgoingUnidirectionalStream, QuicSpdyStream*()); | 
 |   MOCK_METHOD1(ShouldCreateIncomingStream, bool(QuicStreamId id)); | 
 |   MOCK_METHOD0(ShouldCreateOutgoingBidirectionalStream, bool()); | 
 |   MOCK_METHOD0(ShouldCreateOutgoingUnidirectionalStream, bool()); | 
 |   MOCK_METHOD6(WritevData, | 
 |                QuicConsumedData(QuicStreamId id, | 
 |                                 size_t write_length, | 
 |                                 QuicStreamOffset offset, | 
 |                                 StreamSendingState state, | 
 |                                 TransmissionType type, | 
 |                                 quiche::QuicheOptional<EncryptionLevel> level)); | 
 |  | 
 |   MOCK_METHOD3(SendRstStream, | 
 |                void(QuicStreamId stream_id, | 
 |                     QuicRstStreamErrorCode error, | 
 |                     QuicStreamOffset bytes_written)); | 
 |  | 
 |   MOCK_METHOD2(OnStreamHeaders, | 
 |                void(QuicStreamId stream_id, | 
 |                     quiche::QuicheStringPiece headers_data)); | 
 |   MOCK_METHOD2(OnStreamHeadersPriority, | 
 |                void(QuicStreamId stream_id, | 
 |                     const spdy::SpdyStreamPrecedence& precedence)); | 
 |   MOCK_METHOD3(OnStreamHeadersComplete, | 
 |                void(QuicStreamId stream_id, bool fin, size_t frame_len)); | 
 |   MOCK_METHOD4(OnStreamHeaderList, | 
 |                void(QuicStreamId stream_id, | 
 |                     bool fin, | 
 |                     size_t frame_len, | 
 |                     const QuicHeaderList& header_list)); | 
 |   MOCK_METHOD2(OnPromiseHeaders, | 
 |                void(QuicStreamId stream_id, | 
 |                     quiche::QuicheStringPiece headers_data)); | 
 |   MOCK_METHOD3(OnPromiseHeadersComplete, | 
 |                void(QuicStreamId stream_id, | 
 |                     QuicStreamId promised_stream_id, | 
 |                     size_t frame_len)); | 
 |   MOCK_METHOD4(OnPromiseHeaderList, | 
 |                void(QuicStreamId stream_id, | 
 |                     QuicStreamId promised_stream_id, | 
 |                     size_t frame_len, | 
 |                     const QuicHeaderList& header_list)); | 
 |   MOCK_METHOD2(OnPriorityFrame, | 
 |                void(QuicStreamId id, | 
 |                     const spdy::SpdyStreamPrecedence& precedence)); | 
 |  | 
 |   MOCK_METHOD1(OnHeadersHeadOfLineBlocking, void(QuicTime::Delta delta)); | 
 |   MOCK_METHOD4( | 
 |       OnStreamFrameData, | 
 |       void(QuicStreamId stream_id, const char* data, size_t len, bool fin)); | 
 |  | 
 |   // Returns a QuicConsumedData that indicates all of |write_length| (and |fin| | 
 |   // if set) has been consumed. | 
 |   QuicConsumedData ConsumeData(QuicStreamId id, | 
 |                                size_t write_length, | 
 |                                QuicStreamOffset offset, | 
 |                                StreamSendingState state, | 
 |                                TransmissionType type, | 
 |                                quiche::QuicheOptional<EncryptionLevel> level); | 
 |  | 
 |   using QuicSession::ActivateStream; | 
 |  | 
 |  private: | 
 |   std::unique_ptr<QuicCryptoStream> crypto_stream_; | 
 | }; | 
 |  | 
 | class MockHttp3DebugVisitor : public Http3DebugVisitor { | 
 |  public: | 
 |   MOCK_METHOD1(OnControlStreamCreated, void(QuicStreamId)); | 
 |   MOCK_METHOD1(OnQpackEncoderStreamCreated, void(QuicStreamId)); | 
 |   MOCK_METHOD1(OnQpackDecoderStreamCreated, void(QuicStreamId)); | 
 |   MOCK_METHOD1(OnPeerControlStreamCreated, void(QuicStreamId)); | 
 |   MOCK_METHOD1(OnPeerQpackEncoderStreamCreated, void(QuicStreamId)); | 
 |   MOCK_METHOD1(OnPeerQpackDecoderStreamCreated, void(QuicStreamId)); | 
 |  | 
 |   MOCK_METHOD1(OnCancelPushFrameReceived, void(const CancelPushFrame&)); | 
 |   MOCK_METHOD1(OnSettingsFrameReceived, void(const SettingsFrame&)); | 
 |   MOCK_METHOD1(OnGoAwayFrameReceived, void(const GoAwayFrame&)); | 
 |   MOCK_METHOD1(OnMaxPushIdFrameReceived, void(const MaxPushIdFrame&)); | 
 |   MOCK_METHOD1(OnPriorityUpdateFrameReceived, void(const PriorityUpdateFrame&)); | 
 |  | 
 |   MOCK_METHOD2(OnDataFrameReceived, void(QuicStreamId, QuicByteCount)); | 
 |   MOCK_METHOD2(OnHeadersFrameReceived, void(QuicStreamId, QuicByteCount)); | 
 |   MOCK_METHOD2(OnHeadersDecoded, void(QuicStreamId, QuicHeaderList)); | 
 |   MOCK_METHOD3(OnPushPromiseFrameReceived, | 
 |                void(QuicStreamId, QuicStreamId, QuicByteCount)); | 
 |   MOCK_METHOD3(OnPushPromiseDecoded, | 
 |                void(QuicStreamId, QuicStreamId, QuicHeaderList)); | 
 |   MOCK_METHOD3(OnUnknownFrameReceived, | 
 |                void(QuicStreamId, uint64_t, QuicByteCount)); | 
 |  | 
 |   MOCK_METHOD1(OnSettingsFrameSent, void(const SettingsFrame&)); | 
 |   MOCK_METHOD1(OnGoAwayFrameSent, void(QuicStreamId)); | 
 |   MOCK_METHOD1(OnMaxPushIdFrameSent, void(const MaxPushIdFrame&)); | 
 |   MOCK_METHOD1(OnPriorityUpdateFrameSent, void(const PriorityUpdateFrame&)); | 
 |  | 
 |   MOCK_METHOD2(OnDataFrameSent, void(QuicStreamId, QuicByteCount)); | 
 |   MOCK_METHOD2(OnHeadersFrameSent, | 
 |                void(QuicStreamId, const spdy::SpdyHeaderBlock&)); | 
 |   MOCK_METHOD3(OnPushPromiseFrameSent, | 
 |                void(QuicStreamId, QuicStreamId, const spdy::SpdyHeaderBlock&)); | 
 | }; | 
 |  | 
 | class TestQuicSpdyServerSession : public QuicServerSessionBase { | 
 |  public: | 
 |   // Takes ownership of |connection|. | 
 |   TestQuicSpdyServerSession(QuicConnection* connection, | 
 |                             const QuicConfig& config, | 
 |                             const ParsedQuicVersionVector& supported_versions, | 
 |                             const QuicCryptoServerConfig* crypto_config, | 
 |                             QuicCompressedCertsCache* compressed_certs_cache); | 
 |   TestQuicSpdyServerSession(const TestQuicSpdyServerSession&) = delete; | 
 |   TestQuicSpdyServerSession& operator=(const TestQuicSpdyServerSession&) = | 
 |       delete; | 
 |   ~TestQuicSpdyServerSession() override; | 
 |  | 
 |   MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(QuicStreamId id)); | 
 |   MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(PendingStream* stream)); | 
 |   MOCK_METHOD0(CreateOutgoingBidirectionalStream, QuicSpdyStream*()); | 
 |   MOCK_METHOD0(CreateOutgoingUnidirectionalStream, QuicSpdyStream*()); | 
 |   MOCK_CONST_METHOD1(SelectAlpn, | 
 |                      std::vector<quiche::QuicheStringPiece>::const_iterator( | 
 |                          const std::vector<quiche::QuicheStringPiece>&)); | 
 |   std::unique_ptr<QuicCryptoServerStreamBase> CreateQuicCryptoServerStream( | 
 |       const QuicCryptoServerConfig* crypto_config, | 
 |       QuicCompressedCertsCache* compressed_certs_cache) override; | 
 |  | 
 |   QuicCryptoServerStreamBase* GetMutableCryptoStream() override; | 
 |  | 
 |   const QuicCryptoServerStreamBase* GetCryptoStream() const override; | 
 |  | 
 |   MockQuicCryptoServerStreamHelper* helper() { return &helper_; } | 
 |  | 
 |  private: | 
 |   MockQuicSessionVisitor visitor_; | 
 |   MockQuicCryptoServerStreamHelper helper_; | 
 | }; | 
 |  | 
 | // A test implementation of QuicClientPushPromiseIndex::Delegate. | 
 | class TestPushPromiseDelegate : public QuicClientPushPromiseIndex::Delegate { | 
 |  public: | 
 |   // |match| sets the validation result for checking whether designated header | 
 |   // fields match for promise request and client request. | 
 |   explicit TestPushPromiseDelegate(bool match); | 
 |  | 
 |   bool CheckVary(const spdy::SpdyHeaderBlock& client_request, | 
 |                  const spdy::SpdyHeaderBlock& promise_request, | 
 |                  const spdy::SpdyHeaderBlock& promise_response) override; | 
 |  | 
 |   void OnRendezvousResult(QuicSpdyStream* stream) override; | 
 |  | 
 |   QuicSpdyStream* rendezvous_stream() { return rendezvous_stream_; } | 
 |   bool rendezvous_fired() { return rendezvous_fired_; } | 
 |  | 
 |  private: | 
 |   bool match_; | 
 |   bool rendezvous_fired_; | 
 |   QuicSpdyStream* rendezvous_stream_; | 
 | }; | 
 |  | 
 | class TestQuicSpdyClientSession : public QuicSpdyClientSessionBase { | 
 |  public: | 
 |   TestQuicSpdyClientSession(QuicConnection* connection, | 
 |                             const QuicConfig& config, | 
 |                             const ParsedQuicVersionVector& supported_versions, | 
 |                             const QuicServerId& server_id, | 
 |                             QuicCryptoClientConfig* crypto_config); | 
 |   TestQuicSpdyClientSession(const TestQuicSpdyClientSession&) = delete; | 
 |   TestQuicSpdyClientSession& operator=(const TestQuicSpdyClientSession&) = | 
 |       delete; | 
 |   ~TestQuicSpdyClientSession() override; | 
 |  | 
 |   bool IsAuthorized(const std::string& authority) override; | 
 |  | 
 |   // QuicSpdyClientSessionBase | 
 |   MOCK_METHOD1(OnProofValid, | 
 |                void(const QuicCryptoClientConfig::CachedState& cached)); | 
 |   MOCK_METHOD1(OnProofVerifyDetailsAvailable, | 
 |                void(const ProofVerifyDetails& verify_details)); | 
 |  | 
 |   // TestQuicSpdyClientSession | 
 |   MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(QuicStreamId id)); | 
 |   MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(PendingStream* stream)); | 
 |   MOCK_METHOD0(CreateOutgoingBidirectionalStream, QuicSpdyStream*()); | 
 |   MOCK_METHOD0(CreateOutgoingUnidirectionalStream, QuicSpdyStream*()); | 
 |   MOCK_METHOD1(ShouldCreateIncomingStream, bool(QuicStreamId id)); | 
 |   MOCK_METHOD0(ShouldCreateOutgoingBidirectionalStream, bool()); | 
 |   MOCK_METHOD0(ShouldCreateOutgoingUnidirectionalStream, bool()); | 
 |   MOCK_CONST_METHOD0(GetAlpnsToOffer, std::vector<std::string>()); | 
 |  | 
 |   QuicCryptoClientStream* GetMutableCryptoStream() override; | 
 |   const QuicCryptoClientStream* GetCryptoStream() const override; | 
 |  | 
 |   // Override to save sent crypto handshake messages. | 
 |   void OnCryptoHandshakeMessageSent( | 
 |       const CryptoHandshakeMessage& message) override { | 
 |     sent_crypto_handshake_messages_.push_back(message); | 
 |   } | 
 |  | 
 |   const std::vector<CryptoHandshakeMessage>& sent_crypto_handshake_messages() | 
 |       const { | 
 |     return sent_crypto_handshake_messages_; | 
 |   } | 
 |  | 
 |  private: | 
 |   std::unique_ptr<QuicCryptoClientStream> crypto_stream_; | 
 |   QuicClientPushPromiseIndex push_promise_index_; | 
 |   std::vector<CryptoHandshakeMessage> sent_crypto_handshake_messages_; | 
 | }; | 
 |  | 
 | class MockPacketWriter : public QuicPacketWriter { | 
 |  public: | 
 |   MockPacketWriter(); | 
 |   MockPacketWriter(const MockPacketWriter&) = delete; | 
 |   MockPacketWriter& operator=(const MockPacketWriter&) = delete; | 
 |   ~MockPacketWriter() override; | 
 |  | 
 |   MOCK_METHOD5(WritePacket, | 
 |                WriteResult(const char* buffer, | 
 |                            size_t buf_len, | 
 |                            const QuicIpAddress& self_address, | 
 |                            const QuicSocketAddress& peer_address, | 
 |                            PerPacketOptions* options)); | 
 |   MOCK_CONST_METHOD0(IsWriteBlocked, bool()); | 
 |   MOCK_METHOD0(SetWritable, void()); | 
 |   MOCK_CONST_METHOD1(GetMaxPacketSize, | 
 |                      QuicByteCount(const QuicSocketAddress& peer_address)); | 
 |   MOCK_CONST_METHOD0(SupportsReleaseTime, bool()); | 
 |   MOCK_CONST_METHOD0(IsBatchMode, bool()); | 
 |   MOCK_METHOD2(GetNextWriteLocation, | 
 |                char*(const QuicIpAddress& self_address, | 
 |                      const QuicSocketAddress& peer_address)); | 
 |   MOCK_METHOD0(Flush, WriteResult()); | 
 | }; | 
 |  | 
 | class MockSendAlgorithm : public SendAlgorithmInterface { | 
 |  public: | 
 |   MockSendAlgorithm(); | 
 |   MockSendAlgorithm(const MockSendAlgorithm&) = delete; | 
 |   MockSendAlgorithm& operator=(const MockSendAlgorithm&) = delete; | 
 |   ~MockSendAlgorithm() override; | 
 |  | 
 |   MOCK_METHOD2(SetFromConfig, | 
 |                void(const QuicConfig& config, Perspective perspective)); | 
 |   MOCK_METHOD1(SetInitialCongestionWindowInPackets, | 
 |                void(QuicPacketCount packets)); | 
 |   MOCK_METHOD1(SetMaxCongestionWindow, | 
 |                void(QuicByteCount max_congestion_window)); | 
 |   MOCK_METHOD5(OnCongestionEvent, | 
 |                void(bool rtt_updated, | 
 |                     QuicByteCount bytes_in_flight, | 
 |                     QuicTime event_time, | 
 |                     const AckedPacketVector& acked_packets, | 
 |                     const LostPacketVector& lost_packets)); | 
 |   MOCK_METHOD5(OnPacketSent, | 
 |                void(QuicTime, | 
 |                     QuicByteCount, | 
 |                     QuicPacketNumber, | 
 |                     QuicByteCount, | 
 |                     HasRetransmittableData)); | 
 |   MOCK_METHOD1(OnPacketNeutered, void(QuicPacketNumber)); | 
 |   MOCK_METHOD1(OnRetransmissionTimeout, void(bool)); | 
 |   MOCK_METHOD0(OnConnectionMigration, void()); | 
 |   MOCK_METHOD0(RevertRetransmissionTimeout, void()); | 
 |   MOCK_METHOD1(CanSend, bool(QuicByteCount)); | 
 |   MOCK_CONST_METHOD1(PacingRate, QuicBandwidth(QuicByteCount)); | 
 |   MOCK_CONST_METHOD0(BandwidthEstimate, QuicBandwidth(void)); | 
 |   MOCK_CONST_METHOD0(HasReliableBandwidthEstimate, bool()); | 
 |   MOCK_METHOD1(OnRttUpdated, void(QuicPacketNumber)); | 
 |   MOCK_CONST_METHOD0(GetCongestionWindow, QuicByteCount()); | 
 |   MOCK_CONST_METHOD0(GetDebugState, std::string()); | 
 |   MOCK_CONST_METHOD0(InSlowStart, bool()); | 
 |   MOCK_CONST_METHOD0(InRecovery, bool()); | 
 |   MOCK_CONST_METHOD0(ShouldSendProbingPacket, bool()); | 
 |   MOCK_CONST_METHOD0(GetSlowStartThreshold, QuicByteCount()); | 
 |   MOCK_CONST_METHOD0(GetCongestionControlType, CongestionControlType()); | 
 |   MOCK_METHOD3(AdjustNetworkParameters, | 
 |                void(QuicBandwidth, QuicTime::Delta, bool)); | 
 |   MOCK_METHOD1(AdjustNetworkParameters, void(const NetworkParams&)); | 
 |   MOCK_METHOD1(OnApplicationLimited, void(QuicByteCount)); | 
 |   MOCK_CONST_METHOD1(PopulateConnectionStats, void(QuicConnectionStats*)); | 
 | }; | 
 |  | 
 | class MockLossAlgorithm : public LossDetectionInterface { | 
 |  public: | 
 |   MockLossAlgorithm(); | 
 |   MockLossAlgorithm(const MockLossAlgorithm&) = delete; | 
 |   MockLossAlgorithm& operator=(const MockLossAlgorithm&) = delete; | 
 |   ~MockLossAlgorithm() override; | 
 |  | 
 |   MOCK_METHOD6(DetectLosses, | 
 |                void(const QuicUnackedPacketMap& unacked_packets, | 
 |                     QuicTime time, | 
 |                     const RttStats& rtt_stats, | 
 |                     QuicPacketNumber largest_recently_acked, | 
 |                     const AckedPacketVector& packets_acked, | 
 |                     LostPacketVector* packets_lost)); | 
 |   MOCK_CONST_METHOD0(GetLossTimeout, QuicTime()); | 
 |   MOCK_METHOD5(SpuriousLossDetected, | 
 |                void(const QuicUnackedPacketMap&, | 
 |                     const RttStats&, | 
 |                     QuicTime, | 
 |                     QuicPacketNumber, | 
 |                     QuicPacketNumber)); | 
 |  | 
 |   MOCK_METHOD0(OnConfigNegotiated, void()); | 
 |   MOCK_METHOD0(OnMinRttAvailable, void()); | 
 |   MOCK_METHOD0(OnConnectionClosed, void()); | 
 | }; | 
 |  | 
 | class MockAckListener : public QuicAckListenerInterface { | 
 |  public: | 
 |   MockAckListener(); | 
 |   MockAckListener(const MockAckListener&) = delete; | 
 |   MockAckListener& operator=(const MockAckListener&) = delete; | 
 |  | 
 |   MOCK_METHOD2(OnPacketAcked, | 
 |                void(int acked_bytes, QuicTime::Delta ack_delay_time)); | 
 |  | 
 |   MOCK_METHOD1(OnPacketRetransmitted, void(int retransmitted_bytes)); | 
 |  | 
 |  protected: | 
 |   // Object is ref counted. | 
 |   ~MockAckListener() override; | 
 | }; | 
 |  | 
 | class MockNetworkChangeVisitor | 
 |     : public QuicSentPacketManager::NetworkChangeVisitor { | 
 |  public: | 
 |   MockNetworkChangeVisitor(); | 
 |   MockNetworkChangeVisitor(const MockNetworkChangeVisitor&) = delete; | 
 |   MockNetworkChangeVisitor& operator=(const MockNetworkChangeVisitor&) = delete; | 
 |   ~MockNetworkChangeVisitor() override; | 
 |  | 
 |   MOCK_METHOD0(OnCongestionChange, void()); | 
 |   MOCK_METHOD1(OnPathMtuIncreased, void(QuicPacketLength)); | 
 | }; | 
 |  | 
 | class MockQuicConnectionDebugVisitor : public QuicConnectionDebugVisitor { | 
 |  public: | 
 |   MockQuicConnectionDebugVisitor(); | 
 |   ~MockQuicConnectionDebugVisitor() override; | 
 |  | 
 |   MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); | 
 |  | 
 |   MOCK_METHOD3(OnPacketSent, | 
 |                void(const SerializedPacket&, TransmissionType, QuicTime)); | 
 |  | 
 |   MOCK_METHOD2(OnCoalescedPacketSent, void(const QuicCoalescedPacket&, size_t)); | 
 |  | 
 |   MOCK_METHOD0(OnPingSent, void()); | 
 |  | 
 |   MOCK_METHOD3(OnPacketReceived, | 
 |                void(const QuicSocketAddress&, | 
 |                     const QuicSocketAddress&, | 
 |                     const QuicEncryptedPacket&)); | 
 |  | 
 |   MOCK_METHOD1(OnIncorrectConnectionId, void(QuicConnectionId)); | 
 |  | 
 |   MOCK_METHOD1(OnProtocolVersionMismatch, void(ParsedQuicVersion)); | 
 |  | 
 |   MOCK_METHOD1(OnPacketHeader, void(const QuicPacketHeader& header)); | 
 |  | 
 |   MOCK_METHOD1(OnSuccessfulVersionNegotiation, void(const ParsedQuicVersion&)); | 
 |  | 
 |   MOCK_METHOD1(OnStreamFrame, void(const QuicStreamFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnCryptoFrame, void(const QuicCryptoFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnStopWaitingFrame, void(const QuicStopWaitingFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnRstStreamFrame, void(const QuicRstStreamFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnConnectionCloseFrame, void(const QuicConnectionCloseFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnBlockedFrame, void(const QuicBlockedFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnNewConnectionIdFrame, void(const QuicNewConnectionIdFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnRetireConnectionIdFrame, | 
 |                void(const QuicRetireConnectionIdFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnNewTokenFrame, void(const QuicNewTokenFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnMessageFrame, void(const QuicMessageFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnStopSendingFrame, void(const QuicStopSendingFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnPathChallengeFrame, void(const QuicPathChallengeFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnPathResponseFrame, void(const QuicPathResponseFrame&)); | 
 |  | 
 |   MOCK_METHOD1(OnPublicResetPacket, void(const QuicPublicResetPacket&)); | 
 |  | 
 |   MOCK_METHOD1(OnVersionNegotiationPacket, | 
 |                void(const QuicVersionNegotiationPacket&)); | 
 |  | 
 |   MOCK_METHOD5(OnRetryPacket, | 
 |                void(QuicConnectionId, | 
 |                     QuicConnectionId, | 
 |                     quiche::QuicheStringPiece, | 
 |                     quiche::QuicheStringPiece, | 
 |                     quiche::QuicheStringPiece)); | 
 | }; | 
 |  | 
 | class MockReceivedPacketManager : public QuicReceivedPacketManager { | 
 |  public: | 
 |   explicit MockReceivedPacketManager(QuicConnectionStats* stats); | 
 |   ~MockReceivedPacketManager() override; | 
 |  | 
 |   MOCK_METHOD2(RecordPacketReceived, | 
 |                void(const QuicPacketHeader& header, QuicTime receipt_time)); | 
 |   MOCK_METHOD1(IsMissing, bool(QuicPacketNumber packet_number)); | 
 |   MOCK_CONST_METHOD1(IsAwaitingPacket, bool(QuicPacketNumber packet_number)); | 
 |   MOCK_METHOD1(UpdatePacketInformationSentByPeer, | 
 |                void(const QuicStopWaitingFrame& stop_waiting)); | 
 |   MOCK_CONST_METHOD0(HasNewMissingPackets, bool(void)); | 
 |   MOCK_CONST_METHOD0(ack_frame_updated, bool(void)); | 
 | }; | 
 |  | 
 | class MockPacketCreatorDelegate : public QuicPacketCreator::DelegateInterface { | 
 |  public: | 
 |   MockPacketCreatorDelegate(); | 
 |   MockPacketCreatorDelegate(const MockPacketCreatorDelegate&) = delete; | 
 |   MockPacketCreatorDelegate& operator=(const MockPacketCreatorDelegate&) = | 
 |       delete; | 
 |   ~MockPacketCreatorDelegate() override; | 
 |  | 
 |   MOCK_METHOD0(GetPacketBuffer, char*()); | 
 |   MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet)); | 
 |   MOCK_METHOD2(OnUnrecoverableError, void(QuicErrorCode, const std::string&)); | 
 |   MOCK_METHOD2(ShouldGeneratePacket, | 
 |                bool(HasRetransmittableData retransmittable, | 
 |                     IsHandshake handshake)); | 
 |   MOCK_METHOD0(MaybeBundleAckOpportunistically, const QuicFrames()); | 
 | }; | 
 |  | 
 | class MockSessionNotifier : public SessionNotifierInterface { | 
 |  public: | 
 |   MockSessionNotifier(); | 
 |   ~MockSessionNotifier() override; | 
 |  | 
 |   MOCK_METHOD3(OnFrameAcked, bool(const QuicFrame&, QuicTime::Delta, QuicTime)); | 
 |   MOCK_METHOD1(OnStreamFrameRetransmitted, void(const QuicStreamFrame&)); | 
 |   MOCK_METHOD1(OnFrameLost, void(const QuicFrame&)); | 
 |   MOCK_METHOD2(RetransmitFrames, | 
 |                void(const QuicFrames&, TransmissionType type)); | 
 |   MOCK_CONST_METHOD1(IsFrameOutstanding, bool(const QuicFrame&)); | 
 |   MOCK_CONST_METHOD0(HasUnackedCryptoData, bool()); | 
 |   MOCK_CONST_METHOD0(HasUnackedStreamData, bool()); | 
 | }; | 
 |  | 
 | // Creates a client session for testing. | 
 | // | 
 | // server_id: The server id associated with this stream. | 
 | // connection_start_time: The time to set for the connection clock. | 
 | //   Needed for strike-register nonce verification.  The client | 
 | //   connection_start_time should be synchronized witht the server | 
 | //   start time, otherwise nonce verification will fail. | 
 | // supported_versions: Set of QUIC versions this client supports. | 
 | // helper: Pointer to the MockQuicConnectionHelper to use for the session. | 
 | // crypto_client_config: Pointer to the crypto client config. | 
 | // client_connection: Pointer reference for newly created | 
 | //   connection.  This object will be owned by the | 
 | //   client_session. | 
 | // client_session: Pointer reference for the newly created client | 
 | //   session.  The new object will be owned by the caller. | 
 | void CreateClientSessionForTest( | 
 |     QuicServerId server_id, | 
 |     QuicTime::Delta connection_start_time, | 
 |     const ParsedQuicVersionVector& supported_versions, | 
 |     MockQuicConnectionHelper* helper, | 
 |     MockAlarmFactory* alarm_factory, | 
 |     QuicCryptoClientConfig* crypto_client_config, | 
 |     PacketSavingConnection** client_connection, | 
 |     TestQuicSpdyClientSession** client_session); | 
 |  | 
 | // Creates a server session for testing. | 
 | // | 
 | // server_id: The server id associated with this stream. | 
 | // connection_start_time: The time to set for the connection clock. | 
 | //   Needed for strike-register nonce verification.  The server | 
 | //   connection_start_time should be synchronized witht the client | 
 | //   start time, otherwise nonce verification will fail. | 
 | // supported_versions: Set of QUIC versions this server supports. | 
 | // helper: Pointer to the MockQuicConnectionHelper to use for the session. | 
 | // crypto_server_config: Pointer to the crypto server config. | 
 | // server_connection: Pointer reference for newly created | 
 | //   connection.  This object will be owned by the | 
 | //   server_session. | 
 | // server_session: Pointer reference for the newly created server | 
 | //   session.  The new object will be owned by the caller. | 
 | void CreateServerSessionForTest( | 
 |     QuicServerId server_id, | 
 |     QuicTime::Delta connection_start_time, | 
 |     ParsedQuicVersionVector supported_versions, | 
 |     MockQuicConnectionHelper* helper, | 
 |     MockAlarmFactory* alarm_factory, | 
 |     QuicCryptoServerConfig* crypto_server_config, | 
 |     QuicCompressedCertsCache* compressed_certs_cache, | 
 |     PacketSavingConnection** server_connection, | 
 |     TestQuicSpdyServerSession** server_session); | 
 |  | 
 | // Verifies that the relative error of |actual| with respect to |expected| is | 
 | // no more than |margin|. | 
 | // Please use EXPECT_APPROX_EQ, a wrapper around this function, for better error | 
 | // report. | 
 | template <typename T> | 
 | void ExpectApproxEq(T expected, T actual, float relative_margin) { | 
 |   // If |relative_margin| > 1 and T is an unsigned type, the comparison will | 
 |   // underflow. | 
 |   ASSERT_LE(relative_margin, 1); | 
 |   ASSERT_GE(relative_margin, 0); | 
 |  | 
 |   T absolute_margin = expected * relative_margin; | 
 |  | 
 |   EXPECT_GE(expected + absolute_margin, actual) << "actual value too big"; | 
 |   EXPECT_LE(expected - absolute_margin, actual) << "actual value too small"; | 
 | } | 
 |  | 
 | #define EXPECT_APPROX_EQ(expected, actual, relative_margin)                    \ | 
 |   do {                                                                         \ | 
 |     SCOPED_TRACE(testing::Message() << "relative_margin:" << relative_margin); \ | 
 |     quic::test::ExpectApproxEq(expected, actual, relative_margin);             \ | 
 |   } while (0) | 
 |  | 
 | template <typename T> | 
 | QuicHeaderList AsHeaderList(const T& container) { | 
 |   QuicHeaderList l; | 
 |   l.OnHeaderBlockStart(); | 
 |   size_t total_size = 0; | 
 |   for (auto p : container) { | 
 |     total_size += p.first.size() + p.second.size(); | 
 |     l.OnHeader(p.first, p.second); | 
 |   } | 
 |   l.OnHeaderBlockEnd(total_size, total_size); | 
 |   return l; | 
 | } | 
 |  | 
 | // Utility function that stores |str|'s data in |iov|. | 
 | inline void MakeIOVector(quiche::QuicheStringPiece str, struct iovec* iov) { | 
 |   iov->iov_base = const_cast<char*>(str.data()); | 
 |   iov->iov_len = static_cast<size_t>(str.size()); | 
 | } | 
 |  | 
 | // Helper functions for stream ids, to allow test logic to abstract over the | 
 | // HTTP stream numbering scheme (i.e. whether one or two QUIC streams are used | 
 | // per HTTP transaction). | 
 | QuicStreamId GetNthClientInitiatedBidirectionalStreamId( | 
 |     QuicTransportVersion version, | 
 |     int n); | 
 | QuicStreamId GetNthServerInitiatedBidirectionalStreamId( | 
 |     QuicTransportVersion version, | 
 |     int n); | 
 | QuicStreamId GetNthServerInitiatedUnidirectionalStreamId( | 
 |     QuicTransportVersion version, | 
 |     int n); | 
 | QuicStreamId GetNthClientInitiatedUnidirectionalStreamId( | 
 |     QuicTransportVersion version, | 
 |     int n); | 
 |  | 
 | StreamType DetermineStreamType(QuicStreamId id, | 
 |                                QuicTransportVersion version, | 
 |                                Perspective perspective, | 
 |                                bool is_incoming, | 
 |                                StreamType default_type); | 
 |  | 
 | // Utility function that stores message_data in |storage| and returns a | 
 | // QuicMemSliceSpan. | 
 | QuicMemSliceSpan MakeSpan(QuicBufferAllocator* allocator, | 
 |                           quiche::QuicheStringPiece message_data, | 
 |                           QuicMemSliceStorage* storage); | 
 |  | 
 | // Creates a MemSlice using a singleton trivial buffer allocator.  Performs a | 
 | // copy. | 
 | QuicMemSlice MemSliceFromString(quiche::QuicheStringPiece data); | 
 |  | 
 | // Used to compare ReceivedPacketInfo. | 
 | MATCHER_P(ReceivedPacketInfoEquals, info, "") { | 
 |   return info.ToString() == arg.ToString(); | 
 | } | 
 |  | 
 | MATCHER_P(ReceivedPacketInfoConnectionIdEquals, destination_connection_id, "") { | 
 |   return arg.destination_connection_id == destination_connection_id; | 
 | } | 
 |  | 
 | MATCHER_P2(InRange, min, max, "") { | 
 |   return arg >= min && arg <= max; | 
 | } | 
 |  | 
 | // A GMock matcher that prints expected and actual QuicErrorCode strings | 
 | // upon failure.  Example usage: | 
 | // EXPECT_THAT(stream_->connection_error()), IsError(QUIC_INTERNAL_ERROR)); | 
 | MATCHER_P(IsError, | 
 |           expected, | 
 |           quiche::QuicheStrCat(negation ? "isn't equal to " : "is equal to ", | 
 |                                QuicErrorCodeToString(expected))) { | 
 |   *result_listener << QuicErrorCodeToString(arg); | 
 |   return arg == expected; | 
 | } | 
 |  | 
 | // Shorthand for IsError(QUIC_NO_ERROR). | 
 | // Example usage: EXPECT_THAT(stream_->connection_error(), IsQuicNoError()); | 
 | MATCHER(IsQuicNoError, | 
 |         quiche::QuicheStrCat(negation ? "isn't equal to " : "is equal to ", | 
 |                              QuicErrorCodeToString(QUIC_NO_ERROR))) { | 
 |   *result_listener << QuicErrorCodeToString(arg); | 
 |   return arg == QUIC_NO_ERROR; | 
 | } | 
 |  | 
 | // A GMock matcher that prints expected and actual QuicRstStreamErrorCode | 
 | // strings upon failure.  Example usage: | 
 | // EXPECT_THAT(stream_->stream_error(), IsStreamError(QUIC_INTERNAL_ERROR)); | 
 | MATCHER_P(IsStreamError, | 
 |           expected, | 
 |           quiche::QuicheStrCat(negation ? "isn't equal to " : "is equal to ", | 
 |                                QuicRstStreamErrorCodeToString(expected))) { | 
 |   *result_listener << QuicRstStreamErrorCodeToString(arg); | 
 |   return arg == expected; | 
 | } | 
 |  | 
 | // Shorthand for IsStreamError(QUIC_STREAM_NO_ERROR).  Example usage: | 
 | // EXPECT_THAT(stream_->stream_error(), IsQuicStreamNoError()); | 
 | MATCHER(IsQuicStreamNoError, | 
 |         quiche::QuicheStrCat( | 
 |             negation ? "isn't equal to " : "is equal to ", | 
 |             QuicRstStreamErrorCodeToString(QUIC_STREAM_NO_ERROR))) { | 
 |   *result_listener << QuicRstStreamErrorCodeToString(arg); | 
 |   return arg == QUIC_STREAM_NO_ERROR; | 
 | } | 
 |  | 
 | }  // namespace test | 
 | }  // namespace quic | 
 |  | 
 | #endif  // QUICHE_QUIC_TEST_TOOLS_QUIC_TEST_UTILS_H_ |