1 start_server
{tags
{"scripting"}} {
2 test
{EVAL
- Does Lua interpreter replies to our requests?
} {
3 r
eval {return 'hello'
} 0
6 test
{EVAL
- Lua integer
-> Redis protocol type conversion
} {
7 r
eval {return 100.5} 0
10 test
{EVAL
- Lua
string -> Redis protocol type conversion
} {
11 r
eval {return 'hello world'
} 0
14 test
{EVAL
- Lua true boolean
-> Redis protocol type conversion
} {
15 r
eval {return true
} 0
18 test
{EVAL
- Lua false boolean
-> Redis protocol type conversion
} {
19 r
eval {return false
} 0
22 test
{EVAL
- Lua status code reply
-> Redis protocol type conversion
} {
23 r
eval {return {ok
='fine'
}} 0
26 test
{EVAL
- Lua
error reply
-> Redis protocol type conversion
} {
28 r
eval {return {err
='this is an
error'
}} 0
33 test
{EVAL
- Lua table
-> Redis protocol type conversion
} {
34 r
eval {return {1,2,3,'ciao'
,{1,2}}} 0
37 test
{EVAL
- Are the KEYS and ARGS arrays populated correctly?
} {
38 r
eval {return {KEYS
[1],KEYS
[2],ARGV
[1],ARGV
[2]}} 2 a b c d
41 test
{EVAL
- is Lua able to call Redis API?
} {
43 r
eval {return redis.call
('get'
,'mykey'
)} 0
46 test
{EVALSHA
- Can we call a SHA1
if already defined?
} {
47 r evalsha
9bd632c7d33e571e9f24556ebed26c3479a87129
0
50 test
{EVALSHA
- Do we get an
error on invalid SHA1?
} {
51 catch {r evalsha NotValidShaSUM
0} e
55 test
{EVALSHA
- Do we get an
error on non defined SHA1?
} {
56 catch {r evalsha ffd632c7d33e571e9f24556ebed26c3479a87130
0} e
60 test
{EVAL
- Redis integer
-> Lua type conversion
} {
62 local foo
= redis.pcall
('
incr'
,'x'
)
63 return {type
(foo
),foo
}
67 test
{EVAL
- Redis bulk
-> Lua type conversion
} {
70 local foo
= redis.pcall
('get'
,'mykey'
)
71 return {type
(foo
),foo
}
75 test
{EVAL
- Redis multi bulk
-> Lua type conversion
} {
81 local foo
= redis.pcall
('
lrange'
,'mylist'
,0,-1)
82 return {type
(foo
),foo
[1],foo
[2],foo
[3],# foo}
86 test
{EVAL
- Redis status reply
-> Lua type conversion
} {
88 local foo
= redis.pcall
('
set'
,'mykey'
,'myval'
)
89 return {type
(foo
),foo
['ok'
]}
93 test
{EVAL
- Redis
error reply
-> Lua type conversion
} {
96 local foo
= redis.pcall
('
incr'
,'mykey'
)
97 return {type
(foo
),foo
['err'
]}
99 } {table
{ERR value is not an integer or out of range
}}
101 test
{EVAL
- Redis nil bulk reply
-> Lua type conversion
} {
104 local foo
= redis.pcall
('get'
,'mykey'
)
105 return {type
(foo
),foo
== false
}
109 test
{EVAL
- Is Lua affecting the currently selected DB?
} {
110 r
set mykey
"this is DB 9"
112 r
set mykey
"this is DB 10"
113 r
eval {return redis.pcall
('get'
,'mykey'
)} 0
116 test
{EVAL
- Is Lua seleced DB retained?
} {
117 r
eval {return redis.pcall
('select'
,'
9'
)} 0
121 test
{EVAL
- Script can't run more than configured
time limit
} {
122 r config
set lua-time-limit
1
126 while true do i
=i
+1 end
132 test
{EVAL
- Scripts can't run certain commands
} {
134 catch {r
eval {return redis.pcall
('spop'
,'x'
)} 0} e
138 test
{EVAL
- Scripts can't run certain commands
} {
141 r
eval "redis.pcall('randomkey'); return redis.pcall('set','x','ciao')" 0
144 } {*not allowed
after*}
146 test
{EVAL
- redis.call variant raises a Lua
error on Redis cmd
error (1)} {
149 r
eval "redis.call('nosuchcommand')" 0
154 test
{EVAL
- redis.call variant raises a Lua
error on Redis cmd
error (1)} {
157 r
eval "redis.call('get','a','b','c')" 0
162 test
{EVAL
- redis.call variant raises a Lua
error on Redis cmd
error (1)} {
166 r
eval "redis.call('lpush','foo','val')" 0
171 test
{SCRIPTING FLUSH
- is able to clear the scripts cache?
} {
173 set v
[r evalsha
9bd632c7d33e571e9f24556ebed26c3479a87129
0]
174 assert_equal
$v myval
177 catch {r evalsha
9bd632c7d33e571e9f24556ebed26c3479a87129
0} e
181 test
{SCRIPT EXISTS
- can detect already defined scripts?
} {
182 r
eval "return 1+1" 0
183 r script exists a27e7e8a43702b7046d4f6a7ccf5b60cef6b9bd9 a27e7e8a43702b7046d4f6a7ccf5b60cef6b9bda
186 test
{SCRIPT LOAD
- is able to register scripts in the scripting cache
} {
188 [r script
load "return 'loaded'"] \
189 [r evalsha b534286061d4b9e4026607613b95c06c06015ae8
0]
193 start_server
{tags
{"scripting repl"}} {
195 test
{Before the slave connects we issue an EVAL command
} {
196 r
eval {return redis.call
('
incr'
,'x'
)} 0
199 test
{Connect a slave to the main instance
} {
200 r
-1 slaveof
[srv
0 host
] [srv
0 port
]
205 test
{Now use EVALSHA against the master
} {
206 r evalsha ae3477e27be955de7e1bc9adfdca626b478d3cb2
0
209 if {$::valgrind} {after 2000} else {after 100}
211 test
{If EVALSHA was replicated as EVAL the slave should be ok
} {