xref: /dpdk/app/test/test_trace.c (revision e7bc451c996b5882c5d8267725f3d88118009c75)
19247e71dSSunil Kumar Kori /* SPDX-License-Identifier: BSD-3-Clause
29247e71dSSunil Kumar Kori  * Copyright(C) 2020 Marvell International Ltd.
39247e71dSSunil Kumar Kori  */
49247e71dSSunil Kumar Kori 
59247e71dSSunil Kumar Kori #include <rte_eal_trace.h>
69247e71dSSunil Kumar Kori #include <rte_lcore.h>
74925e15aSAnkur Dwivedi #include <rte_random.h>
89247e71dSSunil Kumar Kori #include <rte_trace.h>
99247e71dSSunil Kumar Kori 
109247e71dSSunil Kumar Kori #include "test.h"
119247e71dSSunil Kumar Kori #include "test_trace.h"
129247e71dSSunil Kumar Kori 
13d6fd5a01SDavid Marchand int app_dpdk_test_tp_count;
14d6fd5a01SDavid Marchand 
153c60274cSJie Zhou #ifdef RTE_EXEC_ENV_WINDOWS
163c60274cSJie Zhou 
173c60274cSJie Zhou static int
183c60274cSJie Zhou test_trace(void)
193c60274cSJie Zhou {
203c60274cSJie Zhou 	printf("trace not supported on Windows, skipping test\n");
213c60274cSJie Zhou 	return TEST_SKIPPED;
223c60274cSJie Zhou }
233c60274cSJie Zhou 
243c60274cSJie Zhou #else
253c60274cSJie Zhou 
269247e71dSSunil Kumar Kori static int32_t
279247e71dSSunil Kumar Kori test_trace_point_globbing(void)
289247e71dSSunil Kumar Kori {
299247e71dSSunil Kumar Kori 	int rc;
309247e71dSSunil Kumar Kori 
319247e71dSSunil Kumar Kori 	rc = rte_trace_pattern("app.dpdk.test*", false);
329247e71dSSunil Kumar Kori 	if (rc != 1)
339247e71dSSunil Kumar Kori 		goto failed;
349247e71dSSunil Kumar Kori 
359247e71dSSunil Kumar Kori 	if (rte_trace_point_is_enabled(&__app_dpdk_test_tp))
369247e71dSSunil Kumar Kori 		goto failed;
379247e71dSSunil Kumar Kori 
389247e71dSSunil Kumar Kori 	rc = rte_trace_pattern("app.dpdk.test*", true);
399247e71dSSunil Kumar Kori 	if (rc != 1)
409247e71dSSunil Kumar Kori 		goto failed;
419247e71dSSunil Kumar Kori 
429247e71dSSunil Kumar Kori 	if (!rte_trace_point_is_enabled(&__app_dpdk_test_tp))
439247e71dSSunil Kumar Kori 		goto failed;
449247e71dSSunil Kumar Kori 
459247e71dSSunil Kumar Kori 	rc = rte_trace_pattern("invalid_testpoint.*", true);
469247e71dSSunil Kumar Kori 	if (rc != 0)
479247e71dSSunil Kumar Kori 		goto failed;
489247e71dSSunil Kumar Kori 
499247e71dSSunil Kumar Kori 	return TEST_SUCCESS;
509247e71dSSunil Kumar Kori 
519247e71dSSunil Kumar Kori failed:
529247e71dSSunil Kumar Kori 	return TEST_FAILED;
539247e71dSSunil Kumar Kori }
549247e71dSSunil Kumar Kori 
559247e71dSSunil Kumar Kori static int32_t
569247e71dSSunil Kumar Kori test_trace_point_regex(void)
579247e71dSSunil Kumar Kori {
589247e71dSSunil Kumar Kori 	int rc;
599247e71dSSunil Kumar Kori 
609247e71dSSunil Kumar Kori 	rc = rte_trace_regexp("app.dpdk.test*", false);
619247e71dSSunil Kumar Kori 	if (rc != 1)
629247e71dSSunil Kumar Kori 		goto failed;
639247e71dSSunil Kumar Kori 
649247e71dSSunil Kumar Kori 	if (rte_trace_point_is_enabled(&__app_dpdk_test_tp))
659247e71dSSunil Kumar Kori 		goto failed;
669247e71dSSunil Kumar Kori 
679247e71dSSunil Kumar Kori 	rc = rte_trace_regexp("app.dpdk.test*", true);
689247e71dSSunil Kumar Kori 	if (rc != 1)
699247e71dSSunil Kumar Kori 		goto failed;
709247e71dSSunil Kumar Kori 
719247e71dSSunil Kumar Kori 	if (!rte_trace_point_is_enabled(&__app_dpdk_test_tp))
729247e71dSSunil Kumar Kori 		goto failed;
739247e71dSSunil Kumar Kori 
749247e71dSSunil Kumar Kori 	rc = rte_trace_regexp("invalid_testpoint.*", true);
759247e71dSSunil Kumar Kori 	if (rc != 0)
769247e71dSSunil Kumar Kori 		goto failed;
779247e71dSSunil Kumar Kori 
789247e71dSSunil Kumar Kori 	return TEST_SUCCESS;
799247e71dSSunil Kumar Kori 
809247e71dSSunil Kumar Kori failed:
819247e71dSSunil Kumar Kori 	return TEST_FAILED;
829247e71dSSunil Kumar Kori }
839247e71dSSunil Kumar Kori 
849247e71dSSunil Kumar Kori static int32_t
859247e71dSSunil Kumar Kori test_trace_point_disable_enable(void)
869247e71dSSunil Kumar Kori {
87d6fd5a01SDavid Marchand 	int expected;
889247e71dSSunil Kumar Kori 	int rc;
899247e71dSSunil Kumar Kori 
90d6fd5a01SDavid Marchand 	/* At tp registration, the associated counter increases once. */
91d6fd5a01SDavid Marchand 	expected = 1;
92d6fd5a01SDavid Marchand 	TEST_ASSERT_EQUAL(app_dpdk_test_tp_count, expected,
93d6fd5a01SDavid Marchand 		"Expecting %d, but got %d for app_dpdk_test_tp_count",
94d6fd5a01SDavid Marchand 		expected, app_dpdk_test_tp_count);
95d6fd5a01SDavid Marchand 
969247e71dSSunil Kumar Kori 	rc = rte_trace_point_disable(&__app_dpdk_test_tp);
979247e71dSSunil Kumar Kori 	if (rc < 0)
989247e71dSSunil Kumar Kori 		goto failed;
999247e71dSSunil Kumar Kori 
1009247e71dSSunil Kumar Kori 	if (rte_trace_point_is_enabled(&__app_dpdk_test_tp))
1019247e71dSSunil Kumar Kori 		goto failed;
1029247e71dSSunil Kumar Kori 
103d6fd5a01SDavid Marchand 	/* No emission expected */
104d6fd5a01SDavid Marchand 	app_dpdk_test_tp("app.dpdk.test.tp");
105d6fd5a01SDavid Marchand 	TEST_ASSERT_EQUAL(app_dpdk_test_tp_count, expected,
106d6fd5a01SDavid Marchand 		"Expecting %d, but got %d for app_dpdk_test_tp_count",
107d6fd5a01SDavid Marchand 		expected, app_dpdk_test_tp_count);
108d6fd5a01SDavid Marchand 
1099247e71dSSunil Kumar Kori 	rc = rte_trace_point_enable(&__app_dpdk_test_tp);
1109247e71dSSunil Kumar Kori 	if (rc < 0)
1119247e71dSSunil Kumar Kori 		goto failed;
1129247e71dSSunil Kumar Kori 
1139247e71dSSunil Kumar Kori 	if (!rte_trace_point_is_enabled(&__app_dpdk_test_tp))
1149247e71dSSunil Kumar Kori 		goto failed;
1159247e71dSSunil Kumar Kori 
1169247e71dSSunil Kumar Kori 	/* Emit the trace */
1179247e71dSSunil Kumar Kori 	app_dpdk_test_tp("app.dpdk.test.tp");
118d6fd5a01SDavid Marchand 	expected++;
119d6fd5a01SDavid Marchand 	TEST_ASSERT_EQUAL(app_dpdk_test_tp_count, expected,
120d6fd5a01SDavid Marchand 		"Expecting %d, but got %d for app_dpdk_test_tp_count",
121d6fd5a01SDavid Marchand 		expected, app_dpdk_test_tp_count);
122d6fd5a01SDavid Marchand 
1239247e71dSSunil Kumar Kori 	return TEST_SUCCESS;
1249247e71dSSunil Kumar Kori 
1259247e71dSSunil Kumar Kori failed:
1269247e71dSSunil Kumar Kori 	return TEST_FAILED;
1279247e71dSSunil Kumar Kori }
1289247e71dSSunil Kumar Kori 
1299247e71dSSunil Kumar Kori static int
1309247e71dSSunil Kumar Kori test_trace_mode(void)
1319247e71dSSunil Kumar Kori {
1329247e71dSSunil Kumar Kori 	enum rte_trace_mode current;
1339247e71dSSunil Kumar Kori 
1349247e71dSSunil Kumar Kori 	current = rte_trace_mode_get();
1359247e71dSSunil Kumar Kori 
1369247e71dSSunil Kumar Kori 	rte_trace_mode_set(RTE_TRACE_MODE_DISCARD);
1379247e71dSSunil Kumar Kori 	if (rte_trace_mode_get() != RTE_TRACE_MODE_DISCARD)
1389247e71dSSunil Kumar Kori 		goto failed;
1399247e71dSSunil Kumar Kori 
1409247e71dSSunil Kumar Kori 	rte_trace_mode_set(RTE_TRACE_MODE_OVERWRITE);
1419247e71dSSunil Kumar Kori 	if (rte_trace_mode_get() != RTE_TRACE_MODE_OVERWRITE)
1429247e71dSSunil Kumar Kori 		goto failed;
1439247e71dSSunil Kumar Kori 
1449247e71dSSunil Kumar Kori 	rte_trace_mode_set(current);
1459247e71dSSunil Kumar Kori 	return TEST_SUCCESS;
1469247e71dSSunil Kumar Kori 
1479247e71dSSunil Kumar Kori failed:
1489247e71dSSunil Kumar Kori 	return TEST_FAILED;
1499247e71dSSunil Kumar Kori 
1509247e71dSSunil Kumar Kori }
1519247e71dSSunil Kumar Kori 
1529247e71dSSunil Kumar Kori static int
1539247e71dSSunil Kumar Kori test_trace_points_lookup(void)
1549247e71dSSunil Kumar Kori {
1559247e71dSSunil Kumar Kori 	rte_trace_point_t *trace;
1569247e71dSSunil Kumar Kori 
1579247e71dSSunil Kumar Kori 	trace =  rte_trace_point_lookup("app.dpdk.test.tp");
1589247e71dSSunil Kumar Kori 	if (trace == NULL)
1599247e71dSSunil Kumar Kori 		goto fail;
1609247e71dSSunil Kumar Kori 	trace = rte_trace_point_lookup("this_trace_point_does_not_exist");
1619247e71dSSunil Kumar Kori 	if (trace != NULL)
1629247e71dSSunil Kumar Kori 		goto fail;
1639247e71dSSunil Kumar Kori 
1649247e71dSSunil Kumar Kori 	return TEST_SUCCESS;
1659247e71dSSunil Kumar Kori fail:
1669247e71dSSunil Kumar Kori 	return TEST_FAILED;
1679247e71dSSunil Kumar Kori }
1689247e71dSSunil Kumar Kori 
1699247e71dSSunil Kumar Kori static int
1709247e71dSSunil Kumar Kori test_fp_trace_points(void)
1719247e71dSSunil Kumar Kori {
1729247e71dSSunil Kumar Kori 	/* Emit the FP trace */
1739247e71dSSunil Kumar Kori 	app_dpdk_test_fp();
1749247e71dSSunil Kumar Kori 
1759247e71dSSunil Kumar Kori 	return TEST_SUCCESS;
1769247e71dSSunil Kumar Kori }
1779247e71dSSunil Kumar Kori 
1789247e71dSSunil Kumar Kori static int
1799247e71dSSunil Kumar Kori test_generic_trace_points(void)
1809247e71dSSunil Kumar Kori {
1814925e15aSAnkur Dwivedi 	uint8_t arr[RTE_TRACE_BLOB_LEN_MAX];
1829247e71dSSunil Kumar Kori 	int tmp;
1834925e15aSAnkur Dwivedi 	int i;
1844925e15aSAnkur Dwivedi 
1854925e15aSAnkur Dwivedi 	for (i = 0; i < RTE_TRACE_BLOB_LEN_MAX; i++)
1864925e15aSAnkur Dwivedi 		arr[i] = i;
1879247e71dSSunil Kumar Kori 
1889247e71dSSunil Kumar Kori 	rte_eal_trace_generic_void();
1899247e71dSSunil Kumar Kori 	rte_eal_trace_generic_u64(0x10000000000000);
1909247e71dSSunil Kumar Kori 	rte_eal_trace_generic_u32(0x10000000);
1919247e71dSSunil Kumar Kori 	rte_eal_trace_generic_u16(0xffee);
1929247e71dSSunil Kumar Kori 	rte_eal_trace_generic_u8(0xc);
1939247e71dSSunil Kumar Kori 	rte_eal_trace_generic_i64(-1234);
1949247e71dSSunil Kumar Kori 	rte_eal_trace_generic_i32(-1234567);
1959247e71dSSunil Kumar Kori 	rte_eal_trace_generic_i16(12);
1969247e71dSSunil Kumar Kori 	rte_eal_trace_generic_i8(-3);
1979247e71dSSunil Kumar Kori 	rte_eal_trace_generic_int(3333333);
1989247e71dSSunil Kumar Kori 	rte_eal_trace_generic_long(333);
1999247e71dSSunil Kumar Kori 	rte_eal_trace_generic_float(20.45);
2009247e71dSSunil Kumar Kori 	rte_eal_trace_generic_double(20000.5000004);
2019247e71dSSunil Kumar Kori 	rte_eal_trace_generic_ptr(&tmp);
2029247e71dSSunil Kumar Kori 	rte_eal_trace_generic_str("my string");
203ca32fa67SPavan Nikhilesh 	rte_eal_trace_generic_size_t(sizeof(void *));
2044925e15aSAnkur Dwivedi 	rte_eal_trace_generic_blob(arr, 0);
2054925e15aSAnkur Dwivedi 	rte_eal_trace_generic_blob(arr, 17);
2064925e15aSAnkur Dwivedi 	rte_eal_trace_generic_blob(arr, RTE_TRACE_BLOB_LEN_MAX);
2074925e15aSAnkur Dwivedi 	rte_eal_trace_generic_blob(arr, rte_rand() %
2084925e15aSAnkur Dwivedi 					RTE_TRACE_BLOB_LEN_MAX);
2099247e71dSSunil Kumar Kori 	RTE_EAL_TRACE_GENERIC_FUNC;
2109247e71dSSunil Kumar Kori 
2119247e71dSSunil Kumar Kori 	return TEST_SUCCESS;
2129247e71dSSunil Kumar Kori }
2139247e71dSSunil Kumar Kori 
2149247e71dSSunil Kumar Kori static int
2159247e71dSSunil Kumar Kori test_trace_dump(void)
2169247e71dSSunil Kumar Kori {
2179247e71dSSunil Kumar Kori 	rte_trace_dump(stdout);
2189247e71dSSunil Kumar Kori 	return 0;
2199247e71dSSunil Kumar Kori }
2209247e71dSSunil Kumar Kori 
2219247e71dSSunil Kumar Kori static int
2229247e71dSSunil Kumar Kori test_trace_metadata_dump(void)
2239247e71dSSunil Kumar Kori {
2249247e71dSSunil Kumar Kori 	return rte_trace_metadata_dump(stdout);
2259247e71dSSunil Kumar Kori }
2269247e71dSSunil Kumar Kori 
227d4cbbee3SDavid Marchand static struct unit_test_suite trace_tests = {
228d4cbbee3SDavid Marchand 	.suite_name = "trace autotest",
229d4cbbee3SDavid Marchand 	.setup = NULL,
230d4cbbee3SDavid Marchand 	.teardown = NULL,
231d4cbbee3SDavid Marchand 	.unit_test_cases = {
232d4cbbee3SDavid Marchand 		TEST_CASE(test_trace_mode),
233d4cbbee3SDavid Marchand 		TEST_CASE(test_generic_trace_points),
234d4cbbee3SDavid Marchand 		TEST_CASE(test_fp_trace_points),
235d4cbbee3SDavid Marchand 		TEST_CASE(test_trace_point_disable_enable),
236d4cbbee3SDavid Marchand 		TEST_CASE(test_trace_point_globbing),
237d4cbbee3SDavid Marchand 		TEST_CASE(test_trace_point_regex),
238d4cbbee3SDavid Marchand 		TEST_CASE(test_trace_points_lookup),
239d4cbbee3SDavid Marchand 		TEST_CASE(test_trace_dump),
240d4cbbee3SDavid Marchand 		TEST_CASE(test_trace_metadata_dump),
241d4cbbee3SDavid Marchand 		TEST_CASES_END()
242d4cbbee3SDavid Marchand 	}
243d4cbbee3SDavid Marchand };
244d4cbbee3SDavid Marchand 
245d4cbbee3SDavid Marchand static int
246d4cbbee3SDavid Marchand test_trace(void)
247d4cbbee3SDavid Marchand {
248*e7bc451cSMorten Brørup 	if (!rte_trace_feature_is_enabled()) {
249*e7bc451cSMorten Brørup 		printf("Trace omitted at build-time, skipping test\n");
250*e7bc451cSMorten Brørup 		return TEST_SKIPPED;
251*e7bc451cSMorten Brørup 	}
252d4cbbee3SDavid Marchand 	return unit_test_suite_runner(&trace_tests);
253d4cbbee3SDavid Marchand }
254d4cbbee3SDavid Marchand 
2553c60274cSJie Zhou #endif /* !RTE_EXEC_ENV_WINDOWS */
2563c60274cSJie Zhou 
257e0a8442cSBruce Richardson REGISTER_FAST_TEST(trace_autotest, true, true, test_trace);
258