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

std::unique_ptr<SystemCallTest> ZxVmoCreate(int64_t result, std::string_view result_name,
                                            uint64_t size, uint32_t options, zx_handle_t* out) {
  auto value = std::make_unique<SystemCallTest>("zx_vmo_create", result, result_name);
  value->AddInput(size);
  value->AddInput(options);
  value->AddInput(reinterpret_cast<uint64_t>(out));
  return value;
}

#define VMO_CREATE_DISPLAY_TEST_CONTENT(result, expected) \
  zx_handle_t out = kHandleOut;                           \
  PerformDisplayTest("$plt(zx_vmo_create)",               \
                     ZxVmoCreate(result, #result, 1024, ZX_VMO_RESIZABLE, &out), expected);

#define VMO_CREATE_DISPLAY_TEST(name, errno, expected)                                            \
  TEST_F(InterceptionWorkflowTestX64, name) { VMO_CREATE_DISPLAY_TEST_CONTENT(errno, expected); } \
  TEST_F(InterceptionWorkflowTestArm, name) { VMO_CREATE_DISPLAY_TEST_CONTENT(errno, expected); }

VMO_CREATE_DISPLAY_TEST(
    ZxVmoCreate, ZX_OK,
    "\n"
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_vmo_create("
    "size: \x1B[32muint64\x1B[0m = \x1B[34m1024\x1B[0m, "
    "options: \x1B[32mzx_vmo_creation_option_t\x1B[0m = \x1B[34mZX_VMO_RESIZABLE\x1B[0m)\n"
    "  -> \x1B[32mZX_OK\x1B[0m (out: \x1B[32mhandle\x1B[0m = \x1B[31mbde90caf\x1B[0m)\n");

// zx_vmo_read tests.

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

#define VMO_READ_DISPLAY_TEST_CONTENT(result, expected)                                     \
  std::vector<uint8_t> buffer;                                                              \
  for (int i = 0; i < 20; ++i) {                                                            \
    buffer.emplace_back(i);                                                                 \
  }                                                                                         \
  PerformDisplayTest("$plt(zx_vmo_read)",                                                   \
                     ZxVmoRead(result, #result, kHandle, buffer.data(), 10, buffer.size()), \
                     expected);

#define VMO_READ_DISPLAY_TEST(name, errno, expected)                                            \
  TEST_F(InterceptionWorkflowTestX64, name) { VMO_READ_DISPLAY_TEST_CONTENT(errno, expected); } \
  TEST_F(InterceptionWorkflowTestArm, name) { VMO_READ_DISPLAY_TEST_CONTENT(errno, expected); }

VMO_READ_DISPLAY_TEST(
    ZxVmoRead, ZX_OK,
    "\n"
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_vmo_read("
    "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "offset: \x1B[32muint64\x1B[0m = \x1B[34m10\x1B[0m)\n"
    "  -> \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, \x1B[34m0a\x1B[0m, \x1B[34m0b\x1B[0m, "
    "\x1B[34m0c\x1B[0m, \x1B[34m0d\x1B[0m, \x1B[34m0e\x1B[0m, \x1B[34m0f\x1B[0m, "
    "\x1B[34m10\x1B[0m, \x1B[34m11\x1B[0m, \x1B[34m12\x1B[0m, \x1B[34m13\x1B[0m ]\n");

// zx_vmo_write tests.

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

#define VMO_WRITE_DISPLAY_TEST_CONTENT(result, expected)                                     \
  std::vector<uint8_t> buffer;                                                               \
  for (int i = 0; i < 20; ++i) {                                                             \
    buffer.emplace_back(i);                                                                  \
  }                                                                                          \
  PerformDisplayTest("$plt(zx_vmo_write)",                                                   \
                     ZxVmoWrite(result, #result, kHandle, buffer.data(), 10, buffer.size()), \
                     expected);

#define VMO_WRITE_DISPLAY_TEST(name, errno, expected)                                            \
  TEST_F(InterceptionWorkflowTestX64, name) { VMO_WRITE_DISPLAY_TEST_CONTENT(errno, expected); } \
  TEST_F(InterceptionWorkflowTestArm, name) { VMO_WRITE_DISPLAY_TEST_CONTENT(errno, expected); }

VMO_WRITE_DISPLAY_TEST(
    ZxVmoWrite, ZX_OK,
    "\n"
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_vmo_write("
    "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "offset: \x1B[32muint64\x1B[0m = \x1B[34m10\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, \x1B[34m0a\x1B[0m, \x1B[34m0b\x1B[0m, "
    "\x1B[34m0c\x1B[0m, \x1B[34m0d\x1B[0m, \x1B[34m0e\x1B[0m, \x1B[34m0f\x1B[0m, "
    "\x1B[34m10\x1B[0m, \x1B[34m11\x1B[0m, \x1B[34m12\x1B[0m, \x1B[34m13\x1B[0m ]\n"
    "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_vmo_get_size tests.

std::unique_ptr<SystemCallTest> ZxVmoGetSize(int64_t result, std::string_view result_name,
                                             zx_handle_t handle, uint64_t* size) {
  auto value = std::make_unique<SystemCallTest>("zx_vmo_get_size", result, result_name);
  value->AddInput(handle);
  value->AddInput(reinterpret_cast<uint64_t>(size));
  return value;
}

#define VMO_GET_SIZE_DISPLAY_TEST_CONTENT(result, expected)                                  \
  uint64_t size = 1024;                                                                      \
  PerformDisplayTest("$plt(zx_vmo_get_size)", ZxVmoGetSize(result, #result, kHandle, &size), \
                     expected);

#define VMO_GET_SIZE_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {            \
    VMO_GET_SIZE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                      \
  TEST_F(InterceptionWorkflowTestArm, name) { VMO_GET_SIZE_DISPLAY_TEST_CONTENT(errno, expected); }

VMO_GET_SIZE_DISPLAY_TEST(
    ZxVmoGetSize, ZX_OK,
    "\n"
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_vmo_get_size(handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m)\n"
    "  -> \x1B[32mZX_OK\x1B[0m (size: \x1B[32muint64\x1B[0m = \x1B[34m1024\x1B[0m)\n");

// zx_vmo_set_size tests.

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

#define VMO_SET_SIZE_DISPLAY_TEST_CONTENT(result, expected)                                 \
  PerformDisplayTest("$plt(zx_vmo_set_size)", ZxVmoSetSize(result, #result, kHandle, 1024), \
                     expected);

#define VMO_SET_SIZE_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {            \
    VMO_SET_SIZE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                      \
  TEST_F(InterceptionWorkflowTestArm, name) { VMO_SET_SIZE_DISPLAY_TEST_CONTENT(errno, expected); }

VMO_SET_SIZE_DISPLAY_TEST(ZxVmoSetSize, ZX_OK,
                          "\n"
                          "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                          "zx_vmo_set_size("
                          "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
                          "size: \x1B[32muint64\x1B[0m = \x1B[34m1024\x1B[0m)\n"
                          "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_vmo_op_range tests.

std::unique_ptr<SystemCallTest> ZxVmoOpRange(int64_t result, std::string_view result_name,
                                             zx_handle_t handle, uint32_t op, uint64_t offset,
                                             uint64_t size, void* buffer, size_t buffer_size) {
  auto value = std::make_unique<SystemCallTest>("zx_vmo_op_range", result, result_name);
  value->AddInput(handle);
  value->AddInput(op);
  value->AddInput(offset);
  value->AddInput(size);
  value->AddInput(reinterpret_cast<uint64_t>(buffer));
  value->AddInput(buffer_size);
  return value;
}

#define VMO_OP_RANGE_DISPLAY_TEST_CONTENT(result, expected) \
  PerformDisplayTest(                                       \
      "$plt(zx_vmo_op_range)",                              \
      ZxVmoOpRange(result, #result, kHandle, ZX_VMO_OP_CACHE_SYNC, 10, 20, nullptr, 0), expected);

#define VMO_OP_RANGE_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {            \
    VMO_OP_RANGE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                      \
  TEST_F(InterceptionWorkflowTestArm, name) { VMO_OP_RANGE_DISPLAY_TEST_CONTENT(errno, expected); }

VMO_OP_RANGE_DISPLAY_TEST(ZxVmoOpRange, ZX_OK,
                          "\n"
                          "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                          "zx_vmo_op_range("
                          "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
                          "op: \x1B[32mzx_vmo_op_t\x1B[0m = \x1B[34mZX_VMO_OP_CACHE_SYNC\x1B[0m, "
                          "offset: \x1B[32muint64\x1B[0m = \x1B[34m10\x1B[0m, "
                          "size: \x1B[32muint64\x1B[0m = \x1B[34m20\x1B[0m)\n"
                          "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_vmo_create_child tests.

std::unique_ptr<SystemCallTest> ZxVmoCreateChild(int64_t result, std::string_view result_name,
                                                 zx_handle_t handle, uint32_t options,
                                                 uint64_t offset, uint64_t size, zx_handle_t* out) {
  auto value = std::make_unique<SystemCallTest>("zx_vmo_create_child", result, result_name);
  value->AddInput(handle);
  value->AddInput(options);
  value->AddInput(offset);
  value->AddInput(size);
  value->AddInput(reinterpret_cast<uint64_t>(out));
  return value;
}

#define VMO_CREATE_CHILD_DISPLAY_TEST_CONTENT(result, expected) \
  zx_handle_t out = kHandleOut;                                 \
  PerformDisplayTest(                                           \
      "$plt(zx_vmo_create_child)",                              \
      ZxVmoCreateChild(result, #result, kHandle, ZX_VMO_CHILD_SNAPSHOT, 10, 20, &out), expected);

#define VMO_CREATE_CHILD_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                \
    VMO_CREATE_CHILD_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                          \
  TEST_F(InterceptionWorkflowTestArm, name) {                \
    VMO_CREATE_CHILD_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

VMO_CREATE_CHILD_DISPLAY_TEST(
    ZxVmoCreateChild, ZX_OK,
    "\n"
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_vmo_create_child("
    "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "options: \x1B[32mzx_vmo_option_t\x1B[0m = \x1B[34mZX_VMO_CHILD_SNAPSHOT\x1B[0m, "
    "offset: \x1B[32muint64\x1B[0m = \x1B[34m10\x1B[0m, "
    "size: \x1B[32muint64\x1B[0m = \x1B[34m20\x1B[0m)\n"
    "  -> \x1B[32mZX_OK\x1B[0m (out: \x1B[32mhandle\x1B[0m = \x1B[31mbde90caf\x1B[0m)\n");

// zx_vmo_set_cache_policy tests.

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

#define VMO_SET_CACHE_POLICY_DISPLAY_TEST_CONTENT(result, expected)                         \
  PerformDisplayTest("$plt(zx_vmo_set_cache_policy)",                                       \
                     ZxVmoSetCachePolicy(result, #result, kHandle, ZX_CACHE_POLICY_CACHED), \
                     expected);

#define VMO_SET_CACHE_POLICY_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                    \
    VMO_SET_CACHE_POLICY_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                              \
  TEST_F(InterceptionWorkflowTestArm, name) {                    \
    VMO_SET_CACHE_POLICY_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

VMO_SET_CACHE_POLICY_DISPLAY_TEST(
    ZxVmoSetCachePolicy, ZX_OK,
    "\n"
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_vmo_set_cache_policy("
    "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "cache_policy: \x1B[32mzx.cache_policy\x1B[0m = \x1B[34mZX_CACHE_POLICY_CACHED\x1B[0m)\n"
    "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_vmo_replace_as_executable tests.

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

#define VMO_REPLACE_AS_EXECUTABLE_DISPLAY_TEST_CONTENT(result, expected)                 \
  zx_handle_t out = kHandleOut;                                                          \
  PerformDisplayTest("$plt(zx_vmo_replace_as_executable)",                               \
                     ZxVmoReplaceAsExecutable(result, #result, kHandle, kHandle2, &out), \
                     expected);

#define VMO_REPLACE_AS_EXECUTABLE_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                         \
    VMO_REPLACE_AS_EXECUTABLE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                                   \
  TEST_F(InterceptionWorkflowTestArm, name) {                         \
    VMO_REPLACE_AS_EXECUTABLE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

VMO_REPLACE_AS_EXECUTABLE_DISPLAY_TEST(
    ZxVmoReplaceAsExecutable, ZX_OK,
    "\n"
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_vmo_replace_as_executable("
    "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "vmex: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1222\x1B[0m)\n"
    "  -> \x1B[32mZX_OK\x1B[0m (out: \x1B[32mhandle\x1B[0m = \x1B[31mbde90caf\x1B[0m)\n");

// zx_vmo_create_contiguous tests.

std::unique_ptr<SystemCallTest> ZxVmoCreateContiguous(int64_t result, std::string_view result_name,
                                                      zx_handle_t bti, size_t size,
                                                      uint32_t alignment_log2, zx_handle_t* out) {
  auto value = std::make_unique<SystemCallTest>("zx_vmo_create_contiguous", result, result_name);
  value->AddInput(bti);
  value->AddInput(size);
  value->AddInput(alignment_log2);
  value->AddInput(reinterpret_cast<uint64_t>(out));
  return value;
}

#define VMO_CREATE_CONTIGUOUS_DISPLAY_TEST_CONTENT(result, expected) \
  zx_handle_t out = kHandleOut;                                      \
  PerformDisplayTest("$plt(zx_vmo_create_contiguous)",               \
                     ZxVmoCreateContiguous(result, #result, kHandle, 20, 2, &out), expected);

#define VMO_CREATE_CONTIGUOUS_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                     \
    VMO_CREATE_CONTIGUOUS_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                               \
  TEST_F(InterceptionWorkflowTestArm, name) {                     \
    VMO_CREATE_CONTIGUOUS_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

VMO_CREATE_CONTIGUOUS_DISPLAY_TEST(
    ZxVmoCreateContiguous, ZX_OK,
    "\n"
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_vmo_create_contiguous("
    "bti: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "size: \x1B[32msize\x1B[0m = \x1B[34m20\x1B[0m, "
    "alignment_log2: \x1B[32muint32\x1B[0m = \x1B[34m2\x1B[0m)\n"
    "  -> \x1B[32mZX_OK\x1B[0m (out: \x1B[32mhandle\x1B[0m = \x1B[31mbde90caf\x1B[0m)\n");

// zx_vmo_create_physical tests.

std::unique_ptr<SystemCallTest> ZxVmoCreatePhysical(int64_t result, std::string_view result_name,
                                                    zx_handle_t resource, zx_paddr_t paddr,
                                                    size_t size, zx_handle_t* out) {
  auto value = std::make_unique<SystemCallTest>("zx_vmo_create_physical", result, result_name);
  value->AddInput(resource);
  value->AddInput(paddr);
  value->AddInput(size);
  value->AddInput(reinterpret_cast<uint64_t>(out));
  return value;
}

#define VMO_CREATE_PHYSICAL_DISPLAY_TEST_CONTENT(result, expected) \
  zx_handle_t out = kHandleOut;                                    \
  PerformDisplayTest("$plt(zx_vmo_create_physical)",               \
                     ZxVmoCreatePhysical(result, #result, kHandle, 0x12345, 20, &out), expected);

#define VMO_CREATE_PHYSICAL_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                   \
    VMO_CREATE_PHYSICAL_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                             \
  TEST_F(InterceptionWorkflowTestArm, name) {                   \
    VMO_CREATE_PHYSICAL_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

VMO_CREATE_PHYSICAL_DISPLAY_TEST(
    ZxVmoCreatePhysical, ZX_OK,
    "\n"
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_vmo_create_physical("
    "resource: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "paddr: \x1B[32mzx.paddr\x1B[0m = \x1B[34m0000000000012345\x1B[0m, "
    "size: \x1B[32msize\x1B[0m = \x1B[34m20\x1B[0m)\n"
    "  -> \x1B[32mZX_OK\x1B[0m (out: \x1B[32mhandle\x1B[0m = \x1B[31mbde90caf\x1B[0m)\n");

}  // namespace fidlcat
