6 module LibReadWriteTest
7 RANDOM_BLOB = File.open("/dev/urandom") { |fp| fp.read(10 * 1024 * 1024) }
10 assert_nothing_raised do
11 @rd.close unless @rd.closed?
12 @wr.close unless @wr.closed?
14 assert_nothing_raised do
15 Kgio.wait_readable = Kgio.wait_writable = nil
21 assert_nil @rd.kgio_read(5)
24 def test_read_bang_eof
28 assert false, "should never get here (line:#{__LINE__})"
30 assert_equal [], e.backtrace
36 assert_nil @rd.kgio_tryread(5)
42 loop { @wr.kgio_write "HI" }
43 rescue Errno::EPIPE, Errno::ECONNRESET => e
44 assert_equal [], e.backtrace
47 assert false, "should never get here (line:#{__LINE__})"
50 def test_trywrite_closed
53 loop { @wr.kgio_trywrite "HI" }
54 rescue Errno::EPIPE, Errno::ECONNRESET => e
55 assert_equal [], e.backtrace
58 assert false, "should never get here (line:#{__LINE__})"
62 assert_equal nil, @wr.kgio_write(10)
63 assert_equal "10", @rd.kgio_read(2)
66 def test_trywrite_conv
67 assert_equal nil, @wr.kgio_trywrite(10)
68 assert_equal "10", @rd.kgio_tryread(2)
71 def test_tryread_empty
72 assert_equal Kgio::WaitReadable, @rd.kgio_tryread(1)
75 def test_read_too_much
76 assert_equal nil, @wr.kgio_write("hi")
77 assert_equal "hi", @rd.kgio_read(4)
80 def test_tryread_too_much
81 assert_equal nil, @wr.kgio_trywrite("hi")
82 assert_equal "hi", @rd.kgio_tryread(4)
86 assert_equal nil, @wr.kgio_write("hi")
87 assert_equal "h", @rd.kgio_read(1)
88 assert_equal "i", @rd.kgio_read(1)
91 def test_tryread_short
92 assert_equal nil, @wr.kgio_trywrite("hi")
93 assert_equal "h", @rd.kgio_tryread(1)
94 assert_equal "i", @rd.kgio_tryread(1)
97 def test_read_extra_buf
99 tmp_object_id = tmp.object_id
100 assert_equal nil, @wr.kgio_write("hi")
101 rv = @rd.kgio_read(2, tmp)
102 assert_equal "hi", rv
103 assert_equal rv.object_id, tmp.object_id
104 assert_equal tmp_object_id, rv.object_id
107 def test_trywrite_return_wait_writable
109 tmp << @wr.kgio_trywrite("HI") until tmp[-1] == Kgio::WaitWritable
110 assert_equal Kgio::WaitWritable, tmp.pop
112 penultimate = tmp.pop
113 assert(penultimate == "I" || penultimate == nil)
115 tmp.each { |count| assert_equal nil, count }
118 def test_tryread_extra_buf_eagain_clears_buffer
120 rv = @rd.kgio_tryread(2, tmp)
121 assert_equal Kgio::WaitReadable, rv
125 def test_tryread_extra_buf_eof_clears_buffer
128 assert_nil @rd.kgio_tryread(2, tmp)
132 def test_monster_trywrite
133 buf = RANDOM_BLOB.dup
134 rv = @wr.kgio_trywrite(buf)
135 assert_kind_of String, rv
136 assert rv.size < buf.size
138 assert_equal(buf, @rd.read(buf.size - rv.size) + rv)
141 def test_monster_write
142 buf = RANDOM_BLOB.dup
143 thr = Thread.new { @wr.kgio_write(buf) }
145 readed = @rd.read(buf.size)
148 assert_equal buf, readed
151 def test_monster_write_wait_writable
152 @wr.instance_variable_set :@nr, 0
153 def @wr.wait_writable
155 IO.select(nil, [self])
157 Kgio.wait_writable = :wait_writable
158 buf = "." * 1024 * 1024 * 10
159 thr = Thread.new { @wr.kgio_write(buf) }
160 readed = @rd.read(buf.size)
163 assert_equal buf, readed
164 assert @wr.instance_variable_get(:@nr) > 0
167 def test_wait_readable_ruby_default
168 assert_nothing_raised { Kgio.wait_readable = nil }
172 thr = Thread.new { sleep 1; @wr.write "HELLO" }
173 assert_nothing_raised do
174 foo = @rd.kgio_read(5)
175 elapsed = Time.now - t0
177 assert elapsed >= 1.0, "elapsed: #{elapsed}"
178 assert_equal "HELLO", foo
180 assert_equal 5, thr.value
183 def test_wait_writable_ruby_default
187 nr += @wr.write_nonblock(buf)
191 assert_nothing_raised { Kgio.wait_writable = nil }
195 thr = Thread.new { sleep 1; @rd.readpartial(nr) }
196 assert_nothing_raised do
197 foo = @wr.kgio_write("HELLO")
198 elapsed = Time.now - t0
202 assert elapsed >= 1.0, "elapsed: #{elapsed}"
204 assert(String === foo || foo == nil)
205 assert_kind_of String, thr.value
208 def test_wait_readable_method
210 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
212 assert_nothing_raised { Kgio.wait_readable = :moo }
215 foo = @rd.kgio_read(5)
217 rescue RuntimeError => e
218 assert_equal("Hello", e.message)
220 assert_equal "HI", @rd.instance_variable_get(:@z)
224 def test_tryread_wait_readable_method
228 assert_nothing_raised { Kgio.wait_readable = :moo }
229 assert_equal Kgio::WaitReadable, @rd.kgio_tryread(5)
232 def test_trywrite_wait_readable_method
236 assert_nothing_raised { Kgio.wait_writable = :moo }
239 10000.times { tmp << @wr.kgio_trywrite(buf) }
240 assert_equal Kgio::WaitWritable, tmp.pop
243 def test_wait_writable_method
245 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
247 assert_nothing_raised { Kgio.wait_writable = :moo }
250 loop { n << @wr.kgio_write("HIHIHIHIHIHI") }
252 rescue RuntimeError => e
253 assert_equal("Hello", e.message)
256 assert_equal "HI", @wr.instance_variable_get(:@z)