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

// processargs_extract_handles tests.
// This function is the first to be intercepted. All the handles are defined.

std::unique_ptr<SystemCallTest> ProcessargsExtractHandles(
    uint32_t nhandles, zx_handle_t handles[], uint32_t handle_info[], zx_handle_t* process_self,
    zx_handle_t* job_default, zx_handle_t* vmar_root_self, zx_handle_t* thread_self) {
  auto value = std::make_unique<SystemCallTest>("processargs_extract_handles", 0, "");
  value->AddInput(nhandles);
  value->AddInput(reinterpret_cast<uint64_t>(handles));
  value->AddInput(reinterpret_cast<uint64_t>(handle_info));
  value->AddInput(reinterpret_cast<uint64_t>(process_self));
  value->AddInput(reinterpret_cast<uint64_t>(job_default));
  value->AddInput(reinterpret_cast<uint64_t>(vmar_root_self));
  value->AddInput(reinterpret_cast<uint64_t>(thread_self));
  return value;
}

// Uses two sets of handles (one for each process).
// The same numerical value is used for a handle for both process.
// Check that each process has its own definition of the shared handle value.
#define PROCESSARGS_EXTRACT_HANDLES_TEST()                                                         \
  constexpr uint32_t kDuplicatedHandleValue = 0x1e925427;                                          \
  constexpr uint32_t nhandles_1 = 12;                                                              \
  zx_handle_t handles_1[nhandles_1] = {0x1e925427, 0xa45248f3, 0x18c254a3, 0x39b2565b,             \
                                       0x21c2485b, 0x37324bbb, 0x3b8255ab, 0x07b24b13,             \
                                       0x3dc2489b, 0x3a32566f, 0x38a2565f, 0x1842488f};            \
  uint32_t handle_info_1[nhandles_1] = {0x00000001, 0x00000004, 0x00000002, 0x00000020,            \
                                        0x00010020, 0x00000003, 0x0000003b, 0x00000030,            \
                                        0x00010030, 0x00020030, 0x00000011, 0x00000013};           \
  constexpr uint32_t nhandles_2 = 1;                                                               \
  zx_handle_t handles_2[nhandles_2] = {0x1e925427};                                                \
  uint32_t handle_info_2[nhandles_2] = {0x00010030};                                               \
  zx_handle_t process_self;                                                                        \
  zx_handle_t job_default;                                                                         \
  zx_handle_t vmar_root_self;                                                                      \
  zx_handle_t thread_self;                                                                         \
  ProcessController controller(this, session(), loop());                                           \
  PerformFunctionTest(                                                                             \
      &controller, "processargs_extract_handles",                                                  \
      ProcessargsExtractHandles(nhandles_1, handles_1, handle_info_1, &process_self, &job_default, \
                                &vmar_root_self, &thread_self),                                    \
      kFirstPid, kFirstThreadKoid);                                                                \
  PerformFunctionTest(                                                                             \
      &controller, "processargs_extract_handles",                                                  \
      ProcessargsExtractHandles(nhandles_2, handles_2, handle_info_2, &process_self, &job_default, \
                                &vmar_root_self, &thread_self),                                    \
      kSecondPid, kSecondThreadKoid);                                                              \
  SyscallDecoderDispatcher* dispatcher = controller.workflow().syscall_decoder_dispatcher();       \
  ASSERT_EQ(dispatcher->inference().handle_size(kFirstPid), nhandles_1);                           \
  const fidl_codec::semantic::InferredHandleInfo* info =                                           \
      dispatcher->inference().GetInferredHandleInfo(kFirstPid, kDuplicatedHandleValue);            \
  ASSERT_NE(info, nullptr);                                                                        \
  ASSERT_EQ(info->type(), "proc-self");                                                            \
  info = dispatcher->inference().GetInferredHandleInfo(kFirstPid, handles_1[8]);                   \
  ASSERT_NE(info, nullptr);                                                                        \
  ASSERT_EQ(info->type(), "fd");                                                                   \
  ASSERT_EQ(info->fd(), 1);                                                                        \
                                                                                                   \
  ASSERT_EQ(dispatcher->inference().handle_size(kSecondPid), nhandles_2);                          \
  info = dispatcher->inference().GetInferredHandleInfo(kSecondPid, kDuplicatedHandleValue);        \
  ASSERT_NE(info, nullptr);                                                                        \
  ASSERT_EQ(info->type(), "fd");                                                                   \
  ASSERT_EQ(info->fd(), 1)

