xref: /sqlite-3.40.0/test/bitvec.test (revision 64f798dd)
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