Permalink
Switch branches/tags
Find file
Fetching contributors…
Cannot retrieve contributors at this time
206 lines (161 sloc) 4.71 KB
print '1..20'
local src_dir, build_dir = ...
package.path = src_dir .. "?.lua;" .. package.path
package.cpath = build_dir .. "?.so;" .. package.cpath
local tap = require("tap")
local ev = require("ev")
local help = require("help")
local dump = require("dumper").dump
local ok = tap.ok
local noleaks = help.collect_and_assert_no_watchers
local loop = ev.Loop.default
-- Simply see if we can do a simple one second timer:
function test_basic()
local timer1 = ev.Timer.new(
function(loop, timer, revents)
ok(true, 'one second timer')
ok(ev.TIMEOUT == revents, 'ev.TIMEOUT(' .. ev.TIMEOUT .. ') == revents (' .. revents .. ')')
end,
0.01)
timer1:start(loop)
loop:loop()
end
-- Test daemon=true on timer()
function test_daemon_true()
local timer1_count = 0
local timer1 = ev.Timer.new(
function(loop, timer)
timer1_count = timer1_count + 1
ok(timer1_count == 1, 'once and only once')
end, 0.1)
timer1:start(loop)
local timer2_count = 0
local timer2 = ev.Timer.new(
function(loop, timer)
timer2_count = timer2_count + 1
ok(timer2_count == 1, 'once and only once')
end, 0.01)
timer2:start(loop, true)
loop:loop()
local timer3 = ev.Timer.new(
function(loop, timer)
ok(false, 'Should never be called!')
end, 0.01)
timer3:start(loop, true)
loop:loop()
-- TODO: Should we make it so timer3 is automatically stopped if it is never executed in the event loop?
timer3:stop(loop)
end
-- Test again() method
function test_again()
local timer1_count = 0
local timer1 = ev.Timer.new(
function(loop, timer)
timer1_count = timer1_count + 1
if timer1_count == 3 then
timer:stop(loop)
else
timer:again(loop, 0.1)
end
end, 0.1)
timer1:start(loop)
loop:loop()
ok(timer1_count == 3, 'timer1 called thrice')
end
-- Test stop(), start(), and is_active()
function test_start_stop_active()
local timer1_count = 0
local timer1 = ev.Timer.new(
function(loop, timer)
timer1_count = timer1_count + 1
ok(timer1_count == 1, 'once and only once')
end, 0.01)
ok(not timer1:is_active(), 'not active')
timer1:start(loop)
ok(timer1:is_active(), 'active')
timer1:stop(loop)
loop:loop()
timer1:start(loop)
loop:loop()
end
-- Test invoke()
function test_callback()
local timer1_count1 = 0
local timer1 = ev.Timer.new(
function()
timer1_count1 = timer1_count1 + 1
ok(timer1_count1 == 1, 'once and only once A')
end, 0.01)
-- Test calling the callback manually:
timer1:callback()()
local timer1_count2 = 0
-- Test setting the callback:
timer1:callback(
function(loop, timer)
timer1_count2 = timer1_count2 + 1
ok(timer1_count2 == 1, 'once and only once B')
end)
-- Register it and have it get called:
timer1:start(loop)
loop:loop()
end
-- Test is_pending()
function test_is_pending()
local num_pending = 0
local num_called = 0
local timer2
local timer1 = ev.Timer.new(
function(loop, timer)
if ( timer2:is_pending() ) then
num_pending = num_pending + 1
end
num_called = num_called + 1
end, 0.01)
timer1:start(loop)
timer2 = ev.Timer.new(
function(loop, timer)
if ( timer1:is_pending() ) then
num_pending = num_pending + 1
end
num_called = num_called + 1
end, 0.01)
timer2:start(loop)
loop:loop()
ok(num_pending == 1, 'exactly one timer was pending')
ok(num_called == 2, 'both timers got called')
end
-- Test clear_pending()
function test_clear_pending()
local num_called = 0
local timer2
local timer1 = ev.Timer.new(
function(loop, timer)
if ( timer2:is_pending() ) then
timer2:clear_pending(loop)
end
num_called = num_called + 1
end, 0.01)
timer1:start(loop)
timer2 = ev.Timer.new(
function(loop, timer)
if ( timer1:is_pending() ) then
timer1:clear_pending(loop)
end
num_called = num_called + 1
end, 0.01)
timer2:start(loop)
loop:loop()
ok(num_called == 1, 'exactly one timer was called')
end
noleaks(test_basic, "test_basic")
noleaks(test_daemon_true, "test_daemon_true")
noleaks(test_again, "test_again")
noleaks(test_start_stop_active, "test_start_stop_active")
noleaks(test_callback, "test_callback")
noleaks(test_is_pending, "test_is_pending")
noleaks(test_clear_pending, "test_clear_pending")
--print(dump("registry", debug.getregistry()[1]));
-- test_is_pending()
-- noleaks("test_is_pending")
-- test_clear_pending()
-- noleaks("test_clear_pending")