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