1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker * lws-api-test-lws_tokenize
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 * This demonstrates the most minimal http server you can make with lws.
10*1c60b9acSAndroid Build Coastguard Worker *
11*1c60b9acSAndroid Build Coastguard Worker * To keep it simple, it serves stuff from the subdirectory
12*1c60b9acSAndroid Build Coastguard Worker * "./mount-origin" of the directory it was started in.
13*1c60b9acSAndroid Build Coastguard Worker * You can change that by changing mount.origin below.
14*1c60b9acSAndroid Build Coastguard Worker */
15*1c60b9acSAndroid Build Coastguard Worker
16*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
17*1c60b9acSAndroid Build Coastguard Worker #include <string.h>
18*1c60b9acSAndroid Build Coastguard Worker #include <stdio.h>
19*1c60b9acSAndroid Build Coastguard Worker
20*1c60b9acSAndroid Build Coastguard Worker struct expected {
21*1c60b9acSAndroid Build Coastguard Worker lws_tokenize_elem e;
22*1c60b9acSAndroid Build Coastguard Worker const char *value;
23*1c60b9acSAndroid Build Coastguard Worker size_t len;
24*1c60b9acSAndroid Build Coastguard Worker };
25*1c60b9acSAndroid Build Coastguard Worker
26*1c60b9acSAndroid Build Coastguard Worker struct tests {
27*1c60b9acSAndroid Build Coastguard Worker const char *string;
28*1c60b9acSAndroid Build Coastguard Worker struct expected *exp;
29*1c60b9acSAndroid Build Coastguard Worker int count;
30*1c60b9acSAndroid Build Coastguard Worker int flags;
31*1c60b9acSAndroid Build Coastguard Worker };
32*1c60b9acSAndroid Build Coastguard Worker
33*1c60b9acSAndroid Build Coastguard Worker struct expected expected1[] = {
34*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "protocol-1", 10 },
35*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1},
36*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "protocol_2", 10 },
37*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1},
38*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "protocol3", 9 },
39*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, NULL, 0 },
40*1c60b9acSAndroid Build Coastguard Worker },
41*1c60b9acSAndroid Build Coastguard Worker expected2[] = {
42*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN_NAME_COLON, "Accept-Language", 15 },
43*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "fr-CH", 5 },
44*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
45*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "fr", 2 },
46*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ";", 1},
47*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN_NAME_EQUALS, "q", 1 },
48*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_FLOAT, "0.9", 3 },
49*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
50*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "en", 2 },
51*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ";", 1},
52*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN_NAME_EQUALS, "q", 1 },
53*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_FLOAT, "0.8", 3 },
54*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
55*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "de", 2 },
56*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ";", 1},
57*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN_NAME_EQUALS, "q", 1 },
58*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_FLOAT, "0.7", 3 },
59*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
60*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, "*", 1 },
61*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ";", 1 },
62*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN_NAME_EQUALS, "q", 1 },
63*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_FLOAT, "0.5", 3 },
64*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, NULL, 0 },
65*1c60b9acSAndroid Build Coastguard Worker },
66*1c60b9acSAndroid Build Coastguard Worker expected3[] = {
67*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN_NAME_EQUALS, "quoted", 6 },
68*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_QUOTED_STRING, "things:", 7 },
69*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
70*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_INTEGER, "1234", 4 },
71*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, NULL, 0 },
72*1c60b9acSAndroid Build Coastguard Worker },
73*1c60b9acSAndroid Build Coastguard Worker expected4[] = {
74*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ERR_COMMA_LIST, ",", 1 },
75*1c60b9acSAndroid Build Coastguard Worker },
76*1c60b9acSAndroid Build Coastguard Worker expected5[] = {
77*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "brokenlist2", 11 },
78*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
79*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ERR_COMMA_LIST, ",", 1 },
80*1c60b9acSAndroid Build Coastguard Worker },
81*1c60b9acSAndroid Build Coastguard Worker expected6[] = {
82*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "brokenlist3", 11 },
83*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
84*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ERR_COMMA_LIST, ",", 1 },
85*1c60b9acSAndroid Build Coastguard Worker
86*1c60b9acSAndroid Build Coastguard Worker },
87*1c60b9acSAndroid Build Coastguard Worker expected7[] = {
88*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "fr", 2 },
89*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, "-", 1 },
90*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "CH", 2 },
91*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
92*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "fr", 2 },
93*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ";", 1 },
94*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN_NAME_EQUALS, "q", 1 },
95*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_FLOAT, "0.9", 3 },
96*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
97*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "en", 2 },
98*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ";", 1 },
99*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN_NAME_EQUALS, "q", 1 },
100*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_FLOAT, "0.8", 3 },
101*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
102*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "de", 2 },
103*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ";", 1 },
104*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN_NAME_EQUALS, "q", 1 },
105*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_FLOAT, "0.7", 3 },
106*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
107*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "*", 1 },
108*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ";", 1 },
109*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN_NAME_EQUALS, "q", 1 },
110*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_FLOAT, "0.5", 3 },
111*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, "", 0 },
112*1c60b9acSAndroid Build Coastguard Worker },
113*1c60b9acSAndroid Build Coastguard Worker expected8[] = {
114*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "Οὐχὶ", 10 },
115*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "ταὐτὰ", 12 },
116*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "παρίσταταί", 22 },
117*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "μοι", 6 },
118*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "γιγνώσκειν", 21 },
119*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
120*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "ὦ", 3 },
121*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "ἄνδρες", 13 },
122*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "᾿Αθηναῖοι", 20 },
123*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
124*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "greek", 5 },
125*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, "", 0 },
126*1c60b9acSAndroid Build Coastguard Worker },
127*1c60b9acSAndroid Build Coastguard Worker expected9[] = {
128*1c60b9acSAndroid Build Coastguard Worker /*
129*1c60b9acSAndroid Build Coastguard Worker * because the tokenizer scans ahead for = aggregation,
130*1c60b9acSAndroid Build Coastguard Worker * it finds the broken utf8 before reporting the token
131*1c60b9acSAndroid Build Coastguard Worker */
132*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ERR_BROKEN_UTF8, "", 0 },
133*1c60b9acSAndroid Build Coastguard Worker },
134*1c60b9acSAndroid Build Coastguard Worker expected10[] = {
135*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "badutf8-2", 9 },
136*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "", 3 },
137*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
138*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ERR_BROKEN_UTF8, "", 0 },
139*1c60b9acSAndroid Build Coastguard Worker },
140*1c60b9acSAndroid Build Coastguard Worker expected11[] = {
141*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "1.myserver", 10 },
142*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ".", 1 },
143*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "com", 3 },
144*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, "", 0 },
145*1c60b9acSAndroid Build Coastguard Worker },
146*1c60b9acSAndroid Build Coastguard Worker expected12[] = {
147*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "1.myserver.com", 14 },
148*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, "", 0 },
149*1c60b9acSAndroid Build Coastguard Worker },
150*1c60b9acSAndroid Build Coastguard Worker expected13[] = {
151*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "1.myserver.com", 14 },
152*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, "", 0 },
153*1c60b9acSAndroid Build Coastguard Worker },
154*1c60b9acSAndroid Build Coastguard Worker expected14[] = {
155*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_INTEGER, "1", 1 },
156*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ".", 1 },
157*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "myserver", 8 },
158*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ".", 1 },
159*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "com", 3 },
160*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, "", 0 },
161*1c60b9acSAndroid Build Coastguard Worker },
162*1c60b9acSAndroid Build Coastguard Worker expected15[] = {
163*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "close", 5 },
164*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_DELIMITER, ",", 1 },
165*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "Upgrade", 7 },
166*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, "", 0 },
167*1c60b9acSAndroid Build Coastguard Worker },
168*1c60b9acSAndroid Build Coastguard Worker expected16[] = {
169*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN_NAME_EQUALS, "a", 1 },
170*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "5", 1 },
171*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, "", 0 },
172*1c60b9acSAndroid Build Coastguard Worker },
173*1c60b9acSAndroid Build Coastguard Worker expected17[] = {
174*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "hello", 5 },
175*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, "", 0 },
176*1c60b9acSAndroid Build Coastguard Worker },
177*1c60b9acSAndroid Build Coastguard Worker expected18[] = {
178*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_TOKEN, "x=y", 3 },
179*1c60b9acSAndroid Build Coastguard Worker { LWS_TOKZE_ENDED, "", 0 },
180*1c60b9acSAndroid Build Coastguard Worker }
181*1c60b9acSAndroid Build Coastguard Worker ;
182*1c60b9acSAndroid Build Coastguard Worker
183*1c60b9acSAndroid Build Coastguard Worker struct tests tests[] = {
184*1c60b9acSAndroid Build Coastguard Worker {
185*1c60b9acSAndroid Build Coastguard Worker " protocol-1, protocol_2\t,\tprotocol3\n",
186*1c60b9acSAndroid Build Coastguard Worker expected1, LWS_ARRAY_SIZE(expected1),
187*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_AGG_COLON
188*1c60b9acSAndroid Build Coastguard Worker }, {
189*1c60b9acSAndroid Build Coastguard Worker "Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5",
190*1c60b9acSAndroid Build Coastguard Worker expected2, LWS_ARRAY_SIZE(expected2),
191*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_AGG_COLON
192*1c60b9acSAndroid Build Coastguard Worker }, {
193*1c60b9acSAndroid Build Coastguard Worker "quoted = \"things:\", 1234",
194*1c60b9acSAndroid Build Coastguard Worker expected3, LWS_ARRAY_SIZE(expected3),
195*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_AGG_COLON
196*1c60b9acSAndroid Build Coastguard Worker }, {
197*1c60b9acSAndroid Build Coastguard Worker ", brokenlist1",
198*1c60b9acSAndroid Build Coastguard Worker expected4, LWS_ARRAY_SIZE(expected4),
199*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_COMMA_SEP_LIST
200*1c60b9acSAndroid Build Coastguard Worker }, {
201*1c60b9acSAndroid Build Coastguard Worker "brokenlist2,,",
202*1c60b9acSAndroid Build Coastguard Worker expected5, LWS_ARRAY_SIZE(expected5),
203*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_COMMA_SEP_LIST
204*1c60b9acSAndroid Build Coastguard Worker }, {
205*1c60b9acSAndroid Build Coastguard Worker "brokenlist3,",
206*1c60b9acSAndroid Build Coastguard Worker expected6, LWS_ARRAY_SIZE(expected6),
207*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_COMMA_SEP_LIST
208*1c60b9acSAndroid Build Coastguard Worker }, {
209*1c60b9acSAndroid Build Coastguard Worker "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5",
210*1c60b9acSAndroid Build Coastguard Worker expected7, LWS_ARRAY_SIZE(expected7),
211*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_ASTERISK_NONTERM | LWS_TOKENIZE_F_RFC7230_DELIMS
212*1c60b9acSAndroid Build Coastguard Worker },
213*1c60b9acSAndroid Build Coastguard Worker {
214*1c60b9acSAndroid Build Coastguard Worker " Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι, greek",
215*1c60b9acSAndroid Build Coastguard Worker expected8, LWS_ARRAY_SIZE(expected8),
216*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_RFC7230_DELIMS
217*1c60b9acSAndroid Build Coastguard Worker },
218*1c60b9acSAndroid Build Coastguard Worker {
219*1c60b9acSAndroid Build Coastguard Worker "badutf8-1 \x80...",
220*1c60b9acSAndroid Build Coastguard Worker expected9, LWS_ARRAY_SIZE(expected9),
221*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_RFC7230_DELIMS
222*1c60b9acSAndroid Build Coastguard Worker },
223*1c60b9acSAndroid Build Coastguard Worker {
224*1c60b9acSAndroid Build Coastguard Worker "badutf8-2 \xed\x9f\xbf,\x80...",
225*1c60b9acSAndroid Build Coastguard Worker expected10, LWS_ARRAY_SIZE(expected10),
226*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_MINUS_NONTERM | LWS_TOKENIZE_F_RFC7230_DELIMS
227*1c60b9acSAndroid Build Coastguard Worker },
228*1c60b9acSAndroid Build Coastguard Worker {
229*1c60b9acSAndroid Build Coastguard Worker "1.myserver.com",
230*1c60b9acSAndroid Build Coastguard Worker expected11, LWS_ARRAY_SIZE(expected11),
231*1c60b9acSAndroid Build Coastguard Worker 0
232*1c60b9acSAndroid Build Coastguard Worker },
233*1c60b9acSAndroid Build Coastguard Worker {
234*1c60b9acSAndroid Build Coastguard Worker "1.myserver.com",
235*1c60b9acSAndroid Build Coastguard Worker expected12, LWS_ARRAY_SIZE(expected12),
236*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_DOT_NONTERM
237*1c60b9acSAndroid Build Coastguard Worker },
238*1c60b9acSAndroid Build Coastguard Worker {
239*1c60b9acSAndroid Build Coastguard Worker "1.myserver.com",
240*1c60b9acSAndroid Build Coastguard Worker expected13, LWS_ARRAY_SIZE(expected13),
241*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_DOT_NONTERM | LWS_TOKENIZE_F_NO_FLOATS
242*1c60b9acSAndroid Build Coastguard Worker },
243*1c60b9acSAndroid Build Coastguard Worker {
244*1c60b9acSAndroid Build Coastguard Worker "1.myserver.com",
245*1c60b9acSAndroid Build Coastguard Worker expected14, LWS_ARRAY_SIZE(expected14),
246*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_NO_FLOATS
247*1c60b9acSAndroid Build Coastguard Worker },
248*1c60b9acSAndroid Build Coastguard Worker {
249*1c60b9acSAndroid Build Coastguard Worker "close, Upgrade",
250*1c60b9acSAndroid Build Coastguard Worker expected15, LWS_ARRAY_SIZE(expected15),
251*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_COMMA_SEP_LIST
252*1c60b9acSAndroid Build Coastguard Worker },
253*1c60b9acSAndroid Build Coastguard Worker {
254*1c60b9acSAndroid Build Coastguard Worker "a=5", expected16, LWS_ARRAY_SIZE(expected16),
255*1c60b9acSAndroid Build Coastguard Worker LWS_TOKENIZE_F_NO_INTEGERS
256*1c60b9acSAndroid Build Coastguard Worker },
257*1c60b9acSAndroid Build Coastguard Worker {
258*1c60b9acSAndroid Build Coastguard Worker "# comment1\r\nhello #comment2\r\n#comment3", expected17,
259*1c60b9acSAndroid Build Coastguard Worker LWS_ARRAY_SIZE(expected17), LWS_TOKENIZE_F_HASH_COMMENT
260*1c60b9acSAndroid Build Coastguard Worker },
261*1c60b9acSAndroid Build Coastguard Worker {
262*1c60b9acSAndroid Build Coastguard Worker "x=y", expected18,
263*1c60b9acSAndroid Build Coastguard Worker LWS_ARRAY_SIZE(expected18), LWS_TOKENIZE_F_EQUALS_NONTERM
264*1c60b9acSAndroid Build Coastguard Worker }
265*1c60b9acSAndroid Build Coastguard Worker };
266*1c60b9acSAndroid Build Coastguard Worker
267*1c60b9acSAndroid Build Coastguard Worker /*
268*1c60b9acSAndroid Build Coastguard Worker * add LWS_TOKZE_ERRS to the element index (which may be negative by that
269*1c60b9acSAndroid Build Coastguard Worker * amount) to index this array
270*1c60b9acSAndroid Build Coastguard Worker */
271*1c60b9acSAndroid Build Coastguard Worker
272*1c60b9acSAndroid Build Coastguard Worker static const char *element_names[] = {
273*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_ERR_BROKEN_UTF8",
274*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_ERR_UNTERM_STRING",
275*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_ERR_MALFORMED_FLOAT",
276*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_ERR_NUM_ON_LHS",
277*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_ERR_COMMA_LIST",
278*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_ENDED",
279*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_DELIMITER",
280*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_TOKEN",
281*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_INTEGER",
282*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_FLOAT",
283*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_TOKEN_NAME_EQUALS",
284*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_TOKEN_NAME_COLON",
285*1c60b9acSAndroid Build Coastguard Worker "LWS_TOKZE_QUOTED_STRING",
286*1c60b9acSAndroid Build Coastguard Worker };
287*1c60b9acSAndroid Build Coastguard Worker
288*1c60b9acSAndroid Build Coastguard Worker
289*1c60b9acSAndroid Build Coastguard Worker int
exp_cb1(void * priv,const char * name,char * out,size_t * pos,size_t olen,size_t * exp_ofs)290*1c60b9acSAndroid Build Coastguard Worker exp_cb1(void *priv, const char *name, char *out, size_t *pos, size_t olen,
291*1c60b9acSAndroid Build Coastguard Worker size_t *exp_ofs)
292*1c60b9acSAndroid Build Coastguard Worker {
293*1c60b9acSAndroid Build Coastguard Worker const char *replace = NULL;
294*1c60b9acSAndroid Build Coastguard Worker size_t total, budget;
295*1c60b9acSAndroid Build Coastguard Worker
296*1c60b9acSAndroid Build Coastguard Worker if (!strcmp(name, "test")) {
297*1c60b9acSAndroid Build Coastguard Worker replace = "replacement_string";
298*1c60b9acSAndroid Build Coastguard Worker total = strlen(replace);
299*1c60b9acSAndroid Build Coastguard Worker goto expand;
300*1c60b9acSAndroid Build Coastguard Worker }
301*1c60b9acSAndroid Build Coastguard Worker
302*1c60b9acSAndroid Build Coastguard Worker return LSTRX_FATAL_NAME_UNKNOWN;
303*1c60b9acSAndroid Build Coastguard Worker
304*1c60b9acSAndroid Build Coastguard Worker expand:
305*1c60b9acSAndroid Build Coastguard Worker budget = olen - *pos;
306*1c60b9acSAndroid Build Coastguard Worker total -= *exp_ofs;
307*1c60b9acSAndroid Build Coastguard Worker if (total < budget)
308*1c60b9acSAndroid Build Coastguard Worker budget = total;
309*1c60b9acSAndroid Build Coastguard Worker
310*1c60b9acSAndroid Build Coastguard Worker if (out)
311*1c60b9acSAndroid Build Coastguard Worker memcpy(out + *pos, replace + (*exp_ofs), budget);
312*1c60b9acSAndroid Build Coastguard Worker *exp_ofs += budget;
313*1c60b9acSAndroid Build Coastguard Worker *pos += budget;
314*1c60b9acSAndroid Build Coastguard Worker
315*1c60b9acSAndroid Build Coastguard Worker if (budget == total)
316*1c60b9acSAndroid Build Coastguard Worker return LSTRX_DONE;
317*1c60b9acSAndroid Build Coastguard Worker
318*1c60b9acSAndroid Build Coastguard Worker return LSTRX_FILLED_OUT;
319*1c60b9acSAndroid Build Coastguard Worker }
320*1c60b9acSAndroid Build Coastguard Worker
321*1c60b9acSAndroid Build Coastguard Worker static const char *exp_inp1 = "this-is-a-${test}-for-strexp";
322*1c60b9acSAndroid Build Coastguard Worker
main(int argc,const char ** argv)323*1c60b9acSAndroid Build Coastguard Worker int main(int argc, const char **argv)
324*1c60b9acSAndroid Build Coastguard Worker {
325*1c60b9acSAndroid Build Coastguard Worker struct lws_context_creation_info info;
326*1c60b9acSAndroid Build Coastguard Worker struct lws_context *cx;
327*1c60b9acSAndroid Build Coastguard Worker struct lws_tokenize ts;
328*1c60b9acSAndroid Build Coastguard Worker lws_tokenize_elem e;
329*1c60b9acSAndroid Build Coastguard Worker const char *p;
330*1c60b9acSAndroid Build Coastguard Worker int n, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE
331*1c60b9acSAndroid Build Coastguard Worker /* for LLL_ verbosity above NOTICE to be built into lws,
332*1c60b9acSAndroid Build Coastguard Worker * lws must have been configured and built with
333*1c60b9acSAndroid Build Coastguard Worker * -DCMAKE_BUILD_TYPE=DEBUG instead of =RELEASE */
334*1c60b9acSAndroid Build Coastguard Worker /* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */
335*1c60b9acSAndroid Build Coastguard Worker /* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */
336*1c60b9acSAndroid Build Coastguard Worker /* | LLL_DEBUG */;
337*1c60b9acSAndroid Build Coastguard Worker int fail = 0, ok = 0, flags = 0;
338*1c60b9acSAndroid Build Coastguard Worker char dotstar[512];
339*1c60b9acSAndroid Build Coastguard Worker
340*1c60b9acSAndroid Build Coastguard Worker if ((p = lws_cmdline_option(argc, argv, "-d")))
341*1c60b9acSAndroid Build Coastguard Worker logs = atoi(p);
342*1c60b9acSAndroid Build Coastguard Worker
343*1c60b9acSAndroid Build Coastguard Worker lws_set_log_level(logs, NULL);
344*1c60b9acSAndroid Build Coastguard Worker lwsl_user("LWS API selftest: lws_tokenize\n");
345*1c60b9acSAndroid Build Coastguard Worker
346*1c60b9acSAndroid Build Coastguard Worker if ((p = lws_cmdline_option(argc, argv, "-f")))
347*1c60b9acSAndroid Build Coastguard Worker flags = atoi(p);
348*1c60b9acSAndroid Build Coastguard Worker
349*1c60b9acSAndroid Build Coastguard Worker
350*1c60b9acSAndroid Build Coastguard Worker memset(&info, 0, sizeof info);
351*1c60b9acSAndroid Build Coastguard Worker info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |
352*1c60b9acSAndroid Build Coastguard Worker LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW;
353*1c60b9acSAndroid Build Coastguard Worker
354*1c60b9acSAndroid Build Coastguard Worker /*
355*1c60b9acSAndroid Build Coastguard Worker * since we know this lws context is only ever going to be used with
356*1c60b9acSAndroid Build Coastguard Worker * one client wsis / fds / sockets at a time, let lws know it doesn't
357*1c60b9acSAndroid Build Coastguard Worker * have to use the default allocations for fd tables up to ulimit -n.
358*1c60b9acSAndroid Build Coastguard Worker * It will just allocate for 1 internal and 1 (+ 1 http2 nwsi) that we
359*1c60b9acSAndroid Build Coastguard Worker * will use.
360*1c60b9acSAndroid Build Coastguard Worker */
361*1c60b9acSAndroid Build Coastguard Worker info.fd_limit_per_thread = 1 + 1 + 1;
362*1c60b9acSAndroid Build Coastguard Worker
363*1c60b9acSAndroid Build Coastguard Worker #if 0
364*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_MBEDTLS) || defined(USE_WOLFSSL)
365*1c60b9acSAndroid Build Coastguard Worker /*
366*1c60b9acSAndroid Build Coastguard Worker * OpenSSL uses the system trust store. mbedTLS has to be told which
367*1c60b9acSAndroid Build Coastguard Worker * CA to trust explicitly.
368*1c60b9acSAndroid Build Coastguard Worker */
369*1c60b9acSAndroid Build Coastguard Worker info.client_ssl_ca_filepath = "./warmcat.com.cer";
370*1c60b9acSAndroid Build Coastguard Worker #endif
371*1c60b9acSAndroid Build Coastguard Worker #endif
372*1c60b9acSAndroid Build Coastguard Worker #if 0
373*1c60b9acSAndroid Build Coastguard Worker n = open("./warmcat.com.cer", O_RDONLY);
374*1c60b9acSAndroid Build Coastguard Worker if (n >= 0) {
375*1c60b9acSAndroid Build Coastguard Worker info.client_ssl_ca_mem_len = read(n, memcert, sizeof(memcert));
376*1c60b9acSAndroid Build Coastguard Worker info.client_ssl_ca_mem = memcert;
377*1c60b9acSAndroid Build Coastguard Worker close(n);
378*1c60b9acSAndroid Build Coastguard Worker n = 0;
379*1c60b9acSAndroid Build Coastguard Worker memcert[info.client_ssl_ca_mem_len++] = '\0';
380*1c60b9acSAndroid Build Coastguard Worker }
381*1c60b9acSAndroid Build Coastguard Worker #endif
382*1c60b9acSAndroid Build Coastguard Worker cx = lws_create_context(&info);
383*1c60b9acSAndroid Build Coastguard Worker
384*1c60b9acSAndroid Build Coastguard Worker /* lws_strexp */
385*1c60b9acSAndroid Build Coastguard Worker
386*1c60b9acSAndroid Build Coastguard Worker {
387*1c60b9acSAndroid Build Coastguard Worker size_t in_len, used_in, used_out;
388*1c60b9acSAndroid Build Coastguard Worker lws_strexp_t exp;
389*1c60b9acSAndroid Build Coastguard Worker char obuf[128];
390*1c60b9acSAndroid Build Coastguard Worker const char *p;
391*1c60b9acSAndroid Build Coastguard Worker
392*1c60b9acSAndroid Build Coastguard Worker obuf[0] = '\0';
393*1c60b9acSAndroid Build Coastguard Worker lws_strexp_init(&exp, NULL, exp_cb1, obuf, sizeof(obuf));
394*1c60b9acSAndroid Build Coastguard Worker n = lws_strexp_expand(&exp, exp_inp1, 28, &used_in, &used_out);
395*1c60b9acSAndroid Build Coastguard Worker if (n != LSTRX_DONE || used_in != 28 ||
396*1c60b9acSAndroid Build Coastguard Worker strcmp(obuf, "this-is-a-replacement_string-for-strexp")) {
397*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("%s: obuf %s\n", __func__, obuf);
398*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_strexp test 1 failed: %d\n", __func__, n);
399*1c60b9acSAndroid Build Coastguard Worker
400*1c60b9acSAndroid Build Coastguard Worker return 1;
401*1c60b9acSAndroid Build Coastguard Worker }
402*1c60b9acSAndroid Build Coastguard Worker
403*1c60b9acSAndroid Build Coastguard Worker /* as above, but don't generate output, just find the length */
404*1c60b9acSAndroid Build Coastguard Worker
405*1c60b9acSAndroid Build Coastguard Worker lws_strexp_init(&exp, NULL, exp_cb1, NULL, (size_t)-1);
406*1c60b9acSAndroid Build Coastguard Worker n = lws_strexp_expand(&exp, exp_inp1, 28, &used_in, &used_out);
407*1c60b9acSAndroid Build Coastguard Worker if (n != LSTRX_DONE || used_in != 28 || used_out != 39) {
408*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_strexp test 2 failed: %d, used_out: %d\n",
409*1c60b9acSAndroid Build Coastguard Worker __func__, n, (int)used_out);
410*1c60b9acSAndroid Build Coastguard Worker
411*1c60b9acSAndroid Build Coastguard Worker return 1;
412*1c60b9acSAndroid Build Coastguard Worker }
413*1c60b9acSAndroid Build Coastguard Worker
414*1c60b9acSAndroid Build Coastguard Worker p = exp_inp1;
415*1c60b9acSAndroid Build Coastguard Worker in_len = strlen(p);
416*1c60b9acSAndroid Build Coastguard Worker memset(obuf, 0, sizeof(obuf));
417*1c60b9acSAndroid Build Coastguard Worker lws_strexp_init(&exp, NULL, exp_cb1, obuf, 16);
418*1c60b9acSAndroid Build Coastguard Worker n = lws_strexp_expand(&exp, p, in_len, &used_in, &used_out);
419*1c60b9acSAndroid Build Coastguard Worker if (n != LSTRX_FILLED_OUT || used_in != 16 || used_out != 16) {
420*1c60b9acSAndroid Build Coastguard Worker lwsl_err("a\n");
421*1c60b9acSAndroid Build Coastguard Worker return 1;
422*1c60b9acSAndroid Build Coastguard Worker }
423*1c60b9acSAndroid Build Coastguard Worker
424*1c60b9acSAndroid Build Coastguard Worker p += used_in;
425*1c60b9acSAndroid Build Coastguard Worker in_len -= used_in;
426*1c60b9acSAndroid Build Coastguard Worker
427*1c60b9acSAndroid Build Coastguard Worker memset(obuf, 0, sizeof(obuf));
428*1c60b9acSAndroid Build Coastguard Worker lws_strexp_reset_out(&exp, obuf, 16);
429*1c60b9acSAndroid Build Coastguard Worker
430*1c60b9acSAndroid Build Coastguard Worker n = lws_strexp_expand(&exp, p, in_len, &used_in, &used_out);
431*1c60b9acSAndroid Build Coastguard Worker if (n != LSTRX_FILLED_OUT || used_in != 5 || used_out != 16) {
432*1c60b9acSAndroid Build Coastguard Worker lwsl_err("b: n %d, used_in %d, used_out %d\n", n,
433*1c60b9acSAndroid Build Coastguard Worker (int)used_in, (int)used_out);
434*1c60b9acSAndroid Build Coastguard Worker return 2;
435*1c60b9acSAndroid Build Coastguard Worker }
436*1c60b9acSAndroid Build Coastguard Worker
437*1c60b9acSAndroid Build Coastguard Worker p += used_in;
438*1c60b9acSAndroid Build Coastguard Worker in_len -= used_in;
439*1c60b9acSAndroid Build Coastguard Worker
440*1c60b9acSAndroid Build Coastguard Worker memset(obuf, 0, sizeof(obuf));
441*1c60b9acSAndroid Build Coastguard Worker lws_strexp_reset_out(&exp, obuf, 16);
442*1c60b9acSAndroid Build Coastguard Worker
443*1c60b9acSAndroid Build Coastguard Worker n = lws_strexp_expand(&exp, p, in_len, &used_in, &used_out);
444*1c60b9acSAndroid Build Coastguard Worker if (n != LSTRX_DONE || used_in != 7 || used_out != 7) {
445*1c60b9acSAndroid Build Coastguard Worker lwsl_err("c: n %d, used_in %d, used_out %d\n", n, (int)used_in, (int)used_out);
446*1c60b9acSAndroid Build Coastguard Worker return 2;
447*1c60b9acSAndroid Build Coastguard Worker }
448*1c60b9acSAndroid Build Coastguard Worker }
449*1c60b9acSAndroid Build Coastguard Worker
450*1c60b9acSAndroid Build Coastguard Worker /* sanity check lws_strnncpy() */
451*1c60b9acSAndroid Build Coastguard Worker
452*1c60b9acSAndroid Build Coastguard Worker lws_strnncpy(dotstar, "12345678", 4, sizeof(dotstar));
453*1c60b9acSAndroid Build Coastguard Worker if (strcmp(dotstar, "1234")) {
454*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_strnncpy check failed\n", __func__);
455*1c60b9acSAndroid Build Coastguard Worker
456*1c60b9acSAndroid Build Coastguard Worker return 1;
457*1c60b9acSAndroid Build Coastguard Worker }
458*1c60b9acSAndroid Build Coastguard Worker lws_strnncpy(dotstar, "12345678", 8, 6);
459*1c60b9acSAndroid Build Coastguard Worker if (strcmp(dotstar, "12345")) {
460*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_strnncpy check failed\n", __func__);
461*1c60b9acSAndroid Build Coastguard Worker
462*1c60b9acSAndroid Build Coastguard Worker return 1;
463*1c60b9acSAndroid Build Coastguard Worker }
464*1c60b9acSAndroid Build Coastguard Worker
465*1c60b9acSAndroid Build Coastguard Worker /* sanity check lws_nstrstr() */
466*1c60b9acSAndroid Build Coastguard Worker
467*1c60b9acSAndroid Build Coastguard Worker {
468*1c60b9acSAndroid Build Coastguard Worker static const char *t1 = "abc123456";
469*1c60b9acSAndroid Build Coastguard Worker const char *mcp;
470*1c60b9acSAndroid Build Coastguard Worker
471*1c60b9acSAndroid Build Coastguard Worker mcp = lws_nstrstr(t1, strlen(t1), "abc", 3);
472*1c60b9acSAndroid Build Coastguard Worker if (mcp != t1) {
473*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_nstrstr 1 failed\n", __func__);
474*1c60b9acSAndroid Build Coastguard Worker return 1;
475*1c60b9acSAndroid Build Coastguard Worker }
476*1c60b9acSAndroid Build Coastguard Worker mcp = lws_nstrstr(t1, strlen(t1), "def", 3);
477*1c60b9acSAndroid Build Coastguard Worker if (mcp != NULL) {
478*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_nstrstr 2 failed\n", __func__);
479*1c60b9acSAndroid Build Coastguard Worker return 1;
480*1c60b9acSAndroid Build Coastguard Worker }
481*1c60b9acSAndroid Build Coastguard Worker mcp = lws_nstrstr(t1, strlen(t1), "456", 3);
482*1c60b9acSAndroid Build Coastguard Worker if (mcp != t1 + 6) {
483*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_nstrstr 3 failed: %p\n", __func__, mcp);
484*1c60b9acSAndroid Build Coastguard Worker return 1;
485*1c60b9acSAndroid Build Coastguard Worker }
486*1c60b9acSAndroid Build Coastguard Worker mcp = lws_nstrstr(t1, strlen(t1), "1", 1);
487*1c60b9acSAndroid Build Coastguard Worker if (mcp != t1 + 3) {
488*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_nstrstr 4 failed\n", __func__);
489*1c60b9acSAndroid Build Coastguard Worker return 1;
490*1c60b9acSAndroid Build Coastguard Worker }
491*1c60b9acSAndroid Build Coastguard Worker mcp = lws_nstrstr(t1, strlen(t1), "abc1234567", 10);
492*1c60b9acSAndroid Build Coastguard Worker if (mcp != NULL) {
493*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_nstrstr 5 failed\n", __func__);
494*1c60b9acSAndroid Build Coastguard Worker return 1;
495*1c60b9acSAndroid Build Coastguard Worker }
496*1c60b9acSAndroid Build Coastguard Worker }
497*1c60b9acSAndroid Build Coastguard Worker
498*1c60b9acSAndroid Build Coastguard Worker /* sanity check lws_json_simple_find() */
499*1c60b9acSAndroid Build Coastguard Worker
500*1c60b9acSAndroid Build Coastguard Worker {
501*1c60b9acSAndroid Build Coastguard Worker static const char *t1 = "{\"myname1\":true,"
502*1c60b9acSAndroid Build Coastguard Worker "\"myname2\":\"string\", "
503*1c60b9acSAndroid Build Coastguard Worker "\"myname3\": 123}";
504*1c60b9acSAndroid Build Coastguard Worker size_t alen;
505*1c60b9acSAndroid Build Coastguard Worker const char *mcp;
506*1c60b9acSAndroid Build Coastguard Worker
507*1c60b9acSAndroid Build Coastguard Worker mcp = lws_json_simple_find(t1, strlen(t1), "\"myname1\":", &alen);
508*1c60b9acSAndroid Build Coastguard Worker if (mcp != t1 + 11 || alen != 4) {
509*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_json_simple_find 1 failed: (%d) %s\n",
510*1c60b9acSAndroid Build Coastguard Worker __func__, (int)alen, mcp);
511*1c60b9acSAndroid Build Coastguard Worker return 1;
512*1c60b9acSAndroid Build Coastguard Worker }
513*1c60b9acSAndroid Build Coastguard Worker
514*1c60b9acSAndroid Build Coastguard Worker mcp = lws_json_simple_find(t1, strlen(t1), "\"myname2\":", &alen);
515*1c60b9acSAndroid Build Coastguard Worker if (mcp != t1 + 27 || alen != 6) {
516*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_json_simple_find 2 failed\n", __func__);
517*1c60b9acSAndroid Build Coastguard Worker return 1;
518*1c60b9acSAndroid Build Coastguard Worker }
519*1c60b9acSAndroid Build Coastguard Worker
520*1c60b9acSAndroid Build Coastguard Worker mcp = lws_json_simple_find(t1, strlen(t1), "\"myname3\":", &alen);
521*1c60b9acSAndroid Build Coastguard Worker if (mcp != t1 + 47 || alen != 3) {
522*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_json_simple_find 3 failed\n", __func__);
523*1c60b9acSAndroid Build Coastguard Worker return 1;
524*1c60b9acSAndroid Build Coastguard Worker }
525*1c60b9acSAndroid Build Coastguard Worker
526*1c60b9acSAndroid Build Coastguard Worker mcp = lws_json_simple_find(t1, strlen(t1), "\"nope\":", &alen);
527*1c60b9acSAndroid Build Coastguard Worker if (mcp != NULL) {
528*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: lws_json_simple_find 4 failed\n", __func__);
529*1c60b9acSAndroid Build Coastguard Worker return 1;
530*1c60b9acSAndroid Build Coastguard Worker }
531*1c60b9acSAndroid Build Coastguard Worker }
532*1c60b9acSAndroid Build Coastguard Worker
533*1c60b9acSAndroid Build Coastguard Worker p = lws_cmdline_option(argc, argv, "-s");
534*1c60b9acSAndroid Build Coastguard Worker
535*1c60b9acSAndroid Build Coastguard Worker for (n = 0; n < (int)LWS_ARRAY_SIZE(tests); n++) {
536*1c60b9acSAndroid Build Coastguard Worker int m = 0, in_fail = fail;
537*1c60b9acSAndroid Build Coastguard Worker struct expected *exp = tests[n].exp;
538*1c60b9acSAndroid Build Coastguard Worker
539*1c60b9acSAndroid Build Coastguard Worker memset(&ts, 0, sizeof(ts));
540*1c60b9acSAndroid Build Coastguard Worker ts.start = tests[n].string;
541*1c60b9acSAndroid Build Coastguard Worker ts.len = strlen(ts.start);
542*1c60b9acSAndroid Build Coastguard Worker ts.flags = (uint16_t)tests[n].flags;
543*1c60b9acSAndroid Build Coastguard Worker
544*1c60b9acSAndroid Build Coastguard Worker do {
545*1c60b9acSAndroid Build Coastguard Worker e = lws_tokenize(&ts);
546*1c60b9acSAndroid Build Coastguard Worker
547*1c60b9acSAndroid Build Coastguard Worker lws_strnncpy(dotstar, ts.token, ts.token_len,
548*1c60b9acSAndroid Build Coastguard Worker sizeof(dotstar));
549*1c60b9acSAndroid Build Coastguard Worker lwsl_info("{ %s, \"%s\", %d }\n",
550*1c60b9acSAndroid Build Coastguard Worker element_names[e + LWS_TOKZE_ERRS], dotstar,
551*1c60b9acSAndroid Build Coastguard Worker (int)ts.token_len);
552*1c60b9acSAndroid Build Coastguard Worker
553*1c60b9acSAndroid Build Coastguard Worker if (m == (int)tests[n].count) {
554*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("fail: expected end earlier\n");
555*1c60b9acSAndroid Build Coastguard Worker fail++;
556*1c60b9acSAndroid Build Coastguard Worker break;
557*1c60b9acSAndroid Build Coastguard Worker }
558*1c60b9acSAndroid Build Coastguard Worker
559*1c60b9acSAndroid Build Coastguard Worker if (e != exp->e) {
560*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("fail... tok %s vs expected %s\n",
561*1c60b9acSAndroid Build Coastguard Worker element_names[e + LWS_TOKZE_ERRS],
562*1c60b9acSAndroid Build Coastguard Worker element_names[exp->e + LWS_TOKZE_ERRS]);
563*1c60b9acSAndroid Build Coastguard Worker fail++;
564*1c60b9acSAndroid Build Coastguard Worker break;
565*1c60b9acSAndroid Build Coastguard Worker }
566*1c60b9acSAndroid Build Coastguard Worker
567*1c60b9acSAndroid Build Coastguard Worker if (e > 0 &&
568*1c60b9acSAndroid Build Coastguard Worker (ts.token_len != exp->len ||
569*1c60b9acSAndroid Build Coastguard Worker memcmp(exp->value, ts.token, exp->len))) {
570*1c60b9acSAndroid Build Coastguard Worker lws_strnncpy(dotstar, ts.token, ts.token_len,
571*1c60b9acSAndroid Build Coastguard Worker sizeof(dotstar));
572*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("fail token mismatch %d %d %s\n",
573*1c60b9acSAndroid Build Coastguard Worker (int)ts.token_len, (int)exp->len,
574*1c60b9acSAndroid Build Coastguard Worker dotstar);
575*1c60b9acSAndroid Build Coastguard Worker fail++;
576*1c60b9acSAndroid Build Coastguard Worker break;
577*1c60b9acSAndroid Build Coastguard Worker }
578*1c60b9acSAndroid Build Coastguard Worker
579*1c60b9acSAndroid Build Coastguard Worker m++;
580*1c60b9acSAndroid Build Coastguard Worker exp++;
581*1c60b9acSAndroid Build Coastguard Worker
582*1c60b9acSAndroid Build Coastguard Worker } while (e > 0);
583*1c60b9acSAndroid Build Coastguard Worker
584*1c60b9acSAndroid Build Coastguard Worker if (fail == in_fail)
585*1c60b9acSAndroid Build Coastguard Worker ok++;
586*1c60b9acSAndroid Build Coastguard Worker }
587*1c60b9acSAndroid Build Coastguard Worker
588*1c60b9acSAndroid Build Coastguard Worker if (p) {
589*1c60b9acSAndroid Build Coastguard Worker ts.start = p;
590*1c60b9acSAndroid Build Coastguard Worker ts.len = strlen(p);
591*1c60b9acSAndroid Build Coastguard Worker ts.flags = (uint16_t)flags;
592*1c60b9acSAndroid Build Coastguard Worker
593*1c60b9acSAndroid Build Coastguard Worker printf("\t{\n\t\t\"%s\",\n"
594*1c60b9acSAndroid Build Coastguard Worker "\t\texpected%d, LWS_ARRAY_SIZE(expected%d),\n\t\t",
595*1c60b9acSAndroid Build Coastguard Worker p, (int)LWS_ARRAY_SIZE(tests) + 1,
596*1c60b9acSAndroid Build Coastguard Worker (int)LWS_ARRAY_SIZE(tests) + 1);
597*1c60b9acSAndroid Build Coastguard Worker
598*1c60b9acSAndroid Build Coastguard Worker if (!flags)
599*1c60b9acSAndroid Build Coastguard Worker printf("0\n\t},\n");
600*1c60b9acSAndroid Build Coastguard Worker else {
601*1c60b9acSAndroid Build Coastguard Worker if (flags & LWS_TOKENIZE_F_MINUS_NONTERM)
602*1c60b9acSAndroid Build Coastguard Worker printf("LWS_TOKENIZE_F_MINUS_NONTERM");
603*1c60b9acSAndroid Build Coastguard Worker if (flags & LWS_TOKENIZE_F_AGG_COLON) {
604*1c60b9acSAndroid Build Coastguard Worker if (flags & 1)
605*1c60b9acSAndroid Build Coastguard Worker printf(" | ");
606*1c60b9acSAndroid Build Coastguard Worker printf("LWS_TOKENIZE_F_AGG_COLON");
607*1c60b9acSAndroid Build Coastguard Worker }
608*1c60b9acSAndroid Build Coastguard Worker if (flags & LWS_TOKENIZE_F_COMMA_SEP_LIST) {
609*1c60b9acSAndroid Build Coastguard Worker if (flags & 3)
610*1c60b9acSAndroid Build Coastguard Worker printf(" | ");
611*1c60b9acSAndroid Build Coastguard Worker printf("LWS_TOKENIZE_F_COMMA_SEP_LIST");
612*1c60b9acSAndroid Build Coastguard Worker }
613*1c60b9acSAndroid Build Coastguard Worker if (flags & LWS_TOKENIZE_F_RFC7230_DELIMS) {
614*1c60b9acSAndroid Build Coastguard Worker if (flags & 7)
615*1c60b9acSAndroid Build Coastguard Worker printf(" | ");
616*1c60b9acSAndroid Build Coastguard Worker printf("LWS_TOKENIZE_F_RFC7230_DELIMS");
617*1c60b9acSAndroid Build Coastguard Worker }
618*1c60b9acSAndroid Build Coastguard Worker if (flags & LWS_TOKENIZE_F_DOT_NONTERM) {
619*1c60b9acSAndroid Build Coastguard Worker if (flags & 15)
620*1c60b9acSAndroid Build Coastguard Worker printf(" | ");
621*1c60b9acSAndroid Build Coastguard Worker printf("LWS_TOKENIZE_F_DOT_NONTERM");
622*1c60b9acSAndroid Build Coastguard Worker }
623*1c60b9acSAndroid Build Coastguard Worker if (flags & LWS_TOKENIZE_F_NO_FLOATS) {
624*1c60b9acSAndroid Build Coastguard Worker if (flags & 31)
625*1c60b9acSAndroid Build Coastguard Worker printf(" | ");
626*1c60b9acSAndroid Build Coastguard Worker printf("LWS_TOKENIZE_F_NO_FLOATS");
627*1c60b9acSAndroid Build Coastguard Worker }
628*1c60b9acSAndroid Build Coastguard Worker printf("\n\t},\n");
629*1c60b9acSAndroid Build Coastguard Worker }
630*1c60b9acSAndroid Build Coastguard Worker
631*1c60b9acSAndroid Build Coastguard Worker printf("\texpected%d[] = {\n", (int)LWS_ARRAY_SIZE(tests) + 1);
632*1c60b9acSAndroid Build Coastguard Worker
633*1c60b9acSAndroid Build Coastguard Worker do {
634*1c60b9acSAndroid Build Coastguard Worker e = lws_tokenize(&ts);
635*1c60b9acSAndroid Build Coastguard Worker
636*1c60b9acSAndroid Build Coastguard Worker lws_strnncpy(dotstar, ts.token, ts.token_len,
637*1c60b9acSAndroid Build Coastguard Worker sizeof(dotstar));
638*1c60b9acSAndroid Build Coastguard Worker
639*1c60b9acSAndroid Build Coastguard Worker printf("\t\t{ %s, \"%s\", %d },\n",
640*1c60b9acSAndroid Build Coastguard Worker element_names[e + LWS_TOKZE_ERRS],
641*1c60b9acSAndroid Build Coastguard Worker dotstar, (int)ts.token_len);
642*1c60b9acSAndroid Build Coastguard Worker
643*1c60b9acSAndroid Build Coastguard Worker } while (e > 0);
644*1c60b9acSAndroid Build Coastguard Worker
645*1c60b9acSAndroid Build Coastguard Worker printf("\t}\n");
646*1c60b9acSAndroid Build Coastguard Worker }
647*1c60b9acSAndroid Build Coastguard Worker
648*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_ROLE_H1) || defined(LWS_ROLE_H2)
649*1c60b9acSAndroid Build Coastguard Worker {
650*1c60b9acSAndroid Build Coastguard Worker time_t t;
651*1c60b9acSAndroid Build Coastguard Worker
652*1c60b9acSAndroid Build Coastguard Worker if (lws_http_date_parse_unix("Tue, 15 Nov 1994 08:12:31 GMT", 29, &t)) {
653*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: date parse failed\n", __func__);
654*1c60b9acSAndroid Build Coastguard Worker fail++;
655*1c60b9acSAndroid Build Coastguard Worker } else {
656*1c60b9acSAndroid Build Coastguard Worker /* lwsl_notice("%s: %llu\n", __func__, (unsigned long long)t); */
657*1c60b9acSAndroid Build Coastguard Worker if (t != (time_t)784887151) {
658*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: date parse wrong\n", __func__);
659*1c60b9acSAndroid Build Coastguard Worker fail++;
660*1c60b9acSAndroid Build Coastguard Worker } else {
661*1c60b9acSAndroid Build Coastguard Worker char s[30];
662*1c60b9acSAndroid Build Coastguard Worker
663*1c60b9acSAndroid Build Coastguard Worker if (lws_http_date_render_from_unix(s, sizeof(s), &t)) {
664*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: failed date render\n", __func__);
665*1c60b9acSAndroid Build Coastguard Worker fail++;
666*1c60b9acSAndroid Build Coastguard Worker } else {
667*1c60b9acSAndroid Build Coastguard Worker if (!strcmp(s, "Tue, 15 Nov 1994 08:12:31 GMT")) {
668*1c60b9acSAndroid Build Coastguard Worker lwsl_err("%s: date render wrong\n", __func__);
669*1c60b9acSAndroid Build Coastguard Worker fail++;
670*1c60b9acSAndroid Build Coastguard Worker }
671*1c60b9acSAndroid Build Coastguard Worker }
672*1c60b9acSAndroid Build Coastguard Worker }
673*1c60b9acSAndroid Build Coastguard Worker }
674*1c60b9acSAndroid Build Coastguard Worker }
675*1c60b9acSAndroid Build Coastguard Worker #endif
676*1c60b9acSAndroid Build Coastguard Worker
677*1c60b9acSAndroid Build Coastguard Worker {
678*1c60b9acSAndroid Build Coastguard Worker char buf[24];
679*1c60b9acSAndroid Build Coastguard Worker int m;
680*1c60b9acSAndroid Build Coastguard Worker
681*1c60b9acSAndroid Build Coastguard Worker m = lws_humanize(buf, sizeof(buf), 0, humanize_schema_si);
682*1c60b9acSAndroid Build Coastguard Worker if (m != 1 || strcmp(buf, "0")) {
683*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: humanize 1 fail '%s' (%d)\n", __func__, buf, m);
684*1c60b9acSAndroid Build Coastguard Worker fail++;
685*1c60b9acSAndroid Build Coastguard Worker }
686*1c60b9acSAndroid Build Coastguard Worker m = lws_humanize(buf, sizeof(buf), 2, humanize_schema_si);
687*1c60b9acSAndroid Build Coastguard Worker if (m != 1 || strcmp(buf, "2")) {
688*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: humanize 2 fail '%s' (%d)\n", __func__, buf, m);
689*1c60b9acSAndroid Build Coastguard Worker fail++;
690*1c60b9acSAndroid Build Coastguard Worker }
691*1c60b9acSAndroid Build Coastguard Worker m = lws_humanize(buf, sizeof(buf), 999, humanize_schema_si);
692*1c60b9acSAndroid Build Coastguard Worker if (m != 3 || strcmp(buf, "999")) {
693*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: humanize 3 fail '%s' (%d)\n", __func__, buf, m);
694*1c60b9acSAndroid Build Coastguard Worker fail++;
695*1c60b9acSAndroid Build Coastguard Worker }
696*1c60b9acSAndroid Build Coastguard Worker m = lws_humanize(buf, sizeof(buf), 1000, humanize_schema_si);
697*1c60b9acSAndroid Build Coastguard Worker if (m != 4 || strcmp(buf, "1000")) {
698*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: humanize 4 fail '%s' (%d)\n", __func__, buf, m);
699*1c60b9acSAndroid Build Coastguard Worker fail++;
700*1c60b9acSAndroid Build Coastguard Worker }
701*1c60b9acSAndroid Build Coastguard Worker m = lws_humanize(buf, sizeof(buf), 1024, humanize_schema_si);
702*1c60b9acSAndroid Build Coastguard Worker if (m != 7 || strcmp(buf, "1.000Ki")) {
703*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: humanize 5 fail '%s' (%d)\n", __func__, buf, m);
704*1c60b9acSAndroid Build Coastguard Worker fail++;
705*1c60b9acSAndroid Build Coastguard Worker }
706*1c60b9acSAndroid Build Coastguard Worker }
707*1c60b9acSAndroid Build Coastguard Worker
708*1c60b9acSAndroid Build Coastguard Worker if (lws_strcmp_wildcard("allied", 6, "allied", 6)) {
709*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 1 fail\n", __func__);
710*1c60b9acSAndroid Build Coastguard Worker fail++;
711*1c60b9acSAndroid Build Coastguard Worker }
712*1c60b9acSAndroid Build Coastguard Worker if (lws_strcmp_wildcard("a*", 2, "allied", 6)) {
713*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 2 fail\n", __func__);
714*1c60b9acSAndroid Build Coastguard Worker fail++;
715*1c60b9acSAndroid Build Coastguard Worker }
716*1c60b9acSAndroid Build Coastguard Worker if (lws_strcmp_wildcard("all*", 4, "allied", 6)) {
717*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 3 fail\n", __func__);
718*1c60b9acSAndroid Build Coastguard Worker fail++;
719*1c60b9acSAndroid Build Coastguard Worker }
720*1c60b9acSAndroid Build Coastguard Worker if (lws_strcmp_wildcard("all*d", 5, "allied", 6)) {
721*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 4 fail\n", __func__);
722*1c60b9acSAndroid Build Coastguard Worker fail++;
723*1c60b9acSAndroid Build Coastguard Worker }
724*1c60b9acSAndroid Build Coastguard Worker if (!lws_strcmp_wildcard("b*", 2, "allied", 6)) {
725*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 5 fail\n", __func__);
726*1c60b9acSAndroid Build Coastguard Worker fail++;
727*1c60b9acSAndroid Build Coastguard Worker }
728*1c60b9acSAndroid Build Coastguard Worker if (!lws_strcmp_wildcard("b*ed", 4, "allied", 6)) {
729*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 6 fail\n", __func__);
730*1c60b9acSAndroid Build Coastguard Worker fail++;
731*1c60b9acSAndroid Build Coastguard Worker }
732*1c60b9acSAndroid Build Coastguard Worker if (!lws_strcmp_wildcard("allie", 5, "allied", 6)) {
733*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 7 fail\n", __func__);
734*1c60b9acSAndroid Build Coastguard Worker fail++;
735*1c60b9acSAndroid Build Coastguard Worker }
736*1c60b9acSAndroid Build Coastguard Worker if (lws_strcmp_wildcard("allie*", 6, "allied", 6)) {
737*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 8 fail\n", __func__);
738*1c60b9acSAndroid Build Coastguard Worker fail++;
739*1c60b9acSAndroid Build Coastguard Worker }
740*1c60b9acSAndroid Build Coastguard Worker if (lws_strcmp_wildcard("*llie*", 6, "allied", 6)) {
741*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 9 fail\n", __func__);
742*1c60b9acSAndroid Build Coastguard Worker fail++;
743*1c60b9acSAndroid Build Coastguard Worker }
744*1c60b9acSAndroid Build Coastguard Worker if (lws_strcmp_wildcard("*llied", 6, "allied", 6)) {
745*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 10 fail\n", __func__);
746*1c60b9acSAndroid Build Coastguard Worker fail++;
747*1c60b9acSAndroid Build Coastguard Worker }
748*1c60b9acSAndroid Build Coastguard Worker if (!lws_strcmp_wildcard("*llie", 5, "allied", 6)) {
749*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 11 fail\n", __func__);
750*1c60b9acSAndroid Build Coastguard Worker fail++;
751*1c60b9acSAndroid Build Coastguard Worker }
752*1c60b9acSAndroid Build Coastguard Worker if (!lws_strcmp_wildcard("*nope", 5, "allied", 6)) {
753*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 12 fail\n", __func__);
754*1c60b9acSAndroid Build Coastguard Worker fail++;
755*1c60b9acSAndroid Build Coastguard Worker }
756*1c60b9acSAndroid Build Coastguard Worker if (lws_strcmp_wildcard("*li*", 4, "allied", 6)) {
757*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 13 fail\n", __func__);
758*1c60b9acSAndroid Build Coastguard Worker fail++;
759*1c60b9acSAndroid Build Coastguard Worker }
760*1c60b9acSAndroid Build Coastguard Worker if (lws_strcmp_wildcard("*", 1, "allied", 6)) {
761*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 14 fail\n", __func__);
762*1c60b9acSAndroid Build Coastguard Worker fail++;
763*1c60b9acSAndroid Build Coastguard Worker }
764*1c60b9acSAndroid Build Coastguard Worker if (lws_strcmp_wildcard("*abc*d", 6, "xxabyyabcdd", 11)) {
765*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 15 fail\n", __func__);
766*1c60b9acSAndroid Build Coastguard Worker fail++;
767*1c60b9acSAndroid Build Coastguard Worker }
768*1c60b9acSAndroid Build Coastguard Worker if (lws_strcmp_wildcard("ssproxy.n.cn.*", 14,
769*1c60b9acSAndroid Build Coastguard Worker "ssproxy.n.cn.failures", 21)) {
770*1c60b9acSAndroid Build Coastguard Worker lwsl_user("%s: wc 16 fail\n", __func__);
771*1c60b9acSAndroid Build Coastguard Worker fail++;
772*1c60b9acSAndroid Build Coastguard Worker }
773*1c60b9acSAndroid Build Coastguard Worker
774*1c60b9acSAndroid Build Coastguard Worker lwsl_user("Completed: PASS: %d, FAIL: %d\n", ok, fail);
775*1c60b9acSAndroid Build Coastguard Worker
776*1c60b9acSAndroid Build Coastguard Worker lws_context_destroy(cx);
777*1c60b9acSAndroid Build Coastguard Worker
778*1c60b9acSAndroid Build Coastguard Worker return !(ok && !fail);
779*1c60b9acSAndroid Build Coastguard Worker }
780