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

std::unique_ptr<SystemCallTest> ZxFutexWait(int64_t result, std::string_view result_name,
                                            const zx_futex_t* value_ptr, zx_futex_t current_value,
                                            zx_handle_t new_futex_owner, zx_time_t deadline) {
  auto value = std::make_unique<SystemCallTest>("zx_futex_wait", result, result_name);
  value->AddInput(reinterpret_cast<uint64_t>(value_ptr));
  value->AddInput(current_value);
  value->AddInput(new_futex_owner);
  value->AddInput(deadline);
  return value;
}

#define FUTEX_WAIT_DISPLAY_TEST_CONTENT(result, expected)                                    \
  zx_futex_t value = kFutex;                                                                 \
  PerformDisplayTest("$plt(zx_futex_wait)",                                                  \
                     ZxFutexWait(result, #result, &value, value, kHandle, ZX_TIME_INFINITE), \
                     expected);

#define FUTEX_WAIT_DISPLAY_TEST(name, errno, expected)                                            \
  TEST_F(InterceptionWorkflowTestX64, name) { FUTEX_WAIT_DISPLAY_TEST_CONTENT(errno, expected); } \
  TEST_F(InterceptionWorkflowTestArm, name) { FUTEX_WAIT_DISPLAY_TEST_CONTENT(errno, expected); }

FUTEX_WAIT_DISPLAY_TEST(ZxFutexWait, ZX_OK,
                        "\n"
                        "\x1B[32m0.000000\x1B[0m "
                        "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                        "zx_futex_wait("
                        "value_ptr: \x1B[32mzx.futex_t\x1B[0m = \x1B[31m56789\x1B[0m, "
                        "current_value: \x1B[32mzx.futex_t\x1B[0m = \x1B[31m56789\x1B[0m, "
                        "new_futex_owner: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
                        "deadline: \x1B[32mzx.time\x1B[0m = \x1B[34mZX_TIME_INFINITE\x1B[0m)\n"
                        "\x1B[32m0.000000\x1B[0m "
                        "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_futex_wake tests.

std::unique_ptr<SystemCallTest> ZxFutexWake(int64_t result, std::string_view result_name,
                                            const zx_futex_t* value_ptr, uint32_t wake_count) {
  auto value = std::make_unique<SystemCallTest>("zx_futex_wake", result, result_name);
  value->AddInput(reinterpret_cast<uint64_t>(value_ptr));
  value->AddInput(wake_count);
  return value;
}

#define FUTEX_WAKE_DISPLAY_TEST_CONTENT(result, expected) \
  zx_futex_t value = kFutex;                              \
  PerformDisplayTest("$plt(zx_futex_wake)", ZxFutexWake(result, #result, &value, 3), expected);

#define FUTEX_WAKE_DISPLAY_TEST(name, errno, expected)                                            \
  TEST_F(InterceptionWorkflowTestX64, name) { FUTEX_WAKE_DISPLAY_TEST_CONTENT(errno, expected); } \
  TEST_F(InterceptionWorkflowTestArm, name) { FUTEX_WAKE_DISPLAY_TEST_CONTENT(errno, expected); }

FUTEX_WAKE_DISPLAY_TEST(ZxFutexWake, ZX_OK,
                        "\n"
                        "\x1B[32m0.000000\x1B[0m "
                        "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                        "zx_futex_wake("
                        "value_ptr: \x1B[32mzx.futex_t\x1B[0m = \x1B[31m56789\x1B[0m, "
                        "wake_count: \x1B[32muint32\x1B[0m = \x1B[34m3\x1B[0m)\n"
                        "\x1B[32m0.000000\x1B[0m "
                        "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_futex_requeue tests.

std::unique_ptr<SystemCallTest> ZxFutexRequeue(int64_t result, std::string_view result_name,
                                               const zx_futex_t* value_ptr, uint32_t wake_count,
                                               zx_futex_t current_value,
                                               const zx_futex_t* requeue_ptr,
                                               uint32_t requeue_count,
                                               zx_handle_t new_requeue_owner) {
  auto value = std::make_unique<SystemCallTest>("zx_futex_requeue", result, result_name);
  value->AddInput(reinterpret_cast<uint64_t>(value_ptr));
  value->AddInput(wake_count);
  value->AddInput(current_value);
  value->AddInput(reinterpret_cast<uint64_t>(requeue_ptr));
  value->AddInput(requeue_count);
  value->AddInput(new_requeue_owner);
  return value;
}

#define FUTEX_REQUEUE_DISPLAY_TEST_CONTENT(result, expected)                                  \
  zx_futex_t value = kFutex;                                                                  \
  zx_futex_t requeue = kFutex2;                                                               \
  PerformDisplayTest("$plt(zx_futex_requeue)",                                                \
                     ZxFutexRequeue(result, #result, &value, 2, value, &requeue, 3, kHandle), \
                     expected);

#define FUTEX_REQUEUE_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {             \
    FUTEX_REQUEUE_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                       \
  TEST_F(InterceptionWorkflowTestArm, name) { FUTEX_REQUEUE_DISPLAY_TEST_CONTENT(errno, expected); }

FUTEX_REQUEUE_DISPLAY_TEST(ZxFutexRequeue, ZX_OK,
                           "\n"
                           "\x1B[32m0.000000\x1B[0m "
                           "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
                           "zx_futex_requeue("
                           "value_ptr: \x1B[32mzx.futex_t\x1B[0m = \x1B[31m56789\x1B[0m, "
                           "wake_count: \x1B[32muint32\x1B[0m = \x1B[34m2\x1B[0m, "
                           "current_value: \x1B[32mzx.futex_t\x1B[0m = \x1B[31m56789\x1B[0m, "
                           "requeue_ptr: \x1B[32mzx.futex_t\x1B[0m = \x1B[31m98765\x1B[0m, "
                           "requeue_count: \x1B[32muint32\x1B[0m = \x1B[34m3\x1B[0m, "
                           "new_requeue_owner: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m)\n"
                           "\x1B[32m0.000000\x1B[0m "
                           "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_futex_wake_single_owner tests.

std::unique_ptr<SystemCallTest> ZxFutexWakeSingleOwner(int64_t result, std::string_view result_name,
                                                       const zx_futex_t* value_ptr) {
  auto value = std::make_unique<SystemCallTest>("zx_futex_wake_single_owner", result, result_name);
  value->AddInput(reinterpret_cast<uint64_t>(value_ptr));
  return value;
}

#define FUTEX_WAKE_SINGLE_OWNER_DISPLAY_TEST_CONTENT(result, expected) \
  zx_futex_t value = kFutex;                                           \
  PerformDisplayTest("$plt(zx_futex_wake_single_owner)",               \
                     ZxFutexWakeSingleOwner(result, #result, &value), expected);

#define FUTEX_WAKE_SINGLE_OWNER_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                       \
    FUTEX_WAKE_SINGLE_OWNER_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                                 \
  TEST_F(InterceptionWorkflowTestArm, name) {                       \
    FUTEX_WAKE_SINGLE_OWNER_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

FUTEX_WAKE_SINGLE_OWNER_DISPLAY_TEST(
    ZxFutexWakeSingleOwner, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_futex_wake_single_owner(value_ptr: \x1B[32mzx.futex_t\x1B[0m = \x1B[31m56789\x1B[0m)\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_futex_requeue_single_owner tests.

std::unique_ptr<SystemCallTest> ZxFutexRequeueSingleOwner(
    int64_t result, std::string_view result_name, const zx_futex_t* value_ptr,
    zx_futex_t current_value, const zx_futex_t* requeue_ptr, uint32_t requeue_count,
    zx_handle_t new_requeue_owner) {
  auto value =
      std::make_unique<SystemCallTest>("zx_futex_requeue_single_owner", result, result_name);
  value->AddInput(reinterpret_cast<uint64_t>(value_ptr));
  value->AddInput(current_value);
  value->AddInput(reinterpret_cast<uint64_t>(requeue_ptr));
  value->AddInput(requeue_count);
  value->AddInput(new_requeue_owner);
  return value;
}

#define FUTEX_REQUEUE_SINGLE_OWNER_DISPLAY_TEST_CONTENT(result, expected) \
  zx_futex_t value = kFutex;                                              \
  zx_futex_t requeue = kFutex2;                                           \
  PerformDisplayTest(                                                     \
      "$plt(zx_futex_requeue_single_owner)",                              \
      ZxFutexRequeueSingleOwner(result, #result, &value, value, &requeue, 3, kHandle), expected);

#define FUTEX_REQUEUE_SINGLE_OWNER_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                          \
    FUTEX_REQUEUE_SINGLE_OWNER_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                                    \
  TEST_F(InterceptionWorkflowTestArm, name) {                          \
    FUTEX_REQUEUE_SINGLE_OWNER_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

FUTEX_REQUEUE_SINGLE_OWNER_DISPLAY_TEST(
    ZxFutexRequeueSingleOwner, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_futex_requeue_single_owner("
    "value_ptr: \x1B[32mzx.futex_t\x1B[0m = \x1B[31m56789\x1B[0m, "
    "current_value: \x1B[32mzx.futex_t\x1B[0m = \x1B[31m56789\x1B[0m, "
    "requeue_ptr: \x1B[32mzx.futex_t\x1B[0m = \x1B[31m98765\x1B[0m, "
    "requeue_count: \x1B[32muint32\x1B[0m = \x1B[34m3\x1B[0m, "
    "new_requeue_owner: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m)\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m\n");

// zx_futex_get_owner tests.

std::unique_ptr<SystemCallTest> ZxFutexGetOwner(int64_t result, std::string_view result_name,
                                                const zx_futex_t* value_ptr, zx_koid_t* koid) {
  auto value = std::make_unique<SystemCallTest>("zx_futex_get_owner", result, result_name);
  value->AddInput(reinterpret_cast<uint64_t>(value_ptr));
  value->AddInput(reinterpret_cast<uint64_t>(koid));
  return value;
}

#define FUTEX_GET_OWNER_DISPLAY_TEST_CONTENT(result, expected)                                    \
  zx_futex_t value = kFutex;                                                                      \
  zx_koid_t koid = kKoid;                                                                         \
  PerformDisplayTest("$plt(zx_futex_get_owner)", ZxFutexGetOwner(result, #result, &value, &koid), \
                     expected);

#define FUTEX_GET_OWNER_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {               \
    FUTEX_GET_OWNER_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                         \
  TEST_F(InterceptionWorkflowTestArm, name) {               \
    FUTEX_GET_OWNER_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

FUTEX_GET_OWNER_DISPLAY_TEST(
    ZxFutexGetOwner, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_futex_get_owner(value_ptr: \x1B[32mzx.futex_t\x1B[0m = \x1B[31m56789\x1B[0m)\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m (koid: \x1B[32mzx.koid\x1B[0m = \x1B[31m4252\x1B[0m)\n");

// zx_futex_wake_handle_close_thread_exit tests.

std::unique_ptr<SystemCallTest> ZxFutexWakeHandleCloseThreadExit(
    int64_t result, std::string_view result_name, const zx_futex_t* value_ptr, uint32_t wake_count,
    int32_t new_value, zx_handle_t close_handle) {
  auto value = std::make_unique<SystemCallTest>("zx_futex_wake_handle_close_thread_exit", result,
                                                result_name);
  value->AddInput(reinterpret_cast<uint64_t>(value_ptr));
  value->AddInput(wake_count);
  value->AddInput(new_value);
  value->AddInput(close_handle);
  return value;
}

#define FUTEX_WAKE_HANDLE_CLOSE_THREAD_EXIT_DISPLAY_TEST_CONTENT(result, expected) \
  zx_futex_t value = kFutex;                                                       \
  PerformNoReturnDisplayTest(                                                      \
      "$plt(zx_futex_wake_handle_close_thread_exit)",                              \
      ZxFutexWakeHandleCloseThreadExit(result, #result, &value, 2, -1, kHandle), expected);

#define FUTEX_WAKE_HANDLE_CLOSE_THREAD_EXIT_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                                   \
    FUTEX_WAKE_HANDLE_CLOSE_THREAD_EXIT_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                                             \
  TEST_F(InterceptionWorkflowTestArm, name) {                                   \
    FUTEX_WAKE_HANDLE_CLOSE_THREAD_EXIT_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

FUTEX_WAKE_HANDLE_CLOSE_THREAD_EXIT_DISPLAY_TEST(
    ZxFutexWakeHandleCloseThreadExit, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_futex_wake_handle_close_thread_exit("
    "value_ptr: \x1B[32mzx.futex_t\x1B[0m = \x1B[31m56789\x1B[0m, "
    "wake_count: \x1B[32muint32\x1B[0m = \x1B[34m2\x1B[0m, "
    "new_value: \x1B[32mint32\x1B[0m = \x1B[34m-1\x1B[0m, "
    "close_handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m)\n");

}  // namespace fidlcat
