File: 060-lua-memcached.t

package info (click to toggle)
nginx 1.18.0-6.1%2Bdeb11u3
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 19,344 kB
  • sloc: ansic: 250,653; perl: 7,548; sh: 1,408; ruby: 879; python: 358; makefile: 338; awk: 36; cpp: 18
file content (168 lines) | stat: -rw-r--r-- 3,905 bytes parent folder | download | duplicates (4)
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