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

// gunit tests for the IETF-format framer --- generally does a simple test
// for each framer; we generate the template object (eg
// QuicIetfStreamFrame) with the correct stuff in it, ask that a frame
// be serialized (call AppendIetf<mumble>) then deserialized (call
// ProcessIetf<mumble>) and then check that the gazintas and gazoutas
// are the same.
//
// We do minimal checking of the serialized frame
//
// We do look at various different values (resulting in different
// length varints, etc)

#include "net/third_party/quiche/src/quic/core/quic_framer.h"

#include <algorithm>
#include <cstdint>
#include <map>
#include <memory>
#include <string>
#include <vector>

#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
#include "net/third_party/quiche/src/quic/core/quic_data_reader.h"
#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
#include "net/third_party/quiche/src/quic/core/quic_packets.h"
#include "net/third_party/quiche/src/quic/core/quic_utils.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
#include "net/third_party/quiche/src/quic/test_tools/quic_framer_peer.h"
#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
#include "net/third_party/quiche/src/quic/test_tools/simple_data_producer.h"
#include "net/third_party/quiche/src/common/platform/api/quiche_arraysize.h"
#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"

namespace quic {
namespace test {
namespace {

const size_t kNormalPacketBufferSize = 1400;
// Several different stream ids, should be encoded
// in 8, 4, 2, and 1 byte, respectively. Last one
// checks that value==0 works.
// All stream IDs end in 0x0, so the client/server- initiated
// and Uni/Bi-directional bits are available to alter, as any
// given test may wish.
const QuicIetfStreamId kStreamId8 = UINT64_C(0x3EDCBA9876543210);
const QuicIetfStreamId kStreamId4 = UINT64_C(0x36543210);
const QuicIetfStreamId kStreamId2 = UINT64_C(0x3210);
const QuicIetfStreamId kStreamId1 = UINT64_C(0x10);
const QuicIetfStreamId kStreamId0 = UINT64_C(0x00);

// Ditto for the offsets.
const QuicIetfStreamOffset kOffset8 = UINT64_C(0x3210BA9876543210);
const QuicIetfStreamOffset kOffset4 = UINT64_C(0x32109876);
const QuicIetfStreamOffset kOffset2 = UINT64_C(0x3456);
const QuicIetfStreamOffset kOffset1 = UINT64_C(0x3f);
const QuicIetfStreamOffset kOffset0 = UINT64_C(0x00);

// Structures used to create various ack frames.

// Defines an ack frame to feed through the framer/deframer.
struct ack_frame {
  uint64_t delay_time;
  bool is_ack_ecn;
  QuicPacketCount ect_0_count;
  QuicPacketCount ect_1_count;
  QuicPacketCount ecn_ce_count;
  const std::vector<QuicAckBlock>& ranges;
  uint64_t expected_frame_type;
};

class TestQuicVisitor : public QuicFramerVisitorInterface {
 public:
  TestQuicVisitor() {}

  ~TestQuicVisitor() override {}

  void OnError(QuicFramer* f) override {
    QUIC_DLOG(INFO) << "QuicIetfFramer Error: "
                    << QuicErrorCodeToString(f->error()) << " (" << f->error()
                    << ")";
  }

  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*/) override {}

  bool OnProtocolVersionMismatch(
      ParsedQuicVersion /*received_version*/) override {
    return false;
  }

  bool OnUnauthenticatedPublicHeader(
      const QuicPacketHeader& /*header*/) override {
    return true;
  }

  bool OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) override {
    return true;
  }

  void OnDecryptedPacket(EncryptionLevel /*level*/) override {}

  bool OnPacketHeader(const QuicPacketHeader& /*header*/) override {
    return true;
  }

  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 { return true; }

  bool OnCryptoFrame(const QuicCryptoFrame& /*frame*/) override { return true; }

  bool OnAckFrameStart(QuicPacketNumber /*largest_acked*/,
                       QuicTime::Delta /*ack_delay_time*/) override {
    return true;
  }

  bool OnAckRange(QuicPacketNumber /*start*/,
                  QuicPacketNumber /*end*/) override {
    return true;
  }

  bool OnAckTimestamp(QuicPacketNumber /*packet_number*/,
                      QuicTime /*timestamp*/) override {
    return true;
  }

  bool OnAckFrameEnd(QuicPacketNumber /*start*/) override { return true; }

  bool OnStopWaitingFrame(const QuicStopWaitingFrame& /*frame*/) override {
    return true;
  }

  bool OnPaddingFrame(const QuicPaddingFrame& /*frame*/) override {
    return true;
  }

  bool OnPingFrame(const QuicPingFrame& /*frame*/) override { return true; }

  bool OnMessageFrame(const QuicMessageFrame& /*frame*/) override {
    return true;
  }

  void OnPacketComplete() override {}

  bool OnRstStreamFrame(const QuicRstStreamFrame& /*frame*/) override {
    return true;
  }

  bool OnConnectionCloseFrame(
      const QuicConnectionCloseFrame& /*frame*/) override {
    return true;
  }

  bool OnStopSendingFrame(const QuicStopSendingFrame& /*frame*/) override {
    return true;
  }

  bool OnPathChallengeFrame(const QuicPathChallengeFrame& /*frame*/) override {
    return true;
  }
  bool OnPathResponseFrame(const QuicPathResponseFrame& /*frame*/) override {
    return true;
  }

  bool OnGoAwayFrame(const QuicGoAwayFrame& /*frame*/) override { return true; }

  bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& /*frame*/) override {
    return true;
  }

  bool OnBlockedFrame(const QuicBlockedFrame& /*frame*/) override {
    return true;
  }

  bool OnNewConnectionIdFrame(
      const QuicNewConnectionIdFrame& /*frame*/) override {
    return true;
  }

  bool OnRetireConnectionIdFrame(
      const QuicRetireConnectionIdFrame& /*frame*/) override {
    return true;
  }

  bool OnNewTokenFrame(const QuicNewTokenFrame& /*frame*/) override {
    return true;
  }

  bool IsValidStatelessResetToken(QuicUint128 /*token*/) const override {
    return true;
  }

  void OnAuthenticatedIetfStatelessResetPacket(
      const QuicIetfStatelessResetPacket& /*packet*/) override {}

  bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& /*frame*/) override {
    return true;
  }

  bool OnStreamsBlockedFrame(
      const QuicStreamsBlockedFrame& /*frame*/) override {
    return true;
  }
};

