5 class TestPoll < Test::Unit::TestCase
7 [ @rd, @wr ].each { |io| io.close unless io.closed? }
15 assert_kind_of Integer, Kgio::POLLIN
16 assert_kind_of Integer, Kgio::POLLOUT
17 assert_kind_of Integer, Kgio::POLLPRI
18 assert_kind_of Integer, Kgio::POLLHUP
19 assert_kind_of Integer, Kgio::POLLERR
20 assert_kind_of Integer, Kgio::POLLNVAL
24 set = { @rd => :wait_readable, @wr => :wait_writable }
26 assert_equal({@wr => Kgio::POLLOUT}, res)
27 assert_equal set.object_id, res.object_id
31 set = { @wr => Kgio::POLLOUT|Kgio::POLLHUP }
33 assert_equal({@wr => Kgio::POLLOUT}, res)
34 assert_equal set.object_id, res.object_id
39 res = Kgio.poll({}, 10)
41 assert diff >= 0.010, "diff=#{diff}"
47 thr = Thread.new { sleep 0.100; @wr.close }
49 res = Kgio.poll({@rd => Kgio::POLLIN})
52 assert_equal([ @rd ], res.keys)
53 assert diff >= 0.010, "diff=#{diff}"
57 orig = trap(:USR1) { @rd.close }
59 thr = Thread.new { sleep 0.100; Process.kill(:USR1, $$) }
61 assert_raises(IOError) { Kgio.poll({@rd => Kgio::POLLIN}) }
64 assert diff >= 0.010, "diff=#{diff}"
71 orig = trap(:USR1) { ok = true }
74 Process.kill(:USR1, $$)
77 res = Kgio.poll({@rd => Kgio::POLLIN}, 1000)
81 assert diff >= 1.0, "diff=#{diff}"
87 def test_poll_EINTR_changed
89 orig = trap(:USR1) { ok = true }
90 pollset = { @rd => Kgio::POLLIN }
93 pollset[@wr] = Kgio::POLLOUT
94 Process.kill(:USR1, $$)
97 res = Kgio.poll(pollset, 1000)
100 assert_equal({@wr => Kgio::POLLOUT}, res)
101 assert diff < 1.0, "diff=#{diff}"
107 def test_poll_signal_torture
111 set = { @rd => Kgio::POLLIN }
112 trap(:USR1) { usr1 += 1 }
114 trap(:USR1, "DEFAULT")
117 nr.times { Process.kill(:USR1, ppid); sleep 0.05 }
122 assert_nothing_raised do
123 empty += 1 until Kgio.poll(set.dup, 100)
125 _, status = Process.waitpid2(pid)
126 assert status.success?, status.inspect
127 assert usr1 > 0, "usr1: #{usr1}"
131 trap(:USR1, "DEFAULT")
133 end if Kgio.respond_to?(:poll)