blob: 201963992fff325b495b529114f013cf4a220f96 [file] [log] [blame] [raw]
# vim:set ft= ts=4 sw=4 et fdm=marker:
use lib 'lib';
use Test::Nginx::Socket::Lua;
worker_connections(1014);
#master_on();
#workers(4);
#log_level('warn');
no_root_location();
repeat_each(2);
plan tests => repeat_each() * (blocks() * 3 + 2);
our $HtmlDir = html_dir;
#$ENV{LUA_CPATH} = "/usr/local/openresty/lualib/?.so;" . $ENV{LUA_CPATH};
no_long_string();
run_tests();
__DATA__
=== TEST 1: ngx.exit(400) should abort print
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /memc_query {
internal;
set $memc_cmd $arg_cmd;
set_unescape_uri $memc_key $arg_key;
set_unescape_uri $memc_value $arg_value;
set $memc_exptime $arg_exptime;
memc_cmds_allowed get set add delete;
memc_pass 127.0.0.1:11211;
}
location = /test {
content_by_lua_file html/test.lua;
}
--- user_files
>>> test.lua
local memd = require 'memd'
ngx.exit(400)
local res = memd.query( { cmd = 'get', key = id } )
>>> memd.lua
module('memd', package.seeall)
local URL = '/memc_query'
local capture = ngx.location.capture
function query(arg)
if type(arg) ~= 'table' then
return nil
end
print("HELLO WORLD")
return capture(URL, { args = arg } )
end
--- request
GET /test?a
--- response_body_like: 400 Bad Request
--- no_error_log eval
["lua print: HELLO WORLD", q{the "$memc_key" variable is not set}]
--- error_code: 400
=== TEST 2: ngx.exit(400) should abort ngx.log
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /memc_query {
internal;
set $memc_cmd $arg_cmd;
set_unescape_uri $memc_key $arg_key;
set_unescape_uri $memc_value $arg_value;
set $memc_exptime $arg_exptime;
memc_cmds_allowed get set add delete;
memc_pass 127.0.0.1:11211;
}
location = /test {
content_by_lua_file html/test.lua;
}
--- user_files
>>> test.lua
local memd = require 'memd'
ngx.exit(400)
local res = memd.query( { cmd = 'get', key = id } )
>>> memd.lua
module('memd', package.seeall)
local URL = '/memc_query'
local capture = ngx.location.capture
local log = ngx.log
local level = ngx.ERR
function query(arg)
if type(arg) ~= 'table' then
return nil
end
log(level, "HELLO WORLD")
return capture(URL, { args = arg } )
end
--- request
GET /test?a
--- response_body_like: 400 Bad Request
--- no_error_log eval
["HELLO WORLD", q{the "$memc_key" variable is not set}]
--- error_code: 400
=== TEST 3: ngx.exit(400) should abort ngx.location.capture
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /memc_query {
internal;
set $memc_cmd $arg_cmd;
set_unescape_uri $memc_key $arg_key;
set_unescape_uri $memc_value $arg_value;
set $memc_exptime $arg_exptime;
memc_cmds_allowed get set add delete;
memc_pass 127.0.0.1:11211;
}
location = /test {
content_by_lua_file html/test.lua;
}
--- user_files
>>> test.lua
local memd = require 'memd'
ngx.exit(400)
local res = memd.query( { cmd = 'get', key = id } )
>>> memd.lua
module('memd', package.seeall)
local URL = '/memc_query'
local capture = ngx.location.capture
function query(arg)
if type(arg) ~= 'table' then
return nil
end
return capture(URL, { args = arg } )
end
--- request
GET /test?a
--- response_body_like: 400 Bad Request
--- no_error_log
the "$memc_key" variable is not set
--- error_code: 400
=== TEST 4: ngx.exit(400) should abort ngx.location.capture_multi
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /memc_query {
internal;
set $memc_cmd $arg_cmd;
set_unescape_uri $memc_key $arg_key;
set_unescape_uri $memc_value $arg_value;
set $memc_exptime $arg_exptime;
memc_cmds_allowed get set add delete;
memc_pass 127.0.0.1:11211;
}
location = /test {
content_by_lua_file html/test.lua;
}
--- user_files
>>> test.lua
local memd = require 'memd'
ngx.exit(400)
local res = memd.query( { cmd = 'get', key = id } )
>>> memd.lua
module('memd', package.seeall)
local URL = '/memc_query'
local capture_multi = ngx.location.capture_multi
function query(arg)
if type(arg) ~= 'table' then
return nil
end
return capture_multi{ {URL, { args = arg }} }
end
--- request
GET /test?a
--- response_body_like: 400 Bad Request
--- no_error_log
the "$memc_key" variable is not set
--- error_code: 400
=== TEST 5: ngx.exit(400) should abort ngx.redirect
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go()
ngx.redirect("/blah")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
lua redirect to "/blah" with code 302
--- error_code: 400
=== TEST 6: ngx.exit(400) should abort ngx.exit
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go()
ngx.exit(503)
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
lua exit with code 503
--- error_code: 400
=== TEST 7: ngx.exit(400) should abort ngx.exec
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go()
ngx.exec("/blah")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
lua exec "/blah?"
--- error_code: 400
=== TEST 8: ngx.exit(400) should abort ngx.send_headers
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go()
ngx.send_headers()
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
lua send headers
--- error_code: 400
=== TEST 9: ngx.exit(400) should abort ngx.print
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go()
ngx.print("HELLO WORLD")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
lua print response
--- error_code: 400
=== TEST 10: ngx.exit(400) should abort ngx.say
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go()
ngx.say("HELLO WORLD")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
lua say response
--- error_code: 400
=== TEST 11: ngx.exit(400) should abort ngx.flush
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go()
ngx.flush()
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
lua flush asynchronously
--- error_code: 400
=== TEST 12: ngx.exit(400) should abort ngx.eof
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go()
ngx.eof()
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
lua send eof
--- error_code: 400
=== TEST 13: ngx.exit(400) should abort ngx.re.match
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go()
ngx.re.match("a", "a", "jo")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
lua compiling match regex "a" with options "jo"
--- error_code: 400
=== TEST 14: ngx.exit(400) should abort ngx.re.gmatch
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go()
ngx.re.gmatch("a", "a", "jo")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
lua compiling gmatch regex "a" with options "jo"
--- error_code: 400
=== TEST 15: ngx.exit(400) should abort ngx.re.sub
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go()
ngx.re.sub("a", "a", "", "jo")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
lua compiling sub regex "a" with options "jo"
--- error_code: 400
=== TEST 16: ngx.exit(400) should abort ngx.re.gsub
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go()
ngx.re.gsub("a", "a", "", "jo")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
lua compiling gsub regex "a" with options "jo"
--- error_code: 400
=== TEST 17: ngx.exit(400) should abort ngx.shared.DICT (set)
--- http_config eval
"lua_shared_dict dogs 1m; lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
local dogs = ngx.shared.dogs
print("foo = ", dogs:get("foo"))
dogs:set("foo", 32)
ngx.exit(400)
test.go(dogs)
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go(dogs)
dogs:set("foo", 56)
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
foo = 56
--- error_code: 400
=== TEST 18: ngx.exit(400) should abort ngx.shared.DICT (replace)
--- http_config eval
"lua_shared_dict dogs 1m; lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
local dogs = ngx.shared.dogs
print("foo = ", dogs:get("foo"))
dogs:set("foo", 32)
ngx.exit(400)
test.go(dogs)
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go(dogs)
dogs:replace("foo", 56)
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
foo = 56
--- error_code: 400
=== TEST 19: ngx.exit(400) should abort ngx.shared.DICT (incr)
--- http_config eval
"lua_shared_dict dogs 1m; lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
local dogs = ngx.shared.dogs
print("foo = ", dogs:get("foo"))
dogs:set("foo", 32)
ngx.exit(400)
test.go(dogs)
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go(dogs)
dogs:incr("foo", 56)
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
foo = 88
--- error_code: 400
=== TEST 20: ngx.exit(400) should abort ngx.shared.DICT (get)
--- http_config eval
"lua_shared_dict dogs 1m; lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
local dogs = ngx.shared.dogs
dogs:set("foo", 32)
ngx.exit(400)
test.go(dogs)
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
function go(dogs)
dogs:get("foo")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
fetching key "foo" in shared dict "dogs"
--- error_code: 400
=== TEST 21: ngx.exit(400) should skip os.execute
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
ngx.exit(400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
local exec = os.execute
function go()
exec("sleep 5")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- error_code: 400
--- no_error_log
[error]
--- timeout: 2
=== TEST 22: ngx.exit(400) should break pcall and skip os.execute
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
pcall(ngx.exit, 400)
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
local exec = os.execute
function go()
exec("sleep 5")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- no_error_log
fetching key "foo" in shared dict "dogs"
--- error_code: 400
--- timeout: 2
=== TEST 23: ngx.exit(400) should break pcall and skip os.execute (all in user module)
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
local exec = os.execute
function go()
pcall(ngx.exit, 400)
exec("sleep 5")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- error_code: 400
--- no_error_log
[error]
--- timeout: 2
=== TEST 24: ngx.redirect() should break pcall and skip os.execute (all in user module)
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
local exec = os.execute
function go()
pcall(ngx.redirect, "/blah")
exec("sleep 5")
end
--- request
GET /test
--- response_body_like: 302 Found
--- no_error_log
[error]
--- error_code: 302
--- timeout: 2
=== TEST 25: ngx.redirect() should skip os.execute (all in user module)
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
local exec = os.execute
function go()
ngx.redirect("/blah")
exec("sleep 5")
end
--- request
GET /test
--- response_body_like: 302 Found
--- no_error_log
[error]
--- error_code: 302
--- timeout: 2
=== TEST 26: ngx.exec() should break pcall and skip os.execute (all in user module)
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
test.go()
';
}
location = /foo {
echo foo;
}
--- user_files
>>> test.lua
module('test', package.seeall)
local exec = os.execute
function go()
pcall(ngx.exec, "/foo")
exec("sleep 5")
end
--- request
GET /test
--- response_body
foo
--- no_error_log
[error]
--- timeout: 2
=== TEST 27: ngx.exec() should skip os.execute (all in user module)
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
test.go()
';
}
location = /foo {
echo foo;
}
--- user_files
>>> test.lua
module('test', package.seeall)
local exec = os.execute
function go()
ngx.exec("/foo")
exec("sleep 5")
end
--- request
GET /test
--- response_body
foo
--- no_error_log
[error]
--- timeout: 2
=== TEST 28: ngx.set_uri(uri, true) should break pcall and skip os.execute (all in user module)
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
rewrite_by_lua '
local test = require "test"
test.go()
';
echo hello;
}
location = /foo {
echo foo;
}
--- user_files
>>> test.lua
module('test', package.seeall)
local exec = os.execute
function go()
local ok, err = pcall(ngx.req.set_uri, "/foo", true)
if not ok then
ngx.log(ngx.ERR, "error: ", err)
end
exec("sleep 5")
end
--- request
GET /test
--- response_body
foo
--- no_error_log
[error]
--- timeout: 2
=== TEST 29: abort does not affect following coroutines
--- config
location = /test {
rewrite_by_lua 'ngx.exit(0)';
content_by_lua '
pcall(ngx.say, "hello world")
';
}
--- request
GET /test
--- response_body
hello world
--- no_error_log
[error]
--- timeout: 2
=== TEST 30: ngx.exit(400) should break xpcall and skip os.execute (all in user module)
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
test.go()
';
}
--- user_files
>>> test.lua
module('test', package.seeall)
local exec = os.execute
function myexit()
ngx.exit(400)
end
function go()
xpcall(myexit, function () end)
exec("sleep 5")
end
--- request
GET /test
--- response_body_like: 400 Bad Request
--- error_code: 400
--- no_error_log
[error]
--- timeout: 2
=== TEST 31: ngx.exec() should skip os.execute (all in user module)
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
test.go()
';
}
location = /foo {
echo foo;
}
--- user_files
>>> test.lua
local os_exec = os.execute
local ngx_exec = ngx.exec
module('test')
function go()
ngx_exec("/foo")
os_exec("sleep 5")
end
--- request
GET /test
--- response_body
foo
--- no_error_log
[error]
--- timeout: 2
=== TEST 32: ngx.exec() should break pcall and skip os.execute (all in user module)
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;./?.lua';"
--- config
location = /test {
content_by_lua '
local test = require "test"
test.go()
';
}
location = /foo {
echo foo;
}
--- user_files
>>> test.lua
local os_exec = os.execute
local ngx_exec = ngx.exec
local pcall = pcall
module('test')
function go()
pcall(ngx_exec, "/foo")
os_exec("sleep 5")
end
--- request
GET /test
--- response_body
foo
--- no_error_log
[error]
--- timeout: 2