summaryrefslogtreecommitdiff
path: root/ngx_stream_lua-0.0.16/t/060-lua-memcached.t
blob: a1d70c366e26e9ddc6bebe20158c5e18572c090c (plain)
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
# vim:set ft= ts=4 sw=4 et fdm=marker:

use Test::Nginx::Socket::Lua::Stream;

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
--- stream_config
    lua_package_path '$TEST_NGINX_PWD/t/lib/?.lua;;';
--- stream_server_config
    content_by_lua_block {
        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)
    }
--- stream_response
some_key: hello 1234
--- no_error_log
[error]



=== TEST 2: raw memcached
--- stream_config eval
    "lua_package_path '$::HtmlDir/?.lua;;';"
--- stream_server_config
    content_by_lua_block {
        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
--- stream_response
some_key: hello 1234
--- no_error_log
[error]
--- error_log
lua reuse free buf memory