# 2001 September 15 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file runs all tests. # # $Id: all.test,v 1.41 2007/05/08 15:59:06 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl rename finish_test really_finish_test proc finish_test {} { memleak_check } if {[file exists ./sqlite_test_count]} { set COUNT [exec cat ./sqlite_test_count] } else { set COUNT 3 } if {[llength $argv]>0} { foreach {name value} $argv { switch -- $name { -count { set COUNT $value } -quick { set ISQUICK $value } default { puts stderr "Unknown option: $name" exit } } } } set argv {} # LeakList will hold a list of the number of unfreed mallocs after # each round of the test. This number should be constant. If it # grows, it may mean there is a memory leak in the library. # set LeakList {} set EXCLUDE { all.test async.test crash.test crash2.test autovacuum_crash.test quick.test malloc.test misuse.test memleak.test sqllimits1.test } # Files to include in the test. If this list is empty then everything # that is not in the EXCLUDE list is run. # set INCLUDE { } # Test files btree2.test and btree4.test don't work if the # SQLITE_DEFAULT_AUTOVACUUM macro is defined to true (because they depend # on tables being allocated starting at page 2). # ifcapable default_autovacuum { lappend EXCLUDE btree2.test lappend EXCLUDE btree4.test } for {set Counter 0} {$Counter<$COUNT && $nErr==0} {incr Counter} { if {$Counter%2} { set ::SETUP_SQL {PRAGMA default_synchronous=off;} } else { catch {unset ::SETUP_SQL} } foreach testfile [lsort -dictionary [glob $testdir/*.test]] { set tail [file tail $testfile] if {[lsearch -exact $EXCLUDE $tail]>=0} continue if {[llength $INCLUDE]>0 && [lsearch -exact $INCLUDE $tail]<0} continue source $testfile catch {db close} if {$sqlite_open_file_count>0} { puts "$tail did not close all files: $sqlite_open_file_count" incr nErr lappend ::failList $tail set sqlite_open_file_count 0 } if {$::sqlite3_tsd_count} { puts "Thread-specific data leak: $::sqlite3_tsd_count instances" incr nErr lappend ::failList $tail set ::sqlite3_tsd_count 0 } } if {[info exists Leak]} { lappend LeakList $Leak } } # Do one last test to look for a memory leak in the library. This will # only work if SQLite is compiled with the -DSQLITE_DEBUG=1 flag. # if {$LeakList!=""} { puts -nonewline memory-leak-test... incr ::nTest foreach x $LeakList { if {$x!=[lindex $LeakList 0]} { puts " failed!" puts "Expected: all values to be the same" puts " Got: $LeakList" incr ::nErr lappend ::failList memory-leak-test break } } puts " Ok" } # Run the crashtest only on unix and only once. If the library does not # always create auto-vacuum databases, also run autovacuum_crash.test. # if {$::tcl_platform(platform)=="unix"} { source $testdir/crash.test source $testdir/crash2.test ifcapable !default_autovacuum { source $testdir/autovacuum_crash.test } } # Run the malloc tests and the misuse test after memory leak detection. # Both tests leak memory. Currently, misuse.test also leaks a handful of # file descriptors. This is not considered a problem, but can cause tests # in malloc.test to fail. So set the open-file count to zero before running # malloc.test to get around this. # catch {source $testdir/misuse.test} set sqlite_open_file_count 0 catch {source $testdir/malloc.test} catch {db close} set sqlite_open_file_count 0 really_finish_test