gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/crash4.test (about)

     1  # 2008 January 8
     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  #
    12  # This file contains additional tests to verify that SQLite database
    13  # file survive a power loss or OS crash.
    14  #
    15  # $Id: crash4.test,v 1.3 2008/01/16 17:46:38 drh Exp $
    16  
    17  set testdir [file dirname $argv0]
    18  source $testdir/tester.tcl
    19  
    20  ifcapable !crashtest {
    21    finish_test
    22    return
    23  }
    24  
    25  
    26  # A sequence of SQL commands:
    27  #
    28  set sql_cmd_list {
    29    {CREATE TABLE a(id INTEGER, name CHAR(50))}
    30    {INSERT INTO a(id,name) VALUES(1,'one')}
    31    {INSERT INTO a(id,name) VALUES(2,'two')}
    32    {INSERT INTO a(id,name) VALUES(3,'three')}
    33    {INSERT INTO a(id,name) VALUES(4,'four')}
    34    {INSERT INTO a(id,name) VALUES(5,'five')}
    35    {INSERT INTO a(id,name) VALUES(6,'six')}
    36    {INSERT INTO a(id,name) VALUES(7,'seven')}
    37    {INSERT INTO a(id,name) VALUES(8,'eight')}
    38    {INSERT INTO a(id,name) VALUES(9,'nine')}
    39    {INSERT INTO a(id,name) VALUES(10,'ten')}
    40    {UPDATE A SET name='new text for row 3' WHERE id=3}
    41  }
    42  
    43  # Assume that a database is created by evaluating the SQL statements
    44  # in $sql_cmd_list.  Compute a set of checksums that capture the state
    45  # of the database after each statement.  Also include a checksum for
    46  # the state of the database prior to any of these statements.
    47  #
    48  set crash4_cksum_set {}
    49  lappend crash4_cksum_set [allcksum db]
    50  foreach cmd $sql_cmd_list {
    51    db eval $cmd
    52    lappend crash4_cksum_set [allcksum db]
    53  }
    54  
    55  # Run the sequence of SQL statements shown above repeatedly.
    56  # Close and reopen the database right before the UPDATE statement.
    57  # On each repetition, introduce database corruption typical of
    58  # what might be seen in a power loss or OS crash.  
    59  #
    60  # Slowly increase the delay before the crash, repeating the test
    61  # over and over.  Stop testing when the entire sequence of SQL
    62  # statements runs to completing without hitting the crash.
    63  #
    64  for {set cnt 1; set fin 0} {!$fin} {incr cnt} {
    65    db close
    66    forcedelete test.db test.db-journal
    67    do_test crash4-1.$cnt.1 {
    68      set seed [expr {int(abs(rand()*10000))}]
    69      set delay [expr {int($cnt/50)+1}]
    70      set file [expr {($cnt&1)?"test.db":"test.db-journal"}]
    71      set c [crashsql -delay $delay -file $file -seed $seed -tclbody {
    72        db eval {CREATE TABLE a(id INTEGER, name CHAR(50))}
    73        db eval {INSERT INTO a(id,name) VALUES(1,'one')}
    74        db eval {INSERT INTO a(id,name) VALUES(2,'two')}
    75        db eval {INSERT INTO a(id,name) VALUES(3,'three')}
    76        db eval {INSERT INTO a(id,name) VALUES(4,'four')}
    77        db eval {INSERT INTO a(id,name) VALUES(5,'five')}
    78        db eval {INSERT INTO a(id,name) VALUES(6,'six')}
    79        db eval {INSERT INTO a(id,name) VALUES(7,'seven')}
    80        db eval {INSERT INTO a(id,name) VALUES(8,'eight')}
    81        db eval {INSERT INTO a(id,name) VALUES(9,'nine')}
    82        db eval {INSERT INTO a(id,name) VALUES(10,'ten')}
    83        db close
    84        sqlite3 db test.db
    85        db eval {UPDATE A SET name='new text for row 3' WHERE id=3}
    86        db close
    87      } {}]
    88      if {$c==[list 0 {}]} {
    89        set ::fin 1
    90        set c [list 1 {child process exited abnormally}]
    91      }
    92      set c
    93    } {1 {child process exited abnormally}}
    94    sqlite3 db test.db
    95    integrity_check crash4-1.$cnt.2
    96    do_test crash4-1.$cnt.3 {
    97      set x [lsearch $::crash4_cksum_set [allcksum db]]
    98      expr {$x>=0}
    99    } {1}
   100  }
   101  
   102  finish_test