Files
op-packages/luci-app-substore/tests/core_cron_test.lua
T

64 lines
2.7 KiB
Lua

-- core_cron_test.lua — 按订阅定时更新(cron)单元测试
-- 用法:lua5.1 tests/core_cron_test.lua
package.path = "./root/usr/share/?.lua;" .. package.path
local core = require("substore.core")
local util = require("substore.util")
local passed, failed = 0, 0
local function check(name, cond)
if cond then passed = passed + 1; print("PASS " .. name)
else failed = failed + 1; print("FAIL " .. name) end
end
-- 重定向数据目录与 cron 文件到临时目录,避免污染系统
local tmp = os.tmpname() .. "_substore_cron"
os.execute("mkdir -p " .. string.format("%q", tmp .. "/nodes"))
core.DATA_DIR = tmp
core.LIST_FILE = tmp .. "/subscriptions.json"
core.NODES_DIR = tmp .. "/nodes"
core.CRON_FILE = tmp .. "/cron.d.substore"
-- ---------- cron_time_valid ----------
check("valid cron", core.cron_time_valid("0 3 * * *"))
check("valid all wildcard", core.cron_time_valid("* * * * *"))
check("valid single digit", core.cron_time_valid("30 4 1 12 6"))
check("invalid too many fields", not core.cron_time_valid("0 3 * * * extra"))
check("invalid too few fields", not core.cron_time_valid("0 3 * *"))
check("invalid empty", not core.cron_time_valid(""))
check("invalid injection semicolon", not core.cron_time_valid("0 3 * * *;rm -rf /"))
check("invalid injection pipe", not core.cron_time_valid("0 3 * * * | reboot"))
check("invalid non-digit", not core.cron_time_valid("0 3 * * abc"))
-- ---------- add 带 cron ----------
local id1 = core.add("带定时", "http://example.com/a", { cron_enable = "1", cron_time = "0 4 * * *" })
local m1 = core.get(id1)
check("add with cron enabled", m1.cron_enable == true and m1.cron_time == "0 4 * * *")
local id2 = core.add("无定时", "http://example.com/b")
local m2 = core.get(id2)
check("add default cron disabled", m2.cron_enable ~= true and m2.cron_time == "")
local id3 = core.add("无效定时", "http://example.com/c", { cron_enable = "1", cron_time = "0 0 * * ;evil" })
local m3 = core.get(id3)
check("add invalid cron sanitized", m3.cron_enable ~= true and m3.cron_time == "")
-- ---------- write_cron ----------
core.write_cron()
local raw = util.read_file(core.CRON_FILE) or ""
check("cron file has enabled sub", raw:find(id1, 1, true) ~= nil)
check("cron file excludes disabled", raw:find(id2, 1, true) == nil)
check("cron file has header comment", raw:find("# luci-app-substore cron", 1, true) ~= nil)
-- 全部关闭后:cron 文件应被移除
core.save_meta(id1, { cron_enable = "0" })
core.write_cron()
check("cron file removed when none enabled", util.read_file(core.CRON_FILE) == nil)
-- 清理
os.execute("rm -rf " .. string.format("%q", tmp))
print(string.format("\n%d passed, %d failed", passed, failed))
os.exit(failed == 0 and 0 or 1)