SQLite Test Harness #3 (hereafter "TH3") is one of three test harnesses used for testing SQLite. TH3 is designed to meet the following objectives:
TH3 runs on embedded platforms that lack the support infrastructure of workstations.
TH3 tests SQLite in an as-deployed configuration using only published and documented interfaces. In other words, TH3 tests the compiled object code, not the source code, thus verifying that no problems were introduced by compiler bugs. "Fly what you test and test what you fly."
TH3 checks SQLite's response to out-of-memory errors, disk I/O errors, and power loss during transaction commit.
TH3 exercises SQLite in a variety of run-time configurations (UTF8 vs UTF16, different pages sizes, varying journal modes, etc.)
TH3 achieves 100% branch test coverage (and 100% MC/DC) over the SQLite core. (Test coverage of the operating-system specific VFSes and extensions such as FTS and RTREE is less than 100%).
TH3 was originally written for validation testing only, but has subsequently been used for development testing and debugging as well, and has proven very helpful in those roles. A full-coverage test run for TH3 takes less than 4 minutes on a workstation and hence serves as a fast but effect regression test during day-to-day maintenance of the SQLite code base.
TH3 is a test program generator. The output of TH3 is a program written in ANSI-C and intended to be linked against the SQLite library under test. The generated test program is compiled and run on the target platform in order to verify correct operation of SQLite on that platform.
The inputs to TH3 are test modules written in C or SQL and small configuration files that determine how to initialize SQLite. The TH3 package includes over one thousand test modules and several dozen configuration files. New modules and configurations can be added to customize TH3 for specialized applications. Each time TH3 is run, it reads a subset of the available test modules and configuration files to generate a custom C program that performs all of the specified tests under all configurations. A complete test of SQLite normally involves running TH3 multiple times to generate multiple test programs covering different aspects of SQLite's operation, then linking all test programs against a common SQLite library and running them separately on the target platform. SQLite will be found to work if all test programs pass.
There are no arbitrary limits in TH3. One could generate a single test program that contained all test modules and configuration files. However, such a test program might be too large to deploy on embedded platforms. Hence, TH3 provides the ability to break the library of test modules up into smaller, more easily digested pieces.
Each individual test module might contain dozens, hundreds, or thousands of separate tests. The test modules can be written in C or as scripts of SQL or a mixture of the two. About two-thirds of the existing test modules are written SQL with the remainder either in pure C or a combination of C and SQL.
Each test module file contains a header which describes the circumstances under which the test is valid. For a particular configuration, only those modules that are compatible with the configuration are run.
The TH3 program generator is a TCL script named "mkth3.tcl". To generate a test program, one has merely to run this script and supply the names of files containing test modules and configurations on the command line. Test modules are files that use the ".test" suffix and configurations are files that use the ".cfg" suffix. A typical invocation of mkth3.tcl might look something like the following:
tclsh mkth3.tcl *.test *.cfg >testprog1.c
The output from the mkth3.tcl script is a C program that contains everything needed to run the tests - everything that is except for the SQLite library itself. The generated test program contains implementations for all of the support interfaces used by the test modules and it contains the main() routine that drives the tests. To convert the test program into a working executable, simply compile it against SQLite:
cc -o testprog1 testprog1.c sqlite3.c
The compilation step shown immediately above is merely representative. In a working installation, one would normally want to specify optimization parameters and compile-time switches on the compiler command line.
For testing on embedded systems, the mkth3.tcl script and the compiler steps shown above a typically performed on an ordinary workstation using a cross-compiler for the second step, then the resulting test program is transfer onto the device to be run.
Once the test program is generated, it is run with no arguments to perform the tests. Progress information as well as error diagnostics appear on standard output. (Alternative output arrangements can be made using a compile-time option for embedded devices that lack a standard output channel.) The program returns zero if there are no errors and non-zero if any problems were detected.
TH3 comes with additional TCL scripts (for example: "th3make" and "fulltest.tcl") which help to automate the process of running mkth3.tcl, compiling th3.c and sqlite3.c, running the resulting test programs, and analyzing the results. These other scripts are for convenience only and are not required in order to make use of TH3.
Using one particular subset of the available TH3 test modules (the "cov1" tests) SQLite obtained 100% branch test coverage and 100% MC/DC as measured by gcov on Linux x86 and x86_64 hardware. All releases of SQLite since version 3.6.17 (circa 2009-08-10) have been tested to this standard. The SQLite developers are committed to maintaining 100% branch coverage and MC/DC for all future releases of SQLite.
The cov1 test set used to obtain 100% branch test coverage are only a subset of the tests currently implemented using TH3. New test modules are added on a regular basis.
SQLite itself is in the public domain and can be used for any purpose. But TH3 is proprietary and requires a license. Members of the SQLite Consortium get free and unlimited access to TH3. Others can contact the SQLite developers for information on how to obtain a license to access and use TH3.
Licensees of TH3 are given read access to the software configuration management system used to manage TH3 and so can download the latest version of TH3 (or any historical version) whenever they like.
Even though open-source users do not have direct access to TH3, all users of SQLite benefit from TH3 indirectly since each version of SQLite is validated running TH3 on multiple platforms (Linux, Windows, WinRT, Mac, OpenBSD, Solaris Sparc) prior to release. So anyone using an official release of SQLite can deploy their application with the confidence of knowing that it has been tested using TH3. They simply cannot rerun those tests themselves without purchasing a TH3 license.