Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
lua-ev/test/test_ev_timer.lua
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
205 lines (161 sloc)
4.71 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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") | |