preliminary kqueue support
[sleepy_penguin.git] / test / test_kqueue_io.rb
blobea187677eca65db919e9aa462c8c3c2e78630a46
1 require 'test/unit'
2 $-w = true
3 Thread.abort_on_exception = true
4 require 'sleepy_penguin'
6 class TestKqueueIO < Test::Unit::TestCase
7   include SleepyPenguin
9   def test_xthread
10     kq = Kqueue::IO.new
11     assert_kind_of IO, kq
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 |ident,filter,flags,fflags,data,udata|
21       events << [ ident,filter,flags,fflags,data,udata ]
22     end
23     assert_equal 1, events.size
24     assert_equal rd.fileno, events[0][0]
25     assert_equal EvFilt::READ, events[0][1]
26     assert_equal 1, n
28     # we should be drained
29     events = []
30     n = kq.kevent(nil, 1, 0) do |ident,filter,flags,fflags,data,udata|
31       events << [ ident,filter,flags,fflags,data,udata ]
32     end
33     assert_equal 0, events.size
34     assert_equal 0, n
36     # synchronous add
37     events = []
38     ev = Kevent[wr.fileno, EvFilt::WRITE, Ev::ADD|Ev::ONESHOT, 0, 0, wr]
39     kq.kevent(ev)
40     n = kq.kevent(nil, 1, 0) do |ident,filter,flags,fflags,data,udata|
41       events << [ ident,filter,flags,fflags,data,udata ]
42     end
43     assert_equal 1, events.size
44     assert_equal wr.fileno, events[0][0]
45     assert_equal EvFilt::WRITE, events[0][1]
46     assert_equal 1, n
47   ensure
48     kq.close
49     rd.close if rd
50     wr.close if wr
51   end
52 end if defined?(SleepyPenguin::Kqueue::IO)