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