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