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