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