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

std::unique_ptr<SystemCallTest> ZxCprngDraw(int64_t result, std::string_view result_name,
                                            void* buffer, size_t buffer_size) {
  auto value = std::make_unique<SystemCallTest>("zx_cprng_draw", result, result_name);
  value->AddInput(reinterpret_cast<uint64_t>(buffer));
  value->AddInput(buffer_size);
  return value;
}

#define CPRNG_DRAW_DISPLAY_TEST_CONTENT(result, expected) \
  std::vector<uint8_t> buffer;                            \
  for (int i = 0; i < 20; ++i) {                          \
    buffer.emplace_back(i);                               \
  }                                                       \
  PerformDisplayTest("$plt(zx_cprng_draw)",               \
                     ZxCprngDraw(result, #result, buffer.data(), buffer.size()), expected);

#define CPRNG_DRAW_DISPLAY_TEST(name, errno, expected)                                            \
  TEST_F(InterceptionWorkflowTestX64, name) { CPRNG_DRAW_DISPLAY_TEST_CONTENT(errno, expected); } \
  TEST_F(InterceptionWorkflowTestArm, name) { CPRNG_DRAW_DISPLAY_TEST_CONTENT(errno, expected); }

CPRNG_DRAW_DISPLAY_TEST(
    ZxCprngDraw, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m zx_cprng_draw()\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \n"
    "    buffer: \x1B[32mvector<uint8>\x1B[0m = [ "
    "\x1B[34m00\x1B[0m, \x1B[34m01\x1B[0m, \x1B[34m02\x1B[0m, \x1B[34m03\x1B[0m, "
    "\x1B[34m04\x1B[0m, \x1B[34m05\x1B[0m, \x1B[34m06\x1B[0m, \x1B[34m07\x1B[0m, "
    "\x1B[34m08\x1B[0m, \x1B[34m09\x1B[0m, \x1B[34m0a\x1B[0m, \x1B[34m0b\x1B[0m, "
    "\x1B[34m0c\x1B[0m, \x1B[34m0d\x1B[0m, \x1B[34m0e\x1B[0m, \x1B[34m0f\x1B[0m, "
    "\x1B[34m10\x1B[0m, \x1B[34m11\x1B[0m, \x1B[34m12\x1B[0m, \x1B[34m13\x1B[0m ]\n");

// zx_cprng_add_entropy tests.

std::unique_ptr<SystemCallTest> ZxCprngAddEntropy(int64_t result, std::string_view result_name,
                                                  const void* buffer, size_t buffer_size) {
  auto value = std::make_unique<SystemCallTest>("zx_cprng_add_entropy", result, result_name);
  value->AddInput(reinterpret_cast<uint64_t>(buffer));
  value->AddInput(buffer_size);
  return value;
}

#define CPRNG_ADD_ENTROPY_DISPLAY_TEST_CONTENT(result, expected) \
  std::vector<uint8_t> buffer;                                   \
  for (int i = 0; i < 20; ++i) {                                 \
    buffer.emplace_back(i);                                      \
  }                                                              \
  PerformDisplayTest("$plt(zx_cprng_add_entropy)",               \
                     ZxCprngAddEntropy(result, #result, buffer.data(), buffer.size()), expected);

#define CPRNG_ADD_ENTROPY_DISPLAY_TEST(name, errno, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {                 \
    CPRNG_ADD_ENTROPY_DISPLAY_TEST_CONTENT(errno, expected);  \
  }                                                           \
  TEST_F(InterceptionWorkflowTestArm, name) {                 \
    CPRNG_ADD_ENTROPY_DISPLAY_TEST_CONTENT(errno, expected);  \
  }

CPRNG_ADD_ENTROPY_DISPLAY_TEST(
    ZxCprngAddEntropy, ZX_OK,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
    "zx_cprng_add_entropy()\n"
    "  buffer: \x1B[32mvector<uint8>\x1B[0m = [ "
    "\x1B[34m00\x1B[0m, \x1B[34m01\x1B[0m, \x1B[34m02\x1B[0m, \x1B[34m03\x1B[0m, "
    "\x1B[34m04\x1B[0m, \x1B[34m05\x1B[0m, \x1B[34m06\x1B[0m, \x1B[34m07\x1B[0m, "
    "\x1B[34m08\x1B[0m, \x1B[34m09\x1B[0m, \x1B[34m0a\x1B[0m, \x1B[34m0b\x1B[0m, "
    "\x1B[34m0c\x1B[0m, \x1B[34m0d\x1B[0m, \x1B[34m0e\x1B[0m, \x1B[34m0f\x1B[0m, "
    "\x1B[34m10\x1B[0m, \x1B[34m11\x1B[0m, \x1B[34m12\x1B[0m, \x1B[34m13\x1B[0m ]\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m\n");

}  // namespace fidlcat
