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