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

253 lines
6.0 KiB
Perl

# vim:set ts=4 sts=4 sw=4 et ft=:
use Test::Nginx::Socket::Lua;
use Cwd qw(cwd);
workers(2);
#repeat_each(2);
plan tests => repeat_each() * (blocks() * 3);
my $pwd = cwd();
our $HttpConfig = qq{
lua_package_path "$pwd/lib/?.lua;;";
lua_shared_dict cache_shm 1m;
lua_shared_dict cache_shm_miss 1m;
lua_shared_dict ipc_shm 1m;
};
run_tests();
__DATA__
=== TEST 1: delete() errors if no ipc
--- http_config eval: $::HttpConfig
--- config
location = /t {
content_by_lua_block {
local mlcache = require "kong.resty.mlcache"
local cache = assert(mlcache.new("my_mlcache", "cache_shm"))
local ok, err = pcall(cache.delete, cache, "foo")
ngx.say(err)
}
}
--- request
GET /t
--- response_body
no ipc to propagate deletion, specify opts.ipc_shm or opts.ipc
--- no_error_log
[error]
=== TEST 2: delete() validates key
--- http_config eval: $::HttpConfig
--- config
location = /t {
content_by_lua_block {
local mlcache = require "kong.resty.mlcache"
local cache = assert(mlcache.new("my_mlcache", "cache_shm", {
ipc_shm = "ipc_shm",
}))
local ok, err = pcall(cache.delete, cache, 123)
ngx.say(err)
}
}
--- request
GET /t
--- response_body
key must be a string
--- no_error_log
[error]
=== TEST 3: delete() removes a cached value from LRU + shm
--- http_config eval: $::HttpConfig
--- config
location = /t {
content_by_lua_block {
local mlcache = require "kong.resty.mlcache"
local cache = assert(mlcache.new("my_mlcache", "cache_shm", {
ipc_shm = "ipc_shm",
}))
local value = 123
local function cb()
ngx.say("in callback")
return value
end
-- set a value (callback call)
local data = assert(cache:get("key", nil, cb))
ngx.say("from callback: ", data)
-- get a value (no callback call)
data = assert(cache:get("key", nil, cb))
ngx.say("from LRU: ", data)
-- test if value is set from shm (safer to check due to the key)
local v = ngx.shared.cache_shm:get(cache.name .. "key")
ngx.say("shm has value before delete: ", v ~= nil)
-- delete the value
assert(cache:delete("key"))
local v = ngx.shared.cache_shm:get(cache.name .. "key")
ngx.say("shm has value after delete: ", v ~= nil)
-- ensure LRU was also deleted
v = cache.lru:get("key")
ngx.say("from LRU: ", v)
-- start over from callback again
value = 456
data = assert(cache:get("key", nil, cb))
ngx.say("from callback: ", data)
}
}
--- request
GET /t
--- response_body
in callback
from callback: 123
from LRU: 123
shm has value before delete: true
shm has value after delete: false
from LRU: nil
in callback
from callback: 456
--- no_error_log
[error]
=== TEST 4: delete() removes a cached nil from shm_miss if specified
--- http_config eval: $::HttpConfig
--- config
location = /t {
content_by_lua_block {
local mlcache = require "kong.resty.mlcache"
local cache = assert(mlcache.new("my_mlcache", "cache_shm", {
ipc_shm = "ipc_shm",
shm_miss = "cache_shm_miss",
}))
local value = nil
local function cb()
ngx.say("in callback")
return value
end
-- set a value (callback call)
local data, err = cache:get("key", nil, cb)
if err then
ngx.log(ngx.ERR, err)
return
end
ngx.say("from callback: ", data)
-- get a value (no callback call)
data, err = cache:get("key", nil, cb)
if err then
ngx.log(ngx.ERR, err)
return
end
ngx.say("from LRU: ", data)
-- test if value is set from shm (safer to check due to the key)
local v = ngx.shared.cache_shm_miss:get(cache.name .. "key")
ngx.say("shm_miss has value before delete: ", v ~= nil)
-- delete the value
assert(cache:delete("key"))
local v = ngx.shared.cache_shm_miss:get(cache.name .. "key")
ngx.say("shm_miss has value after delete: ", v ~= nil)
-- ensure LRU was also deleted
v = cache.lru:get("key")
ngx.say("from LRU: ", v)
-- start over from callback again
value = 456
data, err = cache:get("key", nil, cb)
if err then
ngx.log(ngx.ERR, err)
return
end
ngx.say("from callback again: ", data)
}
}
--- request
GET /t
--- response_body
in callback
from callback: nil
from LRU: nil
shm_miss has value before delete: true
shm_miss has value after delete: false
from LRU: nil
in callback
from callback again: 456
--- no_error_log
[error]
=== TEST 5: delete() calls broadcast with invalidated key
--- http_config eval: $::HttpConfig
--- config
location = /t {
content_by_lua_block {
local mlcache = require "kong.resty.mlcache"
local cache = assert(mlcache.new("my_mlcache", "cache_shm", {
ipc = {
register_listeners = function() end,
broadcast = function(channel, data, ...)
ngx.say("channel: ", channel)
ngx.say("data: ", data)
ngx.say("other args:", ...)
return true
end,
poll = function() end,
}
}))
assert(cache:delete("my_key"))
}
}
--- request
GET /t
--- response_body
channel: mlcache:invalidations:my_mlcache
data: my_key
other args:
--- no_error_log
[error]