Annotation of embedaddon/sqlite3/test/crash4.test, revision 1.1
1.1 ! misho 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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>