splice.c: remove reference to non-existent function
[sleepy_penguin.git] / test / test_kqueue.rb
blob9d853c1d7286bf938b29a250d9b0bd77f468804a
1 require_relative 'helper'
3 class TestKqueue < Test::Unit::TestCase
4   include SleepyPenguin
6   def test_kqueue
7     kq = Kqueue.new
8     assert_kind_of IO, kq.to_io
9     assert_predicate kq.to_io, :close_on_exec?
10     rd, wr = IO.pipe
11     ev = Kevent[rd.fileno, EvFilt::READ, Ev::ADD|Ev::ONESHOT, 0, 0, rd]
12     thr = Thread.new do
13       kq.kevent(ev)
14       wr.syswrite "."
15     end
17     events = []
18     n = kq.kevent(nil, 1) do |kevent|
19       assert_kind_of Kevent, kevent
20       events << kevent
21     end
22     assert_equal 1, events.size
23     assert_equal rd.fileno, events[0][0]
24     assert_equal EvFilt::READ, events[0][1]
25     assert_equal 1, n
27     # we should be drained
28     events = []
29     n = kq.kevent(nil, 1, 0) do |kevent|
30       assert_kind_of Kevent, kevent
31       events << kevent
32     end
33     assert_equal 0, events.size
34     assert_equal 0, n
35     thr.join
37     # synchronous add
38     events = []
39     ev = Kevent[wr.fileno, EvFilt::WRITE, Ev::ADD|Ev::ONESHOT, 0, 0, wr]
40     kq.kevent(ev)
41     n = kq.kevent(nil, 1, 0) do |kevent|
42       assert_kind_of Kevent, kevent
43       events << kevent
44     end
45     assert_equal 1, events.size
46     assert_equal wr.fileno, events[0][0]
47     assert_equal EvFilt::WRITE, events[0][1]
48     assert_equal 1, n
49   ensure
50     kq.close
51     rd.close if rd
52     wr.close if wr
53   end
55   def test_usable_after_fork
56     kq = Kqueue.new
57     pid = fork do
58       begin
59         ok = false
60         assert_equal(0, kq.kevent(nil, 1, 0.1) { exit!(false) })
61         ok = true
62       ensure
63         exit!(ok)
64       end
65     end
66     assert_equal(0, kq.kevent(nil, 1, 0.1) { exit!(false) })
67     _, status = Process.waitpid2(pid)
68     assert status.success?, status.inspect
69   ensure
70     kq.close
71   end
73   def test_epoll_nest
74     kq1 = Kqueue.new
75     kq2 = Kqueue.new
76     r1, w1 = IO.pipe
77     r2, w2 = IO.pipe
78     w1.write '.'
79     w2.write '.'
80     kq1.kevent([
81        Kevent[r1.fileno, EvFilt::READ, Ev::ADD, 0, 0, r1],
82        Kevent[w1.fileno, EvFilt::WRITE, Ev::ADD, 0, 0, w1]
83     ])
84     kq2.kevent([
85        Kevent[r2.fileno, EvFilt::READ, Ev::ADD, 0, 0, r2],
86        Kevent[w2.fileno, EvFilt::WRITE, Ev::ADD, 0, 0, w2]
87     ])
88     outer = []
89     inner = []
90     nr = 0
91     kq1.kevent(nil, 2) do |kev1|
92       outer << kev1.udata
93       kq2.kevent(nil, 2) do |kev2|
94         (inner[nr] ||= []) << kev2.udata
95       end
96       nr += 1
97     end
98     assert_equal [ r1, w1 ].sort_by(&:fileno), outer.sort_by(&:fileno)
99     exp = [ r2, w2 ].sort_by(&:fileno)
100     assert_equal [ exp, exp ], inner.map { |x| x.sort_by(&:fileno) }
101   ensure
102     [ r1, w1, r2, w2, kq1, kq2 ].compact.each(&:close)
103   end
104 end if defined?(SleepyPenguin::Kqueue)