2011-02-03 18:35:54 +03:00
|
|
|
# vim:set ft= ts=4 sw=4 et fdm=marker:
|
|
|
|
|
2013-12-06 02:46:51 +04:00
|
|
|
use Test::Nginx::Socket::Lua;
|
2011-02-03 18:35:54 +03:00
|
|
|
|
|
|
|
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 {
|
|
|
|
access_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 {
|
|
|
|
access_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 {
|
|
|
|
access_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 {
|
|
|
|
access_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 {
|
|
|
|
access_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 {
|
|
|
|
access_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 {
|
|
|
|
access_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 {
|
|
|
|
access_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
|
|
|
|
|
|
|
|
"
|
|
|
|
|