File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / crash2.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 10 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    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.1.1.1 2012/02/21 17:04:16 misho 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>