// 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/core/quic_packet_number.h"

#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"

namespace quic {

namespace test {

namespace {

TEST(QuicPacketNumberTest, BasicTest) {
  QuicPacketNumber num;
  EXPECT_FALSE(num.IsInitialized());

  QuicPacketNumber num2(10);
  EXPECT_TRUE(num2.IsInitialized());
  EXPECT_EQ(10u, num2.ToUint64());
  EXPECT_EQ(10u, num2.Hash());
  num2.Clear();
  EXPECT_FALSE(num2.IsInitialized());

  if (!GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
    QuicPacketNumber num3(std::numeric_limits<uint64_t>::max());
    EXPECT_TRUE(num3.IsInitialized());
    EXPECT_EQ(std::numeric_limits<uint64_t>::max(), num3.ToUint64());
    EXPECT_EQ(std::numeric_limits<uint64_t>::max(), num3.Hash());
    num3.Clear();
    EXPECT_FALSE(num3.IsInitialized());
    return;
  }

  QuicPacketNumber num4(0);
  EXPECT_TRUE(num4.IsInitialized());
  EXPECT_EQ(0u, num4.ToUint64());
  EXPECT_EQ(0u, num4.Hash());
  num4.Clear();
  EXPECT_FALSE(num4.IsInitialized());
}

TEST(QuicPacketNumberTest, Operators) {
  QuicPacketNumber num(100);
  EXPECT_EQ(QuicPacketNumber(100), num++);
  EXPECT_EQ(QuicPacketNumber(101), num);
  EXPECT_EQ(QuicPacketNumber(101), num--);
  EXPECT_EQ(QuicPacketNumber(100), num);

  EXPECT_EQ(QuicPacketNumber(101), ++num);
  EXPECT_EQ(QuicPacketNumber(100), --num);

  if (!GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
    QuicPacketNumber num2(std::numeric_limits<uint64_t>::max());
    EXPECT_EQ(QuicPacketNumber(std::numeric_limits<uint64_t>::max()), num2--);
    EXPECT_EQ(QuicPacketNumber(std::numeric_limits<uint64_t>::max() - 1), num2);
    EXPECT_EQ(QuicPacketNumber(std::numeric_limits<uint64_t>::max() - 2),
              --num2);

    EXPECT_EQ(QuicPacketNumber(std::numeric_limits<uint64_t>::max() - 2),
              num2++);
    EXPECT_EQ(QuicPacketNumber(std::numeric_limits<uint64_t>::max() - 1), num2);
    EXPECT_EQ(QuicPacketNumber(std::numeric_limits<uint64_t>::max()), ++num2);
    return;
  }

  QuicPacketNumber num3(0);
  EXPECT_EQ(QuicPacketNumber(0), num3++);
  EXPECT_EQ(QuicPacketNumber(1), num3);
  EXPECT_EQ(QuicPacketNumber(2), ++num3);

  EXPECT_EQ(QuicPacketNumber(2), num3--);
  EXPECT_EQ(QuicPacketNumber(1), num3);
  EXPECT_EQ(QuicPacketNumber(0), --num3);
}

}  // namespace

}  // namespace test

}  // namespace quic
