OLD | NEW |
| (Empty) |
1 | |
2 set 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 # | |
8 set ::USAGE_MESSAGE { | |
9 This Tcl script is used to test the various configurations required | |
10 before releasing a new version. Supported command line options (all | |
11 optional) are: | |
12 | |
13 -makefile PATH-TO-MAKEFILE (default "releasetest.mk") | |
14 -platform PLATFORM (see below) | |
15 -quick BOOLEAN (default "0") | |
16 -config CONFIGNAME (Run only CONFIGNAME) | |
17 | |
18 The default value for -makefile is "./releasetest.mk". | |
19 | |
20 The script determines the default value for -platform using the | |
21 $tcl_platform(os) and $tcl_platform(machine) variables. Supported | |
22 platforms are "Linux-x86", "Linux-x86_64" and "Darwin-i386". | |
23 | |
24 If the -quick option is set to true, then the "veryquick.test" script | |
25 is run for all compilation configurations. Otherwise, sometimes "all.test" | |
26 is run, sometimes "veryquick.test". | |
27 | |
28 Almost any SQLite makefile (except those generated by configure - see below) | |
29 should work. The following properties are required: | |
30 | |
31 * The makefile should support the "fulltest" target. | |
32 * The makefile should support the variable "OPTS" as a way to pass | |
33 options from the make command line to lemon and the C compiler. | |
34 | |
35 More precisely, the following invocation must be supported: | |
36 | |
37 make -f $::MAKEFILE fulltest OPTS="-DSQLITE_SECURE_DELETE=1 -DSQLITE_DEBUG=1" | |
38 | |
39 Makefiles generated by the sqlite configure program cannot be used as | |
40 they do not respect the OPTS variable. | |
41 | |
42 Example Makefile contents: | |
43 | |
44 ######################################################## | |
45 TOP=/home/dan/work/sqlite/sqlite | |
46 | |
47 TCL_FLAGS=-I/home/dan/tcl/include | |
48 LIBTCL=-L/home/dan/tcl/lib -ltcl | |
49 | |
50 BCC = gcc | |
51 TCC = gcc -ansi -g $(CFLAGS) | |
52 NAWK = awk | |
53 AR = ar cr | |
54 RANLIB = ranlib | |
55 THREADLIB = -lpthread -ldl | |
56 include $(TOP)/main.mk | |
57 ######################################################## | |
58 } | |
59 | |
60 array set ::Configs { | |
61 "Default" { | |
62 -O2 | |
63 } | |
64 "Ftrapv" { | |
65 -O2 -ftrapv | |
66 -DSQLITE_MAX_ATTACHED=55 | |
67 -DSQLITE_TCL_DEFAULT_FULLMUTEX=1 | |
68 } | |
69 "Unlock-Notify" { | |
70 -O2 | |
71 -DSQLITE_ENABLE_UNLOCK_NOTIFY | |
72 -DSQLITE_THREADSAFE | |
73 -DSQLITE_TCL_DEFAULT_FULLMUTEX=1 | |
74 } | |
75 "Secure-Delete" { | |
76 -O2 | |
77 -DSQLITE_SECURE_DELETE=1 | |
78 -DSQLITE_SOUNDEX=1 | |
79 } | |
80 "Update-Delete-Limit" { | |
81 -O2 | |
82 -DSQLITE_DEFAULT_FILE_FORMAT=4 | |
83 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1 | |
84 } | |
85 "Check-Symbols" { | |
86 -DSQLITE_MEMDEBUG=1 | |
87 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 | |
88 -DSQLITE_ENABLE_FTS3=1 | |
89 -DSQLITE_ENABLE_RTREE=1 | |
90 -DSQLITE_ENABLE_MEMSYS5=1 | |
91 -DSQLITE_ENABLE_MEMSYS3=1 | |
92 -DSQLITE_ENABLE_COLUMN_METADATA=1 | |
93 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1 | |
94 -DSQLITE_SECURE_DELETE=1 | |
95 -DSQLITE_SOUNDEX=1 | |
96 -DSQLITE_ENABLE_ATOMIC_WRITE=1 | |
97 -DSQLITE_ENABLE_IOTRACE=1 | |
98 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 | |
99 -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1 | |
100 } | |
101 "Debug-One" { | |
102 -O2 | |
103 -DSQLITE_DEBUG=1 | |
104 -DSQLITE_MEMDEBUG=1 | |
105 -DSQLITE_MUTEX_NOOP=1 | |
106 -DSQLITE_TCL_DEFAULT_FULLMUTEX=1 | |
107 -DSQLITE_ENABLE_FTS3=1 | |
108 -DSQLITE_ENABLE_RTREE=1 | |
109 -DSQLITE_ENABLE_MEMSYS5=1 | |
110 -DSQLITE_ENABLE_MEMSYS3=1 | |
111 -DSQLITE_ENABLE_COLUMN_METADATA=1 | |
112 } | |
113 "Device-One" { | |
114 -O2 | |
115 -DSQLITE_DEBUG=1 | |
116 -DSQLITE_DEFAULT_AUTOVACUUM=1 | |
117 -DSQLITE_DEFAULT_CACHE_SIZE=64 | |
118 -DSQLITE_DEFAULT_PAGE_SIZE=1024 | |
119 -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=32 | |
120 -DSQLITE_DISABLE_LFS=1 | |
121 -DSQLITE_ENABLE_ATOMIC_WRITE=1 | |
122 -DSQLITE_ENABLE_IOTRACE=1 | |
123 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 | |
124 -DSQLITE_MAX_PAGE_SIZE=4096 | |
125 -DSQLITE_OMIT_LOAD_EXTENSION=1 | |
126 -DSQLITE_OMIT_PROGRESS_CALLBACK=1 | |
127 -DSQLITE_OMIT_VIRTUALTABLE=1 | |
128 -DSQLITE_TEMP_STORE=3 | |
129 } | |
130 "Device-Two" { | |
131 -DSQLITE_4_BYTE_ALIGNED_MALLOC=1 | |
132 -DSQLITE_DEFAULT_AUTOVACUUM=1 | |
133 -DSQLITE_DEFAULT_CACHE_SIZE=1000 | |
134 -DSQLITE_DEFAULT_LOCKING_MODE=0 | |
135 -DSQLITE_DEFAULT_PAGE_SIZE=1024 | |
136 -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=1000 | |
137 -DSQLITE_DISABLE_LFS=1 | |
138 -DSQLITE_ENABLE_FTS3=1 | |
139 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 | |
140 -DSQLITE_ENABLE_RTREE=1 | |
141 -DSQLITE_MAX_COMPOUND_SELECT=50 | |
142 -DSQLITE_MAX_PAGE_SIZE=32768 | |
143 -DSQLITE_OMIT_TRACE=1 | |
144 -DSQLITE_TEMP_STORE=3 | |
145 -DSQLITE_THREADSAFE=2 | |
146 } | |
147 "Locking-Style" { | |
148 -O2 | |
149 -DSQLITE_ENABLE_LOCKING_STYLE=1 | |
150 } | |
151 "OS-X" { | |
152 -DSQLITE_OMIT_LOAD_EXTENSION=1 | |
153 -DSQLITE_DEFAULT_MEMSTATUS=0 | |
154 -DSQLITE_THREADSAFE=2 | |
155 -DSQLITE_OS_UNIX=1 | |
156 -DSQLITE_ENABLE_LOCKING_STYLE=1 | |
157 -DUSE_PREAD=1 | |
158 -DSQLITE_ENABLE_RTREE=1 | |
159 -DSQLITE_ENABLE_FTS3=1 | |
160 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 | |
161 -DSQLITE_DEFAULT_CACHE_SIZE=1000 | |
162 -DSQLITE_MAX_LENGTH=2147483645 | |
163 -DSQLITE_MAX_VARIABLE_NUMBER=500000 | |
164 -DSQLITE_DEBUG=1 | |
165 -DSQLITE_PREFER_PROXY_LOCKING=1 | |
166 } | |
167 "Extra-Robustness" { | |
168 -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1 | |
169 -DSQLITE_MAX_ATTACHED=62 | |
170 } | |
171 "Devkit" { | |
172 -DSQLITE_DEFAULT_FILE_FORMAT=4 | |
173 -DSQLITE_MAX_ATTACHED=30 | |
174 -DSQLITE_ENABLE_COLUMN_METADATA | |
175 -DSQLITE_ENABLE_FTS4 | |
176 -DSQLITE_ENABLE_FTS4_PARENTHESIS | |
177 -DSQLITE_DISABLE_FTS4_DEFERRED | |
178 -DSQLITE_ENABLE_RTREE | |
179 } | |
180 | |
181 "No-lookaside" { | |
182 -DSQLITE_TEST_REALLOC_STRESS=1 | |
183 -DSQLITE_OMIT_LOOKASIDE=1 | |
184 -DHAVE_USLEEP=1 | |
185 } | |
186 } | |
187 | |
188 array set ::Platforms { | |
189 Linux-x86_64 { | |
190 "Check-Symbols" checksymbols | |
191 "Debug-One" test | |
192 "Secure-Delete" test | |
193 "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test" | |
194 "Update-Delete-Limit" test | |
195 "Extra-Robustness" test | |
196 "Device-Two" test | |
197 "Ftrapv" test | |
198 "No-lookaside" test | |
199 "Devkit" test | |
200 "Default" "threadtest fulltest" | |
201 "Device-One" fulltest | |
202 } | |
203 Linux-i686 { | |
204 "Devkit" test | |
205 "Unlock-Notify" "QUICKTEST_INCLUDE=notify2.test test" | |
206 "Device-One" test | |
207 "Device-Two" test | |
208 "Default" "threadtest fulltest" | |
209 } | |
210 Darwin-i386 { | |
211 "Locking-Style" test | |
212 "OS-X" "threadtest fulltest" | |
213 } | |
214 } | |
215 | |
216 | |
217 # End of configuration section. | |
218 ######################################################################### | |
219 ######################################################################### | |
220 | |
221 foreach {key value} [array get ::Platforms] { | |
222 foreach {v t} $value { | |
223 if {0==[info exists ::Configs($v)]} { | |
224 puts stderr "No such configuration: \"$v\"" | |
225 exit -1 | |
226 } | |
227 } | |
228 } | |
229 | |
230 proc run_test_suite {name testtarget config} { | |
231 | |
232 # Tcl variable $opts is used to build up the value used to set the | |
233 # OPTS Makefile variable. Variable $cflags holds the value for | |
234 # CFLAGS. The makefile will pass OPTS to both gcc and lemon, but | |
235 # CFLAGS is only passed to gcc. | |
236 # | |
237 set cflags "" | |
238 set opts "" | |
239 foreach arg $config { | |
240 if {[string match -D* $arg]} { | |
241 lappend opts $arg | |
242 } else { | |
243 lappend cflags $arg | |
244 } | |
245 } | |
246 | |
247 set cflags [join $cflags " "] | |
248 set opts [join $opts " "] | |
249 append opts " -DSQLITE_NO_SYNC=1 -DHAVE_USLEEP" | |
250 | |
251 # Set the sub-directory to use. | |
252 # | |
253 set dir [string tolower [string map {- _ " " _} $name]] | |
254 | |
255 if {$::tcl_platform(platform)=="windows"} { | |
256 append opts " -DSQLITE_OS_WIN=1" | |
257 } else { | |
258 append opts " -DSQLITE_OS_UNIX=1" | |
259 } | |
260 | |
261 # Run the test. | |
262 # | |
263 set makefile [file normalize $::MAKEFILE] | |
264 file mkdir $dir | |
265 puts -nonewline "Testing configuration \"$name\" (logfile=$dir/test.log)..." | |
266 flush stdout | |
267 | |
268 set makecmd [concat \ | |
269 [list exec make -C $dir -f $makefile clean] \ | |
270 $testtarget \ | |
271 [list CFLAGS=$cflags OPTS=$opts >& $dir/test.log] \ | |
272 ] | |
273 | |
274 set tm1 [clock seconds] | |
275 set rc [catch $makecmd] | |
276 set tm2 [clock seconds] | |
277 | |
278 set minutes [expr {($tm2-$tm1)/60}] | |
279 set seconds [expr {($tm2-$tm1)%60}] | |
280 puts -nonewline [format " (%d:%.2d) " $minutes $seconds] | |
281 if {$rc} { | |
282 puts "FAILED." | |
283 } else { | |
284 puts "Ok." | |
285 } | |
286 } | |
287 | |
288 | |
289 # This proc processes the command line options passed to this script. | |
290 # Currently the only option supported is "-makefile", default | |
291 # "releasetest.mk". Set the ::MAKEFILE variable to the value of this | |
292 # option. | |
293 # | |
294 proc process_options {argv} { | |
295 set ::MAKEFILE releasetest.mk ;# Default value | |
296 set ::QUICK 0 ;# Default value | |
297 set config {} | |
298 set platform $::tcl_platform(os)-$::tcl_platform(machine) | |
299 | |
300 for {set i 0} {$i < [llength $argv]} {incr i} { | |
301 switch -- [lindex $argv $i] { | |
302 -makefile { | |
303 incr i | |
304 set ::MAKEFILE [lindex $argv $i] | |
305 } | |
306 | |
307 -platform { | |
308 incr i | |
309 set platform [lindex $argv $i] | |
310 } | |
311 | |
312 -quick { | |
313 incr i | |
314 set ::QUICK [lindex $argv $i] | |
315 } | |
316 | |
317 -config { | |
318 incr i | |
319 set config [lindex $argv $i] | |
320 } | |
321 | |
322 default { | |
323 puts stderr "" | |
324 puts stderr [string trim $::USAGE_MESSAGE] | |
325 exit -1 | |
326 } | |
327 } | |
328 } | |
329 | |
330 set ::MAKEFILE [file normalize $::MAKEFILE] | |
331 | |
332 if {0==[info exists ::Platforms($platform)]} { | |
333 puts "Unknown platform: $platform" | |
334 puts -nonewline "Set the -platform option to " | |
335 set print [list] | |
336 foreach p [array names ::Platforms] { | |
337 lappend print "\"$p\"" | |
338 } | |
339 lset print end "or [lindex $print end]" | |
340 puts "[join $print {, }]." | |
341 exit | |
342 } | |
343 | |
344 if {$config!=""} { | |
345 if {[llength $config]==1} {lappend config fulltest} | |
346 set ::CONFIGLIST $config | |
347 } else { | |
348 set ::CONFIGLIST $::Platforms($platform) | |
349 } | |
350 puts "Running the following configurations for $platform:" | |
351 puts " [string trim $::CONFIGLIST]" | |
352 } | |
353 | |
354 # Main routine. | |
355 # | |
356 proc main {argv} { | |
357 | |
358 # Process any command line options. | |
359 process_options $argv | |
360 | |
361 foreach {zConfig target} $::CONFIGLIST { | |
362 if {$::QUICK} {set target test} | |
363 set config_options $::Configs($zConfig) | |
364 | |
365 run_test_suite $zConfig $target $config_options | |
366 | |
367 # If the configuration included the SQLITE_DEBUG option, then remove | |
368 # it and run veryquick.test. If it did not include the SQLITE_DEBUG option | |
369 # add it and run veryquick.test. | |
370 if {$target!="checksymbols"} { | |
371 set debug_idx [lsearch -glob $config_options -DSQLITE_DEBUG*] | |
372 if {$debug_idx < 0} { | |
373 run_test_suite "${zConfig}_debug" test [ | |
374 concat $config_options -DSQLITE_DEBUG=1 | |
375 ] | |
376 } else { | |
377 run_test_suite "${zConfig}_ndebug" test [ | |
378 lreplace $config_options $debug_idx $debug_idx | |
379 ] | |
380 } | |
381 } | |
382 | |
383 } | |
384 } | |
385 | |
386 main $argv | |
OLD | NEW |