class QuicIetfFramerTest : public QuicTestWithParam<ParsedQuicVersion> {
 public:
  QuicIetfFramerTest()
      : start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)),
        framer_(AllSupportedVersions(),
                start_,
                Perspective::IS_SERVER,
                kQuicDefaultConnectionIdLength) {
    framer_.set_visitor(&visitor_);
  }

  // Utility functions to do actual framing/deframing.
  void TryStreamFrame(char* packet_buffer,
                      size_t packet_buffer_size,
                      const char* xmit_packet_data,
                      size_t xmit_packet_data_size,
                      QuicIetfStreamId stream_id,
                      QuicIetfStreamOffset offset,
                      bool fin_bit,
                      bool last_frame_bit,
                      QuicIetfFrameType frame_type) {
    // initialize a writer so that the serialized packet is placed in
    // packet_buffer.
    QuicDataWriter writer(packet_buffer_size, packet_buffer,
                          quiche::NETWORK_BYTE_ORDER);  // do not really care
                                                        // about endianness.
    // set up to define the source frame we wish to send.
    QuicStreamFrame source_stream_frame(
        stream_id, fin_bit, offset, xmit_packet_data, xmit_packet_data_size);

    // Write the frame to the packet buffer.
    EXPECT_TRUE(QuicFramerPeer::AppendIetfStreamFrame(
        &framer_, source_stream_frame, last_frame_bit, &writer));
    // Better have something in the packet buffer.
    EXPECT_NE(0u, writer.length());
    // Now set up a reader to read in the frame.
    QuicDataReader reader(packet_buffer, writer.length(),
                          quiche::NETWORK_BYTE_ORDER);

    // A StreamFrame to hold the results... we know the frame type,
    // put it into the QuicIetfStreamFrame
    QuicStreamFrame sink_stream_frame;
    if (xmit_packet_data_size) {
      EXPECT_EQ(sink_stream_frame.data_buffer, nullptr);
      EXPECT_EQ(sink_stream_frame.data_length, 0u);
    }

    EXPECT_TRUE(QuicFramerPeer::ProcessIetfStreamFrame(
        &framer_, &reader, frame_type, &sink_stream_frame));

    // Now check that the streamid, fin-bit, offset, and
    // data len all match the input.
    EXPECT_EQ(sink_stream_frame.stream_id, source_stream_frame.stream_id);
    EXPECT_EQ(sink_stream_frame.fin, source_stream_frame.fin);
    EXPECT_EQ(sink_stream_frame.data_length, source_stream_frame.data_length);
    if (frame_type & IETF_STREAM_FRAME_OFF_BIT) {
      // There was an offset in the frame, see if xmit and rcv vales equal.
      EXPECT_EQ(sink_stream_frame.offset, source_stream_frame.offset);
    } else {
      // Offset not in frame, so it better come out 0.
      EXPECT_EQ(sink_stream_frame.offset, 0u);
    }
    if (xmit_packet_data_size) {
      ASSERT_NE(sink_stream_frame.data_buffer, nullptr);
      ASSERT_NE(source_stream_frame.data_buffer, nullptr);
      EXPECT_EQ(strcmp(sink_stream_frame.data_buffer,
                       source_stream_frame.data_buffer),
                0);
    } else {
      // No data in the frame.
      EXPECT_EQ(source_stream_frame.data_length, 0u);
      EXPECT_EQ(sink_stream_frame.data_length, 0u);
    }
  }

  // Overall ack frame encode/decode/compare function
  //  Encodes an ack frame as specified at |*frame|
  //  Then decodes the frame,
  //  Then compares the two
  // Does some basic checking:
  //   - did the writer write something?
  //   - did the reader read the entire packet?
  //   - did the things the reader read match what the writer wrote?
  // Returns true if it all worked false if not.
  bool TryAckFrame(char* packet_buffer,
                   size_t /*packet_buffer_size*/,
                   struct ack_frame* frame) {
    QuicAckFrame transmit_frame = InitAckFrame(frame->ranges);
    if (frame->is_ack_ecn) {
      transmit_frame.ecn_counters_populated = true;
      transmit_frame.ect_0_count = frame->ect_0_count;
      transmit_frame.ect_1_count = frame->ect_1_count;
      transmit_frame.ecn_ce_count = frame->ecn_ce_count;
    }
    transmit_frame.ack_delay_time =
        QuicTime::Delta::FromMicroseconds(frame->delay_time);
    size_t expected_size =
        QuicFramerPeer::GetIetfAckFrameSize(&framer_, transmit_frame);

    // Make a writer so that the serialized packet is placed in
    // packet_buffer.
    QuicDataWriter writer(expected_size, packet_buffer,
                          quiche::NETWORK_BYTE_ORDER);

    // Write the frame to the packet buffer.
    EXPECT_TRUE(QuicFramerPeer::AppendIetfAckFrameAndTypeByte(
        &framer_, transmit_frame, &writer));

    size_t expected_frame_length = QuicFramerPeer::ComputeFrameLength(
        &framer_, QuicFrame(&transmit_frame), false,
        static_cast<QuicPacketNumberLength>(123456u));

    // Encoded length should match what ComputeFrameLength returns
    EXPECT_EQ(expected_frame_length, writer.length());
    // and what is in the buffer should be the expected size.
    EXPECT_EQ(expected_size, writer.length()) << "Frame is " << transmit_frame;
    // Now set up a reader to read in the frame.
    QuicDataReader reader(packet_buffer, writer.length(),
                          quiche::NETWORK_BYTE_ORDER);

    // read in the frame type
    uint8_t received_frame_type;
    EXPECT_TRUE(reader.ReadUInt8(&received_frame_type));
    EXPECT_EQ(frame->expected_frame_type, received_frame_type);

    // an AckFrame to hold the results
    QuicAckFrame receive_frame;

    EXPECT_TRUE(QuicFramerPeer::ProcessIetfAckFrame(
        &framer_, &reader, received_frame_type, &receive_frame));

    if (frame->is_ack_ecn &&
        (frame->ect_0_count || frame->ect_1_count || frame->ecn_ce_count)) {
      EXPECT_TRUE(receive_frame.ecn_counters_populated);
      EXPECT_EQ(receive_frame.ect_0_count, frame->ect_0_count);
      EXPECT_EQ(receive_frame.ect_1_count, frame->ect_1_count);
      EXPECT_EQ(receive_frame.ecn_ce_count, frame->ecn_ce_count);
    } else {
      EXPECT_FALSE(receive_frame.ecn_counters_populated);
      EXPECT_EQ(receive_frame.ect_0_count, 0u);
      EXPECT_EQ(receive_frame.ect_1_count, 0u);
      EXPECT_EQ(receive_frame.ecn_ce_count, 0u);
    }

    // Now check that the received frame matches the sent frame.
    EXPECT_EQ(transmit_frame.largest_acked, receive_frame.largest_acked);
    // The ~0x7 needs some explaining.  The ack frame format down shifts the
    // delay time by 3 (divide by 8) to allow for greater ranges in delay time.
    // Therefore, if we give the framer a delay time that is not an
    // even multiple of 8, the value that the deframer produces will
    // not be the same as what the framer got. The downshift on
    // framing and upshift on deframing results in clearing the 3
    // low-order bits ... The masking basically does the same thing,
    // so the compare works properly.
    return true;
  }

  // encode, decode, and check a Path Challenge frame.
  bool TryPathChallengeFrame(char* packet_buffer,
                             size_t packet_buffer_size,
                             const QuicPathFrameBuffer& data) {
    // Make a writer so that the serialized packet is placed in
    // packet_buffer.
    QuicDataWriter writer(packet_buffer_size, packet_buffer,
                          quiche::NETWORK_BYTE_ORDER);

    QuicPathChallengeFrame transmit_frame(0, data);

    // write the frame to the packet buffer.
    EXPECT_TRUE(QuicFramerPeer::AppendPathChallengeFrame(
        &framer_, transmit_frame, &writer));

    // Check for correct length in the packet buffer.
    EXPECT_EQ(kQuicPathChallengeFrameSize, writer.length());

    // now set up a reader to read in the frame.
    QuicDataReader reader(packet_buffer, writer.length(),
                          quiche::NETWORK_BYTE_ORDER);

    QuicPathChallengeFrame receive_frame;

    EXPECT_TRUE(QuicFramerPeer::ProcessPathChallengeFrame(&framer_, &reader,
                                                          &receive_frame));

    // Now check that the received frame matches the sent frame.
    EXPECT_EQ(
        0, memcmp(transmit_frame.data_buffer.data(),
                  receive_frame.data_buffer.data(), kQuicPathFrameBufferSize));
    return true;
  }

  // encode, decode, and check a Path Response frame.
  bool TryPathResponseFrame(char* packet_buffer,
                            size_t packet_buffer_size,
                            const QuicPathFrameBuffer& data) {
    // Make a writer so that the serialized packet is placed in
    // packet_buffer.
    QuicDataWriter writer(packet_buffer_size, packet_buffer,
                          quiche::NETWORK_BYTE_ORDER);

    QuicPathResponseFrame transmit_frame(0, data);

    // Write the frame to the packet buffer.
    EXPECT_TRUE(QuicFramerPeer::AppendPathResponseFrame(
        &framer_, transmit_frame, &writer));

    // Check for correct length in the packet buffer.
    EXPECT_EQ(kQuicPathResponseFrameSize, writer.length());

    // Set up a reader to read in the frame.
    QuicDataReader reader(packet_buffer, writer.length(),
                          quiche::NETWORK_BYTE_ORDER);

    QuicPathResponseFrame receive_frame;

    EXPECT_TRUE(QuicFramerPeer::ProcessPathResponseFrame(&framer_, &reader,
                                                         &receive_frame));

    // Now check that the received frame matches the sent frame.
    EXPECT_EQ(
        0, memcmp(transmit_frame.data_buffer.data(),
                  receive_frame.data_buffer.data(), kQuicPathFrameBufferSize));
    return true;
  }

  // Test the Serialization/deserialization of a Reset Stream Frame.
  void TryResetFrame(char* packet_buffer,
                     size_t packet_buffer_size,
                     QuicStreamId stream_id,
                     uint16_t error_code,
                     QuicStreamOffset final_offset) {
    // Initialize a writer so that the serialized packet is placed in
    // packet_buffer.
    QuicDataWriter writer(packet_buffer_size, packet_buffer,
                          quiche::NETWORK_BYTE_ORDER);

    QuicRstStreamFrame transmit_frame(static_cast<QuicControlFrameId>(1),
                                      stream_id, error_code, final_offset);

    // Write the frame to the packet buffer.
    EXPECT_TRUE(QuicFramerPeer::AppendIetfResetStreamFrame(
        &framer_, transmit_frame, &writer));
    // Check that the size of the serialzed frame is in the allowed range (3 to
    // 24 bytes, inclusive).
    EXPECT_LT(2u, writer.length());
    EXPECT_GT(25u, writer.length());
    // Now set up a reader to read in the thing in.
    QuicDataReader reader(packet_buffer, writer.length(),
                          quiche::NETWORK_BYTE_ORDER);

    // A QuicRstStreamFrame to hold the results
    QuicRstStreamFrame receive_frame;
    EXPECT_TRUE(QuicFramerPeer::ProcessIetfResetStreamFrame(&framer_, &reader,
                                                            &receive_frame));

    // Now check that the received values match the input.
    EXPECT_EQ(receive_frame.stream_id, transmit_frame.stream_id);
    EXPECT_EQ(receive_frame.ietf_error_code, transmit_frame.ietf_error_code);
    EXPECT_EQ(receive_frame.byte_offset, transmit_frame.byte_offset);
  }

  void TryMaxStreamsFrame(QuicStreamCount stream_count,
                          bool unidirectional,
                          bool stream_id_server_initiated) {
    char packet_buffer[kNormalPacketBufferSize];
    memset(packet_buffer, 0, sizeof(packet_buffer));

    Perspective old_perspective = framer_.perspective();
    // Set up the writer and transmit QuicMaxStreamsFrame
    QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
                          quiche::NETWORK_BYTE_ORDER);

    // Set the perspective of the sender. If the stream id is supposed to
    // be server-initiated, then the sender of the MAX_STREAMS should be
    // a client, and vice versa. Do this prior to constructing the frame or
    // generating the packet, so that any internal dependencies are satisfied.
    QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
                                                 ? Perspective::IS_CLIENT
                                                 : Perspective::IS_SERVER);
    QuicMaxStreamsFrame transmit_frame(0, stream_count, unidirectional);

    // Add the frame.
    EXPECT_TRUE(QuicFramerPeer::AppendMaxStreamsFrame(&framer_, transmit_frame,
                                                      &writer));

    // Check that buffer length is in the expected range
    EXPECT_LE(1u, writer.length());
    EXPECT_GE(8u, writer.length());

    // Set the perspective for the receiver.
    QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
                                                 ? Perspective::IS_SERVER
                                                 : Perspective::IS_CLIENT);

    // Set up reader and empty receive QuicPaddingFrame.
    QuicDataReader reader(packet_buffer, writer.length(),
                          quiche::NETWORK_BYTE_ORDER);
    QuicMaxStreamsFrame receive_frame;

    // Deframe it
    EXPECT_TRUE(QuicFramerPeer::ProcessMaxStreamsFrame(
        &framer_, &reader, &receive_frame,
        (unidirectional) ? IETF_MAX_STREAMS_UNIDIRECTIONAL
                         : IETF_MAX_STREAMS_BIDIRECTIONAL))
        << " Error: " << framer_.detailed_error();

    // Now check that received and sent data are equivalent
    EXPECT_EQ(stream_count, receive_frame.stream_count);
    EXPECT_EQ(transmit_frame.stream_count, receive_frame.stream_count);
    QuicFramerPeer::SetPerspective(&framer_, old_perspective);
  }

  void TryStreamsBlockedFrame(QuicStreamCount stream_count,
                              bool unidirectional,
                              bool stream_id_server_initiated) {
    char packet_buffer[kNormalPacketBufferSize];
    memset(packet_buffer, 0, sizeof(packet_buffer));

    Perspective old_perspective = framer_.perspective();
    // Set up the writer and transmit QuicStreamsBlockedFrame
    QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
                          quiche::NETWORK_BYTE_ORDER);

    // Set the perspective of the sender. If the stream id is supposed to
    // be server-initiated, then the sender of the STREAMS_BLOCKED should be
    // a client, and vice versa. Do this prior to constructing the frame or
    // generating the packet, so that any internal dependencies are satisfied.
    QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
                                                 ? Perspective::IS_SERVER
                                                 : Perspective::IS_CLIENT);
    QuicStreamsBlockedFrame transmit_frame(0, stream_count, unidirectional);

    // Add the frame.
    EXPECT_TRUE(QuicFramerPeer::AppendStreamsBlockedFrame(
        &framer_, transmit_frame, &writer));

    // Check that buffer length is in the expected range
    EXPECT_LE(1u, writer.length());
    EXPECT_GE(8u, writer.length());

    // Set the perspective for the receiver.
    QuicFramerPeer::SetPerspective(&framer_, (stream_id_server_initiated)
                                                 ? Perspective::IS_CLIENT
                                                 : Perspective::IS_SERVER);

    // Set up reader and empty receive QuicPaddingFrame.
    QuicDataReader reader(packet_buffer, writer.length(),
                          quiche::NETWORK_BYTE_ORDER);
    QuicStreamsBlockedFrame receive_frame;

    // Deframe it
    EXPECT_TRUE(QuicFramerPeer::ProcessStreamsBlockedFrame(
        &framer_, &reader, &receive_frame,
        (unidirectional) ? IETF_STREAMS_BLOCKED_UNIDIRECTIONAL
                         : IETF_STREAMS_BLOCKED_BIDIRECTIONAL));

    // Now check that received and sent data are equivalent
    EXPECT_EQ(stream_count, receive_frame.stream_count);
    EXPECT_EQ(transmit_frame.stream_count, receive_frame.stream_count);
    QuicFramerPeer::SetPerspective(&framer_, old_perspective);
  }

  QuicTime start_;
  QuicFramer framer_;
  test::TestQuicVisitor visitor_;
};

