downgrade memory unlock failures to info level and fix function name in log output
[sqlcipher.git] / doc / testrunner.md
blobd420076c4fc3046bd22eaf0acb5e17281c1a7af3
3 # The testrunner.tcl Script
5 <ul type=none>
6   <li> 1. <a href=#overview>Overview</a>
7   <li> 2. <a href=#binary_tests>Binary Tests</a>
8 <ul type=none>
9   <li> 2.1. <a href=#organization_tests>Organization of Tcl Tests</a>
10   <li> 2.2. <a href=#run_tests>Commands to Run Tests</a>
11   <li> 2.3. <a href=#binary_test_failures>Investigating Binary Test Failures</a>
12 </ul>
13   <li> 3. <a href=#source_code_tests>Source Tests</a>
14 <ul type=none>
15   <li> 3.1. <a href=#commands_to_run_tests>Commands to Run SQLite Tests</a>
16   <li> 3.2. <a href=#zipvfs_tests>Running ZipVFS Tests</a>
17   <li> 3.3. <a href=#source_code_test_failures>Investigating Source Code Test Failures</a>
18 </ul>
19   <li> 4. <a href=#testrunner_options>Extra testrunner.tcl Options</a>
20 # 4. Extra testrunner.tcl Options
21   <li> 5. <a href=#cpu_cores>Controlling CPU Core Utilization</a>
22 </ul>
24 <a name=overview></a>
25 # 1. Overview
27 testrunner.tcl is a Tcl script used to run multiple SQLite tests using 
28 multiple jobs. It supports the following types of tests:
30   *  Tcl test scripts.
32   *  Tests run with [make] commands. Specifically, at time of writing, 
33      [make fuzztest], [make mptest], [make sourcetest] and [make threadtest].
35 testrunner.tcl pipes the output of all tests and builds run into log file
36 **testrunner.log**, created in the cwd directory. Searching this file for
37 "failed" is a good way to find the output of a failed test.
39 testrunner.tcl also populates SQLite database **testrunner.db**. This database
40 contains details of all tests run, running and to be run. A useful query
41 might be:
43 ```
44   SELECT * FROM script WHERE state='failed'
45 ```
47 Running the command:
49 ```
50   ./testfixture $(TESTDIR)/testrunner.tcl status
51 ```
53 in the directory containing the testrunner.db database runs various queries
54 to produce a succinct report on the state of a running testrunner.tcl script.
55 Running:
57 ```
58   watch ./testfixture $(TESTDIR)/testrunner.tcl status
59 ```
61 in another terminal is a good way to keep an eye on a long running test.
63 Sometimes testrunner.tcl uses the [testfixture] binary that it is run with
64 to run tests (see "Binary Tests" below). Sometimes it builds testfixture and
65 other binaries in specific configurations to test (see "Source Tests").
67 <a name=binary_tests></a>
68 # 2. Binary Tests
70 The commands described in this section all run various combinations of the Tcl
71 test scripts using the [testfixture] binary used to run the testrunner.tcl
72 script (i.e. they do not invoke the compiler to build new binaries, or the
73 [make] command to run tests that are not Tcl scripts). The procedure to run
74 these tests is therefore:
76   1. Build the "testfixture" (or "testfixture.exe" for windows) binary using
77      whatever method seems convenient.
79   2. Test the binary built in step 1 by running testrunner.tcl with it, 
80      perhaps with various options.
82 The following sub-sections describe the various options that can be
83 passed to testrunner.tcl to test binary testfixture builds.
85 <a name=organization_tests></a>
86 ## 2.1. Organization of Tcl Tests
88 Tcl tests are stored in files that match the pattern *\*.test*. They are
89 found in both the $TOP/test/ directory, and in the various sub-directories
90 of the $TOP/ext/ directory of the source tree. Not all *\*.test* files
91 contain Tcl tests - a handful are Tcl scripts designed to invoke other
92 *\*.test* files.
94 The **veryquick** set of tests is a subset of all Tcl test scripts in the
95 source tree. In includes most tests, but excludes some that are very slow.
96 Almost all fault-injection tests (those that test the response of the library
97 to OOM or IO errors) are excluded. It is defined in source file 
98 *test/permutations.test*.
100 The **full** set of tests includes all Tcl test scripts in the source tree.
101 To run a "full" test is to run all Tcl test scripts that can be found in the
102 source tree.
104 File *permutations.test* defines various test "permutations". A permutation
105 consists of:
107   *  A subset of Tcl test scripts, and 
109   *  Runtime configuration to apply before running each test script 
110      (e.g. enabling auto-vacuum, or disable lookaside).
112 Running **all** tests is to run all tests in the full test set, plus a dozen
113 or so permutations. The specific permutations that are run as part of "all"
114 are defined in file *testrunner_data.tcl*.
116 <a name=run_tests></a>
117 ## 2.2. Commands to Run Tests
119 To run the "veryquick" test set, use either of the following:
122   ./testfixture $TESTDIR/testrunner.tcl
123   ./testfixture $TESTDIR/testrunner.tcl veryquick
126 To run the "full" test suite:
129   ./testfixture $TESTDIR/testrunner.tcl full
132 To run the subset of the "full" test suite for which the test file name matches
133 a specified pattern (e.g. all tests that start with "fts5"), either of:
136   ./testfixture $TESTDIR/testrunner.tcl fts5%
137   ./testfixture $TESTDIR/testrunner.tcl 'fts5*'
140 Strictly speaking, for a test to be run the pattern must match the script
141 filename, not including the directory, using the rules of Tcl's 
142 \[string match\] command. Except that before the matching is done, any "%"
143 characters specified as part of the pattern are transformed to "\*".
146 To run "all" tests (full + permutations):
149   ./testfixture $TESTDIR/testrunner.tcl all
152 <a name=binary_test_failures></a>
153 ## 2.3. Investigating Binary Test Failures
155 If a test fails, testrunner.tcl reports name of the Tcl test script and, if
156 applicable, the name of the permutation, to stdout. This information can also
157 be retrieved from either *testrunner.log* or *testrunner.db*.
159 If there is no permutation, the individual test script may be run with:
162   ./testfixture $PATH_TO_SCRIPT
165 Or, if the failure occured as part of a permutation:
168   ./testfixture $TESTDIR/testrunner.tcl $PERMUTATION $PATH_TO_SCRIPT
171 TODO: An example instead of "$PERMUTATION" and $PATH\_TO\_SCRIPT?
173 <a name=source_code_tests></a>
174 # 3. Source Code Tests
176 The commands described in this section invoke the C compiler to build 
177 binaries from the source tree, then use those binaries to run Tcl and
178 other tests. The advantages of this are that:
180   *  it is possible to test multiple build configurations with a single
181      command, and 
183   *  it ensures that tests are always run using binaries created with the
184      same set of compiler options.
186 The testrunner.tcl commands described in this section may be run using
187 either a *testfixture* (or testfixture.exe) build, or with any other Tcl
188 shell that supports SQLite 3.31.1 or newer via "package require sqlite3".
190 TODO: ./configure + Makefile.msc build systems.
192 <a name=commands_to_run_tests></a>
193 ## 3.1. Commands to Run SQLite Tests
195 The **mdevtest** command is equivalent to running the veryquick tests and
196 the [make fuzztest] target once for each of two --enable-all builds - one 
197 with debugging enabled and one without:
200   tclsh $TESTDIR/testrunner.tcl mdevtest
203 In other words, it is equivalent to running:
206   $TOP/configure --enable-all --enable-debug
207   make fuzztest
208   make testfixture
209   ./testfixture $TOP/test/testrunner.tcl veryquick
211   # Then, after removing files created by the tests above:
212   $TOP/configure --enable-all OPTS="-O0"
213   make fuzztest
214   make testfixture
215   ./testfixture $TOP/test/testrunner.tcl veryquick
218 The **sdevtest** command is identical to the mdevtest command, except that the
219 second of the two builds is a sanitizer build. Specifically, this means that
220 OPTS="-fsanitize=address,undefined" is specified instead of OPTS="-O0":
223   tclsh $TESTDIR/testrunner.tcl sdevtest
226 The **release** command runs lots of tests under lots of builds. It runs
227 different combinations of builds and tests depending on whether it is run
228 on Linux, Windows or OSX. Refer to *testrunner\_data.tcl* for the details
229 of the specific tests run.
232   tclsh $TESTDIR/testrunner.tcl release
235 As with <a href=#source code tests>source code tests</a>, one or more patterns
236 may be appended to any of the above commands (mdevtest, sdevtest or release).
237 In that case only Tcl tests (no fuzz or other tests) that match the specified
238 pattern are run. For example, to run the just the Tcl rtree tests in all 
239 builds and configurations supported by "release":
242   tclsh $TESTDIR/testrunner.tcl release rtree%
245 <a name=zipvfs_tests></a>
246 ## 3.2. Running ZipVFS Tests
248 testrunner.tcl can build a zipvfs-enabled testfixture and use it to run
249 tests from the Zipvfs project with the following command:
252   tclsh $TESTDIR/testrunner.tcl --zipvfs $PATH_TO_ZIPVFS
255 This can be combined with any of "mdevtest", "sdevtest" or "release" to
256 test both SQLite and Zipvfs with a single command:
259   tclsh $TESTDIR/testrunner.tcl --zipvfs $PATH_TO_ZIPVFS mdevtest
262 <a name=source_code_test_failures></a>
263 ## 3.3. Investigating Source Code Test Failures
265 Investigating a test failure that occurs during source code testing is a
266 two step process:
268   1. Recreating the build configuration in which the test failed, and
270   2. Re-running the actual test.
272 To recreate a build configuration, use the testrunner.tcl **script** command
273 to create a build script. A build script is a bash script on Linux or OSX, or
274 a dos \*.bat file on windows. For example:
277   # Create a script that recreates build configuration "Device-One" on 
278   # Linux or OSX:
279   tclsh $TESTDIR/testrunner.tcl script Device-One > make.sh 
281   # Create a script that recreates build configuration "Have-Not" on Windows:
282   tclsh $TESTDIR/testrunner.tcl script Have-Not > make.bat 
285 The generated bash or \*.bat file script accepts a single argument - a makefile
286 target to build. This may be used either to run a [make] command test directly,
287 or else to build a testfixture (or testfixture.exe) binary with which to
288 run a Tcl test script, as <a href=#binary_test_failures>described above</a>.
290 <a name=testrunner_options></a>
291 # 4. Extra testrunner.tcl Options
293 The testrunner.tcl script options in this section may be used with both source
294 code and binary tests.
296 The **--buildonly** option instructs testrunner.tcl just to build the binaries
297 required by a test, not to run any actual tests. For example:
300   # Build binaries required by release test.
301   tclsh $TESTDIR/testrunner.tcl --buildonly release"
304 The **--dryrun** option prevents testrunner.tcl from building any binaries
305 or running any tests. Instead, it just writes the shell commands that it
306 would normally execute into the testrunner.log file. Example:
309   # Log the shell commmands that make up the mdevtest test.
310   tclsh $TESTDIR/testrunner.tcl --dryrun mdevtest"
313 <a name=cpu_cores></a>
314 # 5. Controlling CPU Core Utilization
316 When running either binary or source code tests, testrunner.tcl reports the
317 number of jobs it intends to use to stdout. e.g.
320   $ ./testfixture $TESTDIR/testrunner.tcl
321   splitting work across 16 jobs
322   ... more output ...
325 By default, testfixture.tcl attempts to set the number of jobs to the number 
326 of real cores on the machine. This can be overridden using the "--jobs" (or -j)
327 switch:
330   $ ./testfixture $TESTDIR/testrunner.tcl --jobs 8
331   splitting work across 8 jobs
332   ... more output ...
335 The number of jobs may also be changed while an instance of testrunner.tcl is
336 running by exucuting the following command from the directory containing the
337 testrunner.log and testrunner.db files:
340   $ ./testfixture $TESTDIR/testrunner.tcl njob $NEW_NUMBER_OF_JOBS