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
test_trace(void)15 test_trace(void)
16 {
17 printf("trace not supported on Windows, skipping test\n");
18 return TEST_SKIPPED;
19 }
20
21 static int
test_trace_dump(void)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
test_trace_metadata_dump(void)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
test_trace_point_globbing(void)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
test_trace_point_regex(void)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
test_trace_point_disable_enable(void)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
test_trace_mode(void)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
test_trace_points_lookup(void)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
test_fp_trace_points(void)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
test_generic_trace_points(void)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
test_trace(void)217 test_trace(void)
218 {
219 return unit_test_suite_runner(&trace_tests);
220 }
221
222 static int
test_trace_dump(void)223 test_trace_dump(void)
224 {
225 rte_trace_dump(stdout);
226 return 0;
227 }
228
229 static int
test_trace_metadata_dump(void)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