summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2016-03-02 15:15:18 +0100
committerantirez <antirez@gmail.com>2016-03-02 15:16:17 +0100
commit9a00da0d1470f83fa5927ac05923ef207fd19f64 (patch)
tree5789392ec7e154d2d73af9bba270f3c8b0b8f370 /tests
parent27fc01a7b864572b85f64aad5efffb7199ec0dba (diff)
downloadredis-9a00da0d1470f83fa5927ac05923ef207fd19f64.tar.gz
BITFIELD: overflow fuzzy testing.
Diffstat (limited to 'tests')
-rw-r--r--tests/test_helper.tcl1
-rw-r--r--tests/unit/bitfield.tcl52
2 files changed, 53 insertions, 0 deletions
diff --git a/tests/test_helper.tcl b/tests/test_helper.tcl
index 9647511e5..45cecfdde 100644
--- a/tests/test_helper.tcl
+++ b/tests/test_helper.tcl
@@ -49,6 +49,7 @@ set ::all_tests {
unit/limits
unit/obuf-limits
unit/bitops
+ unit/bitfield
unit/memefficiency
unit/hyperloglog
unit/lazyfree
diff --git a/tests/unit/bitfield.tcl b/tests/unit/bitfield.tcl
new file mode 100644
index 000000000..b4acb78d0
--- /dev/null
+++ b/tests/unit/bitfield.tcl
@@ -0,0 +1,52 @@
+start_server {tags {"bitops"}} {
+ test {BITFIELD overflow check fuzzing} {
+ for {set j 0} {$j < 1000} {incr j} {
+ set bits [expr {[randomInt 64]+1}]
+ set sign [randomInt 2]
+ set range [expr {2**$bits}]
+ if {$bits == 64} {set sign 1} ; # u64 is not supported by BITFIELD.
+ if {$sign} {
+ set min [expr {-($range/2)}]
+ set type "i$bits"
+ } else {
+ set min 0
+ set type "u$bits"
+ }
+ set max [expr {$min+$range-1}]
+ # Compare Tcl vs Redis
+ set range2 [expr {$range*2}]
+ set value [expr {($min*2)+[randomInt $range2]}]
+ set increment [expr {($min*2)+[randomInt $range2]}]
+ if {$value > 9223372036854775807} {
+ set value 9223372036854775807
+ }
+ if {$value < -9223372036854775808} {
+ set value -9223372036854775808
+ }
+ if {$increment > 9223372036854775807} {
+ set increment 9223372036854775807
+ }
+ if {$increment < -9223372036854775808} {
+ set increment -9223372036854775808
+ }
+
+ set overflow 0
+ if {$value > $max || $value < $min} {set overflow 1}
+ if {($value + $increment) > $max} {set overflow 1}
+ if {($value + $increment) < $min} {set overflow 1}
+
+ r del bits
+ set res1 [r bitfield bits overflow fail set $type 0 $value]
+ set res2 [r bitfield bits overflow fail incrby $type 0 $increment]
+
+ if {$overflow && [lindex $res1 0] ne {} &&
+ [lindex $res2 0] ne {}} {
+ fail "OW not detected where needed: $type $value+$increment"
+ }
+ if {!$overflow && ([lindex $res1 0] eq {} ||
+ [lindex $res2 0] eq {})} {
+ fail "OW detected where NOT needed: $type $value+$increment"
+ }
+ }
+ }
+}