File: 162-exit-worker.t

package info (click to toggle)
libnginx-mod-http-lua 1%3A0.10.28-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,456 kB
  • sloc: ansic: 42,658; perl: 480; sh: 303; python: 23; makefile: 11
file content (242 lines) | stat: -rw-r--r-- 5,350 bytes parent folder | download | duplicates (2)
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
# vim:set ft= ts=4 sw=4 et fdm=marker:

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

master_on();
repeat_each(2);

# NB: the shutdown_error_log block is independent from repeat times
plan tests => repeat_each() * (blocks() * 2 + 1) + 15;

#log_level("warn");
no_long_string();
our $HtmlDir = html_dir;

run_tests();

__DATA__

=== TEST 1: simple exit_worker_by_lua_block
--- http_config
    exit_worker_by_lua_block {
        ngx.log(ngx.NOTICE, "log from exit_worker_by_lua_block")
    }
--- config
    location /t {
        echo "ok";
    }
--- request
GET /t
--- response_body
ok
--- shutdown_error_log
log from exit_worker_by_lua_block



=== TEST 2: simple exit_worker_by_lua_file
--- http_config
    exit_worker_by_lua_file html/exit_worker.lua;
--- config
    location /t {
        echo "ok";
    }
--- user_files
>>> exit_worker.lua
ngx.log(ngx.NOTICE, "log from exit_worker_by_lua_file")
--- request
GET /t
--- response_body
ok
--- shutdown_error_log
log from exit_worker_by_lua_file



=== TEST 3: exit_worker_by_lua (require a global table)
--- http_config eval
    qq{lua_package_path '$::HtmlDir/?.lua;;';
        exit_worker_by_lua_block {
            foo = require("foo")
            ngx.log(ngx.NOTICE, foo.bar)
        }}
--- config
    location /t {
        content_by_lua_block {
            foo = require("foo")
            foo.bar = "hello, world"
            ngx.say("ok")
        }
    }
--- user_files
>>> foo.lua
return {}
--- request
GET /t
--- response_body
ok
--- shutdown_error_log
hello, world



=== TEST 4: ngx.timer is not allow
--- http_config
    exit_worker_by_lua_block {
        local function bar()
            ngx.log(ngx.ERR, "run the timer!")
        end

        local ok, err = ngx.timer.at(0, bar)
        if not ok then
            ngx.log(ngx.ERR, "failed to create timer: ", err)
        else
            ngx.log(ngx.NOTICE, "success")
        end
    }
--- config
    location /t {
        echo "ok";
    }
--- request
GET /t
--- response_body
ok
--- shutdown_error_log
API disabled in the context of exit_worker_by_lua*



=== TEST 5: exit_worker_by_lua use shdict
--- http_config
    lua_shared_dict dog 1m;
    exit_worker_by_lua_block {
        local dog = ngx.shared.dog
        local val, err = dog:get("foo")
        if not val then
            ngx.log(ngx.ERR, "failed get shdict: ", err)
        else
            ngx.log(ngx.NOTICE, "get val: ", val)
        end
    }
--- config
    location /t {
        content_by_lua_block {
            local dog = ngx.shared.dog
            dog:set("foo", 100)
            ngx.say("ok")
        }
    }
--- request
GET /t
--- response_body
ok
--- shutdown_error_log
get val: 100



=== TEST 6: skip in cache processes (with exit worker and privileged agent)
--- http_config
    lua_package_path "../lua-resty-core/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";

    proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache:1m;

    init_by_lua_block {
        assert(require "ngx.process".enable_privileged_agent())
    }

    exit_worker_by_lua_block {
        local process = require "ngx.process"
        ngx.log(ngx.INFO, "hello from exit worker by lua, process type: ", process.type())
    }
--- config
    location = /t {
        return 200;
    }
--- request
    GET /t
--- no_error_log
[error]
--- shutdown_error_log eval
[
qr/cache loader process \d+ exited/,
qr/cache manager process \d+ exited/,
qr/hello from exit worker by lua, process type: worker/,
qr/hello from exit worker by lua, process type: privileged agent/,
qr/privileged agent process \d+ exited/,
]



=== TEST 7: skipin cache processes (with init worker but without privileged agent)
--- http_config
    lua_package_path "../lua-resty-core/lib/?.lua;../lua-resty-lrucache/lib/?.lua;;";

    proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache:1m;

    exit_worker_by_lua_block {
        local process = require "ngx.process"
        ngx.log(ngx.INFO, "hello from exit worker by lua, process type: ", process.type())
    }
--- config
    location = /t {
        return 200;
    }
--- request
    GET /t
--- no_error_log
[error]
start privileged agent process
--- shutdown_error_log eval
[
qr/cache loader process \d+ exited/,
qr/cache manager process \d+ exited/,
qr/hello from exit worker by lua, process type: worker/,
]



=== TEST 8: syntax error in exit_worker_by_lua_block
--- http_config
    exit_worker_by_lua_block {
        ngx.log(ngx.debug, "pass")
        error("failed to init"
        ngx.log(ngx.debug, "unreachable")
    }
--- config
    location /t {
        content_by_lua_block {
            ngx.say("hello world")
        }
    }
--- request
    GET /t
--- response_body
hello world
--- shutdown_error_log
exit_worker_by_lua error: exit_worker_by_lua(nginx.conf:25):4: ')' expected (to close '(' at line 3) near 'ngx'



=== TEST 9: syntax error in exit_worker_by_lua_file
--- http_config
    exit_worker_by_lua_file html/exit.lua;
--- config
    location /t {
        content_by_lua_block {
            ngx.say("hello world")
        }
    }
--- user_files
>>> exit.lua
    ngx.log(ngx.debug, "pass")
    error("failed to init"
    ngx.log(ngx.debug, "unreachable")

--- request
    GET /t
--- response_body
hello world
--- shutdown_error_log eval
qr|exit_worker_by_lua_file error: .*?t/servroot\w*/html/exit.lua:3: '\)' expected \(to close '\(' at line 2\) near 'ngx'|