xref: /aosp_15_r20/external/libwebsockets/READMEs/README.test-apps.md (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard WorkerOverview of lws test apps
2*1c60b9acSAndroid Build Coastguard Worker=========================
3*1c60b9acSAndroid Build Coastguard Worker
4*1c60b9acSAndroid Build Coastguard WorkerAre you building a client?  You just need to look at the test client
5*1c60b9acSAndroid Build Coastguard Worker[libwebsockets-test-client](../test-apps/test-client.c).
6*1c60b9acSAndroid Build Coastguard Worker
7*1c60b9acSAndroid Build Coastguard WorkerIf you are building a standalone server, there are three choices, in order of
8*1c60b9acSAndroid Build Coastguard Workerpreferability.
9*1c60b9acSAndroid Build Coastguard Worker
10*1c60b9acSAndroid Build Coastguard Worker1) lwsws + protocol plugins
11*1c60b9acSAndroid Build Coastguard Worker
12*1c60b9acSAndroid Build Coastguard WorkerLws provides a generic web server app that can be configured with JSON
13*1c60b9acSAndroid Build Coastguard Workerconfig files.  https://libwebsockets.org itself uses this method.
14*1c60b9acSAndroid Build Coastguard Worker
15*1c60b9acSAndroid Build Coastguard WorkerWith lwsws handling the serving part, you only need to write an lws protocol
16*1c60b9acSAndroid Build Coastguard Workerplugin.  See [plugin-standalone](../plugin-standalone) for an example of how
17*1c60b9acSAndroid Build Coastguard Workerto do that outside lws itself, using lws public apis.
18*1c60b9acSAndroid Build Coastguard Worker
19*1c60b9acSAndroid Build Coastguard Worker $ cmake .. -DLWS_WITH_LWSWS=1
20*1c60b9acSAndroid Build Coastguard Worker
21*1c60b9acSAndroid Build Coastguard WorkerSee [README.lwsws.md](../READMEs/README.lwsws.md) for information on how to configure
22*1c60b9acSAndroid Build Coastguard Workerlwsws.
23*1c60b9acSAndroid Build Coastguard Worker
24*1c60b9acSAndroid Build Coastguard WorkerNOTE this method implies libuv is used by lws, to provide crossplatform
25*1c60b9acSAndroid Build Coastguard Workerimplementations of timers, dynamic lib loading etc for plugins and lwsws.
26*1c60b9acSAndroid Build Coastguard Worker
27*1c60b9acSAndroid Build Coastguard Worker2) Using plugins in code
28*1c60b9acSAndroid Build Coastguard Worker
29*1c60b9acSAndroid Build Coastguard WorkerThis method lets you configure web serving in code, instead of using lwsws.
30*1c60b9acSAndroid Build Coastguard Worker
31*1c60b9acSAndroid Build Coastguard WorkerPlugins are still used, but you have a choice whether to dynamically load
32*1c60b9acSAndroid Build Coastguard Workerthem or statically include them.  In this example, they are dynamically
33*1c60b9acSAndroid Build Coastguard Workerloaded.
34*1c60b9acSAndroid Build Coastguard Worker
35*1c60b9acSAndroid Build Coastguard Worker $ cmake .. -DLWS_WITH_PLUGINS=1
36*1c60b9acSAndroid Build Coastguard Worker
37*1c60b9acSAndroid Build Coastguard WorkerSee, eg, the [test-server](../test-apps/test-server.c)
38*1c60b9acSAndroid Build Coastguard Worker
39*1c60b9acSAndroid Build Coastguard Worker3) protocols in the server app
40*1c60b9acSAndroid Build Coastguard Worker
41*1c60b9acSAndroid Build Coastguard WorkerThis is the original way lws implemented servers, plugins and libuv are not
42*1c60b9acSAndroid Build Coastguard Workerrequired, but without plugins separating the protocol code directly, the
43*1c60b9acSAndroid Build Coastguard Workercombined code is all squidged together and is much less maintainable.
44*1c60b9acSAndroid Build Coastguard Worker
45*1c60b9acSAndroid Build Coastguard WorkerThis method is still supported in lws but all ongoing and future work is
46*1c60b9acSAndroid Build Coastguard Workerbeing done in protocol plugins only.
47*1c60b9acSAndroid Build Coastguard Worker
48*1c60b9acSAndroid Build Coastguard WorkerYou can simply include the plugin contents and have it buit statically into
49*1c60b9acSAndroid Build Coastguard Workeryour server, just define this before including the plugin source
50*1c60b9acSAndroid Build Coastguard Worker
51*1c60b9acSAndroid Build Coastguard Worker```
52*1c60b9acSAndroid Build Coastguard Worker#define LWS_PLUGIN_STATIC
53*1c60b9acSAndroid Build Coastguard Worker```
54*1c60b9acSAndroid Build Coastguard Worker
55*1c60b9acSAndroid Build Coastguard WorkerThis gets you most of the advantages without needing dynamic loading +
56*1c60b9acSAndroid Build Coastguard Workerlibuv.
57*1c60b9acSAndroid Build Coastguard Worker
58*1c60b9acSAndroid Build Coastguard Worker
59*1c60b9acSAndroid Build Coastguard WorkerNotes about lws test apps
60*1c60b9acSAndroid Build Coastguard Worker=========================
61*1c60b9acSAndroid Build Coastguard Worker
62*1c60b9acSAndroid Build Coastguard Worker@section tsb Testing server with a browser
63*1c60b9acSAndroid Build Coastguard Worker
64*1c60b9acSAndroid Build Coastguard WorkerIf you run [libwebsockets-test-server](../test-apps/test-server.c) and point your browser
65*1c60b9acSAndroid Build Coastguard Worker(eg, Chrome) to
66*1c60b9acSAndroid Build Coastguard Worker
67*1c60b9acSAndroid Build Coastguard Worker	http://127.0.0.1:7681
68*1c60b9acSAndroid Build Coastguard Worker
69*1c60b9acSAndroid Build Coastguard WorkerIt will fetch a script in the form of `test.html`, and then run the
70*1c60b9acSAndroid Build Coastguard Workerscript in there on the browser to open a websocket connection.
71*1c60b9acSAndroid Build Coastguard WorkerIncrementing numbers should appear in the browser display.
72*1c60b9acSAndroid Build Coastguard Worker
73*1c60b9acSAndroid Build Coastguard WorkerBy default the test server logs to both stderr and syslog, you can control
74*1c60b9acSAndroid Build Coastguard Workerwhat is logged using `-d <log level>`, see later.
75*1c60b9acSAndroid Build Coastguard Worker
76*1c60b9acSAndroid Build Coastguard Worker
77*1c60b9acSAndroid Build Coastguard Worker@section tsd Running test server as a Daemon
78*1c60b9acSAndroid Build Coastguard Worker
79*1c60b9acSAndroid Build Coastguard WorkerYou can use the -D option on the test server to have it fork into the
80*1c60b9acSAndroid Build Coastguard Workerbackground and return immediately.  In this daemonized mode all stderr is
81*1c60b9acSAndroid Build Coastguard Workerdisabled and logging goes only to syslog, eg, `/var/log/messages` or similar.
82*1c60b9acSAndroid Build Coastguard Worker
83*1c60b9acSAndroid Build Coastguard WorkerThe server maintains a lockfile at `/tmp/.lwsts-lock` that contains the pid
84*1c60b9acSAndroid Build Coastguard Workerof the parent process, and deletes this file when the parent process
85*1c60b9acSAndroid Build Coastguard Workerterminates.
86*1c60b9acSAndroid Build Coastguard Worker
87*1c60b9acSAndroid Build Coastguard WorkerTo stop the daemon, do
88*1c60b9acSAndroid Build Coastguard Worker```
89*1c60b9acSAndroid Build Coastguard Worker       $ kill \`cat /tmp/.lwsts-lock\`
90*1c60b9acSAndroid Build Coastguard Worker```
91*1c60b9acSAndroid Build Coastguard WorkerIf it finds a stale lock (the pid mentioned in the file does not exist
92*1c60b9acSAndroid Build Coastguard Workerany more) it will delete the lock and create a new one during startup.
93*1c60b9acSAndroid Build Coastguard Worker
94*1c60b9acSAndroid Build Coastguard WorkerIf the lock is valid, the daemon will exit with a note on stderr that
95*1c60b9acSAndroid Build Coastguard Workerit was already running.
96*1c60b9acSAndroid Build Coastguard Worker
97*1c60b9acSAndroid Build Coastguard Worker@section clicert Testing Client Certs
98*1c60b9acSAndroid Build Coastguard Worker
99*1c60b9acSAndroid Build Coastguard WorkerHere is a very quick way to create a CA, and a client and server cert from it,
100*1c60b9acSAndroid Build Coastguard Workerfor testing.
101*1c60b9acSAndroid Build Coastguard Worker
102*1c60b9acSAndroid Build Coastguard Worker```
103*1c60b9acSAndroid Build Coastguard Worker$ cp -rp ./scripts/client-ca /tmp
104*1c60b9acSAndroid Build Coastguard Worker$ cd /tmp/client-ca
105*1c60b9acSAndroid Build Coastguard Worker$ ./create-ca.sh
106*1c60b9acSAndroid Build Coastguard Worker$ ./create-server-cert.sh server
107*1c60b9acSAndroid Build Coastguard Worker$ ./create-client-cert.sh client
108*1c60b9acSAndroid Build Coastguard Worker```
109*1c60b9acSAndroid Build Coastguard Worker
110*1c60b9acSAndroid Build Coastguard WorkerThe last step wants an export password, you will need this password again to
111*1c60b9acSAndroid Build Coastguard Workerimport the p12 format certificate into your browser.
112*1c60b9acSAndroid Build Coastguard Worker
113*1c60b9acSAndroid Build Coastguard WorkerThis will get you the following
114*1c60b9acSAndroid Build Coastguard Worker
115*1c60b9acSAndroid Build Coastguard Worker|name|function|
116*1c60b9acSAndroid Build Coastguard Worker|----|--------|
117*1c60b9acSAndroid Build Coastguard Worker|ca.pem|Your Certificate Authority cert|
118*1c60b9acSAndroid Build Coastguard Worker|ca.key|Private key for the CA cert|
119*1c60b9acSAndroid Build Coastguard Worker|client.pem|Client certificate, signed by your CA|
120*1c60b9acSAndroid Build Coastguard Worker|client.key|Client private key|
121*1c60b9acSAndroid Build Coastguard Worker|client.p12|combined client.pem + client.key in p12 format for browsers|
122*1c60b9acSAndroid Build Coastguard Worker|server.pem|Server cert, signed by your CA|
123*1c60b9acSAndroid Build Coastguard Worker|server.key|Server private key|
124*1c60b9acSAndroid Build Coastguard Worker
125*1c60b9acSAndroid Build Coastguard WorkerYou can confirm yourself the client and server certs are signed by the CA.
126*1c60b9acSAndroid Build Coastguard Worker
127*1c60b9acSAndroid Build Coastguard Worker```
128*1c60b9acSAndroid Build Coastguard Worker $ openssl verify -verbose -trusted ca.pem server.pem
129*1c60b9acSAndroid Build Coastguard Worker $ openssl verify -verbose -trusted ca.pem client.pem
130*1c60b9acSAndroid Build Coastguard Worker```
131*1c60b9acSAndroid Build Coastguard Worker
132*1c60b9acSAndroid Build Coastguard WorkerImport the client.p12 file into your browser.  In FFOX57 it's
133*1c60b9acSAndroid Build Coastguard Worker
134*1c60b9acSAndroid Build Coastguard Worker - preferences
135*1c60b9acSAndroid Build Coastguard Worker - Privacy & Security
136*1c60b9acSAndroid Build Coastguard Worker - Certificates | View Certificates
137*1c60b9acSAndroid Build Coastguard Worker - Certificate Manager | Your Certificates | Import...
138*1c60b9acSAndroid Build Coastguard Worker - Enter the password you gave when creating client1.p12
139*1c60b9acSAndroid Build Coastguard Worker - Click OK.
140*1c60b9acSAndroid Build Coastguard Worker
141*1c60b9acSAndroid Build Coastguard WorkerYou can then run the test server like this:
142*1c60b9acSAndroid Build Coastguard Worker
143*1c60b9acSAndroid Build Coastguard Worker```
144*1c60b9acSAndroid Build Coastguard Worker $ libwebsockets-test-server -s -A ca.pem -K server.key -C server.pem -v
145*1c60b9acSAndroid Build Coastguard Worker```
146*1c60b9acSAndroid Build Coastguard Worker
147*1c60b9acSAndroid Build Coastguard WorkerWhen you connect your browser to https://localhost:7681 after accepting the
148*1c60b9acSAndroid Build Coastguard Workerselfsigned server cert, your browser will pop up a prompt to send the server
149*1c60b9acSAndroid Build Coastguard Workeryour client cert (the -v switch enables this).  The server will only accept
150*1c60b9acSAndroid Build Coastguard Workera client cert that has been signed by ca.pem.
151*1c60b9acSAndroid Build Coastguard Worker
152*1c60b9acSAndroid Build Coastguard Worker@section sssl Using SSL on the server side
153*1c60b9acSAndroid Build Coastguard Worker
154*1c60b9acSAndroid Build Coastguard WorkerTo test it using SSL/WSS, just run the test server with
155*1c60b9acSAndroid Build Coastguard Worker```
156*1c60b9acSAndroid Build Coastguard Worker	$ libwebsockets-test-server --ssl
157*1c60b9acSAndroid Build Coastguard Worker```
158*1c60b9acSAndroid Build Coastguard Workerand use the URL
159*1c60b9acSAndroid Build Coastguard Worker```
160*1c60b9acSAndroid Build Coastguard Worker	https://127.0.0.1:7681
161*1c60b9acSAndroid Build Coastguard Worker```
162*1c60b9acSAndroid Build Coastguard WorkerThe connection will be entirely encrypted using some generated
163*1c60b9acSAndroid Build Coastguard Workercertificates that your browser will not accept, since they are
164*1c60b9acSAndroid Build Coastguard Workernot signed by any real Certificate Authority.  Just accept the
165*1c60b9acSAndroid Build Coastguard Workercertificates in the browser and the connection will proceed
166*1c60b9acSAndroid Build Coastguard Workerin first https and then websocket wss, acting exactly the
167*1c60b9acSAndroid Build Coastguard Workersame.
168*1c60b9acSAndroid Build Coastguard Worker
169*1c60b9acSAndroid Build Coastguard Worker[test-server.c](../test-apps/test-server.c) is all that is needed to use libwebsockets for
170*1c60b9acSAndroid Build Coastguard Workerserving both the script html over http and websockets.
171*1c60b9acSAndroid Build Coastguard Worker
172*1c60b9acSAndroid Build Coastguard Worker@section lwstsdynvhost Dynamic Vhosts
173*1c60b9acSAndroid Build Coastguard Worker
174*1c60b9acSAndroid Build Coastguard WorkerYou can send libwebsockets-test-server or libwebsockets-test-server-v2.0 a SIGUSR1
175*1c60b9acSAndroid Build Coastguard Workerto toggle the creation and destruction of an identical second vhost on port + 1.
176*1c60b9acSAndroid Build Coastguard Worker
177*1c60b9acSAndroid Build Coastguard WorkerThis is intended as a test and demonstration for how to bring up and remove
178*1c60b9acSAndroid Build Coastguard Workervhosts dynamically.
179*1c60b9acSAndroid Build Coastguard Worker
180*1c60b9acSAndroid Build Coastguard Worker@section unixskt Testing Unix Socket Server support
181*1c60b9acSAndroid Build Coastguard Worker
182*1c60b9acSAndroid Build Coastguard WorkerStart the test server with -U and the path to create the unix domain socket
183*1c60b9acSAndroid Build Coastguard Worker
184*1c60b9acSAndroid Build Coastguard Worker```
185*1c60b9acSAndroid Build Coastguard Worker $ libwebsockets-test-server -U /tmp/uds
186*1c60b9acSAndroid Build Coastguard Worker```
187*1c60b9acSAndroid Build Coastguard Worker
188*1c60b9acSAndroid Build Coastguard WorkerOn exit, lws will delete the socket inode.
189*1c60b9acSAndroid Build Coastguard Worker
190*1c60b9acSAndroid Build Coastguard WorkerTo test the client side, eg
191*1c60b9acSAndroid Build Coastguard Worker
192*1c60b9acSAndroid Build Coastguard Worker```
193*1c60b9acSAndroid Build Coastguard Worker $ nc -C -U /tmp/uds -i 30
194*1c60b9acSAndroid Build Coastguard Worker```
195*1c60b9acSAndroid Build Coastguard Worker
196*1c60b9acSAndroid Build Coastguard Workerand type
197*1c60b9acSAndroid Build Coastguard Worker
198*1c60b9acSAndroid Build Coastguard Worker`GET / HTTP/1.1`
199*1c60b9acSAndroid Build Coastguard Worker
200*1c60b9acSAndroid Build Coastguard Workerfollowed by two ENTER.  The contents of test.html should be returned.
201*1c60b9acSAndroid Build Coastguard Worker
202*1c60b9acSAndroid Build Coastguard Worker@section wscl Testing websocket client support
203*1c60b9acSAndroid Build Coastguard Worker
204*1c60b9acSAndroid Build Coastguard WorkerIf you run the test server as described above, you can also
205*1c60b9acSAndroid Build Coastguard Workerconnect to it using the test client as well as a browser.
206*1c60b9acSAndroid Build Coastguard Worker
207*1c60b9acSAndroid Build Coastguard Worker```
208*1c60b9acSAndroid Build Coastguard Worker	$ libwebsockets-test-client localhost
209*1c60b9acSAndroid Build Coastguard Worker```
210*1c60b9acSAndroid Build Coastguard Worker
211*1c60b9acSAndroid Build Coastguard Workerwill by default connect to the test server on localhost:7681
212*1c60b9acSAndroid Build Coastguard Workerand print the dumb increment number from the server at the
213*1c60b9acSAndroid Build Coastguard Workersame time as drawing random circles in the mirror protocol;
214*1c60b9acSAndroid Build Coastguard Workerif you connect to the test server using a browser at the
215*1c60b9acSAndroid Build Coastguard Workersame time you will be able to see the circles being drawn.
216*1c60b9acSAndroid Build Coastguard Worker
217*1c60b9acSAndroid Build Coastguard WorkerThe test client supports SSL too, use
218*1c60b9acSAndroid Build Coastguard Worker
219*1c60b9acSAndroid Build Coastguard Worker```
220*1c60b9acSAndroid Build Coastguard Worker	$ libwebsockets-test-client localhost --ssl -s
221*1c60b9acSAndroid Build Coastguard Worker```
222*1c60b9acSAndroid Build Coastguard Worker
223*1c60b9acSAndroid Build Coastguard Workerthe -s tells it to accept the default self-signed cert from the server,
224*1c60b9acSAndroid Build Coastguard Workerotherwise it will strictly fail the connection if there is no CA cert to
225*1c60b9acSAndroid Build Coastguard Workervalidate the server's certificate.
226*1c60b9acSAndroid Build Coastguard Worker
227*1c60b9acSAndroid Build Coastguard Worker
228*1c60b9acSAndroid Build Coastguard Worker@section choosingts Choosing between test server variations
229*1c60b9acSAndroid Build Coastguard Worker
230*1c60b9acSAndroid Build Coastguard WorkerIf you will be doing standalone serving with lws, ideally you should avoid
231*1c60b9acSAndroid Build Coastguard Workermaking your own server at all, and use lwsws with your own protocol plugins.
232*1c60b9acSAndroid Build Coastguard Worker
233*1c60b9acSAndroid Build Coastguard WorkerThe second best option is follow test-server-v2.0.c, which uses a mount to
234*1c60b9acSAndroid Build Coastguard Workerautoserve a directory, and lws protocol plugins for ws, without needing any
235*1c60b9acSAndroid Build Coastguard Workeruser callback code (other than what's needed in the protocol plugin).
236*1c60b9acSAndroid Build Coastguard Worker
237*1c60b9acSAndroid Build Coastguard WorkerFor those two options libuv is needed to support the protocol plugins, if
238*1c60b9acSAndroid Build Coastguard Workerthat's not possible then the other variations with their own protocol code
239*1c60b9acSAndroid Build Coastguard Workershould be considered.
240*1c60b9acSAndroid Build Coastguard Worker
241*1c60b9acSAndroid Build Coastguard Worker@section tassl Testing SSL on the client side
242*1c60b9acSAndroid Build Coastguard Worker
243*1c60b9acSAndroid Build Coastguard WorkerTo test SSL/WSS client action, just run the client test with
244*1c60b9acSAndroid Build Coastguard Worker```
245*1c60b9acSAndroid Build Coastguard Worker	$ libwebsockets-test-client localhost --ssl
246*1c60b9acSAndroid Build Coastguard Worker```
247*1c60b9acSAndroid Build Coastguard WorkerBy default the client test applet is set to accept self-signed
248*1c60b9acSAndroid Build Coastguard Workercertificates used by the test server, this is indicated by the
249*1c60b9acSAndroid Build Coastguard Worker`use_ssl` var being set to `2`.  Set it to `1` to reject any server
250*1c60b9acSAndroid Build Coastguard Workercertificate that it doesn't have a trusted CA cert for.
251*1c60b9acSAndroid Build Coastguard Worker
252*1c60b9acSAndroid Build Coastguard Worker
253*1c60b9acSAndroid Build Coastguard Worker@section taping Using the websocket ping utility
254*1c60b9acSAndroid Build Coastguard Worker
255*1c60b9acSAndroid Build Coastguard Workerlibwebsockets-test-ping connects as a client to a remote
256*1c60b9acSAndroid Build Coastguard Workerwebsocket server and pings it like the
257*1c60b9acSAndroid Build Coastguard Workernormal unix ping utility.
258*1c60b9acSAndroid Build Coastguard Worker```
259*1c60b9acSAndroid Build Coastguard Worker	$ libwebsockets-test-ping localhost
260*1c60b9acSAndroid Build Coastguard Worker	handshake OK for protocol lws-mirror-protocol
261*1c60b9acSAndroid Build Coastguard Worker	Websocket PING localhost.localdomain (127.0.0.1) 64 bytes of data.
262*1c60b9acSAndroid Build Coastguard Worker	64 bytes from localhost: req=1 time=0.1ms
263*1c60b9acSAndroid Build Coastguard Worker	64 bytes from localhost: req=2 time=0.1ms
264*1c60b9acSAndroid Build Coastguard Worker	64 bytes from localhost: req=3 time=0.1ms
265*1c60b9acSAndroid Build Coastguard Worker	64 bytes from localhost: req=4 time=0.2ms
266*1c60b9acSAndroid Build Coastguard Worker	64 bytes from localhost: req=5 time=0.1ms
267*1c60b9acSAndroid Build Coastguard Worker	64 bytes from localhost: req=6 time=0.2ms
268*1c60b9acSAndroid Build Coastguard Worker	64 bytes from localhost: req=7 time=0.2ms
269*1c60b9acSAndroid Build Coastguard Worker	64 bytes from localhost: req=8 time=0.1ms
270*1c60b9acSAndroid Build Coastguard Worker	^C
271*1c60b9acSAndroid Build Coastguard Worker	--- localhost.localdomain websocket ping statistics ---
272*1c60b9acSAndroid Build Coastguard Worker	8 packets transmitted, 8 received, 0% packet loss, time 7458ms
273*1c60b9acSAndroid Build Coastguard Worker	rtt min/avg/max = 0.110/0.185/0.218 ms
274*1c60b9acSAndroid Build Coastguard Worker	$
275*1c60b9acSAndroid Build Coastguard Worker```
276*1c60b9acSAndroid Build Coastguard WorkerBy default it sends 64 byte payload packets using the 04
277*1c60b9acSAndroid Build Coastguard WorkerPING packet opcode type.  You can change the payload size
278*1c60b9acSAndroid Build Coastguard Workerusing the `-s=` flag, up to a maximum of 125 mandated by the
279*1c60b9acSAndroid Build Coastguard Worker04 standard.
280*1c60b9acSAndroid Build Coastguard Worker
281*1c60b9acSAndroid Build Coastguard WorkerUsing the lws-mirror protocol that is provided by the test
282*1c60b9acSAndroid Build Coastguard Workerserver, libwebsockets-test-ping can also use larger payload
283*1c60b9acSAndroid Build Coastguard Workersizes up to 4096 is BINARY packets; lws-mirror will copy
284*1c60b9acSAndroid Build Coastguard Workerthem back to the client and they appear as a PONG.  Use the
285*1c60b9acSAndroid Build Coastguard Worker`-m` flag to select this operation.
286*1c60b9acSAndroid Build Coastguard Worker
287*1c60b9acSAndroid Build Coastguard WorkerThe default interval between pings is 1s, you can use the -i=
288*1c60b9acSAndroid Build Coastguard Workerflag to set this, including fractions like `-i=0.01` for 10ms
289*1c60b9acSAndroid Build Coastguard Workerinterval.
290*1c60b9acSAndroid Build Coastguard Worker
291*1c60b9acSAndroid Build Coastguard WorkerBefore you can even use the PING opcode that is part of the
292*1c60b9acSAndroid Build Coastguard Workerstandard, you must complete a handshake with a specified
293*1c60b9acSAndroid Build Coastguard Workerprotocol.  By default lws-mirror-protocol is used which is
294*1c60b9acSAndroid Build Coastguard Workersupported by the test server.  But if you are using it on
295*1c60b9acSAndroid Build Coastguard Workeranother server, you can specify the protocol to handshake with
296*1c60b9acSAndroid Build Coastguard Workerby `--protocol=protocolname`
297*1c60b9acSAndroid Build Coastguard Worker
298*1c60b9acSAndroid Build Coastguard Worker
299*1c60b9acSAndroid Build Coastguard Worker@section ta fraggle Fraggle test app
300*1c60b9acSAndroid Build Coastguard Worker
301*1c60b9acSAndroid Build Coastguard WorkerBy default it runs in server mode
302*1c60b9acSAndroid Build Coastguard Worker```
303*1c60b9acSAndroid Build Coastguard Worker	$ libwebsockets-test-fraggle
304*1c60b9acSAndroid Build Coastguard Worker	libwebsockets test fraggle
305*1c60b9acSAndroid Build Coastguard Worker	(C) Copyright 2010-2011 Andy Green <[email protected]> licensed under MIT
306*1c60b9acSAndroid Build Coastguard Worker	 Compiled with SSL support, not using it
307*1c60b9acSAndroid Build Coastguard Worker	 Listening on port 7681
308*1c60b9acSAndroid Build Coastguard Worker	server sees client connect
309*1c60b9acSAndroid Build Coastguard Worker	accepted v06 connection
310*1c60b9acSAndroid Build Coastguard Worker	Spamming 360 random fragments
311*1c60b9acSAndroid Build Coastguard Worker	Spamming session over, len = 371913. sum = 0x2D3C0AE
312*1c60b9acSAndroid Build Coastguard Worker	Spamming 895 random fragments
313*1c60b9acSAndroid Build Coastguard Worker	Spamming session over, len = 875970. sum = 0x6A74DA1
314*1c60b9acSAndroid Build Coastguard Worker	...
315*1c60b9acSAndroid Build Coastguard Worker```
316*1c60b9acSAndroid Build Coastguard WorkerYou need to run a second session in client mode, you have to
317*1c60b9acSAndroid Build Coastguard Workergive the `-c` switch and the server address at least:
318*1c60b9acSAndroid Build Coastguard Worker```
319*1c60b9acSAndroid Build Coastguard Worker	$ libwebsockets-test-fraggle -c localhost
320*1c60b9acSAndroid Build Coastguard Worker	libwebsockets test fraggle
321*1c60b9acSAndroid Build Coastguard Worker	(C) Copyright 2010-2011 Andy Green <[email protected]> licensed under MIT
322*1c60b9acSAndroid Build Coastguard Worker	 Client mode
323*1c60b9acSAndroid Build Coastguard Worker	Connecting to localhost:7681
324*1c60b9acSAndroid Build Coastguard Worker	denied deflate-stream extension
325*1c60b9acSAndroid Build Coastguard Worker	handshake OK for protocol fraggle-protocol
326*1c60b9acSAndroid Build Coastguard Worker	client connects to server
327*1c60b9acSAndroid Build Coastguard Worker	EOM received 371913 correctly from 360 fragments
328*1c60b9acSAndroid Build Coastguard Worker	EOM received 875970 correctly from 895 fragments
329*1c60b9acSAndroid Build Coastguard Worker	EOM received 247140 correctly from 258 fragments
330*1c60b9acSAndroid Build Coastguard Worker	EOM received 695451 correctly from 692 fragments
331*1c60b9acSAndroid Build Coastguard Worker	...
332*1c60b9acSAndroid Build Coastguard Worker```
333*1c60b9acSAndroid Build Coastguard WorkerThe fraggle test sends a random number up to 1024 fragmented websocket frames
334*1c60b9acSAndroid Build Coastguard Workereach of a random size between 1 and 2001 bytes in a single message, then sends
335*1c60b9acSAndroid Build Coastguard Workera checksum and starts sending a new randomly sized and fragmented message.
336*1c60b9acSAndroid Build Coastguard Worker
337*1c60b9acSAndroid Build Coastguard WorkerThe fraggle test client receives the same message fragments and computes the
338*1c60b9acSAndroid Build Coastguard Workersame checksum using websocket framing to see when the message has ended.  It
339*1c60b9acSAndroid Build Coastguard Workerthen accepts the server checksum message and compares that to its checksum.
340*1c60b9acSAndroid Build Coastguard Worker
341*1c60b9acSAndroid Build Coastguard Worker
342*1c60b9acSAndroid Build Coastguard Worker@section taproxy proxy support
343*1c60b9acSAndroid Build Coastguard Worker
344*1c60b9acSAndroid Build Coastguard WorkerThe http_proxy environment variable is respected by the client
345*1c60b9acSAndroid Build Coastguard Workerconnection code for both `ws://` and `wss://`.  It doesn't support
346*1c60b9acSAndroid Build Coastguard Workerauthentication.
347*1c60b9acSAndroid Build Coastguard Worker
348*1c60b9acSAndroid Build Coastguard WorkerYou use it like this
349*1c60b9acSAndroid Build Coastguard Worker```
350*1c60b9acSAndroid Build Coastguard Worker	$ export http_proxy=myproxy.com:3128
351*1c60b9acSAndroid Build Coastguard Worker	$ libwebsockets-test-client someserver.com
352*1c60b9acSAndroid Build Coastguard Worker```
353*1c60b9acSAndroid Build Coastguard Worker
354*1c60b9acSAndroid Build Coastguard Worker@section talog debug logging
355*1c60b9acSAndroid Build Coastguard Worker
356*1c60b9acSAndroid Build Coastguard WorkerBy default logging of severity "notice", "warn" or "err" is enabled to stderr.
357*1c60b9acSAndroid Build Coastguard Worker
358*1c60b9acSAndroid Build Coastguard WorkerAgain by default other logging is compiled in but disabled from printing.
359*1c60b9acSAndroid Build Coastguard Worker
360*1c60b9acSAndroid Build Coastguard WorkerBy default debug logs below "notice" in severity are not compiled in.  To get
361*1c60b9acSAndroid Build Coastguard Workerthem included, add this option in CMAKE
362*1c60b9acSAndroid Build Coastguard Worker
363*1c60b9acSAndroid Build Coastguard Worker```
364*1c60b9acSAndroid Build Coastguard Worker	$ cmake .. -DCMAKE_BUILD_TYPE=DEBUG
365*1c60b9acSAndroid Build Coastguard Worker```
366*1c60b9acSAndroid Build Coastguard Worker
367*1c60b9acSAndroid Build Coastguard WorkerIf you want to see more detailed debug logs, you can control a bitfield to
368*1c60b9acSAndroid Build Coastguard Workerselect which logs types may print using the `lws_set_log_level()` api, in the
369*1c60b9acSAndroid Build Coastguard Workertest apps you can use `-d <number>` to control this.  The types of logging
370*1c60b9acSAndroid Build Coastguard Workeravailable are (OR together the numbers to select multiple)
371*1c60b9acSAndroid Build Coastguard Worker
372*1c60b9acSAndroid Build Coastguard Worker - 1   ERR
373*1c60b9acSAndroid Build Coastguard Worker - 2   WARN
374*1c60b9acSAndroid Build Coastguard Worker - 4   NOTICE
375*1c60b9acSAndroid Build Coastguard Worker - 8   INFO
376*1c60b9acSAndroid Build Coastguard Worker - 16  DEBUG
377*1c60b9acSAndroid Build Coastguard Worker - 32  PARSER
378*1c60b9acSAndroid Build Coastguard Worker - 64  HEADER
379*1c60b9acSAndroid Build Coastguard Worker - 128 EXTENSION
380*1c60b9acSAndroid Build Coastguard Worker - 256 CLIENT
381*1c60b9acSAndroid Build Coastguard Worker - 512 LATENCY
382*1c60b9acSAndroid Build Coastguard Worker
383*1c60b9acSAndroid Build Coastguard Worker
384*1c60b9acSAndroid Build Coastguard Worker@section ws13 Websocket version supported
385*1c60b9acSAndroid Build Coastguard Worker
386*1c60b9acSAndroid Build Coastguard WorkerThe final IETF standard is supported for both client and server, protocol
387*1c60b9acSAndroid Build Coastguard Workerversion 13.
388*1c60b9acSAndroid Build Coastguard Worker
389*1c60b9acSAndroid Build Coastguard Worker
390*1c60b9acSAndroid Build Coastguard Worker@section latency Latency Tracking
391*1c60b9acSAndroid Build Coastguard Worker
392*1c60b9acSAndroid Build Coastguard WorkerSince libwebsockets runs using `poll()` and a single threaded approach, any
393*1c60b9acSAndroid Build Coastguard Workerunexpected latency coming from system calls would be bad news.  There's now
394*1c60b9acSAndroid Build Coastguard Workera latency tracking scheme that can be built in with `-DLWS_WITH_LATENCY=1` at
395*1c60b9acSAndroid Build Coastguard Workercmake, logging the time taken for system calls to complete and if
396*1c60b9acSAndroid Build Coastguard Workerthe whole action did complete that time or was deferred.
397*1c60b9acSAndroid Build Coastguard Worker
398*1c60b9acSAndroid Build Coastguard WorkerYou can see the detailed data by enabling logging level 512 (eg, `-d 519` on
399*1c60b9acSAndroid Build Coastguard Workerthe test server to see that and the usual logs), however even without that
400*1c60b9acSAndroid Build Coastguard Workerthe "worst" latency is kept and reported to the logs with NOTICE severity
401*1c60b9acSAndroid Build Coastguard Workerwhen the context is destroyed.
402*1c60b9acSAndroid Build Coastguard Worker
403*1c60b9acSAndroid Build Coastguard WorkerSome care is needed interpreting them, if the action completed the first figure
404*1c60b9acSAndroid Build Coastguard Worker(in us) is the time taken for the whole action, which may have retried through
405*1c60b9acSAndroid Build Coastguard Workerthe poll loop many times and will depend on network roundtrip times.  High
406*1c60b9acSAndroid Build Coastguard Workerfigures here don't indicate a problem.  The figure in us reported after "lat"
407*1c60b9acSAndroid Build Coastguard Workerin the logging is the time taken by this particular attempt.  High figures
408*1c60b9acSAndroid Build Coastguard Workerhere may indicate a problem, or if you system is loaded with another app at
409*1c60b9acSAndroid Build Coastguard Workerthat time, such as the browser, it may simply indicate the OS gave preferential
410*1c60b9acSAndroid Build Coastguard Workertreatment to the other app during that call.
411*1c60b9acSAndroid Build Coastguard Worker
412*1c60b9acSAndroid Build Coastguard Worker
413*1c60b9acSAndroid Build Coastguard Worker@section autobahn Autobahn Test Suite
414*1c60b9acSAndroid Build Coastguard Worker
415*1c60b9acSAndroid Build Coastguard WorkerLws can be tested against the autobahn websocket fuzzer in both client and
416*1c60b9acSAndroid Build Coastguard Workerserver modes
417*1c60b9acSAndroid Build Coastguard Worker
418*1c60b9acSAndroid Build Coastguard Worker1) pip install autobahntestsuite
419*1c60b9acSAndroid Build Coastguard Worker
420*1c60b9acSAndroid Build Coastguard Worker2) From your build dir:
421*1c60b9acSAndroid Build Coastguard Worker
422*1c60b9acSAndroid Build Coastguard Worker```
423*1c60b9acSAndroid Build Coastguard Worker $ cmake .. -DLWS_WITHOUT_EXTENSIONS=0 -DLWS_WITH_MINIMAL_EXAMPLES=1 && make
424*1c60b9acSAndroid Build Coastguard Worker```
425*1c60b9acSAndroid Build Coastguard Worker
426*1c60b9acSAndroid Build Coastguard Worker3) ../scripts/autobahn-test.sh
427*1c60b9acSAndroid Build Coastguard Worker
428*1c60b9acSAndroid Build Coastguard Worker4) In a browser go to the directory you ran wstest in (eg, /projects/libwebsockets)
429*1c60b9acSAndroid Build Coastguard Worker
430*1c60b9acSAndroid Build Coastguard Workerfile:///projects/libwebsockets/build/reports/clients/index.html
431*1c60b9acSAndroid Build Coastguard Worker
432*1c60b9acSAndroid Build Coastguard Workerto see the results
433*1c60b9acSAndroid Build Coastguard Worker
434*1c60b9acSAndroid Build Coastguard Worker
435*1c60b9acSAndroid Build Coastguard Worker@section autobahnnotes Autobahn Test Notes
436*1c60b9acSAndroid Build Coastguard Worker
437*1c60b9acSAndroid Build Coastguard Worker1) Two of the tests make no sense for Libwebsockets to support and we fail them.
438*1c60b9acSAndroid Build Coastguard Worker
439*1c60b9acSAndroid Build Coastguard Worker - Tests 2.10 + 2.11: sends multiple pings on one connection.  Lws policy is to
440*1c60b9acSAndroid Build Coastguard Workeronly allow one active ping in flight on each connection, the rest are dropped.
441*1c60b9acSAndroid Build Coastguard WorkerThe autobahn test itself admits this is not part of the standard, just someone's
442*1c60b9acSAndroid Build Coastguard Workerrandom opinion about how they think a ws server should act.  So we will fail
443*1c60b9acSAndroid Build Coastguard Workerthis by design and it is no problem about RFC6455 compliance.
444*1c60b9acSAndroid Build Coastguard Worker
445*1c60b9acSAndroid Build Coastguard Worker2) Currently two parts of autobahn are broken and we skip them
446*1c60b9acSAndroid Build Coastguard Worker
447*1c60b9acSAndroid Build Coastguard Workerhttps://github.com/crossbario/autobahn-testsuite/issues/71
448*1c60b9acSAndroid Build Coastguard Worker
449