struct stream_frame_variant {
  QuicIetfStreamId stream_id;
  QuicIetfStreamOffset offset;
  bool fin_bit;
  bool last_frame_bit;
  uint8_t frame_type;
} stream_frame_to_test[] = {
#define IETF_STREAM0 (((uint8_t)IETF_STREAM))

#define IETF_STREAM1 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_FIN_BIT)

#define IETF_STREAM2 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_LEN_BIT)

#define IETF_STREAM3                                    \
  (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_LEN_BIT | \
   IETF_STREAM_FRAME_FIN_BIT)

#define IETF_STREAM4 (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT)

#define IETF_STREAM5                                    \
  (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
   IETF_STREAM_FRAME_FIN_BIT)

#define IETF_STREAM6                                    \
  (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
   IETF_STREAM_FRAME_LEN_BIT)

#define IETF_STREAM7                                    \
  (((uint8_t)IETF_STREAM) | IETF_STREAM_FRAME_OFF_BIT | \
   IETF_STREAM_FRAME_LEN_BIT | IETF_STREAM_FRAME_FIN_BIT)

    {kStreamId8, kOffset8, true, false, IETF_STREAM7},
    {kStreamId8, kOffset8, false, false, IETF_STREAM6},
    {kStreamId8, kOffset4, true, false, IETF_STREAM7},
    {kStreamId8, kOffset4, false, false, IETF_STREAM6},
    {kStreamId8, kOffset2, true, false, IETF_STREAM7},
    {kStreamId8, kOffset2, false, false, IETF_STREAM6},
    {kStreamId8, kOffset1, true, false, IETF_STREAM7},
    {kStreamId8, kOffset1, false, false, IETF_STREAM6},
    {kStreamId8, kOffset0, true, false, IETF_STREAM3},
    {kStreamId8, kOffset0, false, false, IETF_STREAM2},
    {kStreamId4, kOffset8, true, false, IETF_STREAM7},
    {kStreamId4, kOffset8, false, false, IETF_STREAM6},
    {kStreamId4, kOffset4, true, false, IETF_STREAM7},
    {kStreamId4, kOffset4, false, false, IETF_STREAM6},
    {kStreamId4, kOffset2, true, false, IETF_STREAM7},
    {kStreamId4, kOffset2, false, false, IETF_STREAM6},
    {kStreamId4, kOffset1, true, false, IETF_STREAM7},
    {kStreamId4, kOffset1, false, false, IETF_STREAM6},
    {kStreamId4, kOffset0, true, false, IETF_STREAM3},
    {kStreamId4, kOffset0, false, false, IETF_STREAM2},
    {kStreamId2, kOffset8, true, false, IETF_STREAM7},
    {kStreamId2, kOffset8, false, false, IETF_STREAM6},
    {kStreamId2, kOffset4, true, false, IETF_STREAM7},
    {kStreamId2, kOffset4, false, false, IETF_STREAM6},
    {kStreamId2, kOffset2, true, false, IETF_STREAM7},
    {kStreamId2, kOffset2, false, false, IETF_STREAM6},
    {kStreamId2, kOffset1, true, false, IETF_STREAM7},
    {kStreamId2, kOffset1, false, false, IETF_STREAM6},
    {kStreamId2, kOffset0, true, false, IETF_STREAM3},
    {kStreamId2, kOffset0, false, false, IETF_STREAM2},
    {kStreamId1, kOffset8, true, false, IETF_STREAM7},
    {kStreamId1, kOffset8, false, false, IETF_STREAM6},
    {kStreamId1, kOffset4, true, false, IETF_STREAM7},
    {kStreamId1, kOffset4, false, false, IETF_STREAM6},
    {kStreamId1, kOffset2, true, false, IETF_STREAM7},
    {kStreamId1, kOffset2, false, false, IETF_STREAM6},
    {kStreamId1, kOffset1, true, false, IETF_STREAM7},
    {kStreamId1, kOffset1, false, false, IETF_STREAM6},
    {kStreamId1, kOffset0, true, false, IETF_STREAM3},
    {kStreamId1, kOffset0, false, false, IETF_STREAM2},
    {kStreamId0, kOffset8, true, false, IETF_STREAM7},
    {kStreamId0, kOffset8, false, false, IETF_STREAM6},
    {kStreamId0, kOffset4, true, false, IETF_STREAM7},
    {kStreamId0, kOffset4, false, false, IETF_STREAM6},
    {kStreamId0, kOffset2, true, false, IETF_STREAM7},
    {kStreamId0, kOffset2, false, false, IETF_STREAM6},
    {kStreamId0, kOffset1, true, false, IETF_STREAM7},
    {kStreamId0, kOffset1, false, false, IETF_STREAM6},
    {kStreamId0, kOffset0, true, false, IETF_STREAM3},
    {kStreamId0, kOffset0, false, false, IETF_STREAM2},

    {kStreamId8, kOffset8, true, true, IETF_STREAM5},
    {kStreamId8, kOffset8, false, true, IETF_STREAM4},
    {kStreamId8, kOffset4, true, true, IETF_STREAM5},
    {kStreamId8, kOffset4, false, true, IETF_STREAM4},
    {kStreamId8, kOffset2, true, true, IETF_STREAM5},
    {kStreamId8, kOffset2, false, true, IETF_STREAM4},
    {kStreamId8, kOffset1, true, true, IETF_STREAM5},
    {kStreamId8, kOffset1, false, true, IETF_STREAM4},
    {kStreamId8, kOffset0, true, true, IETF_STREAM1},
    {kStreamId8, kOffset0, false, true, IETF_STREAM0},
    {kStreamId4, kOffset8, true, true, IETF_STREAM5},
    {kStreamId4, kOffset8, false, true, IETF_STREAM4},
    {kStreamId4, kOffset4, true, true, IETF_STREAM5},
    {kStreamId4, kOffset4, false, true, IETF_STREAM4},
    {kStreamId4, kOffset2, true, true, IETF_STREAM5},
    {kStreamId4, kOffset2, false, true, IETF_STREAM4},
    {kStreamId4, kOffset1, true, true, IETF_STREAM5},
    {kStreamId4, kOffset1, false, true, IETF_STREAM4},
    {kStreamId4, kOffset0, true, true, IETF_STREAM1},
    {kStreamId4, kOffset0, false, true, IETF_STREAM0},
    {kStreamId2, kOffset8, true, true, IETF_STREAM5},
    {kStreamId2, kOffset8, false, true, IETF_STREAM4},
    {kStreamId2, kOffset4, true, true, IETF_STREAM5},
    {kStreamId2, kOffset4, false, true, IETF_STREAM4},
    {kStreamId2, kOffset2, true, true, IETF_STREAM5},
    {kStreamId2, kOffset2, false, true, IETF_STREAM4},
    {kStreamId2, kOffset1, true, true, IETF_STREAM5},
    {kStreamId2, kOffset1, false, true, IETF_STREAM4},
    {kStreamId2, kOffset0, true, true, IETF_STREAM1},
    {kStreamId2, kOffset0, false, true, IETF_STREAM0},
    {kStreamId1, kOffset8, true, true, IETF_STREAM5},
    {kStreamId1, kOffset8, false, true, IETF_STREAM4},
    {kStreamId1, kOffset4, true, true, IETF_STREAM5},
    {kStreamId1, kOffset4, false, true, IETF_STREAM4},
    {kStreamId1, kOffset2, true, true, IETF_STREAM5},
    {kStreamId1, kOffset2, false, true, IETF_STREAM4},
    {kStreamId1, kOffset1, true, true, IETF_STREAM5},
    {kStreamId1, kOffset1, false, true, IETF_STREAM4},
    {kStreamId1, kOffset0, true, true, IETF_STREAM1},
    {kStreamId1, kOffset0, false, true, IETF_STREAM0},
    {kStreamId0, kOffset8, true, true, IETF_STREAM5},
    {kStreamId0, kOffset8, false, true, IETF_STREAM4},
    {kStreamId0, kOffset4, true, true, IETF_STREAM5},
    {kStreamId0, kOffset4, false, true, IETF_STREAM4},
    {kStreamId0, kOffset2, true, true, IETF_STREAM5},
    {kStreamId0, kOffset2, false, true, IETF_STREAM4},
    {kStreamId0, kOffset1, true, true, IETF_STREAM5},
    {kStreamId0, kOffset1, false, true, IETF_STREAM4},
    {kStreamId0, kOffset0, true, true, IETF_STREAM1},
    {kStreamId0, kOffset0, false, true, IETF_STREAM0},
};

