1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(C) 2020 Marvell International Ltd. 3 */ 4 5 #include <rte_eal_trace.h> 6 #include <rte_lcore.h> 7 #include <rte_trace.h> 8 9 #include "test.h" 10 #include "test_trace.h" 11 12 #ifdef RTE_EXEC_ENV_WINDOWS 13 14 static int 15 test_trace(void) 16 { 17 printf("trace not supported on Windows, skipping test\n"); 18 return TEST_SKIPPED; 19 } 20 21 static int 22 test_trace_dump(void) 23 { 24 printf("trace_dump not supported on Windows, skipping test\n"); 25 return TEST_SKIPPED; 26 } 27 28 static int 29 test_trace_metadata_dump(void) 30 { 31 printf("trace_metadata_dump not supported on Windows, skipping test\n"); 32 return TEST_SKIPPED; 33 } 34 35 #else 36 37 static int32_t 38 test_trace_point_globbing(void) 39 { 40 int rc; 41 42 rc = rte_trace_pattern("app.dpdk.test*", false); 43 if (rc != 1) 44 goto failed; 45 46 if (rte_trace_point_is_enabled(&__app_dpdk_test_tp)) 47 goto failed; 48 49 rc = rte_trace_pattern("app.dpdk.test*", true); 50 if (rc != 1) 51 goto failed; 52 53 if (!rte_trace_point_is_enabled(&__app_dpdk_test_tp)) 54 goto failed; 55 56 rc = rte_trace_pattern("invalid_testpoint.*", true); 57 if (rc != 0) 58 goto failed; 59 60 return TEST_SUCCESS; 61 62 failed: 63 return TEST_FAILED; 64 } 65 66 static int32_t 67 test_trace_point_regex(void) 68 { 69 int rc; 70 71 rc = rte_trace_regexp("app.dpdk.test*", false); 72 if (rc != 1) 73 goto failed; 74 75 if (rte_trace_point_is_enabled(&__app_dpdk_test_tp)) 76 goto failed; 77 78 rc = rte_trace_regexp("app.dpdk.test*", true); 79 if (rc != 1) 80 goto failed; 81 82 if (!rte_trace_point_is_enabled(&__app_dpdk_test_tp)) 83 goto failed; 84 85 rc = rte_trace_regexp("invalid_testpoint.*", true); 86 if (rc != 0) 87 goto failed; 88 89 return TEST_SUCCESS; 90 91 failed: 92 return TEST_FAILED; 93 } 94 95 static int32_t 96 test_trace_point_disable_enable(void) 97 { 98 int rc; 99 100 rc = rte_trace_point_disable(&__app_dpdk_test_tp); 101 if (rc < 0) 102 goto failed; 103 104 if (rte_trace_point_is_enabled(&__app_dpdk_test_tp)) 105 goto failed; 106 107 rc = rte_trace_point_enable(&__app_dpdk_test_tp); 108 if (rc < 0) 109 goto failed; 110 111 if (!rte_trace_point_is_enabled(&__app_dpdk_test_tp)) 112 goto failed; 113 114 /* Emit the trace */ 115 app_dpdk_test_tp("app.dpdk.test.tp"); 116 return TEST_SUCCESS; 117 118 failed: 119 return TEST_FAILED; 120 } 121 122 static int 123 test_trace_mode(void) 124 { 125 enum rte_trace_mode current; 126 127 current = rte_trace_mode_get(); 128 129 if (!rte_trace_is_enabled()) 130 return TEST_SKIPPED; 131 132 rte_trace_mode_set(RTE_TRACE_MODE_DISCARD); 133 if (rte_trace_mode_get() != RTE_TRACE_MODE_DISCARD) 134 goto failed; 135 136 rte_trace_mode_set(RTE_TRACE_MODE_OVERWRITE); 137 if (rte_trace_mode_get() != RTE_TRACE_MODE_OVERWRITE) 138 goto failed; 139 140 rte_trace_mode_set(current); 141 return TEST_SUCCESS; 142 143 failed: 144 return TEST_FAILED; 145 146 } 147 148 static int 149 test_trace_points_lookup(void) 150 { 151 rte_trace_point_t *trace; 152 153 trace = rte_trace_point_lookup("app.dpdk.test.tp"); 154 if (trace == NULL) 155 goto fail; 156 trace = rte_trace_point_lookup("this_trace_point_does_not_exist"); 157 if (trace != NULL) 158 goto fail; 159 160 return TEST_SUCCESS; 161 fail: 162 return TEST_FAILED; 163 } 164 165 static int 166 test_fp_trace_points(void) 167 { 168 /* Emit the FP trace */ 169 app_dpdk_test_fp(); 170 171 return TEST_SUCCESS; 172 } 173 174 static int 175 test_generic_trace_points(void) 176 { 177 int tmp; 178 179 rte_eal_trace_generic_void(); 180 rte_eal_trace_generic_u64(0x10000000000000); 181 rte_eal_trace_generic_u32(0x10000000); 182 rte_eal_trace_generic_u16(0xffee); 183 rte_eal_trace_generic_u8(0xc); 184 rte_eal_trace_generic_i64(-1234); 185 rte_eal_trace_generic_i32(-1234567); 186 rte_eal_trace_generic_i16(12); 187 rte_eal_trace_generic_i8(-3); 188 rte_eal_trace_generic_int(3333333); 189 rte_eal_trace_generic_long(333); 190 rte_eal_trace_generic_float(20.45); 191 rte_eal_trace_generic_double(20000.5000004); 192 rte_eal_trace_generic_ptr(&tmp); 193 rte_eal_trace_generic_str("my string"); 194 rte_eal_trace_generic_size_t(sizeof(void *)); 195 RTE_EAL_TRACE_GENERIC_FUNC; 196 197 return TEST_SUCCESS; 198 } 199 200 static struct unit_test_suite trace_tests = { 201 .suite_name = "trace autotest", 202 .setup = NULL, 203 .teardown = NULL, 204 .unit_test_cases = { 205 TEST_CASE(test_trace_mode), 206 TEST_CASE(test_generic_trace_points), 207 TEST_CASE(test_fp_trace_points), 208 TEST_CASE(test_trace_point_disable_enable), 209 TEST_CASE(test_trace_point_globbing), 210 TEST_CASE(test_trace_point_regex), 211 TEST_CASE(test_trace_points_lookup), 212 TEST_CASES_END() 213 } 214 }; 215 216 static int 217 test_trace(void) 218 { 219 return unit_test_suite_runner(&trace_tests); 220 } 221 222 static int 223 test_trace_dump(void) 224 { 225 rte_trace_dump(stdout); 226 return 0; 227 } 228 229 static int 230 test_trace_metadata_dump(void) 231 { 232 return rte_trace_metadata_dump(stdout); 233 } 234 235 #endif /* !RTE_EXEC_ENV_WINDOWS */ 236 237 REGISTER_TEST_COMMAND(trace_autotest, test_trace); 238 REGISTER_TEST_COMMAND(trace_dump, test_trace_dump); 239 REGISTER_TEST_COMMAND(trace_metadata_dump, test_trace_metadata_dump); 240