Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Updates to the TH3 documentation. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
ac3ef1f6aa4506b005bf35b255d79ebb |
User & Date: | drh 2018-05-19 14:21:54.463 |
Context
2018-05-22
| ||
15:28 | Update information on read-only WAL-mode databases to conform with the new capabilities added in version 3.22.0. (check-in: ba027764e3 user: drh tags: trunk) | |
2018-05-19
| ||
14:21 | Updates to the TH3 documentation. (check-in: ac3ef1f6aa user: drh tags: trunk) | |
2018-05-18
| ||
18:02 | Merge fixes from the 3.23 branch. (check-in: 45753832a8 user: drh tags: trunk) | |
Changes
Changes to pages/th3.in.
︙ | ︙ | |||
64 65 66 67 68 69 70 | [https://en.wikipedia.org/wiki/DO-178B|DO-178B]. <p>The first code for TH3 was laid down on 2008-09-25. An intense effort over the next 10 months resulted in TH3 achieving 100% MC/DC on 2009-07-25. The TH3 code continues to be improved and expanded. | | | | | | | | > | 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | [https://en.wikipedia.org/wiki/DO-178B|DO-178B]. <p>The first code for TH3 was laid down on 2008-09-25. An intense effort over the next 10 months resulted in TH3 achieving 100% MC/DC on 2009-07-25. The TH3 code continues to be improved and expanded. <p>As of 2018-05-19, the TH3 source tree consists and well over 500,000 lines of source code in 1709 separate files. <h1>Operation</h1> <p>TH3 is a test program generator. The output of TH3 is a program implemented in C-code 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.</p> <p>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 1,444 test modules and more than 47 configurations (as of 2018-05-19). 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 specified 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. </p> <p>There are no arbitrary limits in TH3. One could generate a single test program that contained all test modules and all configuration files. However, such a test program might be too large to deploy on embedded platforms. (As of 2018-05-19, a full-up TH3 test is over 850,000 lines and 58MB of C code.) TH3 provides the ability to break the library of test modules up into smaller, more easily digested pieces.</p> <p>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 in pure SQL with the remainder either in pure C or a combination of C and SQL. </p> <p>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. </p> <h1>Generating A Test Program</h1> |
︙ | ︙ | |||
141 142 143 144 145 146 147 | In a working installation, one would normally want to specify optimization parameters and compile-time switches on the compiler command line.</p> <p>For testing on embedded systems, the mkth3.tcl script and the compiler steps shown above are performed on an ordinary workstation using a cross-compiler, then the resulting test program is | | | 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | In a working installation, one would normally want to specify optimization parameters and compile-time switches on the compiler command line.</p> <p>For testing on embedded systems, the mkth3.tcl script and the compiler steps shown above are performed on an ordinary workstation using a cross-compiler, then the resulting test program is transferred onto the device to be run.</p> <p>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.</p> |
︙ | ︙ | |||
253 254 255 256 257 258 259 260 261 | TCL script used to automate TH3 testing on workstations. Multitest.tcl automatically compiles SQLite, then runs ./th3make repeatedly with a variety of alignments, and captures the output in a succinct summary screen. A typical multitest.tcl run generates output that looks like this: <codeblock> file mkdir sqlite3bld cd sqlite3bld | > > | < < < | > | | | > | < | | > | > > | | > > > > | | | < | | | | > | | | | | < | | | | > > | | | | | | | | | > > > > > > > > > > > > > > > > | 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 | TCL script used to automate TH3 testing on workstations. Multitest.tcl automatically compiles SQLite, then runs ./th3make repeatedly with a variety of alignments, and captures the output in a succinct summary screen. A typical multitest.tcl run generates output that looks like this: <codeblock> ./multitest.tcl -q --jobs 3 start-time: 2018-05-19 03:17:12 UTC file mkdir sqlite3bld cd sqlite3bld exec sh /ramdisk/sqlite/configure file copy -force config.h ../config.h exec make clean sqlite3.c file rename sqlite3.c ../sqlite3.c file rename sqlite3.h ../sqlite3.h exec make clean sqlite3.c OPTS=-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1 file rename sqlite3.c ../sqlite3udl.c exec make clean sqlite3.c OPTS=-DSQLITE_SMALL_STACK=1 file rename sqlite3.c ../sqlite3ss.c cd .. ******************************************************************************* t01: cov.rc.................................................... Ok (00:03:42) t02: cov.rc ++STAT4 ++DESERIALIZE -D_HAVE_SQLITE_CONFIG_H...... Ok (00:04:45) t03: vfs-cov.rc................................................ Ok (00:03:59) t04: demo.rc................................................... Ok (00:00:05) t07: test.rc ../th3private/*.test.............................. Ok (00:00:21) t08: test.rc ../th3private/*.test ++STAT4...................... Ok (00:01:41) t05: quick.rc.................................................. Ok (00:04:26) t09: quick.rc ~TEST_REALLOC_STRESS -funsigned-char............. Ok (00:05:39) t10: quick.rc ~THREADSAFE=0 -DLONGDOUBLE_TYPE=double........... Ok (00:03:24) t06: quick.rc extensions.rc -D_HAVE_SQLITE_CONFIG_H............ Ok (00:09:03) t11: quick.rc sqlite3ss.c ~MAX_ATTACHED=125.................... Ok (00:04:39) t12: quick.rc ~BYTEORDER=0 ++RTREE............................. Ok (00:07:28) t13: quick.rc ~DISABLE_INTRINSIC ++RTREE....................... Ok (00:07:31) t16: quick.rc ~TRACE_SIZE_LIMIT=15 cov1/main16.test............ Ok (00:00:22) t14: quick.rc ~DIRECT_OVERFLOW_READ -fsigned-char.............. Ok (00:04:35) t15: quick.rc ~UNTESTABLE ~EXTRA_IFNULLROW..................... Ok (00:01:44) t17: quick.rc ~MAX_MMAP_SIZE=0................................. Ok (00:04:46) t18: quick.rc ++NULL_TRIM ++OFFSET_SQL_FUNC.................... Ok (00:04:47) t19: quick.rc ++BATCH_ATOMIC_WRITE ++DESERIALIZE............... Ok (00:05:41) t20: lean1.rc quick.rc......................................... Ok (00:03:09) t22: test.rc alignment2.rc sqlite3udl.c........................ Ok (00:44:22) t21: test.rc alignment1.rc..................................... Ok (01:02:32) t23: memdebug1.rc extensions.rc................................ Ok (01:49:58) t25: valgrind1.rc -O3 extensions.rc............................ Ok (00:56:08) t24: memdebug2.rc extensions.rc................................ Ok (01:43:34) t27: test-ex1.rc............................................... Ok (00:45:00) t26: valgrind2.rc -O3 extensions.rc............................ Ok (01:02:52) t29: test-ex3.rc............................................... Ok (00:31:48) t28: test-ex2.rc............................................... Ok (01:12:03) t30: test-ex4.rc............................................... Ok (01:09:47) t32: test.rc alignment4.rc -m32 CC=clang....................... Ok (00:48:31) t31: test.rc alignment3.rc sqlite3udl.c........................ Ok (01:22:29) t34: test.rc alignment6.rc..................................... Ok (00:35:31) t33: test.rc alignment5.rc extensions.rc....................... Ok (00:59:33) t35: test.rc alignment7.rc..................................... Ok (00:44:10) t40: fast.rc alignment2.rc sqlite3udl.c........................ Ok (00:15:46) t39: fast.rc alignment1.rc extensions.rc -m32.................. Ok (00:33:19) t36: test.rc ~MUTATION_TEST.................................... Ok (00:35:45) t42: fast.rc alignment4.rc..................................... Ok (00:13:03) t43: fast.rc alignment5.rc..................................... Ok (00:13:32) t44: fast.rc alignment6.rc..................................... Ok (00:11:41) t41: fast.rc alignment3.rc sqlite3udl.c........................ Ok (00:26:31) t45: fast.rc alignment7.rc..................................... Ok (00:12:57) t46: fast.rc -fsanitize=undefined.............................. Ok (00:38:18) ******************************************************************************* 0 failures on 44 th3makes and 198583082 tests in (07:16:01) 3 cores on bella SQLite 3.24.0 2018-05-18 17:58:33 c6071ac99cfa4b6272ac4d739fc61a85acb544f6c1c2a </codeblock> <p>As can be seen above, a single run of multitest.tcl invokes th3make dozens of times and takes between 12 and 24 CPU hours. The middle section of the output shows the arguments to each individual th3make run and the result and elapse time for that th3make. All build products and output for the separate th3make runs are captures in subdirectories for post-test analysis. The two-line summary at the bottom shows the total number of errors and tests over all th3make runs and the total elapse time, together with the [SQLITE_SOURCE_ID] information for the version of SQLite that was tested. This summary information is recorded in the <a href="https://www.sqlite.org/checklists">release checklist</a> during final testing. <p>Abbreviations are applied in the multitest.tcl output so that each th3make invocation will fit on a single 80-column output line. The initial "th3make" verb is omitted. "~" is shorthand for "-DSQLITE_" and "++" is stands for "-DSQLITE_ENABLE". Hence, multitest.tcl output line <codeblock> quick.rc ~DISABLE_INTRINSIC ++RTREE </codeblock> <p>Really means <codeblock> th3make quick.rc -DSQLITE_DISABLE_INTRINSIC -DSQLITE_ENABLE_RTREE </codeblock> <h1>Test Coverage</h1> <p>Using one particular subset of the available TH3 test modules (the "cov1" tests) SQLite obtained [test coverage | 100% branch test coverage] and 100% [MC/DC] as measured by [http://gcc.gnu.org/onlinedocs/gcc/Gcov.html | gcov] |
︙ | ︙ |