bunkerweb/spec/04-storage-1_spec.lua
Théophile Diot a3cd342f3e Squashed 'src/deps/src/lua-resty-session/' content from commit 8b5f8752f
git-subtree-dir: src/deps/src/lua-resty-session
git-subtree-split: 8b5f8752f3046396c414c5b97850e784c07e1641
2023-06-30 15:38:54 -04:00

223 lines
6.3 KiB
Lua

---
-- Ensure to keep the tests consistent with those in 05-storage-1_spec.lua
local utils = require "resty.session.utils"
local before_each = before_each
local after_each = after_each
local lazy_setup = lazy_setup
local describe = describe
local ipairs = ipairs
local assert = assert
local sleep = ngx.sleep
local time = ngx.time
local it = it
local storage_configs = {
file = {
suffix = "session",
},
shm = {
prefix = "sessions",
connect_timeout = 10000,
send_timeout = 10000,
read_timeout = 10000,
},
redis = {
prefix = "sessions",
password = "password",
},
memcached = {
prefix = "sessions",
connect_timeout = 10000,
send_timeout = 10000,
read_timeout = 10000,
},
}
for _, st in ipairs({
"file",
"shm",
"redis",
"memcached",
}) do
describe("Storage tests 1", function()
local current_time
local storage
local long_ttl = 60
local short_ttl = 2
local key = "test_key_1iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
local key1 = "test_key_2iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
local key2 = "test_key_3iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
local old_key = "old_key_iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
local name = "test_name"
local value = "test_value"
lazy_setup(function()
local conf = {
remember = true,
store_metadata = true,
}
conf[st] = storage_configs[st]
storage = utils.load_storage(st, conf)
assert.is_not_nil(storage)
end)
before_each(function()
current_time = time()
end)
describe("[#" .. st .. "] storage: SET + GET", function()
local audiences = { "foo", "bar" }
local subjects = { "john", "jane" }
local metadata = {
audiences = audiences,
subjects = subjects,
}
after_each(function()
storage:delete(name, key, current_time, metadata)
storage:delete(name, key1, current_time, metadata)
storage:delete(name, key2, current_time, metadata)
end)
it("SET: simple set does not return errors, GET fetches value correctly", function()
local ok = storage:set(name, key, value, long_ttl, current_time)
assert.is_not_nil(ok)
local v, err = storage:get(name, key, current_time)
assert.is_not_nil(v)
assert.is_nil(err)
assert.equals(v, value)
end)
it("SET: with metadata and remember works correctly", function()
local ok = storage:set(name, key, value, long_ttl, current_time, nil, nil, metadata, true)
assert.is_not_nil(ok)
sleep(1)
local v, err = storage:get(name, key, time())
assert.is_not_nil(v)
assert.is_nil(err)
assert.equals(v, value)
end)
it("SET: with metadata (long ttl) correctly appends metadata to collection", function()
local ok = storage:set(name, key, value, long_ttl, current_time, nil, nil, metadata, true)
ok = ok and storage:set(name, key1, value, long_ttl, current_time, nil, nil, metadata, true)
ok = ok and storage:set(name, key2, value, long_ttl, current_time, nil, nil, metadata, true)
assert.is_not_nil(ok)
sleep(1)
for i = 1, #audiences do
local meta_values = storage:read_metadata(name, audiences[i], subjects[i], time())
assert.is_not_nil(meta_values)
assert.truthy(meta_values[key ])
assert.truthy(meta_values[key1])
assert.truthy(meta_values[key2])
end
end)
it("SET: with metadata (short ttl) correctly expires metadata", function()
local ok = storage:set(name, key, value, short_ttl, current_time, nil, nil, metadata, true)
sleep(short_ttl + 1)
ok = ok and storage:set(name, key1, value, long_ttl, time(), nil, nil, metadata, true)
assert.is_not_nil(ok)
sleep(1)
for i = 1, #audiences do
local meta_values = storage:read_metadata(name, audiences[i], subjects[i], time())
assert.falsy(meta_values[key])
assert.truthy(meta_values[key1])
end
end)
it("SET: with old_key correctly applies stale ttl on old key", function()
local stale_ttl = 1
local ok = storage:set(name, old_key, value, long_ttl, current_time)
assert.is_not_nil(ok)
ok = storage:set(name, key, value, long_ttl, current_time, old_key, stale_ttl, nil, false)
assert.is_not_nil(ok)
sleep(3)
local v = storage:get(name, old_key, time())
assert.is_nil(v)
end)
it("SET: remember deletes file in old_key", function()
local stale_ttl = long_ttl
local ok = storage:set(name, old_key, value, long_ttl, current_time)
assert.is_not_nil(ok)
ok = storage:set(name, key, value, long_ttl, current_time, old_key, stale_ttl, nil, true)
assert.is_not_nil(ok)
local v = storage:get(name, old_key, current_time)
assert.is_nil(v)
end)
it("SET: ttl works as expected", function()
local ok = storage:set(name, key, value, short_ttl, current_time)
assert.is_not_nil(ok)
sleep(3)
local v = storage:get(name, key, time())
assert.is_nil(v)
end)
end)
describe("[#" .. st .. "] storage: DELETE", function()
local audiences = { "foo" }
local subjects = { "john" }
local metadata = {
audiences = audiences,
subjects = subjects,
}
it("deleted file is really deleted", function()
local ok = storage:set(name, key, value, short_ttl, current_time)
assert.is_not_nil(ok)
storage:delete(name, key, current_time, nil)
local v = storage:get(name, key, current_time)
assert.is_nil(v)
end)
it("with metadata correctly deletes metadata collection", function()
local ok = storage:set(name, key1, value, long_ttl, current_time, nil, nil, metadata, true)
assert.is_not_nil(ok)
sleep(1)
for i = 1, #audiences do
local meta_values = storage:read_metadata(name, audiences[i], subjects[i], time())
assert.truthy(meta_values[key1])
ok = storage:delete(name, key1, time(), metadata)
assert.is_not_nil(ok)
sleep(2)
meta_values = storage:read_metadata(name, audiences[i], subjects[i], time()) or {}
assert.falsy(meta_values[key1])
end
end)
end)
end)
end