xref: /aosp_15_r20/external/libwebsockets/minimal-examples/api-tests/api-test-lws_cache/main.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * lws-api-test-lws_cache
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 
10*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
11*1c60b9acSAndroid Build Coastguard Worker 
12*1c60b9acSAndroid Build Coastguard Worker static struct lws_context *cx;
13*1c60b9acSAndroid Build Coastguard Worker static int tests, fail;
14*1c60b9acSAndroid Build Coastguard Worker 
15*1c60b9acSAndroid Build Coastguard Worker static int
test_just_l1(void)16*1c60b9acSAndroid Build Coastguard Worker test_just_l1(void)
17*1c60b9acSAndroid Build Coastguard Worker {
18*1c60b9acSAndroid Build Coastguard Worker 	struct lws_cache_creation_info ci;
19*1c60b9acSAndroid Build Coastguard Worker 	struct lws_cache_ttl_lru *l1;
20*1c60b9acSAndroid Build Coastguard Worker 	int ret = 1;
21*1c60b9acSAndroid Build Coastguard Worker 	size_t size;
22*1c60b9acSAndroid Build Coastguard Worker 	char *po;
23*1c60b9acSAndroid Build Coastguard Worker 
24*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s\n", __func__);
25*1c60b9acSAndroid Build Coastguard Worker 
26*1c60b9acSAndroid Build Coastguard Worker 	tests++;
27*1c60b9acSAndroid Build Coastguard Worker 
28*1c60b9acSAndroid Build Coastguard Worker 	/* just create a heap cache "L1" */
29*1c60b9acSAndroid Build Coastguard Worker 
30*1c60b9acSAndroid Build Coastguard Worker 	memset(&ci, 0, sizeof(ci));
31*1c60b9acSAndroid Build Coastguard Worker 	ci.cx = cx;
32*1c60b9acSAndroid Build Coastguard Worker 	ci.ops = &lws_cache_ops_heap;
33*1c60b9acSAndroid Build Coastguard Worker 	ci.name = "L1";
34*1c60b9acSAndroid Build Coastguard Worker 
35*1c60b9acSAndroid Build Coastguard Worker 	l1 = lws_cache_create(&ci);
36*1c60b9acSAndroid Build Coastguard Worker 	if (!l1)
37*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
38*1c60b9acSAndroid Build Coastguard Worker 
39*1c60b9acSAndroid Build Coastguard Worker 	/* add two items, a has 1s expiry and b has 2s */
40*1c60b9acSAndroid Build Coastguard Worker 
41*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_write_through(l1, "a", (const uint8_t *)"is_a", 5,
42*1c60b9acSAndroid Build Coastguard Worker 				    lws_now_usecs() + LWS_US_PER_SEC, NULL))
43*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
44*1c60b9acSAndroid Build Coastguard Worker 
45*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_write_through(l1, "b", (const uint8_t *)"is_b", 5,
46*1c60b9acSAndroid Build Coastguard Worker 				    lws_now_usecs() + LWS_US_PER_SEC * 2, NULL))
47*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
48*1c60b9acSAndroid Build Coastguard Worker 
49*1c60b9acSAndroid Build Coastguard Worker 	/* check they exist as intended */
50*1c60b9acSAndroid Build Coastguard Worker 
51*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_item_get(l1, "a", (const void **)&po, &size) ||
52*1c60b9acSAndroid Build Coastguard Worker 	    size != 5 || strcmp(po, "is_a"))
53*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
54*1c60b9acSAndroid Build Coastguard Worker 
55*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_item_get(l1, "b", (const void **)&po, &size) ||
56*1c60b9acSAndroid Build Coastguard Worker 	    size != 5 || strcmp(po, "is_b"))
57*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
58*1c60b9acSAndroid Build Coastguard Worker 
59*1c60b9acSAndroid Build Coastguard Worker 	/* wait for 1.2s to pass, working the event loop by hand */
60*1c60b9acSAndroid Build Coastguard Worker 
61*1c60b9acSAndroid Build Coastguard Worker 	lws_cancel_service(cx);
62*1c60b9acSAndroid Build Coastguard Worker 	if (lws_service(cx, 0) < 0)
63*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
64*1c60b9acSAndroid Build Coastguard Worker #if defined(WIN32)
65*1c60b9acSAndroid Build Coastguard Worker 	Sleep(1200);
66*1c60b9acSAndroid Build Coastguard Worker #else
67*1c60b9acSAndroid Build Coastguard Worker 	/* netbsd cares about < 1M */
68*1c60b9acSAndroid Build Coastguard Worker 	usleep(999999);
69*1c60b9acSAndroid Build Coastguard Worker 	usleep(200001);
70*1c60b9acSAndroid Build Coastguard Worker #endif
71*1c60b9acSAndroid Build Coastguard Worker 	lws_cancel_service(cx);
72*1c60b9acSAndroid Build Coastguard Worker 	if (lws_service(cx, 0) < 0)
73*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
74*1c60b9acSAndroid Build Coastguard Worker 
75*1c60b9acSAndroid Build Coastguard Worker 	lws_cancel_service(cx);
76*1c60b9acSAndroid Build Coastguard Worker 	if (lws_service(cx, 0) < 0)
77*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
78*1c60b9acSAndroid Build Coastguard Worker 
79*1c60b9acSAndroid Build Coastguard Worker 	/* a only had 1s lifetime, he should be gone */
80*1c60b9acSAndroid Build Coastguard Worker 
81*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_cache_item_get(l1, "a", (const void **)&po, &size)) {
82*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: cache: a still exists after expiry\n", __func__);
83*1c60b9acSAndroid Build Coastguard Worker 		fail++;
84*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
85*1c60b9acSAndroid Build Coastguard Worker 	}
86*1c60b9acSAndroid Build Coastguard Worker 
87*1c60b9acSAndroid Build Coastguard Worker 	/* that's ok then */
88*1c60b9acSAndroid Build Coastguard Worker 
89*1c60b9acSAndroid Build Coastguard Worker 	ret = 0;
90*1c60b9acSAndroid Build Coastguard Worker 
91*1c60b9acSAndroid Build Coastguard Worker cdone:
92*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_destroy(&l1);
93*1c60b9acSAndroid Build Coastguard Worker 
94*1c60b9acSAndroid Build Coastguard Worker 	if (ret)
95*1c60b9acSAndroid Build Coastguard Worker 		lwsl_warn("%s: fail\n", __func__);
96*1c60b9acSAndroid Build Coastguard Worker 
97*1c60b9acSAndroid Build Coastguard Worker 	return ret;
98*1c60b9acSAndroid Build Coastguard Worker }
99*1c60b9acSAndroid Build Coastguard Worker 
100*1c60b9acSAndroid Build Coastguard Worker static int
test_just_l1_limits(void)101*1c60b9acSAndroid Build Coastguard Worker test_just_l1_limits(void)
102*1c60b9acSAndroid Build Coastguard Worker {
103*1c60b9acSAndroid Build Coastguard Worker 	struct lws_cache_creation_info ci;
104*1c60b9acSAndroid Build Coastguard Worker 	struct lws_cache_ttl_lru *l1;
105*1c60b9acSAndroid Build Coastguard Worker 	int ret = 1;
106*1c60b9acSAndroid Build Coastguard Worker 	size_t size;
107*1c60b9acSAndroid Build Coastguard Worker 	char *po;
108*1c60b9acSAndroid Build Coastguard Worker 
109*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s\n", __func__);
110*1c60b9acSAndroid Build Coastguard Worker 	tests++;
111*1c60b9acSAndroid Build Coastguard Worker 
112*1c60b9acSAndroid Build Coastguard Worker 	/* just create a heap cache "L1" */
113*1c60b9acSAndroid Build Coastguard Worker 
114*1c60b9acSAndroid Build Coastguard Worker 	memset(&ci, 0, sizeof(ci));
115*1c60b9acSAndroid Build Coastguard Worker 	ci.cx = cx;
116*1c60b9acSAndroid Build Coastguard Worker 	ci.ops = &lws_cache_ops_heap;
117*1c60b9acSAndroid Build Coastguard Worker 	ci.name = "L1_lim";
118*1c60b9acSAndroid Build Coastguard Worker 	ci.max_items = 1; /* ie, adding a second item destroys the first */
119*1c60b9acSAndroid Build Coastguard Worker 
120*1c60b9acSAndroid Build Coastguard Worker 	l1 = lws_cache_create(&ci);
121*1c60b9acSAndroid Build Coastguard Worker 	if (!l1)
122*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
123*1c60b9acSAndroid Build Coastguard Worker 
124*1c60b9acSAndroid Build Coastguard Worker 	/* add two items, a has 1s expiry and b has 2s */
125*1c60b9acSAndroid Build Coastguard Worker 
126*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_write_through(l1, "a", (const uint8_t *)"is_a", 5,
127*1c60b9acSAndroid Build Coastguard Worker 				    lws_now_usecs() + LWS_US_PER_SEC, NULL))
128*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
129*1c60b9acSAndroid Build Coastguard Worker 
130*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_write_through(l1, "b", (const uint8_t *)"is_b", 5,
131*1c60b9acSAndroid Build Coastguard Worker 				    lws_now_usecs() + LWS_US_PER_SEC * 2, NULL))
132*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
133*1c60b9acSAndroid Build Coastguard Worker 
134*1c60b9acSAndroid Build Coastguard Worker 	/* only b should exit, since we limit to cache to just one entry */
135*1c60b9acSAndroid Build Coastguard Worker 
136*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_cache_item_get(l1, "a", (const void **)&po, &size))
137*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
138*1c60b9acSAndroid Build Coastguard Worker 
139*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_item_get(l1, "b", (const void **)&po, &size) ||
140*1c60b9acSAndroid Build Coastguard Worker 	    size != 5 || strcmp(po, "is_b"))
141*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
142*1c60b9acSAndroid Build Coastguard Worker 
143*1c60b9acSAndroid Build Coastguard Worker 	/* that's ok then */
144*1c60b9acSAndroid Build Coastguard Worker 
145*1c60b9acSAndroid Build Coastguard Worker 	ret = 0;
146*1c60b9acSAndroid Build Coastguard Worker 
147*1c60b9acSAndroid Build Coastguard Worker cdone:
148*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_destroy(&l1);
149*1c60b9acSAndroid Build Coastguard Worker 
150*1c60b9acSAndroid Build Coastguard Worker 	if (ret)
151*1c60b9acSAndroid Build Coastguard Worker 		lwsl_warn("%s: fail\n", __func__);
152*1c60b9acSAndroid Build Coastguard Worker 
153*1c60b9acSAndroid Build Coastguard Worker 	return ret;
154*1c60b9acSAndroid Build Coastguard Worker }
155*1c60b9acSAndroid Build Coastguard Worker 
156*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_CACHE_NSCOOKIEJAR)
157*1c60b9acSAndroid Build Coastguard Worker 
158*1c60b9acSAndroid Build Coastguard Worker static const char
159*1c60b9acSAndroid Build Coastguard Worker 	*cookie1 = "host.com\tFALSE\t/\tTRUE\t4000000000\tmycookie\tmycookievalue",
160*1c60b9acSAndroid Build Coastguard Worker 	*tag_cookie1 = "host.com|/|mycookie",
161*1c60b9acSAndroid Build Coastguard Worker 	*cookie2 = "host.com\tFALSE\t/xxx\tTRUE\t4000000000\tmycookie\tmyxxxcookievalue",
162*1c60b9acSAndroid Build Coastguard Worker 	*tag_cookie2 = "host.com|/xxx|mycookie",
163*1c60b9acSAndroid Build Coastguard Worker 	*cookie3 = "host.com\tFALSE\t/\tTRUE\t4000000000\textra\tcookie3value",
164*1c60b9acSAndroid Build Coastguard Worker 	*tag_cookie3 = "host.com|/|extra",
165*1c60b9acSAndroid Build Coastguard Worker 	*cookie4 = "host.com\tFALSE\t/yyy\tTRUE\t4000000000\tnewcookie\tnewcookievalue",
166*1c60b9acSAndroid Build Coastguard Worker 	*tag_cookie4 = "host.com|/yyy|newcookie"
167*1c60b9acSAndroid Build Coastguard Worker ;
168*1c60b9acSAndroid Build Coastguard Worker 
169*1c60b9acSAndroid Build Coastguard Worker static int
test_nsc1(void)170*1c60b9acSAndroid Build Coastguard Worker test_nsc1(void)
171*1c60b9acSAndroid Build Coastguard Worker {
172*1c60b9acSAndroid Build Coastguard Worker 	struct lws_cache_creation_info ci;
173*1c60b9acSAndroid Build Coastguard Worker 	struct lws_cache_ttl_lru *l1 = NULL, *nsc;
174*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_results_t cr;
175*1c60b9acSAndroid Build Coastguard Worker 	int n, ret = 1;
176*1c60b9acSAndroid Build Coastguard Worker 	size_t size;
177*1c60b9acSAndroid Build Coastguard Worker 	char *po;
178*1c60b9acSAndroid Build Coastguard Worker 
179*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s\n", __func__);
180*1c60b9acSAndroid Build Coastguard Worker 	tests++;
181*1c60b9acSAndroid Build Coastguard Worker 
182*1c60b9acSAndroid Build Coastguard Worker 	/* First create a netscape cookie cache object */
183*1c60b9acSAndroid Build Coastguard Worker 
184*1c60b9acSAndroid Build Coastguard Worker 	memset(&ci, 0, sizeof(ci));
185*1c60b9acSAndroid Build Coastguard Worker 	ci.cx = cx;
186*1c60b9acSAndroid Build Coastguard Worker 	ci.ops = &lws_cache_ops_nscookiejar;
187*1c60b9acSAndroid Build Coastguard Worker 	ci.name = "NSC";
188*1c60b9acSAndroid Build Coastguard Worker 	ci.u.nscookiejar.filepath = "./cookies.txt";
189*1c60b9acSAndroid Build Coastguard Worker 
190*1c60b9acSAndroid Build Coastguard Worker 	nsc = lws_cache_create(&ci);
191*1c60b9acSAndroid Build Coastguard Worker 	if (!nsc)
192*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
193*1c60b9acSAndroid Build Coastguard Worker 
194*1c60b9acSAndroid Build Coastguard Worker 	/* Then a heap cache "L1" as a child of nsc */
195*1c60b9acSAndroid Build Coastguard Worker 
196*1c60b9acSAndroid Build Coastguard Worker 	ci.ops = &lws_cache_ops_heap;
197*1c60b9acSAndroid Build Coastguard Worker 	ci.name = "L1";
198*1c60b9acSAndroid Build Coastguard Worker 	ci.parent = nsc;
199*1c60b9acSAndroid Build Coastguard Worker 
200*1c60b9acSAndroid Build Coastguard Worker 	l1 = lws_cache_create(&ci);
201*1c60b9acSAndroid Build Coastguard Worker 	if (!l1)
202*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
203*1c60b9acSAndroid Build Coastguard Worker 
204*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_debug_dump(nsc);
205*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_debug_dump(l1);
206*1c60b9acSAndroid Build Coastguard Worker 
207*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: add cookies to L1\n", __func__);
208*1c60b9acSAndroid Build Coastguard Worker 
209*1c60b9acSAndroid Build Coastguard Worker 	/* add three cookies */
210*1c60b9acSAndroid Build Coastguard Worker 
211*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_write_through(l1, tag_cookie1,
212*1c60b9acSAndroid Build Coastguard Worker 				    (const uint8_t *)cookie1, strlen(cookie1),
213*1c60b9acSAndroid Build Coastguard Worker 				    lws_now_usecs() + LWS_US_PER_SEC, NULL)) {
214*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: write1 failed\n", __func__);
215*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
216*1c60b9acSAndroid Build Coastguard Worker 	}
217*1c60b9acSAndroid Build Coastguard Worker 
218*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_debug_dump(nsc);
219*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_debug_dump(l1);
220*1c60b9acSAndroid Build Coastguard Worker 
221*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_write_through(l1, tag_cookie2,
222*1c60b9acSAndroid Build Coastguard Worker 				    (const uint8_t *)cookie2, strlen(cookie2),
223*1c60b9acSAndroid Build Coastguard Worker 				    lws_now_usecs() + LWS_US_PER_SEC * 2, NULL)) {
224*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: write2 failed\n", __func__);
225*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
226*1c60b9acSAndroid Build Coastguard Worker 	}
227*1c60b9acSAndroid Build Coastguard Worker 
228*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_debug_dump(nsc);
229*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_debug_dump(l1);
230*1c60b9acSAndroid Build Coastguard Worker 
231*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_write_through(l1, tag_cookie3,
232*1c60b9acSAndroid Build Coastguard Worker 				    (const uint8_t *)cookie3, strlen(cookie3),
233*1c60b9acSAndroid Build Coastguard Worker 				    lws_now_usecs() + LWS_US_PER_SEC * 2, NULL)) {
234*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: write3 failed\n", __func__);
235*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
236*1c60b9acSAndroid Build Coastguard Worker 	}
237*1c60b9acSAndroid Build Coastguard Worker 
238*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_debug_dump(nsc);
239*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_debug_dump(l1);
240*1c60b9acSAndroid Build Coastguard Worker 
241*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: check cookies in L1\n", __func__);
242*1c60b9acSAndroid Build Coastguard Worker 
243*1c60b9acSAndroid Build Coastguard Worker 	/* confirm that the cookies are individually in L1 */
244*1c60b9acSAndroid Build Coastguard Worker 
245*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_item_get(l1, tag_cookie1, (const void **)&po, &size) ||
246*1c60b9acSAndroid Build Coastguard Worker 	    size != strlen(cookie1) || memcmp(po, cookie1, size)) {
247*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: L1 '%s' missing, size %llu, po %s\n", __func__,
248*1c60b9acSAndroid Build Coastguard Worker 			 tag_cookie1, (unsigned long long)size, po);
249*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
250*1c60b9acSAndroid Build Coastguard Worker 	}
251*1c60b9acSAndroid Build Coastguard Worker 
252*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_item_get(l1, tag_cookie2, (const void **)&po, &size) ||
253*1c60b9acSAndroid Build Coastguard Worker 	    size != strlen(cookie2) || memcmp(po, cookie2, size)) {
254*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: L1 '%s' missing\n", __func__, tag_cookie2);
255*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
256*1c60b9acSAndroid Build Coastguard Worker 	}
257*1c60b9acSAndroid Build Coastguard Worker 
258*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_item_get(l1, tag_cookie3, (const void **)&po, &size) ||
259*1c60b9acSAndroid Build Coastguard Worker 	    size != strlen(cookie3) || memcmp(po, cookie3, size)) {
260*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: L1 '%s' missing\n", __func__, tag_cookie3);
261*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
262*1c60b9acSAndroid Build Coastguard Worker 	}
263*1c60b9acSAndroid Build Coastguard Worker 
264*1c60b9acSAndroid Build Coastguard Worker 	/* confirm that the cookies are individually in L2 / NSC... normally
265*1c60b9acSAndroid Build Coastguard Worker 	 * we don't do this but check via L1 so we can get it from there if
266*1c60b9acSAndroid Build Coastguard Worker 	 * present.  But as a unit test, we want to make sure it's in L2 / NSC
267*1c60b9acSAndroid Build Coastguard Worker 	 */
268*1c60b9acSAndroid Build Coastguard Worker 
269*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: check cookies written thru to NSC\n", __func__);
270*1c60b9acSAndroid Build Coastguard Worker 
271*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_item_get(nsc, tag_cookie1, (const void **)&po, &size) ||
272*1c60b9acSAndroid Build Coastguard Worker 	    size != strlen(cookie1) || memcmp(po, cookie1, size)) {
273*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: NSC '%s' missing, size %llu, po %s\n", __func__,
274*1c60b9acSAndroid Build Coastguard Worker 			 tag_cookie1, (unsigned long long)size, po);
275*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
276*1c60b9acSAndroid Build Coastguard Worker 	}
277*1c60b9acSAndroid Build Coastguard Worker 
278*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_item_get(nsc, tag_cookie2, (const void **)&po, &size) ||
279*1c60b9acSAndroid Build Coastguard Worker 	    size != strlen(cookie2) || memcmp(po, cookie2, size)) {
280*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: NSC '%s' missing\n", __func__, tag_cookie2);
281*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
282*1c60b9acSAndroid Build Coastguard Worker 	}
283*1c60b9acSAndroid Build Coastguard Worker 
284*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_item_get(nsc, tag_cookie3, (const void **)&po, &size) ||
285*1c60b9acSAndroid Build Coastguard Worker 	    size != strlen(cookie3) || memcmp(po, cookie3, size)) {
286*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: NSC '%s' missing\n", __func__, tag_cookie3);
287*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
288*1c60b9acSAndroid Build Coastguard Worker 	}
289*1c60b9acSAndroid Build Coastguard Worker 
290*1c60b9acSAndroid Build Coastguard Worker 	/* let's do a lookup with no results */
291*1c60b9acSAndroid Build Coastguard Worker 
292*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: nonexistant get must not pass\n", __func__);
293*1c60b9acSAndroid Build Coastguard Worker 
294*1c60b9acSAndroid Build Coastguard Worker 	if (!lws_cache_item_get(l1, "x.com|y|z", (const void **)&po, &size)) {
295*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: nonexistant found size %llu, po %s\n", __func__,
296*1c60b9acSAndroid Build Coastguard Worker 			 (unsigned long long)size, po);
297*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
298*1c60b9acSAndroid Build Coastguard Worker 	}
299*1c60b9acSAndroid Build Coastguard Worker 
300*1c60b9acSAndroid Build Coastguard Worker 	/*
301*1c60b9acSAndroid Build Coastguard Worker 	 * let's try some url paths and check we get the right results set...
302*1c60b9acSAndroid Build Coastguard Worker 	 * for / and any cookie, we expect only c1 and c3 to be listed
303*1c60b9acSAndroid Build Coastguard Worker 	 */
304*1c60b9acSAndroid Build Coastguard Worker 
305*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: wildcard lookup 1\n", __func__);
306*1c60b9acSAndroid Build Coastguard Worker 
307*1c60b9acSAndroid Build Coastguard Worker 	n = lws_cache_lookup(l1, "host.com|/|*",
308*1c60b9acSAndroid Build Coastguard Worker 			     (const void **)&cr.ptr, &cr.size);
309*1c60b9acSAndroid Build Coastguard Worker 	if (n) {
310*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: lookup failed %d\n", __func__, n);
311*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
312*1c60b9acSAndroid Build Coastguard Worker 	}
313*1c60b9acSAndroid Build Coastguard Worker 	lwsl_hexdump_notice(cr.ptr, size);
314*1c60b9acSAndroid Build Coastguard Worker 
315*1c60b9acSAndroid Build Coastguard Worker 	if (cr.size != 53)
316*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
317*1c60b9acSAndroid Build Coastguard Worker 
318*1c60b9acSAndroid Build Coastguard Worker 	while (!lws_cache_results_walk(&cr))
319*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("  %s (%d)\n", (const char *)cr.tag,
320*1c60b9acSAndroid Build Coastguard Worker 					   (int)cr.payload_len);
321*1c60b9acSAndroid Build Coastguard Worker 
322*1c60b9acSAndroid Build Coastguard Worker 	/*
323*1c60b9acSAndroid Build Coastguard Worker 	 * for /xxx and any cookie, we expect all 3 listed
324*1c60b9acSAndroid Build Coastguard Worker 	 */
325*1c60b9acSAndroid Build Coastguard Worker 
326*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: wildcard lookup 2\n", __func__);
327*1c60b9acSAndroid Build Coastguard Worker 
328*1c60b9acSAndroid Build Coastguard Worker 	n = lws_cache_lookup(l1, "host.com|/xxx|*",
329*1c60b9acSAndroid Build Coastguard Worker 			     (const void **)&cr.ptr, &cr.size);
330*1c60b9acSAndroid Build Coastguard Worker 	if (n) {
331*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: lookup failed %d\n", __func__, n);
332*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
333*1c60b9acSAndroid Build Coastguard Worker 	}
334*1c60b9acSAndroid Build Coastguard Worker 
335*1c60b9acSAndroid Build Coastguard Worker 	if (cr.size != 84)
336*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
337*1c60b9acSAndroid Build Coastguard Worker 
338*1c60b9acSAndroid Build Coastguard Worker 	while (!lws_cache_results_walk(&cr))
339*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("  %s (%d)\n", (const char *)cr.tag,
340*1c60b9acSAndroid Build Coastguard Worker 					   (int)cr.payload_len);
341*1c60b9acSAndroid Build Coastguard Worker 
342*1c60b9acSAndroid Build Coastguard Worker 	/*
343*1c60b9acSAndroid Build Coastguard Worker 	 * for /yyyy and any cookie, we expect only c1 and c3
344*1c60b9acSAndroid Build Coastguard Worker 	 */
345*1c60b9acSAndroid Build Coastguard Worker 
346*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: wildcard lookup 3\n", __func__);
347*1c60b9acSAndroid Build Coastguard Worker 
348*1c60b9acSAndroid Build Coastguard Worker 	n = lws_cache_lookup(l1, "host.com|/yyyy|*",
349*1c60b9acSAndroid Build Coastguard Worker 			     (const void **)&cr.ptr, &cr.size);
350*1c60b9acSAndroid Build Coastguard Worker 	if (n) {
351*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: lookup failed %d\n", __func__, n);
352*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
353*1c60b9acSAndroid Build Coastguard Worker 	}
354*1c60b9acSAndroid Build Coastguard Worker 
355*1c60b9acSAndroid Build Coastguard Worker 	if (cr.size != 53)
356*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
357*1c60b9acSAndroid Build Coastguard Worker 
358*1c60b9acSAndroid Build Coastguard Worker 	while (!lws_cache_results_walk(&cr))
359*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("  %s (%d)\n", (const char *)cr.tag,
360*1c60b9acSAndroid Build Coastguard Worker 					   (int)cr.payload_len);
361*1c60b9acSAndroid Build Coastguard Worker 
362*1c60b9acSAndroid Build Coastguard Worker 	/*
363*1c60b9acSAndroid Build Coastguard Worker 	 * repeat the above test, results should come from cache
364*1c60b9acSAndroid Build Coastguard Worker 	 */
365*1c60b9acSAndroid Build Coastguard Worker 
366*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: wildcard lookup 4\n", __func__);
367*1c60b9acSAndroid Build Coastguard Worker 
368*1c60b9acSAndroid Build Coastguard Worker 	n = lws_cache_lookup(l1, "host.com|/yyyy|*",
369*1c60b9acSAndroid Build Coastguard Worker 			     (const void **)&cr.ptr, &cr.size);
370*1c60b9acSAndroid Build Coastguard Worker 	if (n) {
371*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: lookup failed %d\n", __func__, n);
372*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
373*1c60b9acSAndroid Build Coastguard Worker 	}
374*1c60b9acSAndroid Build Coastguard Worker 
375*1c60b9acSAndroid Build Coastguard Worker 	if (cr.size != 53)
376*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
377*1c60b9acSAndroid Build Coastguard Worker 
378*1c60b9acSAndroid Build Coastguard Worker 	while (!lws_cache_results_walk(&cr))
379*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("  %s (%d)\n", (const char *)cr.tag,
380*1c60b9acSAndroid Build Coastguard Worker 					   (int)cr.payload_len);
381*1c60b9acSAndroid Build Coastguard Worker 
382*1c60b9acSAndroid Build Coastguard Worker 	/* now let's try deleting cookie 1 */
383*1c60b9acSAndroid Build Coastguard Worker 
384*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_item_remove(l1, tag_cookie1))
385*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
386*1c60b9acSAndroid Build Coastguard Worker 
387*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_debug_dump(nsc);
388*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_debug_dump(l1);
389*1c60b9acSAndroid Build Coastguard Worker 
390*1c60b9acSAndroid Build Coastguard Worker 	/* with c1 gone, we should only get c3 */
391*1c60b9acSAndroid Build Coastguard Worker 
392*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: wildcard lookup 5\n", __func__);
393*1c60b9acSAndroid Build Coastguard Worker 
394*1c60b9acSAndroid Build Coastguard Worker 	n = lws_cache_lookup(l1, "host.com|/|*",
395*1c60b9acSAndroid Build Coastguard Worker 			     (const void **)&cr.ptr, &cr.size);
396*1c60b9acSAndroid Build Coastguard Worker 	if (n) {
397*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: lookup failed %d\n", __func__, n);
398*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
399*1c60b9acSAndroid Build Coastguard Worker 	}
400*1c60b9acSAndroid Build Coastguard Worker 
401*1c60b9acSAndroid Build Coastguard Worker 	if (cr.size != 25)
402*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
403*1c60b9acSAndroid Build Coastguard Worker 
404*1c60b9acSAndroid Build Coastguard Worker 	while (!lws_cache_results_walk(&cr))
405*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("  %s (%d)\n", (const char *)cr.tag,
406*1c60b9acSAndroid Build Coastguard Worker 					   (int)cr.payload_len);
407*1c60b9acSAndroid Build Coastguard Worker 
408*1c60b9acSAndroid Build Coastguard Worker 	/*
409*1c60b9acSAndroid Build Coastguard Worker 	 * let's add a fourth cookie (third in cache now we deleted one)
410*1c60b9acSAndroid Build Coastguard Worker 	 */
411*1c60b9acSAndroid Build Coastguard Worker 
412*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cache_write_through(l1, tag_cookie4,
413*1c60b9acSAndroid Build Coastguard Worker 				    (const uint8_t *)cookie4, strlen(cookie4),
414*1c60b9acSAndroid Build Coastguard Worker 				    lws_now_usecs() + LWS_US_PER_SEC * 2, NULL)) {
415*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: write4 failed\n", __func__);
416*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
417*1c60b9acSAndroid Build Coastguard Worker 	}
418*1c60b9acSAndroid Build Coastguard Worker 
419*1c60b9acSAndroid Build Coastguard Worker 	/*
420*1c60b9acSAndroid Build Coastguard Worker 	 * for /yy and any cookie, we expect only c3
421*1c60b9acSAndroid Build Coastguard Worker 	 */
422*1c60b9acSAndroid Build Coastguard Worker 
423*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: wildcard lookup 6\n", __func__);
424*1c60b9acSAndroid Build Coastguard Worker 
425*1c60b9acSAndroid Build Coastguard Worker 	n = lws_cache_lookup(l1, "host.com|/yy|*",
426*1c60b9acSAndroid Build Coastguard Worker 			     (const void **)&cr.ptr, &cr.size);
427*1c60b9acSAndroid Build Coastguard Worker 	if (n) {
428*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: lookup failed %d\n", __func__, n);
429*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
430*1c60b9acSAndroid Build Coastguard Worker 	}
431*1c60b9acSAndroid Build Coastguard Worker 
432*1c60b9acSAndroid Build Coastguard Worker 	if (cr.size != 25)
433*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
434*1c60b9acSAndroid Build Coastguard Worker 
435*1c60b9acSAndroid Build Coastguard Worker 	while (!lws_cache_results_walk(&cr))
436*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("  %s (%d)\n", (const char *)cr.tag,
437*1c60b9acSAndroid Build Coastguard Worker 					   (int)cr.payload_len);
438*1c60b9acSAndroid Build Coastguard Worker 
439*1c60b9acSAndroid Build Coastguard Worker 	/*
440*1c60b9acSAndroid Build Coastguard Worker 	 * for /yyy and any cookie, we expect  c3 and c4
441*1c60b9acSAndroid Build Coastguard Worker 	 */
442*1c60b9acSAndroid Build Coastguard Worker 
443*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: wildcard lookup 7\n", __func__);
444*1c60b9acSAndroid Build Coastguard Worker 
445*1c60b9acSAndroid Build Coastguard Worker 	n = lws_cache_lookup(l1, "host.com|/yyy|*",
446*1c60b9acSAndroid Build Coastguard Worker 			     (const void **)&cr.ptr, &cr.size);
447*1c60b9acSAndroid Build Coastguard Worker 	if (n) {
448*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: lookup failed %d\n", __func__, n);
449*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
450*1c60b9acSAndroid Build Coastguard Worker 	}
451*1c60b9acSAndroid Build Coastguard Worker 
452*1c60b9acSAndroid Build Coastguard Worker 	if (cr.size != 57)
453*1c60b9acSAndroid Build Coastguard Worker 		goto cdone;
454*1c60b9acSAndroid Build Coastguard Worker 
455*1c60b9acSAndroid Build Coastguard Worker 	while (!lws_cache_results_walk(&cr))
456*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("  %s (%d)\n", (const char *)cr.tag,
457*1c60b9acSAndroid Build Coastguard Worker 					   (int)cr.payload_len);
458*1c60b9acSAndroid Build Coastguard Worker 
459*1c60b9acSAndroid Build Coastguard Worker 	/* that's ok then */
460*1c60b9acSAndroid Build Coastguard Worker 
461*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: done\n", __func__);
462*1c60b9acSAndroid Build Coastguard Worker 
463*1c60b9acSAndroid Build Coastguard Worker 	ret = 0;
464*1c60b9acSAndroid Build Coastguard Worker 
465*1c60b9acSAndroid Build Coastguard Worker cdone:
466*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_destroy(&nsc);
467*1c60b9acSAndroid Build Coastguard Worker 	lws_cache_destroy(&l1);
468*1c60b9acSAndroid Build Coastguard Worker 
469*1c60b9acSAndroid Build Coastguard Worker 	if (ret)
470*1c60b9acSAndroid Build Coastguard Worker 		lwsl_warn("%s: fail\n", __func__);
471*1c60b9acSAndroid Build Coastguard Worker 
472*1c60b9acSAndroid Build Coastguard Worker 	return ret;
473*1c60b9acSAndroid Build Coastguard Worker }
474*1c60b9acSAndroid Build Coastguard Worker #endif
475*1c60b9acSAndroid Build Coastguard Worker 
476*1c60b9acSAndroid Build Coastguard Worker 
main(int argc,const char ** argv)477*1c60b9acSAndroid Build Coastguard Worker int main(int argc, const char **argv)
478*1c60b9acSAndroid Build Coastguard Worker {
479*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context_creation_info info;
480*1c60b9acSAndroid Build Coastguard Worker 
481*1c60b9acSAndroid Build Coastguard Worker 	memset(&info, 0, sizeof info);
482*1c60b9acSAndroid Build Coastguard Worker 	lws_cmdline_option_handle_builtin(argc, argv, &info);
483*1c60b9acSAndroid Build Coastguard Worker 	info.fd_limit_per_thread = 1 + 6 + 1;
484*1c60b9acSAndroid Build Coastguard Worker 	info.port = CONTEXT_PORT_NO_LISTEN;
485*1c60b9acSAndroid Build Coastguard Worker 
486*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("LWS API selftest: lws_cache\n");
487*1c60b9acSAndroid Build Coastguard Worker 
488*1c60b9acSAndroid Build Coastguard Worker 	cx = lws_create_context(&info);
489*1c60b9acSAndroid Build Coastguard Worker 	if (!cx) {
490*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("lws init failed\n");
491*1c60b9acSAndroid Build Coastguard Worker 		return 1;
492*1c60b9acSAndroid Build Coastguard Worker 	}
493*1c60b9acSAndroid Build Coastguard Worker 
494*1c60b9acSAndroid Build Coastguard Worker 	if (test_just_l1())
495*1c60b9acSAndroid Build Coastguard Worker 		fail++;
496*1c60b9acSAndroid Build Coastguard Worker 	if (test_just_l1_limits())
497*1c60b9acSAndroid Build Coastguard Worker 		fail++;
498*1c60b9acSAndroid Build Coastguard Worker 
499*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_CACHE_NSCOOKIEJAR)
500*1c60b9acSAndroid Build Coastguard Worker 	if (test_nsc1())
501*1c60b9acSAndroid Build Coastguard Worker 		fail++;
502*1c60b9acSAndroid Build Coastguard Worker #endif
503*1c60b9acSAndroid Build Coastguard Worker 
504*1c60b9acSAndroid Build Coastguard Worker 	lws_context_destroy(cx);
505*1c60b9acSAndroid Build Coastguard Worker 
506*1c60b9acSAndroid Build Coastguard Worker 	if (tests && !fail)
507*1c60b9acSAndroid Build Coastguard Worker 		lwsl_user("Completed: PASS\n");
508*1c60b9acSAndroid Build Coastguard Worker 	else
509*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("Completed: FAIL %d / %d\n", fail, tests);
510*1c60b9acSAndroid Build Coastguard Worker 
511*1c60b9acSAndroid Build Coastguard Worker 	return 0;
512*1c60b9acSAndroid Build Coastguard Worker }
513