1# 2007 May 24
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11# This file is the driver for the "soak" tests. It is a peer of the
12# quick.test and all.test scripts.
13#
14# $Id: soak.test,v 1.4 2008/11/13 18:29:51 shane Exp $
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18rename finish_test really_finish_test
19proc finish_test {} {}
20
21# By default, guarantee that the tests will run for at least 1 hour.
22#
23set TIMEOUT 3600
24
25# Process command-line arguments. 
26#
27if {[llength $argv]>0} {
28  foreach {name value} $argv {
29    switch -- $name {
30      -timeout {
31        set TIMEOUT $value
32      }
33      default {
34         puts stderr "Unknown option: $name"
35         exit
36      }
37    }
38  }
39}
40set argv [list]
41
42# Test plan:
43#
44# The general principle is to run those SQLite tests that use
45# pseudo-random data in some way over and over again for a very 
46# long time. The number of tests run depends on the value of 
47# global variable $TIMEOUT - tests are run for at least $TIMEOUT 
48# seconds.
49#
50#   fuzz.test     (pseudo-random SQL statements)
51#   trans.test    (pseudo-random changes to a database followed by rollbacks)
52#   fuzz_malloc.test
53#   corruptC.test (pseudo-random corruption to a database)
54#
55# Many database changes maintaining some kind of invariant. 
56# Storing checksums etc.
57#
58
59# List of test files that are run by this file.
60#
61set SOAKTESTS {
62  fuzz.test
63  fuzz_malloc.test
64  trans.test
65  corruptC.test
66}
67
68set G(isquick) 1
69
70set soak_starttime  [clock seconds]
71set soak_finishtime [expr {$soak_starttime + $TIMEOUT}]
72
73# Loop until the timeout is reached or an error occurs.
74#
75for {set iRun 0} {[clock seconds] < $soak_finishtime} {incr iRun} {
76
77  set iIdx [expr {$iRun % [llength $SOAKTESTS]}]
78  source [file join $testdir [lindex $SOAKTESTS $iIdx]]
79  catch {db close}
80
81  if {$sqlite_open_file_count>0} {
82    puts "$tail did not close all files: $sqlite_open_file_count"
83    fail_test $tail
84    set sqlite_open_file_count 0
85  }
86
87  if {[set_test_counter errors]>0} break
88}
89
90really_finish_test
91