1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606 * Copyright 2020 Intel Corporation
3*2d9fd380Sjfb8856606 */
4*2d9fd380Sjfb8856606
5*2d9fd380Sjfb8856606 #include <string.h>
6*2d9fd380Sjfb8856606 #include <sys/socket.h>
7*2d9fd380Sjfb8856606 #include <sys/un.h>
8*2d9fd380Sjfb8856606 #include <unistd.h>
9*2d9fd380Sjfb8856606 #include <limits.h>
10*2d9fd380Sjfb8856606
11*2d9fd380Sjfb8856606 #include <rte_eal.h>
12*2d9fd380Sjfb8856606 #include <rte_common.h>
13*2d9fd380Sjfb8856606 #include <rte_telemetry.h>
14*2d9fd380Sjfb8856606 #include <rte_string_fns.h>
15*2d9fd380Sjfb8856606
16*2d9fd380Sjfb8856606 #include "test.h"
17*2d9fd380Sjfb8856606 #include "telemetry_data.h"
18*2d9fd380Sjfb8856606
19*2d9fd380Sjfb8856606 #define TELEMETRY_VERSION "v2"
20*2d9fd380Sjfb8856606 #define REQUEST_CMD "/test"
21*2d9fd380Sjfb8856606 #define BUF_SIZE 1024
22*2d9fd380Sjfb8856606 #define TEST_OUTPUT(exp) test_output(__func__, exp)
23*2d9fd380Sjfb8856606
24*2d9fd380Sjfb8856606 static struct rte_tel_data response_data;
25*2d9fd380Sjfb8856606 static int sock;
26*2d9fd380Sjfb8856606
27*2d9fd380Sjfb8856606 /*
28*2d9fd380Sjfb8856606 * This function is the callback registered with Telemetry to be used when
29*2d9fd380Sjfb8856606 * the /test command is requested. This callback returns the global data built
30*2d9fd380Sjfb8856606 * up by the individual test cases.
31*2d9fd380Sjfb8856606 */
32*2d9fd380Sjfb8856606 static int
test_cb(const char * cmd __rte_unused,const char * params __rte_unused,struct rte_tel_data * d)33*2d9fd380Sjfb8856606 test_cb(const char *cmd __rte_unused, const char *params __rte_unused,
34*2d9fd380Sjfb8856606 struct rte_tel_data *d)
35*2d9fd380Sjfb8856606 {
36*2d9fd380Sjfb8856606 *d = response_data;
37*2d9fd380Sjfb8856606 return 0;
38*2d9fd380Sjfb8856606 }
39*2d9fd380Sjfb8856606
40*2d9fd380Sjfb8856606 /*
41*2d9fd380Sjfb8856606 * This function is called by each test case function. It communicates with
42*2d9fd380Sjfb8856606 * the telemetry socket by requesting the /test command, and reading the
43*2d9fd380Sjfb8856606 * response. The expected response is passed in by the test case function,
44*2d9fd380Sjfb8856606 * and is compared to the actual response received from Telemetry.
45*2d9fd380Sjfb8856606 */
46*2d9fd380Sjfb8856606 static int
test_output(const char * func_name,const char * expected)47*2d9fd380Sjfb8856606 test_output(const char *func_name, const char *expected)
48*2d9fd380Sjfb8856606 {
49*2d9fd380Sjfb8856606 int bytes;
50*2d9fd380Sjfb8856606 char buf[BUF_SIZE * 16];
51*2d9fd380Sjfb8856606 if (write(sock, REQUEST_CMD, strlen(REQUEST_CMD)) < 0) {
52*2d9fd380Sjfb8856606 printf("%s: Error with socket write - %s\n", __func__,
53*2d9fd380Sjfb8856606 strerror(errno));
54*2d9fd380Sjfb8856606 return -1;
55*2d9fd380Sjfb8856606 }
56*2d9fd380Sjfb8856606 bytes = read(sock, buf, sizeof(buf) - 1);
57*2d9fd380Sjfb8856606 if (bytes < 0) {
58*2d9fd380Sjfb8856606 printf("%s: Error with socket read - %s\n", __func__,
59*2d9fd380Sjfb8856606 strerror(errno));
60*2d9fd380Sjfb8856606 return -1;
61*2d9fd380Sjfb8856606 }
62*2d9fd380Sjfb8856606 buf[bytes] = '\0';
63*2d9fd380Sjfb8856606 printf("%s: buf = '%s', expected = '%s'\n", func_name, buf, expected);
64*2d9fd380Sjfb8856606 return strncmp(expected, buf, sizeof(buf));
65*2d9fd380Sjfb8856606 }
66*2d9fd380Sjfb8856606
67*2d9fd380Sjfb8856606 static int
test_dict_with_array_int_values(void)68*2d9fd380Sjfb8856606 test_dict_with_array_int_values(void)
69*2d9fd380Sjfb8856606 {
70*2d9fd380Sjfb8856606 int i;
71*2d9fd380Sjfb8856606
72*2d9fd380Sjfb8856606 struct rte_tel_data *child_data = rte_tel_data_alloc();
73*2d9fd380Sjfb8856606 rte_tel_data_start_array(child_data, RTE_TEL_INT_VAL);
74*2d9fd380Sjfb8856606
75*2d9fd380Sjfb8856606 struct rte_tel_data *child_data2 = rte_tel_data_alloc();
76*2d9fd380Sjfb8856606 rte_tel_data_start_array(child_data2, RTE_TEL_INT_VAL);
77*2d9fd380Sjfb8856606
78*2d9fd380Sjfb8856606 memset(&response_data, 0, sizeof(response_data));
79*2d9fd380Sjfb8856606 rte_tel_data_start_dict(&response_data);
80*2d9fd380Sjfb8856606
81*2d9fd380Sjfb8856606 for (i = 0; i < 5; i++) {
82*2d9fd380Sjfb8856606 rte_tel_data_add_array_int(child_data, i);
83*2d9fd380Sjfb8856606 rte_tel_data_add_array_int(child_data2, i);
84*2d9fd380Sjfb8856606 }
85*2d9fd380Sjfb8856606
86*2d9fd380Sjfb8856606 rte_tel_data_add_dict_container(&response_data, "dict_0",
87*2d9fd380Sjfb8856606 child_data, 0);
88*2d9fd380Sjfb8856606 rte_tel_data_add_dict_container(&response_data, "dict_1",
89*2d9fd380Sjfb8856606 child_data2, 0);
90*2d9fd380Sjfb8856606
91*2d9fd380Sjfb8856606 return TEST_OUTPUT("{\"/test\":{\"dict_0\":[0,1,2,3,4],"
92*2d9fd380Sjfb8856606 "\"dict_1\":[0,1,2,3,4]}}");
93*2d9fd380Sjfb8856606 }
94*2d9fd380Sjfb8856606
95*2d9fd380Sjfb8856606 static int
test_array_with_array_int_values(void)96*2d9fd380Sjfb8856606 test_array_with_array_int_values(void)
97*2d9fd380Sjfb8856606 {
98*2d9fd380Sjfb8856606 int i;
99*2d9fd380Sjfb8856606
100*2d9fd380Sjfb8856606 struct rte_tel_data *child_data = rte_tel_data_alloc();
101*2d9fd380Sjfb8856606 rte_tel_data_start_array(child_data, RTE_TEL_INT_VAL);
102*2d9fd380Sjfb8856606
103*2d9fd380Sjfb8856606 struct rte_tel_data *child_data2 = rte_tel_data_alloc();
104*2d9fd380Sjfb8856606 rte_tel_data_start_array(child_data2, RTE_TEL_INT_VAL);
105*2d9fd380Sjfb8856606
106*2d9fd380Sjfb8856606 memset(&response_data, 0, sizeof(response_data));
107*2d9fd380Sjfb8856606 rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER);
108*2d9fd380Sjfb8856606
109*2d9fd380Sjfb8856606 for (i = 0; i < 5; i++) {
110*2d9fd380Sjfb8856606 rte_tel_data_add_array_int(child_data, i);
111*2d9fd380Sjfb8856606 rte_tel_data_add_array_int(child_data2, i);
112*2d9fd380Sjfb8856606 }
113*2d9fd380Sjfb8856606 rte_tel_data_add_array_container(&response_data, child_data, 0);
114*2d9fd380Sjfb8856606 rte_tel_data_add_array_container(&response_data, child_data2, 0);
115*2d9fd380Sjfb8856606
116*2d9fd380Sjfb8856606 return TEST_OUTPUT("{\"/test\":[[0,1,2,3,4],[0,1,2,3,4]]}");
117*2d9fd380Sjfb8856606 }
118*2d9fd380Sjfb8856606
119*2d9fd380Sjfb8856606 static int
test_case_array_int(void)120*2d9fd380Sjfb8856606 test_case_array_int(void)
121*2d9fd380Sjfb8856606 {
122*2d9fd380Sjfb8856606 int i;
123*2d9fd380Sjfb8856606 memset(&response_data, 0, sizeof(response_data));
124*2d9fd380Sjfb8856606 rte_tel_data_start_array(&response_data, RTE_TEL_INT_VAL);
125*2d9fd380Sjfb8856606 for (i = 0; i < 5; i++)
126*2d9fd380Sjfb8856606 rte_tel_data_add_array_int(&response_data, i);
127*2d9fd380Sjfb8856606 return TEST_OUTPUT("{\"/test\":[0,1,2,3,4]}");
128*2d9fd380Sjfb8856606 }
129*2d9fd380Sjfb8856606
130*2d9fd380Sjfb8856606 static int
test_case_add_dict_int(void)131*2d9fd380Sjfb8856606 test_case_add_dict_int(void)
132*2d9fd380Sjfb8856606 {
133*2d9fd380Sjfb8856606 int i = 0;
134*2d9fd380Sjfb8856606 char name_of_value[8];
135*2d9fd380Sjfb8856606
136*2d9fd380Sjfb8856606 memset(&response_data, 0, sizeof(response_data));
137*2d9fd380Sjfb8856606 rte_tel_data_start_dict(&response_data);
138*2d9fd380Sjfb8856606
139*2d9fd380Sjfb8856606 for (i = 0; i < 5; i++) {
140*2d9fd380Sjfb8856606 sprintf(name_of_value, "dict_%d", i);
141*2d9fd380Sjfb8856606 rte_tel_data_add_dict_int(&response_data, name_of_value, i);
142*2d9fd380Sjfb8856606 }
143*2d9fd380Sjfb8856606
144*2d9fd380Sjfb8856606 return TEST_OUTPUT("{\"/test\":{\"dict_0\":0,\"dict_1\":1,\"dict_2\":2,"
145*2d9fd380Sjfb8856606 "\"dict_3\":3,\"dict_4\":4}}");
146*2d9fd380Sjfb8856606 }
147*2d9fd380Sjfb8856606
148*2d9fd380Sjfb8856606 static int
test_case_array_string(void)149*2d9fd380Sjfb8856606 test_case_array_string(void)
150*2d9fd380Sjfb8856606 {
151*2d9fd380Sjfb8856606 memset(&response_data, 0, sizeof(response_data));
152*2d9fd380Sjfb8856606 rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL);
153*2d9fd380Sjfb8856606 rte_tel_data_add_array_string(&response_data, "aaaa");
154*2d9fd380Sjfb8856606 rte_tel_data_add_array_string(&response_data, "bbbb");
155*2d9fd380Sjfb8856606 rte_tel_data_add_array_string(&response_data, "cccc");
156*2d9fd380Sjfb8856606 rte_tel_data_add_array_string(&response_data, "dddd");
157*2d9fd380Sjfb8856606 rte_tel_data_add_array_string(&response_data, "eeee");
158*2d9fd380Sjfb8856606
159*2d9fd380Sjfb8856606 return TEST_OUTPUT("{\"/test\":[\"aaaa\",\"bbbb\",\"cccc\",\"dddd\","
160*2d9fd380Sjfb8856606 "\"eeee\"]}");
161*2d9fd380Sjfb8856606 }
162*2d9fd380Sjfb8856606
163*2d9fd380Sjfb8856606 static int
test_case_add_dict_string(void)164*2d9fd380Sjfb8856606 test_case_add_dict_string(void)
165*2d9fd380Sjfb8856606 {
166*2d9fd380Sjfb8856606 memset(&response_data, 0, sizeof(response_data));
167*2d9fd380Sjfb8856606 rte_tel_data_start_dict(&response_data);
168*2d9fd380Sjfb8856606
169*2d9fd380Sjfb8856606 rte_tel_data_add_dict_string(&response_data, "dict_0", "aaaa");
170*2d9fd380Sjfb8856606 rte_tel_data_add_dict_string(&response_data, "dict_1", "bbbb");
171*2d9fd380Sjfb8856606 rte_tel_data_add_dict_string(&response_data, "dict_2", "cccc");
172*2d9fd380Sjfb8856606 rte_tel_data_add_dict_string(&response_data, "dict_3", "dddd");
173*2d9fd380Sjfb8856606
174*2d9fd380Sjfb8856606 return TEST_OUTPUT("{\"/test\":{\"dict_0\":\"aaaa\",\"dict_1\":"
175*2d9fd380Sjfb8856606 "\"bbbb\",\"dict_2\":\"cccc\",\"dict_3\":\"dddd\"}}");
176*2d9fd380Sjfb8856606 }
177*2d9fd380Sjfb8856606
178*2d9fd380Sjfb8856606
179*2d9fd380Sjfb8856606 static int
test_dict_with_array_string_values(void)180*2d9fd380Sjfb8856606 test_dict_with_array_string_values(void)
181*2d9fd380Sjfb8856606 {
182*2d9fd380Sjfb8856606 struct rte_tel_data *child_data = rte_tel_data_alloc();
183*2d9fd380Sjfb8856606 rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL);
184*2d9fd380Sjfb8856606
185*2d9fd380Sjfb8856606 struct rte_tel_data *child_data2 = rte_tel_data_alloc();
186*2d9fd380Sjfb8856606 rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL);
187*2d9fd380Sjfb8856606
188*2d9fd380Sjfb8856606 memset(&response_data, 0, sizeof(response_data));
189*2d9fd380Sjfb8856606 rte_tel_data_start_dict(&response_data);
190*2d9fd380Sjfb8856606
191*2d9fd380Sjfb8856606 rte_tel_data_add_array_string(child_data, "aaaa");
192*2d9fd380Sjfb8856606 rte_tel_data_add_array_string(child_data2, "bbbb");
193*2d9fd380Sjfb8856606
194*2d9fd380Sjfb8856606 rte_tel_data_add_dict_container(&response_data, "dict_0",
195*2d9fd380Sjfb8856606 child_data, 0);
196*2d9fd380Sjfb8856606 rte_tel_data_add_dict_container(&response_data, "dict_1",
197*2d9fd380Sjfb8856606 child_data2, 0);
198*2d9fd380Sjfb8856606
199*2d9fd380Sjfb8856606 return TEST_OUTPUT("{\"/test\":{\"dict_0\":[\"aaaa\"],\"dict_1\":"
200*2d9fd380Sjfb8856606 "[\"bbbb\"]}}");
201*2d9fd380Sjfb8856606 }
202*2d9fd380Sjfb8856606
203*2d9fd380Sjfb8856606 static int
test_array_with_array_string_values(void)204*2d9fd380Sjfb8856606 test_array_with_array_string_values(void)
205*2d9fd380Sjfb8856606 {
206*2d9fd380Sjfb8856606 struct rte_tel_data *child_data = rte_tel_data_alloc();
207*2d9fd380Sjfb8856606 rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL);
208*2d9fd380Sjfb8856606
209*2d9fd380Sjfb8856606 struct rte_tel_data *child_data2 = rte_tel_data_alloc();
210*2d9fd380Sjfb8856606 rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL);
211*2d9fd380Sjfb8856606
212*2d9fd380Sjfb8856606 memset(&response_data, 0, sizeof(response_data));
213*2d9fd380Sjfb8856606 rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER);
214*2d9fd380Sjfb8856606
215*2d9fd380Sjfb8856606 rte_tel_data_add_array_string(child_data, "aaaa");
216*2d9fd380Sjfb8856606 rte_tel_data_add_array_string(child_data2, "bbbb");
217*2d9fd380Sjfb8856606
218*2d9fd380Sjfb8856606 rte_tel_data_add_array_container(&response_data, child_data, 0);
219*2d9fd380Sjfb8856606 rte_tel_data_add_array_container(&response_data, child_data2, 0);
220*2d9fd380Sjfb8856606
221*2d9fd380Sjfb8856606 return TEST_OUTPUT("{\"/test\":[[\"aaaa\"],[\"bbbb\"]]}");
222*2d9fd380Sjfb8856606 }
223*2d9fd380Sjfb8856606
224*2d9fd380Sjfb8856606 static int
test_case_array_u64(void)225*2d9fd380Sjfb8856606 test_case_array_u64(void)
226*2d9fd380Sjfb8856606 {
227*2d9fd380Sjfb8856606 int i;
228*2d9fd380Sjfb8856606 memset(&response_data, 0, sizeof(response_data));
229*2d9fd380Sjfb8856606 rte_tel_data_start_array(&response_data, RTE_TEL_U64_VAL);
230*2d9fd380Sjfb8856606 for (i = 0; i < 5; i++)
231*2d9fd380Sjfb8856606 rte_tel_data_add_array_u64(&response_data, i);
232*2d9fd380Sjfb8856606 return TEST_OUTPUT("{\"/test\":[0,1,2,3,4]}");
233*2d9fd380Sjfb8856606 }
234*2d9fd380Sjfb8856606
235*2d9fd380Sjfb8856606 static int
test_case_add_dict_u64(void)236*2d9fd380Sjfb8856606 test_case_add_dict_u64(void)
237*2d9fd380Sjfb8856606 {
238*2d9fd380Sjfb8856606 int i = 0;
239*2d9fd380Sjfb8856606 char name_of_value[8];
240*2d9fd380Sjfb8856606
241*2d9fd380Sjfb8856606 memset(&response_data, 0, sizeof(response_data));
242*2d9fd380Sjfb8856606 rte_tel_data_start_dict(&response_data);
243*2d9fd380Sjfb8856606
244*2d9fd380Sjfb8856606 for (i = 0; i < 5; i++) {
245*2d9fd380Sjfb8856606 sprintf(name_of_value, "dict_%d", i);
246*2d9fd380Sjfb8856606 rte_tel_data_add_dict_u64(&response_data, name_of_value, i);
247*2d9fd380Sjfb8856606 }
248*2d9fd380Sjfb8856606 return TEST_OUTPUT("{\"/test\":{\"dict_0\":0,\"dict_1\":1,\"dict_2\":2,"
249*2d9fd380Sjfb8856606 "\"dict_3\":3,\"dict_4\":4}}");
250*2d9fd380Sjfb8856606 }
251*2d9fd380Sjfb8856606
252*2d9fd380Sjfb8856606 static int
test_dict_with_array_u64_values(void)253*2d9fd380Sjfb8856606 test_dict_with_array_u64_values(void)
254*2d9fd380Sjfb8856606 {
255*2d9fd380Sjfb8856606 int i;
256*2d9fd380Sjfb8856606
257*2d9fd380Sjfb8856606 struct rte_tel_data *child_data = rte_tel_data_alloc();
258*2d9fd380Sjfb8856606 rte_tel_data_start_array(child_data, RTE_TEL_U64_VAL);
259*2d9fd380Sjfb8856606
260*2d9fd380Sjfb8856606 struct rte_tel_data *child_data2 = rte_tel_data_alloc();
261*2d9fd380Sjfb8856606 rte_tel_data_start_array(child_data2, RTE_TEL_U64_VAL);
262*2d9fd380Sjfb8856606
263*2d9fd380Sjfb8856606 memset(&response_data, 0, sizeof(response_data));
264*2d9fd380Sjfb8856606 rte_tel_data_start_dict(&response_data);
265*2d9fd380Sjfb8856606
266*2d9fd380Sjfb8856606 for (i = 0; i < 10; i++) {
267*2d9fd380Sjfb8856606 rte_tel_data_add_array_u64(child_data, i);
268*2d9fd380Sjfb8856606 rte_tel_data_add_array_u64(child_data2, i);
269*2d9fd380Sjfb8856606 }
270*2d9fd380Sjfb8856606
271*2d9fd380Sjfb8856606 rte_tel_data_add_dict_container(&response_data, "dict_0",
272*2d9fd380Sjfb8856606 child_data, 0);
273*2d9fd380Sjfb8856606 rte_tel_data_add_dict_container(&response_data, "dict_1",
274*2d9fd380Sjfb8856606 child_data2, 0);
275*2d9fd380Sjfb8856606
276*2d9fd380Sjfb8856606 return TEST_OUTPUT("{\"/test\":{\"dict_0\":[0,1,2,3,4,5,6,7,8,9],"
277*2d9fd380Sjfb8856606 "\"dict_1\":[0,1,2,3,4,5,6,7,8,9]}}");
278*2d9fd380Sjfb8856606 }
279*2d9fd380Sjfb8856606
280*2d9fd380Sjfb8856606 static int
test_array_with_array_u64_values(void)281*2d9fd380Sjfb8856606 test_array_with_array_u64_values(void)
282*2d9fd380Sjfb8856606 {
283*2d9fd380Sjfb8856606 int i;
284*2d9fd380Sjfb8856606
285*2d9fd380Sjfb8856606 struct rte_tel_data *child_data = rte_tel_data_alloc();
286*2d9fd380Sjfb8856606 rte_tel_data_start_array(child_data, RTE_TEL_U64_VAL);
287*2d9fd380Sjfb8856606
288*2d9fd380Sjfb8856606 struct rte_tel_data *child_data2 = rte_tel_data_alloc();
289*2d9fd380Sjfb8856606 rte_tel_data_start_array(child_data2, RTE_TEL_U64_VAL);
290*2d9fd380Sjfb8856606
291*2d9fd380Sjfb8856606 memset(&response_data, 0, sizeof(response_data));
292*2d9fd380Sjfb8856606 rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER);
293*2d9fd380Sjfb8856606
294*2d9fd380Sjfb8856606 for (i = 0; i < 5; i++) {
295*2d9fd380Sjfb8856606 rte_tel_data_add_array_u64(child_data, i);
296*2d9fd380Sjfb8856606 rte_tel_data_add_array_u64(child_data2, i);
297*2d9fd380Sjfb8856606 }
298*2d9fd380Sjfb8856606 rte_tel_data_add_array_container(&response_data, child_data, 0);
299*2d9fd380Sjfb8856606 rte_tel_data_add_array_container(&response_data, child_data2, 0);
300*2d9fd380Sjfb8856606
301*2d9fd380Sjfb8856606 return TEST_OUTPUT("{\"/test\":[[0,1,2,3,4],[0,1,2,3,4]]}");
302*2d9fd380Sjfb8856606 }
303*2d9fd380Sjfb8856606
304*2d9fd380Sjfb8856606 static int
connect_to_socket(void)305*2d9fd380Sjfb8856606 connect_to_socket(void)
306*2d9fd380Sjfb8856606 {
307*2d9fd380Sjfb8856606 char buf[BUF_SIZE];
308*2d9fd380Sjfb8856606 int sock, bytes;
309*2d9fd380Sjfb8856606 struct sockaddr_un telem_addr;
310*2d9fd380Sjfb8856606
311*2d9fd380Sjfb8856606 sock = socket(AF_UNIX, SOCK_SEQPACKET, 0);
312*2d9fd380Sjfb8856606 if (sock < 0) {
313*2d9fd380Sjfb8856606 printf("\n%s: Error creating socket: %s\n", __func__,
314*2d9fd380Sjfb8856606 strerror(errno));
315*2d9fd380Sjfb8856606 return -1;
316*2d9fd380Sjfb8856606 }
317*2d9fd380Sjfb8856606 telem_addr.sun_family = AF_UNIX;
318*2d9fd380Sjfb8856606 snprintf(telem_addr.sun_path, sizeof(telem_addr.sun_path),
319*2d9fd380Sjfb8856606 "%s/dpdk_telemetry.%s", rte_eal_get_runtime_dir(),
320*2d9fd380Sjfb8856606 TELEMETRY_VERSION);
321*2d9fd380Sjfb8856606 if (connect(sock, (struct sockaddr *) &telem_addr,
322*2d9fd380Sjfb8856606 sizeof(telem_addr)) < 0) {
323*2d9fd380Sjfb8856606 printf("\n%s: Error connecting to socket: %s\n", __func__,
324*2d9fd380Sjfb8856606 strerror(errno));
325*2d9fd380Sjfb8856606 close(sock);
326*2d9fd380Sjfb8856606 return -1;
327*2d9fd380Sjfb8856606 }
328*2d9fd380Sjfb8856606
329*2d9fd380Sjfb8856606 bytes = read(sock, buf, sizeof(buf) - 1);
330*2d9fd380Sjfb8856606 if (bytes < 0) {
331*2d9fd380Sjfb8856606 printf("%s: Error with socket read - %s\n", __func__,
332*2d9fd380Sjfb8856606 strerror(errno));
333*2d9fd380Sjfb8856606 close(sock);
334*2d9fd380Sjfb8856606 return -1;
335*2d9fd380Sjfb8856606 }
336*2d9fd380Sjfb8856606 buf[bytes] = '\0';
337*2d9fd380Sjfb8856606 printf("\n%s: %s\n", __func__, buf);
338*2d9fd380Sjfb8856606 return sock;
339*2d9fd380Sjfb8856606 }
340*2d9fd380Sjfb8856606
341*2d9fd380Sjfb8856606 static int
test_telemetry_data(void)342*2d9fd380Sjfb8856606 test_telemetry_data(void)
343*2d9fd380Sjfb8856606 {
344*2d9fd380Sjfb8856606 typedef int (*test_case)(void);
345*2d9fd380Sjfb8856606 unsigned int i = 0;
346*2d9fd380Sjfb8856606
347*2d9fd380Sjfb8856606 sock = connect_to_socket();
348*2d9fd380Sjfb8856606 if (sock <= 0)
349*2d9fd380Sjfb8856606 return -1;
350*2d9fd380Sjfb8856606
351*2d9fd380Sjfb8856606 test_case test_cases[] = {test_case_array_string,
352*2d9fd380Sjfb8856606 test_case_array_int, test_case_array_u64,
353*2d9fd380Sjfb8856606 test_case_add_dict_int, test_case_add_dict_u64,
354*2d9fd380Sjfb8856606 test_case_add_dict_string,
355*2d9fd380Sjfb8856606 test_dict_with_array_int_values,
356*2d9fd380Sjfb8856606 test_dict_with_array_u64_values,
357*2d9fd380Sjfb8856606 test_dict_with_array_string_values,
358*2d9fd380Sjfb8856606 test_array_with_array_int_values,
359*2d9fd380Sjfb8856606 test_array_with_array_u64_values,
360*2d9fd380Sjfb8856606 test_array_with_array_string_values };
361*2d9fd380Sjfb8856606
362*2d9fd380Sjfb8856606 rte_telemetry_register_cmd(REQUEST_CMD, test_cb, "Test");
363*2d9fd380Sjfb8856606 for (i = 0; i < RTE_DIM(test_cases); i++) {
364*2d9fd380Sjfb8856606 if (test_cases[i]() != 0) {
365*2d9fd380Sjfb8856606 close(sock);
366*2d9fd380Sjfb8856606 return -1;
367*2d9fd380Sjfb8856606 }
368*2d9fd380Sjfb8856606 }
369*2d9fd380Sjfb8856606 close(sock);
370*2d9fd380Sjfb8856606 return 0;
371*2d9fd380Sjfb8856606 }
372*2d9fd380Sjfb8856606
373*2d9fd380Sjfb8856606 REGISTER_TEST_COMMAND(telemetry_data_autotest, test_telemetry_data);
374