TEST_F(QuicIetfFramerTest, StreamFrame) {
  char packet_buffer[kNormalPacketBufferSize];
  const char* transmit_packet_data =
      "this is a test of some packet data, "
      "can do a simple strcmp to see if the "
      "input and output are the same!";

  size_t transmit_packet_data_len = strlen(transmit_packet_data) + 1;
  for (size_t i = 0; i < QUICHE_ARRAYSIZE(stream_frame_to_test); ++i) {
    SCOPED_TRACE(i);
    struct stream_frame_variant* variant = &stream_frame_to_test[i];
    TryStreamFrame(packet_buffer, sizeof(packet_buffer), transmit_packet_data,
                   transmit_packet_data_len, variant->stream_id,
                   variant->offset, variant->fin_bit, variant->last_frame_bit,
                   static_cast<QuicIetfFrameType>(variant->frame_type));
  }
}
// As the previous test, but with no data.
TEST_F(QuicIetfFramerTest, ZeroLengthStreamFrame) {
  char packet_buffer[kNormalPacketBufferSize];

  for (size_t i = 0; i < QUICHE_ARRAYSIZE(stream_frame_to_test); ++i) {
    SCOPED_TRACE(i);
    struct stream_frame_variant* variant = &stream_frame_to_test[i];
    TryStreamFrame(packet_buffer, sizeof(packet_buffer),
                   /* xmit_packet_data = */ NULL,
                   /* xmit_packet_data_size = */ 0, variant->stream_id,
                   variant->offset, variant->fin_bit, variant->last_frame_bit,
                   static_cast<QuicIetfFrameType>(variant->frame_type));
  }
}

