sleepy_penguin 3.5.2
[sleepy_penguin.git] / test / test_epoll_optimizations.rb
blob15d3da49d124be74c9f3fa744a268e7e58dc910d
1 require_relative 'helper'
2 begin
3   require 'strace'
4 rescue LoadError
5 end
6 $-w = true
8 require 'sleepy_penguin'
10 class TestEpollOptimizations < Test::Unit::TestCase
11   include SleepyPenguin
12   IO_PURGATORY = []
14   def setup
15     @rd, @wr = IO.pipe
16     @ep = Epoll.new
17   end
19   def teardown
20     [ @ep, @rd, @wr ].each { |io| io.close unless io.closed? }
21   end
23   def test_set
24     io, err = Strace.me do
25       @ep.set(@wr, Epoll::OUT)
26       @ep.set(@wr, Epoll::OUT)
27     end
28     assert_nil err
29     lines = io.readlines; io.close
30     assert_equal 1, lines.grep(/^epoll_ctl/).size, lines.inspect
31     assert_match(/EPOLL_CTL_ADD/, lines.grep(/^epoll_ctl/)[0])
33     io, err = Strace.me { @ep.set(@wr, Epoll::OUT | Epoll::ONESHOT) }
34     assert_nil err
35     lines = io.readlines; io.close
36     assert_equal 1, lines.grep(/^epoll_ctl/).size
37     assert_match(/EPOLL_CTL_MOD/, lines.grep(/^epoll_ctl/)[0])
39     io, err = Strace.me { @ep.set(@wr, Epoll::OUT) }
40     assert_nil err
41     lines = io.readlines; io.close
42     assert_equal 1, lines.grep(/^epoll_ctl/).size
43     assert_match(/EPOLL_CTL_MOD/, lines.grep(/^epoll_ctl/)[0])
44     @wr.close
45     @rd.close
47     @rd, @wr = IO.pipe
48     io, err = Strace.me { @ep.set(@wr, Epoll::OUT) }
49     assert_nil err
50     lines = io.readlines; io.close
51     assert_equal 1, lines.grep(/^epoll_ctl/).size
52     assert_match(/EPOLL_CTL_ADD/, lines.grep(/^epoll_ctl/)[0])
53   end
55   def test_delete
56     @ep.set(@wr, Epoll::OUT)
57     rv = true
58     io, err = Strace.me { rv = @ep.delete(@wr) }
59     assert_equal @wr, rv
60     assert_nil err
61     lines = io.readlines; io.close
62     assert_equal 1, lines.grep(/^epoll_ctl/).size
63     assert_match(%r{=\s+0$}, lines.grep(/^epoll_ctl/)[0])
65     rv = true
66     io, err = Strace.me { rv = @ep.delete(@wr) }
67     assert_nil rv
68     assert_nil err
69     lines = io.readlines; io.close
70     assert_equal 0, lines.grep(/^epoll_ctl/).size
71   end
73   def test_delete_closed
74     a = @wr.fileno
75     @ep.set(@wr, Epoll::OUT)
76     @rd.close
77     @wr.close
78     @rd, @wr = IO.pipe
79     assert_equal a, @wr.fileno
80     rv = true
81     io, err = Strace.me { rv = @ep.delete(@wr) }
82     lines = io.readlines; io.close
83     assert_nil err
84     assert_nil rv
85     assert_equal 0, lines.grep(/^epoll_ctl/).size
86   end
88   def test_delete_closed_proxy
89     obj = Struct.new(:to_io).new(@wr)
90     rv = nil
91     @ep.add(obj, Epoll::OUT)
92     @wr.close
93     io, err = Strace.me { rv = @ep.delete(obj) }
94     lines = io.readlines; io.close
95     assert_kind_of IOError, err
96     assert_nil rv
97     assert_equal 0, lines.grep(/^epoll_ctl/).size
98   end
100   def test_delete_aliased_a
101     tmp = IO.for_fd @wr.fileno
102     IO_PURGATORY << tmp
103     @ep.set(tmp, Epoll::OUT)
104     rv = nil
105     io, err = Strace.me { rv = @ep.delete(@wr) }
106     lines = io.readlines; io.close
107     assert_equal @wr, rv
108     assert_nil err
109     assert_equal 1, lines.grep(/^epoll_ctl/).size
110     assert_match %r{=\s+0$}, lines.grep(/^epoll_ctl/)[0]
111     assert_equal 0, lines.grep(/ENOENT/).size
112   end
114   def test_delete_aliased_b
115     tmp = IO.for_fd @wr.fileno
116     IO_PURGATORY << tmp
117     @ep.set(@wr, Epoll::OUT)
118     rv = nil
119     io, err = Strace.me { rv = @ep.delete(tmp) }
120     lines = io.readlines; io.close
121     assert_equal tmp, rv
122     assert_nil err
123     assert_equal 1, lines.grep(/^epoll_ctl/).size
124     assert_match(%r{=\s+0$}, lines.grep(/^epoll_ctl/)[0])
125     assert_equal 0, lines.grep(/ENOENT/).size
126   end
128   def test_delete_aliased_closed
129     tmp = IO.for_fd @wr.fileno
130     IO_PURGATORY << tmp
131     @ep.set(tmp, Epoll::OUT)
132     @wr.close
133     rv = nil
134     io, err = Strace.me { rv = @ep.delete(tmp) }
135     lines = io.readlines; io.close
136     assert_nil rv
137     assert_nil err
138     assert_equal 1, lines.grep(/^epoll_ctl/).size
139     assert_equal 1, lines.grep(/EBADF/).size
140   end
141 end if defined?(Strace)