186 строки
3.9 KiB
Plaintext
186 строки
3.9 KiB
Plaintext
# vim:set ft= ts=4 sw=4 et fdm=marker:
|
|
|
|
use Test::Nginx::Socket::Lua;
|
|
|
|
repeat_each(2);
|
|
|
|
plan tests => repeat_each() * (blocks() * 3);
|
|
|
|
$ENV{TEST_NGINX_REDIS_PORT} ||= 6379;
|
|
|
|
#log_level "warn";
|
|
#worker_connections(1024);
|
|
#master_on();
|
|
|
|
my $pwd = `pwd`;
|
|
chomp $pwd;
|
|
$ENV{TEST_NGINX_PWD} ||= $pwd;
|
|
|
|
our $LuaCpath = $ENV{LUA_CPATH} ||
|
|
'/usr/local/openresty-debug/lualib/?.so;/usr/local/openresty/lualib/?.so;;';
|
|
|
|
no_long_string();
|
|
|
|
run_tests();
|
|
|
|
__DATA__
|
|
|
|
=== TEST 1: sanity
|
|
--- http_config
|
|
lua_package_path '$TEST_NGINX_PWD/t/lib/?.lua;;';
|
|
--- config
|
|
location /test {
|
|
content_by_lua '
|
|
package.loaded["socket"] = ngx.socket
|
|
local Redis = require "Redis"
|
|
|
|
local redis = Redis.connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)
|
|
|
|
redis:set("some_key", "hello 1234")
|
|
local data = redis:get("some_key")
|
|
ngx.say("some_key: ", data)
|
|
';
|
|
}
|
|
--- request
|
|
GET /test
|
|
--- response_body
|
|
some_key: hello 1234
|
|
--- no_error_log
|
|
[error]
|
|
|
|
|
|
|
|
=== TEST 2: coroutine-based pub/sub
|
|
--- http_config eval
|
|
qq{
|
|
lua_package_path '\$TEST_NGINX_PWD/t/lib/?.lua;;';
|
|
lua_package_cpath '$::LuaCpath';
|
|
}
|
|
--- config
|
|
location /test {
|
|
content_by_lua '
|
|
package.loaded["socket"] = ngx.socket
|
|
local Redis = require "Redis"
|
|
|
|
local ljson = require "ljson"
|
|
|
|
local r1 = Redis.connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)
|
|
|
|
local r2 = Redis.connect("127.0.0.1", $TEST_NGINX_REDIS_PORT)
|
|
|
|
local loop = r2:pubsub({ subscribe = "foo" })
|
|
local msg, abort = loop()
|
|
ngx.say("msg type: ", type(msg))
|
|
ngx.say("abort: ", type(abort))
|
|
|
|
if msg then
|
|
ngx.say("msg: ", ljson.encode(msg))
|
|
end
|
|
|
|
for i = 1, 3 do
|
|
r1:publish("foo", "test " .. i)
|
|
msg, abort = loop()
|
|
if msg then
|
|
ngx.say("msg: ", ljson.encode(msg))
|
|
end
|
|
ngx.say("abort: ", type(abort))
|
|
end
|
|
|
|
abort()
|
|
|
|
msg, abort = loop()
|
|
ngx.say("msg type: ", type(msg))
|
|
';
|
|
}
|
|
--- stap2
|
|
global ids, cur
|
|
|
|
function gen_id(k) {
|
|
if (ids[k]) return ids[k]
|
|
ids[k] = ++cur
|
|
return cur
|
|
}
|
|
|
|
F(ngx_http_handler) {
|
|
delete ids
|
|
cur = 0
|
|
}
|
|
|
|
/*
|
|
probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_yield") {
|
|
id = gen_id($L)
|
|
printf("raw lua yield %d\n", id)
|
|
#print_ubacktrace()
|
|
}
|
|
|
|
probe process("/usr/local/openresty-debug/luajit/lib/libluajit-5.1.so.2").function("lua_resume") {
|
|
id = gen_id($L)
|
|
printf("raw lua resume %d\n", id)
|
|
}
|
|
*/
|
|
|
|
/*
|
|
F(ngx_http_lua_run_thread) {
|
|
id = gen_id($ctx->cur_co)
|
|
printf("run thread %d\n", id)
|
|
}
|
|
*/
|
|
|
|
M(http-lua-user-coroutine-resume) {
|
|
p = gen_id($arg2)
|
|
c = gen_id($arg3)
|
|
printf("resume %x in %x\n", c, p)
|
|
}
|
|
|
|
M(http-lua-entry-coroutine-yield) {
|
|
println("entry coroutine yield")
|
|
}
|
|
|
|
F(ngx_http_lua_coroutine_yield) {
|
|
printf("yield %x\n", gen_id($L))
|
|
}
|
|
|
|
/*
|
|
F(ngx_http_lua_coroutine_resume) {
|
|
printf("resume %x\n", gen_id($L))
|
|
}
|
|
*/
|
|
|
|
M(http-lua-user-coroutine-yield) {
|
|
p = gen_id($arg2)
|
|
c = gen_id($arg3)
|
|
printf("yield %x in %x\n", c, p)
|
|
}
|
|
|
|
F(ngx_http_lua_atpanic) {
|
|
printf("lua atpanic(%d):", gen_id($L))
|
|
print_ubacktrace();
|
|
}
|
|
|
|
M(http-lua-user-coroutine-create) {
|
|
p = gen_id($arg2)
|
|
c = gen_id($arg3)
|
|
printf("create %x in %x\n", c, p)
|
|
}
|
|
|
|
F(ngx_http_lua_ngx_exec) { println("exec") }
|
|
|
|
F(ngx_http_lua_ngx_exit) { println("exit") }
|
|
|
|
--- request
|
|
GET /test
|
|
--- response_body
|
|
msg type: table
|
|
abort: function
|
|
msg: {"channel":"foo","kind":"subscribe","payload":1}
|
|
msg: {"channel":"foo","kind":"message","payload":"test 1"}
|
|
abort: function
|
|
msg: {"channel":"foo","kind":"message","payload":"test 2"}
|
|
abort: function
|
|
msg: {"channel":"foo","kind":"message","payload":"test 3"}
|
|
abort: function
|
|
msg type: nil
|
|
--- no_error_log
|
|
[error]
|
|
|