#define PROCESSARGS_EXTRACT_HANDLES_DISPLAY_TEST(name)                              \
  TEST_F(InterceptionWorkflowTestX64, name) { PROCESSARGS_EXTRACT_HANDLES_TEST(); } \
  TEST_F(InterceptionWorkflowTestArm, name) { PROCESSARGS_EXTRACT_HANDLES_TEST(); }

PROCESSARGS_EXTRACT_HANDLES_DISPLAY_TEST(ProcessargsExtractHandles)

// libc_extensions_init tests.
// This is the second intercepted function. Some handles have already been used by
// processargs_extract_handles and have been reset (null values).

std::unique_ptr<SystemCallTest> LibcExtensionsInit(uint32_t nhandles, zx_handle_t handles[],
                                                   uint32_t handle_info[], uint32_t name_count,
                                                   const char* names[]) {
  auto value = std::make_unique<SystemCallTest>("libc_extensions_init", 0, "");
  value->AddInput(nhandles);
  value->AddInput(reinterpret_cast<uint64_t>(handles));
  value->AddInput(reinterpret_cast<uint64_t>(handle_info));
  value->AddInput(name_count);
  value->AddInput(reinterpret_cast<uint64_t>(names));
  return value;
}

#define LIBC_EXTENSIONS_INIT_TEST()                                                          \
  constexpr uint32_t kMaxNameSize = 80;                                                      \
  constexpr uint32_t nhandles = 12;                                                          \
  constexpr uint32_t defined_handles = 8;                                                    \
  zx_handle_t handles[nhandles] = {0x00000000, 0x00000000, 0x00000000, 0x39b2565b,           \
                                   0x21c2485b, 0x00000000, 0x3b8255ab, 0x07b24b13,           \
                                   0x3dc2489b, 0x3a32566f, 0x38a2565f, 0x1842488f};          \
  uint32_t handle_info[nhandles] = {0x00000000, 0x00000000, 0x00000000, 0x00000020,          \
                                    0x00010020, 0x00000000, 0x0000003b, 0x00000030,          \
                                    0x00010030, 0x00020030, 0x00000011, 0x00000013};         \
  constexpr uint32_t name_count = 2;                                                         \
  char pkg[kMaxNameSize] = "/pkg";                                                           \
  char svc[kMaxNameSize] = "/svc";                                                           \
  const char* names[name_count] = {pkg, svc};                                                \
  ProcessController controller(this, session(), loop());                                     \
  PerformFunctionTest(&controller, "__libc_extensions_init",                                 \
                      LibcExtensionsInit(nhandles, handles, handle_info, name_count, names), \
                      kFirstPid, kFirstThreadKoid);                                          \
  SyscallDecoderDispatcher* dispatcher = controller.workflow().syscall_decoder_dispatcher(); \
  ASSERT_EQ(dispatcher->inference().handle_size(kFirstPid), defined_handles);                \
  ASSERT_EQ(dispatcher->inference().handle_size(kSecondPid), static_cast<size_t>(0));        \
  const fidl_codec::semantic::InferredHandleInfo* info =                                     \
      dispatcher->inference().GetInferredHandleInfo(kFirstPid, handles[3]);                  \
  ASSERT_NE(info, nullptr);                                                                  \
  ASSERT_EQ(info->type(), "dir");                                                            \
  ASSERT_EQ(info->path(), "/pkg")

#define LIBC_EXTENSIONS_INIT_DISPLAY_TEST(name)                              \
  TEST_F(InterceptionWorkflowTestX64, name) { LIBC_EXTENSIONS_INIT_TEST(); } \
  TEST_F(InterceptionWorkflowTestArm, name) { LIBC_EXTENSIONS_INIT_TEST(); }

LIBC_EXTENSIONS_INIT_DISPLAY_TEST(LibcExtensionsInit)

}  // namespace fidlcat