TEST_F(QuicIetfFramerTest, CryptoFrame) {
  SimpleDataProducer data_producer;
  framer_.set_data_producer(&data_producer);
  char packet_buffer[kNormalPacketBufferSize];

  quiche::QuicheStringPiece frame_data("This is a CRYPTO frame.");

  QuicStreamOffset offsets[] = {kOffset8, kOffset4, kOffset2, kOffset1,
                                kOffset0};
  for (QuicStreamOffset offset : offsets) {
    QuicCryptoFrame frame(ENCRYPTION_INITIAL, offset, frame_data.length());
    data_producer.SaveCryptoData(ENCRYPTION_INITIAL, offset, frame_data);

    QuicDataWriter writer(QUICHE_ARRAYSIZE(packet_buffer), packet_buffer,
                          quiche::NETWORK_BYTE_ORDER);

    // Write the frame.
    EXPECT_TRUE(QuicFramerPeer::AppendCryptoFrame(&framer_, frame, &writer));
    EXPECT_NE(0u, writer.length());
    // Read it back.
    QuicDataReader reader(packet_buffer, writer.length(),
                          quiche::NETWORK_BYTE_ORDER);
    QuicCryptoFrame read_frame;
    EXPECT_TRUE(
        QuicFramerPeer::ProcessCryptoFrame(&framer_, &reader, &read_frame));

    // Check that the frames match:
    quiche::QuicheStringPiece read_data(read_frame.data_buffer,
                                        read_frame.data_length);
    EXPECT_EQ(read_frame.data_length, frame.data_length);
    EXPECT_EQ(read_frame.offset, frame.offset);
    EXPECT_EQ(read_data, frame_data);
  }
}

TEST_F(QuicIetfFramerTest, ConnectionClose) {
  char packet_buffer[kNormalPacketBufferSize];

  // initialize a writer so that the serialized packet is placed in
  // packet_buffer.
  QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
                        quiche::NETWORK_BYTE_ORDER);

  std::string test_string = "Ich Bin Ein Jelly Donut?";
  QuicConnectionCloseFrame sent_frame(QUIC_VERSION_99, QUIC_NO_ERROR,
                                      test_string,
                                      /*transport_close_frame_type=*/123);

  // write the frame to the packet buffer.
  EXPECT_TRUE(QuicFramerPeer::AppendIetfConnectionCloseFrame(
      &framer_, sent_frame, &writer));

  // better have something in the packet buffer.
  EXPECT_NE(0u, writer.length());

  // now set up a reader to read in the frame.
  QuicDataReader reader(packet_buffer, writer.length(),
                        quiche::NETWORK_BYTE_ORDER);

  // a QuicConnectionCloseFrame to hold the results.
  QuicConnectionCloseFrame sink_frame;

  EXPECT_TRUE(QuicFramerPeer::ProcessIetfConnectionCloseFrame(
      &framer_, &reader, IETF_QUIC_TRANSPORT_CONNECTION_CLOSE, &sink_frame));

  // Now check that received == sent
  EXPECT_EQ(sent_frame.quic_error_code, sink_frame.quic_error_code);
  EXPECT_THAT(sink_frame.quic_error_code, IsQuicNoError());
  EXPECT_EQ(sink_frame.error_details, test_string);
  EXPECT_EQ(sink_frame.close_type, sent_frame.close_type);
  EXPECT_EQ(sent_frame.close_type, IETF_QUIC_TRANSPORT_CONNECTION_CLOSE);
}

TEST_F(QuicIetfFramerTest, ApplicationClose) {
  char packet_buffer[kNormalPacketBufferSize];

  // initialize a writer so that the serialized packet is placed in
  // packet_buffer.
  QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
                        quiche::NETWORK_BYTE_ORDER);

  std::string test_string = "Ich Bin Ein Jelly Donut?";
  QuicConnectionCloseFrame sent_frame(QUIC_VERSION_99, QUIC_LAST_ERROR,
                                      test_string,
                                      /*transport_close_frame_type=*/0);

  // write the frame to the packet buffer.
  EXPECT_TRUE(QuicFramerPeer::AppendIetfConnectionCloseFrame(
      &framer_, sent_frame, &writer));

  // better have something in the packet buffer.
  EXPECT_NE(0u, writer.length());

  // now set up a reader to read in the frame.
  QuicDataReader reader(packet_buffer, writer.length(),
                        quiche::NETWORK_BYTE_ORDER);

  // a QuicConnectionCloseFrame to hold the results.
  QuicConnectionCloseFrame sink_frame;

  EXPECT_TRUE(QuicFramerPeer::ProcessIetfConnectionCloseFrame(
      &framer_, &reader, IETF_QUIC_APPLICATION_CONNECTION_CLOSE, &sink_frame));

  // Now check that received == sent
  EXPECT_EQ(sink_frame.quic_error_code, QUIC_LAST_ERROR);
  EXPECT_EQ(sent_frame.quic_error_code, sink_frame.quic_error_code);
  EXPECT_EQ(sink_frame.error_details, test_string);
  EXPECT_EQ(sent_frame.close_type, IETF_QUIC_APPLICATION_CONNECTION_CLOSE);
  EXPECT_EQ(sent_frame.close_type, sink_frame.close_type);
}

