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:
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
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"
23 typedef cJSON *(* tojson_fn_t)(void *);
24 typedef void *(* fromjson_fn_t)(cJSON *o, int *len);
27 test (tojson_fn_t tojson, fromjson_fn_t fromjson, cJSON *o, bool should_fail)
29 // convert JSON object to API
31 void *mp = (fromjson)(o, &len);
34 // convert API to JSON
35 cJSON *o2 = (tojson)(mp);
39 assert(!cJSON_Compare(o, o2, 1));
41 assert(cJSON_Compare(o, o2, 1));
42 char *s2 = cJSON_Print(o2);
45 char *in = cJSON_Print(o);
46 printf("%s\n%s\n", in, s2);
57 fromjson_fn_t fromjson;
64 uword *function_by_name_tojson;
65 uword *function_by_name_fromjson;
67 register_functions(struct msgs msgs[], int n)
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);
79 runtest (char *s, bool should_fail)
81 cJSON *o = cJSON_Parse(s);
83 char *name = cJSON_GetStringValue(cJSON_GetObjectItem(o, "_msgname"));
86 uword *p = hash_get_mem(function_by_name_tojson, name);
88 tojson_fn_t tojson = (tojson_fn_t)p[0];
90 p = hash_get_mem(function_by_name_fromjson, name);
92 fromjson_fn_t fromjson = (fromjson_fn_t)p[0];
94 test(tojson, fromjson, o, should_fail);
98 struct msgs msgs[] = {
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,
106 .tojson = (tojson_fn_t)vl_api_test_enum_t_tojson,
107 .fromjson = (fromjson_fn_t)vl_api_test_enum_t_fromjson,
111 struct tests tests[] = {
112 {.s = "{\"_msgname\": \"test_prefix\", \"pref\": \"2001:db8::/64\"}"},
113 {.s = "{\"_msgname\": \"test_prefix\", \"pref\": \"192.168.10.0/24\"}"},
114 {.s = "{\"_msgname\": \"test_enum\", \"flags\": [\"RED\", \"BLUE\"]}"},
115 {.s = "{\"_msgname\": \"test_enum\", \"flags\": [\"BLACK\", \"BLUE\"]}",
119 int main (int argc, char **argv)
121 clib_mem_init (0, 64 << 20);
122 int n = sizeof(msgs)/sizeof(msgs[0]);
123 register_functions(msgs, n);
126 n = sizeof(tests)/sizeof(tests[0]);
127 for (i = 0; i < n; i++) {
128 runtest(tests[i].s, tests[i].should_fail);