blob: 49163bdd2d935f0ad4c327cf6f4a23c2d231838a [file] [log] [blame]
// 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_timer_create tests.
std::unique_ptr<SystemCallTest> ZxTimerCreate(int64_t result, std::string_view result_name,
uint32_t options, zx_clock_t clock_id,
zx_handle_t* out) {
auto value = std::make_unique<SystemCallTest>("zx_timer_create", result, result_name);
value->AddInput(options);
value->AddInput(clock_id);
value->AddInput(reinterpret_cast<uint64_t>(out));
return value;
}
// Checks that we can decode a zx_timer_create syscall.
// Also checks that we create the right semantic for the timers.
#define TIMER_CREATE_DISPLAY_TEST_CONTENT(result, expected) \
zx_handle_t out = kHandleOut; \
ProcessController controller(this, session(), loop()); \
PerformDisplayTest(&controller, "$plt(zx_timer_create)", \
ZxTimerCreate(result, #result, 0, ZX_CLOCK_MONOTONIC, &out), expected); \
SyscallDecoderDispatcher* dispatcher = controller.workflow().syscall_decoder_dispatcher(); \
const fidl_codec::semantic::InferredHandleInfo* info0 = \
dispatcher->inference().GetInferredHandleInfo(kFirstPid, out); \
ASSERT_NE(info0, nullptr); \
ASSERT_EQ(info0->type(), "timer"); \
ASSERT_EQ(info0->fd(), 0); \
const fidl_codec::semantic::InferredHandleInfo* info1 = \
dispatcher->inference().GetInferredHandleInfo(kSecondPid, out); \
ASSERT_NE(info1, nullptr); \
ASSERT_EQ(info1->type(), "timer"); \
ASSERT_EQ(info1->fd(), 1)
#define TIMER_CREATE_DISPLAY_TEST(name, errno, expected) \
TEST_F(InterceptionWorkflowTestX64, name) { \
TIMER_CREATE_DISPLAY_TEST_CONTENT(errno, expected); \
} \
TEST_F(InterceptionWorkflowTestArm, name) { TIMER_CREATE_DISPLAY_TEST_CONTENT(errno, expected); }
TIMER_CREATE_DISPLAY_TEST(
ZxTimerCreate, ZX_OK,
"\n"
"\x1B[32m0.000000\x1B[0m "
"test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
"zx_timer_create("
"options: \x1B[32muint32\x1B[0m = \x1B[34m0\x1B[0m, "
"clock_id: \x1B[32mzx.clock\x1B[0m = \x1B[34mZX_CLOCK_MONOTONIC\x1B[0m)\n"
"\x1B[32m0.000000\x1B[0m "
" -> \x1B[32mZX_OK\x1B[0m (out: \x1B[32mhandle\x1B[0m = \x1B[31mbde90caf\x1B[0m)\n")
// zx_timer_set tests.
std::unique_ptr<SystemCallTest> ZxTimerSet(int64_t result, std::string_view result_name,
zx_handle_t handle, zx_time_t deadline,
zx_duration_t slack) {
auto value = std::make_unique<SystemCallTest>("zx_timer_set", result, result_name);
value->AddInput(handle);
value->AddInput(deadline);
value->AddInput(slack);
return value;
}
#define TIMER_SET_DISPLAY_TEST_CONTENT(result, expected) \
PerformDisplayTest("$plt(zx_timer_set)", \
ZxTimerSet(result, #result, kHandle, ZX_MSEC(123), ZX_USEC(1)), expected)
#define TIMER_SET_DISPLAY_TEST(name, errno, expected) \
TEST_F(InterceptionWorkflowTestX64, name) { TIMER_SET_DISPLAY_TEST_CONTENT(errno, expected); } \
TEST_F(InterceptionWorkflowTestArm, name) { TIMER_SET_DISPLAY_TEST_CONTENT(errno, expected); }
TIMER_SET_DISPLAY_TEST(ZxTimerSet, ZX_OK,
"\n"
"\x1B[32m0.000000\x1B[0m "
"test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
"zx_timer_set("
"handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m, "
"deadline: \x1B[32mzx.time\x1B[0m = \x1B[34m123000000 nano seconds\x1B[0m, "
"slack: \x1B[32mzx.duration\x1B[0m = \x1B[34m1000 nano seconds\x1B[0m)\n"
"\x1B[32m0.000000\x1B[0m "
" -> \x1B[32mZX_OK\x1B[0m\n")
// zx_timer_cancel tests.
std::unique_ptr<SystemCallTest> ZxTimerCancel(int64_t result, std::string_view result_name,
zx_handle_t handle) {
auto value = std::make_unique<SystemCallTest>("zx_timer_cancel", result, result_name);
value->AddInput(handle);
return value;
}
#define TIMER_CANCEL_DISPLAY_TEST_CONTENT(result, expected) \
PerformDisplayTest("$plt(zx_timer_cancel)", ZxTimerCancel(result, #result, kHandle), expected)
#define TIMER_CANCEL_DISPLAY_TEST(name, errno, expected) \
TEST_F(InterceptionWorkflowTestX64, name) { \
TIMER_CANCEL_DISPLAY_TEST_CONTENT(errno, expected); \
} \
TEST_F(InterceptionWorkflowTestArm, name) { TIMER_CANCEL_DISPLAY_TEST_CONTENT(errno, expected); }
TIMER_CANCEL_DISPLAY_TEST(
ZxTimerCancel, ZX_OK,
"\n"
"\x1B[32m0.000000\x1B[0m "
"test_3141 \x1B[31m3141\x1B[0m:\x1B[31m8764\x1B[0m "
"zx_timer_cancel(handle: \x1B[32mhandle\x1B[0m = \x1B[31mcefa1db0\x1B[0m)\n"
"\x1B[32m0.000000\x1B[0m "
" -> \x1B[32mZX_OK\x1B[0m\n")
} // namespace fidlcat