// 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"
    "\x1B[32m0.000000\x1B[0m "
    "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[32m0.000000\x1B[0m "
    "  -> \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"
    "\x1B[32m0.000000\x1B[0m "
    "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[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, \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"
    "\x1B[32m0.000000\x1B[0m "
    "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[32m0.000000\x1B[0m "
    "  -> \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"
    "\x1B[32m0.000000\x1B[0m "
    "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[32m0.000000\x1B[0m "
    "  -> \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"
                          "\x1B[32m0.000000\x1B[0m "
                          "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[32m0.000000\x1B[0m "
                          "  -> \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"
                          "\x1B[32m0.000000\x1B[0m "
                          "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[32m0.000000\x1B[0m "
                          "  -> \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"
    "\x1B[32m0.000000\x1B[0m "
    "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[32m0.000000\x1B[0m "
    "  -> \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"
    "\x1B[32m0.000000\x1B[0m "
    "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[32m0.000000\x1B[0m "
    "  -> \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"
    "\x1B[32m0.000000\x1B[0m "
    "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[32m0.000000\x1B[0m "
    "  -> \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"
    "\x1B[32m0.000000\x1B[0m "
    "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[32m0.000000\x1B[0m "
    "  -> \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"
    "\x1B[32m0.000000\x1B[0m "
    "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[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m (out: \x1B[32mhandle\x1B[0m = \x1B[31mbde90caf\x1B[0m)\n");

}  // namespace fidlcat
