xref: /aosp_15_r20/external/libwebsockets/READMEs/README.ctest.md (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker## Using CTest with lws
2*1c60b9acSAndroid Build Coastguard Worker
3*1c60b9acSAndroid Build Coastguard Worker### Updating ancient cmake
4*1c60b9acSAndroid Build Coastguard Worker
5*1c60b9acSAndroid Build Coastguard WorkerYou need a recent cmake to have the CTest tests work properly, if you're on an
6*1c60b9acSAndroid Build Coastguard Workerolder distro you need to update your cmake.  Luckily Kitware provide a repo for
7*1c60b9acSAndroid Build Coastguard Workercommon distros.  These instructions work for bionic and xenial.
8*1c60b9acSAndroid Build Coastguard Worker
9*1c60b9acSAndroid Build Coastguard WorkerFirst remove the old distro cmake and install the pieces needed to get the new repo keys
10*1c60b9acSAndroid Build Coastguard Worker
11*1c60b9acSAndroid Build Coastguard Worker```
12*1c60b9acSAndroid Build Coastguard Worker# apt purge --auto-remove cmake
13*1c60b9acSAndroid Build Coastguard Worker# apt install gnupg wget apt-transport-https ca-certificates
14*1c60b9acSAndroid Build Coastguard Worker# wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add -
15*1c60b9acSAndroid Build Coastguard Worker# apt edit-sources
16*1c60b9acSAndroid Build Coastguard Worker```
17*1c60b9acSAndroid Build Coastguard Worker
18*1c60b9acSAndroid Build Coastguard WorkerAdd the line `deb https://apt.kitware.com/ubuntu/ bionic main` at the end
19*1c60b9acSAndroid Build Coastguard Workerreplacing `bionic` with `xenial` as needed, and save (:wq).  Then
20*1c60b9acSAndroid Build Coastguard Worker
21*1c60b9acSAndroid Build Coastguard Worker```
22*1c60b9acSAndroid Build Coastguard Worker# apt update
23*1c60b9acSAndroid Build Coastguard Worker# apt install cmake
24*1c60b9acSAndroid Build Coastguard Worker```
25*1c60b9acSAndroid Build Coastguard Worker
26*1c60b9acSAndroid Build Coastguard Worker## Tests live in CMakeLists.txt
27*1c60b9acSAndroid Build Coastguard Worker
28*1c60b9acSAndroid Build Coastguard WorkerThe rules for tests are described in ctest / cmake language inside the minimal
29*1c60b9acSAndroid Build Coastguard Workerexamples and api tests that are enabled by current build options, so you need
30*1c60b9acSAndroid Build Coastguard Workerto build with `-DLWS_WITH_MINIMAL_EXAMPLES=1` to build the examples along with
31*1c60b9acSAndroid Build Coastguard Workerthe library.
32*1c60b9acSAndroid Build Coastguard Worker
33*1c60b9acSAndroid Build Coastguard WorkerThe tests are typically running the examples or api tests and regarding the
34*1c60b9acSAndroid Build Coastguard Workerprocess exiting with exit code 0 as success, anything else as failure.
35*1c60b9acSAndroid Build Coastguard Worker
36*1c60b9acSAndroid Build Coastguard Worker## Generating the tests
37*1c60b9acSAndroid Build Coastguard Worker
38*1c60b9acSAndroid Build Coastguard WorkerThe main tests just need `-DLWS_WITH_MINIMAL_EXAMPLES=1`.  You can optionally set
39*1c60b9acSAndroid Build Coastguard Worker`-DLWS_CTEST_INTERNET_AVAILABLE=0` to indicate you can't run the tests that need
40*1c60b9acSAndroid Build Coastguard Workerinternet connectivity.
41*1c60b9acSAndroid Build Coastguard Worker
42*1c60b9acSAndroid Build Coastguard Worker## Preparing to run the tests
43*1c60b9acSAndroid Build Coastguard Worker
44*1c60b9acSAndroid Build Coastguard WorkerThe tests have to be able to run without root and without disturbing any other
45*1c60b9acSAndroid Build Coastguard Workerinstall of lws in the build machine.
46*1c60b9acSAndroid Build Coastguard Worker
47*1c60b9acSAndroid Build Coastguard WorkerFor that reason you have to do an unprivileged side-install into `../destdir`,
48*1c60b9acSAndroid Build Coastguard Workerusing `make install DESTDIR=../destdir` from the build directory and perform the
49*1c60b9acSAndroid Build Coastguard Workertests on the pieces in there.
50*1c60b9acSAndroid Build Coastguard Worker
51*1c60b9acSAndroid Build Coastguard Worker## Running the tests
52*1c60b9acSAndroid Build Coastguard Worker
53*1c60b9acSAndroid Build Coastguard WorkerWe must take care to run the pieces (.so etc) we just built, without having
54*1c60b9acSAndroid Build Coastguard Workerroot access, and not any of the same pieces from some other lws version that may
55*1c60b9acSAndroid Build Coastguard Workerhave been installed on the build machine.  That includes, eg, plugins that
56*1c60b9acSAndroid Build Coastguard Workerwe just built, to ensure precedence of those in the search path we can set our
57*1c60b9acSAndroid Build Coastguard WorkerDESTDIR unprivileged install path in `LD_LIBRARY_PATH`.
58*1c60b9acSAndroid Build Coastguard Worker
59*1c60b9acSAndroid Build Coastguard WorkerThen we can run ctest on the unprivileged install.  The whole step looks
60*1c60b9acSAndroid Build Coastguard Workersomething like this:
61*1c60b9acSAndroid Build Coastguard Worker
62*1c60b9acSAndroid Build Coastguard Worker```
63*1c60b9acSAndroid Build Coastguard Workerbuild $ make -j12 && \
64*1c60b9acSAndroid Build Coastguard Worker  rm -rf ../destdir && \
65*1c60b9acSAndroid Build Coastguard Worker  make -j12 DESTDIR=../destdir install && \\
66*1c60b9acSAndroid Build Coastguard Worker  LD_LIBRARY_PATH=../destdir/usr/local/share/libwebsockets-test-server/plugins ctest -j2 --output-on-failure
67*1c60b9acSAndroid Build Coastguard Worker```
68*1c60b9acSAndroid Build Coastguard Worker
69*1c60b9acSAndroid Build Coastguard WorkerOn windows, it looks like `ctest . -C DEBUG` or RELEASE if that was the build
70*1c60b9acSAndroid Build Coastguard Workertype.
71*1c60b9acSAndroid Build Coastguard Worker
72*1c60b9acSAndroid Build Coastguard WorkerGood results look something like this (which tests can run depend on your
73*1c60b9acSAndroid Build Coastguard Workerbuild options)
74*1c60b9acSAndroid Build Coastguard Worker
75*1c60b9acSAndroid Build Coastguard Worker```
76*1c60b9acSAndroid Build Coastguard WorkerTest project /projects/libwebsockets/build
77*1c60b9acSAndroid Build Coastguard Worker      Start 71: st_wcs_srv
78*1c60b9acSAndroid Build Coastguard Worker      Start 43: st_hcp_srv
79*1c60b9acSAndroid Build Coastguard Worker 1/73 Test #71: st_wcs_srv ..................................   Passed    5.01 sec
80*1c60b9acSAndroid Build Coastguard Worker      Start 19: st_hcmp_srv
81*1c60b9acSAndroid Build Coastguard Worker 2/73 Test #43: st_hcp_srv ..................................   Passed    5.01 sec
82*1c60b9acSAndroid Build Coastguard Worker      Start 17: st_hcm_srv
83*1c60b9acSAndroid Build Coastguard Worker 3/73 Test #19: st_hcmp_srv .................................   Passed    5.01 sec
84*1c60b9acSAndroid Build Coastguard Worker      Start 55: st_ssproxyctx
85*1c60b9acSAndroid Build Coastguard Worker 4/73 Test #17: st_hcm_srv ..................................   Passed    5.01 sec
86*1c60b9acSAndroid Build Coastguard Worker      Start 52: st_ssproxy
87*1c60b9acSAndroid Build Coastguard Worker 5/73 Test #55: st_ssproxyctx ...............................   Passed    1.02 sec
88*1c60b9acSAndroid Build Coastguard Worker      Start 67: st_sstfproxy
89*1c60b9acSAndroid Build Coastguard Worker 6/73 Test #52: st_ssproxy ..................................   Passed    1.02 sec
90*1c60b9acSAndroid Build Coastguard Worker      Start 60: st_ssprxsmd_sspc
91*1c60b9acSAndroid Build Coastguard Worker 7/73 Test #67: st_sstfproxy ................................   Passed    1.01 sec
92*1c60b9acSAndroid Build Coastguard Worker      Start 63: st_mulssprxsmd_sspc
93*1c60b9acSAndroid Build Coastguard Worker 8/73 Test #60: st_ssprxsmd_sspc ............................   Passed    1.01 sec
94*1c60b9acSAndroid Build Coastguard Worker      Start 69: sspc-minimaltf
95*1c60b9acSAndroid Build Coastguard Worker 9/73 Test #63: st_mulssprxsmd_sspc .........................   Passed    1.02 sec
96*1c60b9acSAndroid Build Coastguard Worker      Start 73: ws-client-spam
97*1c60b9acSAndroid Build Coastguard Worker10/73 Test #73: ws-client-spam ..............................   Passed   12.21 sec
98*1c60b9acSAndroid Build Coastguard Worker      Start 57: sspc-minimaltx
99*1c60b9acSAndroid Build Coastguard Worker11/73 Test #57: sspc-minimaltx ..............................   Passed    5.90 sec
100*1c60b9acSAndroid Build Coastguard Worker      Start 65: mulsspcsmd_sspc
101*1c60b9acSAndroid Build Coastguard Worker12/73 Test #65: mulsspcsmd_sspc .............................   Passed    3.58 sec
102*1c60b9acSAndroid Build Coastguard Worker      Start 62: sspcsmd_sspc
103*1c60b9acSAndroid Build Coastguard Worker13/73 Test #62: sspcsmd_sspc ................................   Passed    1.73 sec
104*1c60b9acSAndroid Build Coastguard Worker      Start 22: http-client-multi-h1
105*1c60b9acSAndroid Build Coastguard Worker14/73 Test #22: http-client-multi-h1 ........................   Passed    5.04 sec
106*1c60b9acSAndroid Build Coastguard Worker      Start 25: http-client-multi-stag
107*1c60b9acSAndroid Build Coastguard Worker15/73 Test #25: http-client-multi-stag ......................   Passed    4.53 sec
108*1c60b9acSAndroid Build Coastguard Worker      Start 26: http-client-multi-stag-h1
109*1c60b9acSAndroid Build Coastguard Worker16/73 Test #26: http-client-multi-stag-h1 ...................   Passed    4.40 sec
110*1c60b9acSAndroid Build Coastguard Worker      Start 21: http-client-multi
111*1c60b9acSAndroid Build Coastguard Worker17/73 Test #21: http-client-multi ...........................   Passed    4.37 sec
112*1c60b9acSAndroid Build Coastguard Worker      Start 36: http-client-multi-post-h1
113*1c60b9acSAndroid Build Coastguard Worker18/73 Test #36: http-client-multi-post-h1 ...................   Passed    2.73 sec
114*1c60b9acSAndroid Build Coastguard Worker      Start 54: sspc-minimal
115*1c60b9acSAndroid Build Coastguard Worker19/73 Test #54: sspc-minimal ................................   Passed    0.93 sec
116*1c60b9acSAndroid Build Coastguard Worker      Start 39: http-client-multi-post-stag
117*1c60b9acSAndroid Build Coastguard Worker20/73 Test #39: http-client-multi-post-stag .................   Passed    2.29 sec
118*1c60b9acSAndroid Build Coastguard Worker      Start 40: http-client-multi-post-stag-h1
119*1c60b9acSAndroid Build Coastguard Worker21/73 Test #69: sspc-minimaltf ..............................   Passed   49.83 sec
120*1c60b9acSAndroid Build Coastguard Worker      Start 35: http-client-multi-post
121*1c60b9acSAndroid Build Coastguard Worker22/73 Test #40: http-client-multi-post-stag-h1 ..............   Passed    4.30 sec
122*1c60b9acSAndroid Build Coastguard Worker      Start 33: http-client-multi-restrict-nopipe-fail
123*1c60b9acSAndroid Build Coastguard Worker23/73 Test #35: http-client-multi-post ......................   Passed    3.23 sec
124*1c60b9acSAndroid Build Coastguard Worker      Start 28: http-client-multi-stag-h1-pipe
125*1c60b9acSAndroid Build Coastguard Worker24/73 Test #33: http-client-multi-restrict-nopipe-fail ......   Passed    2.86 sec
126*1c60b9acSAndroid Build Coastguard Worker      Start 32: http-client-multi-restrict-stag-h1-pipe
127*1c60b9acSAndroid Build Coastguard Worker25/73 Test #28: http-client-multi-stag-h1-pipe ..............   Passed    2.86 sec
128*1c60b9acSAndroid Build Coastguard Worker      Start 27: http-client-multi-stag-pipe
129*1c60b9acSAndroid Build Coastguard Worker26/73 Test #32: http-client-multi-restrict-stag-h1-pipe .....   Passed    1.51 sec
130*1c60b9acSAndroid Build Coastguard Worker      Start 31: http-client-multi-restrict-stag-pipe
131*1c60b9acSAndroid Build Coastguard Worker27/73 Test #27: http-client-multi-stag-pipe .................   Passed    1.52 sec
132*1c60b9acSAndroid Build Coastguard Worker      Start 34: http-client-multi-restrict-h1-nopipe-fail
133*1c60b9acSAndroid Build Coastguard Worker28/73 Test #34: http-client-multi-restrict-h1-nopipe-fail ...   Passed    2.78 sec
134*1c60b9acSAndroid Build Coastguard Worker      Start 46: http-client-post-m
135*1c60b9acSAndroid Build Coastguard Worker29/73 Test #31: http-client-multi-restrict-stag-pipe ........   Passed    2.80 sec
136*1c60b9acSAndroid Build Coastguard Worker      Start 42: http-client-multi-post-stag-h1-pipe
137*1c60b9acSAndroid Build Coastguard Worker30/73 Test #42: http-client-multi-post-stag-h1-pipe .........   Passed    1.51 sec
138*1c60b9acSAndroid Build Coastguard Worker      Start 41: http-client-multi-post-stag-pipe
139*1c60b9acSAndroid Build Coastguard Worker31/73 Test #46: http-client-post-m ..........................   Passed    1.59 sec
140*1c60b9acSAndroid Build Coastguard Worker      Start 48: http-client-post-m-h1
141*1c60b9acSAndroid Build Coastguard Worker32/73 Test #48: http-client-post-m-h1 .......................   Passed    1.10 sec
142*1c60b9acSAndroid Build Coastguard Worker      Start 23: http-client-multi-pipe
143*1c60b9acSAndroid Build Coastguard Worker33/73 Test #41: http-client-multi-post-stag-pipe ............   Passed    1.51 sec
144*1c60b9acSAndroid Build Coastguard Worker      Start 29: http-client-multi-restrict-pipe
145*1c60b9acSAndroid Build Coastguard Worker34/73 Test #23: http-client-multi-pipe ......................   Passed    1.09 sec
146*1c60b9acSAndroid Build Coastguard Worker      Start 24: http-client-multi-h1-pipe
147*1c60b9acSAndroid Build Coastguard Worker35/73 Test #29: http-client-multi-restrict-pipe .............   Passed    0.74 sec
148*1c60b9acSAndroid Build Coastguard Worker      Start 30: http-client-multi-restrict-h1-pipe
149*1c60b9acSAndroid Build Coastguard Worker36/73 Test #24: http-client-multi-h1-pipe ...................   Passed    1.14 sec
150*1c60b9acSAndroid Build Coastguard Worker      Start 45: http-client-post
151*1c60b9acSAndroid Build Coastguard Worker37/73 Test #30: http-client-multi-restrict-h1-pipe ..........   Passed    1.14 sec
152*1c60b9acSAndroid Build Coastguard Worker      Start 38: http-client-multi-post-h1-pipe
153*1c60b9acSAndroid Build Coastguard Worker38/73 Test #45: http-client-post ............................   Passed    0.30 sec
154*1c60b9acSAndroid Build Coastguard Worker      Start 37: http-client-multi-post-pipe
155*1c60b9acSAndroid Build Coastguard Worker39/73 Test #38: http-client-multi-post-h1-pipe ..............   Passed    0.49 sec
156*1c60b9acSAndroid Build Coastguard Worker      Start 47: http-client-post-h1
157*1c60b9acSAndroid Build Coastguard Worker40/73 Test #37: http-client-multi-post-pipe .................   Passed    0.31 sec
158*1c60b9acSAndroid Build Coastguard Worker      Start 50: hs_evlib_foreign_event
159*1c60b9acSAndroid Build Coastguard Worker41/73 Test #47: http-client-post-h1 .........................   Passed    0.29 sec
160*1c60b9acSAndroid Build Coastguard Worker      Start 66: ss-tf
161*1c60b9acSAndroid Build Coastguard Worker42/73 Test #50: hs_evlib_foreign_event ......................   Passed   22.02 sec
162*1c60b9acSAndroid Build Coastguard Worker      Start 49: hs_evlib_foreign_uv
163*1c60b9acSAndroid Build Coastguard Worker43/73 Test #49: hs_evlib_foreign_uv .........................   Passed   21.03 sec
164*1c60b9acSAndroid Build Coastguard Worker      Start 51: ss-warmcat
165*1c60b9acSAndroid Build Coastguard Worker44/73 Test #51: ss-warmcat ..................................   Passed    2.69 sec
166*1c60b9acSAndroid Build Coastguard Worker      Start 59: ss-smd
167*1c60b9acSAndroid Build Coastguard Worker45/73 Test #59: ss-smd ......................................   Passed    1.78 sec
168*1c60b9acSAndroid Build Coastguard Worker      Start 10: api-test-secure-streams
169*1c60b9acSAndroid Build Coastguard Worker46/73 Test #10: api-test-secure-streams .....................   Passed    1.34 sec
170*1c60b9acSAndroid Build Coastguard Worker      Start 11: http-client-warmcat
171*1c60b9acSAndroid Build Coastguard Worker47/73 Test #11: http-client-warmcat .........................   Passed    0.27 sec
172*1c60b9acSAndroid Build Coastguard Worker      Start 58: sspost-warmcat
173*1c60b9acSAndroid Build Coastguard Worker48/73 Test #58: sspost-warmcat ..............................   Passed    0.84 sec
174*1c60b9acSAndroid Build Coastguard Worker      Start 12: http-client-warmcat-h1
175*1c60b9acSAndroid Build Coastguard Worker49/73 Test #12: http-client-warmcat-h1 ......................   Passed    0.25 sec
176*1c60b9acSAndroid Build Coastguard Worker      Start  2: api-test-jose
177*1c60b9acSAndroid Build Coastguard Worker50/73 Test  #2: api-test-jose ...............................   Passed    0.27 sec
178*1c60b9acSAndroid Build Coastguard Worker      Start 70: ws-client-rx-warmcat
179*1c60b9acSAndroid Build Coastguard Worker51/73 Test #70: ws-client-rx-warmcat ........................   Passed    0.27 sec
180*1c60b9acSAndroid Build Coastguard Worker      Start 56: ki_ssproxyctx
181*1c60b9acSAndroid Build Coastguard Worker52/73 Test #56: ki_ssproxyctx ...............................   Passed    0.12 sec
182*1c60b9acSAndroid Build Coastguard Worker      Start 68: ki_ssproxy
183*1c60b9acSAndroid Build Coastguard Worker53/73 Test #68: ki_ssproxy ..................................   Passed    0.11 sec
184*1c60b9acSAndroid Build Coastguard Worker      Start 64: ki_mulssprxsmd_sspc
185*1c60b9acSAndroid Build Coastguard Worker54/73 Test #64: ki_mulssprxsmd_sspc .........................   Passed    0.10 sec
186*1c60b9acSAndroid Build Coastguard Worker      Start 61: ki_ssprxsmd_sspc
187*1c60b9acSAndroid Build Coastguard Worker55/73 Test #61: ki_ssprxsmd_sspc ............................   Passed    0.11 sec
188*1c60b9acSAndroid Build Coastguard Worker      Start 13: http-client-h2-rxflow-warmcat
189*1c60b9acSAndroid Build Coastguard Worker56/73 Test #13: http-client-h2-rxflow-warmcat ...............   Passed    0.28 sec
190*1c60b9acSAndroid Build Coastguard Worker      Start 14: http-client-h2-rxflow-warmcat-h1
191*1c60b9acSAndroid Build Coastguard Worker57/73 Test #14: http-client-h2-rxflow-warmcat-h1 ............   Passed    0.34 sec
192*1c60b9acSAndroid Build Coastguard Worker      Start 16: http-client-hugeurl-warmcat-h1
193*1c60b9acSAndroid Build Coastguard Worker58/73 Test #16: http-client-hugeurl-warmcat-h1 ..............   Passed    0.16 sec
194*1c60b9acSAndroid Build Coastguard Worker      Start 15: http-client-hugeurl-warmcat
195*1c60b9acSAndroid Build Coastguard Worker59/73 Test #15: http-client-hugeurl-warmcat .................   Passed    0.16 sec
196*1c60b9acSAndroid Build Coastguard Worker      Start 72: ki_wcs_srv
197*1c60b9acSAndroid Build Coastguard Worker60/73 Test #72: ki_wcs_srv ..................................   Passed    0.12 sec
198*1c60b9acSAndroid Build Coastguard Worker      Start 44: ki_hcp_srv
199*1c60b9acSAndroid Build Coastguard Worker61/73 Test #44: ki_hcp_srv ..................................   Passed    0.11 sec
200*1c60b9acSAndroid Build Coastguard Worker      Start 20: ki_hcmp_srv
201*1c60b9acSAndroid Build Coastguard Worker62/73 Test #20: ki_hcmp_srv .................................   Passed    0.11 sec
202*1c60b9acSAndroid Build Coastguard Worker      Start 18: ki_hcm_srv
203*1c60b9acSAndroid Build Coastguard Worker63/73 Test #18: ki_hcm_srv ..................................   Passed    0.11 sec
204*1c60b9acSAndroid Build Coastguard Worker      Start  7: api-test-lws_struct_sqlite
205*1c60b9acSAndroid Build Coastguard Worker64/73 Test  #7: api-test-lws_struct_sqlite ..................   Passed    0.03 sec
206*1c60b9acSAndroid Build Coastguard Worker      Start  1: api-test-gencrypto
207*1c60b9acSAndroid Build Coastguard Worker65/73 Test  #1: api-test-gencrypto ..........................   Passed    0.02 sec
208*1c60b9acSAndroid Build Coastguard Worker      Start  6: api-test-lws_struct-json
209*1c60b9acSAndroid Build Coastguard Worker66/73 Test  #6: api-test-lws_struct-json ....................   Passed    0.01 sec
210*1c60b9acSAndroid Build Coastguard Worker      Start  4: api-test-lws_dsh
211*1c60b9acSAndroid Build Coastguard Worker67/73 Test  #4: api-test-lws_dsh ............................   Passed    0.01 sec
212*1c60b9acSAndroid Build Coastguard Worker      Start  8: api-test-lws_tokenize
213*1c60b9acSAndroid Build Coastguard Worker68/73 Test  #8: api-test-lws_tokenize .......................   Passed    0.01 sec
214*1c60b9acSAndroid Build Coastguard Worker      Start  9: api-test-lwsac
215*1c60b9acSAndroid Build Coastguard Worker69/73 Test  #9: api-test-lwsac ..............................   Passed    0.00 sec
216*1c60b9acSAndroid Build Coastguard Worker      Start  3: api-test-lejp
217*1c60b9acSAndroid Build Coastguard Worker70/73 Test  #3: api-test-lejp ...............................   Passed    0.00 sec
218*1c60b9acSAndroid Build Coastguard Worker      Start 53: ki_ssproxy
219*1c60b9acSAndroid Build Coastguard Worker71/73 Test #53: ki_ssproxy ..................................   Passed    0.11 sec
220*1c60b9acSAndroid Build Coastguard Worker72/73 Test #66: ss-tf .......................................   Passed   55.51 sec
221*1c60b9acSAndroid Build Coastguard Worker      Start  5: api-test-lws_smd
222*1c60b9acSAndroid Build Coastguard Worker73/73 Test  #5: api-test-lws_smd ............................   Passed    4.22 sec
223*1c60b9acSAndroid Build Coastguard Worker
224*1c60b9acSAndroid Build Coastguard Worker100% tests passed, 0 tests failed out of 73
225*1c60b9acSAndroid Build Coastguard Worker
226*1c60b9acSAndroid Build Coastguard WorkerTotal Test time (real) = 137.76 sec
227*1c60b9acSAndroid Build Coastguard Worker```
228*1c60b9acSAndroid Build Coastguard Worker
229*1c60b9acSAndroid Build Coastguard Worker## Considerations for creating tests
230*1c60b9acSAndroid Build Coastguard Worker
231*1c60b9acSAndroid Build Coastguard Worker### Timeout
232*1c60b9acSAndroid Build Coastguard Worker
233*1c60b9acSAndroid Build Coastguard WorkerThe default test timeout is 1500s, for that reason it's good practice to set
234*1c60b9acSAndroid Build Coastguard Workera more suitable `TIMEOUT` property on every test.
235*1c60b9acSAndroid Build Coastguard Worker
236*1c60b9acSAndroid Build Coastguard Worker### Working Directory
237*1c60b9acSAndroid Build Coastguard Worker
238*1c60b9acSAndroid Build Coastguard WorkerServer-side test apps usually need to be run from their `./minimal-examples/...`
239*1c60b9acSAndroid Build Coastguard Workerdirectory so they can access their assets like index.html etc.
240*1c60b9acSAndroid Build Coastguard Worker
241*1c60b9acSAndroid Build Coastguard WorkerHowever when building with `-DLWS_WITH_MBEDTLS=1` then even client-side apps
242*1c60b9acSAndroid Build Coastguard Workerneed to be run from their directory, since they need to get the trusted CA for
243*1c60b9acSAndroid Build Coastguard Workerwarmcat.com or libwebsockets.org additionally.
244*1c60b9acSAndroid Build Coastguard Worker
245*1c60b9acSAndroid Build Coastguard WorkerFor that reason it's good practice to set the `WORKING_DIRECTORY` property to
246*1c60b9acSAndroid Build Coastguard Workerthe home dir of the example app in all cases.
247*1c60b9acSAndroid Build Coastguard Worker
248*1c60b9acSAndroid Build Coastguard Worker### Spawning Buddies
249*1c60b9acSAndroid Build Coastguard Worker
250*1c60b9acSAndroid Build Coastguard WorkerMany networking tests need to either spawn a client or a server in order to
251*1c60b9acSAndroid Build Coastguard Workerhave a "buddy" to talk to during the test for the opposing side.  This is a
252*1c60b9acSAndroid Build Coastguard Workerbit awkward in cmake since it does not directly support spawning daemons as
253*1c60b9acSAndroid Build Coastguard Workertest dependencies.
254*1c60b9acSAndroid Build Coastguard Worker
255*1c60b9acSAndroid Build Coastguard WorkerLws provides helper scripts for unix type targets in `./scripts/ctest-background.sh`
256*1c60b9acSAndroid Build Coastguard Workerand `./scripts/ctest-background-kill.sh`, which spawn background processes,
257*1c60b9acSAndroid Build Coastguard Workersave the pid in a decorated /tmp file and can later take the process down.  This
258*1c60b9acSAndroid Build Coastguard Workeralso has arrangements to dump the log of any background process that exited
259*1c60b9acSAndroid Build Coastguard Workerearly.
260*1c60b9acSAndroid Build Coastguard Worker
261*1c60b9acSAndroid Build Coastguard WorkerTo arrange the buddy to run aligned with the test, you first explain to cmake
262*1c60b9acSAndroid Build Coastguard Workerhow to start and stop the buddy using phony tests to make a "fixture" in cmake
263*1c60b9acSAndroid Build Coastguard Workerterms.
264*1c60b9acSAndroid Build Coastguard Worker
265*1c60b9acSAndroid Build Coastguard WorkerIn this example, taken from minimal-http-client-multi, we arrange for
266*1c60b9acSAndroid Build Coastguard Workerminimal-http-server-tls to be available for our actual test.  The starting and
267*1c60b9acSAndroid Build Coastguard Workerstopping definition, for "st_hcm_srv" and "ki_hcm_srv":
268*1c60b9acSAndroid Build Coastguard Worker
269*1c60b9acSAndroid Build Coastguard Worker```
270*1c60b9acSAndroid Build Coastguard Worker	add_test(NAME st_hcm_srv COMMAND
271*1c60b9acSAndroid Build Coastguard Worker		${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh
272*1c60b9acSAndroid Build Coastguard Worker			hcm_srv $<TARGET_FILE:lws-minimal-http-server-tls>
273*1c60b9acSAndroid Build Coastguard Worker			--port ${PORT_HCM_SRV} )
274*1c60b9acSAndroid Build Coastguard Worker	add_test(NAME ki_hcm_srv COMMAND
275*1c60b9acSAndroid Build Coastguard Worker		${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh
276*1c60b9acSAndroid Build Coastguard Worker			hcm_srv $<TARGET_FILE_NAME:lws-minimal-http-server-tls>
277*1c60b9acSAndroid Build Coastguard Worker				--port ${PORT_HCM_SRV})
278*1c60b9acSAndroid Build Coastguard Worker```
279*1c60b9acSAndroid Build Coastguard Worker
280*1c60b9acSAndroid Build Coastguard Worker... and binding those together so cmake knows they start and stop a specific
281*1c60b9acSAndroid Build Coastguard Workernamed fixture "hcm_srv", itself with an 800s timeout
282*1c60b9acSAndroid Build Coastguard Worker
283*1c60b9acSAndroid Build Coastguard Worker```
284*1c60b9acSAndroid Build Coastguard Worker	set_tests_properties(st_hcm_srv PROPERTIES
285*1c60b9acSAndroid Build Coastguard Worker       		WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-server/minimal-http-server-tls
286*1c60b9acSAndroid Build Coastguard Worker		FIXTURES_SETUP hcm_srv
287*1c60b9acSAndroid Build Coastguard Worker		TIMEOUT 800)
288*1c60b9acSAndroid Build Coastguard Worker	set_tests_properties(ki_hcm_srv PROPERTIES
289*1c60b9acSAndroid Build Coastguard Worker		FIXTURES_CLEANUP hcm_srv)
290*1c60b9acSAndroid Build Coastguard Worker```
291*1c60b9acSAndroid Build Coastguard Worker
292*1c60b9acSAndroid Build Coastguard Worker... and finally, adding the "hcm_srv" fixture as a requirement on the actual
293*1c60b9acSAndroid Build Coastguard Workertest (http-client-multi) we are testing
294*1c60b9acSAndroid Build Coastguard Worker
295*1c60b9acSAndroid Build Coastguard Worker```
296*1c60b9acSAndroid Build Coastguard Worker	set_tests_properties(http-client-multi
297*1c60b9acSAndroid Build Coastguard Worker			     PROPERTIES
298*1c60b9acSAndroid Build Coastguard Worker			     FIXTURES_REQUIRED "hcm_srv"
299*1c60b9acSAndroid Build Coastguard Worker			     WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client-multi
300*1c60b9acSAndroid Build Coastguard Worker			     TIMEOUT 50)
301*1c60b9acSAndroid Build Coastguard Worker```
302*1c60b9acSAndroid Build Coastguard Worker
303*1c60b9acSAndroid Build Coastguard WorkerOnce all that explaining is done, ctest itself will take care about starting
304*1c60b9acSAndroid Build Coastguard Workerand killing hcm_srv before and after http-client-multi test.
305*1c60b9acSAndroid Build Coastguard Worker
306*1c60b9acSAndroid Build Coastguard Worker### Buddy sockets and test concurrency
307*1c60b9acSAndroid Build Coastguard Worker
308*1c60b9acSAndroid Build Coastguard WorkerFor tests with local buddies using tcp sockets inside the same VM or systemd-
309*1c60b9acSAndroid Build Coastguard Workernspawn networking context, you cannot just use a well-known port like 7681.
310*1c60b9acSAndroid Build Coastguard Worker
311*1c60b9acSAndroid Build Coastguard Workerctest itself is usually executed concurrently, and Sai is typically building
312*1c60b9acSAndroid Build Coastguard Workermultiple different instances concurrently as well (typically 3), so it may be
313*1c60b9acSAndroid Build Coastguard Workerrunning different ctests inside the same VM simultaneously.
314*1c60b9acSAndroid Build Coastguard Worker
315*1c60b9acSAndroid Build Coastguard WorkerDifferent tests can have their own convention for port ranges, to solve the
316*1c60b9acSAndroid Build Coastguard Workerproblem about Sai running different tests concurrently inside one ctest.
317*1c60b9acSAndroid Build Coastguard Worker
318*1c60b9acSAndroid Build Coastguard WorkerFor the case there are multiple ctests running, we can use the env var
319*1c60b9acSAndroid Build Coastguard Worker`$ENV{SAI_INSTANCE_IDX}`, which is an ordinal like 0 or 1, to further ensure
320*1c60b9acSAndroid Build Coastguard Workerthat port selections won't conflict.  If not using Sai, you can just set this
321*1c60b9acSAndroid Build Coastguard Workerin the evironment yourself to reflect your build instance index.
322*1c60b9acSAndroid Build Coastguard Worker
323*1c60b9acSAndroid Build Coastguard Worker```
324*1c60b9acSAndroid Build Coastguard Worker       #
325*1c60b9acSAndroid Build Coastguard Worker       # instantiate the server per sai builder instance, they are running in the same
326*1c60b9acSAndroid Build Coastguard Worker       # machine context in parallel so they can tread on each other otherwise
327*1c60b9acSAndroid Build Coastguard Worker       #
328*1c60b9acSAndroid Build Coastguard Worker       set(PORT_HCM_SRV "7670")
329*1c60b9acSAndroid Build Coastguard Worker       if ("$ENV{SAI_INSTANCE_IDX}" STREQUAL "0")
330*1c60b9acSAndroid Build Coastguard Worker               set(PORT_HCM_SRV 7671)
331*1c60b9acSAndroid Build Coastguard Worker       endif()
332*1c60b9acSAndroid Build Coastguard Worker       if ("$ENV{SAI_INSTANCE_IDX}" STREQUAL "1")
333*1c60b9acSAndroid Build Coastguard Worker               set(PORT_HCM_SRV 7672)
334*1c60b9acSAndroid Build Coastguard Worker       endif()
335*1c60b9acSAndroid Build Coastguard Worker       if ("$ENV{SAI_INSTANCE_IDX}" STREQUAL "2")
336*1c60b9acSAndroid Build Coastguard Worker               set(PORT_HCM_SRV 7673)
337*1c60b9acSAndroid Build Coastguard Worker       endif()
338*1c60b9acSAndroid Build Coastguard Worker       if ("$ENV{SAI_INSTANCE_IDX}" STREQUAL "3")
339*1c60b9acSAndroid Build Coastguard Worker               set(PORT_HCM_SRV 7674)
340*1c60b9acSAndroid Build Coastguard Worker       endif()
341*1c60b9acSAndroid Build Coastguard Worker```
342*1c60b9acSAndroid Build Coastguard Worker
343*1c60b9acSAndroid Build Coastguard WorkerThis is complicated enough that the best approach is copy an existing simple
344*1c60b9acSAndroid Build Coastguard Workercase like the CMakeLists.txt for minimal-http-client and change the names and
345*1c60b9acSAndroid Build Coastguard Workerports to be unique.
346