1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
# vim:set ft= ts=4 sw=4 et fdm=marker:
use Test::Nginx::Socket::Lua;
repeat_each(2);
plan tests => repeat_each() * (blocks() * 3 + 1);
our $HtmlDir = html_dir;
$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;
my $pwd = `pwd`;
chomp $pwd;
$ENV{TEST_NGINX_PWD} ||= $pwd;
#master_on();
workers(1);
#log_level('warn');
#worker_connections(1014);
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 Memcached = require "Memcached"
Memcached.socket = ngx.socket
local memc = Memcached.Connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)
memc:set("some_key", "hello 1234")
local data = memc:get("some_key")
ngx.say("some_key: ", data)
';
}
--- request
GET /test
--- response_body
some_key: hello 1234
--- no_error_log
[error]
=== TEST 2: raw memcached
--- http_config eval
"lua_package_path '$::HtmlDir/?.lua;;';"
--- config
location /t {
content_by_lua '
local memcached = require "resty.memcached"
local memc, err = memcached.connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)
local ok, err = memc:set("some_key", "hello 1234")
if not ok then
ngx.log(ngx.ERR, "failed to set some_key: ", err)
ngx.exit(500)
end
local data, err = memc:get("some_key")
if not data and err then
ngx.log(ngx.ERR, "failed to get some_key: ", err)
ngx.exit(500)
end
ngx.say("some_key: ", data)
local res, err = memc:set_keepalive()
if not res then
ngx.say("failed to set keepalive: ", err)
return
end
';
}
--- user_files
>>> resty/memcached.lua
module("resty.memcached", package.seeall)
local mt = { __index = resty.memcached }
local sub = string.sub
local escape_uri = ngx.escape_uri
local socket_connect = ngx.socket.connect
local match = string.match
function connect(...)
local sock, err = socket_connect(...)
return setmetatable({ sock = sock }, mt)
end
function get(self, key)
local cmd = "get " .. escape_uri(key) .. "\r\n"
local bytes, err = self.sock:send(cmd)
if not bytes then
return nil, err
end
local line, err = self.sock:receive()
if line == 'END' then
return nil, nil
end
local flags, len = match(line, [[^VALUE %S+ (%d+) (%d+)]])
if not flags then
return nil, "bad response: " .. line
end
print("size: ", size, ", flags: ", len)
local data, err = self.sock:receive(len)
if not data then
return nil, err
end
line, err = self.sock:receive(2) -- discard the trailing CRLF
if not line then
return nil, nil, "failed to receive CRLF: " .. (err or "")
end
line, err = self.sock:receive() -- discard "END\r\n"
if not line then
return nil, nil, "failed to receive END CRLF: " .. (err or "")
end
return data
end
function set(self, key, value, exptime, flags)
if not exptime then
exptime = 0
end
if not flags then
flags = 0
end
local cmd = table.concat({"set ", escape_uri(key), " ", flags, " ", exptime, " ", #value, "\r\n", value, "\r\n"}, "")
local bytes, err = self.sock:send(cmd)
if not bytes then
return nil, err
end
local data, err = self.sock:receive()
if sub(data, 1, 6) == "STORED" then
return true
end
return false, err
end
function set_keepalive(self)
return self.sock:setkeepalive(0, 100)
end
--- request
GET /t
--- response_body
some_key: hello 1234
--- no_error_log
[error]
--- error_log
lua reuse free buf memory
|