1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
|