bitvec.test 4.9 KB

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