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

1.1       misho       1: # 2008 February 18
                      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: # Unit testing of the Bitvec object.
                     13: #
                     14: # $Id: bitvec.test,v 1.4 2009/04/01 23:49:04 drh Exp $
                     15: #
                     16: 
                     17: set testdir [file dirname $argv0]
                     18: source $testdir/tester.tcl
                     19: 
                     20: # The built-in test logic must be operational in order for
                     21: # this test to work.
                     22: ifcapable !builtin_test {
                     23:   finish_test
                     24:   return
                     25: }
                     26: 
                     27: # Test that sqlite3BitvecBuiltinTest correctly reports errors
                     28: # that are deliberately introduced.
                     29: #
                     30: do_test bitvec-1.0.1 {
                     31:   sqlite3BitvecBuiltinTest 400 {5 1 1 1 0}
                     32: } 1
                     33: do_test bitvec-1.0.2 {
                     34:   sqlite3BitvecBuiltinTest 400 {5 1 234 1 0}
                     35: } 234
                     36: 
                     37: # Run test cases that set every bit in vectors of various sizes.
                     38: # for larger cases, this should cycle the bit vector representation
                     39: # from hashing into subbitmaps.  The subbitmaps should start as
                     40: # hashes then change to either subbitmaps or linear maps, depending
                     41: # on their size.
                     42: #
                     43: do_test bitvec-1.1 {
                     44:   sqlite3BitvecBuiltinTest 400 {1 400 1 1 0}
                     45: } 0
                     46: do_test bitvec-1.2 {
                     47:   sqlite3BitvecBuiltinTest 4000 {1 4000 1 1 0}
                     48: } 0
                     49: do_test bitvec-1.3 {
                     50:   sqlite3BitvecBuiltinTest 40000 {1 40000 1 1 0}
                     51: } 0
                     52: do_test bitvec-1.4 {
                     53:   sqlite3BitvecBuiltinTest 400000 {1 400000 1 1 0}
                     54: } 0
                     55: 
                     56: # By specifying a larger increments, we spread the load around.
                     57: #
                     58: do_test bitvec-1.5 {
                     59:   sqlite3BitvecBuiltinTest 400 {1 400 1 7 0}
                     60: } 0
                     61: do_test bitvec-1.6 {
                     62:   sqlite3BitvecBuiltinTest 4000 {1 4000 1 7 0}
                     63: } 0
                     64: do_test bitvec-1.7 {
                     65:   sqlite3BitvecBuiltinTest 40000 {1 40000 1 7 0}
                     66: } 0
                     67: do_test bitvec-1.8 {
                     68:   sqlite3BitvecBuiltinTest 400000 {1 400000 1 7 0}
                     69: } 0
                     70: 
                     71: # First fill up the bitmap with ones,  then go through and
                     72: # clear all the bits.  This will stress the clearing mechanism.
                     73: #
                     74: do_test bitvec-1.9 {
                     75:   sqlite3BitvecBuiltinTest 400 {1 400 1 1 2 400 1 1 0}
                     76: } 0
                     77: do_test bitvec-1.10 {
                     78:   sqlite3BitvecBuiltinTest 4000 {1 4000 1 1 2 4000 1 1 0}
                     79: } 0
                     80: do_test bitvec-1.11 {
                     81:   sqlite3BitvecBuiltinTest 40000 {1 40000 1 1 2 40000 1 1 0}
                     82: } 0
                     83: do_test bitvec-1.12 {
                     84:   sqlite3BitvecBuiltinTest 400000 {1 400000 1 1 2 400000 1 1 0}
                     85: } 0
                     86: 
                     87: do_test bitvec-1.13 {
                     88:   sqlite3BitvecBuiltinTest 400 {1 400 1 1 2 400 1 7 0}
                     89: } 0
                     90: do_test bitvec-1.15 {
                     91:   sqlite3BitvecBuiltinTest 4000 {1 4000 1 1 2 4000 1 7 0}
                     92: } 0
                     93: do_test bitvec-1.16 {
                     94:   sqlite3BitvecBuiltinTest 40000 {1 40000 1 1 2 40000 1 77 0}
                     95: } 0
                     96: do_test bitvec-1.17 {
                     97:   sqlite3BitvecBuiltinTest 400000 {1 400000 1 1 2 400000 1 777 0}
                     98: } 0
                     99: 
                    100: do_test bitvec-1.18 {
                    101:   sqlite3BitvecBuiltinTest 400000 {1 5000 100000 1 2 400000 1 37 0}
                    102: } 0
                    103: 
                    104: # Attempt to induce hash collisions.  
                    105: #
                    106: unset -nocomplain start
                    107: unset -nocomplain incr
                    108: foreach start {1 2 3 4 5 6 7 8} {
                    109:   foreach incr {124 125} {
                    110:     do_test bitvec-1.20.$start.$incr {
                    111:       set prog [list 1 60 $::start $::incr 2 5000 1 1 0]
                    112:       sqlite3BitvecBuiltinTest 5000 $prog
                    113:     } 0
                    114:   }
                    115: }
                    116: 
                    117: do_test bitvec-1.30.big_and_slow {
                    118:   sqlite3BitvecBuiltinTest 17000000 {1 17000000 1 1 2 17000000 1 1 0}
                    119: } 0
                    120: 
                    121: 
                    122: # Test setting and clearing a random subset of bits.
                    123: #
                    124: do_test bitvec-2.1 {
                    125:   sqlite3BitvecBuiltinTest 4000 {3 2000 4 2000 0}
                    126: } 0
                    127: do_test bitvec-2.2 {
                    128:   sqlite3BitvecBuiltinTest 4000 {3 1000 4 1000 3 1000 4 1000 3 1000 4 1000
                    129:                                  3 1000 4 1000 3 1000 4 1000 3 1000 4 1000 0}
                    130: } 0
                    131: do_test bitvec-2.3 {
                    132:   sqlite3BitvecBuiltinTest 400000 {3 10 0}
                    133: } 0
                    134: do_test bitvec-2.4 {
                    135:   sqlite3BitvecBuiltinTest 4000 {3 10 2 4000 1 1 0}
                    136: } 0
                    137: do_test bitvec-2.5 {
                    138:   sqlite3BitvecBuiltinTest 5000 {3 20 2 5000 1 1 0}
                    139: } 0
                    140: do_test bitvec-2.6 {
                    141:   sqlite3BitvecBuiltinTest 50000 {3 60 2 50000 1 1 0}
                    142: } 0
                    143: do_test bitvec-2.7 {
                    144:   sqlite3BitvecBuiltinTest 5000 {
                    145:           1 25 121 125
                    146:           1 50 121 125
                    147:           2 25 121 125
                    148:           0
                    149:   }
                    150: } 0
                    151: 
                    152: # This procedure runs sqlite3BitvecBuiltinTest with argments "n" and
                    153: # "program".  But it also causes a malloc error to occur after the
                    154: # "failcnt"-th malloc.  The result should be "0" if no malloc failure
                    155: # occurs or "-1" if there is a malloc failure.
                    156: #
                    157: proc bitvec_malloc_test {label failcnt n program} {
                    158:   do_test $label [subst {
                    159:     sqlite3_memdebug_fail $failcnt
                    160:     set x \[sqlite3BitvecBuiltinTest $n [list $program]\]
                    161:     set nFail \[sqlite3_memdebug_fail -1\]
                    162:     if {\$nFail==0} {
                    163:       set ::go 0
                    164:       set x -1
                    165:     }
                    166:     set x
                    167:   }] -1
                    168: }
                    169: 
                    170: # Make sure malloc failures are handled sanily.
                    171: #
                    172: unset -nocomplain n
                    173: unset -nocomplain go
                    174: set go 1
                    175: save_prng_state
                    176: for {set n 0} {$go} {incr n} {
                    177:   restore_prng_state
                    178:   bitvec_malloc_test bitvec-3.1.$n $n 5000 {
                    179:       3 60 2 5000 1 1 3 60 2 5000 1 1 3 60 2 5000 1 1 0
                    180:   }
                    181: }
                    182: set go 1
                    183: for {set n 0} {$go} {incr n} {
                    184:   restore_prng_state
                    185:   bitvec_malloc_test bitvec-3.2.$n $n 5000 {
                    186:       3 600 2 5000 1 1 3 600 2 5000 1 1 3 600 2 5000 1 1 0
                    187:   }
                    188: }
                    189: set go 1
                    190: for {set n 1} {$go} {incr n} {
                    191:   bitvec_malloc_test bitvec-3.3.$n $n 50000 {1 50000 1 1 0}
                    192: }
                    193: 
                    194: finish_test
                    195: return

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