valkey/tests/unit/scan.tcl

199 lines
5.1 KiB
Tcl
Raw Normal View History

2013-10-30 10:34:01 +00:00
start_server {tags {"scan"}} {
test "SCAN basic" {
r flushdb
r debug populate 1000
set cur 0
set keys {}
while 1 {
set res [r scan $cur]
set cur [lindex $res 0]
set k [lindex $res 1]
lappend keys {*}$k
2013-10-30 10:34:01 +00:00
if {$cur == 0} break
}
set keys [lsort -unique $keys]
2013-10-30 10:34:01 +00:00
assert_equal 1000 [llength $keys]
}
test "SCAN COUNT" {
r flushdb
r debug populate 1000
set cur 0
set keys {}
while 1 {
set res [r scan $cur count 5]
set cur [lindex $res 0]
set k [lindex $res 1]
lappend keys {*}$k
2013-10-30 10:34:01 +00:00
if {$cur == 0} break
}
set keys [lsort -unique $keys]
2013-10-30 10:34:01 +00:00
assert_equal 1000 [llength $keys]
}
test "SCAN MATCH" {
r flushdb
r debug populate 1000
set cur 0
set keys {}
while 1 {
set res [r scan $cur match "key:1??"]
set cur [lindex $res 0]
set k [lindex $res 1]
lappend keys {*}$k
2013-10-30 10:34:01 +00:00
if {$cur == 0} break
}
set keys [lsort -unique $keys]
2013-10-30 10:34:01 +00:00
assert_equal 100 [llength $keys]
}
2013-10-30 10:58:04 +00:00
foreach enc {intset hashtable} {
test "SSCAN with encoding $enc" {
# Create the Set
r del set
if {$enc eq {intset}} {
set prefix ""
} else {
set prefix "ele:"
}
set elements {}
for {set j 0} {$j < 100} {incr j} {
lappend elements ${prefix}${j}
}
r sadd set {*}$elements
# Verify that the encoding matches.
assert {[r object encoding set] eq $enc}
# Test SSCAN
set cur 0
set keys {}
while 1 {
set res [r sscan set $cur]
set cur [lindex $res 0]
set k [lindex $res 1]
lappend keys {*}$k
if {$cur == 0} break
}
set keys [lsort -unique $keys]
assert_equal 100 [llength $keys]
}
}
2013-10-30 15:24:39 +00:00
foreach enc {ziplist hashtable} {
test "HSCAN with encoding $enc" {
# Create the Hash
r del hash
if {$enc eq {ziplist}} {
set count 30
} else {
set count 1000
}
set elements {}
for {set j 0} {$j < $count} {incr j} {
lappend elements key:$j $j
}
r hmset hash {*}$elements
# Verify that the encoding matches.
assert {[r object encoding hash] eq $enc}
# Test HSCAN
set cur 0
set keys {}
while 1 {
set res [r hscan hash $cur]
set cur [lindex $res 0]
set k [lindex $res 1]
lappend keys {*}$k
if {$cur == 0} break
}
set keys2 {}
foreach {k v} $keys {
assert {$k eq "key:$v"}
lappend keys2 $k
}
set keys2 [lsort -unique $keys2]
assert_equal $count [llength $keys2]
}
}
2013-10-30 15:25:47 +00:00
foreach enc {ziplist skiplist} {
test "ZSCAN with encoding $enc" {
# Create the Sorted Set
r del zset
if {$enc eq {ziplist}} {
set count 30
} else {
set count 1000
}
set elements {}
for {set j 0} {$j < $count} {incr j} {
lappend elements $j key:$j
}
r zadd zset {*}$elements
# Verify that the encoding matches.
assert {[r object encoding zset] eq $enc}
# Test ZSCAN
set cur 0
set keys {}
while 1 {
set res [r zscan zset $cur]
set cur [lindex $res 0]
set k [lindex $res 1]
lappend keys {*}$k
if {$cur == 0} break
}
set keys2 {}
foreach {k v} $keys {
assert {$k eq "key:$v"}
lappend keys2 $k
}
set keys2 [lsort -unique $keys2]
assert_equal $count [llength $keys2]
}
}
test "SCAN guarantees check under write load" {
r flushdb
r debug populate 100
# We start scanning here, so keys from 0 to 99 should all be
# reported at the end of the iteration.
set keys {}
while 1 {
set res [r scan $cur]
set cur [lindex $res 0]
set k [lindex $res 1]
lappend keys {*}$k
if {$cur == 0} break
# Write 10 random keys at every SCAN iteration.
for {set j 0} {$j < 10} {incr j} {
r set addedkey:[randomInt 1000] foo
}
}
set keys2 {}
foreach k $keys {
if {[string length $k] > 6} continue
lappend keys2 $k
}
set keys2 [lsort -unique $keys2]
assert_equal 100 [llength $keys2]
}
2013-10-30 10:34:01 +00:00
}