• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1
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  }
63  "Ftrapv" {
64    -O2 -ftrapv
65    -DSQLITE_MAX_ATTACHED=55
66    -DSQLITE_TCL_DEFAULT_FULLMUTEX=1
67  }
68  "Unlock-Notify" {
69    -O2
70    -DSQLITE_ENABLE_UNLOCK_NOTIFY
71    -DSQLITE_THREADSAFE
72    -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  }
96  "Device-One" {
97    -O2
98    -DSQLITE_DEBUG=1
99    -DSQLITE_DEFAULT_AUTOVACUUM=1
100    -DSQLITE_DEFAULT_CACHE_SIZE=64
101    -DSQLITE_DEFAULT_PAGE_SIZE=1024
102    -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=32
103    -DSQLITE_DISABLE_LFS=1
104    -DSQLITE_ENABLE_ATOMIC_WRITE=1
105    -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
126    -DSQLITE_OMIT_TRACE=1
127    -DSQLITE_TEMP_STORE=3
128    -DSQLITE_THREADSAFE=2
129  }
130  "Locking-Style" {
131    -O2
132    -DSQLITE_ENABLE_LOCKING_STYLE=1
133  }
134  "OS-X" {
135    -DSQLITE_OMIT_LOAD_EXTENSION=1
136    -DSQLITE_DEFAULT_MEMSTATUS=0
137    -DSQLITE_THREADSAFE=2
138    -DSQLITE_OS_UNIX=1
139    -DSQLITE_ENABLE_LOCKING_STYLE=1
140    -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
149  }
150  "Extra-Robustness" {
151    -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1
152    -DSQLITE_MAX_ATTACHED=62
153  }
154}
155
156array set ::Platforms {
157  Linux-x86_64 {
158    "Secure-Delete"           test
159    "Unlock-Notify"           "QUICKTEST_INCLUDE=notify2.test test"
160    "Update-Delete-Limit"     test
161    "Debug-One"               test
162    "Extra-Robustness"        test
163    "Device-Two"              test
164    "Ftrapv"                  test
165    "Default"                 "threadtest test"
166    "Device-One"              fulltest
167  }
168  Linux-i686 {
169    "Unlock-Notify"           "QUICKTEST_INCLUDE=notify2.test test"
170    "Device-One"              test
171    "Device-Two"              test
172    "Default"                 "threadtest fulltest"
173  }
174  Darwin-i386 {
175    "Locking-Style"           test
176    "OS-X"                    "threadtest fulltest"
177  }
178}
179
180# End of configuration section.
181#########################################################################
182#########################################################################
183
184foreach {key value} [array get ::Platforms] {
185  foreach {v t} $value {
186    if {0==[info exists ::Configs($v)]} {
187      puts stderr "No such configuration: \"$v\""
188      exit -1
189    }
190  }
191}
192
193proc run_test_suite {name testtarget config} {
194
195  # Tcl variable $opts is used to build up the value used to set the
196  # OPTS Makefile variable. Variable $cflags holds the value for
197  # CFLAGS. The makefile will pass OPTS to both gcc and lemon, but
198  # CFLAGS is only passed to gcc.
199  #
200  set cflags ""
201  set opts ""
202  foreach arg $config {
203    if {[string match -D* $arg]} {
204      lappend opts $arg
205    } else {
206      lappend cflags $arg
207    }
208  }
209
210  set cflags [join $cflags " "]
211  set opts   [join $opts " "]
212  append opts " -DSQLITE_NO_SYNC=1 -DHAVE_USLEEP"
213
214  # Set the sub-directory to use.
215  #
216  set dir [string tolower [string map {- _ " " _} $name]]
217
218  if {$::tcl_platform(platform)=="windows"} {
219    append opts " -DSQLITE_OS_WIN=1"
220  } elseif {$::tcl_platform(platform)=="os2"} {
221    append opts " -DSQLITE_OS_OS2=1"
222  } else {
223    append opts " -DSQLITE_OS_UNIX=1"
224  }
225
226  # Run the test.
227  #
228  set makefile [file normalize $::MAKEFILE]
229  file mkdir $dir
230  puts -nonewline "Testing configuration \"$name\" (logfile=$dir/test.log)..."
231  flush stdout
232
233  set makecmd [concat                                  \
234    [list exec make -C $dir -f $makefile clean]        \
235    $testtarget                                        \
236    [list CFLAGS=$cflags OPTS=$opts >& $dir/test.log]  \
237  ]
238
239  set tm1 [clock seconds]
240  set rc [catch $makecmd]
241  set tm2 [clock seconds]
242
243  set minutes [expr {($tm2-$tm1)/60}]
244  set seconds [expr {($tm2-$tm1)%60}]
245  puts -nonewline [format " (%d:%.2d) " $minutes $seconds]
246  if {$rc} {
247    puts "FAILED."
248  } else {
249    puts "Ok."
250  }
251}
252
253
254# This proc processes the command line options passed to this script.
255# Currently the only option supported is "-makefile", default
256# "releasetest.mk". Set the ::MAKEFILE variable to the value of this
257# option.
258#
259proc process_options {argv} {
260  set ::MAKEFILE releasetest.mk                       ;# Default value
261  set ::QUICK    0                                    ;# Default value
262  set platform $::tcl_platform(os)-$::tcl_platform(machine)
263
264  for {set i 0} {$i < [llength $argv]} {incr i} {
265    switch -- [lindex $argv $i] {
266      -makefile {
267        incr i
268        set ::MAKEFILE [lindex $argv $i]
269      }
270
271      -platform {
272        incr i
273        set platform [lindex $argv $i]
274      }
275
276      -quick {
277        incr i
278        set ::QUICK [lindex $argv $i]
279      }
280
281      default {
282        puts stderr ""
283        puts stderr [string trim $::USAGE_MESSAGE]
284        exit -1
285      }
286    }
287  }
288
289  set ::MAKEFILE [file normalize $::MAKEFILE]
290
291  if {0==[info exists ::Platforms($platform)]} {
292    puts "Unknown platform: $platform"
293    puts -nonewline "Set the -platform option to "
294    set print [list]
295    foreach p [array names ::Platforms] {
296      lappend print "\"$p\""
297    }
298    lset print end "or [lindex $print end]"
299    puts "[join $print {, }]."
300    exit
301  }
302
303  set ::CONFIGLIST $::Platforms($platform)
304  puts "Running the following configurations for $platform:"
305  puts "    [string trim $::CONFIGLIST]"
306}
307
308# Main routine.
309#
310proc main {argv} {
311
312  # Process any command line options.
313  process_options $argv
314
315  foreach {zConfig target} $::CONFIGLIST {
316    if {$::QUICK} {set target test}
317    set config_options $::Configs($zConfig)
318
319    run_test_suite $zConfig $target $config_options
320
321    # If the configuration included the SQLITE_DEBUG option, then remove
322    # it and run veryquick.test. If it did not include the SQLITE_DEBUG option
323    # add it and run veryquick.test.
324    set debug_idx [lsearch -glob $config_options -DSQLITE_DEBUG*]
325    if {$debug_idx < 0} {
326      run_test_suite "${zConfig}_debug" test [
327        concat $config_options -DSQLITE_DEBUG=1
328      ]
329    } else {
330      run_test_suite "${zConfig}_ndebug" test [
331        lreplace $config_options $debug_idx $debug_idx
332      ]
333    }
334
335  }
336}
337
338main $argv
339