// Copyright 2016 The Fuchsia 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 "util.h"

#include <string>

#include <gtest/gtest.h>

namespace debugger_utils {
namespace {

const char kInvalidInput1[] = "1G";
const char kInvalidInput2[] = "G1";
const char kInvalidInput3[] = "1g";
const char kInvalidInput4[] = "g1";

const char kByteStr1[] = "01";
const char kByteStr2[] = "0B";
const char kByteStr3[] = "0F";
const char kByteStr4[] = "A0";
const char kByteStr5[] = "A9";
const char kByteStr6[] = "FF";
const char kByteStr7[] = "0b";
const char kByteStr8[] = "0f";
const char kByteStr9[] = "a0";
const char kByteStr10[] = "a9";
const char kByteStr11[] = "ff";

const uint8_t kByte1 = 0x01;
const uint8_t kByte2 = 0x0b;
const uint8_t kByte3 = 0x0f;
const uint8_t kByte4 = 0xa0;
const uint8_t kByte5 = 0xa9;
const uint8_t kByte6 = 0xff;

TEST(UtilTest, DecodeByteString) {
  uint8_t result;

  EXPECT_FALSE(DecodeByteString(kInvalidInput1, &result));
  EXPECT_FALSE(DecodeByteString(kInvalidInput2, &result));
  EXPECT_FALSE(DecodeByteString(kInvalidInput3, &result));
  EXPECT_FALSE(DecodeByteString(kInvalidInput4, &result));

  struct {
    const char* str;
    const uint8_t byte;
  } kTestCases[] = {{kByteStr1, kByte1},  {kByteStr2, kByte2},  {kByteStr3, kByte3},
                    {kByteStr4, kByte4},  {kByteStr5, kByte5},  {kByteStr6, kByte6},
                    {kByteStr7, kByte2},  {kByteStr8, kByte3},  {kByteStr9, kByte4},
                    {kByteStr10, kByte5}, {kByteStr11, kByte6}, {}};

  for (int i = 0; kTestCases[i].str; ++i) {
    EXPECT_TRUE(DecodeByteString(kTestCases[i].str, &result));
    EXPECT_EQ(kTestCases[i].byte, result);
  }
}

TEST(UtilTest, EncodeByteString) {
  struct {
    const char* str;
    const uint8_t byte;
  } kTestCases[] = {{kByteStr1, kByte1},
                    {kByteStr7, kByte2},
                    {kByteStr8, kByte3},
                    {kByteStr9, kByte4},
                    {kByteStr10, kByte5},
                    {kByteStr11, kByte6},
                    {}};

  for (int i = 0; kTestCases[i].str; ++i) {
    char result[2];
    EncodeByteString(kTestCases[i].byte, result);
    EXPECT_EQ(kTestCases[i].str[0], result[0]);
    EXPECT_EQ(kTestCases[i].str[1], result[1]);
  }
}

TEST(UtilTest, EncodeByteArrayString) {
  std::vector<uint8_t> data;
  EXPECT_EQ("", EncodeByteArrayString(data.data(), data.size()));

  data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 127, 255};
  EXPECT_EQ("0102030405060708090a0b0c0d0e0f107fff",
            EncodeByteArrayString(data.data(), data.size()));
}

TEST(UtilTest, DecodeByteArrayString) {
  EXPECT_EQ(std::vector<uint8_t>{}, DecodeByteArrayString(""));
  EXPECT_EQ(std::vector<uint8_t>{}, DecodeByteArrayString("0102030"));
  EXPECT_EQ(std::vector<uint8_t>{}, DecodeByteArrayString("01020:04"));
  EXPECT_EQ((std::vector<uint8_t>{10, 11, 12, 13, 14, 15, 16, 127, 255}),
            DecodeByteArrayString("0a0b0c0d0e0f107fff"));
}

TEST(UtilTest, DecodeString) {
  EXPECT_EQ(std::string(""), DecodeString(""));
  EXPECT_EQ(std::string("\x0a"
                        "bc"
                        "\xff"),
            DecodeString("0a6263ff"));
}

TEST(UtilTest, EscapeNonPrintableString) {
  const char kPrintableChars[] =
      "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
      "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ";
  const char kSomeNonPrintableChars[] = {
      0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15, 16,
      17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
      // 32 is "space", which is printable.
  };

  EXPECT_EQ(kPrintableChars, EscapeNonPrintableString(kPrintableChars));
  EXPECT_EQ(
      "\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d"
      "\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b"
      "\\x1c\\x1d\\x1e\\x1f ",
      EscapeNonPrintableString(
          fxl::StringView(kSomeNonPrintableChars, sizeof(kSomeNonPrintableChars))));
}

TEST(UtilTest, JoinStrings) {
  constexpr char kEntry1[] = "an entry";
  constexpr char kEntry2[] = "another entry";
  constexpr char kEntry3[] = "banana";

  // Allocate a buffer that's just large enough to join all three entries above
  // (including 2 commas).
  const size_t kBufferSize = std::strlen(kEntry1) + std::strlen(kEntry2) + std::strlen(kEntry3) + 2;
  char buffer[kBufferSize];
  std::deque<std::string> strings;

  EXPECT_EQ(0u, JoinStrings(strings, ',', buffer, kBufferSize));

  strings.push_back(kEntry1);
  size_t result_size = JoinStrings(strings, ',', buffer, kBufferSize);
  EXPECT_EQ(std::strlen(kEntry1), result_size);
  EXPECT_EQ(kEntry1, fxl::StringView(buffer, result_size));

  strings.push_back(kEntry2);
  result_size = JoinStrings(strings, ',', buffer, kBufferSize);
  EXPECT_EQ(std::strlen(kEntry1) + std::strlen(kEntry2) + 1, result_size);
  EXPECT_EQ("an entry,another entry", fxl::StringView(buffer, result_size));

  strings.push_back(kEntry3);
  result_size = JoinStrings(strings, ',', buffer, kBufferSize);
  EXPECT_EQ(kBufferSize, result_size);
  EXPECT_EQ("an entry,another entry,banana", fxl::StringView(buffer, result_size));
}

}  // namespace
}  // namespace debugger_utils