// Testing for the IETF ACK framer.
// clang-format off
struct ack_frame ack_frame_variants[] = {
    {90000,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1000), QuicPacketNumber(2001)}},
     IETF_ACK},
    {0,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1000), QuicPacketNumber(2001)}},
     IETF_ACK},
    {1,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(2)},
      {QuicPacketNumber(5), QuicPacketNumber(6)}},
     IETF_ACK},
    {63,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(2)},
      {QuicPacketNumber(5), QuicPacketNumber(6)}},
     IETF_ACK},
    {64,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(2)},
      {QuicPacketNumber(3), QuicPacketNumber(4)},
      {QuicPacketNumber(5), QuicPacketNumber(6)},
      {QuicPacketNumber(7), QuicPacketNumber(8)},
      {QuicPacketNumber(9), QuicPacketNumber(10)},
      {QuicPacketNumber(11), QuicPacketNumber(12)}},
     IETF_ACK},
    {10000,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(2)},
      {QuicPacketNumber(3), QuicPacketNumber(4)},
      {QuicPacketNumber(5), QuicPacketNumber(6)},
      {QuicPacketNumber(7), QuicPacketNumber(8)},
      {QuicPacketNumber(9), QuicPacketNumber(10)},
      {QuicPacketNumber(11), QuicPacketNumber(12)}},
     IETF_ACK},
    {100000000,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(2)},
      {QuicPacketNumber(3), QuicPacketNumber(4)},
      {QuicPacketNumber(5), QuicPacketNumber(6)},
      {QuicPacketNumber(7), QuicPacketNumber(8)},
      {QuicPacketNumber(9), QuicPacketNumber(10)},
      {QuicPacketNumber(11), QuicPacketNumber(12)}},
     IETF_ACK},
    {0,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(65)}},
     IETF_ACK},
    {9223372036854775807,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(11)},
      {QuicPacketNumber(74), QuicPacketNumber(138)}},
     IETF_ACK},
    // This ack is for packets 60 & 125. There are 64 packets in the gap.
    // The encoded value is gap_size - 1, or 63. Crosses a VarInt62 encoding
    // boundary...
    {1,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(60), QuicPacketNumber(61)},
      {QuicPacketNumber(125), QuicPacketNumber(126)}},
     IETF_ACK},
    {2,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(65)},
      {QuicPacketNumber(129), QuicPacketNumber(130)}},
     IETF_ACK},
    {3,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(65)},
      {QuicPacketNumber(129), QuicPacketNumber(195)}},
     IETF_ACK},
    {4,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(65)},
      {QuicPacketNumber(129), QuicPacketNumber(194)}},
     IETF_ACK},
    {5,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(65)},
      {QuicPacketNumber(129), QuicPacketNumber(193)}},
     IETF_ACK},
    {6,
     false,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(65)},
      {QuicPacketNumber(129), QuicPacketNumber(192)}},
     IETF_ACK},
    // declare some ack_ecn frames to try.
    {6,
     false,
     100,
     200,
     300,
     {{QuicPacketNumber(1), QuicPacketNumber(65)},
      {QuicPacketNumber(129), QuicPacketNumber(192)}},
     IETF_ACK},
    {6,
     true,
     100,
     200,
     300,
     {{QuicPacketNumber(1), QuicPacketNumber(65)},
      {QuicPacketNumber(129), QuicPacketNumber(192)}},
     IETF_ACK_ECN},
    {6,
     true,
     100,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(65)},
      {QuicPacketNumber(129), QuicPacketNumber(192)}},
     IETF_ACK_ECN},
    {6,
     true,
     0,
     200,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(65)},
      {QuicPacketNumber(129), QuicPacketNumber(192)}},
     IETF_ACK_ECN},
    {6,
     true,
     0,
     0,
     300,
     {{QuicPacketNumber(1), QuicPacketNumber(65)},
      {QuicPacketNumber(129), QuicPacketNumber(192)}},
     IETF_ACK_ECN},
    {6,
     true,
     0,
     0,
     0,
     {{QuicPacketNumber(1), QuicPacketNumber(65)},
      {QuicPacketNumber(129), QuicPacketNumber(192)}},
     IETF_ACK},
};
// clang-format on

TEST_F(QuicIetfFramerTest, AckFrame) {
  char packet_buffer[kNormalPacketBufferSize];
  for (auto ack_frame_variant : ack_frame_variants) {
    EXPECT_TRUE(
        TryAckFrame(packet_buffer, sizeof(packet_buffer), &ack_frame_variant));
  }
}

// Test the case of having a QuicAckFrame with no ranges in it.  By
// examination of the Google Quic Ack code and tests, this case should
// be handled as an ack with no "ranges after the first"; the
// AckBlockCount should be 0 and the FirstAckBlock should be
// |LargestAcked| - 1 (number of packets preceding the LargestAcked.
TEST_F(QuicIetfFramerTest, AckFrameNoRanges) {
  char packet_buffer[kNormalPacketBufferSize];

  // Make a writer so that the serialized packet is placed in
  // packet_buffer.
  QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
                        quiche::NETWORK_BYTE_ORDER);

  QuicAckFrame transmit_frame;
  transmit_frame.largest_acked = QuicPacketNumber(1);
  transmit_frame.ack_delay_time = QuicTime::Delta::FromMicroseconds(0);

  size_t expected_size =
      QuicFramerPeer::GetIetfAckFrameSize(&framer_, transmit_frame);
  // Write the frame to the packet buffer.
  EXPECT_TRUE(QuicFramerPeer::AppendIetfAckFrameAndTypeByte(
      &framer_, transmit_frame, &writer));

  uint8_t packet[] = {
      0x02,  // type, IETF_ACK
      0x01,  // largest_acked,
      0x00,  // delay
      0x00,  // count of additional ack blocks
      0x00,  // size of first ack block (packets preceding largest_acked)
  };
  EXPECT_EQ(expected_size, sizeof(packet));
  EXPECT_EQ(sizeof(packet), writer.length());
  EXPECT_EQ(0, memcmp(packet, packet_buffer, writer.length()));

  // Now set up a reader to read in the frame.
  QuicDataReader reader(packet_buffer, writer.length(),
                        quiche::NETWORK_BYTE_ORDER);

  // an AckFrame to hold the results
  QuicAckFrame receive_frame;

  // read in the frame type
  uint8_t received_frame_type;
  EXPECT_TRUE(reader.ReadUInt8(&received_frame_type));
  EXPECT_EQ(received_frame_type, IETF_ACK);

  EXPECT_TRUE(QuicFramerPeer::ProcessIetfAckFrame(&framer_, &reader, IETF_ACK,
                                                  &receive_frame));

  // Now check that the received frame matches the sent frame.
  EXPECT_EQ(transmit_frame.largest_acked, receive_frame.largest_acked);
}

