lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame^] | 1 | _ _ ____ _ |
| 2 | ___| | | | _ \| | |
| 3 | / __| | | | |_) | | |
| 4 | | (__| |_| | _ <| |___ |
| 5 | \___|\___/|_| \_\_____| |
| 6 | |
| 7 | The curl Test Suite |
| 8 | |
| 9 | 1. Running |
| 10 | 1.1 Requires to run |
| 11 | 1.2 Port numbers used by test servers |
| 12 | 1.3 Test servers |
| 13 | 1.4 Run |
| 14 | 1.5 Shell startup scripts |
| 15 | 1.6 Memory test |
| 16 | 1.7 Debug |
| 17 | 1.8 Logs |
| 18 | 1.9 Test input files |
| 19 | 1.10 Code coverage |
| 20 | 1.11 Remote testing |
| 21 | |
| 22 | 2. Numbering |
| 23 | 2.1 Test case numbering |
| 24 | |
| 25 | 3. Write tests |
| 26 | 3.1 test data |
| 27 | 3.2 curl tests |
| 28 | 3.3 libcurl tests |
| 29 | 3.4 unit tests |
| 30 | |
| 31 | 4. TODO |
| 32 | 4.1 More protocols |
| 33 | 4.2 SOCKS auth |
| 34 | |
| 35 | ============================================================================== |
| 36 | |
| 37 | 1. Running |
| 38 | |
| 39 | 1.1 Requires to run |
| 40 | |
| 41 | perl (and a unix-style shell) |
| 42 | python (and a unix-style shell) |
| 43 | diff (when a test fails, a diff is shown) |
| 44 | stunnel (for HTTPS and FTPS tests) |
| 45 | OpenSSH or SunSSH (for SCP, SFTP and SOCKS4/5 tests) |
| 46 | nghttpx (for HTTP/2 tests) |
| 47 | nroff (for --manual tests) |
| 48 | |
| 49 | 1.2 Port numbers used by test servers |
| 50 | |
| 51 | - TCP/8990 for HTTP |
| 52 | - TCP/8991 for HTTPS |
| 53 | - TCP/8992 for FTP |
| 54 | - TCP/8993 for FTPS |
| 55 | - TCP/8994 for HTTP IPv6 |
| 56 | - TCP/8995 for FTP (2) |
| 57 | - TCP/8996 for FTP IPv6 |
| 58 | - UDP/8997 for TFTP |
| 59 | - UDP/8998 for TFTP IPv6 |
| 60 | - TCP/8999 for SCP/SFTP |
| 61 | - TCP/9000 for SOCKS |
| 62 | - TCP/9001 for POP3 |
| 63 | - TCP/9002 for POP3 IPv6 |
| 64 | - TCP/9003 for IMAP |
| 65 | - TCP/9004 for IMAP IPv6 |
| 66 | - TCP/9005 for SMTP |
| 67 | - TCP/9006 for SMTP IPv6 |
| 68 | - TCP/9007 for RTSP |
| 69 | - TCP/9008 for RTSP IPv6 |
| 70 | - TCP/9009 for GOPHER |
| 71 | - TCP/9010 for GOPHER IPv6 |
| 72 | - TCP/9011 for HTTPS server with TLS-SRP support |
| 73 | - TCP/9012 for HTTPS IPv6 server with TLS-SRP support |
| 74 | - TCP/9013 for HTTP proxy server for CONNECT |
| 75 | - TCP/9014 for HTTP pipelining server |
| 76 | - TCP/9015 for HTTP/2 server |
| 77 | |
| 78 | 1.3 Test servers |
| 79 | |
| 80 | The test suite runs simple FTP, POP3, IMAP, SMTP, HTTP and TFTP stand-alone |
| 81 | servers on the ports listed above to which it makes requests. For SSL tests, |
| 82 | it runs stunnel to handle encryption to the regular servers. For SSH, it |
| 83 | runs a standard OpenSSH server. For SOCKS4/5 tests SSH is used to perform |
| 84 | the SOCKS functionality and requires a SSH client and server. |
| 85 | |
| 86 | The base port number (8990), which all the individual port numbers are |
| 87 | indexed from, can be set explicitly using runtests.pl' -b option to allow |
| 88 | running more than one instance of the test suite simultaneously on one |
| 89 | machine, or just move the servers in case you have local services on any of |
| 90 | those ports. |
| 91 | |
| 92 | The HTTP server supports listening on a Unix domain socket, the default |
| 93 | location is 'http.sock'. |
| 94 | |
| 95 | 1.4 Run |
| 96 | |
| 97 | './configure && make && make test'. This builds the test suite support code |
| 98 | and invokes the 'runtests.pl' perl script to run all the tests. Edit the top |
| 99 | variables of that script in case you have some specific needs, or run the |
| 100 | script manually (after the support code has been built). |
| 101 | |
| 102 | The script breaks on the first test that doesn't do OK. Use -a to prevent |
| 103 | the script from aborting on the first error. Run the script with -v for more |
| 104 | verbose output. Use -d to run the test servers with debug output enabled as |
| 105 | well. Specifying -k keeps all the log files generated by the test intact. |
| 106 | |
| 107 | Use -s for shorter output, or pass test numbers to run specific tests only |
| 108 | (like "./runtests.pl 3 4" to test 3 and 4 only). It also supports test case |
| 109 | ranges with 'to', as in "./runtests 3 to 9" which runs the seven tests from |
| 110 | 3 to 9. Any test numbers starting with ! are disabled, as are any test |
| 111 | numbers found in the files data/DISABLED or data/DISABLED.local (one per |
| 112 | line). The latter is meant for local temporary disables and will be ignored |
| 113 | by git. |
| 114 | |
| 115 | When -s is not present, each successful test will display on one line the |
| 116 | test number and description and on the next line a set of flags, the test |
| 117 | result, current test sequence, total number of tests to be run and an |
| 118 | estimated amount of time to complete the test run. The flags consist of |
| 119 | these letters describing what is checked in this test: |
| 120 | |
| 121 | s stdout |
| 122 | d data |
| 123 | u upload |
| 124 | p protocol |
| 125 | o output |
| 126 | e exit code |
| 127 | m memory |
| 128 | v valgrind |
| 129 | |
| 130 | 1.5 Shell startup scripts |
| 131 | |
| 132 | Tests which use the ssh test server, SCP/SFTP/SOCKS tests, might be badly |
| 133 | influenced by the output of system wide or user specific shell startup |
| 134 | scripts, .bashrc, .profile, /etc/csh.cshrc, .login, /etc/bashrc, etc. which |
| 135 | output text messages or escape sequences on user login. When these shell |
| 136 | startup messages or escape sequences are output they might corrupt the |
| 137 | expected stream of data which flows to the sftp-server or from the ssh |
| 138 | client which can result in bad test behaviour or even prevent the test |
| 139 | server from running. |
| 140 | |
| 141 | If the test suite ssh or sftp server fails to start up and logs the message |
| 142 | 'Received message too long' then you are certainly suffering the unwanted |
| 143 | output of a shell startup script. Locate, cleanup or adjust the shell |
| 144 | script. |
| 145 | |
| 146 | 1.6 Memory test |
| 147 | |
| 148 | The test script will check that all allocated memory is freed properly IF |
| 149 | curl has been built with the CURLDEBUG define set. The script will |
| 150 | automatically detect if that is the case, and it will use the |
| 151 | 'memanalyze.pl' script to analyze the memory debugging output. |
| 152 | |
| 153 | Also, if you run tests on a machine where valgrind is found, the script will |
| 154 | use valgrind to run the test with (unless you use -n) to further verify |
| 155 | correctness. |
| 156 | |
| 157 | runtests.pl's -t option will enable torture testing mode, which runs each |
| 158 | test many times and makes each different memory allocation fail on each |
| 159 | successive run. This tests the out of memory error handling code to ensure |
| 160 | that memory leaks do not occur even in those situations. It can help to |
| 161 | compile curl with CPPFLAGS=-DMEMDEBUG_LOG_SYNC when using this option, to |
| 162 | ensure that the memory log file is properly written even if curl crashes. |
| 163 | |
| 164 | 1.7 Debug |
| 165 | |
| 166 | If a test case fails, you can conveniently get the script to invoke the |
| 167 | debugger (gdb) for you with the server running and the exact same command |
| 168 | line parameters that failed. Just invoke 'runtests.pl <test number> -g' and |
| 169 | then just type 'run' in the debugger to perform the command through the |
| 170 | debugger. |
| 171 | |
| 172 | 1.8 Logs |
| 173 | |
| 174 | All logs are generated in the log/ subdirectory (it is emptied first in the |
| 175 | runtests.pl script). Use runtests.pl -k to force it to keep the temporary |
| 176 | files after the test run since successful runs will clean it up otherwise. |
| 177 | |
| 178 | 1.9 Test input files |
| 179 | |
| 180 | All test cases are put in the data/ subdirectory. Each test is stored in the |
| 181 | file named according to the test number. |
| 182 | |
| 183 | See FILEFORMAT for the description of the test case files. |
| 184 | |
| 185 | 1.10 Code coverage |
| 186 | |
| 187 | gcc provides a tool that can determine the code coverage figures for |
| 188 | the test suite. To use it, configure curl with |
| 189 | CFLAGS='-fprofile-arcs -ftest-coverage -g -O0'. Make sure you run the normal |
| 190 | and torture tests to get more full coverage, i.e. do: |
| 191 | |
| 192 | make test |
| 193 | make test-torture |
| 194 | |
| 195 | The graphical tool ggcov can be used to browse the source and create |
| 196 | coverage reports on *NIX hosts: |
| 197 | |
| 198 | ggcov -r lib src |
| 199 | |
| 200 | The text mode tool gcov may also be used, but it doesn't handle object files |
| 201 | in more than one directory very well. |
| 202 | |
| 203 | 1.11 Remote testing |
| 204 | |
| 205 | The runtests.pl script provides some hooks to allow curl to be tested on a |
| 206 | machine where perl can not be run. The test framework in this case runs on |
| 207 | a workstation where perl is available, while curl itself is run on a remote |
| 208 | system using ssh or some other remote execution method. See the comments at |
| 209 | the beginning of runtests.pl for details. |
| 210 | |
| 211 | 2. Numbering |
| 212 | |
| 213 | 2.1 Test case numbering |
| 214 | |
| 215 | 1 - 99 HTTP |
| 216 | 100 - 199 FTP |
| 217 | 200 - 299 FILE |
| 218 | 300 - 399 HTTPS |
| 219 | 400 - 499 FTPS |
| 220 | 500 - 599 libcurl source code tests, not using the curl command tool |
| 221 | 600 - 699 SCP/SFTP |
| 222 | 700 - 799 SOCKS4 (even numbers) and SOCK5 (odd numbers) |
| 223 | 800 - 849 IMAP |
| 224 | 850 - 899 POP3 |
| 225 | 900 - 999 SMTP |
| 226 | 1000 - 1299 miscellaneous |
| 227 | 1300 - 1399 unit tests |
| 228 | 1400 - 1499 miscellaneous |
| 229 | 1500 - 1599 libcurl source code tests, not using the curl command tool |
| 230 | (same as 5xx) |
| 231 | 1600 - 1699 unit tests |
| 232 | 2000 - x multiple sequential protocols per test case |
| 233 | |
| 234 | There's nothing in the system that *requires* us to keep within these number |
| 235 | series. |
| 236 | |
| 237 | 3. Write tests |
| 238 | |
| 239 | Here's a quick description on writing test cases. We basically have three |
| 240 | kinds of tests: the ones that test the curl tool, the ones that build small |
| 241 | applications and test libcurl directly and the unit tests that test |
| 242 | individual (possibly internal) functions. |
| 243 | |
| 244 | 3.1 test data |
| 245 | |
| 246 | Each test has a master file that controls all the test data. What to read, |
| 247 | what the protocol exchange should look like, what exit code to expect and |
| 248 | what command line arguments to use etc. |
| 249 | |
| 250 | These files are tests/data/test[num] where [num] is described in section 2 |
| 251 | of this document, and the XML-like file format of them is described in the |
| 252 | separate tests/FILEFORMAT document. |
| 253 | |
| 254 | 3.2 curl tests |
| 255 | |
| 256 | A test case that runs the curl tool and verifies that it gets the correct |
| 257 | data, it sends the correct data, it uses the correct protocol primitives |
| 258 | etc. |
| 259 | |
| 260 | 3.3 libcurl tests |
| 261 | |
| 262 | The libcurl tests are identical to the curl ones, except that they use a |
| 263 | specific and dedicated custom-built program to run instead of "curl". This |
| 264 | tool is built from source code placed in tests/libtest and if you want to |
| 265 | make a new libcurl test that is where you add your code. |
| 266 | |
| 267 | 3.4 unit tests |
| 268 | |
| 269 | Unit tests are tests in the 13xx sequence and they are placed in tests/unit. |
| 270 | There's a tests/unit/README describing the specific set of checks and macros |
| 271 | that may be used when writing tests that verify behaviors of specific |
| 272 | individual functions. |
| 273 | |
| 274 | The unit tests depend on curl being built with debug enabled. |
| 275 | |
| 276 | 4. TODO |
| 277 | |
| 278 | 4.1 More protocols |
| 279 | |
| 280 | Add tests for TELNET, LDAP, DICT... |
| 281 | |
| 282 | 4.2 SOCKS auth |
| 283 | |
| 284 | SOCKS4/5 test deficiencies - no proxy authentication tests as SSH (the |
| 285 | test mechanism) doesn't support them |