// 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 "garnet/lib/debugger_utils/util.h"

#include "gtest/gtest.h"

namespace debugserver {
namespace util {
namespace {

TEST(UtilTest, BuildErrorPacket) {
  EXPECT_EQ("E01", BuildErrorPacket(ErrorCode::PERM));
  EXPECT_EQ("E02", BuildErrorPacket(ErrorCode::NOENT));
  EXPECT_EQ("E13", BuildErrorPacket(ErrorCode::ACCES));
  EXPECT_EQ("E91", BuildErrorPacket(ErrorCode::NAMETOOLONG));
  EXPECT_EQ("E9999", BuildErrorPacket(ErrorCode::UNKNOWN));
}

TEST(UtilTest, ParseThreadId) {
  bool has_pid;
  int64_t pid, tid;

  constexpr char kInvalid1[] = "";
  constexpr char kInvalid2[] = "hello";
  constexpr char kInvalid3[] = "phello.world";
  constexpr char kInvalid4[] = "p123.world";
  constexpr char kInvalid5[] = "phello.123";

  EXPECT_FALSE(ParseThreadId(kInvalid1, &has_pid, &pid, &tid));
  EXPECT_FALSE(ParseThreadId(kInvalid2, &has_pid, &pid, &tid));
  EXPECT_FALSE(ParseThreadId(kInvalid3, &has_pid, &pid, &tid));
  EXPECT_FALSE(ParseThreadId(kInvalid4, &has_pid, &pid, &tid));
  EXPECT_FALSE(ParseThreadId(kInvalid5, &has_pid, &pid, &tid));

  constexpr char kValid1[] = "0";
  constexpr char kValid2[] = "7b";
  constexpr char kValid3[] = "-1";
  constexpr char kValid4[] = "p0.0";
  constexpr char kValid5[] = "p7b.-1";
  constexpr char kValid6[] = "p-1.4d2";

  EXPECT_TRUE(ParseThreadId(kValid1, &has_pid, &pid, &tid));
  EXPECT_FALSE(has_pid);
  EXPECT_EQ(0, tid);

  EXPECT_TRUE(ParseThreadId(kValid2, &has_pid, &pid, &tid));
  EXPECT_FALSE(has_pid);
  EXPECT_EQ(123, tid);

  EXPECT_TRUE(ParseThreadId(kValid3, &has_pid, &pid, &tid));
  EXPECT_FALSE(has_pid);
  EXPECT_EQ(-1, tid);

  EXPECT_TRUE(ParseThreadId(kValid4, &has_pid, &pid, &tid));
  EXPECT_TRUE(has_pid);
  EXPECT_EQ(0, tid);
  EXPECT_EQ(0, pid);

  EXPECT_TRUE(ParseThreadId(kValid5, &has_pid, &pid, &tid));
  EXPECT_TRUE(has_pid);
  EXPECT_EQ(-1, tid);
  EXPECT_EQ(123, pid);

  EXPECT_TRUE(ParseThreadId(kValid6, &has_pid, &pid, &tid));
  EXPECT_TRUE(has_pid);
  EXPECT_EQ(1234, tid);
  EXPECT_EQ(-1, pid);
}

TEST(UtilTest, VerifyPacket) {
  fxl::StringView result;

#define TEST_PACKET(var, type) EXPECT_##type(VerifyPacket(var, &result))
#define TEST_VALID(var) TEST_PACKET(var, TRUE)
#define TEST_INVALID(var) TEST_PACKET(var, FALSE)
#define TEST_RESULT(expected) EXPECT_EQ(expected, result)

  // Invalid packets
  TEST_INVALID("");                // Empty
  TEST_INVALID("foo");             // No '$'
  TEST_INVALID("$foo");            // No '#'
  TEST_INVALID("$foo#");           // No checksum
  TEST_INVALID("$foo#4");          // No checksum
  TEST_INVALID("$foo#43");         // Wrong checksum
  TEST_INVALID("$foo#4Z");         // Malformed checksum
  TEST_INVALID("$foo#G0");         // Malformed checksum
  TEST_INVALID("$foo#44$foo#44");  // Wrong checksum

  // Valid packets
  TEST_VALID("$foo#44");
  TEST_RESULT("foo");
  TEST_VALID("$#00");
  TEST_RESULT("");

#undef TEST_INVALID
#undef TEST_VALID
#undef TEST_PACKET
}

TEST(UtilTest, ExtractParameters) {
  fxl::StringView prefix, params;

#define TEST_PARAMS(packet, expected_prefix, expected_params) \
  ExtractParameters(packet, &prefix, &params);                \
  EXPECT_EQ(expected_prefix, prefix);                         \
  EXPECT_EQ(expected_params, params);

  TEST_PARAMS("foo", "foo", "");
  TEST_PARAMS("foo:", "foo", "");
  TEST_PARAMS("foo:b", "foo", "b");
  TEST_PARAMS("foo:bar", "foo", "bar");

#undef TEST_PARAMS
}

TEST(UtilTest, FindUnescapedChar) {
  constexpr char kChar = '$';
  constexpr char kPacket1[] = "";
  constexpr char kPacket2[] = "$";
  constexpr char kPacket3[] = "}$";
  constexpr char kPacket4[] = "}$$";
  constexpr char kPacket5[] = "}}$";
  constexpr char kPacket6[] = "}}}$";
  constexpr char kPacket7[] = "}}}$$";

  size_t index;
  EXPECT_FALSE(FindUnescapedChar(kChar, kPacket1, &index));
  EXPECT_TRUE(FindUnescapedChar(kChar, kPacket2, &index));
  EXPECT_EQ(0u, index);
  EXPECT_FALSE(FindUnescapedChar(kChar, kPacket3, &index));
  EXPECT_TRUE(FindUnescapedChar(kChar, kPacket4, &index));
  EXPECT_EQ(2u, index);
  EXPECT_TRUE(FindUnescapedChar(kChar, kPacket5, &index));
  EXPECT_EQ(2u, index);
  EXPECT_FALSE(FindUnescapedChar(kChar, kPacket6, &index));
  EXPECT_TRUE(FindUnescapedChar(kChar, kPacket7, &index));
  EXPECT_EQ(4u, index);

  // The escape character itself can not be searched for as "unescaped".
  EXPECT_FALSE(FindUnescapedChar(kEscapeChar, kPacket3, &index));
  EXPECT_FALSE(FindUnescapedChar(kEscapeChar, kPacket4, &index));
  EXPECT_FALSE(FindUnescapedChar(kEscapeChar, kPacket5, &index));
  EXPECT_FALSE(FindUnescapedChar(kEscapeChar, kPacket6, &index));
  EXPECT_FALSE(FindUnescapedChar(kEscapeChar, kPacket7, &index));
}

}  // namespace
}  // namespace util
}  // namespace debugserver
