// Copyright 2020 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 "src/developer/debug/zxdb/console/format_handle.h"

#include <gtest/gtest.h>

#include "src/developer/debug/ipc/records.h"

namespace zxdb {

TEST(FormatHandle, Table) {
  std::vector<debug_ipc::InfoHandleExtended> handles;

  // Empty case.
  OutputBuffer out = FormatHandles(handles, false);
  EXPECT_EQ("No handles.", out.AsString());

  // Give it two objects.
  handles.resize(2);
  handles[0].type = 2;  // Thread.
  handles[0].handle_value = 1234;
  handles[0].koid = 7890;

  handles[1].type = 1;  // Process.
  handles[1].handle_value = 1123;
  handles[1].koid = 7891;

  out = FormatHandles(handles, false);
  EXPECT_EQ(
      "  Handle  Type                 Koid\n"
      "    1234  ZX_OBJ_TYPE_THREAD   7890\n"
      "    1123  ZX_OBJ_TYPE_PROCESS  7891\n",
      out.AsString());

  // Hex formatting
  out = FormatHandles(handles, true);
  EXPECT_EQ(
      "  Handle  Type                   Koid\n"
      "   0x4d2  ZX_OBJ_TYPE_THREAD   0x1ed2\n"
      "   0x463  ZX_OBJ_TYPE_PROCESS  0x1ed3\n",
      out.AsString());
}

TEST(FormatHandle, BasicDetails) {
  debug_ipc::InfoHandleExtended handle;
  handle.type = 2;  // Thread.
  handle.handle_value = 1234;
  handle.rights = 3;
  handle.props = 0;
  handle.koid = 7890;
  handle.related_koid = 1111;
  handle.peer_owner_koid = 2222;

  OutputBuffer out = FormatHandle(handle, false);
  EXPECT_EQ(
      "             Type  ZX_OBJ_TYPE_THREAD\n"
      "            Value  1234\n"
      "           Rights  ZX_RIGHT_DUPLICATE\n"
      "                   ZX_RIGHT_TRANSFER\n"
      "       Properties  ZX_OBJ_PROP_NONE\n"
      "             Koid  7890\n"
      "     Related koid  1111\n"
      "  Peer-owner koid  2222\n",
      out.AsString());

  // Related and peer owner koid should be omitted when 0 (not all handle types have these and
  // it looks confusing). This one also tests hex formatting.
  handle.props = 1;
  handle.related_koid = 0;
  handle.peer_owner_koid = 0;
  out = FormatHandle(handle, true);
  EXPECT_EQ(
      "        Type  ZX_OBJ_TYPE_THREAD\n"
      "       Value  0x4d2\n"
      "      Rights  ZX_RIGHT_DUPLICATE\n"
      "              ZX_RIGHT_TRANSFER\n"
      "  Properties  ZX_OBJ_PROP_WAITABLE\n"
      "        Koid  0x1ed2\n",
      out.AsString());
}

}  // namespace zxdb
