xref: /redis-3.2.3/tests/unit/keyspace.tcl (revision 3b4de6aa)
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 {SET/GET keys in different DBs} {
197        r set a hello
198        r set b world
199        r select 10
200        r set a foo
201        r set b bared
202        r select 9
203        set res {}
204        lappend res [r get a]
205        lappend res [r get b]
206        r select 10
207        lappend res [r get a]
208        lappend res [r get b]
209        r select 9
210        format $res
211    } {hello world foo bared}
212
213    test {RANDOMKEY} {
214        r flushdb
215        r set foo x
216        r set bar y
217        set foo_seen 0
218        set bar_seen 0
219        for {set i 0} {$i < 100} {incr i} {
220            set rkey [r randomkey]
221            if {$rkey eq {foo}} {
222                set foo_seen 1
223            }
224            if {$rkey eq {bar}} {
225                set bar_seen 1
226            }
227        }
228        list $foo_seen $bar_seen
229    } {1 1}
230
231    test {RANDOMKEY against empty DB} {
232        r flushdb
233        r randomkey
234    } {}
235
236    test {RANDOMKEY regression 1} {
237        r flushdb
238        r set x 10
239        r del x
240        r randomkey
241    } {}
242
243    test {KEYS * two times with long key, Github issue #1208} {
244        r flushdb
245        r set dlskeriewrioeuwqoirueioqwrueoqwrueqw test
246        r keys *
247        r keys *
248    } {dlskeriewrioeuwqoirueioqwrueoqwrueqw}
249}
250