blob: 77256301875110a465c285275e8cbc810a7b7869 [file] [log] [blame]
drh96110de2010-09-06 18:44:14 +00001
2set rcsid {$Id: $}
3
4# Documentation for this script. This may be output to stderr
5# if the script is invoked incorrectly. See the [process_options]
6# proc below.
7#
8set ::USAGE_MESSAGE {
9This Tcl script is used to test the various configurations required
10before releasing a new version. Supported command line options (all
11optional) are:
12
13 -makefile PATH-TO-MAKEFILE (default "releasetest.mk")
14 -platform PLATFORM (see below)
15 -quick BOOLEAN (default "0")
16
17The default value for -makefile is "./releasetest.mk".
18
19The script determines the default value for -platform using the
20$tcl_platform(os) and $tcl_platform(machine) variables. Supported
21platforms are "Linux-x86", "Linux-x86_64" and "Darwin-i386".
22
23If the -quick option is set to true, then the "veryquick.test" script
24is run for all compilation configurations. Otherwise, sometimes "all.test"
25is run, sometimes "veryquick.test".
26
27Almost any SQLite makefile (except those generated by configure - see below)
28should work. The following properties are required:
29
30 * The makefile should support the "fulltest" target.
31 * The makefile should support the variable "OPTS" as a way to pass
32 options from the make command line to lemon and the C compiler.
33
34More precisely, the following invocation must be supported:
35
36 make -f $::MAKEFILE fulltest OPTS="-DSQLITE_SECURE_DELETE=1 -DSQLITE_DEBUG=1"
37
38Makefiles generated by the sqlite configure program cannot be used as
39they do not respect the OPTS variable.
40
41Example Makefile contents:
42
43 ########################################################
44 TOP=/home/dan/work/sqlite/sqlite
45
46 TCL_FLAGS=-I/home/dan/tcl/include
47 LIBTCL=-L/home/dan/tcl/lib -ltcl
48
49 BCC = gcc
50 TCC = gcc -ansi -g $(CFLAGS)
51 NAWK = awk
52 AR = ar cr
53 RANLIB = ranlib
54 THREADLIB = -lpthread -ldl
55 include $(TOP)/main.mk
56 ########################################################
57}
58
59array set ::Configs {
60 "Default" {
61 -O2
62 }
dan56089732011-04-06 12:37:09 +000063 "Ftrapv" {
64 -O2 -ftrapv
65 -DSQLITE_MAX_ATTACHED=55
66 -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
67 }
drh96110de2010-09-06 18:44:14 +000068 "Unlock-Notify" {
69 -O2
70 -DSQLITE_ENABLE_UNLOCK_NOTIFY
71 -DSQLITE_THREADSAFE
drh96110de2010-09-06 18:44:14 +000072 -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
73 }
74 "Secure-Delete" {
75 -O2
76 -DSQLITE_SECURE_DELETE=1
77 -DSQLITE_SOUNDEX=1
78 }
79 "Update-Delete-Limit" {
80 -O2
81 -DSQLITE_DEFAULT_FILE_FORMAT=4
82 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
83 }
84 "Debug-One" {
85 -O2
86 -DSQLITE_DEBUG=1
87 -DSQLITE_MEMDEBUG=1
88 -DSQLITE_MUTEX_NOOP=1
89 -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
90 -DSQLITE_ENABLE_FTS3=1
91 -DSQLITE_ENABLE_RTREE=1
92 -DSQLITE_ENABLE_MEMSYS5=1
93 -DSQLITE_ENABLE_MEMSYS3=1
94 -DSQLITE_ENABLE_COLUMN_METADATA=1
95 }
drh96110de2010-09-06 18:44:14 +000096 "Device-One" {
97 -O2
98 -DSQLITE_DEBUG=1
drh96110de2010-09-06 18:44:14 +000099 -DSQLITE_DEFAULT_AUTOVACUUM=1
drh96110de2010-09-06 18:44:14 +0000100 -DSQLITE_DEFAULT_CACHE_SIZE=64
dan1c22a182010-09-13 11:29:02 +0000101 -DSQLITE_DEFAULT_PAGE_SIZE=1024
drh96110de2010-09-06 18:44:14 +0000102 -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=32
dan1c22a182010-09-13 11:29:02 +0000103 -DSQLITE_DISABLE_LFS=1
drh96110de2010-09-06 18:44:14 +0000104 -DSQLITE_ENABLE_ATOMIC_WRITE=1
dan1c22a182010-09-13 11:29:02 +0000105 -DSQLITE_ENABLE_IOTRACE=1
106 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
107 -DSQLITE_MAX_PAGE_SIZE=4096
108 -DSQLITE_OMIT_LOAD_EXTENSION=1
109 -DSQLITE_OMIT_PROGRESS_CALLBACK=1
110 -DSQLITE_OMIT_VIRTUALTABLE=1
111 -DSQLITE_TEMP_STORE=3
112 }
113 "Device-Two" {
114 -DSQLITE_4_BYTE_ALIGNED_MALLOC=1
115 -DSQLITE_DEFAULT_AUTOVACUUM=1
116 -DSQLITE_DEFAULT_CACHE_SIZE=1000
117 -DSQLITE_DEFAULT_LOCKING_MODE=0
118 -DSQLITE_DEFAULT_PAGE_SIZE=1024
119 -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=1000
120 -DSQLITE_DISABLE_LFS=1
121 -DSQLITE_ENABLE_FTS3=1
122 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1
123 -DSQLITE_ENABLE_RTREE=1
124 -DSQLITE_MAX_COMPOUND_SELECT=50
125 -DSQLITE_MAX_PAGE_SIZE=32768
dan1c22a182010-09-13 11:29:02 +0000126 -DSQLITE_OMIT_TRACE=1
127 -DSQLITE_TEMP_STORE=3
128 -DSQLITE_THREADSAFE=2
drh96110de2010-09-06 18:44:14 +0000129 }
130 "Locking-Style" {
131 -O2
132 -DSQLITE_ENABLE_LOCKING_STYLE=1
133 }
134 "OS-X" {
dan1c22a182010-09-13 11:29:02 +0000135 -DSQLITE_OMIT_LOAD_EXTENSION=1
136 -DSQLITE_DEFAULT_MEMSTATUS=0
137 -DSQLITE_THREADSAFE=2
138 -DSQLITE_OS_UNIX=1
drh96110de2010-09-06 18:44:14 +0000139 -DSQLITE_ENABLE_LOCKING_STYLE=1
dan1c22a182010-09-13 11:29:02 +0000140 -DUSE_PREAD=1
141 -DSQLITE_ENABLE_RTREE=1
142 -DSQLITE_ENABLE_FTS3=1
143 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1
144 -DSQLITE_DEFAULT_CACHE_SIZE=1000
145 -DSQLITE_MAX_LENGTH=2147483645
146 -DSQLITE_MAX_VARIABLE_NUMBER=500000
147 -DSQLITE_DEBUG=1
148 -DSQLITE_PREFER_PROXY_LOCKING=1
drh96110de2010-09-06 18:44:14 +0000149 }
150 "Extra-Robustness" {
151 -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
dan56089732011-04-06 12:37:09 +0000152 -DSQLITE_MAX_ATTACHED=62
drh96110de2010-09-06 18:44:14 +0000153 }
drh96110de2010-09-06 18:44:14 +0000154}
155
156array set ::Platforms {
157 Linux-x86_64 {
dane7152dc2011-07-07 08:19:16 +0000158 "Debug-One" "checksymbols test"
drh96110de2010-09-06 18:44:14 +0000159 "Secure-Delete" test
160 "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test"
drh96110de2010-09-06 18:44:14 +0000161 "Update-Delete-Limit" test
drh96110de2010-09-06 18:44:14 +0000162 "Extra-Robustness" test
dan1c22a182010-09-13 11:29:02 +0000163 "Device-Two" test
dan56089732011-04-06 12:37:09 +0000164 "Ftrapv" test
dand38bc1b2010-09-13 12:15:36 +0000165 "Default" "threadtest test"
drh96110de2010-09-06 18:44:14 +0000166 "Device-One" fulltest
167 }
dan1c22a182010-09-13 11:29:02 +0000168 Linux-i686 {
169 "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test"
dan1c22a182010-09-13 11:29:02 +0000170 "Device-One" test
dand38bc1b2010-09-13 12:15:36 +0000171 "Device-Two" test
172 "Default" "threadtest fulltest"
dan1c22a182010-09-13 11:29:02 +0000173 }
drh96110de2010-09-06 18:44:14 +0000174 Darwin-i386 {
dan1c22a182010-09-13 11:29:02 +0000175 "Locking-Style" test
dand38bc1b2010-09-13 12:15:36 +0000176 "OS-X" "threadtest fulltest"
drh96110de2010-09-06 18:44:14 +0000177 }
178}
179
dane7152dc2011-07-07 08:19:16 +0000180
drh96110de2010-09-06 18:44:14 +0000181# End of configuration section.
182#########################################################################
183#########################################################################
184
185foreach {key value} [array get ::Platforms] {
186 foreach {v t} $value {
187 if {0==[info exists ::Configs($v)]} {
188 puts stderr "No such configuration: \"$v\""
189 exit -1
190 }
191 }
192}
193
194proc run_test_suite {name testtarget config} {
195
196 # Tcl variable $opts is used to build up the value used to set the
197 # OPTS Makefile variable. Variable $cflags holds the value for
198 # CFLAGS. The makefile will pass OPTS to both gcc and lemon, but
199 # CFLAGS is only passed to gcc.
200 #
201 set cflags ""
202 set opts ""
203 foreach arg $config {
204 if {[string match -D* $arg]} {
205 lappend opts $arg
206 } else {
207 lappend cflags $arg
208 }
209 }
210
211 set cflags [join $cflags " "]
212 set opts [join $opts " "]
213 append opts " -DSQLITE_NO_SYNC=1 -DHAVE_USLEEP"
214
215 # Set the sub-directory to use.
216 #
217 set dir [string tolower [string map {- _ " " _} $name]]
218
219 if {$::tcl_platform(platform)=="windows"} {
220 append opts " -DSQLITE_OS_WIN=1"
221 } elseif {$::tcl_platform(platform)=="os2"} {
222 append opts " -DSQLITE_OS_OS2=1"
223 } else {
224 append opts " -DSQLITE_OS_UNIX=1"
225 }
226
227 # Run the test.
228 #
229 set makefile [file normalize $::MAKEFILE]
230 file mkdir $dir
231 puts -nonewline "Testing configuration \"$name\" (logfile=$dir/test.log)..."
232 flush stdout
233
234 set makecmd [concat \
235 [list exec make -C $dir -f $makefile clean] \
236 $testtarget \
237 [list CFLAGS=$cflags OPTS=$opts >& $dir/test.log] \
238 ]
drh96110de2010-09-06 18:44:14 +0000239
dan1c22a182010-09-13 11:29:02 +0000240 set tm1 [clock seconds]
241 set rc [catch $makecmd]
242 set tm2 [clock seconds]
243
244 set minutes [expr {($tm2-$tm1)/60}]
245 set seconds [expr {($tm2-$tm1)%60}]
246 puts -nonewline [format " (%d:%.2d) " $minutes $seconds]
drh96110de2010-09-06 18:44:14 +0000247 if {$rc} {
dan1c22a182010-09-13 11:29:02 +0000248 puts "FAILED."
drh96110de2010-09-06 18:44:14 +0000249 } else {
250 puts "Ok."
251 }
252}
253
254
255# This proc processes the command line options passed to this script.
256# Currently the only option supported is "-makefile", default
257# "releasetest.mk". Set the ::MAKEFILE variable to the value of this
258# option.
259#
260proc process_options {argv} {
261 set ::MAKEFILE releasetest.mk ;# Default value
262 set ::QUICK 0 ;# Default value
263 set platform $::tcl_platform(os)-$::tcl_platform(machine)
264
265 for {set i 0} {$i < [llength $argv]} {incr i} {
266 switch -- [lindex $argv $i] {
267 -makefile {
268 incr i
269 set ::MAKEFILE [lindex $argv $i]
270 }
271
272 -platform {
273 incr i
274 set platform [lindex $argv $i]
275 }
276
277 -quick {
278 incr i
279 set ::QUICK [lindex $argv $i]
280 }
281
282 default {
283 puts stderr ""
284 puts stderr [string trim $::USAGE_MESSAGE]
285 exit -1
286 }
287 }
288 }
289
290 set ::MAKEFILE [file normalize $::MAKEFILE]
291
292 if {0==[info exists ::Platforms($platform)]} {
293 puts "Unknown platform: $platform"
294 puts -nonewline "Set the -platform option to "
295 set print [list]
296 foreach p [array names ::Platforms] {
297 lappend print "\"$p\""
298 }
299 lset print end "or [lindex $print end]"
300 puts "[join $print {, }]."
301 exit
302 }
303
304 set ::CONFIGLIST $::Platforms($platform)
305 puts "Running the following configurations for $platform:"
306 puts " [string trim $::CONFIGLIST]"
307}
308
309# Main routine.
310#
311proc main {argv} {
312
313 # Process any command line options.
314 process_options $argv
315
316 foreach {zConfig target} $::CONFIGLIST {
317 if {$::QUICK} {set target test}
318 set config_options $::Configs($zConfig)
319
320 run_test_suite $zConfig $target $config_options
321
322 # If the configuration included the SQLITE_DEBUG option, then remove
323 # it and run veryquick.test. If it did not include the SQLITE_DEBUG option
324 # add it and run veryquick.test.
325 set debug_idx [lsearch -glob $config_options -DSQLITE_DEBUG*]
326 if {$debug_idx < 0} {
327 run_test_suite "${zConfig}_debug" test [
328 concat $config_options -DSQLITE_DEBUG=1
329 ]
330 } else {
331 run_test_suite "${zConfig}_ndebug" test [
332 lreplace $config_options $debug_idx $debug_idx
333 ]
334 }
335
336 }
337}
338
339main $argv