3 # Documentation for this script. This may be output to stderr
4 # if the script is invoked incorrectly. See the [process_options]
8 This
Tcl script is used to test the various configurations required
9 before releasing a new version. Supported command line
options (all
12 --buildonly (Just build testfixture
- do not run
)
13 --config CONFIGNAME
(Run only CONFIGNAME
)
14 --dryrun (Print what would have happened
)
15 -f|
--force (Run even
if uncommitted changes
)
16 --info (Show diagnostic
info)
17 --jobs N
(Use N processes
- default 1)
18 --keep (Delete no files
after each test run
)
19 --msvc (Use MSVC as the compiler
)
20 --platform PLATFORM
(see below
)
21 --progress (Show progress messages
)
22 --quick (Run
"veryquick.test" only
)
23 --veryquick (Run
"make smoketest" only
)
24 --with-tcl
=DIR
(Use TCL build at DIR
)
26 The script determines the
default value
for --platform using the
27 $tcl_platform(os
) and
$tcl_platform(machine
) variables. Supported
28 platforms are
"Linux-x86", "Linux-x86_64", "Darwin-i386",
29 "Darwin-x86_64", "Windows NT-intel", and
"Windows NT-amd64".
31 Every test begins with a fresh run of the configure script at the top
32 of the SQLite
source tree.
35 # Return a timestamp of the form HH:MM:SS
38 return [clock format [clock seconds
] -format %H
:%M
:%S
]
41 # Omit comments (text between # and \n) in a long multi-line string.
43 proc strip_comments
{in
} {
44 regsub -all {#[^\n]*\n} $in {} out
48 array set ::Configs [strip_comments
{
51 --disable-amalgamation
--disable-shared
55 CC
=clang
-fsanitize=undefined
64 # The "Have-Not" configuration sets all possible -UHAVE_feature options
65 # in order to verify that the code works even on platforms that lack
66 # these support services.
72 -DHAVE_MALLOC_USABLE_SIZE=0
79 -DSQLITE_ENABLE_UNLOCK_NOTIFY
81 -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
85 -DSQLITE_SECURE_DELETE=1
88 "Update-Delete-Limit" {
90 -DSQLITE_DEFAULT_FILE_FORMAT=4
91 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
92 -DSQLITE_ENABLE_STMT_SCANSTATUS
93 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS
94 -DSQLITE_ENABLE_CURSOR_HINTS
99 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1
100 -DSQLITE_ENABLE_FTS3=1
101 -DSQLITE_ENABLE_RTREE=1
102 -DSQLITE_ENABLE_MEMSYS5=1
103 -DSQLITE_ENABLE_MEMSYS3=1
104 -DSQLITE_ENABLE_COLUMN_METADATA=1
105 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
106 -DSQLITE_SECURE_DELETE=1
108 -DSQLITE_ENABLE_ATOMIC_WRITE=1
109 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
110 -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
111 -DSQLITE_ENABLE_STAT4
112 -DSQLITE_ENABLE_STMT_SCANSTATUS
113 --enable-json
1 --enable-fts
5 --enable-session
120 -DSQLITE_MUTEX_NOOP=1
121 -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
122 -DSQLITE_ENABLE_FTS3=1
123 -DSQLITE_ENABLE_RTREE=1
124 -DSQLITE_ENABLE_MEMSYS5=1
125 -DSQLITE_ENABLE_COLUMN_METADATA=1
126 -DSQLITE_ENABLE_STAT4
127 -DSQLITE_ENABLE_HIDDEN_COLUMNS
128 -DSQLITE_MAX_ATTACHED=125
129 -DSQLITE_MUTATION_TEST
133 -DSQLITE_ENABLE_FTS4=1
134 -DSQLITE_ENABLE_RTREE=1
135 -DSQLITE_ENABLE_STAT4
137 -DSQLITE_MAX_ATTACHED=125
138 -DLONGDOUBLE_TYPE=double
144 -DSQLITE_DEFAULT_AUTOVACUUM=1
145 -DSQLITE_DEFAULT_CACHE_SIZE=64
146 -DSQLITE_DEFAULT_PAGE_SIZE=1024
147 -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=32
148 -DSQLITE_DISABLE_LFS=1
149 -DSQLITE_ENABLE_ATOMIC_WRITE=1
150 -DSQLITE_ENABLE_IOTRACE=1
151 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
152 -DSQLITE_MAX_PAGE_SIZE=4096
153 -DSQLITE_OMIT_LOAD_EXTENSION=1
154 -DSQLITE_OMIT_PROGRESS_CALLBACK=1
155 -DSQLITE_OMIT_VIRTUALTABLE=1
156 -DSQLITE_ENABLE_HIDDEN_COLUMNS
157 -DSQLITE_TEMP_STORE=3
161 -DSQLITE_4_BYTE_ALIGNED_MALLOC=1
162 -DSQLITE_DEFAULT_AUTOVACUUM=1
163 -DSQLITE_DEFAULT_CACHE_SIZE=1000
164 -DSQLITE_DEFAULT_LOCKING_MODE=0
165 -DSQLITE_DEFAULT_PAGE_SIZE=1024
166 -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=1000
167 -DSQLITE_DISABLE_LFS=1
168 -DSQLITE_ENABLE_FTS3=1
169 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
170 -DSQLITE_ENABLE_RTREE=1
171 -DSQLITE_MAX_COMPOUND_SELECT=50
172 -DSQLITE_MAX_PAGE_SIZE=32768
173 -DSQLITE_OMIT_TRACE=1
174 -DSQLITE_TEMP_STORE=3
175 -DSQLITE_THREADSAFE=2
176 --enable-json
1 --enable-fts
5 --enable-session
180 -DSQLITE_ENABLE_LOCKING_STYLE=1
192 -DSQLITE_DEFAULT_CACHE_SIZE=1000
193 -DSQLITE_DEFAULT_CKPTFULLFSYNC=1
194 -DSQLITE_DEFAULT_MEMSTATUS=1
195 -DSQLITE_DEFAULT_PAGE_SIZE=1024
196 -DSQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS=1
197 -DSQLITE_ENABLE_API_ARMOR=1
198 -DSQLITE_ENABLE_AUTO_PROFILE=1
199 -DSQLITE_ENABLE_FLOCKTIMEOUT=1
200 -DSQLITE_ENABLE_FTS3=1
201 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1
202 -DSQLITE_ENABLE_FTS3_TOKENIZER=1
203 if:os
=="Darwin" -DSQLITE_ENABLE_LOCKING_STYLE=1
204 -DSQLITE_ENABLE_PERSIST_WAL=1
205 -DSQLITE_ENABLE_PURGEABLE_PCACHE=1
206 -DSQLITE_ENABLE_RTREE=1
207 -DSQLITE_ENABLE_SNAPSHOT=1
208 # -DSQLITE_ENABLE_SQLLOG=1
209 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
210 -DSQLITE_MAX_LENGTH=2147483645
211 -DSQLITE_MAX_VARIABLE_NUMBER=500000
212 # -DSQLITE_MEMDEBUG=1
214 -DSQLITE_OMIT_AUTORESET=1
215 -DSQLITE_OMIT_LOAD_EXTENSION=1
216 -DSQLITE_PREFER_PROXY_LOCKING=1
217 -DSQLITE_SERIES_CONSTRAINT_VERIFY=1
218 -DSQLITE_THREADSAFE=2
220 -DSQLITE_WRITE_WALFRAME_PREBUFFERED=1
223 --enable-json
1 --enable-fts
5
226 -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
227 -DSQLITE_MAX_ATTACHED=62
230 -DSQLITE_DEFAULT_FILE_FORMAT=4
231 -DSQLITE_MAX_ATTACHED=30
232 -DSQLITE_ENABLE_COLUMN_METADATA
235 -DSQLITE_ENABLE_FTS4_PARENTHESIS
236 -DSQLITE_DISABLE_FTS4_DEFERRED
237 -DSQLITE_ENABLE_RTREE
238 --enable-json
1 --enable-fts
5
241 -DSQLITE_TEST_REALLOC_STRESS=1
242 -DSQLITE_OMIT_LOOKASIDE=1
246 -DSQLITE_ENABLE_STAT4
248 -DSQLITE_ENABLE_RTREE
249 -DSQLITE_ENABLE_HIDDEN_COLUMNS
253 # The next group of configurations are used only by the
254 # Failure-Detection platform. They are all the same, but we need
255 # different names for them all so that they results appear in separate
266 array set ::Platforms [strip_comments
{
268 "Check-Symbols" checksymbols
270 "Debug-One" "mptest test"
273 "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test"
274 "Update-Delete-Limit" test
275 "Extra-Robustness" test
280 "Sanitize" {QUICKTEST_OMIT
=func4.test
,nan.test test
}
281 "Device-One" fulltest
282 "Default" "threadtest fulltest"
283 "Valgrind" valgrindtest
288 "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test"
291 "Default" "threadtest fulltest"
294 "Locking-Style" "mptest test"
296 "Apple" "threadtest fulltest"
299 "Locking-Style" "mptest test"
301 "Apple" "threadtest fulltest"
306 "Default" "mptest fulltestonly"
311 "Default" "mptest fulltestonly"
314 # The Failure-Detection platform runs various tests that deliberately
315 # fail. This is used as a test of this script to verify that this script
316 # correctly identifies failures.
319 Fail0
"TEST_FAILURE=0 test"
320 Sanitize
"TEST_FAILURE=1 test"
321 Fail2
"TEST_FAILURE=2 valgrindtest"
322 Fail3
"TEST_FAILURE=3 valgrindtest"
323 Fail4
"TEST_FAILURE=4 test"
324 FuzzFail1
"TEST_FAILURE=5 test"
325 FuzzFail2
"TEST_FAILURE=5 valgrindtest"
330 # End of configuration section.
331 #########################################################################
332 #########################################################################
334 # Configuration verification: Check that each entry in the list of configs
335 # specified for each platforms exists.
337 foreach {key value
} [array get
::Platforms] {
338 foreach {v t
} $value {
339 if {0==[info exists
::Configs($v)]} {
340 puts stderr
"No such configuration: \"$v\""
346 # Output log. Disabled for slave interpreters.
348 if {[lindex $argv end
]!="--slave"} {
349 set LOG
[open releasetest-out.txt w
]
357 puts -nonewline $::LOG $txt
365 puts $LOG "$argv0 $argv"
366 set tm0
[clock format [clock seconds
] -format {%Y-
%m-
%d
%H
:%M
:%S
} -gmt 1]
367 puts $LOG "start-time: $tm0 UTC"
380 # Open the file $logfile and look for a report on the number of errors
381 # and the number of test cases run. Add these values to the global
382 # $::NERRCASE and $::NTESTCASE variables.
384 # If any errors occur, then write into $errmsgVar the text of an appropriate
385 # one-line error message to show on the output.
387 proc count_tests_and_errors
{logfile rcVar errmsgVar
} {
388 if {$::DRYRUN} return
389 upvar 1 $rcVar rc
$errmsgVar errmsg
390 set fd
[open $logfile rb
]
394 if {[regexp {(\d
+) errors out of
(\d
+) tests
} $line all nerr ntest
]} {
395 incr ::NERRCASE $nerr
396 incr ::NTESTCASE $ntest
403 if {[regexp {runtime
error: +(.
*)} $line all msg
]} {
404 # skip over "value is outside range" errors
405 if {[regexp {value .
* is outside the range of representable
} $line]} {
415 if {[regexp {fatal
error +(.
*)} $line all msg
]} {
422 if {[regexp {ERROR SUMMARY
: (\d
+) errors.
*} $line all cnt
] && $cnt>0} {
429 if {[regexp {^VERSION
: 3\.
\d
+.
\d
+} $line]} {
430 set v
[string range
$line 9 end
]
431 if {$::SQLITE_VERSION eq
""} {
432 set ::SQLITE_VERSION $v
433 } elseif
{$::SQLITE_VERSION ne
$v} {
435 set errmsg
"version conflict: {$::SQLITE_VERSION} vs. {$v}"
443 set errmsg
"Build failed"
447 set errmsg
"Test did not complete"
448 if {[file readable core
]} {
449 append errmsg
" - core file exists"
454 #--------------------------------------------------------------------------
455 # This command is invoked as the [main] routine for scripts run with the
458 # For each test (i.e. "configure && make test" execution), the master
459 # process spawns a process with the --slave option. It writes two lines
460 # to the slaves stdin. The first contains a single boolean value - the
461 # value of ::TRACE to use in the slave script. The second line contains a
462 # list in the same format as each element of the list passed to the
463 # [run_all_test_suites] command in the master process.
465 # The slave then runs the "configure && make test" commands specified. It
466 # exits successfully if the tests passes, or with a non-zero error code
469 proc run_slave_test
{} {
470 # Read global vars configuration from stdin.
472 foreach {::TRACE ::MSVC ::DRYRUN ::KEEPFILES} $V {}
474 # Read the test-suite configuration from stdin.
476 foreach {title dir configOpts testtarget makeOpts cflags opts
} $T {}
478 # Create and switch to the test directory.
479 set normaldir
[file normalize
$dir]
480 set ::env(SQLITE_TMPDIR
) $normaldir
481 trace_cmd
file mkdir
$dir
483 catch {file delete core
}
484 catch {file delete test.log
}
486 # Run the "./configure && make" commands.
488 set rc
[catch [configureCommand
$configOpts]]
490 if {[info exists
::env(TCLSH_CMD
)]} {
491 set savedEnv
(TCLSH_CMD
) $::env(TCLSH_CMD
)
493 unset -nocomplain savedEnv
(TCLSH_CMD
)
495 set ::env(TCLSH_CMD
) [file nativename
[info nameofexecutable
]]
496 set rc
[catch [makeCommand
$testtarget $makeOpts $cflags $opts]]
497 if {[info exists savedEnv
(TCLSH_CMD
)]} {
498 set ::env(TCLSH_CMD
) $savedEnv(TCLSH_CMD
)
500 unset -nocomplain ::env(TCLSH_CMD
)
504 # Clean up lots of extra files if --keep was not specified.
505 if {$::KEEPFILES==0} { cleanup
$normaldir }
507 # Exis successfully if the test passed, or with a non-zero error code
512 # This command is invoked in the master process each time a slave
513 # file-descriptor is readable.
515 proc slave_fileevent
{fd T tm1
} {
517 foreach {title dir configOpts testtarget makeOpts cflags opts
} $T {}
520 fconfigure $fd -blocking 1
521 set rc
[catch { close $fd }]
524 set logfile
[file join $dir test.log
]
525 if {[file exists
$logfile]} {
526 count_tests_and_errors
[file join $dir test.log
] rc errmsg
527 } elseif
{$rc==0 && !$::DRYRUN} {
529 set errmsg
"no test.log file..."
533 set tm2
[clock seconds
]
534 set hours
[expr {($tm2-$tm1)/3600}]
535 set minutes
[expr {(($tm2-$tm1)/60)%60}]
536 set seconds
[expr {($tm2-$tm1)%60}]
537 set tm
[format (%02d
:%02d
:%02d
) $hours $minutes $seconds]
546 set n
[string length
$title]
547 if {$::PROGRESS_MSGS} {
548 PUTS
"finished: ${title}[string repeat . [expr {53-$n}]] $status $tm"
550 PUTS
"${title}[string repeat . [expr {63-$n}]] $status $tm"
552 if {$errmsg!=""} {PUTS
" $errmsg"}
559 if {[string trim
$line] != ""} {
560 puts "Trace : $title - \"$line\""
565 #--------------------------------------------------------------------------
566 # The only argument passed to this function is a list of test-suites to
567 # run. Each "test-suite" is itself a list consisting of the following
570 # * Test title (for display).
571 # * The name of the directory to run the test in.
572 # * The argument for [configureCommand]
573 # * The first argument for [makeCommand]
574 # * The second argument for [makeCommand]
575 # * The third argument for [makeCommand]
577 proc run_all_test_suites
{alltests
} {
583 while {[llength $tests]>0 ||
$G(nJob
)>0} {
584 if {$G(nJob
)>=$::JOBS ||
[llength $tests]==0} {
588 if {[llength $tests]>0} {
589 set T
[lindex $tests 0]
590 set tests
[lrange $tests 1 end
]
591 foreach {title dir configOpts testtarget makeOpts cflags opts
} $T {}
592 if {$::PROGRESS_MSGS && !$::TRACE} {
593 set n
[string length
$title]
594 PUTS
"starting: ${title} at [now]"
600 set tm1
[clock seconds
]
602 set script
[file normalize
[info script
]]
603 set fd
[open "|[info nameofexecutable] $script --slave" r
+]
604 fconfigure $fd -blocking 0
605 fileevent $fd readable
[list slave_fileevent
$fd $T $tm1]
606 puts $fd [list $::TRACE $::MSVC $::DRYRUN $::KEEPFILES]
607 puts $fd [list {*}$T]
613 proc add_test_suite
{listvar name testtarget config
} {
614 upvar $listvar alltests
616 # Tcl variable $opts is used to build up the value used to set the
617 # OPTS Makefile variable. Variable $cflags holds the value for
618 # CFLAGS. The makefile will pass OPTS to both gcc and lemon, but
619 # CFLAGS is only passed to gcc.
622 set cflags
[expr {$::MSVC ?
"-Zi" : "-g"}]
624 set title
${name
}($testtarget)
625 set configOpts
$::WITHTCL
628 regsub -all {#[^\n]*\n} $config \n config
629 foreach arg
$config {
634 if {[regexp {^
-[UD
]} $arg]} {
636 } elseif
{[regexp {^
[A-Z
]+=} $arg]} {
637 lappend testtarget
$arg
638 } elseif
{[regexp {^
if:([a-z
]+)(.
*)} $arg all key tail
]} {
639 # Arguments of the form 'if:os=="Linux"' will cause the subsequent
640 # argument to be skipped if the $tcl_platform(os) is not "Linux", for
642 set skip
[expr !(\$::tcl_platform($key)$tail)]
643 } elseif
{[regexp {^
--(enable|disable
)-} $arg]} {
645 if {$arg eq
"--disable-amalgamation"} {
646 lappend makeOpts USE_AMALGAMATION
=0
649 if {$arg eq
"--disable-shared"} {
650 lappend makeOpts USE_CRT_DLL
=0 DYNAMIC_SHELL
=0
653 if {$arg eq
"--enable-fts5"} {
654 lappend opts
-DSQLITE_ENABLE_FTS5
657 if {$arg eq
"--enable-json1"} {
658 lappend opts
-DSQLITE_ENABLE_JSON1
661 if {$arg eq
"--enable-shared"} {
662 lappend makeOpts USE_CRT_DLL
=1 DYNAMIC_SHELL
=1
666 lappend configOpts
$arg
673 if {[regexp -- {^
-O(\d
+)$} $arg all level
]} then
{
674 lappend makeOpts OPTIMIZATIONS
=$level
682 # Disable sync to make testing faster.
684 lappend opts
-DSQLITE_NO_SYNC=1
686 # Some configurations already set HAVE_USLEEP; in that case, skip it.
688 if {[lsearch -regexp $opts {^
-DHAVE_USLEEP(?
:=|
$)}]==-1} {
689 lappend opts
-DHAVE_USLEEP=1
692 # Add the define for this platform.
694 if {$::tcl_platform(platform
)=="windows"} {
695 lappend opts
-DSQLITE_OS_WIN=1
697 lappend opts
-DSQLITE_OS_UNIX=1
700 # Set the sub-directory to use.
702 set dir
[string tolower
[string map
{- _
" " _
} $name]]
704 # Join option lists into strings, using space as delimiter.
706 set makeOpts
[join $makeOpts " "]
707 set cflags
[join $cflags " "]
708 set opts
[join $opts " "]
710 lappend alltests
[list \
711 $title $dir $configOpts $testtarget $makeOpts $cflags $opts]
714 # The following procedure returns the "configure" command to be exectued for
715 # the current platform, which may be Windows (via MinGW, etc).
717 proc configureCommand
{opts
} {
718 if {$::MSVC} return [list]; # This is not needed for MSVC.
719 set result
[list trace_cmd
exec]
720 if {$::tcl_platform(platform
)=="windows"} {
723 lappend result
$::SRCDIR/configure
--enable-load
-extension
724 foreach x
$opts {lappend result
$x}
725 lappend result
>& test.log
728 # The following procedure returns the "make" command to be executed for the
729 # specified targets, compiler flags, and options.
731 proc makeCommand
{ targets makeOpts cflags opts
} {
732 set result
[list trace_cmd
exec]
734 set nmakeDir
[file nativename
$::SRCDIR]
735 set nmakeFile
[file nativename
[file join $nmakeDir Makefile.msc
]]
736 lappend result nmake
/f
$nmakeFile TOP
=$nmakeDir
737 if {[regexp {USE_STDCALL
=1} $cflags]} {
738 lappend result USE_STDCALL
=1
743 foreach makeOpt
$makeOpts {
744 lappend result
$makeOpt
747 foreach target
$targets {
748 lappend result
$target
750 lappend result CFLAGS
=$cflags OPTS
=$opts >>& test.log
753 # The following procedure prints its arguments if ::TRACE is true.
754 # And it executes the command of its arguments in the calling context
755 # if ::DRYRUN is false.
757 proc trace_cmd
{args
} {
763 set res
[uplevel 1 $args]
769 # This proc processes the command line options passed to this script.
770 # Currently the only option supported is "-makefile", default
771 # "releasetest.mk". Set the ::MAKEFILE variable to the value of this
774 proc process_options
{argv
} {
775 set ::SRCDIR [file normalize
[file dirname
[file dirname
$::argv0]]]
782 set ::PROGRESS_MSGS 0
785 set ::KEEPFILES 0 ;# Keep extra files after test run
787 set platform
$::tcl_platform(os
)-$::tcl_platform(machine
)
789 for {set i
0} {$i < [llength $argv]} {incr i
} {
790 set x
[lindex $argv $i]
791 if {[regexp {^
--[a-z
]} $x]} {set x
[string range
$x 1 end
]}
798 # Undocumented legacy option: --srcdir DIRECTORY
800 # DIRECTORY is the root of the SQLite checkout. This sets the
801 # SRCDIR global variable. But that variable is already set
802 # automatically so there really is no reason to have this option.
806 set ::SRCDIR [file normalize
[lindex $argv $i]]
811 set platform
[lindex $argv $i]
816 set ::JOBS [lindex $argv $i]
820 set ::PROGRESS_MSGS 1
832 set config
[lindex $argv $i]
857 PUTS
"Command-line Options:"
858 PUTS
" --srcdir $::SRCDIR"
859 PUTS
" --platform [list $platform]"
860 PUTS
" --config [list $config]"
862 if {$::QUICK==1} {PUTS
" --quick"}
863 if {$::QUICK==2} {PUTS
" --veryquick"}
865 if {$::MSVC} {PUTS
" --msvc"}
866 if {$::BUILDONLY} {PUTS
" --buildonly"}
867 if {$::DRYRUN} {PUTS
" --dryrun"}
868 if {$::TRACE} {PUTS
" --trace"}
869 PUTS
"\nAvailable --platform options:"
870 foreach y
[lsort [array names
::Platforms]] {
873 PUTS
"\nAvailable --config options:"
874 foreach y
[lsort [array names
::Configs]] {
881 lappend ::EXTRACONFIG [lindex $argv $i]
897 lappend ::EXTRACONFIG [lindex $argv $i]
902 PUTSERR
[string trim
$::USAGE_MESSAGE]
908 if {0==[info exists
::Platforms($platform)]} {
909 PUTS
"Unknown platform: $platform"
910 PUTSNNL
"Set the -platform option to "
912 foreach p
[array names
::Platforms] {
913 lappend print
"\"$p\""
915 lset print end
"or [lindex $print end]"
916 PUTS
"[join $print {, }]."
921 if {[llength $config]==1} {lappend config fulltest
}
922 set ::CONFIGLIST $config
926 foreach {target zConfig
} [lreverse
$::Platforms($platform)] {
927 append ::CONFIGLIST [format " %-25s %s\n" \
928 [list $zConfig] [list $target]]
931 set ::CONFIGLIST $::Platforms($platform)
934 PUTS
"Running the following test configurations for $platform:"
935 PUTS
" [string trim $::CONFIGLIST]"
937 if {$::PROGRESS_MSGS} {PUTSNNL
" --progress"}
938 if {$::DRYRUN} {PUTSNNL
" --dryrun"}
939 if {$::BUILDONLY} {PUTSNNL
" --buildonly"}
940 if {$::MSVC} {PUTSNNL
" --msvc"}
942 1 {PUTSNNL
" --quick"}
943 2 {PUTSNNL
" --veryquick"}
945 if {$::JOBS>1} {PUTSNNL
" --jobs $::JOBS"}
949 # Check to see if there are uncommitted changes in the SQLite source
950 # checkout. Exit if there are. Except: Do nothing if the --force
951 # flag is used. Also, ignore this test if the fossil binary is
952 # unavailable, or if the source tree is not a valid fossil checkout.
954 proc check_uncommitted
{} {
958 if {[catch {exec fossil changes
} res
]==0 && [string trim
$res]!=""} {
959 puts "ERROR: The check-out contains uncommitted changes:"
961 puts "Use the -f or --force options to override"
967 # A test run has just finished in directory $dir. This command deletes all
968 # non-essential files from the directory. Specifically, everything except
970 # * The "testfixture" and "sqlite3" binaries,
971 # * The "test-out.log" and "test.log" log files.
975 set K
(testfixture.exe
) 1
978 set K
(test-out.txt
) 1
981 foreach f
[glob -nocomplain [file join $dir *]] {
982 set tail
[file tail
$f]
983 if {[info exists K
($tail)]==0} {
984 file delete
-force $f
994 # Process any command line options.
996 process_options
$argv
997 if {!$::DRYRUN} check_uncommitted
998 PUTS
[string repeat
* 79]
1004 set ::SQLITE_VERSION {}
1005 set STARTTIME
[clock seconds
]
1006 foreach {zConfig target
} $::CONFIGLIST {
1007 if {$::MSVC && ($zConfig eq
"Sanitize" ||
"checksymbols" in
$target
1008 ||
"valgrindtest" in
$target)} {
1009 PUTS
"Skipping $zConfig / $target for MSVC..."
1012 if {$target ne
"checksymbols"} {
1013 switch -- $::QUICK {
1014 1 {set target quicktest
}
1015 2 {set target smoketest
}
1018 set target testfixture
1019 if {$::tcl_platform(platform
)=="windows"} {
1024 set config_options
[concat $::Configs($zConfig) $::EXTRACONFIG]
1027 add_test_suite all
$zConfig $target $config_options
1029 # If the configuration included the SQLITE_DEBUG option, then remove
1030 # it and run veryquick.test. If it did not include the SQLITE_DEBUG option
1031 # add it and run veryquick.test.
1032 if {$target!="checksymbols" && $target!="valgrindtest"
1033 && $target!="fuzzoomtest" && !$::BUILDONLY && $::QUICK<2} {
1034 set debug_idx
[lsearch -glob $config_options -DSQLITE_DEBUG*]
1036 regsub -all {fulltest
[a-z
]*} $xtarget test xtarget
1037 regsub -all {fuzzoomtest
} $xtarget fuzztest xtarget
1038 if {$debug_idx < 0} {
1040 append config_options
" -DSQLITE_DEBUG=1 -DSQLITE_EXTRA_IFNULLROW=1"
1041 add_test_suite all
"${zConfig}_debug" $xtarget $config_options
1044 regsub { *-DSQLITE_MEMDEBUG[^
]* *} $config_options { } config_options
1045 regsub { *-DSQLITE_DEBUG[^
]* *} $config_options { } config_options
1046 add_test_suite all
"${zConfig}_ndebug" $xtarget $config_options
1051 run_all_test_suites
$all
1053 set elapsetime
[expr {[clock seconds
]-$STARTTIME}]
1054 set hr
[expr {$elapsetime/3600}]
1055 set min
[expr {($elapsetime/60)%60}]
1056 set sec
[expr {$elapsetime%60}]
1057 set etime
[format (%02d
:%02d
:%02d
) $hr $min $sec]
1058 if {$::JOBS>1} {append etime
" $::JOBS cores"}
1059 if {[catch {exec hostname
} HNAME
]==0} {append etime
" on $HNAME"}
1060 PUTS
[string repeat
* 79]
1061 incr ::NERRCASE $::NERR
1062 PUTS
"$::NERRCASE failures out of $::NTESTCASE tests in $etime"
1063 if {$::SQLITE_VERSION ne
""} {
1064 PUTS
"SQLite $::SQLITE_VERSION"