Files
2026-07-13 12:32:21 +08:00

124 lines
3.1 KiB
Lua

local helpers = require "spec.helpers"
local worker_events_mock = [[
server {
server_name example.com;
listen %d;
location = /payload {
content_by_lua_block {
local SOURCE = "foo"
local EVENT = ngx.var.http_payload_type
local worker_events = kong.worker_events
local payload_received
local function wait_until(validator, timeout)
local deadline = ngx.now() + (timeout or 5)
local res
repeat
worker_events.poll()
res = validator()
until res or ngx.now() >= deadline
return res
end
-- subscribe
local ok, err = worker_events.register(function(data)
payload_received = data
end, SOURCE, EVENT)
-- when payload is a string
local PAYLOAD = string.rep("X", %d)
-- when payload is a table
if EVENT == "table" then
PAYLOAD = {
foo = "bar",
data = PAYLOAD,
}
end
local ok, err = worker_events.post(SOURCE, EVENT, PAYLOAD)
if not ok then
ngx.status = ngx.HTTP_INTERNAL_SERVER_ERROR
ngx.say("post failed, err: " .. err)
return
end
assert(wait_until(function()
if EVENT == "string" then
return PAYLOAD == payload_received
else
return require("pl.tablex").deepcompare(PAYLOAD, payload_received)
end
end, 1))
ngx.status = ngx.HTTP_OK
ngx.say("ok")
}
}
}
]]
local max_payloads = { 60 * 1024, 140 * 1024, }
for _, max_payload in ipairs(max_payloads) do
local business_port = 34567
local payload_size = 70 * 1024
local fixtures = {
http_mock = {
worker_events = string.format(worker_events_mock,
business_port, payload_size)
},
}
local size_allowed = max_payload > payload_size
local less_or_greater = size_allowed and ">" or "<"
describe("worker_events [when max_payload " .. less_or_greater .. " payload_size]", function()
local strategy = "off"
local test_cases = {"string", "table", }
lazy_setup(function()
assert(helpers.start_kong({
database = strategy,
nginx_conf = "spec/fixtures/custom_nginx.template",
worker_events_max_payload = max_payload,
}, nil, nil, fixtures))
end)
lazy_teardown(function ()
assert(helpers.stop_kong())
end)
for _, payload_type in ipairs(test_cases) do
it("max_payload = " .. max_payload .. ", type = " .. payload_type, function()
local res = helpers.proxy_client(nil, business_port):get(
"/payload", {
headers = {
host = "example.com",
payload_type = payload_type,
}
})
local status_code = 200
local msg = "ok"
if not size_allowed then
status_code = 500
msg = "post failed, err: " ..
"failed to publish event: payload exceeds the limitation (".. max_payload .. ")"
end
local body = assert.res_status(status_code, res)
assert.equal(body, msg)
end)
end
end)
end