blob: 7f1a9233812d0cd058078dbfac76db16feee2149 [file] [log] [blame] [raw]
# vim:set ft= ts=4 sw=4 et fdm=marker:
use lib 'lib';
use Test::Nginx::Socket::Lua;
repeat_each(10);
plan tests => blocks() * repeat_each() * 2;
#$ENV{LUA_PATH} = $ENV{HOME} . '/work/JSON4Lua-0.9.30/json/?.lua';
$ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;
$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;
no_long_string();
run_tests();
__DATA__
=== TEST 1: sanity
--- config
location /foo {
rewrite_by_lua '
local res1, res2 = ngx.location.capture_multi{
{ "/a" },
{ "/b" },
}
ngx.say("res1.status = " .. res1.status)
ngx.say("res1.body = " .. res1.body)
ngx.say("res2.status = " .. res2.status)
ngx.say("res2.body = " .. res2.body)
';
content_by_lua return;
}
location /a {
echo -n a;
}
location /b {
echo -n b;
}
--- request
GET /foo
--- response_body
res1.status = 200
res1.body = a
res2.status = 200
res2.body = b
=== TEST 2: 4 concurrent requests
--- config
location /foo {
rewrite_by_lua '
local res1, res2, res3, res4 = ngx.location.capture_multi{
{ "/a" },
{ "/b" },
{ "/c" },
{ "/d" },
}
ngx.say("res1.status = " .. res1.status)
ngx.say("res1.body = " .. res1.body)
ngx.say("res2.status = " .. res2.status)
ngx.say("res2.body = " .. res2.body)
ngx.say("res3.status = " .. res3.status)
ngx.say("res3.body = " .. res3.body)
ngx.say("res4.status = " .. res4.status)
ngx.say("res4.body = " .. res4.body)
';
content_by_lua return;
}
location ~ '^/([a-d])$' {
echo -n $1;
}
--- request
GET /foo
--- response_body
res1.status = 200
res1.body = a
res2.status = 200
res2.body = b
res3.status = 200
res3.body = c
res4.status = 200
res4.body = d
=== TEST 3: capture multi in series
--- config
location /foo {
rewrite_by_lua '
local res1, res2 = ngx.location.capture_multi{
{ "/a" },
{ "/b" },
}
ngx.say("res1.status = " .. res1.status)
ngx.say("res1.body = " .. res1.body)
ngx.say("res2.status = " .. res2.status)
ngx.say("res2.body = " .. res2.body)
res1, res2 = ngx.location.capture_multi{
{ "/a" },
{ "/b" },
}
ngx.say("2 res1.status = " .. res1.status)
ngx.say("2 res1.body = " .. res1.body)
ngx.say("2 res2.status = " .. res2.status)
ngx.say("2 res2.body = " .. res2.body)
';
content_by_lua return;
}
location /a {
echo -n a;
}
location /b {
echo -n b;
}
--- request
GET /foo
--- response_body
res1.status = 200
res1.body = a
res2.status = 200
res2.body = b
2 res1.status = 200
2 res1.body = a
2 res2.status = 200
2 res2.body = b
=== TEST 4: capture multi in subrequest
--- config
location /foo {
rewrite_by_lua '
local res1, res2 = ngx.location.capture_multi{
{ "/a" },
{ "/b" },
}
local n = ngx.var.arg_n
ngx.say(n .. " res1.status = " .. res1.status)
ngx.say(n .. " res1.body = " .. res1.body)
ngx.say(n .. " res2.status = " .. res2.status)
ngx.say(n .. " res2.body = " .. res2.body)
';
content_by_lua return;
}
location /main {
rewrite_by_lua '
res = ngx.location.capture("/foo?n=1")
ngx.say("top res.status = " .. res.status)
ngx.say("top res.body = [" .. res.body .. "]")
';
content_by_lua return;
}
location /a {
echo -n a;
}
location /b {
echo -n b;
}
--- request
GET /main
--- response_body
top res.status = 200
top res.body = [1 res1.status = 200
1 res1.body = a
1 res2.status = 200
1 res2.body = b
]
=== TEST 5: capture multi in parallel
--- config
location ~ '^/(foo|bar)$' {
set $tag $1;
rewrite_by_lua '
local res1, res2
if ngx.var.tag == "foo" then
res1, res2 = ngx.location.capture_multi{
{ "/a" },
{ "/b" },
}
else
res1, res2 = ngx.location.capture_multi{
{ "/c" },
{ "/d" },
}
end
local n = ngx.var.arg_n
ngx.say(n .. " res1.status = " .. res1.status)
ngx.say(n .. " res1.body = " .. res1.body)
ngx.say(n .. " res2.status = " .. res2.status)
ngx.say(n .. " res2.body = " .. res2.body)
';
content_by_lua return;
}
location /main {
rewrite_by_lua '
local res1, res2 = ngx.location.capture_multi{
{ "/foo?n=1" },
{ "/bar?n=2" },
}
ngx.say("top res1.status = " .. res1.status)
ngx.say("top res1.body = [" .. res1.body .. "]")
ngx.say("top res2.status = " .. res2.status)
ngx.say("top res2.body = [" .. res2.body .. "]")
';
content_by_lua return;
}
location ~ '^/([abcd])$' {
echo -n $1;
}
--- request
GET /main
--- response_body
top res1.status = 200
top res1.body = [1 res1.status = 200
1 res1.body = a
1 res2.status = 200
1 res2.body = b
]
top res2.status = 200
top res2.body = [2 res1.status = 200
2 res1.body = c
2 res2.status = 200
2 res2.body = d
]
=== TEST 6: memc sanity
--- config
location /foo {
rewrite_by_lua '
local res1, res2 = ngx.location.capture_multi{
{ "/a" },
{ "/b" },
}
ngx.say("res1.status = " .. res1.status)
ngx.say("res1.body = " .. res1.body)
ngx.say("res2.status = " .. res2.status)
ngx.say("res2.body = " .. res2.body)
';
content_by_lua return;
}
location ~ '^/[ab]$' {
set $memc_key $uri;
set $memc_value hello;
set $memc_cmd set;
memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;
}
--- request
GET /foo
--- response_body eval
"res1.status = 201
res1.body = STORED\r
res2.status = 201
res2.body = STORED\r
"
=== TEST 7: memc muti + multi
--- config
location /main {
rewrite_by_lua '
local res1, res2 = ngx.location.capture_multi{
{ "/foo?n=1" },
{ "/bar?n=2" },
}
ngx.say("res1.status = " .. res1.status)
ngx.say("res1.body = [" .. res1.body .. "]")
ngx.say("res2.status = " .. res2.status)
ngx.say("res2.body = [" .. res2.body .. "]")
';
content_by_lua return;
}
location ~ '^/(foo|bar)$' {
set $tag $1;
rewrite_by_lua '
local res1, res2
if ngx.var.tag == "foo" then
res1, res2 = ngx.location.capture_multi{
{ "/a" },
{ "/b" },
}
else
res1, res2 = ngx.location.capture_multi{
{ "/c" },
{ "/d" },
}
end
print("args: " .. ngx.var.args)
local n = ngx.var.arg_n
ngx.say(n .. " res1.status = " .. res1.status)
ngx.say(n .. " res1.body = " .. res1.body)
ngx.say(n .. " res2.status = " .. res2.status)
ngx.say(n .. " res2.body = " .. res2.body)
';
content_by_lua return;
}
location ~ '^/[abcd]$' {
set $memc_key $uri;
set $memc_value hello;
set $memc_cmd set;
memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;
}
--- request
GET /main
--- response_body eval
"res1.status = 200
res1.body = [1 res1.status = 201
1 res1.body = STORED\r
1 res2.status = 201
1 res2.body = STORED\r
]
res2.status = 200
res2.body = [2 res1.status = 201
2 res1.body = STORED\r
2 res2.status = 201
2 res2.body = STORED\r
]
"
=== TEST 8: memc 4 concurrent requests
--- config
location /foo {
rewrite_by_lua '
local res1, res2, res3, res4 = ngx.location.capture_multi{
{ "/a" },
{ "/b" },
{ "/c" },
{ "/d" },
}
ngx.say("res1.status = " .. res1.status)
ngx.say("res1.body = " .. res1.body)
ngx.say("res2.status = " .. res2.status)
ngx.say("res2.body = " .. res2.body)
ngx.say("res3.status = " .. res3.status)
ngx.say("res3.body = " .. res3.body)
ngx.say("res4.status = " .. res4.status)
ngx.say("res4.body = " .. res4.body)
';
content_by_lua return;
}
location ~ '^/[a-d]$' {
set $memc_key $uri;
set $memc_value hello;
set $memc_cmd set;
memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;
}
--- request
GET /foo
--- response_body eval
"res1.status = 201
res1.body = STORED\r
res2.status = 201
res2.body = STORED\r
res3.status = 201
res3.body = STORED\r
res4.status = 201
res4.body = STORED\r
"