singe/thirdparty/copas/tests/timer.lua

127 lines
3.9 KiB
Lua

-- make sure we are pointing to the local copas first
package.path = string.format("../src/?.lua;%s", package.path)
local copas = require "copas"
local gettime = require("socket").gettime
local timer = copas.timer
local successes = 0
copas.loop(function()
local count_t1 = 0
local t1 = timer.new({
delay = 0.5,
recurring = true,
params = "hello world",
callback = function(timer_obj, params)
-- let's ensure parameters get passed
assert(params == "hello world", "expected: hello world")
successes = successes + 1 -- 6 to come
count_t1 = count_t1 + 1
print(params .. " " .. count_t1)
end,
})
-- succes count = 6
local t2 = timer.new({
delay = 0.2, -- we'll override this with 0.1 below
recurring = false,
params = {
start_time = gettime()
},
initial_delay = 0.1, -- initial delay, only 0.1
callback = function(timer_obj, params)
assert(gettime() - params.start_time < 0.11, "didn't honour initial delay, or recurred")
print("this seems to go well, and should print only once")
successes = successes + 1 -- 1 to come
end,
})
-- succes count = 7
timer.new({
delay = 3.3, --> allows T1 to run 6 times
callback = function(timer_obj, params)
t1:cancel()
local _, err = t2:cancel()
assert(err == "not armed", "expected t2 to already be stopped")
successes = successes + 1 -- 1 to come
assert(count_t1 == 6, "expected t1 to run 6 times!")
successes = successes + 1 -- 1 to come
timer_obj:cancel() -- cancel myself
end,
})
-- succes count = 9
timer.new({
delay = 0.1,
recurring = true,
callback = function(timer_obj, params)
-- re-arm myself (recurring), should not be possible
local ok, err = timer_obj:arm(1)
assert(err == "already armed", "expected myself to be already armed")
assert(ok == nil, "expected 'ok' to be nil")
print("failed to re-arm a recurring timer, so that's ok")
successes = successes + 1 -- 1 to come
assert(timer_obj:cancel()) -- cancel myself
end,
})
-- succes count = 10
local touched = false
timer.new({
delay = 0.1,
recurring = false,
callback = function(timer_obj, params)
if touched == false then
-- re-arm myself (non-recurring), should be possible
local ok, err = timer_obj:arm(3)
assert(ok == timer_obj)
assert(err == nil, "expected 'err' to be nil")
touched = gettime()
print("re-armed a non-recurring timer, so that's ok")
successes = successes + 1 -- 1 to come
else
print("a re-armed non-recurring timer executed, so that's ok")
successes = successes + 1 -- 1 to come
local t = math.abs(gettime() - touched - 3)
assert(t < 0.01, "expected a 3 second delay for the rearmed timer. Got: "..(gettime() - touched))
successes = successes + 1 -- 1 to come
end
end,
})
-- succes count = 13
local count = 0
local params_in = {}
-- timer shouldn't be cancelled if its handler errors
timer.new({
name = "error-test",
delay = 0.1,
recurring = true,
params = params_in,
errorhandler = function(msg, co, skt)
local errmsg = copas.gettraceback(msg, co, skt)
assert(errmsg:find("error%-test"), "the threadname wasn't found")
assert(errmsg:find("error 1!") or errmsg:find("error 2!"), "the error message wasn't found")
--print(errmsg)
successes = successes + 1
end,
callback = function(timer_obj, params)
assert(params == params_in, "Params table wasn't passed along")
count = count + 1
if count == 2 then
-- 2nd call, so we're done
timer_obj:cancel()
end
error("error "..count.."!")
end,
})
-- succes count = 15
end)
assert(successes == 15, "number of successes didn't match! got: "..successes)
print("test success!")