xref: /curl/tests/runtests.md (revision cbafcec5)
1---
2c: Copyright (C) Daniel Stenberg, <daniel.se>, et al.
3SPDX-License-Identifier: curl
4Title: runtests.pl
5Section: 1
6Source: runtests
7See-also:
8 - runtests.pl
9Added-in: 7.5
10---
11
12# NAME
13
14runtests.pl - run one or more test cases
15
16# SYNOPSIS
17
18**runtests.pl [options] [tests]**
19
20# DESCRIPTION
21
22*runtests.pl* runs one, several or all the existing test cases in curl's
23test suite. It is often called from the root Makefile of the curl package with
24'make test'.
25
26# TESTS
27
28Specify which test(s) to run by specifying test numbers or keywords.
29
30If no test number or keyword is given, all existing tests that the script can
31find are considered for running. You can specify single test cases to run by
32specifying test numbers space-separated, like `1 3 5 7 11`, and you can
33specify a range of tests like `45 to 67`.
34
35Specify tests to not run with a leading exclamation point, like `!66`, which
36runs all available tests except number 66.
37
38Prefix a test number with a tilde (~) to still run it, but ignore the results.
39
40It is also possible to specify tests based on a keyword describing the test(s)
41to run, like `FTPS`. The keywords are strings used in the individual tests.
42
43You can also specify keywords with a leading exclamation point and the keyword
44or phrase, like "!HTTP NTLM auth" to run all tests **except** those using this
45keyword. Remember that the exclamation marks and spaces need to be quoted
46somehow when entered at many command shells.
47
48Prefix a keyword with a tilde (~) to still run it, but ignore the results.
49
50# OUTPUT
51
52When running without `-s` (short output), for instance when running
53runtests.pl directly rather than via make, each test emits a pair of lines
54like this:
55
56    Test 0045...[simple HTTP Location: without protocol in initial URL]
57    --pd---e-v- OK (45  out of 1427, remaining: 16:08, took 6.188s, duration: 00:31)
58
59the first line contains the test number and a description. On the second line,
60the characters at the beginning are flags indicating which aspects of curl's
61behavior were checked by the test:
62
63    s stdout
64    r stderr
65    p protocol
66    d data
67    u upload
68    P proxy
69    o output
70    e exit code
71    m memory
72    v valgrind
73    E the test was run event-based
74
75The remainder of the second line contains the test result, current test sequence,
76total number of tests to be run and an estimated amount of time to complete the
77test run.
78
79# OPTIONS
80
81## `-a`
82
83Continue running the rest of the test cases even if one test fails. By
84default, the test script stops as soon as an error is detected.
85
86## `-ac \<curl\>`
87
88Provide a path to a curl binary to talk to APIs (currently only CI test APIs).
89
90## `-am`
91
92Display test results in automake style output (`PASS/FAIL: [number] [name]`).
93
94## `-bundle`
95
96Run tests via bundled test binaries. Bundled test binaries contain all tests,
97and the test name passed as the first argument selects which test run.
98
99## `-c\<curl\>`
100
101Provide a path to a custom curl binary to run the tests with. Default is the
102curl executable in the build tree.
103
104## `-d`
105
106Enable protocol debug: have the servers display protocol output. If used in
107conjunction with parallel testing, it is difficult to associate the logs with
108the specific test being run.
109
110## `-E \<exclude_file\>`
111
112Load the **exclude_file** with additional reasons why certain tests should be
113skipped. Useful when testing with external HTTP proxies in which case some of
114the tests are not appropriate.
115
116The file contains colon-delimited lines. The first field contains the type of
117exclusion, the second field contains a pattern and the final field contains
118the reason why matching tests should be skipped. The exclusion types are
119*keyword*, *test*, and *tool*.
120
121## `-e` or `--test-event`
122
123Run the test event-based (if possible). This makes runtests invoke curl with
124--test-event option. This option only works if both curl and libcurl were
125built debug-enabled.
126
127## `-f`
128
129Force the test to run even if mentioned in DISABLED.
130
131## `-g`
132
133Run the given test(s) with gdb. This is best used on a single test case and
134curl built --disable-shared. This then fires up gdb with command line set to
135run the specified test case. Simply (set a break-point and) type 'run' to
136start.
137
138## `-gl`
139
140Run the given test(s) with lldb. This is best used on a single test case and
141curl built --disable-shared. This then fires up lldb with command line set to
142run the specified test case. Simply (set a break-point and) type 'run' to
143start.
144
145## `-gw`
146
147Run the given test(s) with gdb as a windowed application.
148
149## `-h, --help`
150
151Displays a help text about this program's command line options.
152
153## `-j[num]`
154
155Spawn the given number of processes to run tests in. This defaults to 0 to run
156tests serially within a single process. Using a number greater than one allows
157multiple tests to run in parallel, speeding up a test run. The optimum number
158is dependent on the system and set of tests to run, but 7 times the number of
159CPU cores is a good figure to start with, or 1.3 times if Valgrind is in use,
160or 5 times for torture tests. Enabling parallel tests is not recommended in
161conjunction with the -g option.
162
163## `-k`
164
165Keep output and log files in log/ after a test run, even if no error was
166detected. Useful for debugging.
167
168## `-L \<file\>`
169
170Load and execute the specified file which should contain perl code. This
171option allows one to change *runtests.pl* behavior by overwriting functions
172and variables and is useful when testing external proxies using curl's
173regression test suite.
174
175## `-l`
176
177Lists all test case names.
178
179## `-n`
180
181Disable the check for and use of valgrind.
182
183## `--no-debuginfod`
184
185Delete the `DEBUGINFOD_URLS` variable if that is defined. Makes valgrind, gdb
186etc not able to use this functionality.
187
188## `-o \<variablename=value\>`
189
190Overwrite the specified internal **variable** with **value**. Useful to change
191variables that did not get a dedicated flag to change them. Check the source to
192see which variables are available.
193
194## `-P \<proxy\>`
195
196Use the specified HTTP proxy when executing tests, even if the tests
197themselves do not specify a proxy. This option allows one to test external
198proxies using curl's regression test suite.
199
200## `-p`
201
202Prints out all files in the log directory to stdout when a test case fails.
203Practical when used in the automated and distributed tests since then the
204people checking the failures and the reasons for them might not have physical
205access to the machine and logs.
206
207## `-R`
208
209Run the tests in a scrambled, or randomized, order instead of sequentially.
210
211The random seed initially set for this is fixed per month and can be set with
212*--seed*.
213
214## `-r`
215
216Display run time statistics. (Requires the `Perl Time::HiRes` module)
217
218## `-rf`
219
220Display full run time statistics. (Requires the `Perl Time::HiRes` module)
221
222## `-rm`
223
224Force removal of files by killing locking processes. (Windows only, requires
225the **Sysinternals** `handle[64].exe` to be on PATH)
226
227## `--repeat=[num]`
228
229This repeats the given set of test numbers this many times. If no test numbers
230are given, it repeats ALL tests this many times. It adds the new repeated
231sequence at the end of the initially given one.
232
233If **-R** option is also used, the scrambling is done after the repeats have
234extended the test sequence.
235
236## `-s`
237
238Shorter output. Speaks less than default.
239
240## `--seed=[num]`
241
242When using *--shallow* or *-R* that randomize certain aspects of the behavior,
243this option can set the initial seed. If not set, the random seed is set based
244on the currently set local year and month and the first line of the "curl -V"
245output.
246
247## `--shallow=[num]`
248
249Used together with **-t**. This limits the number of tests to fail in torture
250mode to no more than **num** per test case. If this reduces the amount, the
251script randomly discards entries to fail until the amount is **num**.
252
253The random seed initially set for this is fixed per month and can be set with
254*--seed*.
255
256## `-t[num]`
257
258Selects a **torture** test for the given tests. This makes runtests.pl first
259run the tests once and count the number of memory allocations made. It then
260reruns the test that number of times, each time forcing one of the allocations
261to fail until all allocations have been tested. By setting *num* you can force
262the allocation with that number to be set to fail at once instead of looping
263through everyone, which is handy when debugging and then often in combination
264with *-g*.
265
266## `--test-duphandle`
267
268Passes the `--test-duphandle` option to curl when invoked. This command line
269option only exists in debug builds and runs curl normally, but duplicates the
270easy handle before the transfer and use the duplicate instead of the original
271handle. This verifies that the duplicate works exactly as good as the original
272handle.
273
274Because of how the curl tool uses a share object to store and keep some data,
275not everything is however perfectly copied in the duplicate. In particular
276HSTS data is not. A specific test case can be set to avoid using
277`--test-duphandle` by disabling it on a per test basis.
278
279## `-u`
280
281Error instead of warning on server unexpectedly alive.
282
283## `-v`
284
285Enable verbose output. Speaks more than by default. If used in conjunction
286with parallel testing, it is difficult to associate the logs with the specific
287test being run.
288
289## `-vc \<curl\>`
290
291Provide a path to a custom curl binary to run when verifying that the servers
292running are indeed our test servers. Default is the curl executable in the
293build tree.
294
295# RUNNING TESTS
296
297Many tests have conditions that must be met before the test case can run fine.
298They could depend on built-in features in libcurl or features present in the
299operating system or even in third-party libraries that curl may or may not
300use.
301
302The test script checks most of these by itself to determine when it is safe to
303attempt to run each test. Those which cannot be run due to failed requirements
304are simply skipped and listed at the completion of all test cases. In some
305unusual configurations, the test script cannot make the correct determination
306for all tests. In these cases, the problematic tests can be skipped using the
307"!keyword" skip feature documented earlier.
308
309# WRITING TESTS
310
311The simplest way to write test cases is to start with a similar existing test,
312save it with a new number and then adjust it to fit. There is an attempt to
313document the test case file format in **tests/FILEFORMAT.md**.
314