]> git.saurik.com Git - redis.git/blob - tests/unit/multi.tcl
9069b95bef8bc992fdcc4d266bcdf9328222e012
[redis.git] / tests / unit / multi.tcl
1 start_server {tags {"multi"}} {
2 test {MUTLI / EXEC basics} {
3 r del mylist
4 r rpush mylist a
5 r rpush mylist b
6 r rpush mylist c
7 r multi
8 set v1 [r lrange mylist 0 -1]
9 set v2 [r ping]
10 set v3 [r exec]
11 list $v1 $v2 $v3
12 } {QUEUED QUEUED {{a b c} PONG}}
13
14 test {DISCARD} {
15 r del mylist
16 r rpush mylist a
17 r rpush mylist b
18 r rpush mylist c
19 r multi
20 set v1 [r del mylist]
21 set v2 [r discard]
22 set v3 [r lrange mylist 0 -1]
23 list $v1 $v2 $v3
24 } {QUEUED OK {a b c}}
25
26 test {Nested MULTI are not allowed} {
27 set err {}
28 r multi
29 catch {[r multi]} err
30 r exec
31 set _ $err
32 } {*ERR MULTI*}
33
34 test {MULTI where commands alter argc/argv} {
35 r sadd myset a
36 r multi
37 r spop myset
38 list [r exec] [r exists myset]
39 } {a 0}
40
41 test {WATCH inside MULTI is not allowed} {
42 set err {}
43 r multi
44 catch {[r watch x]} err
45 r exec
46 set _ $err
47 } {*ERR WATCH*}
48
49 test {EXEC works on WATCHed key not modified} {
50 r watch x y z
51 r watch k
52 r multi
53 r ping
54 r exec
55 } {PONG}
56
57 test {EXEC fail on WATCHed key modified (1 key of 1 watched)} {
58 r set x 30
59 r watch x
60 r set x 40
61 r multi
62 r ping
63 r exec
64 } {}
65
66 test {EXEC fail on WATCHed key modified (1 key of 5 watched)} {
67 r set x 30
68 r watch a b x k z
69 r set x 40
70 r multi
71 r ping
72 r exec
73 } {}
74
75 test {EXEC fail on WATCHed key modified by SORT with STORE even if the result is empty} {
76 r flushdb
77 r lpush foo bar
78 r watch foo
79 r sort emptylist store foo
80 r multi
81 r ping
82 r exec
83 } {}
84
85 test {After successful EXEC key is no longer watched} {
86 r set x 30
87 r watch x
88 r multi
89 r ping
90 r exec
91 r set x 40
92 r multi
93 r ping
94 r exec
95 } {PONG}
96
97 test {After failed EXEC key is no longer watched} {
98 r set x 30
99 r watch x
100 r set x 40
101 r multi
102 r ping
103 r exec
104 r set x 40
105 r multi
106 r ping
107 r exec
108 } {PONG}
109
110 test {It is possible to UNWATCH} {
111 r set x 30
112 r watch x
113 r set x 40
114 r unwatch
115 r multi
116 r ping
117 r exec
118 } {PONG}
119
120 test {UNWATCH when there is nothing watched works as expected} {
121 r unwatch
122 } {OK}
123
124 test {FLUSHALL is able to touch the watched keys} {
125 r set x 30
126 r watch x
127 r flushall
128 r multi
129 r ping
130 r exec
131 } {}
132
133 test {FLUSHALL does not touch non affected keys} {
134 r del x
135 r watch x
136 r flushall
137 r multi
138 r ping
139 r exec
140 } {PONG}
141
142 test {FLUSHDB is able to touch the watched keys} {
143 r set x 30
144 r watch x
145 r flushdb
146 r multi
147 r ping
148 r exec
149 } {}
150
151 test {FLUSHDB does not touch non affected keys} {
152 r del x
153 r watch x
154 r flushdb
155 r multi
156 r ping
157 r exec
158 } {PONG}
159
160 test {WATCH is able to remember the DB a key belongs to} {
161 r select 5
162 r set x 30
163 r watch x
164 r select 1
165 r set x 10
166 r select 5
167 r multi
168 r ping
169 r exec
170 } {PONG}
171
172 test {WATCH will consider touched keys target of EXPIRE} {
173 r del x
174 r set x foo
175 r watch x
176 r expire x 10
177 r multi
178 r ping
179 r exec
180 } {}
181
182 test {WATCH will not consider touched expired keys} {
183 r del x
184 r set x foo
185 r expire x 1
186 r watch x
187 after 1100
188 r multi
189 r ping
190 r exec
191 } {PONG}
192
193 test {DISCARD should clear the WATCH dirty flag on the client} {
194 r watch x
195 r set x 10
196 r multi
197 r discard
198 r multi
199 r incr x
200 r exec
201 } {11}
202
203 test {DISCARD should UNWATCH all the keys} {
204 r watch x
205 r set x 10
206 r multi
207 r discard
208 r set x 10
209 r multi
210 r incr x
211 r exec
212 } {11}
213 }