define RARRAY_PTR/RARRAY_LEN macros for Ruby 1.8.6
[kgio.git] / test / test_poll.rb
blobba0e5614ac5e9d05480a179d0d53f4266b215e74
1 require 'test/unit'
2 $-w = true
3 require 'kgio'
5 class TestPoll < Test::Unit::TestCase
6   def teardown
7     [ @rd, @wr ].each { |io| io.close unless io.closed? }
8   end
10   def setup
11     @rd, @wr = IO.pipe
12   end
14   def test_constants
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
21   end
23   def test_poll_symbol
24     set = { @rd => :wait_readable, @wr => :wait_writable }
25     res = Kgio.poll(set)
26     assert_equal({@wr => Kgio::POLLOUT}, res)
27     assert_equal set.object_id, res.object_id
28   end
30   def test_poll_integer
31     set = { @wr => Kgio::POLLOUT|Kgio::POLLHUP }
32     res = Kgio.poll(set)
33     assert_equal({@wr => Kgio::POLLOUT}, res)
34     assert_equal set.object_id, res.object_id
35   end
37   def test_poll_timeout
38     t0 = Time.now
39     res = Kgio.poll({}, 10)
40     diff = Time.now - t0
41     assert diff >= 0.010, "diff=#{diff}"
42     assert_nil res
43   end
45   def test_poll_close
46     foo = nil
47     thr = Thread.new { sleep 0.100; @wr.close }
48     t0 = Time.now
49     res = Kgio.poll({@rd => Kgio::POLLIN})
50     diff = Time.now - t0
51     thr.join
52     assert_equal([ @rd ], res.keys)
53     assert diff >= 0.010, "diff=#{diff}"
54   end
56   def test_signal_close
57     orig = trap(:USR1) { @rd.close }
58     res = nil
59     thr = Thread.new { sleep 0.100; Process.kill(:USR1, $$) }
60     t0 = Time.now
61     assert_raises(IOError) { Kgio.poll({@rd => Kgio::POLLIN}) }
62     diff = Time.now - t0
63     thr.join
64     assert diff >= 0.010, "diff=#{diff}"
65     ensure
66       trap(:USR1, orig)
67   end
69   def test_poll_EINTR
70     ok = false
71     orig = trap(:USR1) { ok = true }
72     thr = Thread.new do
73       sleep 0.100
74       Process.kill(:USR1, $$)
75     end
76     t0 = Time.now
77     res = Kgio.poll({@rd => Kgio::POLLIN}, 1000)
78     diff = Time.now - t0
79     thr.join
80     assert_nil res
81     assert diff >= 1.0, "diff=#{diff}"
82     assert ok
83     ensure
84       trap(:USR1, orig)
85   end
87   def test_poll_EINTR_changed
88     ok = false
89     orig = trap(:USR1) { ok = true }
90     pollset = { @rd => Kgio::POLLIN }
91     thr = Thread.new do
92       sleep 0.100
93       pollset[@wr] = Kgio::POLLOUT
94       Process.kill(:USR1, $$)
95     end
96     t0 = Time.now
97     res = Kgio.poll(pollset, 1000)
98     diff = Time.now - t0
99     thr.join
100     assert_equal({@wr => Kgio::POLLOUT}, res)
101     assert diff < 1.0, "diff=#{diff}"
102     assert ok
103     ensure
104       trap(:USR1, orig)
105   end
107   def test_poll_signal_torture
108     usr1 = 0
109     empty = 0
110     nr = 100
111     set = { @rd => Kgio::POLLIN }
112     trap(:USR1) { usr1 += 1 }
113     pid = fork do
114       trap(:USR1, "DEFAULT")
115       sleep 0.1
116       ppid = Process.ppid
117       nr.times { Process.kill(:USR1, ppid); sleep 0.05 }
118       @wr.syswrite('.')
119       exit!(0)
120     end
122     assert_nothing_raised do
123       empty += 1 until Kgio.poll(set.dup, 100)
124     end
125     _, status = Process.waitpid2(pid)
126     assert status.success?, status.inspect
127     assert usr1 > 0, "usr1: #{usr1}"
128     rescue Object => err
129       p [ :err, err ]
130     ensure
131       trap(:USR1, "DEFAULT")
132   end
133 end if Kgio.respond_to?(:poll)