awesome/tests/_runner.lua

85 lines
2.3 KiB
Lua

timer = require("gears.timer")
runner = {
quit_awesome_on_error = os.getenv('TEST_PAUSE_ON_ERRORS') ~= '1',
-- quit-on-timeout defaults to false: indicates some problem with the test itself.
quit_awesome_on_timeout = os.getenv('TEST_QUIT_ON_TIMEOUT') ~= '1',
}
-- Helpers.
--- Add some rules to awful.rules.rules, after the defaults.
local default_rules = awful.util.table.clone(awful.rules.rules)
runner.add_to_default_rules = function(r)
awful.rules.rules = awful.util.table.clone(default_rules)
table.insert(awful.rules.rules, r)
end
runner.run_steps = function(steps)
-- Setup timer/timeout to limit waiting for signal and quitting awesome.
-- This would be common for all tests.
local t = timer({timeout=0.1})
local wait=20
local step=1
local step_count=0
t:connect_signal("timeout", function() timer.delayed_call(function()
io.flush() -- for "tail -f".
step_count = step_count + 1
local step_as_string = step..'/'..#steps..' (@'..step_count..')'
-- Call the current step's function.
local success, result = pcall(steps[step], step_count)
if not success then
io.stderr:write('Error: running function for step '
..step_as_string..': '..tostring(result)..'!\n')
t:stop()
if not runner.quit_awesome_on_error then
io.stderr:write("Keeping awesome open...\n")
return -- keep awesome open on error.
end
elseif result then
-- true: test succeeded.
if step < #steps then
-- Next step.
step = step+1
step_count = 0
wait = 5
t:again()
return
end
elseif result == false then
io.stderr:write("Step "..step_as_string.." failed (returned false).")
if not runner.quit_awesome_on_error then
io.stderr:write("Keeping awesome open...\n")
return
end
else
wait = wait-1
if wait > 0 then
t:again()
return
else
io.stderr:write("Error: timeout waiting for signal in step "
..step_as_string..".\n")
t:stop()
if not runner.quit_awesome_on_timeout then
return
end
end
end
-- Remove any clients.
for _,c in ipairs(client.get()) do
c:kill()
end
awesome.quit()
end) end)
t:start()
end
return runner