bpf: allow self-xor operation
[dpdk.git] / app / test / test_telemetry_json.c
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);