xref: /aosp_15_r20/external/libwebsockets/minimal-examples/api-tests/api-test-lejp/main.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * lws-api-test-lejp
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Written in 2010-2020 by Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker  *
6*1c60b9acSAndroid Build Coastguard Worker  * This file is made available under the Creative Commons CC0 1.0
7*1c60b9acSAndroid Build Coastguard Worker  * Universal Public Domain Dedication.
8*1c60b9acSAndroid Build Coastguard Worker  *
9*1c60b9acSAndroid Build Coastguard Worker  * sanity tests for lejp
10*1c60b9acSAndroid Build Coastguard Worker  */
11*1c60b9acSAndroid Build Coastguard Worker 
12*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
13*1c60b9acSAndroid Build Coastguard Worker 
14*1c60b9acSAndroid Build Coastguard Worker /*
15*1c60b9acSAndroid Build Coastguard Worker  * in this example, the JSON is for one "builder" object, which may specify
16*1c60b9acSAndroid Build Coastguard Worker  * a child list "targets" of zero or more "target" objects.
17*1c60b9acSAndroid Build Coastguard Worker  */
18*1c60b9acSAndroid Build Coastguard Worker 
19*1c60b9acSAndroid Build Coastguard Worker static const char * const json_tests[] = {
20*1c60b9acSAndroid Build Coastguard Worker 	"{" /* test 1 */
21*1c60b9acSAndroid Build Coastguard Worker 		"\"schema\":\"com-warmcat-sai-builder\","
22*1c60b9acSAndroid Build Coastguard Worker 
23*1c60b9acSAndroid Build Coastguard Worker 		"\"hostname\":\"learn\","
24*1c60b9acSAndroid Build Coastguard Worker 		"\"nspawn_timeout\":1800,"
25*1c60b9acSAndroid Build Coastguard Worker 		"\"targets\":["
26*1c60b9acSAndroid Build Coastguard Worker 			"{"
27*1c60b9acSAndroid Build Coastguard Worker 				"\"name\":\"target1\","
28*1c60b9acSAndroid Build Coastguard Worker 				"\"someflag\":true"
29*1c60b9acSAndroid Build Coastguard Worker 			"},"
30*1c60b9acSAndroid Build Coastguard Worker 			"{"
31*1c60b9acSAndroid Build Coastguard Worker 				"\"name\":\"target2\","
32*1c60b9acSAndroid Build Coastguard Worker 				"\"someflag\":false"
33*1c60b9acSAndroid Build Coastguard Worker 			"}"
34*1c60b9acSAndroid Build Coastguard Worker 		"]"
35*1c60b9acSAndroid Build Coastguard Worker 	"}",
36*1c60b9acSAndroid Build Coastguard Worker 	"{" /* test 2 */
37*1c60b9acSAndroid Build Coastguard Worker 		"\"schema\":\"com-warmcat-sai-builder\","
38*1c60b9acSAndroid Build Coastguard Worker 
39*1c60b9acSAndroid Build Coastguard Worker 		"\"hostname\":\"learn\","
40*1c60b9acSAndroid Build Coastguard Worker 		"\"targets\":["
41*1c60b9acSAndroid Build Coastguard Worker 			"{"
42*1c60b9acSAndroid Build Coastguard Worker 				"\"name\":\"target1\""
43*1c60b9acSAndroid Build Coastguard Worker 			"},"
44*1c60b9acSAndroid Build Coastguard Worker 			"{"
45*1c60b9acSAndroid Build Coastguard Worker 				"\"name\":\"target2\""
46*1c60b9acSAndroid Build Coastguard Worker 			"},"
47*1c60b9acSAndroid Build Coastguard Worker 			"{"
48*1c60b9acSAndroid Build Coastguard Worker 				"\"name\":\"target3\""
49*1c60b9acSAndroid Build Coastguard Worker 			"}"
50*1c60b9acSAndroid Build Coastguard Worker 		"]"
51*1c60b9acSAndroid Build Coastguard Worker 	"}", "{" /* test 3 */
52*1c60b9acSAndroid Build Coastguard Worker 		"\"schema\":\"com-warmcat-sai-builder\","
53*1c60b9acSAndroid Build Coastguard Worker 
54*1c60b9acSAndroid Build Coastguard Worker 		"\"hostname\":\"learn\","
55*1c60b9acSAndroid Build Coastguard Worker 		"\"nspawn_timeout\":1800,"
56*1c60b9acSAndroid Build Coastguard Worker 		"\"targets\":["
57*1c60b9acSAndroid Build Coastguard Worker 			"{"
58*1c60b9acSAndroid Build Coastguard Worker 				"\"name\":\"target1\","
59*1c60b9acSAndroid Build Coastguard Worker 				"\"unrecognized\":\"xyz\","
60*1c60b9acSAndroid Build Coastguard Worker 				"\"child\": {"
61*1c60b9acSAndroid Build Coastguard Worker 					"\"somename\": \"abc\","
62*1c60b9acSAndroid Build Coastguard Worker 					"\"junk\": { \"x\": \"y\" }"
63*1c60b9acSAndroid Build Coastguard Worker 				"}"
64*1c60b9acSAndroid Build Coastguard Worker 			"},"
65*1c60b9acSAndroid Build Coastguard Worker 			"{"
66*1c60b9acSAndroid Build Coastguard Worker 				"\"name\":\"target2\""
67*1c60b9acSAndroid Build Coastguard Worker 			"}"
68*1c60b9acSAndroid Build Coastguard Worker 		"]"
69*1c60b9acSAndroid Build Coastguard Worker 	"}",
70*1c60b9acSAndroid Build Coastguard Worker 	"{" /* test 4 */
71*1c60b9acSAndroid Build Coastguard Worker 		"\"schema\":\"com-warmcat-sai-builder\","
72*1c60b9acSAndroid Build Coastguard Worker 
73*1c60b9acSAndroid Build Coastguard Worker 		"\"hostname\":\"learn\","
74*1c60b9acSAndroid Build Coastguard Worker 		"\"nspawn_timeout\":1800"
75*1c60b9acSAndroid Build Coastguard Worker 	"}",
76*1c60b9acSAndroid Build Coastguard Worker 	"{" /* test 5 */
77*1c60b9acSAndroid Build Coastguard Worker 		"\"schema\":\"com-warmcat-sai-builder\""
78*1c60b9acSAndroid Build Coastguard Worker 	"}",
79*1c60b9acSAndroid Build Coastguard Worker 	"{" /* test 6 ... check huge strings into smaller fixed char array */
80*1c60b9acSAndroid Build Coastguard Worker 		"\"schema\":\"com-warmcat-sai-builder\","
81*1c60b9acSAndroid Build Coastguard Worker 		"\"hostname\":\""
82*1c60b9acSAndroid Build Coastguard Worker 		"PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6A"
83*1c60b9acSAndroid Build Coastguard Worker 		"zefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/"
84*1c60b9acSAndroid Build Coastguard Worker 		"CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr5"
85*1c60b9acSAndroid Build Coastguard Worker 		"3FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV"
86*1c60b9acSAndroid Build Coastguard Worker 		"8sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1"
87*1c60b9acSAndroid Build Coastguard Worker 		"NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIG"
88*1c60b9acSAndroid Build Coastguard Worker 		"JYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkG"
89*1c60b9acSAndroid Build Coastguard Worker 		"LUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MW"
90*1c60b9acSAndroid Build Coastguard Worker 		"v+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9"
91*1c60b9acSAndroid Build Coastguard Worker 		"eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsY"
92*1c60b9acSAndroid Build Coastguard Worker 		"VkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/"
93*1c60b9acSAndroid Build Coastguard Worker 		"uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yu"
94*1c60b9acSAndroid Build Coastguard Worker 		"yJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx"
95*1c60b9acSAndroid Build Coastguard Worker 		"+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\""
96*1c60b9acSAndroid Build Coastguard Worker 	"}",
97*1c60b9acSAndroid Build Coastguard Worker 	"{" /* test 7 ... check huge strings into char * */
98*1c60b9acSAndroid Build Coastguard Worker 		"\"schema\":\"com-warmcat-sai-builder\","
99*1c60b9acSAndroid Build Coastguard Worker 		"\"targets\":["
100*1c60b9acSAndroid Build Coastguard Worker 			"{"
101*1c60b9acSAndroid Build Coastguard Worker 				"\"name\":\""
102*1c60b9acSAndroid Build Coastguard Worker 		"PYvtan6kqppjnS0KpYTCaiOLsJkc7XecAr1kcE0aCIciewYB+JcLG82mO1Vb1mJtjDwUjBxy2I6A"
103*1c60b9acSAndroid Build Coastguard Worker 		"zefzoWUWmqZbsv4MXR55j9bKlyz1liiSX63iO0x6JAwACMtE2MkgcLwR86TSWAD9D1QKIWqg5RJ/"
104*1c60b9acSAndroid Build Coastguard Worker 		"CRuVsW0DKAUMD52ql4JmPFuJpJgTq28z6PhYNzN3yI3bmQt6bzhA+A/xAsFzSBnb3MHYWzGMprr5"
105*1c60b9acSAndroid Build Coastguard Worker 		"3FAP1ISo5Ec9i+2ehV40sG6Q470sH3PGQZ0YRPO7Sh/SyrSQ/scONmxRc3AcXl7X/CSs417ii+CV"
106*1c60b9acSAndroid Build Coastguard Worker 		"8sq3ZgcxKNB7tNfN7idNx3upZ00G2BZy9jSy03cLKKLNaNUt0TQsxXbH55uDHzSEeZWvxJgT6zB1"
107*1c60b9acSAndroid Build Coastguard Worker 		"NoMhdC02w+oXim94M6z6COCnqT3rgkGk8PHMry9Bkh4yVpRmzIRfMmln/lEhdZgxky2+g5hhlSIG"
108*1c60b9acSAndroid Build Coastguard Worker 		"JYDCrdynD9kCfvfy6KGOpNIi1X+mhbbWn4lnL9ZKihL/RrfOV+oV4R26IDq+KqUiJBENeo8/GXkG"
109*1c60b9acSAndroid Build Coastguard Worker 		"LUH/87iPyzXKEMavr6fkrK0vTGto8yEYxmOyaVz8phG5rwf4jJgmYNoMbGo8gWvhqO7UAGy2g7MW"
110*1c60b9acSAndroid Build Coastguard Worker 		"v+B/t1eZZ+1euLsNrWAsFJiFbQKgdFfQT3RjB14iU8knlQ8usoy+pXssY2ddGJGVcGC21oZvstK9"
111*1c60b9acSAndroid Build Coastguard Worker 		"eu1eRZftda/wP+N5unT1Hw7kCoVzqxHieiYt47EGIOaaQ7XjZDK6qPN6O/grHnvJZm2vBkxuXgsY"
112*1c60b9acSAndroid Build Coastguard Worker 		"VkRQ7AuTWIecphqFsq7Wbc1YNbMW47SVU5zMD0WaCqbaaI0t4uIzRvPlD8cpiiTzFTrEHlIBTf8/"
113*1c60b9acSAndroid Build Coastguard Worker 		"uZjjEGGLhJR1jPqA9D1Ej3ChV+ye6F9JTUMlozRMsGuF8U4btDzH5xdnmvRS4Ar6LKEtAXGkj2yu"
114*1c60b9acSAndroid Build Coastguard Worker 		"yJln+v4RIWj2xOGPJovOqiXwi0FyM61f8U8gj0OiNA2/QlvrqQVDF7sMXgjvaE7iQt5vMETteZlx"
115*1c60b9acSAndroid Build Coastguard Worker 		"+z3f+jTFM/aon511W4+ZkRD+6AHwucvM9BEC\"}]}"
116*1c60b9acSAndroid Build Coastguard Worker 	"}",
117*1c60b9acSAndroid Build Coastguard Worker 	"{" /* test 8 the "other" schema */
118*1c60b9acSAndroid Build Coastguard Worker 		"\"schema\":\"com-warmcat-sai-logs\","
119*1c60b9acSAndroid Build Coastguard Worker 		"\"task_uuid\":\"97fc90052506af8b3eb43b87aaa6fb76feab32bc128ede479a8a6b961e801f06\","
120*1c60b9acSAndroid Build Coastguard Worker 		"\"timestamp\": 170366786103,\"channel\":3, \"len\":20, "
121*1c60b9acSAndroid Build Coastguard Worker 		"\"log\": \"PnNhaWI+IE5TU1RBVEVfSU5JVAo=\"}\x0a"
122*1c60b9acSAndroid Build Coastguard Worker 		"ntu-xenial-amd64\"},{\"name\":\"linux-ubuntu-bionic-amd64\"},{\"name\":\"linux-fedora-32-x86_64\"}]}\",",
123*1c60b9acSAndroid Build Coastguard Worker 
124*1c60b9acSAndroid Build Coastguard Worker 	"{" /* test 9, empty object */
125*1c60b9acSAndroid Build Coastguard Worker 		"\"a\":123,\"b\":{}"
126*1c60b9acSAndroid Build Coastguard Worker 	"}",
127*1c60b9acSAndroid Build Coastguard Worker 
128*1c60b9acSAndroid Build Coastguard Worker 	"{" /* SHOULD_FAIL: test 10, missing open */
129*1c60b9acSAndroid Build Coastguard Worker 		"\"a\":123,\"b\":}"
130*1c60b9acSAndroid Build Coastguard Worker 	"}"
131*1c60b9acSAndroid Build Coastguard Worker };
132*1c60b9acSAndroid Build Coastguard Worker 
133*1c60b9acSAndroid Build Coastguard Worker static const char * const tok[] = {
134*1c60b9acSAndroid Build Coastguard Worker 	"something",
135*1c60b9acSAndroid Build Coastguard Worker };
136*1c60b9acSAndroid Build Coastguard Worker 
137*1c60b9acSAndroid Build Coastguard Worker static signed char
test_cb(struct lejp_ctx * ctx,char reason)138*1c60b9acSAndroid Build Coastguard Worker test_cb(struct lejp_ctx *ctx, char reason)
139*1c60b9acSAndroid Build Coastguard Worker {
140*1c60b9acSAndroid Build Coastguard Worker 	lwsl_info("%s: ctx->path %s, buf %s\n", __func__, ctx->path, ctx->buf);
141*1c60b9acSAndroid Build Coastguard Worker 	return 0;
142*1c60b9acSAndroid Build Coastguard Worker }
143*1c60b9acSAndroid Build Coastguard Worker 
144*1c60b9acSAndroid Build Coastguard Worker /* authz JSON parsing */
145*1c60b9acSAndroid Build Coastguard Worker 
146*1c60b9acSAndroid Build Coastguard Worker 
main(int argc,const char ** argv)147*1c60b9acSAndroid Build Coastguard Worker int main(int argc, const char **argv)
148*1c60b9acSAndroid Build Coastguard Worker {
149*1c60b9acSAndroid Build Coastguard Worker 	int n, m, e = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;
150*1c60b9acSAndroid Build Coastguard Worker 	struct lejp_ctx ctx;
151*1c60b9acSAndroid Build Coastguard Worker 	const char *p;
152*1c60b9acSAndroid Build Coastguard Worker 
153*1c60b9acSAndroid Build Coastguard Worker 	if ((p = lws_cmdline_option(argc, argv, "-d")))
154*1c60b9acSAndroid Build Coastguard Worker 		logs = atoi(p);
155*1c60b9acSAndroid Build Coastguard Worker 
156*1c60b9acSAndroid Build Coastguard Worker 	lws_set_log_level(logs, NULL);
157*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("LWS API selftest: lws_struct JSON\n");
158*1c60b9acSAndroid Build Coastguard Worker 
159*1c60b9acSAndroid Build Coastguard Worker 	for (m = 0; m < (int)LWS_ARRAY_SIZE(json_tests); m++) {
160*1c60b9acSAndroid Build Coastguard Worker 
161*1c60b9acSAndroid Build Coastguard Worker 		lwsl_info("%s: ++++++++++++++++ test %d\n", __func__, m + 1);
162*1c60b9acSAndroid Build Coastguard Worker 
163*1c60b9acSAndroid Build Coastguard Worker 		lejp_construct(&ctx, test_cb, NULL, tok, LWS_ARRAY_SIZE(tok));
164*1c60b9acSAndroid Build Coastguard Worker 
165*1c60b9acSAndroid Build Coastguard Worker 		lwsl_hexdump_info(json_tests[m], strlen(json_tests[m]));
166*1c60b9acSAndroid Build Coastguard Worker 
167*1c60b9acSAndroid Build Coastguard Worker 		if (m == 7)
168*1c60b9acSAndroid Build Coastguard Worker 			n = lejp_parse(&ctx, (uint8_t *)json_tests[m],
169*1c60b9acSAndroid Build Coastguard Worker 							 0xc8);
170*1c60b9acSAndroid Build Coastguard Worker 		else
171*1c60b9acSAndroid Build Coastguard Worker 			n = lejp_parse(&ctx, (uint8_t *)json_tests[m],
172*1c60b9acSAndroid Build Coastguard Worker 						 (int)strlen(json_tests[m]));
173*1c60b9acSAndroid Build Coastguard Worker 
174*1c60b9acSAndroid Build Coastguard Worker 		lwsl_info("n = %d\n", n);
175*1c60b9acSAndroid Build Coastguard Worker 		if (n < 0 && m != 9) {
176*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("%s: test %d: JSON decode failed '%s'\n",
177*1c60b9acSAndroid Build Coastguard Worker 					__func__, m + 1, lejp_error_to_string(n));
178*1c60b9acSAndroid Build Coastguard Worker 			e++;
179*1c60b9acSAndroid Build Coastguard Worker 		}
180*1c60b9acSAndroid Build Coastguard Worker 		if (n >= 0 && m == 9) {
181*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("%s: test %d: JSON decode should have failed '%s'\n",
182*1c60b9acSAndroid Build Coastguard Worker 					__func__, m + 1, lejp_error_to_string(n));
183*1c60b9acSAndroid Build Coastguard Worker 			e++;
184*1c60b9acSAndroid Build Coastguard Worker 		}
185*1c60b9acSAndroid Build Coastguard Worker 	}
186*1c60b9acSAndroid Build Coastguard Worker 
187*1c60b9acSAndroid Build Coastguard Worker 	{
188*1c60b9acSAndroid Build Coastguard Worker 		const char *cs;
189*1c60b9acSAndroid Build Coastguard Worker 		size_t cslen;
190*1c60b9acSAndroid Build Coastguard Worker 		cs = lws_json_simple_find("{\"blah\":123,\"ext\":{\"authorized\":1}}", 35,
191*1c60b9acSAndroid Build Coastguard Worker 					    "\"ext\":", &cslen);
192*1c60b9acSAndroid Build Coastguard Worker 		if (!cs) {
193*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("%s: simple_find failed\n", __func__);
194*1c60b9acSAndroid Build Coastguard Worker 			e++;
195*1c60b9acSAndroid Build Coastguard Worker 		} else {
196*1c60b9acSAndroid Build Coastguard Worker 			if (lws_json_simple_strcmp(cs, cslen,
197*1c60b9acSAndroid Build Coastguard Worker 					"\"authorized\":", "1"))
198*1c60b9acSAndroid Build Coastguard Worker 				e++;
199*1c60b9acSAndroid Build Coastguard Worker 		}
200*1c60b9acSAndroid Build Coastguard Worker 		cs = lws_json_simple_find("{\"blah\":123,\"auth_user\":\"[email protected]\",\"thing\":\"yeah\"}", 57,
201*1c60b9acSAndroid Build Coastguard Worker 					    "\"auth_user\":", &cslen);
202*1c60b9acSAndroid Build Coastguard Worker 		if (cslen != 16) {
203*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("%s: wrong string len %d isolated\n", __func__, (int)cslen);
204*1c60b9acSAndroid Build Coastguard Worker 			e++;
205*1c60b9acSAndroid Build Coastguard Worker 		}
206*1c60b9acSAndroid Build Coastguard Worker 	}
207*1c60b9acSAndroid Build Coastguard Worker 
208*1c60b9acSAndroid Build Coastguard Worker 	if (e)
209*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
210*1c60b9acSAndroid Build Coastguard Worker 
211*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("Completed: PASS\n");
212*1c60b9acSAndroid Build Coastguard Worker 
213*1c60b9acSAndroid Build Coastguard Worker 	return 0;
214*1c60b9acSAndroid Build Coastguard Worker 
215*1c60b9acSAndroid Build Coastguard Worker bail:
216*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("Completed: FAIL\n");
217*1c60b9acSAndroid Build Coastguard Worker 
218*1c60b9acSAndroid Build Coastguard Worker 	return 1;
219*1c60b9acSAndroid Build Coastguard Worker }
220