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

std::unique_ptr<SystemCallTest> ZxChannelCreate(int64_t result, std::string_view result_name,
                                                uint32_t options, zx_handle_t* out0,
                                                zx_handle_t* out1);

#define DISPLAY_STACK_TEST_CONTENT(errno, level, expected)                                       \
  decode_options_.stack_level = level;                                                           \
  zx_handle_t out0 = 0x12345678;                                                                 \
  zx_handle_t out1 = 0x87654321;                                                                 \
  PerformDisplayTest("$plt(zx_channel_create)", ZxChannelCreate(errno, #errno, 0, &out0, &out1), \
                     expected);

#define DISPLAY_STACK_TEST(name, errno, level, expected) \
  TEST_F(InterceptionWorkflowTestX64, name) {            \
    DISPLAY_STACK_TEST_CONTENT(errno, level, expected);  \
  }                                                      \
  TEST_F(InterceptionWorkflowTestArm, name) { DISPLAY_STACK_TEST_CONTENT(errno, level, expected); }

DISPLAY_STACK_TEST(
    DisplayNoStack, ZX_OK, kNoStack,
    "\n"
    "\x1B[32m0.000000\x1B[0m "
    "test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m zx_channel_create("
    "options: \x1B[32muint32\x1B[0m = \x1B[34m0\x1B[0m)\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m (out0: \x1B[32mhandle\x1B[0m = \x1B[31m12345678\x1B[0m, "
    "out1: \x1B[32mhandle\x1B[0m = \x1B[31m87654321\x1B[0m)\n");

DISPLAY_STACK_TEST(
    DisplayPartialStack, ZX_OK, kPartialStack,
    "\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 zx_channel_create("
    "options: \x1B[32muint32\x1B[0m = \x1B[34m0\x1B[0m)\n"
    "\x1B[32m0.000000\x1B[0m "
    "  -> \x1B[32mZX_OK\x1B[0m (out0: \x1B[32mhandle\x1B[0m = \x1B[31m12345678\x1B[0m, "
    "out1: \x1B[32mhandle\x1B[0m = \x1B[31m87654321\x1B[0m)\n");

#define BAD_STACK_TEST_CONTENT(errno, expected)                                                  \
  set_bad_stack();                                                                               \
  zx_handle_t out0 = 0x12345678;                                                                 \
  zx_handle_t out1 = 0x87654321;                                                                 \
  PerformAbortedTest("$plt(zx_channel_create)", ZxChannelCreate(errno, #errno, 0, &out0, &out1), \
                     expected);

#define BAD_STACK_TEST(name, errno, expected)                                            \
  TEST_F(InterceptionWorkflowTestX64, name) { BAD_STACK_TEST_CONTENT(errno, expected); } \
  TEST_F(InterceptionWorkflowTestArm, name) { BAD_STACK_TEST_CONTENT(errno, expected); }

// Checks that we don't crash if zxdb doesn't provide a stack.
BAD_STACK_TEST(BadStack, ZX_OK, "");

}  // namespace fidlcat
