// Copyright 2019 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 <gtest/gtest.h>

#include "tools/fidlcat/interception_tests/interception_workflow_test.h"

namespace fidlcat {

// zx_handle_close tests.

std::unique_ptr<SystemCallTest> ZxHandleClose(int64_t result, std::string_view result_name,
                                              zx_handle_t handle) {
  auto value = std::make_unique<SystemCallTest>("zx_handle_close", result, result_name);
  value->AddInput(handle);
  return value;
}

#define HANDLE_CLOSE_DISPLAY_TEST_CONTENT(result, expected) \
  PerformDisplayTest("$plt(zx_handle_close)", ZxHandleClose(result, #result, kHandle), expected);

#define HANDLE_CLOSE_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {            \
    HANDLE_CLOSE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                      \
  TEST_F(InterceptionWorkflowTestArm, name) { HANDLE_CLOSE_DISPLAY_TEST_CONTENT(errno, expected); }

HANDLE_CLOSE_DISPLAY_TEST(ZxHandleClose, ZX_OK,
                          "\n"
                          "\x1B[32m0.000000\x1B[0m "
                          "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                          "zx_handle_close("
                          "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m)\n"
                          "\x1B[32m0.000000\x1B[0m "
                          "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_handle_close_many tests.

std::unique_ptr<SystemCallTest> ZxHandleCloseMany(int64_t result, std::string_view result_name,
                                                  const zx_handle_t* handles, size_t num_handles) {
  auto value = std::make_unique<SystemCallTest>("zx_handle_close_many", result, result_name);
  value->AddInput(reinterpret_cast<uint64_t>(handles));
  value->AddInput(num_handles);
  return value;
}

#define HANDLE_CLOSE_MANY_DISPLAY_TEST_CONTENT(result, expected)                         \
  std::vector<zx_handle_t> handles = {kHandle, kHandle2, kHandle3};                      \
  PerformDisplayTest("$plt(zx_handle_close_many)",                                       \
                     ZxHandleCloseMany(result, #result, handles.data(), handles.size()), \
                     expected);

#define HANDLE_CLOSE_MANY_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                 \
    HANDLE_CLOSE_MANY_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                           \
  TEST_F(InterceptionWorkflowTestArm, name) {                 \
    HANDLE_CLOSE_MANY_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

HANDLE_CLOSE_MANY_DISPLAY_TEST(ZxHandleCloseMany, ZX_OK,
                               "\n"
                               "\x1B[32m0.000000\x1B[0m "
                               "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                               "zx_handle_close_many()\n"
                               "  handles: \x1B[32mvector<handle>\x1B[0m = [ "
                               "\x1B[31mcefa1db0\x1B[0m, \x1B[31mcefa1222\x1B[0m, "
                               "\x1B[31mcefa1333\x1B[0m ]\n"
                               "\x1B[32m0.000000\x1B[0m "
                               "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_handle_duplicate tests.

std::unique_ptr<SystemCallTest> ZxHandleDuplicate(int64_t result, std::string_view result_name,
                                                  zx_handle_t handle, zx_rights_t rights,
                                                  zx_handle_t* out) {
  auto value = std::make_unique<SystemCallTest>("zx_handle_duplicate", result, result_name);
  value->AddInput(handle);
  value->AddInput(rights);
  value->AddInput(reinterpret_cast<uint64_t>(out));
  return value;
}

#define HANDLE_DUPLICATE_DISPLAY_TEST_CONTENT(result, expected)                               \
  zx_handle_t out = kHandleOut;                                                               \
  PerformDisplayTest("$plt(zx_handle_duplicate)",                                             \
                     ZxHandleDuplicate(result, #result, kHandle, ZX_RIGHT_SAME_RIGHTS, &out), \
                     expected);

#define HANDLE_DUPLICATE_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                \
    HANDLE_DUPLICATE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                          \
  TEST_F(InterceptionWorkflowTestArm, name) {                \
    HANDLE_DUPLICATE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

HANDLE_DUPLICATE_DISPLAY_TEST(
    ZxHandleDuplicate, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_handle_duplicate("
    "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "rights: \x1B[32mzx.rights\x1B[0m = \x1B[34mZX_RIGHT_SAME_RIGHTS\x1B[0m)\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m (out: \x1B[32mhandle\x1B[0m = \x1B[31mbde90caf\x1B[0m)\n");

// zx_handle_replace tests.

std::unique_ptr<SystemCallTest> ZxHandleReplace(int64_t result, std::string_view result_name,
                                                zx_handle_t handle, zx_rights_t rights,
                                                zx_handle_t* out) {
  auto value = std::make_unique<SystemCallTest>("zx_handle_replace", result, result_name);
  value->AddInput(handle);
  value->AddInput(rights);
  value->AddInput(reinterpret_cast<uint64_t>(out));
  return value;
}

#define HANDLE_REPLACE_DISPLAY_TEST_CONTENT(result, expected)                               \
  zx_handle_t out = kHandleOut;                                                             \
  PerformDisplayTest("$plt(zx_handle_replace)",                                             \
                     ZxHandleReplace(result, #result, kHandle, ZX_RIGHT_SAME_RIGHTS, &out), \
                     expected);

#define HANDLE_REPLACE_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {              \
    HANDLE_REPLACE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                        \
  TEST_F(InterceptionWorkflowTestArm, name) {              \
    HANDLE_REPLACE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

HANDLE_REPLACE_DISPLAY_TEST(
    ZxHandleReplace, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_handle_replace("
    "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "rights: \x1B[32mzx.rights\x1B[0m = \x1B[34mZX_RIGHT_SAME_RIGHTS\x1B[0m)\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m (out: \x1B[32mhandle\x1B[0m = \x1B[31mbde90caf\x1B[0m)\n");

}  // namespace fidlcat
