vppapigen: fix fromjson coverity errors in generation
[vpp.git] / src / vat2 / test / vat2_test.c
1 /*
2  * Copyright (c) 2020 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #include <stdio.h>
17 #include <assert.h>
18 #include <vlibapi/api.h>
19 #include "vat2/test/vat2_test.api_types.h"
20 #include "vat2/test/vat2_test.api_tojson.h"
21 #include "vat2/test/vat2_test.api_fromjson.h"
22
23 typedef cJSON *(* tojson_fn_t)(void *);
24 typedef void *(* fromjson_fn_t)(cJSON *o, int *len);
25
26 static void
27 test (tojson_fn_t tojson, fromjson_fn_t fromjson, cJSON *o, bool should_fail)
28 {
29   // convert JSON object to API
30   int len = 0;
31   void *mp = (fromjson)(o, &len);
32   assert(mp);
33
34   // convert API to JSON
35   cJSON *o2 = (tojson)(mp);
36   assert(o2);
37
38   if (should_fail)
39     assert(!cJSON_Compare(o, o2, 1));
40   else
41     assert(cJSON_Compare(o, o2, 1));
42   char *s2 = cJSON_Print(o2);
43   assert(s2);
44
45   char *in = cJSON_Print(o);
46   printf("%s\n%s\n", in, s2);
47
48   free(in);
49   free(mp);
50   cJSON_Delete(o2);
51   free(s2);
52 }
53
54 struct msgs {
55   char *name;
56   tojson_fn_t tojson;
57   fromjson_fn_t fromjson;
58 };
59 struct tests {
60   char *s;
61   bool should_fail;
62 };
63
64 uword *function_by_name_tojson;
65 uword *function_by_name_fromjson;
66 static void
67 register_functions(struct msgs msgs[], int n)
68 {
69   int i;
70   function_by_name_tojson = hash_create_string (0, sizeof (uword));
71   function_by_name_fromjson = hash_create_string (0, sizeof (uword));
72   for (i = 0; i < n; i++) {
73     hash_set_mem(function_by_name_tojson, msgs[i].name, msgs[i].tojson);
74     hash_set_mem(function_by_name_fromjson, msgs[i].name, msgs[i].fromjson);
75   }
76 }
77
78 static void
79 runtest (char *s, bool should_fail)
80 {
81   cJSON *o = cJSON_Parse(s);
82   assert(o);
83   char *name = cJSON_GetStringValue(cJSON_GetObjectItem(o, "_msgname"));
84   assert(name);
85
86   uword *p = hash_get_mem(function_by_name_tojson, name);
87   assert(p);
88   tojson_fn_t tojson = (tojson_fn_t)p[0];
89
90   p = hash_get_mem(function_by_name_fromjson, name);
91   assert(p);
92   fromjson_fn_t fromjson = (fromjson_fn_t)p[0];
93
94   test(tojson, fromjson, o, should_fail);
95   cJSON_Delete(o);
96 }
97
98 struct msgs msgs[] = {
99   {
100     .name = "test_prefix",
101     .tojson = (tojson_fn_t) vl_api_test_prefix_t_tojson,
102     .fromjson = (fromjson_fn_t) vl_api_test_prefix_t_fromjson,
103   },
104   {
105     .name = "test_enum",
106     .tojson = (tojson_fn_t) vl_api_test_enum_t_tojson,
107     .fromjson = (fromjson_fn_t) vl_api_test_enum_t_fromjson,
108   },
109   {
110     .name = "test_string",
111     .tojson = (tojson_fn_t) vl_api_test_string_t_tojson,
112     .fromjson = (fromjson_fn_t) vl_api_test_string_t_fromjson,
113   },
114   {
115     .name = "test_string2",
116     .tojson = (tojson_fn_t) vl_api_test_string2_t_tojson,
117     .fromjson = (fromjson_fn_t) vl_api_test_string2_t_fromjson,
118   },
119 };
120
121 struct tests tests[] = {
122   { .s = "{\"_msgname\": \"test_prefix\", \"pref\": \"2001:db8::/64\"}" },
123   { .s = "{\"_msgname\": \"test_prefix\", \"pref\": \"192.168.10.0/24\"}" },
124   { .s = "{\"_msgname\": \"test_enum\", \"flags\": [\"RED\", \"BLUE\"]}" },
125   { .s = "{\"_msgname\": \"test_enum\", \"flags\": [\"BLACK\", \"BLUE\"]}",
126     .should_fail = 1 },
127   { .s = "{\"_msgname\": \"test_string\", \"str\": {\"str\": \"Test string "
128          "type\"}}" },
129   { .s =
130       "{\"_msgname\": \"test_string2\", \"str\": \"Test string toplevel\"}" },
131 };
132
133 int main (int argc, char **argv)
134 {
135   clib_mem_init (0, 64 << 20);
136   int n = sizeof(msgs)/sizeof(msgs[0]);
137   register_functions(msgs, n);
138
139   int i;
140   n = sizeof(tests)/sizeof(tests[0]);
141   for (i = 0; i < n; i++) {
142     runtest(tests[i].s, tests[i].should_fail);
143   }
144 }