// 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 {

// Program stopped on exception tests.

#define DISPLAY_EXCEPTION_TEST_CONTENT(type, expected) PerformExceptionDisplayTest(type, expected)

#define DISPLAY_EXCEPTION_TEST(name, type, expected)                                            \
  TEST_F(InterceptionWorkflowTestX64, name) { DISPLAY_EXCEPTION_TEST_CONTENT(type, expected); } \
  TEST_F(InterceptionWorkflowTestArm, name) { DISPLAY_EXCEPTION_TEST_CONTENT(type, expected); }

DISPLAY_EXCEPTION_TEST(DisplayExceptionPageFault, debug_ipc::ExceptionType::kPageFault,
                       "\n"
                       "\x1B[32m0.000000\x1B[0m "
                       "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m \x1B[103m"
                       "at \x1B[31mfidlcat/main.cc\x1B[0m\x1B[103m:\x1B[34m10:2\x1B[0m\n"
                       "\x1B[32m0.000000\x1B[0m "
                       "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m \x1B[103m"
                       "at \x1B[31mfidlcat/foo.cc\x1B[0m\x1B[103m:\x1B[34m50:4\x1B[0m\n"
                       "\x1B[32m0.000000\x1B[0m "
                       "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m \x1B[103m"
                       "at \x1B[31mfidlcat/foo.cc\x1B[0m\x1B[103m:\x1B[34m25:8\x1B[0m\n"
                       "\x1B[32m0.000000\x1B[0m "
                       "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m \x1B[31m"
                       "thread stopped on exception\x1B[0m\n")

DISPLAY_EXCEPTION_TEST(DisplayExceptionGeneral, debug_ipc::ExceptionType::kGeneral,
                       "\n"
                       "\x1B[32m0.000000\x1B[0m "
                       "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m \x1B[103m"
                       "at \x1B[31mfidlcat/main.cc\x1B[0m\x1B[103m:\x1B[34m10:2\x1B[0m\n"
                       "\x1B[32m0.000000\x1B[0m "
                       "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m \x1B[103m"
                       "at \x1B[31mfidlcat/foo.cc\x1B[0m\x1B[103m:\x1B[34m50:4\x1B[0m\n"
                       "\x1B[32m0.000000\x1B[0m "
                       "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m \x1B[103m"
                       "at \x1B[31mfidlcat/foo.cc\x1B[0m\x1B[103m:\x1B[34m25:8\x1B[0m\n"
                       "\x1B[32m0.000000\x1B[0m "
                       "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m \x1B[31m"
                       "thread stopped on exception\x1B[0m\n")

// zx_exception_get_thread tests.

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

#define ZX_EXCEPTION_GET_THREAD_DISPLAY_TEST_CONTENT(result, expected) \
  zx_handle_t out = kHandleOut;                                        \
  PerformDisplayTest("$plt(zx_exception_get_thread)",                  \
                     ZxExceptionGetThread(result, #result, kHandle, &out), expected)

#define ZX_EXCEPTION_GET_THREAD_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                       \
    ZX_EXCEPTION_GET_THREAD_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                                 \
  TEST_F(InterceptionWorkflowTestArm, name) {                       \
    ZX_EXCEPTION_GET_THREAD_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

ZX_EXCEPTION_GET_THREAD_DISPLAY_TEST(
    ZxExceptionGetThread, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_exception_get_thread(handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m)\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m (out: \x1B[32mhandle\x1B[0m = \x1B[31mbde90caf\x1B[0m)\n")

// zx_exception_get_process tests.

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

#define ZX_EXCEPTION_GET_PROCESS_DISPLAY_TEST_CONTENT(result, expected) \
  zx_handle_t out = kHandleOut;                                         \
  PerformDisplayTest("$plt(zx_exception_get_process)",                  \
                     ZxExceptionGetProcess(result, #result, kHandle, &out), expected)

#define ZX_EXCEPTION_GET_PROCESS_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                        \
    ZX_EXCEPTION_GET_PROCESS_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                                  \
  TEST_F(InterceptionWorkflowTestArm, name) {                        \
    ZX_EXCEPTION_GET_PROCESS_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

ZX_EXCEPTION_GET_PROCESS_DISPLAY_TEST(
    ZxExceptionGetProcess, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_exception_get_process(handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\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
