AryaWu/sqlite
0
1# 2008 February 182#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# Unit testing of the Bitvec object.13#14# $Id: bitvec.test,v 1.4 2009/04/01 23:49:04 drh Exp $15#16 17set testdir [file dirname $argv0]18source $testdir/tester.tcl19 20# The built-in test logic must be operational in order for21# this test to work.22ifcapable !builtin_test {23 finish_test24 return25}26 27# Test that sqlite3BitvecBuiltinTest correctly reports errors28# that are deliberately introduced.29#30do_test bitvec-1.0.1 {31 sqlite3BitvecBuiltinTest 400 {5 1 1 1 0}32} 133do_test bitvec-1.0.2 {34 sqlite3BitvecBuiltinTest 400 {5 1 234 1 0}35} 23436 37# Run test cases that set every bit in vectors of various sizes.38# for larger cases, this should cycle the bit vector representation39# from hashing into subbitmaps. The subbitmaps should start as40# hashes then change to either subbitmaps or linear maps, depending41# on their size.42#43do_test bitvec-1.1 {44 sqlite3BitvecBuiltinTest 400 {1 400 1 1 0}45} 046do_test bitvec-1.2 {47 sqlite3BitvecBuiltinTest 4000 {1 4000 1 1 0}48} 049do_test bitvec-1.3 {50 sqlite3BitvecBuiltinTest 40000 {1 40000 1 1 0}51} 052do_test bitvec-1.4 {53 sqlite3BitvecBuiltinTest 400000 {1 400000 1 1 0}54} 055 56# By specifying a larger increments, we spread the load around.57#58do_test bitvec-1.5 {59 sqlite3BitvecBuiltinTest 400 {1 400 1 7 0}60} 061do_test bitvec-1.6 {62 sqlite3BitvecBuiltinTest 4000 {1 4000 1 7 0}63} 064do_test bitvec-1.7 {65 sqlite3BitvecBuiltinTest 40000 {1 40000 1 7 0}66} 067do_test bitvec-1.8 {68 sqlite3BitvecBuiltinTest 400000 {1 400000 1 7 0}69} 070 71# First fill up the bitmap with ones, then go through and72# clear all the bits. This will stress the clearing mechanism.73#74do_test bitvec-1.9 {75 sqlite3BitvecBuiltinTest 400 {1 400 1 1 2 400 1 1 0}76} 077do_test bitvec-1.10 {78 sqlite3BitvecBuiltinTest 4000 {1 4000 1 1 2 4000 1 1 0}79} 080do_test bitvec-1.11 {81 sqlite3BitvecBuiltinTest 40000 {1 40000 1 1 2 40000 1 1 0}82} 083do_test bitvec-1.12 {84 sqlite3BitvecBuiltinTest 400000 {1 400000 1 1 2 400000 1 1 0}85} 086 87do_test bitvec-1.13 {88 sqlite3BitvecBuiltinTest 400 {1 400 1 1 2 400 1 7 0}89} 090do_test bitvec-1.15 {91 sqlite3BitvecBuiltinTest 4000 {1 4000 1 1 2 4000 1 7 0}92} 093do_test bitvec-1.16 {94 sqlite3BitvecBuiltinTest 40000 {1 40000 1 1 2 40000 1 77 0}95} 096do_test bitvec-1.17 {97 sqlite3BitvecBuiltinTest 400000 {1 400000 1 1 2 400000 1 777 0}98} 099 100do_test bitvec-1.18 {101 sqlite3BitvecBuiltinTest 400000 {1 5000 100000 1 2 400000 1 37 0}102} 0103 104# Attempt to induce hash collisions. 105#106unset -nocomplain start107unset -nocomplain incr108foreach 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 $prog113 } 0114 }115}116 117do_test bitvec-1.30.big_and_slow {118 sqlite3BitvecBuiltinTest 17000000 {1 17000000 1 1 2 17000000 1 1 0}119} 0120 121 122# Test setting and clearing a random subset of bits.123#124do_test bitvec-2.1 {125 sqlite3BitvecBuiltinTest 4000 {3 2000 4 2000 0}126} 0127do_test bitvec-2.2 {128 sqlite3BitvecBuiltinTest 4000 {3 1000 4 1000 3 1000 4 1000 3 1000 4 1000129 3 1000 4 1000 3 1000 4 1000 3 1000 4 1000 0}130} 0131do_test bitvec-2.3 {132 sqlite3BitvecBuiltinTest 400000 {3 10 0}133} 0134do_test bitvec-2.4 {135 sqlite3BitvecBuiltinTest 4000 {3 10 2 4000 1 1 0}136} 0137do_test bitvec-2.5 {138 sqlite3BitvecBuiltinTest 5000 {3 20 2 5000 1 1 0}139} 0140do_test bitvec-2.6 {141 sqlite3BitvecBuiltinTest 50000 {3 60 2 50000 1 1 0}142} 0143do_test bitvec-2.7 {144 sqlite3BitvecBuiltinTest 5000 {145 1 25 121 125146 1 50 121 125147 2 25 121 125148 0149 }150} 0151 152# This procedure runs sqlite3BitvecBuiltinTest with argments "n" and153# "program". But it also causes a malloc error to occur after the154# "failcnt"-th malloc. The result should be "0" if no malloc failure155# occurs or "-1" if there is a malloc failure.156#157proc bitvec_malloc_test {label failcnt n program} {158 do_test $label [subst {159 sqlite3_memdebug_fail $failcnt160 set x \[sqlite3BitvecBuiltinTest $n [list $program]\]161 set nFail \[sqlite3_memdebug_fail -1\]162 if {\$nFail==0} {163 set ::go 0164 set x -1165 }166 set x167 }] -1168}169 170# Make sure malloc failures are handled sanily.171#172unset -nocomplain n173unset -nocomplain go174set go 1175save_prng_state176for {set n 0} {$go} {incr n} {177 restore_prng_state178 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 0180 }181}182set go 1183for {set n 0} {$go} {incr n} {184 restore_prng_state185 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 0187 }188}189set go 1190for {set n 1} {$go} {incr n} {191 bitvec_malloc_test bitvec-3.3.$n $n 50000 {1 50000 1 1 0}192}193 194finish_test195return196 