xref: /redis-3.2.3/tests/unit/keyspace.tcl (revision 0a91fc45)
1start_server {tags {"keyspace"}} {
2    test {DEL against a single item} {
3        r set x foo
4        assert {[r get x] eq "foo"}
5        r del x
6        r get x
7    } {}
8
9    test {Vararg DEL} {
10        r set foo1 a
11        r set foo2 b
12        r set foo3 c
13        list [r del foo1 foo2 foo3 foo4] [r mget foo1 foo2 foo3]
14    } {3 {{} {} {}}}
15
16    test {KEYS with pattern} {
17        foreach key {key_x key_y key_z foo_a foo_b foo_c} {
18            r set $key hello
19        }
20        lsort [r keys foo*]
21    } {foo_a foo_b foo_c}
22
23    test {KEYS to get all keys} {
24        lsort [r keys *]
25    } {foo_a foo_b foo_c key_x key_y key_z}
26
27    test {DBSIZE} {
28        r dbsize
29    } {6}
30
31    test {DEL all keys} {
32        foreach key [r keys *] {r del $key}
33        r dbsize
34    } {0}
35
36    test "DEL against expired key" {
37        r debug set-active-expire 0
38        r setex keyExpire 1 valExpire
39        after 1100
40        assert_equal 0 [r del keyExpire]
41        r debug set-active-expire 1
42    }
43
44    test {EXISTS} {
45        set res {}
46        r set newkey test
47        append res [r exists newkey]
48        r del newkey
49        append res [r exists newkey]
50    } {10}
51
52    test {Zero length value in key. SET/GET/EXISTS} {
53        r set emptykey {}
54        set res [r get emptykey]
55        append res [r exists emptykey]
56        r del emptykey
57        append res [r exists emptykey]
58    } {10}
59
60    test {Commands pipelining} {
61        set fd [r channel]
62        puts -nonewline $fd "SET k1 xyzk\r\nGET k1\r\nPING\r\n"
63        flush $fd
64        set res {}
65        append res [string match OK* [r read]]
66        append res [r read]
67        append res [string match PONG* [r read]]
68        format $res
69    } {1xyzk1}
70
71    test {Non existing command} {
72        catch {r foobaredcommand} err
73        string match ERR* $err
74    } {1}
75
76    test {RENAME basic usage} {
77        r set mykey hello
78        r rename mykey mykey1
79        r rename mykey1 mykey2
80        r get mykey2
81    } {hello}
82
83    test {RENAME source key should no longer exist} {
84        r exists mykey
85    } {0}
86
87    test {RENAME against already existing key} {
88        r set mykey a
89        r set mykey2 b
90        r rename mykey2 mykey
91        set res [r get mykey]
92        append res [r exists mykey2]
93    } {b0}
94
95    test {RENAMENX basic usage} {
96        r del mykey
97        r del mykey2
98        r set mykey foobar
99        r renamenx mykey mykey2
100        set res [r get mykey2]
101        append res [r exists mykey]
102    } {foobar0}
103
104    test {RENAMENX against already existing key} {
105        r set mykey foo
106        r set mykey2 bar
107        r renamenx mykey mykey2
108    } {0}
109
110    test {RENAMENX against already existing key (2)} {
111        set res [r get mykey]
112        append res [r get mykey2]
113    } {foobar}
114
115    test {RENAME against non existing source key} {
116        catch {r rename nokey foobar} err
117        format $err
118    } {ERR*}
119
120    test {RENAME where source and dest key are the same (existing)} {
121        r set mykey foo
122        r rename mykey mykey
123    } {OK}
124
125    test {RENAMENX where source and dest key are the same (existing)} {
126        r set mykey foo
127        r renamenx mykey mykey
128    } {0}
129
130    test {RENAME where source and dest key are the same (non existing)} {
131        r del mykey
132        catch {r rename mykey mykey} err
133        format $err
134    } {ERR*}
135
136    test {RENAME with volatile key, should move the TTL as well} {
137        r del mykey mykey2
138        r set mykey foo
139        r expire mykey 100
140        assert {[r ttl mykey] > 95 && [r ttl mykey] <= 100}
141        r rename mykey mykey2
142        assert {[r ttl mykey2] > 95 && [r ttl mykey2] <= 100}
143    }
144
145    test {RENAME with volatile key, should not inherit TTL of target key} {
146        r del mykey mykey2
147        r set mykey foo
148        r set mykey2 bar
149        r expire mykey2 100
150        assert {[r ttl mykey] == -1 && [r ttl mykey2] > 0}
151        r rename mykey mykey2
152        r ttl mykey2
153    } {-1}
154
155    test {DEL all keys again (DB 0)} {
156        foreach key [r keys *] {
157            r del $key
158        }
159        r dbsize
160    } {0}
161
162    test {DEL all keys again (DB 1)} {
163        r select 10
164        foreach key [r keys *] {
165            r del $key
166        }
167        set res [r dbsize]
168        r select 9
169        format $res
170    } {0}
171
172    test {MOVE basic usage} {
173        r set mykey foobar
174        r move mykey 10
175        set res {}
176        lappend res [r exists mykey]
177        lappend res [r dbsize]
178        r select 10
179        lappend res [r get mykey]
180        lappend res [r dbsize]
181        r select 9
182        format $res
183    } [list 0 0 foobar 1]
184
185    test {MOVE against key existing in the target DB} {
186        r set mykey hello
187        r move mykey 10
188    } {0}
189
190    test {MOVE against non-integer DB (#1428)} {
191        r set mykey hello
192        catch {r move mykey notanumber} e
193        set e
194    } {*ERR*index out of range}
195
196    test {MOVE can move key expire metadata as well} {
197        r select 10
198        r flushdb
199        r select 9
200        r set mykey foo ex 100
201        r move mykey 10
202        assert {[r ttl mykey] == -2}
203        r select 10
204        assert {[r ttl mykey] > 0 && [r ttl mykey] <= 100}
205        assert {[r get mykey] eq "foo"}
206        r select 9
207    }
208
209    test {MOVE does not create an expire if it does not exist} {
210        r select 10
211        r flushdb
212        r select 9
213        r set mykey foo
214        r move mykey 10
215        assert {[r ttl mykey] == -2}
216        r select 10
217        assert {[r ttl mykey] == -1}
218        assert {[r get mykey] eq "foo"}
219        r select 9
220    }
221
222    test {SET/GET keys in different DBs} {
223        r set a hello
224        r set b world
225        r select 10
226        r set a foo
227        r set b bared
228        r select 9
229        set res {}
230        lappend res [r get a]
231        lappend res [r get b]
232        r select 10
233        lappend res [r get a]
234        lappend res [r get b]
235        r select 9
236        format $res
237    } {hello world foo bared}
238
239    test {RANDOMKEY} {
240        r flushdb
241        r set foo x
242        r set bar y
243        set foo_seen 0
244        set bar_seen 0
245        for {set i 0} {$i < 100} {incr i} {
246            set rkey [r randomkey]
247            if {$rkey eq {foo}} {
248                set foo_seen 1
249            }
250            if {$rkey eq {bar}} {
251                set bar_seen 1
252            }
253        }
254        list $foo_seen $bar_seen
255    } {1 1}
256
257    test {RANDOMKEY against empty DB} {
258        r flushdb
259        r randomkey
260    } {}
261
262    test {RANDOMKEY regression 1} {
263        r flushdb
264        r set x 10
265        r del x
266        r randomkey
267    } {}
268
269    test {KEYS * two times with long key, Github issue #1208} {
270        r flushdb
271        r set dlskeriewrioeuwqoirueioqwrueoqwrueqw test
272        r keys *
273        r keys *
274    } {dlskeriewrioeuwqoirueioqwrueoqwrueqw}
275}
276