// 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_process_exit tests.

std::unique_ptr<SystemCallTest> ZxProcessExit(int64_t result, std::string_view result_name,
                                              int64_t retcode) {
  auto value = std::make_unique<SystemCallTest>("zx_process_exit", result, result_name);
  value->AddInput(retcode);
  return value;
}

#define PROCESS_EXIT_DISPLAY_TEST_CONTENT(result, retcode, expected)                           \
  PerformNoReturnDisplayTest("$plt(zx_process_exit)", ZxProcessExit(result, #result, retcode), \
                             expected);

#define PROCESS_EXIT_DISPLAY_TEST(name, errno, retcode, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                     \
    PROCESS_EXIT_DISPLAY_TEST_CONTENT(errno, retcode, expected);  \
  }                                                               \
  TEST_F(InterceptionWorkflowTestArm, name) {                     \
    PROCESS_EXIT_DISPLAY_TEST_CONTENT(errno, retcode, expected);  \
  }

PROCESS_EXIT_DISPLAY_TEST(ZxProcessExit0, ZX_OK, 0,
                          "\n"
                          "\x1B[32m0.000000\x1B[0m "
                          "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                          "zx_process_exit(retcode: \x1B[32mint64\x1B[0m = \x1B[34m0\x1B[0m)\n");

PROCESS_EXIT_DISPLAY_TEST(ZxProcessExit1, ZX_OK, 1,
                          "\n"
                          "\x1B[32m0.000000\x1B[0m "
                          "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                          "zx_process_exit(retcode: \x1B[32mint64\x1B[0m = \x1B[34m1\x1B[0m)\n");

PROCESS_EXIT_DISPLAY_TEST(
    ZxProcessExit2, ZX_OK, std::numeric_limits<int64_t>::min(),
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_process_exit(retcode: \x1B[32mint64\x1B[0m = \x1B[34m-9223372036854775808\x1B[0m)\n");

// zx_process_create tests.

std::unique_ptr<SystemCallTest> ZxProcessCreate(int64_t result, std::string_view result_name,
                                                zx_handle_t job, const char* name, size_t name_size,
                                                uint32_t options, zx_handle_t* proc_handle,
                                                zx_handle_t* vmar_handle) {
  auto value = std::make_unique<SystemCallTest>("zx_process_create", result, result_name);
  value->AddInput(job);
  value->AddInput(reinterpret_cast<uint64_t>(name));
  value->AddInput(name_size);
  value->AddInput(options);
  value->AddInput(reinterpret_cast<uint64_t>(proc_handle));
  value->AddInput(reinterpret_cast<uint64_t>(vmar_handle));
  return value;
}

#define PROCESS_CREATE_DISPLAY_TEST_CONTENT(result, expected)                                \
  std::string name("my_process");                                                            \
  zx_handle_t proc_handle = kHandleOut;                                                      \
  zx_handle_t vmar_handle = kHandleOut2;                                                     \
  PerformDisplayTest("$plt(zx_process_create)",                                              \
                     ZxProcessCreate(result, #result, kHandle, name.c_str(), name.size(), 0, \
                                     &proc_handle, &vmar_handle),                            \
                     expected);

#define PROCESS_CREATE_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {              \
    PROCESS_CREATE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                        \
  TEST_F(InterceptionWorkflowTestArm, name) {              \
    PROCESS_CREATE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

PROCESS_CREATE_DISPLAY_TEST(ZxProcessCreate, ZX_OK,
                            "\n"
                            "\x1B[32m0.000000\x1B[0m "
                            "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                            "zx_process_create("
                            "job: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
                            "name: \x1B[32mstring\x1B[0m = \x1B[31m\"my_process\"\x1B[0m, "
                            "options: \x1B[32muint32\x1B[0m = \x1B[34m0\x1B[0m)\n"
                            "\x1B[32m0.000000\x1B[0m "
                            "  -> \x1B[32mZX_OK\x1B[0m ("
                            "proc_handle: \x1B[32mhandle\x1B[0m = \x1B[31mbde90caf\x1B[0m, "
                            "vmar_handle: \x1B[32mhandle\x1B[0m = \x1B[31mbde90222\x1B[0m)\n");

// zx_process_start tests.

std::unique_ptr<SystemCallTest> ZxProcessStart(int64_t result, std::string_view result_name,
                                               zx_handle_t handle, zx_handle_t thread,
                                               zx_vaddr_t entry, zx_vaddr_t stack, zx_handle_t arg1,
                                               uintptr_t arg2) {
  auto value = std::make_unique<SystemCallTest>("zx_process_start", result, result_name);
  value->AddInput(handle);
  value->AddInput(thread);
  value->AddInput(entry);
  value->AddInput(stack);
  value->AddInput(arg1);
  value->AddInput(arg2);
  return value;
}

#define PROCESS_START_DISPLAY_TEST_CONTENT(result, expected) \
  zx_vaddr_t entry = 0x123456;                               \
  zx_vaddr_t stack = 0x100001234;                            \
  uintptr_t arg2 = 0x789abcdef;                              \
  PerformDisplayTest(                                        \
      "$plt(zx_process_start)",                              \
      ZxProcessStart(result, #result, kHandle, kHandle2, entry, stack, kHandle3, arg2), expected);

#define PROCESS_START_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {             \
    PROCESS_START_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                       \
  TEST_F(InterceptionWorkflowTestArm, name) { PROCESS_START_DISPLAY_TEST_CONTENT(errno, expected); }

PROCESS_START_DISPLAY_TEST(ZxProcessStart, ZX_OK,
                           "\n"
                           "\x1B[32m0.000000\x1B[0m "
                           "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                           "zx_process_start("
                           "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
                           "thread: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1222\x1B[0m, "
                           "entry: \x1B[32mzx.vaddr\x1B[0m = \x1B[34m0000000000123456\x1B[0m, "
                           "stack: \x1B[32mzx.vaddr\x1B[0m = \x1B[34m0000000100001234\x1B[0m, "
                           "arg1: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1333\x1B[0m, "
                           "arg2: \x1B[32muintptr\x1B[0m = \x1B[34m0000000789abcdef\x1B[0m)\n"
                           "\x1B[32m0.000000\x1B[0m "
                           "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_process_read_memory tests.

std::unique_ptr<SystemCallTest> ZxProcessReadMemory(int64_t result, std::string_view result_name,
                                                    zx_handle_t handle, zx_vaddr_t vaddr,
                                                    void* buffer, size_t buffer_size,
                                                    size_t* actual) {
  auto value = std::make_unique<SystemCallTest>("zx_process_read_memory", result, result_name);
  value->AddInput(handle);
  value->AddInput(vaddr);
  value->AddInput(reinterpret_cast<uint64_t>(buffer));
  value->AddInput(buffer_size);
  value->AddInput(reinterpret_cast<uint64_t>(actual));
  return value;
}

#define PROCESS_READ_MEMORY_DISPLAY_TEST_CONTENT(result, expected)                                 \
  zx_vaddr_t vaddr = 0x123456789;                                                                  \
  std::vector<uint8_t> buffer;                                                                     \
  for (int i = 0; i < 10; ++i) {                                                                   \
    buffer.push_back(i);                                                                           \
  }                                                                                                \
  size_t actual = buffer.size();                                                                   \
  PerformDisplayTest(                                                                              \
      "$plt(zx_process_read_memory)",                                                              \
      ZxProcessReadMemory(result, #result, kHandle, vaddr, buffer.data(), buffer.size(), &actual), \
      expected);

#define PROCESS_READ_MEMORY_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                   \
    PROCESS_READ_MEMORY_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                             \
  TEST_F(InterceptionWorkflowTestArm, name) {                   \
    PROCESS_READ_MEMORY_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

PROCESS_READ_MEMORY_DISPLAY_TEST(
    ZxProcessReadMemory, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_process_read_memory("
    "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "vaddr: \x1B[32mzx.vaddr\x1B[0m = \x1B[34m0000000123456789\x1B[0m, "
    "buffer_size: \x1B[32msize\x1B[0m = \x1B[34m10\x1B[0m)\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m\n"
    "    buffer: \x1B[32mvector<uint8>\x1B[0m = [ "
    "\x1B[34m00\x1B[0m, \x1B[34m01\x1B[0m, \x1B[34m02\x1B[0m, "
    "\x1B[34m03\x1B[0m, \x1B[34m04\x1B[0m, "
    "\x1B[34m05\x1B[0m, \x1B[34m06\x1B[0m, \x1B[34m07\x1B[0m, "
    "\x1B[34m08\x1B[0m, \x1B[34m09\x1B[0m ]\n");

// zx_process_write_memory tests.

std::unique_ptr<SystemCallTest> ZxProcessWriteMemory(int64_t result, std::string_view result_name,
                                                     zx_handle_t handle, zx_vaddr_t vaddr,
                                                     const void* buffer, size_t buffer_size,
                                                     size_t* actual) {
  auto value = std::make_unique<SystemCallTest>("zx_process_write_memory", result, result_name);
  value->AddInput(handle);
  value->AddInput(vaddr);
  value->AddInput(reinterpret_cast<uint64_t>(buffer));
  value->AddInput(buffer_size);
  value->AddInput(reinterpret_cast<uint64_t>(actual));
  return value;
}

#define PROCESS_WRITE_MEMORY_DISPLAY_TEST_CONTENT(result, expected)                       \
  zx_vaddr_t vaddr = 0x123456789;                                                         \
  std::vector<uint8_t> buffer;                                                            \
  for (int i = 0; i < 10; ++i) {                                                          \
    buffer.push_back(i);                                                                  \
  }                                                                                       \
  size_t actual = buffer.size();                                                          \
  PerformDisplayTest("$plt(zx_process_write_memory)",                                     \
                     ZxProcessWriteMemory(result, #result, kHandle, vaddr, buffer.data(), \
                                          buffer.size(), &actual),                        \
                     expected);

#define PROCESS_WRITE_MEMORY_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                    \
    PROCESS_WRITE_MEMORY_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                              \
  TEST_F(InterceptionWorkflowTestArm, name) {                    \
    PROCESS_WRITE_MEMORY_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

PROCESS_WRITE_MEMORY_DISPLAY_TEST(
    ZxProcessWriteMemory, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_process_write_memory("
    "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "vaddr: \x1B[32mzx.vaddr\x1B[0m = \x1B[34m0000000123456789\x1B[0m)\n"
    "  buffer: \x1B[32mvector<uint8>\x1B[0m = [ "
    "\x1B[34m00\x1B[0m, \x1B[34m01\x1B[0m, \x1B[34m02\x1B[0m, \x1B[34m03\x1B[0m, "
    "\x1B[34m04\x1B[0m, "
    "\x1B[34m05\x1B[0m, \x1B[34m06\x1B[0m, \x1B[34m07\x1B[0m, \x1B[34m08\x1B[0m, \x1B[34m09\x1B[0m "
    "]\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m (actual: \x1B[32msize\x1B[0m = \x1B[34m10\x1B[0m)\n");

}  // namespace fidlcat
