xref: /aosp_15_r20/external/libwebsockets/minimal-examples/api-tests/api-test-lws_map/main.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * lws-api-test-lws_map
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Written in 2010-2021 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  * unit tests for lws_map
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 /* custom key and comparator for test 3 */
15*1c60b9acSAndroid Build Coastguard Worker 
16*1c60b9acSAndroid Build Coastguard Worker typedef struct mykey {
17*1c60b9acSAndroid Build Coastguard Worker 	int			key;
18*1c60b9acSAndroid Build Coastguard Worker } mykey_t;
19*1c60b9acSAndroid Build Coastguard Worker 
20*1c60b9acSAndroid Build Coastguard Worker static int
compare_mykey_t(const lws_map_key_t key1,size_t kl1,const lws_map_value_t key2,size_t kl2)21*1c60b9acSAndroid Build Coastguard Worker compare_mykey_t(const lws_map_key_t key1, size_t kl1,
22*1c60b9acSAndroid Build Coastguard Worker 		const lws_map_value_t key2, size_t kl2)
23*1c60b9acSAndroid Build Coastguard Worker {
24*1c60b9acSAndroid Build Coastguard Worker 	const mykey_t *m1 = (mykey_t *)key1, *m2 = (mykey_t *)key2;
25*1c60b9acSAndroid Build Coastguard Worker 
26*1c60b9acSAndroid Build Coastguard Worker 	return m1->key != m2->key;
27*1c60b9acSAndroid Build Coastguard Worker }
28*1c60b9acSAndroid Build Coastguard Worker 
main(int argc,const char ** argv)29*1c60b9acSAndroid Build Coastguard Worker int main(int argc, const char **argv)
30*1c60b9acSAndroid Build Coastguard Worker {
31*1c60b9acSAndroid Build Coastguard Worker 	int e = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE,
32*1c60b9acSAndroid Build Coastguard Worker 			expected = 4, pass = 0;
33*1c60b9acSAndroid Build Coastguard Worker 	mykey_t k1 = { .key = 123 }, k2 = { .key = 234 }, k3 = { .key = 999 };
34*1c60b9acSAndroid Build Coastguard Worker 	struct lwsac *ac = NULL;
35*1c60b9acSAndroid Build Coastguard Worker 	lws_map_item_t *item;
36*1c60b9acSAndroid Build Coastguard Worker 	lws_map_info_t info;
37*1c60b9acSAndroid Build Coastguard Worker 	lws_map_t *map;
38*1c60b9acSAndroid Build Coastguard Worker 	const char *p;
39*1c60b9acSAndroid Build Coastguard Worker 
40*1c60b9acSAndroid Build Coastguard Worker 	if ((p = lws_cmdline_option(argc, argv, "-d")))
41*1c60b9acSAndroid Build Coastguard Worker 		logs = atoi(p);
42*1c60b9acSAndroid Build Coastguard Worker 
43*1c60b9acSAndroid Build Coastguard Worker 	lws_set_log_level(logs, NULL);
44*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("LWS API selftest: lws_map\n");
45*1c60b9acSAndroid Build Coastguard Worker 
46*1c60b9acSAndroid Build Coastguard Worker 	/* Test 1: string keys */
47*1c60b9acSAndroid Build Coastguard Worker 
48*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: test1\n", __func__);
49*1c60b9acSAndroid Build Coastguard Worker 	memset(&info, 0, sizeof(info));
50*1c60b9acSAndroid Build Coastguard Worker 	map = lws_map_create(&info);
51*1c60b9acSAndroid Build Coastguard Worker 	if (!map) {
52*1c60b9acSAndroid Build Coastguard Worker 		e++;
53*1c60b9acSAndroid Build Coastguard Worker 		goto end_t1;
54*1c60b9acSAndroid Build Coastguard Worker 	}
55*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_map_item_create_ks(map, "abc", (lws_map_value_t)"def", 3)) {
56*1c60b9acSAndroid Build Coastguard Worker 		e++;
57*1c60b9acSAndroid Build Coastguard Worker 		goto end_t1;
58*1c60b9acSAndroid Build Coastguard Worker 	}
59*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_map_item_create_ks(map, "123", (lws_map_value_t)"4567", 4)) {
60*1c60b9acSAndroid Build Coastguard Worker 		e++;
61*1c60b9acSAndroid Build Coastguard Worker 		goto end_t1;
62*1c60b9acSAndroid Build Coastguard Worker 	}
63*1c60b9acSAndroid Build Coastguard Worker 	item = lws_map_item_lookup_ks(map, "abc");
64*1c60b9acSAndroid Build Coastguard Worker 	if (!item) {
65*1c60b9acSAndroid Build Coastguard Worker 		e++;
66*1c60b9acSAndroid Build Coastguard Worker 		goto end_t1;
67*1c60b9acSAndroid Build Coastguard Worker 	}
68*1c60b9acSAndroid Build Coastguard Worker 
69*1c60b9acSAndroid Build Coastguard Worker 	if (lws_map_item_value_len(item) != 3 ||
70*1c60b9acSAndroid Build Coastguard Worker 	    memcmp(lws_map_item_value(item), "def", 3)) {
71*1c60b9acSAndroid Build Coastguard Worker 		e++;
72*1c60b9acSAndroid Build Coastguard Worker 		goto end_t1;
73*1c60b9acSAndroid Build Coastguard Worker 	}
74*1c60b9acSAndroid Build Coastguard Worker 
75*1c60b9acSAndroid Build Coastguard Worker 	item = lws_map_item_lookup_ks(map, "123");
76*1c60b9acSAndroid Build Coastguard Worker 	if (!item) {
77*1c60b9acSAndroid Build Coastguard Worker 		e++;
78*1c60b9acSAndroid Build Coastguard Worker 		goto end_t1;
79*1c60b9acSAndroid Build Coastguard Worker 	}
80*1c60b9acSAndroid Build Coastguard Worker 
81*1c60b9acSAndroid Build Coastguard Worker 	if (lws_map_item_value_len(item) != 4 ||
82*1c60b9acSAndroid Build Coastguard Worker 	    memcmp(lws_map_item_value(item), "4567", 4)) {
83*1c60b9acSAndroid Build Coastguard Worker 		e++;
84*1c60b9acSAndroid Build Coastguard Worker 		goto end_t1;
85*1c60b9acSAndroid Build Coastguard Worker 	}
86*1c60b9acSAndroid Build Coastguard Worker 
87*1c60b9acSAndroid Build Coastguard Worker 	item = lws_map_item_lookup_ks(map, "nope");
88*1c60b9acSAndroid Build Coastguard Worker 	if (item) {
89*1c60b9acSAndroid Build Coastguard Worker 		e++;
90*1c60b9acSAndroid Build Coastguard Worker 		goto end_t1;
91*1c60b9acSAndroid Build Coastguard Worker 	}
92*1c60b9acSAndroid Build Coastguard Worker 
93*1c60b9acSAndroid Build Coastguard Worker 	pass++;
94*1c60b9acSAndroid Build Coastguard Worker 
95*1c60b9acSAndroid Build Coastguard Worker end_t1:
96*1c60b9acSAndroid Build Coastguard Worker 	lws_map_destroy(&map);
97*1c60b9acSAndroid Build Coastguard Worker 
98*1c60b9acSAndroid Build Coastguard Worker 	/* Test 2: Use lwsac item allocators */
99*1c60b9acSAndroid Build Coastguard Worker 
100*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: test2\n", __func__);
101*1c60b9acSAndroid Build Coastguard Worker 	memset(&info, 0, sizeof(info));
102*1c60b9acSAndroid Build Coastguard Worker 	info._alloc = lws_map_alloc_lwsac;
103*1c60b9acSAndroid Build Coastguard Worker 	info._free = lws_map_free_lwsac;
104*1c60b9acSAndroid Build Coastguard Worker 	info.opaque = (void *)&ac;
105*1c60b9acSAndroid Build Coastguard Worker 
106*1c60b9acSAndroid Build Coastguard Worker 	map = lws_map_create(&info);
107*1c60b9acSAndroid Build Coastguard Worker 	if (!map) {
108*1c60b9acSAndroid Build Coastguard Worker 		e++;
109*1c60b9acSAndroid Build Coastguard Worker 		goto end_t2;
110*1c60b9acSAndroid Build Coastguard Worker 	}
111*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_map_item_create_ks(map, "abc", "def", 3)) {
112*1c60b9acSAndroid Build Coastguard Worker 		e++;
113*1c60b9acSAndroid Build Coastguard Worker 		goto end_t2;
114*1c60b9acSAndroid Build Coastguard Worker 	}
115*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_map_item_create_ks(map, "123", "4567", 4)) {
116*1c60b9acSAndroid Build Coastguard Worker 		e++;
117*1c60b9acSAndroid Build Coastguard Worker 		goto end_t2;
118*1c60b9acSAndroid Build Coastguard Worker 	}
119*1c60b9acSAndroid Build Coastguard Worker 	item = lws_map_item_lookup_ks(map, "abc");
120*1c60b9acSAndroid Build Coastguard Worker 	if (!item) {
121*1c60b9acSAndroid Build Coastguard Worker 		e++;
122*1c60b9acSAndroid Build Coastguard Worker 		goto end_t2;
123*1c60b9acSAndroid Build Coastguard Worker 	}
124*1c60b9acSAndroid Build Coastguard Worker 
125*1c60b9acSAndroid Build Coastguard Worker 	if (lws_map_item_value_len(item) != 3 ||
126*1c60b9acSAndroid Build Coastguard Worker 	    memcmp(lws_map_item_value(item), "def", 3)) {
127*1c60b9acSAndroid Build Coastguard Worker 		e++;
128*1c60b9acSAndroid Build Coastguard Worker 		goto end_t2;
129*1c60b9acSAndroid Build Coastguard Worker 	}
130*1c60b9acSAndroid Build Coastguard Worker 
131*1c60b9acSAndroid Build Coastguard Worker 	item = lws_map_item_lookup_ks(map, "123");
132*1c60b9acSAndroid Build Coastguard Worker 	if (!item) {
133*1c60b9acSAndroid Build Coastguard Worker 		e++;
134*1c60b9acSAndroid Build Coastguard Worker 		goto end_t2;
135*1c60b9acSAndroid Build Coastguard Worker 	}
136*1c60b9acSAndroid Build Coastguard Worker 
137*1c60b9acSAndroid Build Coastguard Worker 	if (lws_map_item_value_len(item) != 4 ||
138*1c60b9acSAndroid Build Coastguard Worker 	    memcmp(lws_map_item_value(item), "4567", 4)) {
139*1c60b9acSAndroid Build Coastguard Worker 		e++;
140*1c60b9acSAndroid Build Coastguard Worker 		goto end_t2;
141*1c60b9acSAndroid Build Coastguard Worker 	}
142*1c60b9acSAndroid Build Coastguard Worker 
143*1c60b9acSAndroid Build Coastguard Worker 	item = lws_map_item_lookup_ks(map, "nope");
144*1c60b9acSAndroid Build Coastguard Worker 	if (item) {
145*1c60b9acSAndroid Build Coastguard Worker 		e++;
146*1c60b9acSAndroid Build Coastguard Worker 		goto end_t2;
147*1c60b9acSAndroid Build Coastguard Worker 	}
148*1c60b9acSAndroid Build Coastguard Worker 
149*1c60b9acSAndroid Build Coastguard Worker 	pass++;
150*1c60b9acSAndroid Build Coastguard Worker 
151*1c60b9acSAndroid Build Coastguard Worker end_t2:
152*1c60b9acSAndroid Build Coastguard Worker 	lws_map_destroy(&map);
153*1c60b9acSAndroid Build Coastguard Worker 	lwsac_free(&ac);
154*1c60b9acSAndroid Build Coastguard Worker 
155*1c60b9acSAndroid Build Coastguard Worker 	/* Test 3: custom key object and comparator */
156*1c60b9acSAndroid Build Coastguard Worker 
157*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: test3\n", __func__);
158*1c60b9acSAndroid Build Coastguard Worker 	memset(&info, 0, sizeof(info));
159*1c60b9acSAndroid Build Coastguard Worker 	info._compare = compare_mykey_t;
160*1c60b9acSAndroid Build Coastguard Worker 
161*1c60b9acSAndroid Build Coastguard Worker 	map = lws_map_create(&info);
162*1c60b9acSAndroid Build Coastguard Worker 	if (!map) {
163*1c60b9acSAndroid Build Coastguard Worker 		e++;
164*1c60b9acSAndroid Build Coastguard Worker 		goto end_t3;
165*1c60b9acSAndroid Build Coastguard Worker 	}
166*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_map_item_create(map, (lws_map_key_t)&k1, sizeof(k1),
167*1c60b9acSAndroid Build Coastguard Worker 				      (lws_map_value_t)"def", 3)) {
168*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: t3; a\n", __func__);
169*1c60b9acSAndroid Build Coastguard Worker 		e++;
170*1c60b9acSAndroid Build Coastguard Worker 		goto end_t3;
171*1c60b9acSAndroid Build Coastguard Worker 	}
172*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_map_item_create(map, (lws_map_key_t)&k2, sizeof(k2),
173*1c60b9acSAndroid Build Coastguard Worker 				      (lws_map_value_t)"4567", 4)) {
174*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: t3; b\n", __func__);
175*1c60b9acSAndroid Build Coastguard Worker 		e++;
176*1c60b9acSAndroid Build Coastguard Worker 		goto end_t3;
177*1c60b9acSAndroid Build Coastguard Worker 	}
178*1c60b9acSAndroid Build Coastguard Worker 	item = lws_map_item_lookup(map, (lws_map_key_t)&k1, sizeof(k1));
179*1c60b9acSAndroid Build Coastguard Worker 	if (!item) {
180*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: t3; c\n", __func__);
181*1c60b9acSAndroid Build Coastguard Worker 		e++;
182*1c60b9acSAndroid Build Coastguard Worker 		goto end_t3;
183*1c60b9acSAndroid Build Coastguard Worker 	}
184*1c60b9acSAndroid Build Coastguard Worker 
185*1c60b9acSAndroid Build Coastguard Worker 	if (lws_map_item_value_len(item) != 3 ||
186*1c60b9acSAndroid Build Coastguard Worker 	    memcmp(lws_map_item_value(item), "def", 3)) {
187*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: t3; d\n", __func__);
188*1c60b9acSAndroid Build Coastguard Worker 		e++;
189*1c60b9acSAndroid Build Coastguard Worker 		goto end_t3;
190*1c60b9acSAndroid Build Coastguard Worker 	}
191*1c60b9acSAndroid Build Coastguard Worker 
192*1c60b9acSAndroid Build Coastguard Worker 	item = lws_map_item_lookup(map, (lws_map_key_t)&k2, sizeof(k2));
193*1c60b9acSAndroid Build Coastguard Worker 	if (!item) {
194*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: t3; e\n", __func__);
195*1c60b9acSAndroid Build Coastguard Worker 		e++;
196*1c60b9acSAndroid Build Coastguard Worker 		goto end_t3;
197*1c60b9acSAndroid Build Coastguard Worker 	}
198*1c60b9acSAndroid Build Coastguard Worker 
199*1c60b9acSAndroid Build Coastguard Worker 	if (lws_map_item_value_len(item) != 4 ||
200*1c60b9acSAndroid Build Coastguard Worker 	    memcmp(lws_map_item_value(item), "4567", 4)) {
201*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: t3; f\n", __func__);
202*1c60b9acSAndroid Build Coastguard Worker 		e++;
203*1c60b9acSAndroid Build Coastguard Worker 		goto end_t3;
204*1c60b9acSAndroid Build Coastguard Worker 	}
205*1c60b9acSAndroid Build Coastguard Worker 
206*1c60b9acSAndroid Build Coastguard Worker 	item = lws_map_item_lookup(map, (lws_map_key_t)&k3, sizeof(k3));
207*1c60b9acSAndroid Build Coastguard Worker 	if (item) {
208*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: t3; g\n", __func__);
209*1c60b9acSAndroid Build Coastguard Worker 		e++;
210*1c60b9acSAndroid Build Coastguard Worker 		goto end_t3;
211*1c60b9acSAndroid Build Coastguard Worker 	}
212*1c60b9acSAndroid Build Coastguard Worker 
213*1c60b9acSAndroid Build Coastguard Worker 	pass++;
214*1c60b9acSAndroid Build Coastguard Worker 
215*1c60b9acSAndroid Build Coastguard Worker end_t3:
216*1c60b9acSAndroid Build Coastguard Worker 	lws_map_destroy(&map);
217*1c60b9acSAndroid Build Coastguard Worker 
218*1c60b9acSAndroid Build Coastguard Worker 	/* Test 4: same key items */
219*1c60b9acSAndroid Build Coastguard Worker 
220*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: test4\n", __func__);
221*1c60b9acSAndroid Build Coastguard Worker 	memset(&info, 0, sizeof(info));
222*1c60b9acSAndroid Build Coastguard Worker 	map = lws_map_create(&info);
223*1c60b9acSAndroid Build Coastguard Worker 	if (!map) {
224*1c60b9acSAndroid Build Coastguard Worker 		e++;
225*1c60b9acSAndroid Build Coastguard Worker 		goto end_t4;
226*1c60b9acSAndroid Build Coastguard Worker 	}
227*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_map_item_create_ks(map, "abc", (lws_map_value_t)"def", 3)) {
228*1c60b9acSAndroid Build Coastguard Worker 		e++;
229*1c60b9acSAndroid Build Coastguard Worker 		goto end_t4;
230*1c60b9acSAndroid Build Coastguard Worker 	}
231*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_map_item_create_ks(map, "abc", (lws_map_value_t)"4567", 4)) {
232*1c60b9acSAndroid Build Coastguard Worker 		e++;
233*1c60b9acSAndroid Build Coastguard Worker 		goto end_t4;
234*1c60b9acSAndroid Build Coastguard Worker 	}
235*1c60b9acSAndroid Build Coastguard Worker 	item = lws_map_item_lookup_ks(map, "abc");
236*1c60b9acSAndroid Build Coastguard Worker 	if (!item) {
237*1c60b9acSAndroid Build Coastguard Worker 		e++;
238*1c60b9acSAndroid Build Coastguard Worker 		goto end_t4;
239*1c60b9acSAndroid Build Coastguard Worker 	}
240*1c60b9acSAndroid Build Coastguard Worker 
241*1c60b9acSAndroid Build Coastguard Worker 	if (lws_map_item_value_len(item) != 4 ||
242*1c60b9acSAndroid Build Coastguard Worker 	    memcmp(lws_map_item_value(item), "4567", 4)) {
243*1c60b9acSAndroid Build Coastguard Worker 		e++;
244*1c60b9acSAndroid Build Coastguard Worker 		goto end_t4;
245*1c60b9acSAndroid Build Coastguard Worker 	}
246*1c60b9acSAndroid Build Coastguard Worker 
247*1c60b9acSAndroid Build Coastguard Worker 	pass++;
248*1c60b9acSAndroid Build Coastguard Worker 
249*1c60b9acSAndroid Build Coastguard Worker end_t4:
250*1c60b9acSAndroid Build Coastguard Worker 	lws_map_destroy(&map);
251*1c60b9acSAndroid Build Coastguard Worker 
252*1c60b9acSAndroid Build Coastguard Worker 	if (e)
253*1c60b9acSAndroid Build Coastguard Worker 		goto bail;
254*1c60b9acSAndroid Build Coastguard Worker 
255*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("Completed: PASS %d / %d\n", pass, expected);
256*1c60b9acSAndroid Build Coastguard Worker 
257*1c60b9acSAndroid Build Coastguard Worker 	return 0;
258*1c60b9acSAndroid Build Coastguard Worker 
259*1c60b9acSAndroid Build Coastguard Worker bail:
260*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("Completed: FAIL, passed %d / %d (e %d)\n", pass,
261*1c60b9acSAndroid Build Coastguard Worker 				expected, e);
262*1c60b9acSAndroid Build Coastguard Worker 
263*1c60b9acSAndroid Build Coastguard Worker 	return 1;
264*1c60b9acSAndroid Build Coastguard Worker }
265