xref: /f-stack/dpdk/app/test/test_telemetry_json.c (revision 2d9fd380)
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 
7*2d9fd380Sjfb8856606 #include "../../lib/librte_telemetry/telemetry_json.h"
8*2d9fd380Sjfb8856606 #include "test.h"
9*2d9fd380Sjfb8856606 
10*2d9fd380Sjfb8856606 static int
test_basic_array(void)11*2d9fd380Sjfb8856606 test_basic_array(void)
12*2d9fd380Sjfb8856606 {
13*2d9fd380Sjfb8856606 	const char *expected = "[\"meaning of life\",42]";
14*2d9fd380Sjfb8856606 	char buf[1024];
15*2d9fd380Sjfb8856606 	int used = 0;
16*2d9fd380Sjfb8856606 
17*2d9fd380Sjfb8856606 	printf("%s: ", __func__);
18*2d9fd380Sjfb8856606 	used = rte_tel_json_empty_array(buf, sizeof(buf), used);
19*2d9fd380Sjfb8856606 	if (used != 2 || strcmp(buf, "[]"))
20*2d9fd380Sjfb8856606 		return -1;
21*2d9fd380Sjfb8856606 
22*2d9fd380Sjfb8856606 	used = rte_tel_json_add_array_string(buf, sizeof(buf), used,
23*2d9fd380Sjfb8856606 		"meaning of life");
24*2d9fd380Sjfb8856606 	used = rte_tel_json_add_array_int(buf, sizeof(buf), used, 42);
25*2d9fd380Sjfb8856606 
26*2d9fd380Sjfb8856606 	printf("buf = '%s', expected = '%s'\n", buf, expected);
27*2d9fd380Sjfb8856606 	if (used != (int)strlen(expected))
28*2d9fd380Sjfb8856606 		return -1;
29*2d9fd380Sjfb8856606 	return strncmp(expected, buf, sizeof(buf));
30*2d9fd380Sjfb8856606 }
31*2d9fd380Sjfb8856606 
32*2d9fd380Sjfb8856606 static int
test_basic_obj(void)33*2d9fd380Sjfb8856606 test_basic_obj(void)
34*2d9fd380Sjfb8856606 {
35*2d9fd380Sjfb8856606 	const char *expected = "{\"weddings\":4,\"funerals\":1}";
36*2d9fd380Sjfb8856606 	char buf[1024];
37*2d9fd380Sjfb8856606 	int used = 0;
38*2d9fd380Sjfb8856606 
39*2d9fd380Sjfb8856606 	used = rte_tel_json_add_obj_u64(buf, sizeof(buf), used,
40*2d9fd380Sjfb8856606 		"weddings", 4);
41*2d9fd380Sjfb8856606 	used = rte_tel_json_add_obj_u64(buf, sizeof(buf), used,
42*2d9fd380Sjfb8856606 		"funerals", 1);
43*2d9fd380Sjfb8856606 
44*2d9fd380Sjfb8856606 	printf("%s: buf = '%s', expected = '%s'\n", __func__, buf, expected);
45*2d9fd380Sjfb8856606 	if (used != (int)strlen(expected))
46*2d9fd380Sjfb8856606 		return -1;
47*2d9fd380Sjfb8856606 	return strncmp(expected, buf, sizeof(buf));
48*2d9fd380Sjfb8856606 }
49*2d9fd380Sjfb8856606 
50*2d9fd380Sjfb8856606 static int
test_overflow_array(void)51*2d9fd380Sjfb8856606 test_overflow_array(void)
52*2d9fd380Sjfb8856606 {
53*2d9fd380Sjfb8856606 	static const char * const strs[] = {"Arsenal", "Chelsea", "Liverpool",
54*2d9fd380Sjfb8856606 			"Spurs"};
55*2d9fd380Sjfb8856606 	const char *expected = "[\"Arsenal\",\"Chelsea\"]";
56*2d9fd380Sjfb8856606 	char buf[25];
57*2d9fd380Sjfb8856606 	int i, used = 0;
58*2d9fd380Sjfb8856606 
59*2d9fd380Sjfb8856606 	for (i = 0; i < (int)RTE_DIM(strs); i++)
60*2d9fd380Sjfb8856606 		used = rte_tel_json_add_array_string(buf, sizeof(buf), used,
61*2d9fd380Sjfb8856606 				strs[i]);
62*2d9fd380Sjfb8856606 
63*2d9fd380Sjfb8856606 	printf("%s: buf = '%s', expected = '%s'\n", __func__, buf, expected);
64*2d9fd380Sjfb8856606 	if (buf[used - 1] != ']')
65*2d9fd380Sjfb8856606 		return -1;
66*2d9fd380Sjfb8856606 	if (used != (int)strlen(expected))
67*2d9fd380Sjfb8856606 		return -1;
68*2d9fd380Sjfb8856606 	return strncmp(expected, buf, sizeof(buf));
69*2d9fd380Sjfb8856606 }
70*2d9fd380Sjfb8856606 
71*2d9fd380Sjfb8856606 static int
test_overflow_obj(void)72*2d9fd380Sjfb8856606 test_overflow_obj(void)
73*2d9fd380Sjfb8856606 {
74*2d9fd380Sjfb8856606 	static const char * const names[] = {"Italy", "Wales", "Scotland",
75*2d9fd380Sjfb8856606 			"Ireland", "England", "France"};
76*2d9fd380Sjfb8856606 	const int vals[RTE_DIM(names)] = {20, 61, 10, 40, 55, 35};
77*2d9fd380Sjfb8856606 	const char *expected = "{\"Italy\":20,\"Wales\":61}";
78*2d9fd380Sjfb8856606 	char buf[25];
79*2d9fd380Sjfb8856606 	int i, used = 0;
80*2d9fd380Sjfb8856606 
81*2d9fd380Sjfb8856606 	for (i = 0; i < (int)RTE_DIM(names); i++)
82*2d9fd380Sjfb8856606 		used = rte_tel_json_add_obj_u64(buf, sizeof(buf), used,
83*2d9fd380Sjfb8856606 				names[i], vals[i]);
84*2d9fd380Sjfb8856606 
85*2d9fd380Sjfb8856606 	printf("%s: buf = '%s', expected = '%s'\n", __func__, buf, expected);
86*2d9fd380Sjfb8856606 	if (buf[used - 1] != '}')
87*2d9fd380Sjfb8856606 		return -1;
88*2d9fd380Sjfb8856606 	if (used != (int)strlen(expected))
89*2d9fd380Sjfb8856606 		return -1;
90*2d9fd380Sjfb8856606 	return strncmp(expected, buf, sizeof(buf));
91*2d9fd380Sjfb8856606 }
92*2d9fd380Sjfb8856606 
93*2d9fd380Sjfb8856606 static int
test_large_array_element(void)94*2d9fd380Sjfb8856606 test_large_array_element(void)
95*2d9fd380Sjfb8856606 {
96*2d9fd380Sjfb8856606 	static const char str[] = "A really long string to overflow buffer";
97*2d9fd380Sjfb8856606 	/* buffer should be unmodified so initial value and expected are same */
98*2d9fd380Sjfb8856606 	const char *expected = "ABC";
99*2d9fd380Sjfb8856606 	char buf[sizeof(str) - 5] = "ABC";
100*2d9fd380Sjfb8856606 	int used = 0;
101*2d9fd380Sjfb8856606 
102*2d9fd380Sjfb8856606 	used = rte_tel_json_add_array_string(buf, sizeof(buf), used, str);
103*2d9fd380Sjfb8856606 	printf("%s: buf = '%s', expected = '%s'\n", __func__, buf, expected);
104*2d9fd380Sjfb8856606 
105*2d9fd380Sjfb8856606 	return strlen(buf) != 0;
106*2d9fd380Sjfb8856606 }
107*2d9fd380Sjfb8856606 
108*2d9fd380Sjfb8856606 static int
test_large_obj_element(void)109*2d9fd380Sjfb8856606 test_large_obj_element(void)
110*2d9fd380Sjfb8856606 {
111*2d9fd380Sjfb8856606 	static const char str[] = "A really long string to overflow buffer";
112*2d9fd380Sjfb8856606 	/* buffer should be unmodified so initial value and expected are same */
113*2d9fd380Sjfb8856606 	const char *expected = "XYZ";
114*2d9fd380Sjfb8856606 	char buf[sizeof(str) - 5] = "XYZ";
115*2d9fd380Sjfb8856606 	int used = 0;
116*2d9fd380Sjfb8856606 
117*2d9fd380Sjfb8856606 	used = rte_tel_json_add_obj_u64(buf, sizeof(buf), used, str, 0);
118*2d9fd380Sjfb8856606 	printf("%s: buf = '%s', expected = '%s'\n", __func__, buf, expected);
119*2d9fd380Sjfb8856606 
120*2d9fd380Sjfb8856606 	return strlen(buf) != 0;
121*2d9fd380Sjfb8856606 }
122*2d9fd380Sjfb8856606 
123*2d9fd380Sjfb8856606 static int
test_telemetry_json(void)124*2d9fd380Sjfb8856606 test_telemetry_json(void)
125*2d9fd380Sjfb8856606 {
126*2d9fd380Sjfb8856606 	if (test_basic_array() < 0 ||
127*2d9fd380Sjfb8856606 			test_basic_obj() < 0 ||
128*2d9fd380Sjfb8856606 			test_overflow_array() < 0 ||
129*2d9fd380Sjfb8856606 			test_overflow_obj() < 0 ||
130*2d9fd380Sjfb8856606 			test_large_array_element() < 0 ||
131*2d9fd380Sjfb8856606 			test_large_obj_element() < 0)
132*2d9fd380Sjfb8856606 		return -1;
133*2d9fd380Sjfb8856606 	return 0;
134*2d9fd380Sjfb8856606 }
135*2d9fd380Sjfb8856606 
136*2d9fd380Sjfb8856606 REGISTER_TEST_COMMAND(telemetry_json_autotest, test_telemetry_json);
137