TEST_F(QuicIetfFramerTest, PathChallengeFrame) {
  // Double-braces needed on some platforms due to
  // https://bugs.llvm.org/show_bug.cgi?id=21629
  QuicPathFrameBuffer buffer0 = {{0, 0, 0, 0, 0, 0, 0, 0}};
  QuicPathFrameBuffer buffer1 = {
      {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
  char packet_buffer[kNormalPacketBufferSize];
  EXPECT_TRUE(
      TryPathChallengeFrame(packet_buffer, sizeof(packet_buffer), buffer0));
  EXPECT_TRUE(
      TryPathChallengeFrame(packet_buffer, sizeof(packet_buffer), buffer1));
}

TEST_F(QuicIetfFramerTest, PathResponseFrame) {
  // Double-braces needed on some platforms due to
  // https://bugs.llvm.org/show_bug.cgi?id=21629
  QuicPathFrameBuffer buffer0 = {{0, 0, 0, 0, 0, 0, 0, 0}};
  QuicPathFrameBuffer buffer1 = {
      {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
  char packet_buffer[kNormalPacketBufferSize];
  EXPECT_TRUE(
      TryPathResponseFrame(packet_buffer, sizeof(packet_buffer), buffer0));
  EXPECT_TRUE(
      TryPathResponseFrame(packet_buffer, sizeof(packet_buffer), buffer1));
}

TEST_F(QuicIetfFramerTest, ResetStreamFrame) {
  char packet_buffer[kNormalPacketBufferSize];
  struct resets {
    QuicStreamId stream_id;
    uint16_t error_code;
    QuicStreamOffset final_offset;
  } reset_frames[] = {
      {0, 55, 0},
      {0x10, 73, 0x300},
  };
  for (auto reset : reset_frames) {
    TryResetFrame(packet_buffer, sizeof(packet_buffer), reset.stream_id,
                  reset.error_code, reset.final_offset);
  }
}

TEST_F(QuicIetfFramerTest, StopSendingFrame) {
  char packet_buffer[kNormalPacketBufferSize];

  // Make a writer so that the serialized packet is placed in
  // packet_buffer.
  QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
                        quiche::NETWORK_BYTE_ORDER);

  QuicStopSendingFrame transmit_frame;
  transmit_frame.stream_id = 12345;
  transmit_frame.application_error_code = 543;

  // Write the frame to the packet buffer.
  EXPECT_TRUE(QuicFramerPeer::AppendStopSendingFrame(&framer_, transmit_frame,
                                                     &writer));
  // Check that the number of bytes in the buffer is in the
  // allowed range.
  EXPECT_LE(3u, writer.length());
  EXPECT_GE(10u, writer.length());

  QuicDataReader reader(packet_buffer, writer.length(),
                        quiche::NETWORK_BYTE_ORDER);

  // A frame to hold the results
  QuicStopSendingFrame receive_frame;

  EXPECT_TRUE(QuicFramerPeer::ProcessStopSendingFrame(&framer_, &reader,
                                                      &receive_frame));

  // Verify that the transmitted and received values are the same.
  EXPECT_EQ(receive_frame.stream_id, 12345u);
  EXPECT_EQ(receive_frame.application_error_code, 543u);
  EXPECT_EQ(receive_frame.stream_id, transmit_frame.stream_id);
  EXPECT_EQ(receive_frame.application_error_code,
            transmit_frame.application_error_code);
}

TEST_F(QuicIetfFramerTest, MaxDataFrame) {
  char packet_buffer[kNormalPacketBufferSize];
  QuicStreamOffset window_sizes[] = {0,       1,        2,        5,       10,
                                     20,      50,       100,      200,     500,
                                     1000000, kOffset8, kOffset4, kOffset2};
  for (QuicStreamOffset window_size : window_sizes) {
    memset(packet_buffer, 0, sizeof(packet_buffer));

    // Set up the writer and transmit QuicWindowUpdateFrame
    QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
                          quiche::NETWORK_BYTE_ORDER);
    QuicWindowUpdateFrame transmit_frame(0, 99, window_size);

    // Add the frame.
    EXPECT_TRUE(
        QuicFramerPeer::AppendMaxDataFrame(&framer_, transmit_frame, &writer));

    // Check that the number of bytes in the buffer is in the expected range.
    EXPECT_LE(1u, writer.length());
    EXPECT_GE(8u, writer.length());

    // Set up reader and an empty QuicWindowUpdateFrame
    QuicDataReader reader(packet_buffer, writer.length(),
                          quiche::NETWORK_BYTE_ORDER);
    QuicWindowUpdateFrame receive_frame;

    // Deframe it
    EXPECT_TRUE(
        QuicFramerPeer::ProcessMaxDataFrame(&framer_, &reader, &receive_frame));

    // Now check that the received data equals the sent data.
    EXPECT_EQ(transmit_frame.max_data, window_size);
    EXPECT_EQ(transmit_frame.max_data, receive_frame.max_data);
    EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
              receive_frame.stream_id);
  }
}

TEST_F(QuicIetfFramerTest, MaxStreamDataFrame) {
  char packet_buffer[kNormalPacketBufferSize];
  QuicStreamOffset window_sizes[] = {0,       1,        2,        5,       10,
                                     20,      50,       100,      200,     500,
                                     1000000, kOffset8, kOffset4, kOffset2};
  QuicIetfStreamId stream_ids[] = {kStreamId4, kStreamId2, kStreamId1,
                                   kStreamId0};

  for (QuicIetfStreamId stream_id : stream_ids) {
    for (QuicStreamOffset window_size : window_sizes) {
      memset(packet_buffer, 0, sizeof(packet_buffer));

      // Set up the writer and transmit QuicWindowUpdateFrame
      QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
                            quiche::NETWORK_BYTE_ORDER);
      QuicWindowUpdateFrame transmit_frame(0, stream_id, window_size);

      // Add the frame.
      EXPECT_TRUE(QuicFramerPeer::AppendMaxStreamDataFrame(
          &framer_, transmit_frame, &writer));

      // Check that number of bytes in the buffer is in the expected range.
      EXPECT_LE(2u, writer.length());
      EXPECT_GE(16u, writer.length());

      // Set up reader and empty receive QuicPaddingFrame.
      QuicDataReader reader(packet_buffer, writer.length(),
                            quiche::NETWORK_BYTE_ORDER);
      QuicWindowUpdateFrame receive_frame;

      // Deframe it
      EXPECT_TRUE(QuicFramerPeer::ProcessMaxStreamDataFrame(&framer_, &reader,
                                                            &receive_frame));

      // Now check that received data and sent data are equal.
      EXPECT_EQ(transmit_frame.max_data, window_size);
      EXPECT_EQ(transmit_frame.max_data, receive_frame.max_data);
      EXPECT_EQ(stream_id, receive_frame.stream_id);
      EXPECT_EQ(transmit_frame.stream_id, receive_frame.stream_id);
    }
  }
}

TEST_F(QuicIetfFramerTest, MaxStreamsFrame) {
  QuicStreamCount stream_counts[] = {0x3fffffff, 0x3fff, 0x3f, 0x1};

  for (QuicStreamCount stream_count : stream_counts) {
    // Cover all four combinations of uni/bi-directional and
    // server-/client- initiation.
    TryMaxStreamsFrame(stream_count, /*unidirectional=*/true,
                       /*stream_id_server_initiated=*/true);
    TryMaxStreamsFrame(stream_count, /*unidirectional=*/true,
                       /*stream_id_server_initiated=*/false);
    TryMaxStreamsFrame(stream_count, /*unidirectional=*/false,
                       /*stream_id_server_initiated=*/true);
    TryMaxStreamsFrame(stream_count, /*unidirectional=*/false,
                       /*stream_id_server_initiated=*/false);
  }
}

TEST_F(QuicIetfFramerTest, BlockedFrame) {
  char packet_buffer[kNormalPacketBufferSize];
  QuicStreamOffset offsets[] = {kOffset8, kOffset4, kOffset2, kOffset1,
                                kOffset0};

  for (QuicStreamOffset offset : offsets) {
    memset(packet_buffer, 0, sizeof(packet_buffer));

    // Set up the writer and transmit QuicBlockedFrame
    QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
                          quiche::NETWORK_BYTE_ORDER);
    QuicBlockedFrame transmit_frame(
        0, QuicUtils::GetInvalidStreamId(framer_.transport_version()), offset);

    // Add the frame.
    EXPECT_TRUE(QuicFramerPeer::AppendIetfBlockedFrame(&framer_, transmit_frame,
                                                       &writer));

    // Check that buffer length is in the expected range
    EXPECT_LE(1u, writer.length());
    EXPECT_GE(8u, writer.length());

    // Set up reader and empty receive QuicFrame.
    QuicDataReader reader(packet_buffer, writer.length(),
                          quiche::NETWORK_BYTE_ORDER);
    QuicBlockedFrame receive_frame;

    // Deframe it
    EXPECT_TRUE(QuicFramerPeer::ProcessIetfBlockedFrame(&framer_, &reader,
                                                        &receive_frame));

    // Check that received and sent data are equivalent
    EXPECT_EQ(QuicUtils::GetInvalidStreamId(framer_.transport_version()),
              receive_frame.stream_id);
    EXPECT_EQ(offset, receive_frame.offset);
    EXPECT_EQ(transmit_frame.offset, receive_frame.offset);
  }
}

