// Copyright (c) 2013 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.

#ifndef QUICHE_QUIC_TEST_TOOLS_QUIC_PACKET_CREATOR_PEER_H_
#define QUICHE_QUIC_TEST_TOOLS_QUIC_PACKET_CREATOR_PEER_H_

#include "quiche/quic/core/quic_packets.h"

namespace quic {
class QuicFramer;
class QuicPacketCreator;
class QuicRandom;

namespace test {

class QuicPacketCreatorPeer {
 public:
  QuicPacketCreatorPeer() = delete;

  static bool SendVersionInPacket(QuicPacketCreator* creator);

  static void SetSendVersionInPacket(QuicPacketCreator* creator,
                                     bool send_version_in_packet);
  static void SetPacketNumberLength(
      QuicPacketCreator* creator, QuicPacketNumberLength packet_number_length);
  static QuicPacketNumberLength GetPacketNumberLength(
      QuicPacketCreator* creator);
  static QuicVariableLengthIntegerLength GetRetryTokenLengthLength(
      QuicPacketCreator* creator);
  static QuicVariableLengthIntegerLength GetLengthLength(
      QuicPacketCreator* creator);
  static void SetPacketNumber(QuicPacketCreator* creator, uint64_t s);
  static void SetPacketNumber(QuicPacketCreator* creator, QuicPacketNumber num);
  static void ClearPacketNumber(QuicPacketCreator* creator);
  static void FillPacketHeader(QuicPacketCreator* creator,
                               QuicPacketHeader* header);
  static void CreateStreamFrame(QuicPacketCreator* creator, QuicStreamId id,
                                size_t data_length, QuicStreamOffset offset,
                                bool fin, QuicFrame* frame);
  static bool CreateCryptoFrame(QuicPacketCreator* creator,
                                EncryptionLevel level, size_t write_length,
                                QuicStreamOffset offset, QuicFrame* frame);
  static SerializedPacket SerializeAllFrames(QuicPacketCreator* creator,
                                             const QuicFrames& frames,
                                             char* buffer, size_t buffer_len);
  static std::unique_ptr<SerializedPacket> SerializeConnectivityProbingPacket(
      QuicPacketCreator* creator);
  static std::unique_ptr<SerializedPacket>
  SerializePathChallengeConnectivityProbingPacket(
      QuicPacketCreator* creator, const QuicPathFrameBuffer& payload);

  static EncryptionLevel GetEncryptionLevel(QuicPacketCreator* creator);
  static QuicFramer* framer(QuicPacketCreator* creator);
  static std::string GetRetryToken(QuicPacketCreator* creator);
  static QuicFrames& QueuedFrames(QuicPacketCreator* creator);
  static void SetRandom(QuicPacketCreator* creator, QuicRandom* random);
};

}  // namespace test

}  // namespace quic

#endif  // QUICHE_QUIC_TEST_TOOLS_QUIC_PACKET_CREATOR_PEER_H_
