// 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 <zircon/syscalls/policy.h>

#include <gtest/gtest.h>

#include "tools/fidlcat/interception_tests/interception_workflow_test.h"

namespace fidlcat {

// zx_job_create tests.

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

#define JOB_CREATE_DISPLAY_TEST_CONTENT(result, expected)                                   \
  zx_handle_t out = kHandleOut;                                                             \
  PerformDisplayTest("$plt(zx_job_create)", ZxJobCreate(result, #result, kHandle, 0, &out), \
                     expected)

#define JOB_CREATE_DISPLAY_TEST(name, errno, expected)                                            \
  TEST_F(InterceptionWorkflowTestX64, name) { JOB_CREATE_DISPLAY_TEST_CONTENT(errno, expected); } \
  TEST_F(InterceptionWorkflowTestArm, name) { JOB_CREATE_DISPLAY_TEST_CONTENT(errno, expected); }

JOB_CREATE_DISPLAY_TEST(
    ZxJobCreate, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_job_create("
    "parent_job: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "options: \x1B[32muint32\x1B[0m = \x1B[34m0\x1B[0m)\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m (out: \x1B[32mhandle\x1B[0m = \x1B[31mbde90caf\x1B[0m)\n")

// zx_job_set_policy tests.

std::unique_ptr<SystemCallTest> ZxJobSetPolicy(int64_t result, std::string_view result_name,
                                               zx_handle_t handle, uint32_t options, uint32_t topic,
                                               const void* policy, uint32_t count) {
  auto value = std::make_unique<SystemCallTest>("zx_job_set_policy", result, result_name);
  value->AddInput(handle);
  value->AddInput(options);
  value->AddInput(topic);
  value->AddInput(reinterpret_cast<uint64_t>(policy));
  value->AddInput(count);
  return value;
}

#define JOB_SET_POLICY_BASIC_DISPLAY_TEST_CONTENT(result, expected)                                \
  std::vector<zx_policy_basic_t> policy(2);                                                        \
  policy[0] = {.condition = ZX_POL_VMAR_WX, .policy = ZX_POL_ACTION_ALLOW};                        \
  policy[1] = {.condition = ZX_POL_NEW_VMO, .policy = ZX_POL_ACTION_DENY};                         \
  PerformDisplayTest(                                                                              \
      "$plt(zx_job_set_policy)",                                                                   \
      ZxJobSetPolicy(result, #result, kHandle, 0, ZX_JOB_POL_BASIC, policy.data(), policy.size()), \
      expected)

#define JOB_SET_POLICY_BASIC_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                    \
    JOB_SET_POLICY_BASIC_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                              \
  TEST_F(InterceptionWorkflowTestArm, name) {                    \
    JOB_SET_POLICY_BASIC_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

JOB_SET_POLICY_BASIC_DISPLAY_TEST(
    ZxJobSetPolicyBasic, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_job_set_policy("
    "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
    "options: \x1B[32muint32\x1B[0m = \x1B[34m0\x1B[0m, "
    "topic: \x1B[32mzx.policy_topic\x1B[0m = \x1B[34mZX_JOB_POL_BASIC\x1B[0m)\n"
    "  policy: \x1B[32mvector<zx_policy_basic_t>\x1B[0m = [\n"
    "    { condition: \x1B[32mzx.policy_condition\x1B[0m = \x1B[34mZX_POL_VMAR_WX\x1B[0m, "
    "policy: \x1B[32mzx.policy_action\x1B[0m = \x1B[34mZX_POL_ACTION_ALLOW\x1B[0m }\n"
    "    { condition: \x1B[32mzx.policy_condition\x1B[0m = \x1B[34mZX_POL_NEW_VMO\x1B[0m, "
    "policy: \x1B[32mzx.policy_action\x1B[0m = \x1B[34mZX_POL_ACTION_DENY\x1B[0m }\n"
    "  ]\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m\n")

#define JOB_SET_POLICY_TIMER_SLACK_DISPLAY_TEST_CONTENT(result, expected)                     \
  zx_policy_timer_slack_t policy = {.min_slack = 100, .default_mode = ZX_TIMER_SLACK_CENTER}; \
  PerformDisplayTest(                                                                         \
      "$plt(zx_job_set_policy)",                                                              \
      ZxJobSetPolicy(result, #result, kHandle, 0, ZX_JOB_POL_TIMER_SLACK, &policy, 1), expected)

#define JOB_SET_POLICY_TIMER_SLACK_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                          \
    JOB_SET_POLICY_TIMER_SLACK_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                                    \
  TEST_F(InterceptionWorkflowTestArm, name) {                          \
    JOB_SET_POLICY_TIMER_SLACK_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

JOB_SET_POLICY_TIMER_SLACK_DISPLAY_TEST(
    ZxJobSetPolicyTimerSlack, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_job_set_policy("
    "handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m,"
    " options: \x1B[32muint32\x1B[0m = \x1B[34m0\x1B[0m, "
    "topic: \x1B[32mzx.policy_topic\x1B[0m = \x1B[34mZX_JOB_POL_TIMER_SLACK\x1B[0m)\n"
    "  policy: \x1B[32mzx_policy_timer_slack_t\x1B[0m = {\n"
    "    min_slack: \x1B[32mzx.duration\x1B[0m = \x1B[34m100 nano seconds\x1B[0m\n"
    "    default_mode: \x1B[32mzx.timer_option\x1B[0m = \x1B[34mZX_TIMER_SLACK_CENTER\x1B[0m\n"
    "  }\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m\n")

}  // namespace fidlcat