TEST_F(QuicIetfFramerTest, StreamBlockedFrame) {
  char packet_buffer[kNormalPacketBufferSize];
  QuicStreamOffset offsets[] = {0,       1,        2,        5,       10,
                                20,      50,       100,      200,     500,
                                1000000, kOffset8, kOffset4, kOffset2};
  QuicIetfStreamId stream_ids[] = {kStreamId4, kStreamId2, kStreamId1,
                                   kStreamId0};

  for (QuicIetfStreamId stream_id : stream_ids) {
    for (QuicStreamOffset offset : offsets) {
      memset(packet_buffer, 0, sizeof(packet_buffer));

      // Set up the writer and transmit QuicWindowUpdateFrame
      QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
                            quiche::NETWORK_BYTE_ORDER);
      QuicBlockedFrame transmit_frame(0, stream_id, offset);

      // Add the frame.
      EXPECT_TRUE(QuicFramerPeer::AppendStreamBlockedFrame(
          &framer_, transmit_frame, &writer));

      // Check that number of bytes in the buffer is in the expected range.
      EXPECT_LE(2u, writer.length());
      EXPECT_GE(16u, writer.length());

      // Set up reader and empty receive QuicPaddingFrame.
      QuicDataReader reader(packet_buffer, writer.length(),
                            quiche::NETWORK_BYTE_ORDER);
      QuicBlockedFrame receive_frame;

      // Deframe it
      EXPECT_TRUE(QuicFramerPeer::ProcessStreamBlockedFrame(&framer_, &reader,
                                                            &receive_frame));

      // Now check that received == sent
      EXPECT_EQ(transmit_frame.offset, offset);
      EXPECT_EQ(transmit_frame.offset, receive_frame.offset);
      EXPECT_EQ(stream_id, receive_frame.stream_id);
      EXPECT_EQ(transmit_frame.stream_id, receive_frame.stream_id);
    }
  }
}

TEST_F(QuicIetfFramerTest, StreamsBlockedFrame) {
  QuicStreamCount stream_counts[] = {0x3fffffff, 0x3fff, 0x3f, 0x1};

  for (QuicStreamCount stream_count : stream_counts) {
    TryStreamsBlockedFrame(stream_count,
                           /*unidirectional=*/false,
                           /*stream_id_server_initiated=*/false);
    TryStreamsBlockedFrame(stream_count,
                           /*unidirectional=*/false,
                           /*stream_id_server_initiated=*/true);
    TryStreamsBlockedFrame(stream_count,
                           /*unidirectional=*/true,
                           /*stream_id_server_initiated=*/false);
    TryStreamsBlockedFrame(stream_count,
                           /*unidirectional=*/true,
                           /*stream_id_server_initiated=*/true);
  }
}

TEST_F(QuicIetfFramerTest, NewConnectionIdFrame) {
  char packet_buffer[kNormalPacketBufferSize];

  QuicNewConnectionIdFrame transmit_frame;
  transmit_frame.connection_id = TestConnectionId(UINT64_C(0x0edcba9876543201));
  transmit_frame.sequence_number = 0x01020304;
  transmit_frame.retire_prior_to = 0x00020304;
  // The token is defined as a uint128 -- a 16-byte integer.
  // The value is set in this manner because we want each
  // byte to have a specific value so that the binary
  // packet check (below) is good. If we used integer
  // operations (eg. "token = 0x12345...") then the bytes
  // would be set in host order.
  unsigned char token_bytes[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
                                 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
                                 0x0c, 0x0d, 0x0e, 0x0f};
  memcpy(&transmit_frame.stateless_reset_token, token_bytes,
         sizeof(transmit_frame.stateless_reset_token));

  memset(packet_buffer, 0, sizeof(packet_buffer));

  // Set up the writer and transmit a QuicNewConnectionIdFrame
  QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
                        quiche::NETWORK_BYTE_ORDER);

  // Add the frame.
  EXPECT_TRUE(QuicFramerPeer::AppendNewConnectionIdFrame(
      &framer_, transmit_frame, &writer));
  // clang-format off
  uint8_t packet[] = {
    // sequence number, 0x80 for varint62 encoding
    0x80 + 0x01, 0x02, 0x03, 0x04,
    // retire_prior_to, 0x80 for varint62 encoding
    0x80 + 0x00, 0x02, 0x03, 0x04,
    // new connection id length, is not varint62 encoded.
    0x08,
    // new connection id, is not varint62 encoded.
    0x0E, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x01,
    // the reset token:
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
  };
  // clang-format on

  // Check that buffer length is correct
  EXPECT_EQ(sizeof(packet), writer.length());
  EXPECT_EQ(0, memcmp(packet_buffer, packet, sizeof(packet)));

  // Set up reader and empty receive QuicPaddingFrame.
  QuicDataReader reader(packet_buffer, writer.length(),
                        quiche::NETWORK_BYTE_ORDER);
  QuicNewConnectionIdFrame receive_frame;

  // Deframe it
  EXPECT_TRUE(QuicFramerPeer::ProcessNewConnectionIdFrame(&framer_, &reader,
                                                          &receive_frame));

  // Now check that received == sent
  EXPECT_EQ(transmit_frame.connection_id, receive_frame.connection_id);
  EXPECT_EQ(transmit_frame.sequence_number, receive_frame.sequence_number);
  EXPECT_EQ(transmit_frame.retire_prior_to, receive_frame.retire_prior_to);
  EXPECT_EQ(transmit_frame.stateless_reset_token,
            receive_frame.stateless_reset_token);
}

TEST_F(QuicIetfFramerTest, RetireConnectionIdFrame) {
  char packet_buffer[kNormalPacketBufferSize];

  QuicRetireConnectionIdFrame transmit_frame;
  transmit_frame.sequence_number = 0x01020304;

  memset(packet_buffer, 0, sizeof(packet_buffer));

  // Set up the writer and transmit QuicRetireConnectionIdFrame
  QuicDataWriter writer(sizeof(packet_buffer), packet_buffer,
                        quiche::NETWORK_BYTE_ORDER);

  // Add the frame.
  EXPECT_TRUE(QuicFramerPeer::AppendRetireConnectionIdFrame(
      &framer_, transmit_frame, &writer));
  // Check that buffer length is correct
  EXPECT_EQ(4u, writer.length());
  // clang-format off
  uint8_t packet[] = {
    // sequence number, 0x80 for varint62 encoding
    0x80 + 0x01, 0x02, 0x03, 0x04,
  };

  // clang-format on
  EXPECT_EQ(0, memcmp(packet_buffer, packet, sizeof(packet)));

  // Set up reader and empty receive QuicPaddingFrame.
  QuicDataReader reader(packet_buffer, writer.length(),
                        quiche::NETWORK_BYTE_ORDER);
  QuicRetireConnectionIdFrame receive_frame;

  // Deframe it
  EXPECT_TRUE(QuicFramerPeer::ProcessRetireConnectionIdFrame(&framer_, &reader,
                                                             &receive_frame));

  // Now check that received == sent
  EXPECT_EQ(transmit_frame.sequence_number, receive_frame.sequence_number);
}

}  // namespace
}  // namespace test
}  // namespace quic
