kqueue: workaround lack of RSTRUCT* macros on Rubinius
[sleepy_penguin.git] / test / test_kqueue_io.rb
blob076c9f045e72cad66ea9586773eed225e300f21b
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 setup
10     @to_close = []
11   end
13   def teardown
14     @to_close.each do |io|
15       io.close unless io.closed?
16     end
17   end
19   def test_bad_type
20     kq = Kqueue::IO.new
21     @to_close << kq
22     assert_raises(TypeError) { kq.kevent("HI") }
23   end
25   def test_multi_event
26     kq = Kqueue::IO.new
27     @to_close << kq
28     list = []
29     pipes = [ IO.pipe, IO.pipe, IO.pipe, IO.pipe ]
30     pipes.each do |(r,w)|
31       @to_close << r
32       @to_close << w
33       list << Kevent[r.fileno, EvFilt::READ, Ev::ADD|Ev::ONESHOT, 0, 0, r]
34     end
35     kq.kevent(list)
37     pipes.each do |(_,w)|
38       w.syswrite('.')
39     end
40     received = []
41     seen = {}
42     kq.kevent(nil, 1) do |*args|
43       received << args
44       assert_equal 6, args.size
45       assert_kind_of IO, args[5]
46       assert_nil seen[args[5]]
47       seen[args[5]] = true
48     end
50     assert_equal 1, received.size
52     kq.kevent(nil, 666) do |*args|
53       received << args
54       assert_equal 6, args.size
55       assert_kind_of IO, args[5]
56       assert_nil seen[args[5]]
57       seen[args[5]] = true
58     end
59     assert_equal 4, received.size
60   end
62   def test_xthread
63     kq = Kqueue::IO.new
64     assert_kind_of IO, kq
65     rd, wr = IO.pipe
66     ev = Kevent[rd.fileno, EvFilt::READ, Ev::ADD|Ev::ONESHOT, 0, 0, rd]
67     thr = Thread.new do
68       kq.kevent(ev)
69       wr.syswrite "."
70     end
72     events = []
73     n = kq.kevent(nil, 1) do |ident,filter,flags,fflags,data,udata|
74       events << [ ident,filter,flags,fflags,data,udata ]
75     end
76     assert_equal 1, events.size
77     assert_equal rd.fileno, events[0][0]
78     assert_equal EvFilt::READ, events[0][1]
79     assert_equal 1, n
81     thr.join
83     # we should be drained
84     events = []
85     n = kq.kevent(nil, 1, 0) do |ident,filter,flags,fflags,data,udata|
86       events << [ ident,filter,flags,fflags,data,udata ]
87     end
88     assert_equal 0, events.size
89     assert_equal 0, n
91     # synchronous add
92     events = []
93     ev = Kevent[wr.fileno, EvFilt::WRITE, Ev::ADD|Ev::ONESHOT, 0, 0, wr]
94     kq.kevent(ev)
95     n = kq.kevent(nil, 1, 0) do |ident,filter,flags,fflags,data,udata|
96       events << [ ident,filter,flags,fflags,data,udata ]
97     end
98     assert_equal 1, events.size
99     assert_equal wr.fileno, events[0][0]
100     assert_equal EvFilt::WRITE, events[0][1]
101     assert_equal 1, n
102   ensure
103     kq.close
104     rd.close if rd
105     wr.close if wr
106   end
107 end if defined?(SleepyPenguin::Kqueue::IO)