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

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

#define PAGER_CREATE_DISPLAY_TEST_CONTENT(result, expected) \
  zx_handle_t out = kHandleOut;                             \
  PerformDisplayTest("$plt(zx_pager_create)", ZxPagerCreate(result, #result, 0, &out), expected);

#define PAGER_CREATE_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {            \
    PAGER_CREATE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                      \
  TEST_F(InterceptionWorkflowTestArm, name) { PAGER_CREATE_DISPLAY_TEST_CONTENT(errno, expected); }

PAGER_CREATE_DISPLAY_TEST(
    ZxPagerCreate, ZX_OK,
    "\n"
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_pager_create(options:\x1B[32muint32\x1B[0m: \x1B[34m0\x1B[0m)\n"
    "  -> \x1B[32mZX_OK\x1B[0m (out:\x1B[32mhandle\x1B[0m: \x1B[31mbde90caf\x1B[0m)\n");

// zx_pager_create_vmo tests.

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

#define PAGER_CREATE_VMO_DISPLAY_TEST_CONTENT(result, expected)                              \
  zx_handle_t out = kHandleOut;                                                              \
  PerformDisplayTest("$plt(zx_pager_create_vmo)",                                            \
                     ZxPagerCreateVmo(result, #result, kHandle, 0, kPort, kKey, 1024, &out), \
                     expected);

#define PAGER_CREATE_VMO_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                \
    PAGER_CREATE_VMO_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                          \
  TEST_F(InterceptionWorkflowTestArm, name) {                \
    PAGER_CREATE_VMO_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

PAGER_CREATE_VMO_DISPLAY_TEST(
    ZxPagerCreateVmo, ZX_OK,
    "\n"
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_pager_create_vmo("
    "pager:\x1B[32mhandle\x1B[0m: \x1B[31mcefa1db0\x1B[0m, "
    "options:\x1B[32muint32\x1B[0m: \x1B[34m0\x1B[0m, "
    "port:\x1B[32mhandle\x1B[0m: \x1B[31mdf0b2ec1\x1B[0m, "
    "key:\x1B[32muint64\x1B[0m: \x1B[34m1234\x1B[0m, "
    "size:\x1B[32muint64\x1B[0m: \x1B[34m1024\x1B[0m)\n"
    "  -> \x1B[32mZX_OK\x1B[0m (out:\x1B[32mhandle\x1B[0m: \x1B[31mbde90caf\x1B[0m)\n");

// zx_pager_detach_vmo tests.

std::unique_ptr<SystemCallTest> ZxPagerDetachVmo(int64_t result, std::string_view result_name,
                                                 zx_handle_t pager, zx_handle_t vmo) {
  auto value = std::make_unique<SystemCallTest>("zx_pager_detach_vmo", result, result_name);
  value->AddInput(pager);
  value->AddInput(vmo);
  return value;
}

#define PAGER_DETACH_VMO_DISPLAY_TEST_CONTENT(result, expected) \
  PerformDisplayTest("$plt(zx_pager_detach_vmo)",               \
                     ZxPagerDetachVmo(result, #result, kHandle, kHandle2), expected);

#define PAGER_DETACH_VMO_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                \
    PAGER_DETACH_VMO_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                          \
  TEST_F(InterceptionWorkflowTestArm, name) {                \
    PAGER_DETACH_VMO_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

PAGER_DETACH_VMO_DISPLAY_TEST(ZxPagerDetachVmo, ZX_OK,
                              "\n"
                              "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                              "zx_pager_detach_vmo("
                              "pager:\x1B[32mhandle\x1B[0m: \x1B[31mcefa1db0\x1B[0m, "
                              "vmo:\x1B[32mhandle\x1B[0m: \x1B[31mcefa1222\x1B[0m)\n"
                              "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_pager_supply_pages tests.

std::unique_ptr<SystemCallTest> ZxPagerSupplyPages(int64_t result, std::string_view result_name,
                                                   zx_handle_t pager, zx_handle_t pager_vmo,
                                                   uint64_t offset, uint64_t length,
                                                   zx_handle_t aux_vmo, uint64_t aux_offset) {
  auto value = std::make_unique<SystemCallTest>("zx_pager_supply_pages", result, result_name);
  value->AddInput(pager);
  value->AddInput(pager_vmo);
  value->AddInput(offset);
  value->AddInput(length);
  value->AddInput(aux_vmo);
  value->AddInput(aux_offset);
  return value;
}

#define PAGER_SUPPLY_PAGES_DISPLAY_TEST_CONTENT(result, expected)                         \
  PerformDisplayTest(                                                                     \
      "$plt(zx_pager_supply_pages)",                                                      \
      ZxPagerSupplyPages(result, #result, kHandle, kHandle2, 1000, 1024, kHandle3, 2000), \
      expected);

#define PAGER_SUPPLY_PAGES_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                  \
    PAGER_SUPPLY_PAGES_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                            \
  TEST_F(InterceptionWorkflowTestArm, name) {                  \
    PAGER_SUPPLY_PAGES_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

PAGER_SUPPLY_PAGES_DISPLAY_TEST(ZxPagerSupplyPages, ZX_OK,
                                "\n"
                                "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                                "zx_pager_supply_pages("
                                "pager:\x1B[32mhandle\x1B[0m: \x1B[31mcefa1db0\x1B[0m, "
                                "pager_vmo:\x1B[32mhandle\x1B[0m: \x1B[31mcefa1222\x1B[0m, "
                                "offset:\x1B[32muint64\x1B[0m: \x1B[34m1000\x1B[0m, "
                                "length:\x1B[32muint64\x1B[0m: \x1B[34m1024\x1B[0m, "
                                "aux_vmo:\x1B[32mhandle\x1B[0m: \x1B[31mcefa1333\x1B[0m, "
                                "aux_offset:\x1B[32muint64\x1B[0m: \x1B[34m2000\x1B[0m)\n"
                                "  -> \x1B[32mZX_OK\x1B[0m\n");

}  // namespace fidlcat
