289 lines
5.4 KiB
Lua
289 lines
5.4 KiB
Lua
--[[
|
|
Tests for Callisto
|
|
Run with:
|
|
./csto test.lua
|
|
|
|
A test should use the smallest amount of functions possible,
|
|
and should not rely on facilities such as os.execute to complete
|
|
its task. Using functions in the same library is acceptable, but
|
|
Callisto facilities in different libraries should not be used.
|
|
|
|
Licensed to the public domain
|
|
]]--
|
|
|
|
local oldenv = _ENV
|
|
|
|
local function test(f)
|
|
local _ENV = oldenv
|
|
local function mesg(...)
|
|
io.stdout:write(..., '\n')
|
|
end
|
|
|
|
assert(type(f) == "function")
|
|
mesg(f())
|
|
end
|
|
|
|
-- Table containing tests for each library.
|
|
-- The cl library is excluded from here as it is almost
|
|
-- impossible to test without user interaction.
|
|
local tests = {
|
|
environ = {
|
|
getvar = function ()
|
|
local var = "HOME"
|
|
|
|
assert(environ[var])
|
|
return 'environ["' .. var .. '"] ~= nil'
|
|
end,
|
|
setvar = function ()
|
|
local var = "VAR"
|
|
local val = "hello"
|
|
|
|
environ[var] = val
|
|
assert(environ[var] == "hello")
|
|
return 'environ["' .. var .. '"] = "' .. val .. '"'
|
|
end,
|
|
pairs = function ()
|
|
local ev = {}
|
|
local var = "VAR"
|
|
|
|
environ[var] = "1"
|
|
for env in pairs(environ) do
|
|
ev[env] = environ[env]
|
|
end
|
|
assert(ev[var] == "1")
|
|
return "pairs(environ)"
|
|
end
|
|
},
|
|
|
|
extra = {
|
|
},
|
|
|
|
fs = {
|
|
copy = function ()
|
|
local src, dst = "testfile", "testfile.cp"
|
|
local contents = "hello, world!"
|
|
local f, err = io.open(src, 'w')
|
|
|
|
assert(f, err)
|
|
|
|
f:write(contents)
|
|
f:close()
|
|
|
|
assert(fs.copy(src, dst))
|
|
assert(io.input(dst):read('a') == contents)
|
|
|
|
assert(fs.remove(src))
|
|
assert(fs.remove(dst))
|
|
|
|
return 'fs.copy("' .. src .. '", "' .. dst .. '")'
|
|
end,
|
|
directory = function ()
|
|
local dir, subdir = "testdir", "testdir/sub"
|
|
|
|
assert(fs.mkdir(dir))
|
|
assert(fs.exists(dir) and fs.isdirectory(dir))
|
|
assert(fs.rmdir(dir))
|
|
assert(fs.mkdir(subdir, true))
|
|
|
|
assert(fs.exists(dir))
|
|
assert(fs.isdirectory(dir))
|
|
assert(fs.exists(subdir))
|
|
assert(fs.isdirectory(subdir))
|
|
|
|
assert(fs.rmdir(subdir))
|
|
assert(fs.rmdir(dir))
|
|
|
|
return ([[
|
|
fs.mkdir("%s")
|
|
fs.rmdir("%s")
|
|
fs.mkdir("%s", true)
|
|
fs.rmdir("%s"")
|
|
fs.rmdir("%s")]]):format(
|
|
dir,
|
|
dir,
|
|
subdir,
|
|
subdir,
|
|
dir
|
|
)
|
|
end,
|
|
move = function ()
|
|
local src, dst = "testfile", "testfile.new"
|
|
local contents = "hello, world!"
|
|
local f, err = io.open(src, 'w')
|
|
|
|
assert(f, err)
|
|
|
|
f:write(contents)
|
|
f:close()
|
|
|
|
assert(fs.move(src, dst))
|
|
assert(io.input(dst):read('a') == contents)
|
|
|
|
assert(fs.remove(dst))
|
|
|
|
return 'fs.move("' .. src .. '", "' .. dst .. '")'
|
|
end,
|
|
path = function ()
|
|
local bpath, base = "/etc/fstab", "fstab"
|
|
local dpath, dir = "/usr/local/bin", "/usr/local"
|
|
|
|
assert(fs.basename(bpath) == base)
|
|
assert(fs.dirname(dpath) == dir)
|
|
|
|
return 'fs.basename("' .. bpath .. [[")
|
|
fs.dirname("]] .. dpath .. '")'
|
|
end,
|
|
remove = function ()
|
|
local file = "testfile"
|
|
local f, err = io.open(file, 'w')
|
|
|
|
assert(f, err)
|
|
|
|
f:write("")
|
|
f:close()
|
|
|
|
assert(fs.remove(file))
|
|
|
|
return 'fs.remove("' .. file .. '")'
|
|
end,
|
|
workdir = function ()
|
|
local d = "/usr"
|
|
local wd = fs.workdir()
|
|
|
|
fs.workdir(d)
|
|
assert(fs.workdir() == d)
|
|
fs.workdir(wd)
|
|
assert(fs.workdir() == wd)
|
|
return 'fs.workdir("' .. d .. '")'
|
|
end
|
|
},
|
|
|
|
-- basic tests for lua-cjson; this is not
|
|
-- my library so I won't test it extensively
|
|
json = {
|
|
decode = function()
|
|
local o = [[
|
|
"hello": "world",
|
|
"n": 4,
|
|
"fpn": 2.4444449,
|
|
"a": [1, 2, 4, 8, 16]
|
|
]]
|
|
local j = [[
|
|
{
|
|
]] .. o .. [[,
|
|
"o": {
|
|
]] .. o .. [[
|
|
}
|
|
}
|
|
]]
|
|
|
|
local t = json.decode(j)
|
|
|
|
for _, t in ipairs {t, t.o} do
|
|
assert(t.hello == "world")
|
|
assert(t.n == 4)
|
|
assert(t.fpn == 2.4444449)
|
|
assert(t.a[1] == 1)
|
|
assert(t.a[2] == 2)
|
|
assert(t.a[3] == 4)
|
|
assert(t.a[4] == 8)
|
|
assert(t.a[5] == 16)
|
|
end
|
|
|
|
return "json.decode('" .. j:gsub("%s", "") .. "')"
|
|
end,
|
|
encode = function()
|
|
local o = {
|
|
hello = "world",
|
|
n = 4,
|
|
fpn = 2.4444449,
|
|
a = {1, 2, 4, 8, 16}
|
|
}
|
|
|
|
local j = json.encode(o)
|
|
local t = json.decode(j)
|
|
|
|
assert(t.hello == "world")
|
|
assert(t.n == 4)
|
|
assert(t.fpn == 2.4444449)
|
|
assert(t.a[1] == 1)
|
|
assert(t.a[2] == 2)
|
|
assert(t.a[3] == 4)
|
|
assert(t.a[4] == 8)
|
|
assert(t.a[5] == 16)
|
|
|
|
return "json.decode(json.encode({...}))"
|
|
end
|
|
},
|
|
|
|
os = {
|
|
hostname = function ()
|
|
assert(os.hostname())
|
|
return "os.hostname()"
|
|
end
|
|
},
|
|
|
|
process = {
|
|
pid = function ()
|
|
assert(math.type(process.pid()) == "integer")
|
|
return "process.pid()"
|
|
end,
|
|
pidof = function ()
|
|
local proc = "csto"
|
|
|
|
assert(math.type(process.pidof(proc)) == "integer")
|
|
return 'process.pidof("' .. proc .. '")'
|
|
end,
|
|
signum = function ()
|
|
local sig = "SIGKILL"
|
|
|
|
-- probably signal no.9
|
|
assert(math.type(process.signum(sig)) == "integer")
|
|
return 'process.signum("' .. sig .. '")'
|
|
end,
|
|
send = function ()
|
|
local hdl = io.popen("sleep 8")
|
|
local pid = process.pidof("sleep")
|
|
|
|
assert(process.send(pid, "SIGKILL"))
|
|
hdl:close()
|
|
|
|
return "process.send(" .. tostring(pid) .. ', "SIGKILL")'
|
|
end
|
|
}
|
|
}
|
|
|
|
-- Run all tests.
|
|
do
|
|
local env = tests
|
|
env.test = test
|
|
local _ENV = env
|
|
|
|
-- environ
|
|
test(environ.getvar)
|
|
test(environ.setvar)
|
|
test(environ.pairs)
|
|
|
|
-- fs
|
|
test(fs.copy)
|
|
test(fs.directory)
|
|
test(fs.move)
|
|
test(fs.path)
|
|
test(fs.remove)
|
|
test(fs.workdir)
|
|
|
|
-- json
|
|
test(json.decode)
|
|
test(json.encode)
|
|
|
|
-- os
|
|
test(os.hostname)
|
|
|
|
-- process
|
|
test(process.pid)
|
|
test(process.pidof)
|
|
test(process.signum)
|
|
test(process.send)
|
|
end
|
|
|
|
cl.mesg("all tests completed successfully")
|