diff options
Diffstat (limited to 'test/test_queue.rb')
-rw-r--r-- | test/test_queue.rb | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/test/test_queue.rb b/test/test_queue.rb new file mode 100644 index 0000000..6d61aef --- /dev/null +++ b/test/test_queue.rb @@ -0,0 +1,59 @@ +# Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors +# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt) +require_relative 'helper' +require 'timeout' +require 'stringio' + +class TestQueue < Testcase + parallelize_me! + + def setup + @q = Yahns::Queue.new + @err = StringIO.new + @logger = Logger.new(@err) + @q.fdmap = @fdmap = Yahns::Fdmap.new(@logger, 0.5) + assert @q.close_on_exec? + end + + def test_queue + r, w = IO.pipe + assert_equal 0, @fdmap.size + @q.queue_add(r, Yahns::Queue::QEV_RD) + assert_equal 1, @fdmap.size + def r.yahns_step + begin + case read_nonblock(11) + when "delete" + return :delete + end + rescue Errno::EAGAIN + return :wait_readable + rescue EOFError + return nil + end while true + end + w.write('.') + Timeout.timeout(10) do + Thread.pass until r.nread > 0 + @q.spawn_worker_threads(@logger, 1, 1) + Thread.pass until r.nread == 0 + + w.write("delete") + Thread.pass until r.nread == 0 + Thread.pass until @fdmap.size == 0 + + # should not raise + @q.queue_add(r, Yahns::Queue::QEV_RD) + assert_equal 1, @fdmap.size + w.close + Thread.pass until @fdmap.size == 0 + end + assert r.closed? + ensure + [ r, w ].each { |io| io.close unless io.closed? } + end + + def teardown + @q.close + end +end |