From 9a00da0d1470f83fa5927ac05923ef207fd19f64 Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 2 Mar 2016 15:15:18 +0100 Subject: BITFIELD: overflow fuzzy testing. --- tests/test_helper.tcl | 1 + tests/unit/bitfield.tcl | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 tests/unit/bitfield.tcl (limited to 'tests') 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" + } + } + } +} -- cgit v1.2.1