1f5e7bb51Sdrh# 2008 February 18 2f5e7bb51Sdrh# 3f5e7bb51Sdrh# The author disclaims copyright to this source code. In place of 4f5e7bb51Sdrh# a legal notice, here is a blessing: 5f5e7bb51Sdrh# 6f5e7bb51Sdrh# May you do good and not evil. 7f5e7bb51Sdrh# May you find forgiveness for yourself and forgive others. 8f5e7bb51Sdrh# May you share freely, never taking more than you give. 9f5e7bb51Sdrh# 10f5e7bb51Sdrh#*********************************************************************** 11f5e7bb51Sdrh# 12f5e7bb51Sdrh# Unit testing of the Bitvec object. 13f5e7bb51Sdrh# 14*64f798ddSdrh# $Id: bitvec.test,v 1.4 2009/04/01 23:49:04 drh Exp $ 15f5e7bb51Sdrh# 16f5e7bb51Sdrh 17f5e7bb51Sdrhset testdir [file dirname $argv0] 18f5e7bb51Sdrhsource $testdir/tester.tcl 19f5e7bb51Sdrh 203088d59eSdrh# The built-in test logic must be operational in order for 213088d59eSdrh# this test to work. 223088d59eSdrhifcapable !builtin_test { 233088d59eSdrh finish_test 243088d59eSdrh return 253088d59eSdrh} 26f5e7bb51Sdrh 273088d59eSdrh# Test that sqlite3BitvecBuiltinTest correctly reports errors 283088d59eSdrh# that are deliberately introduced. 293088d59eSdrh# 303088d59eSdrhdo_test bitvec-1.0.1 { 313088d59eSdrh sqlite3BitvecBuiltinTest 400 {5 1 1 1 0} 323088d59eSdrh} 1 333088d59eSdrhdo_test bitvec-1.0.2 { 343088d59eSdrh sqlite3BitvecBuiltinTest 400 {5 1 234 1 0} 353088d59eSdrh} 234 363088d59eSdrh 373088d59eSdrh# Run test cases that set every bit in vectors of various sizes. 383088d59eSdrh# for larger cases, this should cycle the bit vector representation 393088d59eSdrh# from hashing into subbitmaps. The subbitmaps should start as 403088d59eSdrh# hashes then change to either subbitmaps or linear maps, depending 413088d59eSdrh# on their size. 423088d59eSdrh# 43f5e7bb51Sdrhdo_test bitvec-1.1 { 443088d59eSdrh sqlite3BitvecBuiltinTest 400 {1 400 1 1 0} 453088d59eSdrh} 0 46f5e7bb51Sdrhdo_test bitvec-1.2 { 473088d59eSdrh sqlite3BitvecBuiltinTest 4000 {1 4000 1 1 0} 483088d59eSdrh} 0 49f5e7bb51Sdrhdo_test bitvec-1.3 { 503088d59eSdrh sqlite3BitvecBuiltinTest 40000 {1 40000 1 1 0} 513088d59eSdrh} 0 52f5e7bb51Sdrhdo_test bitvec-1.4 { 533088d59eSdrh sqlite3BitvecBuiltinTest 400000 {1 400000 1 1 0} 543088d59eSdrh} 0 55f5e7bb51Sdrh 563088d59eSdrh# By specifying a larger increments, we spread the load around. 573088d59eSdrh# 583088d59eSdrhdo_test bitvec-1.5 { 593088d59eSdrh sqlite3BitvecBuiltinTest 400 {1 400 1 7 0} 603088d59eSdrh} 0 613088d59eSdrhdo_test bitvec-1.6 { 623088d59eSdrh sqlite3BitvecBuiltinTest 4000 {1 4000 1 7 0} 633088d59eSdrh} 0 643088d59eSdrhdo_test bitvec-1.7 { 653088d59eSdrh sqlite3BitvecBuiltinTest 40000 {1 40000 1 7 0} 663088d59eSdrh} 0 673088d59eSdrhdo_test bitvec-1.8 { 683088d59eSdrh sqlite3BitvecBuiltinTest 400000 {1 400000 1 7 0} 693088d59eSdrh} 0 703088d59eSdrh 713088d59eSdrh# First fill up the bitmap with ones, then go through and 723088d59eSdrh# clear all the bits. This will stress the clearing mechanism. 733088d59eSdrh# 743088d59eSdrhdo_test bitvec-1.9 { 753088d59eSdrh sqlite3BitvecBuiltinTest 400 {1 400 1 1 2 400 1 1 0} 763088d59eSdrh} 0 773088d59eSdrhdo_test bitvec-1.10 { 783088d59eSdrh sqlite3BitvecBuiltinTest 4000 {1 4000 1 1 2 4000 1 1 0} 793088d59eSdrh} 0 803088d59eSdrhdo_test bitvec-1.11 { 813088d59eSdrh sqlite3BitvecBuiltinTest 40000 {1 40000 1 1 2 40000 1 1 0} 823088d59eSdrh} 0 833088d59eSdrhdo_test bitvec-1.12 { 843088d59eSdrh sqlite3BitvecBuiltinTest 400000 {1 400000 1 1 2 400000 1 1 0} 853088d59eSdrh} 0 863088d59eSdrh 873088d59eSdrhdo_test bitvec-1.13 { 883088d59eSdrh sqlite3BitvecBuiltinTest 400 {1 400 1 1 2 400 1 7 0} 893088d59eSdrh} 0 903088d59eSdrhdo_test bitvec-1.15 { 913088d59eSdrh sqlite3BitvecBuiltinTest 4000 {1 4000 1 1 2 4000 1 7 0} 923088d59eSdrh} 0 933088d59eSdrhdo_test bitvec-1.16 { 943088d59eSdrh sqlite3BitvecBuiltinTest 40000 {1 40000 1 1 2 40000 1 77 0} 953088d59eSdrh} 0 963088d59eSdrhdo_test bitvec-1.17 { 973088d59eSdrh sqlite3BitvecBuiltinTest 400000 {1 400000 1 1 2 400000 1 777 0} 983088d59eSdrh} 0 993088d59eSdrh 1003088d59eSdrhdo_test bitvec-1.18 { 1013088d59eSdrh sqlite3BitvecBuiltinTest 400000 {1 5000 100000 1 2 400000 1 37 0} 1023088d59eSdrh} 0 1033088d59eSdrh 1043088d59eSdrh# Attempt to induce hash collisions. 1053088d59eSdrh# 1063088d59eSdrhunset -nocomplain start 1073088d59eSdrhunset -nocomplain incr 1083088d59eSdrhforeach start {1 2 3 4 5 6 7 8} { 1093088d59eSdrh foreach incr {124 125} { 1103088d59eSdrh do_test bitvec-1.20.$start.$incr { 1113088d59eSdrh set prog [list 1 60 $::start $::incr 2 5000 1 1 0] 1123088d59eSdrh sqlite3BitvecBuiltinTest 5000 $prog 1133088d59eSdrh } 0 1143088d59eSdrh } 1153088d59eSdrh} 1163088d59eSdrh 1173088d59eSdrhdo_test bitvec-1.30.big_and_slow { 1183088d59eSdrh sqlite3BitvecBuiltinTest 17000000 {1 17000000 1 1 2 17000000 1 1 0} 1193088d59eSdrh} 0 1203088d59eSdrh 1213088d59eSdrh 1223088d59eSdrh# Test setting and clearing a random subset of bits. 1233088d59eSdrh# 124f5e7bb51Sdrhdo_test bitvec-2.1 { 1253088d59eSdrh sqlite3BitvecBuiltinTest 4000 {3 2000 4 2000 0} 1263088d59eSdrh} 0 127f5e7bb51Sdrhdo_test bitvec-2.2 { 1283088d59eSdrh sqlite3BitvecBuiltinTest 4000 {3 1000 4 1000 3 1000 4 1000 3 1000 4 1000 1293088d59eSdrh 3 1000 4 1000 3 1000 4 1000 3 1000 4 1000 0} 1303088d59eSdrh} 0 131f5e7bb51Sdrhdo_test bitvec-2.3 { 1323088d59eSdrh sqlite3BitvecBuiltinTest 400000 {3 10 0} 1333088d59eSdrh} 0 134f5e7bb51Sdrhdo_test bitvec-2.4 { 1353088d59eSdrh sqlite3BitvecBuiltinTest 4000 {3 10 2 4000 1 1 0} 1363088d59eSdrh} 0 1373088d59eSdrhdo_test bitvec-2.5 { 1383088d59eSdrh sqlite3BitvecBuiltinTest 5000 {3 20 2 5000 1 1 0} 1393088d59eSdrh} 0 1403088d59eSdrhdo_test bitvec-2.6 { 1413088d59eSdrh sqlite3BitvecBuiltinTest 50000 {3 60 2 50000 1 1 0} 1423088d59eSdrh} 0 143*64f798ddSdrhdo_test bitvec-2.7 { 144*64f798ddSdrh sqlite3BitvecBuiltinTest 5000 { 145*64f798ddSdrh 1 25 121 125 146*64f798ddSdrh 1 50 121 125 147*64f798ddSdrh 2 25 121 125 148*64f798ddSdrh 0 149*64f798ddSdrh } 150*64f798ddSdrh} 0 151f5e7bb51Sdrh 1523088d59eSdrh# This procedure runs sqlite3BitvecBuiltinTest with argments "n" and 1533088d59eSdrh# "program". But it also causes a malloc error to occur after the 1543088d59eSdrh# "failcnt"-th malloc. The result should be "0" if no malloc failure 1553088d59eSdrh# occurs or "-1" if there is a malloc failure. 1563088d59eSdrh# 1573088d59eSdrhproc bitvec_malloc_test {label failcnt n program} { 1583088d59eSdrh do_test $label [subst { 1593088d59eSdrh sqlite3_memdebug_fail $failcnt 1603088d59eSdrh set x \[sqlite3BitvecBuiltinTest $n [list $program]\] 1613088d59eSdrh set nFail \[sqlite3_memdebug_fail -1\] 1623088d59eSdrh if {\$nFail==0} { 1633088d59eSdrh set ::go 0 1643088d59eSdrh set x -1 165f5e7bb51Sdrh } 1663088d59eSdrh set x 1673088d59eSdrh }] -1 1683088d59eSdrh} 1693088d59eSdrh 1703088d59eSdrh# Make sure malloc failures are handled sanily. 1713088d59eSdrh# 1723088d59eSdrhunset -nocomplain n 1733088d59eSdrhunset -nocomplain go 1743088d59eSdrhset go 1 1753088d59eSdrhsave_prng_state 1763088d59eSdrhfor {set n 0} {$go} {incr n} { 1773088d59eSdrh restore_prng_state 1783088d59eSdrh bitvec_malloc_test bitvec-3.1.$n $n 5000 { 1793088d59eSdrh 3 60 2 5000 1 1 3 60 2 5000 1 1 3 60 2 5000 1 1 0 180f5e7bb51Sdrh } 181f5e7bb51Sdrh} 1823088d59eSdrhset go 1 1833088d59eSdrhfor {set n 0} {$go} {incr n} { 1843088d59eSdrh restore_prng_state 1853088d59eSdrh bitvec_malloc_test bitvec-3.2.$n $n 5000 { 1863088d59eSdrh 3 600 2 5000 1 1 3 600 2 5000 1 1 3 600 2 5000 1 1 0 187f5e7bb51Sdrh } 188f5e7bb51Sdrh} 1893088d59eSdrhset go 1 1903088d59eSdrhfor {set n 1} {$go} {incr n} { 1913088d59eSdrh bitvec_malloc_test bitvec-3.3.$n $n 50000 {1 50000 1 1 0} 192f5e7bb51Sdrh} 1933088d59eSdrh 1943088d59eSdrhfinish_test 1953088d59eSdrhreturn 196