Annotation of embedaddon/sqlite3/test/crash2.test, revision 1.1.1.1

1.1       misho       1: # 2001 September 15
                      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 implements regression tests for SQLite library.
                     12: #
                     13: # The focus of this file is testing the ability of the database to
                     14: # uses its rollback journal to recover intact (no database corruption)
                     15: # from a power failure during the middle of a COMMIT. Even more
                     16: # specifically, the tests in this file verify this functionality
                     17: # for storage mediums with various sector sizes.
                     18: #
                     19: # $Id: crash2.test,v 1.6 2008/08/25 07:12:29 danielk1977 Exp $
                     20: 
                     21: set testdir [file dirname $argv0]
                     22: source $testdir/tester.tcl
                     23: 
                     24: ifcapable !crashtest {
                     25:   finish_test
                     26:   return
                     27: }
                     28: 
                     29: db close
                     30: 
                     31: # This test is designed to check that the crash-test infrastructure
                     32: # can create files that do not consist of an integer number of
                     33: # simulated disk blocks (i.e. 3KB file using 2KB disk blocks).
                     34: #
                     35: do_test crash2-1.1 {
                     36:   crashsql -delay 500 -file test.db -blocksize 2048 {
                     37:     PRAGMA auto_vacuum=OFF;
                     38:     PRAGMA page_size=1024;
                     39:     BEGIN;
                     40:     CREATE TABLE abc AS SELECT 1 AS a, 2 AS b, 3 AS c;
                     41:     CREATE TABLE def AS SELECT 1 AS d, 2 AS e, 3 AS f;
                     42:     COMMIT;
                     43:   }
                     44:   file size test.db
                     45: } {3072}
                     46: 
                     47: for {set ii 0} {$ii < 5} {incr ii} {
                     48: 
                     49:   # Simple test using the database created above: Create a new
                     50:   # table so that page 1 and page 4 are modified. Using a
                     51:   # block-size of 2048 and page-size of 1024, this means
                     52:   # pages 2 and 3 must also be saved in the journal to avoid
                     53:   # risking corruption.
                     54:   #
                     55:   # The loop is so that this test can be run with a couple
                     56:   # of different seeds for the random number generator.
                     57:   #
                     58:   do_test crash2-1.2.$ii {
                     59:     crashsql -file test.db -blocksize 2048 [subst {
                     60:       [string repeat {SELECT random();} $ii]
                     61:       CREATE TABLE hij(h, i, j);
                     62:     }]
                     63:     sqlite3 db test.db
                     64:     db eval {PRAGMA integrity_check}
                     65:   } {ok}
                     66: }
                     67: 
                     68: proc signature {} {
                     69:   return [db eval {SELECT count(*), md5sum(a), md5sum(b), md5sum(c) FROM abc}]
                     70: }
                     71: 
                     72: # Test case for crashing during journal sync with simulated
                     73: # sector-size values from 1024 to 8192.
                     74: #
                     75: do_test crash2-2.0 {
                     76:   execsql BEGIN
                     77:   for {set n 0} {$n < 1000} {incr n} {
                     78:     execsql "INSERT INTO abc VALUES($n, [expr 2*$n], [expr 3*$n])"
                     79:   }
                     80:   execsql {
                     81:     INSERT INTO abc SELECT * FROM abc;
                     82:     INSERT INTO abc SELECT * FROM abc;
                     83:     INSERT INTO abc SELECT * FROM abc;
                     84:     INSERT INTO abc SELECT * FROM abc;
                     85:     INSERT INTO abc SELECT * FROM abc;
                     86:   }
                     87:   execsql COMMIT
                     88:   expr ([file size test.db] / 1024) > 450
                     89: } {1}
                     90: for {set i 1} {$i < 30} {incr i} {
                     91:   set sig [signature]
                     92:   set sector [expr 1024 * 1<<($i%4)]
                     93:   db close
                     94:   do_test crash2-2.$i.1 {
                     95:      crashsql -blocksize $sector -delay [expr $i%5 + 1] -file test.db-journal "
                     96:        PRAGMA temp_store = memory;
                     97:        BEGIN;
                     98:        SELECT random() FROM abc LIMIT $i;
                     99:        INSERT INTO abc SELECT randstr(10,10), 0, 0 FROM abc WHERE random()%2==0;
                    100:        DELETE FROM abc WHERE random()%2!=0;
                    101:        COMMIT;
                    102:      "
                    103:   } {1 {child process exited abnormally}}
                    104:   do_test crash2-2.$i.2 {
                    105:     sqlite3 db test.db
                    106:     signature
                    107:   } $sig
                    108: } 
                    109: 
                    110: 
                    111: # Test case for crashing during database sync with simulated
                    112: # sector-size values from 1024 to 8192.
                    113: #
                    114: for {set i 1} {$i < 10} {incr i} {
                    115:   set sig [signature]
                    116:   set sector [expr 1024 * 1<<($i%4)]
                    117:   db close
                    118:   do_test crash2-3.$i.1 {
                    119:      crashsql -blocksize $sector -file test.db "
                    120:        BEGIN;
                    121:        SELECT random() FROM abc LIMIT $i;
                    122:        INSERT INTO abc SELECT randstr(10,10), 0, 0 FROM abc WHERE random()%2==0;
                    123:        DELETE FROM abc WHERE random()%2!=0;
                    124:        COMMIT;
                    125:      "
                    126:   } {1 {child process exited abnormally}}
                    127:   do_test crash2-3.$i.2 {
                    128:     sqlite3 db test.db
                    129:     signature
                    130:   } $sig
                    131: } 
                    132: 
                    133: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>