preliminary kqueue support
[sleepy_penguin.git] / test / test_kqueue.rb
blob408783eeff41143f7bd19aabc1be9e34aa55888f
1 require 'test/unit'
2 $-w = true
3 Thread.abort_on_exception = true
4 require 'sleepy_penguin'
6 class TestKqueue < Test::Unit::TestCase
7   include SleepyPenguin
9   def test_kqueue
10     kq = Kqueue.new
11     assert_kind_of IO, kq.to_io
12     rd, wr = IO.pipe
13     ev = Kevent[rd.fileno, EvFilt::READ, Ev::ADD|Ev::ONESHOT, 0, 0, rd]
14     thr = Thread.new do
15       kq.kevent(ev)
16       wr.syswrite "."
17     end
19     events = []
20     n = kq.kevent(nil, 1) do |kevent|
21       assert_kind_of Kevent, kevent
22       events << kevent
23     end
24     assert_equal 1, events.size
25     assert_equal rd.fileno, events[0][0]
26     assert_equal EvFilt::READ, events[0][1]
27     assert_equal 1, n
29     # we should be drained
30     events = []
31     n = kq.kevent(nil, 1, 0) do |kevent|
32       assert_kind_of Kevent, kevent
33       events << kevent
34     end
35     assert_equal 0, events.size
36     assert_equal 0, n
38     # synchronous add
39     events = []
40     ev = Kevent[wr.fileno, EvFilt::WRITE, Ev::ADD|Ev::ONESHOT, 0, 0, wr]
41     kq.kevent(ev)
42     n = kq.kevent(nil, 1, 0) do |kevent|
43       assert_kind_of Kevent, kevent
44       events << kevent
45     end
46     assert_equal 1, events.size
47     assert_equal wr.fileno, events[0][0]
48     assert_equal EvFilt::WRITE, events[0][1]
49     assert_equal 1, n
50   ensure
51     kq.close
52     rd.close if rd
53     wr.close if wr
54   end
55 end if defined?(SleepyPenguin::Kqueue)