blob: 53413b41c2c123b5c02afd70f730b3de46f7efba [file] [log] [blame]
// Copyright 2017 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.
// This file is included from event_tests.c and event_tests.cpp to exercise
// the different API features when using the C and C++ compilers.
// Portions of some tests are only compiled in C++.
//
// This file is also compiled with and without the NTRACE macro.
#ifndef ZIRCON_SYSTEM_UTEST_TRACE_EVENT_TESTS_COMMON_H_
#define ZIRCON_SYSTEM_UTEST_TRACE_EVENT_TESTS_COMMON_H_
#include <lib/trace/event.h>
#include <lib/trace/event_args.h>
#include <zircon/syscalls.h>
#include <trace-test-utils/fixture.h>
#include <zxtest/zxtest.h>
#ifdef __cplusplus
#include <string_view>
#include <fbl/string.h>
#endif // __cplusplus
#include <trace-test-utils/fixture_macros.h>
#define I32_ARGS1 "k1", TA_INT32(1)
#define I32_ARGS2 "k1", TA_INT32(1), "k2", TA_INT32(2)
#define I32_ARGS3 "k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3)
#define I32_ARGS4 "k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3), "k4", TA_INT32(4)
#define I32_ARGS5 \
"k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3), "k4", TA_INT32(4), "k5", TA_INT32(5)
#define I32_ARGS6 \
"k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3), "k4", TA_INT32(4), "k5", TA_INT32(5), \
"k6", TA_INT32(6)
#define I32_ARGS7 \
"k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3), "k4", TA_INT32(4), "k5", TA_INT32(5), \
"k6", TA_INT32(6), "k7", TA_INT32(7)
#define I32_ARGS8 \
"k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3), "k4", TA_INT32(4), "k5", TA_INT32(5), \
"k6", TA_INT32(6), "k7", TA_INT32(7), "k8", TA_INT32(8)
#define I32_ARGS9 \
"k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3), "k4", TA_INT32(4), "k5", TA_INT32(5), \
"k6", TA_INT32(6), "k7", TA_INT32(7), "k8", TA_INT32(8), "k9", TA_INT32(9)
#define I32_ARGS10 \
"k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3), "k4", TA_INT32(4), "k5", TA_INT32(5), \
"k6", TA_INT32(6), "k7", TA_INT32(7), "k8", TA_INT32(8), "k9", TA_INT32(9), "k10", \
TA_INT32(10)
#define I32_ARGS11 \
"k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3), "k4", TA_INT32(4), "k5", TA_INT32(5), \
"k6", TA_INT32(6), "k7", TA_INT32(7), "k8", TA_INT32(8), "k9", TA_INT32(9), "k10", \
TA_INT32(10), "k11", TA_INT32(11)
#define I32_ARGS12 \
"k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3), "k4", TA_INT32(4), "k5", TA_INT32(5), \
"k6", TA_INT32(6), "k7", TA_INT32(7), "k8", TA_INT32(8), "k9", TA_INT32(9), "k10", \
TA_INT32(10), "k11", TA_INT32(11), "k12", TA_INT32(12)
#define I32_ARGS13 \
"k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3), "k4", TA_INT32(4), "k5", TA_INT32(5), \
"k6", TA_INT32(6), "k7", TA_INT32(7), "k8", TA_INT32(8), "k9", TA_INT32(9), "k10", \
TA_INT32(10), "k11", TA_INT32(11), "k12", TA_INT32(12), "k13", TA_INT32(13)
#define I32_ARGS14 \
"k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3), "k4", TA_INT32(4), "k5", TA_INT32(5), \
"k6", TA_INT32(6), "k7", TA_INT32(7), "k8", TA_INT32(8), "k9", TA_INT32(9), "k10", \
TA_INT32(10), "k11", TA_INT32(11), "k12", TA_INT32(12), "k13", TA_INT32(13), "k14", \
TA_INT32(14)
#define I32_ARGS15 \
"k1", TA_INT32(1), "k2", TA_INT32(2), "k3", TA_INT32(3), "k4", TA_INT32(4), "k5", TA_INT32(5), \
"k6", TA_INT32(6), "k7", TA_INT32(7), "k8", TA_INT32(8), "k9", TA_INT32(9), "k10", \
TA_INT32(10), "k11", TA_INT32(11), "k12", TA_INT32(12), "k13", TA_INT32(13), "k14", \
TA_INT32(14), "k15", TA_INT32(15)
#define ALL15(fn) \
fn(0) fn(1) fn(2) fn(3) fn(4) fn(5) fn(6) fn(7) fn(8) fn(9) fn(10) fn(11) fn(12) fn(13) fn(14) \
fn(15)
#define STR_ARGS1 "k1", TA_STRING("v1")
#define STR_ARGS2 "k1", TA_STRING("v1"), "k2", TA_STRING("v2")
#define STR_ARGS3 "k1", TA_STRING("v1"), "k2", TA_STRING("v2"), "k3", TA_STRING("v3")
#define STR_ARGS4 \
"k1", TA_STRING("v1"), "k2", TA_STRING("v2"), "k3", TA_STRING("v3"), "k4", TA_STRING("v4")
#ifdef __cplusplus
#ifndef NTRACE
#define TEST_SUITE event_tests_cpp
#else
#define TEST_SUITE event_tests_cpp_ntrace
#endif // NTRACE
#else
#if defined(NTRACE)
#define TEST_SUITE event_tests_c_ntrace
#elif defined(NO_OPTIM)
#define TEST_SUITE event_tests_c_no_optim
#else
#define TEST_SUITE event_tests_c
#endif // NTRACE
#endif // __cplusplus
TEST(TEST_SUITE, test_enabled) {
BEGIN_TRACE_TEST;
EXPECT_FALSE(TRACE_ENABLED(), "");
fixture_initialize_and_start_tracing();
#ifndef NTRACE
EXPECT_TRUE(TRACE_ENABLED(), "");
#else
EXPECT_FALSE(TRACE_ENABLED(), "");
#endif // NTRACE
fixture_stop_and_terminate_tracing();
EXPECT_FALSE(TRACE_ENABLED(), "");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_category_enabled) {
BEGIN_TRACE_TEST;
EXPECT_FALSE(TRACE_CATEGORY_ENABLED("+enabled"), "");
EXPECT_FALSE(TRACE_CATEGORY_ENABLED("-disabled"), "");
EXPECT_FALSE(TRACE_CATEGORY_ENABLED(""), "");
fixture_initialize_and_start_tracing();
#ifndef NTRACE
EXPECT_TRUE(TRACE_CATEGORY_ENABLED("+enabled"), "");
EXPECT_FALSE(TRACE_CATEGORY_ENABLED("-disabled"), "");
EXPECT_FALSE(TRACE_CATEGORY_ENABLED(""), "");
#else
EXPECT_FALSE(TRACE_CATEGORY_ENABLED("+enabled"), "");
EXPECT_FALSE(TRACE_CATEGORY_ENABLED("-disabled"), "");
EXPECT_FALSE(TRACE_CATEGORY_ENABLED(""), "");
#endif // NTRACE
fixture_stop_and_terminate_tracing();
EXPECT_FALSE(TRACE_CATEGORY_ENABLED("+enabled"), "");
EXPECT_FALSE(TRACE_CATEGORY_ENABLED("-disabled"), "");
EXPECT_FALSE(TRACE_CATEGORY_ENABLED(""), "");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_trace_nonce) {
BEGIN_TRACE_TEST;
// Note: TRACE_NONCE() still returns unique values when NTRACE is defined
// since nonces are available even when tracing is disabled.
uint64_t nonce1 = TRACE_NONCE();
EXPECT_NE(0u, nonce1, "nonce is never 0");
uint64_t nonce2 = TRACE_NONCE();
EXPECT_NE(0u, nonce1, "nonce is never 0");
EXPECT_NE(nonce1, nonce2, "nonce is unique");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_instant) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_INSTANT("+enabled", "name", TRACE_SCOPE_GLOBAL);
TRACE_INSTANT("+enabled", "name", TRACE_SCOPE_PROCESS);
TRACE_INSTANT("+enabled", "name", TRACE_SCOPE_THREAD);
TRACE_INSTANT("+enabled", "name", TRACE_SCOPE_THREAD, STR_ARGS1);
TRACE_INSTANT("+enabled", "name", TRACE_SCOPE_THREAD, STR_ARGS4);
TRACE_INSTANT("-disabled", "name", TRACE_SCOPE_THREAD);
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", Instant(scope: global), {})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", Instant(scope: process), {})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", Instant(scope: thread), {})\n\
String(index: 4, \"k1\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", Instant(scope: thread), {k1: string(\"v1\")})\n\
String(index: 5, \"k2\")\n\
String(index: 6, \"k3\")\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", Instant(scope: thread), {k1: string(\"v1\"), k2: string(\"v2\"), k3: string(\"v3\"), k4: string(\"v4\")})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_counter) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_COUNTER("+enabled", "name", 1u, I32_ARGS1);
TRACE_COUNTER("+enabled", "name", 1u, I32_ARGS4);
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"k1\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", Counter(id: 1), {k1: int32(1)})\n\
String(index: 5, \"k2\")\n\
String(index: 6, \"k3\")\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", Counter(id: 1), {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4)})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_duration) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
{
TRACE_DURATION("+enabled", "name");
TRACE_DURATION("+enabled", "name", STR_ARGS1);
TRACE_DURATION("+enabled", "name", STR_ARGS4);
} // complete duration events are written when the scope exits
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"k1\")\n\
String(index: 5, \"k2\")\n\
String(index: 6, \"k3\")\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationComplete(end_ts: <>), {k1: string(\"v1\"), k2: string(\"v2\"), k3: string(\"v3\"), k4: string(\"v4\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationComplete(end_ts: <>), {k1: string(\"v1\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationComplete(end_ts: <>), {})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_duration_begin) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name");
TRACE_DURATION_BEGIN("+enabled", "name", STR_ARGS1);
TRACE_DURATION_BEGIN("+enabled", "name", STR_ARGS4);
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {})\n\
String(index: 4, \"k1\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: string(\"v1\")})\n\
String(index: 5, \"k2\")\n\
String(index: 6, \"k3\")\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: string(\"v1\"), k2: string(\"v2\"), k3: string(\"v3\"), k4: string(\"v4\")})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_duration_end) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_DURATION_END("+enabled", "name");
TRACE_DURATION_END("+enabled", "name", STR_ARGS1);
TRACE_DURATION_END("+enabled", "name", STR_ARGS4);
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationEnd, {})\n\
String(index: 4, \"k1\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationEnd, {k1: string(\"v1\")})\n\
String(index: 5, \"k2\")\n\
String(index: 6, \"k3\")\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationEnd, {k1: string(\"v1\"), k2: string(\"v2\"), k3: string(\"v3\"), k4: string(\"v4\")})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_async_begin) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_ASYNC_BEGIN("+enabled", "name", 1u);
TRACE_ASYNC_BEGIN("+enabled", "name", 1u, STR_ARGS1);
TRACE_ASYNC_BEGIN("+enabled", "name", 1u, STR_ARGS4);
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", AsyncBegin(id: 1), {})\n\
String(index: 4, \"k1\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", AsyncBegin(id: 1), {k1: string(\"v1\")})\n\
String(index: 5, \"k2\")\n\
String(index: 6, \"k3\")\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", AsyncBegin(id: 1), {k1: string(\"v1\"), k2: string(\"v2\"), k3: string(\"v3\"), k4: string(\"v4\")})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_async_instant) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_ASYNC_INSTANT("+enabled", "name", 1u);
TRACE_ASYNC_INSTANT("+enabled", "name", 1u, STR_ARGS1);
TRACE_ASYNC_INSTANT("+enabled", "name", 1u, STR_ARGS4);
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", AsyncInstant(id: 1), {})\n\
String(index: 4, \"k1\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", AsyncInstant(id: 1), {k1: string(\"v1\")})\n\
String(index: 5, \"k2\")\n\
String(index: 6, \"k3\")\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", AsyncInstant(id: 1), {k1: string(\"v1\"), k2: string(\"v2\"), k3: string(\"v3\"), k4: string(\"v4\")})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_async_end) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_ASYNC_END("+enabled", "name", 1u);
TRACE_ASYNC_END("+enabled", "name", 1u, STR_ARGS1);
TRACE_ASYNC_END("+enabled", "name", 1u, STR_ARGS4);
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", AsyncEnd(id: 1), {})\n\
String(index: 4, \"k1\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", AsyncEnd(id: 1), {k1: string(\"v1\")})\n\
String(index: 5, \"k2\")\n\
String(index: 6, \"k3\")\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", AsyncEnd(id: 1), {k1: string(\"v1\"), k2: string(\"v2\"), k3: string(\"v3\"), k4: string(\"v4\")})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_flow_begin) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_FLOW_BEGIN("+enabled", "name", 1u);
TRACE_FLOW_BEGIN("+enabled", "name", 1u, STR_ARGS1);
TRACE_FLOW_BEGIN("+enabled", "name", 1u, STR_ARGS4);
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", FlowBegin(id: 1), {})\n\
String(index: 4, \"k1\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", FlowBegin(id: 1), {k1: string(\"v1\")})\n\
String(index: 5, \"k2\")\n\
String(index: 6, \"k3\")\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", FlowBegin(id: 1), {k1: string(\"v1\"), k2: string(\"v2\"), k3: string(\"v3\"), k4: string(\"v4\")})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_flow_step) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_FLOW_STEP("+enabled", "name", 1u);
TRACE_FLOW_STEP("+enabled", "name", 1u, STR_ARGS1);
TRACE_FLOW_STEP("+enabled", "name", 1u, STR_ARGS4);
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", FlowStep(id: 1), {})\n\
String(index: 4, \"k1\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", FlowStep(id: 1), {k1: string(\"v1\")})\n\
String(index: 5, \"k2\")\n\
String(index: 6, \"k3\")\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", FlowStep(id: 1), {k1: string(\"v1\"), k2: string(\"v2\"), k3: string(\"v3\"), k4: string(\"v4\")})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_flow_end) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_FLOW_END("+enabled", "name", 1u);
TRACE_FLOW_END("+enabled", "name", 1u, STR_ARGS1);
TRACE_FLOW_END("+enabled", "name", 1u, STR_ARGS4);
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", FlowEnd(id: 1), {})\n\
String(index: 4, \"k1\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", FlowEnd(id: 1), {k1: string(\"v1\")})\n\
String(index: 5, \"k2\")\n\
String(index: 6, \"k3\")\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", FlowEnd(id: 1), {k1: string(\"v1\"), k2: string(\"v2\"), k3: string(\"v3\"), k4: string(\"v4\")})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_kernel_object) {
BEGIN_TRACE_TEST;
zx_handle_t event;
zx_event_create(0u, &event);
fixture_initialize_and_start_tracing();
TRACE_KERNEL_OBJECT(event);
TRACE_KERNEL_OBJECT(event, STR_ARGS1);
TRACE_KERNEL_OBJECT(event, STR_ARGS4);
ASSERT_RECORDS(
"\
KernelObject(koid: <>, type: event, name: \"\", {})\n\
String(index: 1, \"k1\")\n\
KernelObject(koid: <>, type: event, name: \"\", {k1: string(\"v1\")})\n\
String(index: 2, \"k2\")\n\
String(index: 3, \"k3\")\n\
String(index: 4, \"k4\")\n\
KernelObject(koid: <>, type: event, name: \"\", {k1: string(\"v1\"), k2: string(\"v2\"), k3: string(\"v3\"), k4: string(\"v4\")})\n\
",
"");
zx_handle_close(event);
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_null_arguments) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_NULL());
#ifdef __cplusplus
TRACE_DURATION_BEGIN("+enabled", "name", "key", nullptr);
#endif // __cplusplus
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: null})\n\
",
"\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: null})\n\
");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_bool_arguments) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_BOOL(true));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_BOOL(false));
#ifdef __cplusplus
TRACE_DURATION_BEGIN("+enabled", "name", "key", true);
TRACE_DURATION_BEGIN("+enabled", "name", "key", false);
#endif // __cplusplus
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: bool(true)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: bool(false)})\n\
",
"\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: bool(true)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: bool(false)})\n\
");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_int32_arguments) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_INT32(INT32_MIN));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_INT32(0));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_INT32(INT32_MAX));
#ifdef __cplusplus
TRACE_DURATION_BEGIN("+enabled", "name", "key", int8_t(INT8_MIN));
TRACE_DURATION_BEGIN("+enabled", "name", "key", int8_t(0));
TRACE_DURATION_BEGIN("+enabled", "name", "key", int8_t(INT8_MAX));
TRACE_DURATION_BEGIN("+enabled", "name", "key", int16_t(INT16_MIN));
TRACE_DURATION_BEGIN("+enabled", "name", "key", int16_t(0));
TRACE_DURATION_BEGIN("+enabled", "name", "key", int16_t(INT16_MAX));
TRACE_DURATION_BEGIN("+enabled", "name", "key", int32_t(INT32_MIN));
TRACE_DURATION_BEGIN("+enabled", "name", "key", int32_t(0));
TRACE_DURATION_BEGIN("+enabled", "name", "key", int32_t(INT32_MAX));
#endif // __cplusplus
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(-2147483648)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(2147483647)})\n\
",
"\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(-128)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(127)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(-32768)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(32767)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(-2147483648)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(2147483647)})\n\
");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_uint32_arguments) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_UINT32(0));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_UINT32(UINT32_MAX));
#ifdef __cplusplus
TRACE_DURATION_BEGIN("+enabled", "name", "key", uint8_t(0));
TRACE_DURATION_BEGIN("+enabled", "name", "key", uint8_t(UINT8_MAX));
TRACE_DURATION_BEGIN("+enabled", "name", "key", uint16_t(0));
TRACE_DURATION_BEGIN("+enabled", "name", "key", uint16_t(UINT16_MAX));
TRACE_DURATION_BEGIN("+enabled", "name", "key", uint32_t(0));
TRACE_DURATION_BEGIN("+enabled", "name", "key", uint32_t(UINT32_MAX));
#endif // __cplusplus
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(4294967295)})\n\
",
"\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(255)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(65535)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(4294967295)})\n\
");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_int64_arguments) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_INT64(INT64_MIN));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_INT64(0));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_INT64(INT64_MAX));
#ifdef __cplusplus
TRACE_DURATION_BEGIN("+enabled", "name", "key", int64_t(INT64_MIN));
TRACE_DURATION_BEGIN("+enabled", "name", "key", int64_t(0));
TRACE_DURATION_BEGIN("+enabled", "name", "key", int64_t(INT64_MAX));
#endif // __cplusplus
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int64(-9223372036854775808)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int64(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int64(9223372036854775807)})\n\
",
"\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int64(-9223372036854775808)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int64(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int64(9223372036854775807)})\n\
");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_uint64_arguments) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_UINT64(0));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_UINT64(UINT64_MAX));
#ifdef __cplusplus
TRACE_DURATION_BEGIN("+enabled", "name", "key", uint64_t(0));
TRACE_DURATION_BEGIN("+enabled", "name", "key", uint64_t(UINT64_MAX));
#endif // __cplusplus
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint64(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint64(18446744073709551615)})\n\
",
"\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint64(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint64(18446744073709551615)})\n\
");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_enum_arguments) {
BEGIN_TRACE_TEST;
#ifdef __cplusplus
enum Int8Enum : int8_t { kInt8_Min = INT8_MIN, kInt8_Zero = 0, kInt8_Max = INT8_MAX };
enum Uint8Enum : uint8_t { kUint8_Zero = 0, kUint8_Max = UINT8_MAX };
enum Int16Enum : int16_t { kInt16_Min = INT16_MIN, kInt16_Zero = 0, kInt16_Max = INT16_MAX };
enum Uint16Enum : uint16_t { kUint16_Zero = 0, kUint16_Max = UINT16_MAX };
enum Int32Enum : int32_t { kInt32_Min = INT32_MIN, kInt32_Zero = 0, kInt32_Max = INT32_MAX };
enum Uint32Enum : uint32_t { kUint32_Zero = 0, kUint32_Max = UINT32_MAX };
enum Int64Enum : int64_t { kInt64_Min = INT64_MIN, kInt64_Zero = 0, kInt64_Max = INT64_MAX };
enum Uint64Enum : uint64_t { kUint64_Zero = 0, kUint64_Max = UINT64_MAX };
#else
enum Int32Enum { kInt32_Min = INT32_MIN, kInt32_Zero = 0, kInt32_Max = INT32_MAX };
enum Uint32Enum { kUint32_Zero = 0, kUint32_Max = UINT32_MAX };
enum Int64Enum { kInt64_Min = INT64_MIN, kInt64_Zero = 0, kInt64_Max = INT64_MAX };
enum Uint64Enum { kUint64_Zero = 0, kUint64_Max = UINT64_MAX };
#endif // __cplusplus
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_INT32(kInt32_Min));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_INT32(kInt32_Zero));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_INT32(kInt32_Max));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_UINT32(kUint32_Zero));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_UINT32(kUint32_Max));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_INT64(kInt64_Min));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_INT64(kInt64_Zero));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_INT64(kInt64_Max));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_UINT64(kUint64_Zero));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_UINT64(kUint64_Max));
#ifdef __cplusplus
TRACE_DURATION_BEGIN("+enabled", "name", "key", kInt8_Min);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kInt8_Zero);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kInt8_Max);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kUint8_Zero);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kUint8_Max);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kInt16_Min);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kInt16_Zero);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kInt16_Max);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kUint16_Zero);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kUint16_Max);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kInt32_Min);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kInt32_Zero);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kInt32_Max);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kUint32_Zero);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kUint32_Max);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kInt64_Min);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kInt64_Zero);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kInt64_Max);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kUint64_Zero);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kUint64_Max);
#endif // __cplusplus
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(-2147483648)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(2147483647)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(4294967295)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int64(-9223372036854775808)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int64(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int64(9223372036854775807)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint64(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint64(18446744073709551615)})\n\
",
"\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(-128)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(127)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(255)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(-32768)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(32767)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(65535)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(-2147483648)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int32(2147483647)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint32(4294967295)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int64(-9223372036854775808)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int64(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: int64(9223372036854775807)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint64(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: uint64(18446744073709551615)})\n\
");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_double_arguments) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_DOUBLE(1.f));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_DOUBLE(1.));
#ifdef __cplusplus
TRACE_DURATION_BEGIN("+enabled", "name", "key", 1.f);
TRACE_DURATION_BEGIN("+enabled", "name", "key", 1.);
#endif // __cplusplus
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: double(1.000000)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: double(1.000000)})\n\
",
"\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: double(1.000000)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: double(1.000000)})\n\
");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_char_array_arguments) {
BEGIN_TRACE_TEST;
char kCharArray[] = "char[n]...";
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_CHAR_ARRAY(NULL, 0u));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_CHAR_ARRAY("", 0u));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_CHAR_ARRAY("literal", 7u));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_CHAR_ARRAY(kCharArray, 7u));
#ifdef __cplusplus
TRACE_DURATION_BEGIN("+enabled", "name", "key", kCharArray);
#endif // __cplusplus
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"literal\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"char[n]\")})\n\
",
"\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"char[n]...\")})\n\
");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_string_arguments) {
BEGIN_TRACE_TEST;
char string[5] = {'?', '2', '3', '4', '\0'};
string[0] = '1';
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_STRING(NULL));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_STRING(""));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_STRING("literal"));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_STRING(string));
#ifdef __cplusplus
static const char nonterminated[5] = {'1', '2', '3', '4', '5'};
TRACE_DURATION_BEGIN("+enabled", "name", "key", (const char*)nullptr);
TRACE_DURATION_BEGIN("+enabled", "name", "key", "");
TRACE_DURATION_BEGIN("+enabled", "name", "key", "literal");
TRACE_DURATION_BEGIN("+enabled", "name", "key", string);
TRACE_DURATION_BEGIN("+enabled", "name", "key", nonterminated);
TRACE_DURATION_BEGIN("+enabled", "name", "key", fbl::String("dynamic string"));
TRACE_DURATION_BEGIN("+enabled", "name", "key", std::string_view("piece", 3u));
TRACE_DURATION_BEGIN("+enabled", "name", "key", nonterminated);
#endif // __cplusplus
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"literal\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"1234\")})\n\
",
"\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"literal\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"1234\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"12345\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"dynamic string\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"pie\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"12345\")})\n\
");
END_TRACE_TEST;
}
// This function is kept pending resolution of https://fxbug.dev/42096957 when TA_STRING_LITERAL()
// is re-added.
TEST(TEST_SUITE, test_string_literal_arguments) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_STRING(NULL));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_STRING(""));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_STRING("literal"));
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"\")})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: string(\"literal\")})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_pointer_arguments) {
BEGIN_TRACE_TEST;
void* kNull = NULL;
const void* kConstNull = NULL;
volatile void* kVolatileNull = NULL;
const volatile void* kConstVolatileNull = NULL;
void* kPtr = &kNull;
const void* kConstPtr = &kNull;
volatile void* kVolatilePtr = &kNull;
const volatile void* kConstVolatilePtr = &kNull;
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_POINTER(kNull));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_POINTER(kConstNull));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_POINTER(kVolatileNull));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_POINTER(kConstVolatileNull));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_POINTER(kPtr));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_POINTER(kConstPtr));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_POINTER(kVolatilePtr));
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_POINTER(kConstVolatilePtr));
#ifdef __cplusplus
TRACE_DURATION_BEGIN("+enabled", "name", "key", kNull);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kConstNull);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kVolatileNull);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kConstVolatileNull);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kPtr);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kConstPtr);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kVolatilePtr);
TRACE_DURATION_BEGIN("+enabled", "name", "key", kConstVolatilePtr);
#endif // __cplusplus
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(<>)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(<>)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(<>)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(<>)})\n\
",
"\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(0)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(<>)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(<>)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(<>)})\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: pointer(<>)})\n\
");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_koid_arguments) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
TRACE_DURATION_BEGIN("+enabled", "name", "key", TA_KOID(42u));
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
String(index: 4, \"key\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {key: koid(<>)})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_all_argument_counts) {
BEGIN_TRACE_TEST;
fixture_initialize_and_start_tracing();
#define FN(n) TRACE_DURATION_BEGIN("+enabled", "name", I32_ARGS##n);
ALL15(FN)
#undef FN
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {})\n\
String(index: 4, \"k1\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1)})\n\
String(index: 5, \"k2\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2)})\n\
String(index: 6, \"k3\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3)})\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4)})\n\
String(index: 8, \"k5\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4), k5: int32(5)})\n\
String(index: 9, \"k6\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4), k5: int32(5), k6: int32(6)})\n\
String(index: 10, \"k7\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4), k5: int32(5), k6: int32(6), k7: int32(7)})\n\
String(index: 11, \"k8\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4), k5: int32(5), k6: int32(6), k7: int32(7), k8: int32(8)})\n\
String(index: 12, \"k9\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4), k5: int32(5), k6: int32(6), k7: int32(7), k8: int32(8), k9: int32(9)})\n\
String(index: 13, \"k10\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4), k5: int32(5), k6: int32(6), k7: int32(7), k8: int32(8), k9: int32(9), k10: int32(10)})\n\
String(index: 14, \"k11\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4), k5: int32(5), k6: int32(6), k7: int32(7), k8: int32(8), k9: int32(9), k10: int32(10), k11: int32(11)})\n\
String(index: 15, \"k12\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4), k5: int32(5), k6: int32(6), k7: int32(7), k8: int32(8), k9: int32(9), k10: int32(10), k11: int32(11), k12: int32(12)})\n\
String(index: 16, \"k13\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4), k5: int32(5), k6: int32(6), k7: int32(7), k8: int32(8), k9: int32(9), k10: int32(10), k11: int32(11), k12: int32(12), k13: int32(13)})\n\
String(index: 17, \"k14\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4), k5: int32(5), k6: int32(6), k7: int32(7), k8: int32(8), k9: int32(9), k10: int32(10), k11: int32(11), k12: int32(12), k13: int32(13), k14: int32(14)})\n\
String(index: 18, \"k15\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: int32(1), k2: int32(2), k3: int32(3), k4: int32(4), k5: int32(5), k6: int32(6), k7: int32(7), k8: int32(8), k9: int32(9), k10: int32(10), k11: int32(11), k12: int32(12), k13: int32(13), k14: int32(14), k15: int32(15)})\n\
",
"");
END_TRACE_TEST;
}
TEST(TEST_SUITE, test_declare_args) {
BEGIN_TRACE_TEST;
#ifndef NTRACE
fixture_initialize_and_start_tracing();
trace_thread_ref_t thread_ref;
trace_string_ref_t category_ref;
trace_string_ref_t name_ref;
size_t num_args;
trace_context_t* context = trace_acquire_context_for_category("+enabled", &category_ref);
ASSERT_NOT_NULL(context, "");
trace_context_register_current_thread(context, &thread_ref);
trace_context_register_string_literal(context, "name", &name_ref);
num_args = 0;
TRACE_DECLARE_ARGS(context, args0);
ASSERT_EQ(TRACE_NUM_ARGS(args0), num_args, "");
TRACE_COMPLETE_ARGS(context, args0, num_args);
trace_context_write_duration_begin_event_record(context, zx_ticks_get(), &thread_ref,
&category_ref, &name_ref, args0, num_args);
num_args = 1;
TRACE_DECLARE_ARGS(context, args1, STR_ARGS1);
ASSERT_EQ(TRACE_NUM_ARGS(args1), num_args, "");
TRACE_COMPLETE_ARGS(context, args1, num_args);
trace_context_write_duration_begin_event_record(context, zx_ticks_get(), &thread_ref,
&category_ref, &name_ref, args1, num_args);
num_args = 4;
TRACE_DECLARE_ARGS(context, args4, STR_ARGS4);
ASSERT_EQ(TRACE_NUM_ARGS(args4), num_args, "");
TRACE_COMPLETE_ARGS(context, args4, num_args);
trace_context_write_duration_begin_event_record(context, zx_ticks_get(), &thread_ref,
&category_ref, &name_ref, args4, num_args);
trace_release_context(context);
ASSERT_RECORDS(
"\
String(index: 1, \"+enabled\")\n\
String(index: 2, \"process\")\n\
KernelObject(koid: <>, type: thread, name: \"initial-thread\", {process: koid(<>)})\n\
Thread(index: 1, <>)\n\
String(index: 3, \"name\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {})\n\
String(index: 4, \"k1\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: string(\"v1\")})\n\
String(index: 5, \"k2\")\n\
String(index: 6, \"k3\")\n\
String(index: 7, \"k4\")\n\
Event(ts: <>, pt: <>, category: \"+enabled\", name: \"name\", DurationBegin, {k1: string(\"v1\"), k2: string(\"v2\"), k3: string(\"v3\"), k4: string(\"v4\")})\n\
",
"");
#endif // !NTRACE
END_TRACE_TEST;
}
#undef TEST_SUITE
#endif // ZIRCON_SYSTEM_UTEST_TRACE_EVENT_TESTS_COMMON_H_