// Copyright (c) 2015 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 "quiche/quic/core/crypto/crypto_handshake_message.h"

#include "quiche/quic/core/crypto/crypto_handshake.h"
#include "quiche/quic/core/crypto/crypto_protocol.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/common/quiche_endian.h"

namespace quic {
namespace test {
namespace {

TEST(CryptoHandshakeMessageTest, DebugString) {
  const char* str = "SHLO<\n>";

  CryptoHandshakeMessage message;
  message.set_tag(kSHLO);
  EXPECT_EQ(str, message.DebugString());

  // Test copy
  CryptoHandshakeMessage message2(message);
  EXPECT_EQ(str, message2.DebugString());

  // Test move
  CryptoHandshakeMessage message3(std::move(message));
  EXPECT_EQ(str, message3.DebugString());

  // Test assign
  CryptoHandshakeMessage message4 = message3;
  EXPECT_EQ(str, message4.DebugString());

  // Test move-assign
  CryptoHandshakeMessage message5 = std::move(message3);
  EXPECT_EQ(str, message5.DebugString());
}

TEST(CryptoHandshakeMessageTest, DebugStringWithUintVector) {
  const char* str =
      "REJ <\n  RREJ: "
      "SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE,"
      "CLIENT_NONCE_NOT_UNIQUE_FAILURE\n>";

  CryptoHandshakeMessage message;
  message.set_tag(kREJ);
  std::vector<uint32_t> reasons = {
      SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE,
      CLIENT_NONCE_NOT_UNIQUE_FAILURE};
  message.SetVector(kRREJ, reasons);
  EXPECT_EQ(str, message.DebugString());

  // Test copy
  CryptoHandshakeMessage message2(message);
  EXPECT_EQ(str, message2.DebugString());

  // Test move
  CryptoHandshakeMessage message3(std::move(message));
  EXPECT_EQ(str, message3.DebugString());

  // Test assign
  CryptoHandshakeMessage message4 = message3;
  EXPECT_EQ(str, message4.DebugString());

  // Test move-assign
  CryptoHandshakeMessage message5 = std::move(message3);
  EXPECT_EQ(str, message5.DebugString());
}

TEST(CryptoHandshakeMessageTest, DebugStringWithTagVector) {
  const char* str = "CHLO<\n  COPT: 'TBBR','PAD ','BYTE'\n>";

  CryptoHandshakeMessage message;
  message.set_tag(kCHLO);
  message.SetVector(kCOPT, QuicTagVector{kTBBR, kPAD, kBYTE});
  EXPECT_EQ(str, message.DebugString());

  // Test copy
  CryptoHandshakeMessage message2(message);
  EXPECT_EQ(str, message2.DebugString());

  // Test move
  CryptoHandshakeMessage message3(std::move(message));
  EXPECT_EQ(str, message3.DebugString());

  // Test assign
  CryptoHandshakeMessage message4 = message3;
  EXPECT_EQ(str, message4.DebugString());

  // Test move-assign
  CryptoHandshakeMessage message5 = std::move(message3);
  EXPECT_EQ(str, message5.DebugString());
}

TEST(CryptoHandshakeMessageTest, HasStringPiece) {
  CryptoHandshakeMessage message;
  EXPECT_FALSE(message.HasStringPiece(kALPN));
  message.SetStringPiece(kALPN, "foo");
  EXPECT_TRUE(message.HasStringPiece(kALPN));
}

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