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

541 lines
21 KiB
Lua

local ngx = ngx
local kong = kong
local type = type
local assert = assert
local subsystem = ngx.config.subsystem
local math = math
local get_phase = ngx.get_phase
local function is_nil(ctx, name)
if ctx[name] ~= nil then
return false, "[ctx-tests] " .. name .. " is not a nil"
end
return true
end
local function is_true(ctx, name)
if ctx[name] ~= true then
return false, "[ctx-tests] " .. name .. " is not true"
end
return true
end
local function is_positive_integer(ctx, name)
local value = ctx[name]
if type(value) ~= "number" then
return false, "[ctx-tests] " .. name .. " is not a number"
end
if math.floor(value) ~= value then
return false, "[ctx-tests] " .. name .. " is not an integer"
end
if value <= 0 then
return false, "[ctx-tests] " .. name .. " is not a positive integer"
end
return true
end
local function is_non_negative_integer(ctx, name)
local value = ctx[name]
if value == 0 then
return true
end
return is_positive_integer(ctx, name)
end
local function is_equal_to_start_time(ctx, name)
local ok, err = is_positive_integer(ctx, name)
if not ok then
return ok, err
end
if ctx[name] < ctx.KONG_PROCESSING_START then
return false, "[ctx-tests] " .. name .. " is less than the processing start"
end
if subsystem ~= "stream" then
if ctx[name] ~= (ngx.req.start_time() * 1000) then
return false, "[ctx-tests] " .. name .. " is less than the request start time"
end
end
return true
end
local function is_greater_or_equal_to_start_time(ctx, name)
local ok, err = is_positive_integer(ctx, name)
if not ok then
return ok, err
end
if ctx[name] < ctx.KONG_PROCESSING_START then
return false, "[ctx-tests] " .. name .. " is less than the processing start"
end
if subsystem ~= "stream" then
if ctx[name] < (ngx.req.start_time() * 1000) then
return false, "[ctx-tests] " .. name .. " is less than the request start time"
end
end
return true
end
local function is_greater_or_equal_to_ctx_value(ctx, name, greater_name)
local ok, err = is_positive_integer(ctx, name)
if not ok then
return ok, err
end
ok, err = is_positive_integer(ctx, greater_name)
if not ok then
return ok, err
end
if ctx[greater_name] < ctx[name] then
return false, "[ctx-tests] " .. name .. " is greater than " .. greater_name
end
return true
end
local function has_correct_proxy_latency(ctx)
local ok, err = is_positive_integer(ctx, "KONG_BALANCER_ENDED_AT")
if not ok then
return ok, err
end
ok, err = is_non_negative_integer(ctx, "KONG_PROXY_LATENCY")
if not ok then
return ok, err
end
if ctx.KONG_BALANCER_ENDED_AT < ctx.KONG_PROCESSING_START then
return false, "[ctx-tests] KONG_BALANCER_ENDED_AT is less than the processing start"
end
local latency = ctx.KONG_BALANCER_ENDED_AT - ctx.KONG_PROCESSING_START
if ctx.KONG_PROXY_LATENCY ~= latency then
return false, "[ctx-tests] KONG_PROXY_LATENCY is not calculated correctly"
end
if subsystem ~= "stream" then
latency = ctx.KONG_BALANCER_ENDED_AT - ngx.req.start_time() * 1000
if ctx.KONG_PROXY_LATENCY ~= latency then
return false, "[ctx-tests] KONG_PROXY_LATENCY is not calculated correctly (request start time)"
end
end
if get_phase() == "log" then
local log = kong.log.serialize()
if ctx.KONG_PROXY_LATENCY > log.latencies.kong then
return false, "[ctx-tests] kong.log.serialize() latency is less than KONG_PROXY_LATENCY"
end
end
return true
end
local function has_correct_waiting_time(ctx)
local err
local ok = is_positive_integer(ctx, "KONG_RESPONSE_START")
if not ok then
ok, err = is_positive_integer(ctx, "KONG_HEADER_FILTER_START")
if not ok then
return ok, err
end
end
ok, err = is_positive_integer(ctx, "KONG_BALANCER_ENDED_AT")
if not ok then
return ok, err
end
local waiting_time = (ctx.KONG_RESPONSE_START or ctx.KONG_HEADER_FILTER_START) -
ctx.KONG_BALANCER_ENDED_AT
if ctx.KONG_WAITING_TIME ~= waiting_time then
return false, "[ctx-tests] KONG_WAITING_TIME is not calculated correctly"
end
return true
end
local function has_correct_receive_time(ctx)
local ok, err = is_positive_integer(ctx, "KONG_BODY_FILTER_ENDED_AT")
if not ok then
return ok, err
end
ok, err = is_positive_integer(ctx, "KONG_HEADER_FILTER_START")
if not ok then
return ok, err
end
local receive_time = ctx.KONG_BODY_FILTER_ENDED_AT -
(ctx.KONG_RESPONSE_START or ctx.KONG_HEADER_FILTER_START)
if ctx.KONG_RECEIVE_TIME ~= receive_time then
return false, "[ctx-tests] KONG_RECEIVE_TIME is not calculated correctly"
end
return true
end
local CtxTests = {
PRIORITY = -1000000,
VERSION = "1.0",
}
local function has_correct_upstream_dns_time(ctx)
local ok, err = is_positive_integer(ctx, "KONG_UPSTREAM_DNS_END_AT")
if not ok then
return ok, err
end
ok, err = is_positive_integer(ctx, "KONG_UPSTREAM_DNS_START")
if not ok then
return ok, err
end
local upstream_dns_time = ctx.KONG_UPSTREAM_DNS_END_AT - ctx.KONG_UPSTREAM_DNS_START
if ctx.KONG_UPSTREAM_DNS_TIME ~= upstream_dns_time then
return false, "[ctx-tests] KONG_UPSTREAM_DNS_TIME is not calculated correctly"
end
return true
end
function CtxTests:preread()
local ctx = ngx.ctx
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_PREREAD_START"))
assert(is_nil(ctx, "KONG_PREREAD_ENDED_AT"))
assert(is_nil(ctx, "KONG_PREREAD_TIME"))
assert(is_nil(ctx, "KONG_REWRITE_START"))
assert(is_nil(ctx, "KONG_REWRITE_ENDED_AT"))
assert(is_nil(ctx, "KONG_REWRITE_TIME"))
assert(is_nil(ctx, "KONG_ACCESS_START"))
assert(is_nil(ctx, "KONG_ACCESS_ENDED_AT"))
assert(is_nil(ctx, "KONG_ACCESS_TIME"))
assert(is_nil(ctx, "KONG_BALANCER_START"))
assert(is_nil(ctx, "KONG_BALANCER_ENDED_AT"))
assert(is_nil(ctx, "KONG_BALANCER_TIME"))
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_START"))
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_END_AT"))
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_TIME"))
assert(is_nil(ctx, "KONG_RESPONSE_START"))
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_START"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_ENDED_AT"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_TIME"))
assert(is_nil(ctx, "KONG_BODY_FILTER_START"))
assert(is_nil(ctx, "KONG_BODY_FILTER_ENDED_AT"))
assert(is_nil(ctx, "KONG_BODY_FILTER_TIME"))
assert(is_nil(ctx, "KONG_LOG_START"))
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
assert(is_nil(ctx, "KONG_LOG_TIME"))
assert(is_nil(ctx, "KONG_PROXIED"))
assert(is_nil(ctx, "KONG_PROXY_LATENCY"))
assert(is_nil(ctx, "KONG_RESPONSE_LATENCY"))
assert(is_nil(ctx, "KONG_WAITING_TIME"))
assert(is_nil(ctx, "KONG_RECEIVE_TIME"))
assert(is_positive_integer(ctx, "host_port"))
end
function CtxTests:rewrite()
local ctx = ngx.ctx
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_REWRITE_START"))
assert(is_greater_or_equal_to_start_time(ctx, "KONG_REWRITE_START", "KONG_REWRITE_ENDED_AT"))
assert(is_nil(ctx, "KONG_PREREAD_START"))
assert(is_nil(ctx, "KONG_PREREAD_ENDED_AT"))
assert(is_nil(ctx, "KONG_PREREAD_TIME"))
assert(is_nil(ctx, "KONG_REWRITE_ENDED_AT"))
assert(is_nil(ctx, "KONG_REWRITE_TIME"))
assert(is_nil(ctx, "KONG_ACCESS_START"))
assert(is_nil(ctx, "KONG_ACCESS_ENDED_AT"))
assert(is_nil(ctx, "KONG_ACCESS_TIME"))
assert(is_nil(ctx, "KONG_BALANCER_START"))
assert(is_nil(ctx, "KONG_BALANCER_ENDED_AT"))
assert(is_nil(ctx, "KONG_BALANCER_TIME"))
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_START"))
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_END_AT"))
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_TIME"))
assert(is_nil(ctx, "KONG_RESPONSE_START"))
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_START"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_ENDED_AT"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_TIME"))
assert(is_nil(ctx, "KONG_BODY_FILTER_START"))
assert(is_nil(ctx, "KONG_BODY_FILTER_ENDED_AT"))
assert(is_nil(ctx, "KONG_BODY_FILTER_TIME"))
assert(is_nil(ctx, "KONG_LOG_START"))
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
assert(is_nil(ctx, "KONG_LOG_TIME"))
assert(is_nil(ctx, "KONG_PROXIED"))
assert(is_nil(ctx, "KONG_PROXY_LATENCY"))
assert(is_nil(ctx, "KONG_RESPONSE_LATENCY"))
assert(is_nil(ctx, "KONG_WAITING_TIME"))
assert(is_nil(ctx, "KONG_RECEIVE_TIME"))
assert(is_positive_integer(ctx, "host_port"))
end
function CtxTests:access(config)
if config.buffered then
kong.service.request.enable_buffering()
end
local ctx = ngx.ctx
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_REWRITE_START"))
assert(is_greater_or_equal_to_start_time(ctx, "KONG_REWRITE_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_START", "KONG_REWRITE_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_REWRITE_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_ENDED_AT", "KONG_ACCESS_START"))
assert(is_nil(ctx, "KONG_PREREAD_START"))
assert(is_nil(ctx, "KONG_PREREAD_ENDED_AT"))
assert(is_nil(ctx, "KONG_PREREAD_TIME"))
assert(is_nil(ctx, "KONG_ACCESS_ENDED_AT"))
assert(is_nil(ctx, "KONG_ACCESS_TIME"))
assert(is_nil(ctx, "KONG_BALANCER_START"))
assert(is_nil(ctx, "KONG_BALANCER_ENDED_AT"))
assert(is_nil(ctx, "KONG_BALANCER_TIME"))
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_START"))
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_END_AT"))
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_TIME"))
assert(is_nil(ctx, "KONG_RESPONSE_START"))
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_START"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_ENDED_AT"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_TIME"))
assert(is_nil(ctx, "KONG_BODY_FILTER_START"))
assert(is_nil(ctx, "KONG_BODY_FILTER_ENDED_AT"))
assert(is_nil(ctx, "KONG_BODY_FILTER_TIME"))
assert(is_nil(ctx, "KONG_LOG_START"))
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
assert(is_nil(ctx, "KONG_LOG_TIME"))
assert(is_nil(ctx, "KONG_PROXIED"))
assert(is_nil(ctx, "KONG_PROXY_LATENCY"))
assert(is_nil(ctx, "KONG_RESPONSE_LATENCY"))
assert(is_nil(ctx, "KONG_WAITING_TIME"))
assert(is_nil(ctx, "KONG_RECEIVE_TIME"))
assert(is_positive_integer(ctx, "host_port"))
end
function CtxTests:header_filter(config)
local ctx = ngx.ctx
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_REWRITE_START"))
assert(is_greater_or_equal_to_start_time(ctx, "KONG_REWRITE_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_START", "KONG_REWRITE_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_REWRITE_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_ENDED_AT", "KONG_ACCESS_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_ACCESS_START", "KONG_ACCESS_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_ACCESS_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_ACCESS_ENDED_AT", "KONG_BALANCER_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_START", "KONG_BALANCER_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_BALANCER_TIME"))
if config.buffered then
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_RESPONSE_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_RESPONSE_START", "KONG_RESPONSE_ENDED_AT"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_RESPONSE_ENDED_AT", "KONG_HEADER_FILTER_START"))
assert(is_non_negative_integer(ctx, "KONG_RESPONSE_TIME"))
else
assert(is_nil(ctx, "KONG_RESPONSE_START"))
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_HEADER_FILTER_START"))
end
assert(is_true(ctx, "KONG_PROXIED"))
assert(has_correct_proxy_latency(ctx))
assert(has_correct_waiting_time(ctx))
assert(is_nil(ctx, "KONG_PREREAD_START"))
assert(is_nil(ctx, "KONG_PREREAD_ENDED_AT"))
assert(is_nil(ctx, "KONG_PREREAD_TIME"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_ENDED_AT"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_TIME"))
assert(is_nil(ctx, "KONG_BODY_FILTER_START"))
assert(is_nil(ctx, "KONG_BODY_FILTER_ENDED_AT"))
assert(is_nil(ctx, "KONG_BODY_FILTER_TIME"))
assert(is_nil(ctx, "KONG_LOG_START"))
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
assert(is_nil(ctx, "KONG_LOG_TIME"))
assert(is_nil(ctx, "KONG_RESPONSE_LATENCY"))
assert(is_nil(ctx, "KONG_RECEIVE_TIME"))
assert(is_positive_integer(ctx, "host_port"))
end
function CtxTests:body_filter(config)
if not ngx.arg[2] then
return
end
local ctx = ngx.ctx
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_REWRITE_START"))
assert(is_greater_or_equal_to_start_time(ctx, "KONG_REWRITE_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_START", "KONG_REWRITE_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_REWRITE_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_ENDED_AT", "KONG_ACCESS_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_ACCESS_START", "KONG_ACCESS_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_ACCESS_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_ACCESS_ENDED_AT", "KONG_BALANCER_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_START", "KONG_BALANCER_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_BALANCER_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_HEADER_FILTER_START"))
if config.buffered then
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_RESPONSE_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_RESPONSE_START", "KONG_RESPONSE_ENDED_AT"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_RESPONSE_ENDED_AT", "KONG_HEADER_FILTER_START"))
assert(is_non_negative_integer(ctx, "KONG_RESPONSE_TIME"))
else
assert(is_nil(ctx, "KONG_RESPONSE_START"))
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_HEADER_FILTER_START"))
end
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_HEADER_FILTER_START", "KONG_HEADER_FILTER_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_HEADER_FILTER_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_HEADER_FILTER_ENDED_AT", "KONG_BODY_FILTER_START"))
assert(is_true(ctx, "KONG_PROXIED"))
assert(has_correct_proxy_latency(ctx))
assert(has_correct_waiting_time(ctx))
assert(is_nil(ctx, "KONG_PREREAD_START"))
assert(is_nil(ctx, "KONG_PREREAD_ENDED_AT"))
assert(is_nil(ctx, "KONG_PREREAD_TIME"))
assert(is_nil(ctx, "KONG_BODY_FILTER_ENDED_AT"))
assert(is_nil(ctx, "KONG_BODY_FILTER_TIME"))
assert(is_nil(ctx, "KONG_LOG_START"))
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
assert(is_nil(ctx, "KONG_LOG_TIME"))
assert(is_nil(ctx, "KONG_RESPONSE_LATENCY"))
assert(is_nil(ctx, "KONG_RECEIVE_TIME"))
assert(is_positive_integer(ctx, "host_port"))
end
function CtxTests:log(config)
local ctx = ngx.ctx
if subsystem == "stream" then
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_PREREAD_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PREREAD_START", "KONG_PREREAD_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_PREREAD_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PREREAD_ENDED_AT", "KONG_BALANCER_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_START", "KONG_BALANCER_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_BALANCER_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_LOG_START"))
if (not is_nil(ctx, "KONG_UPSTREAM_DNS_START") and not is_nil(ctx, "KONG_BALANCER_ENDED_AT")) then
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_UPSTREAM_DNS_START", "KONG_UPSTREAM_DNS_END_AT"))
assert(is_non_negative_integer(ctx, "KONG_UPSTREAM_DNS_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_UPSTREAM_DNS_END_AT", "KONG_LOG_START"))
assert(has_correct_upstream_dns_time(ctx))
end
assert(is_true(ctx, "KONG_PROXIED"))
assert(has_correct_proxy_latency(ctx))
assert(is_nil(ctx, "KONG_REWRITE_START"))
assert(is_nil(ctx, "KONG_REWRITE_ENDED_AT"))
assert(is_nil(ctx, "KONG_REWRITE_TIME"))
assert(is_nil(ctx, "KONG_ACCESS_START"))
assert(is_nil(ctx, "KONG_ACCESS_ENDED_AT"))
assert(is_nil(ctx, "KONG_ACCESS_TIME"))
assert(is_nil(ctx, "KONG_RESPONSE_START"))
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_START"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_ENDED_AT"))
assert(is_nil(ctx, "KONG_HEADER_FILTER_TIME"))
assert(is_nil(ctx, "KONG_BODY_FILTER_START"))
assert(is_nil(ctx, "KONG_BODY_FILTER_ENDED_AT"))
assert(is_nil(ctx, "KONG_BODY_FILTER_TIME"))
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
assert(is_nil(ctx, "KONG_LOG_TIME"))
assert(is_nil(ctx, "KONG_RESPONSE_LATENCY"))
-- TODO: ngx.var.upstream_first_byte_time?
assert(is_nil(ctx, "KONG_WAITING_TIME"))
-- TODO: ngx.ctx.KONG_LOG_START - (ngx.ctx.BALANCER_ENDED_AT + ngx.var.upstream_first_byte_time)?
assert(is_nil(ctx, "KONG_RECEIVE_TIME"))
else
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_REWRITE_START"))
assert(is_greater_or_equal_to_start_time(ctx, "KONG_REWRITE_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_START", "KONG_REWRITE_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_REWRITE_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_ENDED_AT", "KONG_ACCESS_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_ACCESS_START", "KONG_ACCESS_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_ACCESS_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_ACCESS_ENDED_AT", "KONG_BALANCER_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_START", "KONG_BALANCER_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_BALANCER_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_HEADER_FILTER_START"))
if config.buffered then
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_RESPONSE_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_RESPONSE_START", "KONG_RESPONSE_ENDED_AT"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_RESPONSE_ENDED_AT", "KONG_HEADER_FILTER_START"))
assert(is_non_negative_integer(ctx, "KONG_RESPONSE_TIME"))
else
assert(is_nil(ctx, "KONG_RESPONSE_START"))
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_HEADER_FILTER_START"))
end
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_HEADER_FILTER_START", "KONG_HEADER_FILTER_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_HEADER_FILTER_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_HEADER_FILTER_ENDED_AT", "KONG_BODY_FILTER_START"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BODY_FILTER_START", "KONG_BODY_FILTER_ENDED_AT"))
assert(is_non_negative_integer(ctx, "KONG_BODY_FILTER_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BODY_FILTER_ENDED_AT", "KONG_LOG_START"))
if (not is_nil(ctx, "KONG_UPSTREAM_DNS_START") and not is_nil(ctx, "KONG_BALANCER_ENDED_AT")) then
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_UPSTREAM_DNS_START", "KONG_UPSTREAM_DNS_END_AT"))
assert(is_non_negative_integer(ctx, "KONG_UPSTREAM_DNS_TIME"))
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_UPSTREAM_DNS_END_AT", "KONG_LOG_START"))
assert(has_correct_upstream_dns_time(ctx))
end
assert(is_true(ctx, "KONG_PROXIED"))
assert(has_correct_proxy_latency(ctx))
assert(has_correct_waiting_time(ctx))
assert(has_correct_receive_time(ctx))
assert(is_nil(ctx, "KONG_PREREAD_START"))
assert(is_nil(ctx, "KONG_PREREAD_ENDED_AT"))
assert(is_nil(ctx, "KONG_PREREAD_TIME"))
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
assert(is_nil(ctx, "KONG_LOG_TIME"))
end
assert(is_positive_integer(ctx, "host_port"))
end
return CtxTests