CoolFace
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
crash4.test103 linesDownload Raw Back to test
1# 2008 January 82#3# The author disclaims copyright to this source code.  In place of4# 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 database13# 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 17set testdir [file dirname $argv0]18source $testdir/tester.tcl19 20ifcapable !crashtest {21  finish_test22  return23}24 25 26# A sequence of SQL commands:27#28set 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 statements44# in $sql_cmd_list.  Compute a set of checksums that capture the state45# of the database after each statement.  Also include a checksum for46# the state of the database prior to any of these statements.47#48set crash4_cksum_set {}49lappend crash4_cksum_set [allcksum db]50foreach cmd $sql_cmd_list {51  db eval $cmd52  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 of58# what might be seen in a power loss or OS crash.  59#60# Slowly increase the delay before the crash, repeating the test61# over and over.  Stop testing when the entire sequence of SQL62# statements runs to completing without hitting the crash.63#64for {set cnt 1; set fin 0} {!$fin} {incr cnt} {65  db close66  forcedelete test.db test.db-journal67  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 close84      sqlite3 db test.db85      db eval {UPDATE A SET name='new text for row 3' WHERE id=3}86      db close87    } {}]88    if {$c==[list 0 {}]} {89      set ::fin 190      set c [list 1 {child process exited abnormally}]91    }92    set c93  } {1 {child process exited abnormally}}94  sqlite3 db test.db95  integrity_check crash4-1.$cnt.296  do_test crash4-1.$cnt.3 {97    set x [lsearch $::crash4_cksum_set [allcksum db]]98    expr {$x>=0}99  } {1}100}101 102finish_test103