1bd78cf69SLouise Kilheeney /* SPDX-License-Identifier: BSD-3-Clause
2bd78cf69SLouise Kilheeney * Copyright 2020 Intel Corporation
3bd78cf69SLouise Kilheeney */
4bd78cf69SLouise Kilheeney
5c9ba6aa3SBruce Richardson #ifdef RTE_EXEC_ENV_WINDOWS
6c9ba6aa3SBruce Richardson #include "test.h"
7c9ba6aa3SBruce Richardson
8c9ba6aa3SBruce Richardson static int
telemetry_data_autotest(void)9c9ba6aa3SBruce Richardson telemetry_data_autotest(void)
10c9ba6aa3SBruce Richardson {
11c9ba6aa3SBruce Richardson return TEST_SKIPPED;
12c9ba6aa3SBruce Richardson }
13c9ba6aa3SBruce Richardson
14c9ba6aa3SBruce Richardson #else
15c9ba6aa3SBruce Richardson
16bd78cf69SLouise Kilheeney #include <string.h>
17bd78cf69SLouise Kilheeney #include <sys/socket.h>
18bd78cf69SLouise Kilheeney #include <sys/un.h>
19bd78cf69SLouise Kilheeney #include <unistd.h>
20bd78cf69SLouise Kilheeney #include <limits.h>
21bd78cf69SLouise Kilheeney
22bd78cf69SLouise Kilheeney #include <rte_eal.h>
23bd78cf69SLouise Kilheeney #include <rte_common.h>
24bd78cf69SLouise Kilheeney #include <rte_telemetry.h>
25bd78cf69SLouise Kilheeney #include <rte_string_fns.h>
26bd78cf69SLouise Kilheeney
27bd78cf69SLouise Kilheeney #include "test.h"
28bd78cf69SLouise Kilheeney #include "telemetry_data.h"
29bd78cf69SLouise Kilheeney
30bd78cf69SLouise Kilheeney #define TELEMETRY_VERSION "v2"
31bd78cf69SLouise Kilheeney #define REQUEST_CMD "/test"
32bd78cf69SLouise Kilheeney #define BUF_SIZE 1024
331306df2cSBruce Richardson #define CHECK_OUTPUT(exp) check_output(__func__, "{\"" REQUEST_CMD "\":" exp "}")
341306df2cSBruce Richardson
351306df2cSBruce Richardson /*
361306df2cSBruce Richardson * Runs a series of test cases, checking the output of telemetry for various different types of
371306df2cSBruce Richardson * responses. On init, a single connection to DPDK telemetry is made, and a single telemetry
381306df2cSBruce Richardson * callback "/test" is registered. That callback always returns the value of the static global
391306df2cSBruce Richardson * variable "response_data", so each test case builds up that structure, and then calls the
401306df2cSBruce Richardson * "check_output" function to ensure the response received over the socket for "/test" matches
411306df2cSBruce Richardson * that expected for the response_data value populated.
421306df2cSBruce Richardson *
431306df2cSBruce Richardson * NOTE:
441306df2cSBruce Richardson * - each test case function in this file should be added to the "test_cases" array in
451306df2cSBruce Richardson * test_telemetry_data function at the bottom of the file.
461306df2cSBruce Richardson * - each test case function should populate the "response_data" global variable (below)
471306df2cSBruce Richardson * with the appropriate values which would be returned from a simulated telemetry function.
481306df2cSBruce Richardson * Then the test case function should have "return CHECK_OUTPUT(<expected_data>);" as it's
491306df2cSBruce Richardson * last line. The test infrastructure will then validate that the output when returning
501306df2cSBruce Richardson * "response_data" structure matches that in "<expected_data>".
511306df2cSBruce Richardson * - the response_data structure will be zeroed on entry to each test function, so each function
521306df2cSBruce Richardson * can begin with a call to "rte_tel_data_string/start_array/start_dict" as so desired.
531306df2cSBruce Richardson * - the expected_output for each function can be just the actual json data from the
541306df2cSBruce Richardson * "response_data" value. The CHECK_OUTPUT macro will include the appropriate "{\"/test\": ... }"
551306df2cSBruce Richardson * structure around the json output.
561306df2cSBruce Richardson *
571306df2cSBruce Richardson * See test_simple_string(), or test_case_array_int() for a basic examples of test cases.
581306df2cSBruce Richardson */
591306df2cSBruce Richardson
60bd78cf69SLouise Kilheeney
61bd78cf69SLouise Kilheeney static struct rte_tel_data response_data;
62bd78cf69SLouise Kilheeney static int sock;
63bd78cf69SLouise Kilheeney
641306df2cSBruce Richardson
65bd78cf69SLouise Kilheeney /*
66bd78cf69SLouise Kilheeney * This function is the callback registered with Telemetry to be used when
67bd78cf69SLouise Kilheeney * the /test command is requested. This callback returns the global data built
68bd78cf69SLouise Kilheeney * up by the individual test cases.
69bd78cf69SLouise Kilheeney */
70bd78cf69SLouise Kilheeney static int
telemetry_test_cb(const char * cmd __rte_unused,const char * params __rte_unused,struct rte_tel_data * d)711306df2cSBruce Richardson telemetry_test_cb(const char *cmd __rte_unused, const char *params __rte_unused,
72bd78cf69SLouise Kilheeney struct rte_tel_data *d)
73bd78cf69SLouise Kilheeney {
74bd78cf69SLouise Kilheeney *d = response_data;
75bd78cf69SLouise Kilheeney return 0;
76bd78cf69SLouise Kilheeney }
77bd78cf69SLouise Kilheeney
78bd78cf69SLouise Kilheeney /*
79bd78cf69SLouise Kilheeney * This function is called by each test case function. It communicates with
80bd78cf69SLouise Kilheeney * the telemetry socket by requesting the /test command, and reading the
81bd78cf69SLouise Kilheeney * response. The expected response is passed in by the test case function,
82bd78cf69SLouise Kilheeney * and is compared to the actual response received from Telemetry.
83bd78cf69SLouise Kilheeney */
84bd78cf69SLouise Kilheeney static int
check_output(const char * func_name,const char * expected)851306df2cSBruce Richardson check_output(const char *func_name, const char *expected)
86bd78cf69SLouise Kilheeney {
87bd78cf69SLouise Kilheeney int bytes;
88bd78cf69SLouise Kilheeney char buf[BUF_SIZE * 16];
89bd78cf69SLouise Kilheeney if (write(sock, REQUEST_CMD, strlen(REQUEST_CMD)) < 0) {
90bd78cf69SLouise Kilheeney printf("%s: Error with socket write - %s\n", __func__,
91bd78cf69SLouise Kilheeney strerror(errno));
92bd78cf69SLouise Kilheeney return -1;
93bd78cf69SLouise Kilheeney }
94bd78cf69SLouise Kilheeney bytes = read(sock, buf, sizeof(buf) - 1);
95bd78cf69SLouise Kilheeney if (bytes < 0) {
96bd78cf69SLouise Kilheeney printf("%s: Error with socket read - %s\n", __func__,
97bd78cf69SLouise Kilheeney strerror(errno));
98bd78cf69SLouise Kilheeney return -1;
99bd78cf69SLouise Kilheeney }
100bd78cf69SLouise Kilheeney buf[bytes] = '\0';
101bd78cf69SLouise Kilheeney printf("%s: buf = '%s', expected = '%s'\n", func_name, buf, expected);
102bd78cf69SLouise Kilheeney return strncmp(expected, buf, sizeof(buf));
103bd78cf69SLouise Kilheeney }
104bd78cf69SLouise Kilheeney
105bd78cf69SLouise Kilheeney static int
test_null_return(void)1060f3d92f3SBruce Richardson test_null_return(void)
1070f3d92f3SBruce Richardson {
1080f3d92f3SBruce Richardson return CHECK_OUTPUT("null");
1090f3d92f3SBruce Richardson }
1100f3d92f3SBruce Richardson
1110f3d92f3SBruce Richardson static int
test_simple_string(void)1121306df2cSBruce Richardson test_simple_string(void)
1131306df2cSBruce Richardson {
1141306df2cSBruce Richardson rte_tel_data_string(&response_data, "Simple string");
1151306df2cSBruce Richardson
1161306df2cSBruce Richardson return CHECK_OUTPUT("\"Simple string\"");
1171306df2cSBruce Richardson }
1181306df2cSBruce Richardson
1191306df2cSBruce Richardson static int
test_dict_with_array_int_values(void)120bd78cf69SLouise Kilheeney test_dict_with_array_int_values(void)
121bd78cf69SLouise Kilheeney {
122bd78cf69SLouise Kilheeney int i;
123bd78cf69SLouise Kilheeney
124bd78cf69SLouise Kilheeney struct rte_tel_data *child_data = rte_tel_data_alloc();
125bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data, RTE_TEL_INT_VAL);
126bd78cf69SLouise Kilheeney
127bd78cf69SLouise Kilheeney struct rte_tel_data *child_data2 = rte_tel_data_alloc();
128bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data2, RTE_TEL_INT_VAL);
129bd78cf69SLouise Kilheeney
130bd78cf69SLouise Kilheeney rte_tel_data_start_dict(&response_data);
131bd78cf69SLouise Kilheeney
132bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++) {
133bd78cf69SLouise Kilheeney rte_tel_data_add_array_int(child_data, i);
134bd78cf69SLouise Kilheeney rte_tel_data_add_array_int(child_data2, i);
135bd78cf69SLouise Kilheeney }
136bd78cf69SLouise Kilheeney
137bd78cf69SLouise Kilheeney rte_tel_data_add_dict_container(&response_data, "dict_0",
138bd78cf69SLouise Kilheeney child_data, 0);
139bd78cf69SLouise Kilheeney rte_tel_data_add_dict_container(&response_data, "dict_1",
140bd78cf69SLouise Kilheeney child_data2, 0);
141bd78cf69SLouise Kilheeney
1421306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_0\":[0,1,2,3,4],\"dict_1\":[0,1,2,3,4]}");
143bd78cf69SLouise Kilheeney }
144bd78cf69SLouise Kilheeney
145bd78cf69SLouise Kilheeney static int
test_array_with_array_int_values(void)146bd78cf69SLouise Kilheeney test_array_with_array_int_values(void)
147bd78cf69SLouise Kilheeney {
148bd78cf69SLouise Kilheeney int i;
149bd78cf69SLouise Kilheeney
150bd78cf69SLouise Kilheeney struct rte_tel_data *child_data = rte_tel_data_alloc();
151bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data, RTE_TEL_INT_VAL);
152bd78cf69SLouise Kilheeney
153bd78cf69SLouise Kilheeney struct rte_tel_data *child_data2 = rte_tel_data_alloc();
154bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data2, RTE_TEL_INT_VAL);
155bd78cf69SLouise Kilheeney
156bd78cf69SLouise Kilheeney rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER);
157bd78cf69SLouise Kilheeney
158bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++) {
159bd78cf69SLouise Kilheeney rte_tel_data_add_array_int(child_data, i);
160bd78cf69SLouise Kilheeney rte_tel_data_add_array_int(child_data2, i);
161bd78cf69SLouise Kilheeney }
162bd78cf69SLouise Kilheeney rte_tel_data_add_array_container(&response_data, child_data, 0);
163bd78cf69SLouise Kilheeney rte_tel_data_add_array_container(&response_data, child_data2, 0);
164bd78cf69SLouise Kilheeney
1651306df2cSBruce Richardson return CHECK_OUTPUT("[[0,1,2,3,4],[0,1,2,3,4]]");
166bd78cf69SLouise Kilheeney }
167bd78cf69SLouise Kilheeney
168bd78cf69SLouise Kilheeney static int
test_case_array_int(void)169bd78cf69SLouise Kilheeney test_case_array_int(void)
170bd78cf69SLouise Kilheeney {
171bd78cf69SLouise Kilheeney int i;
1721306df2cSBruce Richardson
173bd78cf69SLouise Kilheeney rte_tel_data_start_array(&response_data, RTE_TEL_INT_VAL);
174bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++)
175bd78cf69SLouise Kilheeney rte_tel_data_add_array_int(&response_data, i);
1761306df2cSBruce Richardson return CHECK_OUTPUT("[0,1,2,3,4]");
177bd78cf69SLouise Kilheeney }
178bd78cf69SLouise Kilheeney
179bd78cf69SLouise Kilheeney static int
test_case_add_dict_int(void)180bd78cf69SLouise Kilheeney test_case_add_dict_int(void)
181bd78cf69SLouise Kilheeney {
182bd78cf69SLouise Kilheeney int i = 0;
183bd78cf69SLouise Kilheeney char name_of_value[8];
184bd78cf69SLouise Kilheeney
185bd78cf69SLouise Kilheeney rte_tel_data_start_dict(&response_data);
186bd78cf69SLouise Kilheeney
187bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++) {
188bd78cf69SLouise Kilheeney sprintf(name_of_value, "dict_%d", i);
189bd78cf69SLouise Kilheeney rte_tel_data_add_dict_int(&response_data, name_of_value, i);
190bd78cf69SLouise Kilheeney }
191bd78cf69SLouise Kilheeney
1921306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_0\":0,\"dict_1\":1,\"dict_2\":2,\"dict_3\":3,\"dict_4\":4}");
193bd78cf69SLouise Kilheeney }
194bd78cf69SLouise Kilheeney
195bd78cf69SLouise Kilheeney static int
test_case_array_string(void)196bd78cf69SLouise Kilheeney test_case_array_string(void)
197bd78cf69SLouise Kilheeney {
198bd78cf69SLouise Kilheeney rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL);
199bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(&response_data, "aaaa");
200bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(&response_data, "bbbb");
201bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(&response_data, "cccc");
202bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(&response_data, "dddd");
203bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(&response_data, "eeee");
204bd78cf69SLouise Kilheeney
2051306df2cSBruce Richardson return CHECK_OUTPUT("[\"aaaa\",\"bbbb\",\"cccc\",\"dddd\",\"eeee\"]");
206bd78cf69SLouise Kilheeney }
207bd78cf69SLouise Kilheeney
208bd78cf69SLouise Kilheeney static int
test_case_add_dict_string(void)209bd78cf69SLouise Kilheeney test_case_add_dict_string(void)
210bd78cf69SLouise Kilheeney {
211bd78cf69SLouise Kilheeney rte_tel_data_start_dict(&response_data);
212bd78cf69SLouise Kilheeney
213bd78cf69SLouise Kilheeney rte_tel_data_add_dict_string(&response_data, "dict_0", "aaaa");
214bd78cf69SLouise Kilheeney rte_tel_data_add_dict_string(&response_data, "dict_1", "bbbb");
215bd78cf69SLouise Kilheeney rte_tel_data_add_dict_string(&response_data, "dict_2", "cccc");
216bd78cf69SLouise Kilheeney rte_tel_data_add_dict_string(&response_data, "dict_3", "dddd");
217bd78cf69SLouise Kilheeney
2181306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_0\":\"aaaa\",\"dict_1\":\"bbbb\",\"dict_2\":\"cccc\",\"dict_3\":\"dddd\"}");
219bd78cf69SLouise Kilheeney }
220bd78cf69SLouise Kilheeney
22182c33481SHuisong Li static int
test_case_add_dict_uint_hex_padding(void)22282c33481SHuisong Li test_case_add_dict_uint_hex_padding(void)
22382c33481SHuisong Li {
22482c33481SHuisong Li rte_tel_data_start_dict(&response_data);
22582c33481SHuisong Li
22682c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_0",
22782c33481SHuisong Li (uint8_t)0x8, 8);
22882c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_1",
22982c33481SHuisong Li (uint16_t)0x88, 16);
23082c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_2",
23182c33481SHuisong Li (uint32_t)0x888, 32);
23282c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_3",
23382c33481SHuisong Li (uint64_t)0x8888, 64);
23482c33481SHuisong Li
23582c33481SHuisong Li return CHECK_OUTPUT("{\"dict_0\":\"0x08\",\"dict_1\":\"0x0088\",\"dict_2\":\"0x00000888\",\"dict_3\":\"0x0000000000008888\"}");
23682c33481SHuisong Li }
23782c33481SHuisong Li
23882c33481SHuisong Li static int
test_case_add_dict_uint_hex_nopadding(void)23982c33481SHuisong Li test_case_add_dict_uint_hex_nopadding(void)
24082c33481SHuisong Li {
24182c33481SHuisong Li rte_tel_data_start_dict(&response_data);
24282c33481SHuisong Li
24382c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_0",
24482c33481SHuisong Li (uint8_t)0x8, 0);
24582c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_1",
24682c33481SHuisong Li (uint16_t)0x88, 0);
24782c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_2",
24882c33481SHuisong Li (uint32_t)0x888, 0);
24982c33481SHuisong Li rte_tel_data_add_dict_uint_hex(&response_data, "dict_3",
25082c33481SHuisong Li (uint64_t)0x8888, 0);
25182c33481SHuisong Li
25282c33481SHuisong Li return CHECK_OUTPUT("{\"dict_0\":\"0x8\",\"dict_1\":\"0x88\",\"dict_2\":\"0x888\",\"dict_3\":\"0x8888\"}");
25382c33481SHuisong Li }
254bd78cf69SLouise Kilheeney
255bd78cf69SLouise Kilheeney static int
test_dict_with_array_string_values(void)256bd78cf69SLouise Kilheeney test_dict_with_array_string_values(void)
257bd78cf69SLouise Kilheeney {
258bd78cf69SLouise Kilheeney struct rte_tel_data *child_data = rte_tel_data_alloc();
259bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL);
260bd78cf69SLouise Kilheeney
261bd78cf69SLouise Kilheeney struct rte_tel_data *child_data2 = rte_tel_data_alloc();
262bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL);
263bd78cf69SLouise Kilheeney
264bd78cf69SLouise Kilheeney rte_tel_data_start_dict(&response_data);
265bd78cf69SLouise Kilheeney
266bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(child_data, "aaaa");
267bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(child_data2, "bbbb");
268bd78cf69SLouise Kilheeney
269bd78cf69SLouise Kilheeney rte_tel_data_add_dict_container(&response_data, "dict_0",
270bd78cf69SLouise Kilheeney child_data, 0);
271bd78cf69SLouise Kilheeney rte_tel_data_add_dict_container(&response_data, "dict_1",
272bd78cf69SLouise Kilheeney child_data2, 0);
273bd78cf69SLouise Kilheeney
2741306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_0\":[\"aaaa\"],\"dict_1\":[\"bbbb\"]}");
275bd78cf69SLouise Kilheeney }
276bd78cf69SLouise Kilheeney
277bd78cf69SLouise Kilheeney static int
test_dict_with_array_uint_hex_values_padding(void)27882c33481SHuisong Li test_dict_with_array_uint_hex_values_padding(void)
27982c33481SHuisong Li {
28082c33481SHuisong Li struct rte_tel_data *child_data = rte_tel_data_alloc();
28182c33481SHuisong Li rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL);
28282c33481SHuisong Li
28382c33481SHuisong Li struct rte_tel_data *child_data2 = rte_tel_data_alloc();
28482c33481SHuisong Li rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL);
28582c33481SHuisong Li
28682c33481SHuisong Li rte_tel_data_start_dict(&response_data);
28782c33481SHuisong Li
28882c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data, (uint32_t)0x888, 32);
28982c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data2, (uint64_t)0x8888, 64);
29082c33481SHuisong Li
29182c33481SHuisong Li rte_tel_data_add_dict_container(&response_data, "dict_0",
29282c33481SHuisong Li child_data, 0);
29382c33481SHuisong Li rte_tel_data_add_dict_container(&response_data, "dict_1",
29482c33481SHuisong Li child_data2, 0);
29582c33481SHuisong Li
29682c33481SHuisong Li return CHECK_OUTPUT("{\"dict_0\":[\"0x00000888\"],\"dict_1\":[\"0x0000000000008888\"]}");
29782c33481SHuisong Li }
29882c33481SHuisong Li
29982c33481SHuisong Li static int
test_dict_with_array_uint_hex_values_nopadding(void)30082c33481SHuisong Li test_dict_with_array_uint_hex_values_nopadding(void)
30182c33481SHuisong Li {
30282c33481SHuisong Li struct rte_tel_data *child_data = rte_tel_data_alloc();
30382c33481SHuisong Li rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL);
30482c33481SHuisong Li
30582c33481SHuisong Li struct rte_tel_data *child_data2 = rte_tel_data_alloc();
30682c33481SHuisong Li rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL);
30782c33481SHuisong Li
30882c33481SHuisong Li rte_tel_data_start_dict(&response_data);
30982c33481SHuisong Li
31082c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data, (uint32_t)0x888, 0);
31182c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data2, (uint64_t)0x8888, 0);
31282c33481SHuisong Li
31382c33481SHuisong Li rte_tel_data_add_dict_container(&response_data, "dict_0",
31482c33481SHuisong Li child_data, 0);
31582c33481SHuisong Li rte_tel_data_add_dict_container(&response_data, "dict_1",
31682c33481SHuisong Li child_data2, 0);
31782c33481SHuisong Li
31882c33481SHuisong Li return CHECK_OUTPUT("{\"dict_0\":[\"0x888\"],\"dict_1\":[\"0x8888\"]}");
31982c33481SHuisong Li }
32082c33481SHuisong Li
32182c33481SHuisong Li static int
test_dict_with_dict_values(void)322d2671e64SRadu Nicolau test_dict_with_dict_values(void)
323d2671e64SRadu Nicolau {
324d2671e64SRadu Nicolau struct rte_tel_data *dict_of_dicts = rte_tel_data_alloc();
325d2671e64SRadu Nicolau rte_tel_data_start_dict(dict_of_dicts);
326d2671e64SRadu Nicolau
327d2671e64SRadu Nicolau struct rte_tel_data *child_data = rte_tel_data_alloc();
328d2671e64SRadu Nicolau rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL);
329d2671e64SRadu Nicolau
330d2671e64SRadu Nicolau struct rte_tel_data *child_data2 = rte_tel_data_alloc();
331d2671e64SRadu Nicolau rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL);
332d2671e64SRadu Nicolau
333d2671e64SRadu Nicolau rte_tel_data_start_dict(&response_data);
334d2671e64SRadu Nicolau
335d2671e64SRadu Nicolau rte_tel_data_add_array_string(child_data, "aaaa");
336d2671e64SRadu Nicolau rte_tel_data_add_array_string(child_data2, "bbbb");
337d2671e64SRadu Nicolau rte_tel_data_add_dict_container(dict_of_dicts, "dict_0",
338d2671e64SRadu Nicolau child_data, 0);
339d2671e64SRadu Nicolau rte_tel_data_add_dict_container(dict_of_dicts, "dict_1",
340d2671e64SRadu Nicolau child_data2, 0);
341d2671e64SRadu Nicolau rte_tel_data_add_dict_container(&response_data, "dict_of_dicts",
342d2671e64SRadu Nicolau dict_of_dicts, 0);
343d2671e64SRadu Nicolau
3441306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_of_dicts\":{\"dict_0\":[\"aaaa\"],\"dict_1\":[\"bbbb\"]}}");
345d2671e64SRadu Nicolau }
346d2671e64SRadu Nicolau
347d2671e64SRadu Nicolau static int
test_array_with_array_string_values(void)348bd78cf69SLouise Kilheeney test_array_with_array_string_values(void)
349bd78cf69SLouise Kilheeney {
350bd78cf69SLouise Kilheeney struct rte_tel_data *child_data = rte_tel_data_alloc();
351bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL);
352bd78cf69SLouise Kilheeney
353bd78cf69SLouise Kilheeney struct rte_tel_data *child_data2 = rte_tel_data_alloc();
354bd78cf69SLouise Kilheeney rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL);
355bd78cf69SLouise Kilheeney
356bd78cf69SLouise Kilheeney rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER);
357bd78cf69SLouise Kilheeney
358bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(child_data, "aaaa");
359bd78cf69SLouise Kilheeney rte_tel_data_add_array_string(child_data2, "bbbb");
360bd78cf69SLouise Kilheeney
361bd78cf69SLouise Kilheeney rte_tel_data_add_array_container(&response_data, child_data, 0);
362bd78cf69SLouise Kilheeney rte_tel_data_add_array_container(&response_data, child_data2, 0);
363bd78cf69SLouise Kilheeney
3641306df2cSBruce Richardson return CHECK_OUTPUT("[[\"aaaa\"],[\"bbbb\"]]");
365bd78cf69SLouise Kilheeney }
366bd78cf69SLouise Kilheeney
367bd78cf69SLouise Kilheeney static int
test_array_with_array_uint_hex_values_padding(void)36882c33481SHuisong Li test_array_with_array_uint_hex_values_padding(void)
36982c33481SHuisong Li {
37082c33481SHuisong Li struct rte_tel_data *child_data = rte_tel_data_alloc();
37182c33481SHuisong Li rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL);
37282c33481SHuisong Li
37382c33481SHuisong Li struct rte_tel_data *child_data2 = rte_tel_data_alloc();
37482c33481SHuisong Li rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL);
37582c33481SHuisong Li
37682c33481SHuisong Li rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER);
37782c33481SHuisong Li
37882c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data, (uint32_t)0x888, 32);
37982c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data2, (uint64_t)0x8888, 64);
38082c33481SHuisong Li
38182c33481SHuisong Li rte_tel_data_add_array_container(&response_data, child_data, 0);
38282c33481SHuisong Li rte_tel_data_add_array_container(&response_data, child_data2, 0);
38382c33481SHuisong Li
38482c33481SHuisong Li return CHECK_OUTPUT("[[\"0x00000888\"],[\"0x0000000000008888\"]]");
38582c33481SHuisong Li }
38682c33481SHuisong Li
38782c33481SHuisong Li
38882c33481SHuisong Li static int
test_array_with_array_uint_hex_values_nopadding(void)38982c33481SHuisong Li test_array_with_array_uint_hex_values_nopadding(void)
39082c33481SHuisong Li {
39182c33481SHuisong Li struct rte_tel_data *child_data = rte_tel_data_alloc();
39282c33481SHuisong Li rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL);
39382c33481SHuisong Li
39482c33481SHuisong Li struct rte_tel_data *child_data2 = rte_tel_data_alloc();
39582c33481SHuisong Li rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL);
39682c33481SHuisong Li
39782c33481SHuisong Li rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER);
39882c33481SHuisong Li
39982c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data, (uint32_t)0x888, 0);
40082c33481SHuisong Li rte_tel_data_add_array_uint_hex(child_data2, (uint64_t)0x8888, 0);
40182c33481SHuisong Li
40282c33481SHuisong Li rte_tel_data_add_array_container(&response_data, child_data, 0);
40382c33481SHuisong Li rte_tel_data_add_array_container(&response_data, child_data2, 0);
40482c33481SHuisong Li
40582c33481SHuisong Li return CHECK_OUTPUT("[[\"0x888\"],[\"0x8888\"]]");
40682c33481SHuisong Li }
40782c33481SHuisong Li
40882c33481SHuisong Li static int
test_case_array_u64(void)409bd78cf69SLouise Kilheeney test_case_array_u64(void)
410bd78cf69SLouise Kilheeney {
411bd78cf69SLouise Kilheeney int i;
4121306df2cSBruce Richardson
4132d2c55e4SBruce Richardson rte_tel_data_start_array(&response_data, RTE_TEL_UINT_VAL);
414bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++)
415af0785a2SBruce Richardson rte_tel_data_add_array_uint(&response_data, i);
4161306df2cSBruce Richardson return CHECK_OUTPUT("[0,1,2,3,4]");
417bd78cf69SLouise Kilheeney }
418bd78cf69SLouise Kilheeney
419bd78cf69SLouise Kilheeney static int
test_case_array_uint_hex_padding(void)42082c33481SHuisong Li test_case_array_uint_hex_padding(void)
42182c33481SHuisong Li {
42282c33481SHuisong Li rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL);
42382c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint8_t)0x8, 8);
42482c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint16_t)0x88, 16);
42582c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint32_t)0x888, 32);
42682c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint64_t)0x8888, 64);
42782c33481SHuisong Li
42882c33481SHuisong Li return CHECK_OUTPUT("[\"0x08\",\"0x0088\",\"0x00000888\",\"0x0000000000008888\"]");
42982c33481SHuisong Li }
43082c33481SHuisong Li
43182c33481SHuisong Li static int
test_case_array_uint_hex_nopadding(void)43282c33481SHuisong Li test_case_array_uint_hex_nopadding(void)
43382c33481SHuisong Li {
43482c33481SHuisong Li rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL);
43582c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint8_t)0x8, 0);
43682c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint16_t)0x88, 0);
43782c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint32_t)0x888, 0);
43882c33481SHuisong Li rte_tel_data_add_array_uint_hex(&response_data, (uint64_t)0x8888, 0);
43982c33481SHuisong Li
44082c33481SHuisong Li return CHECK_OUTPUT("[\"0x8\",\"0x88\",\"0x888\",\"0x8888\"]");
44182c33481SHuisong Li }
44282c33481SHuisong Li
44382c33481SHuisong Li static int
test_case_add_dict_u64(void)444bd78cf69SLouise Kilheeney test_case_add_dict_u64(void)
445bd78cf69SLouise Kilheeney {
446bd78cf69SLouise Kilheeney int i = 0;
447bd78cf69SLouise Kilheeney char name_of_value[8];
448bd78cf69SLouise Kilheeney
449bd78cf69SLouise Kilheeney rte_tel_data_start_dict(&response_data);
450bd78cf69SLouise Kilheeney
451bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++) {
452bd78cf69SLouise Kilheeney sprintf(name_of_value, "dict_%d", i);
453af0785a2SBruce Richardson rte_tel_data_add_dict_uint(&response_data, name_of_value, i);
454bd78cf69SLouise Kilheeney }
4551306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_0\":0,\"dict_1\":1,\"dict_2\":2,\"dict_3\":3,\"dict_4\":4}");
456bd78cf69SLouise Kilheeney }
457bd78cf69SLouise Kilheeney
458bd78cf69SLouise Kilheeney static int
test_dict_with_array_u64_values(void)459bd78cf69SLouise Kilheeney test_dict_with_array_u64_values(void)
460bd78cf69SLouise Kilheeney {
461bd78cf69SLouise Kilheeney int i;
462bd78cf69SLouise Kilheeney
463bd78cf69SLouise Kilheeney struct rte_tel_data *child_data = rte_tel_data_alloc();
4642d2c55e4SBruce Richardson rte_tel_data_start_array(child_data, RTE_TEL_UINT_VAL);
465bd78cf69SLouise Kilheeney
466bd78cf69SLouise Kilheeney struct rte_tel_data *child_data2 = rte_tel_data_alloc();
4672d2c55e4SBruce Richardson rte_tel_data_start_array(child_data2, RTE_TEL_UINT_VAL);
468bd78cf69SLouise Kilheeney
469bd78cf69SLouise Kilheeney rte_tel_data_start_dict(&response_data);
470bd78cf69SLouise Kilheeney
471bd78cf69SLouise Kilheeney for (i = 0; i < 10; i++) {
472af0785a2SBruce Richardson rte_tel_data_add_array_uint(child_data, i);
473af0785a2SBruce Richardson rte_tel_data_add_array_uint(child_data2, i);
474bd78cf69SLouise Kilheeney }
475bd78cf69SLouise Kilheeney
476bd78cf69SLouise Kilheeney rte_tel_data_add_dict_container(&response_data, "dict_0",
477bd78cf69SLouise Kilheeney child_data, 0);
478bd78cf69SLouise Kilheeney rte_tel_data_add_dict_container(&response_data, "dict_1",
479bd78cf69SLouise Kilheeney child_data2, 0);
480bd78cf69SLouise Kilheeney
4811306df2cSBruce Richardson return CHECK_OUTPUT("{\"dict_0\":[0,1,2,3,4,5,6,7,8,9],\"dict_1\":[0,1,2,3,4,5,6,7,8,9]}");
482bd78cf69SLouise Kilheeney }
483bd78cf69SLouise Kilheeney
484bd78cf69SLouise Kilheeney static int
test_array_with_array_u64_values(void)485bd78cf69SLouise Kilheeney test_array_with_array_u64_values(void)
486bd78cf69SLouise Kilheeney {
487bd78cf69SLouise Kilheeney int i;
488bd78cf69SLouise Kilheeney
489bd78cf69SLouise Kilheeney struct rte_tel_data *child_data = rte_tel_data_alloc();
4902d2c55e4SBruce Richardson rte_tel_data_start_array(child_data, RTE_TEL_UINT_VAL);
491bd78cf69SLouise Kilheeney
492bd78cf69SLouise Kilheeney struct rte_tel_data *child_data2 = rte_tel_data_alloc();
4932d2c55e4SBruce Richardson rte_tel_data_start_array(child_data2, RTE_TEL_UINT_VAL);
494bd78cf69SLouise Kilheeney
495bd78cf69SLouise Kilheeney rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER);
496bd78cf69SLouise Kilheeney
497bd78cf69SLouise Kilheeney for (i = 0; i < 5; i++) {
498af0785a2SBruce Richardson rte_tel_data_add_array_uint(child_data, i);
499af0785a2SBruce Richardson rte_tel_data_add_array_uint(child_data2, i);
500bd78cf69SLouise Kilheeney }
501bd78cf69SLouise Kilheeney rte_tel_data_add_array_container(&response_data, child_data, 0);
502bd78cf69SLouise Kilheeney rte_tel_data_add_array_container(&response_data, child_data2, 0);
503bd78cf69SLouise Kilheeney
5041306df2cSBruce Richardson return CHECK_OUTPUT("[[0,1,2,3,4],[0,1,2,3,4]]");
505bd78cf69SLouise Kilheeney }
506bd78cf69SLouise Kilheeney
507bd78cf69SLouise Kilheeney static int
test_string_char_escaping(void)508d0049f7aSBruce Richardson test_string_char_escaping(void)
509d0049f7aSBruce Richardson {
510d0049f7aSBruce Richardson rte_tel_data_string(&response_data, "hello,\nworld\n");
511d0049f7aSBruce Richardson return CHECK_OUTPUT("\"hello,\\nworld\\n\"");
512d0049f7aSBruce Richardson }
513d0049f7aSBruce Richardson
514d0049f7aSBruce Richardson static int
test_array_char_escaping(void)515d0049f7aSBruce Richardson test_array_char_escaping(void)
516d0049f7aSBruce Richardson {
517d0049f7aSBruce Richardson rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL);
518d0049f7aSBruce Richardson rte_tel_data_add_array_string(&response_data, "\\escape\r");
519d0049f7aSBruce Richardson rte_tel_data_add_array_string(&response_data, "characters\n");
520d0049f7aSBruce Richardson return CHECK_OUTPUT("[\"\\\\escape\\r\",\"characters\\n\"]");
521d0049f7aSBruce Richardson }
522d0049f7aSBruce Richardson
523d0049f7aSBruce Richardson static int
test_dict_char_escaping(void)524d0049f7aSBruce Richardson test_dict_char_escaping(void)
525d0049f7aSBruce Richardson {
526d0049f7aSBruce Richardson rte_tel_data_start_dict(&response_data);
527d0049f7aSBruce Richardson rte_tel_data_add_dict_string(&response_data, "name", "escaped\n\tvalue");
528d0049f7aSBruce Richardson return CHECK_OUTPUT("{\"name\":\"escaped\\n\\tvalue\"}");
529d0049f7aSBruce Richardson }
530d0049f7aSBruce Richardson
531d0049f7aSBruce Richardson static int
connect_to_socket(void)532bd78cf69SLouise Kilheeney connect_to_socket(void)
533bd78cf69SLouise Kilheeney {
534bd78cf69SLouise Kilheeney char buf[BUF_SIZE];
535bd78cf69SLouise Kilheeney int sock, bytes;
536bd78cf69SLouise Kilheeney struct sockaddr_un telem_addr;
537bd78cf69SLouise Kilheeney
538bd78cf69SLouise Kilheeney sock = socket(AF_UNIX, SOCK_SEQPACKET, 0);
539bd78cf69SLouise Kilheeney if (sock < 0) {
540bd78cf69SLouise Kilheeney printf("\n%s: Error creating socket: %s\n", __func__,
541bd78cf69SLouise Kilheeney strerror(errno));
542bd78cf69SLouise Kilheeney return -1;
543bd78cf69SLouise Kilheeney }
544bd78cf69SLouise Kilheeney telem_addr.sun_family = AF_UNIX;
545bd78cf69SLouise Kilheeney snprintf(telem_addr.sun_path, sizeof(telem_addr.sun_path),
546bd78cf69SLouise Kilheeney "%s/dpdk_telemetry.%s", rte_eal_get_runtime_dir(),
547bd78cf69SLouise Kilheeney TELEMETRY_VERSION);
548bd78cf69SLouise Kilheeney if (connect(sock, (struct sockaddr *) &telem_addr,
5498b4a23f1SCiara Power sizeof(telem_addr)) < 0) {
550bd78cf69SLouise Kilheeney printf("\n%s: Error connecting to socket: %s\n", __func__,
551bd78cf69SLouise Kilheeney strerror(errno));
5528b4a23f1SCiara Power close(sock);
5538b4a23f1SCiara Power return -1;
5548b4a23f1SCiara Power }
555bd78cf69SLouise Kilheeney
556bd78cf69SLouise Kilheeney bytes = read(sock, buf, sizeof(buf) - 1);
557bd78cf69SLouise Kilheeney if (bytes < 0) {
558bd78cf69SLouise Kilheeney printf("%s: Error with socket read - %s\n", __func__,
559bd78cf69SLouise Kilheeney strerror(errno));
56089ce9f09SCiara Power close(sock);
561bd78cf69SLouise Kilheeney return -1;
562bd78cf69SLouise Kilheeney }
563bd78cf69SLouise Kilheeney buf[bytes] = '\0';
564bd78cf69SLouise Kilheeney printf("\n%s: %s\n", __func__, buf);
565bd78cf69SLouise Kilheeney return sock;
566bd78cf69SLouise Kilheeney }
567bd78cf69SLouise Kilheeney
568bd78cf69SLouise Kilheeney static int
telemetry_data_autotest(void)5691306df2cSBruce Richardson telemetry_data_autotest(void)
570bd78cf69SLouise Kilheeney {
571bd78cf69SLouise Kilheeney typedef int (*test_case)(void);
572bd78cf69SLouise Kilheeney unsigned int i = 0;
573bd78cf69SLouise Kilheeney
574bd78cf69SLouise Kilheeney sock = connect_to_socket();
575bd78cf69SLouise Kilheeney if (sock <= 0)
576bd78cf69SLouise Kilheeney return -1;
577bd78cf69SLouise Kilheeney
5781306df2cSBruce Richardson test_case test_cases[] = {
5790f3d92f3SBruce Richardson test_null_return,
5801306df2cSBruce Richardson test_simple_string,
5811306df2cSBruce Richardson test_case_array_string,
582bd78cf69SLouise Kilheeney test_case_array_int, test_case_array_u64,
58382c33481SHuisong Li test_case_array_uint_hex_padding,
58482c33481SHuisong Li test_case_array_uint_hex_nopadding,
585bd78cf69SLouise Kilheeney test_case_add_dict_int, test_case_add_dict_u64,
586bd78cf69SLouise Kilheeney test_case_add_dict_string,
58782c33481SHuisong Li test_case_add_dict_uint_hex_padding,
58882c33481SHuisong Li test_case_add_dict_uint_hex_nopadding,
589bd78cf69SLouise Kilheeney test_dict_with_array_int_values,
590bd78cf69SLouise Kilheeney test_dict_with_array_u64_values,
591bd78cf69SLouise Kilheeney test_dict_with_array_string_values,
59282c33481SHuisong Li test_dict_with_array_uint_hex_values_padding,
59382c33481SHuisong Li test_dict_with_array_uint_hex_values_nopadding,
594d2671e64SRadu Nicolau test_dict_with_dict_values,
595bd78cf69SLouise Kilheeney test_array_with_array_int_values,
596bd78cf69SLouise Kilheeney test_array_with_array_u64_values,
597d0049f7aSBruce Richardson test_array_with_array_string_values,
59882c33481SHuisong Li test_array_with_array_uint_hex_values_padding,
59982c33481SHuisong Li test_array_with_array_uint_hex_values_nopadding,
600d0049f7aSBruce Richardson test_string_char_escaping,
601d0049f7aSBruce Richardson test_array_char_escaping,
602d0049f7aSBruce Richardson test_dict_char_escaping,
603d0049f7aSBruce Richardson };
604bd78cf69SLouise Kilheeney
6051306df2cSBruce Richardson rte_telemetry_register_cmd(REQUEST_CMD, telemetry_test_cb, "Test");
606bd78cf69SLouise Kilheeney for (i = 0; i < RTE_DIM(test_cases); i++) {
6071306df2cSBruce Richardson memset(&response_data, 0, sizeof(response_data));
608bd78cf69SLouise Kilheeney if (test_cases[i]() != 0) {
609bd78cf69SLouise Kilheeney close(sock);
610bd78cf69SLouise Kilheeney return -1;
611bd78cf69SLouise Kilheeney }
612bd78cf69SLouise Kilheeney }
613bd78cf69SLouise Kilheeney close(sock);
614bd78cf69SLouise Kilheeney return 0;
615bd78cf69SLouise Kilheeney }
616c9ba6aa3SBruce Richardson #endif /* !RTE_EXEC_ENV_WINDOWS */
617bd78cf69SLouise Kilheeney
618*d83fb967SDavid Marchand REGISTER_FAST_TEST(telemetry_data_autotest, true, true, telemetry_data_autotest);
619