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

#include "net/third_party/quiche/src/quic/qbone/platform/tcp_packet.h"

#include <netinet/ip6.h>

#include <cstdint>

#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/common/platform/api/quiche_string_piece.h"
#include "net/third_party/quiche/src/common/platform/api/quiche_text_utils.h"

namespace quic {
namespace {

// clang-format off
constexpr uint8_t kReferenceTCPSYNPacket[] = {
  // START IPv6 Header
  // IPv6 with zero ToS and flow label
  0x60, 0x00, 0x00, 0x00,
  // Payload is 40 bytes
  0x00, 0x28,
  // Next header is TCP (6)
  0x06,
  // Hop limit is 64
  0x40,
  // Source address of ::1
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  // Destination address of ::1
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  // END IPv6 Header
  // START TCPv6 Header
  // Source port
  0xac, 0x1e,
  // Destination port
  0x27, 0x0f,
  // Sequence number
  0x4b, 0x01, 0xe8, 0x99,
  // Acknowledgement Sequence number,
  0x00, 0x00, 0x00, 0x00,
  // Offset
  0xa0,
  // Flags
  0x02,
  // Window
  0xaa, 0xaa,
  // Checksum
  0x2e, 0x21,
  // Urgent
  0x00, 0x00,
  // END TCPv6 Header
  // Options
  0x02, 0x04, 0xff, 0xc4, 0x04, 0x02, 0x08, 0x0a,
  0x1b, 0xb8, 0x52, 0xa1, 0x00, 0x00, 0x00, 0x00,
  0x01, 0x03, 0x03, 0x07,
};

constexpr uint8_t kReferenceTCPRSTPacket[] = {
  // START IPv6 Header
  // IPv6 with zero ToS and flow label
  0x60, 0x00, 0x00, 0x00,
  // Payload is 20 bytes
  0x00, 0x14,
  // Next header is TCP (6)
  0x06,
  // Hop limit is 64
  0x40,
  // Source address of ::1
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  // Destination address of ::1
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  // END IPv6 Header
  // START TCPv6 Header
  // Source port
  0x27, 0x0f,
  // Destination port
  0xac, 0x1e,
  // Sequence number
  0x00, 0x00, 0x00, 0x00,
  // Acknowledgement Sequence number,
  0x4b, 0x01, 0xe8, 0x9a,
  // Offset
  0x50,
  // Flags
  0x14,
  // Window
  0x00, 0x00,
  // Checksum
  0xa9, 0x05,
  // Urgent
  0x00, 0x00,
  // END TCPv6 Header
};
// clang-format on

}  // namespace

TEST(TcpPacketTest, CreatedPacketMatchesReference) {
  quiche::QuicheStringPiece syn = quiche::QuicheStringPiece(
      reinterpret_cast<const char*>(kReferenceTCPSYNPacket),
      sizeof(kReferenceTCPSYNPacket));
  quiche::QuicheStringPiece expected_packet = quiche::QuicheStringPiece(
      reinterpret_cast<const char*>(kReferenceTCPRSTPacket),
      sizeof(kReferenceTCPRSTPacket));
  CreateTcpResetPacket(
      syn, [&expected_packet](quiche::QuicheStringPiece packet) {
        QUIC_LOG(INFO) << quiche::QuicheTextUtils::HexDump(packet);
        ASSERT_EQ(packet, expected_packet);
      });
}

}  // namespace quic
