1 # -*- encoding: binary -*-
8 module LibReadWriteTest
9 RANDOM_BLOB = File.open("/dev/urandom") { |fp| fp.read(10 * 1024 * 1024) }
12 assert_nothing_raised do
13 @rd.close unless @rd.closed?
14 @wr.close unless @wr.closed?
16 assert_nothing_raised do
17 Kgio.wait_readable = Kgio.wait_writable = nil
22 assert_equal "", @rd.kgio_read(0)
24 assert_equal buf.object_id, @rd.kgio_read(0, buf).object_id
29 assert_equal "", @rd.kgio_tryread(0)
31 assert_equal buf.object_id, @rd.kgio_tryread(0, buf).object_id
37 assert_nil @rd.kgio_read(5)
40 def test_read_bang_eof
44 assert false, "should never get here (line:#{__LINE__})"
46 assert_equal [], e.backtrace
52 assert_nil @rd.kgio_tryread(5)
58 loop { @wr.kgio_write "HI" }
59 rescue Errno::EPIPE, Errno::ECONNRESET => e
60 assert_equal [], e.backtrace
63 assert false, "should never get here (line:#{__LINE__})"
66 def test_trywrite_closed
69 loop { @wr.kgio_trywrite "HI" }
70 rescue Errno::EPIPE, Errno::ECONNRESET => e
71 assert_equal [], e.backtrace
74 assert false, "should never get here (line:#{__LINE__})"
77 def test_trywrite_full
78 buf = "\302\251" * 1024 * 1024
80 dig = Digest::SHA1.new
85 dig.update(@rd.readpartial(4096, buf2))
96 rv = @wr.kgio_trywrite(wr)
100 when Kgio::WaitReadable
101 assert false, "should never get here line=#{__LINE__}"
102 when Kgio::WaitWritable
103 IO.select(nil, [ @wr ])
111 assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value
115 assert_equal nil, @wr.kgio_write(10)
116 assert_equal "10", @rd.kgio_read(2)
119 def test_trywrite_conv
120 assert_equal nil, @wr.kgio_trywrite(10)
121 assert_equal "10", @rd.kgio_tryread(2)
124 def test_tryread_empty
125 assert_equal Kgio::WaitReadable, @rd.kgio_tryread(1)
128 def test_read_too_much
129 assert_equal nil, @wr.kgio_write("hi")
130 assert_equal "hi", @rd.kgio_read(4)
133 def test_tryread_too_much
134 assert_equal nil, @wr.kgio_trywrite("hi")
135 assert_equal "hi", @rd.kgio_tryread(4)
139 assert_equal nil, @wr.kgio_write("hi")
140 assert_equal "h", @rd.kgio_read(1)
141 assert_equal "i", @rd.kgio_read(1)
144 def test_tryread_short
145 assert_equal nil, @wr.kgio_trywrite("hi")
146 assert_equal "h", @rd.kgio_tryread(1)
147 assert_equal "i", @rd.kgio_tryread(1)
150 def test_read_extra_buf
152 tmp_object_id = tmp.object_id
153 assert_equal nil, @wr.kgio_write("hi")
154 rv = @rd.kgio_read(2, tmp)
155 assert_equal "hi", rv
156 assert_equal rv.object_id, tmp.object_id
157 assert_equal tmp_object_id, rv.object_id
160 def test_trywrite_return_wait_writable
162 tmp << @wr.kgio_trywrite("HI") until tmp[-1] == Kgio::WaitWritable
163 assert Kgio::WaitWritable === tmp[-1]
164 assert(!(Kgio::WaitReadable === tmp[-1]))
165 assert_equal Kgio::WaitWritable, tmp.pop
167 penultimate = tmp.pop
168 assert(penultimate == "I" || penultimate == nil)
170 tmp.each { |count| assert_equal nil, count }
173 def test_tryread_extra_buf_eagain_clears_buffer
175 rv = @rd.kgio_tryread(2, tmp)
176 assert_equal Kgio::WaitReadable, rv
180 def test_tryread_extra_buf_eof_clears_buffer
183 assert_nil @rd.kgio_tryread(2, tmp)
187 def test_monster_trywrite
188 buf = RANDOM_BLOB.dup
189 rv = @wr.kgio_trywrite(buf)
190 assert_kind_of String, rv
191 assert rv.size < buf.size
193 assert_equal(buf, @rd.read(buf.size - rv.size) + rv)
196 def test_monster_write
197 buf = RANDOM_BLOB.dup
198 thr = Thread.new { @wr.kgio_write(buf) }
200 readed = @rd.read(buf.size)
203 assert_equal buf, readed
206 def test_monster_write_wait_writable
207 @wr.instance_variable_set :@nr, 0
208 def @wr.wait_writable
210 IO.select(nil, [self])
212 Kgio.wait_writable = :wait_writable
213 buf = "." * 1024 * 1024 * 10
214 thr = Thread.new { @wr.kgio_write(buf) }
215 readed = @rd.read(buf.size)
218 assert_equal buf, readed
219 assert @wr.instance_variable_get(:@nr) > 0
222 def test_wait_readable_ruby_default
223 assert_nothing_raised { Kgio.wait_readable = nil }
227 thr = Thread.new { sleep 1; @wr.write "HELLO" }
228 assert_nothing_raised do
229 foo = @rd.kgio_read(5)
230 elapsed = Time.now - t0
232 assert elapsed >= 1.0, "elapsed: #{elapsed}"
233 assert_equal "HELLO", foo
235 assert_equal 5, thr.value
238 def test_wait_writable_ruby_default
242 nr += @wr.write_nonblock(buf)
246 assert_nothing_raised { Kgio.wait_writable = nil }
250 thr = Thread.new { sleep 1; @rd.readpartial(nr) }
251 assert_nothing_raised do
252 foo = @wr.kgio_write("HELLO")
253 elapsed = Time.now - t0
257 assert elapsed >= 1.0, "elapsed: #{elapsed}"
259 assert(String === foo || foo == nil)
260 assert_kind_of String, thr.value
263 def test_wait_readable_method
265 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
267 assert_nothing_raised { Kgio.wait_readable = :moo }
270 foo = @rd.kgio_read(5)
272 rescue RuntimeError => e
273 assert_equal("Hello", e.message)
275 assert_equal "HI", @rd.instance_variable_get(:@z)
279 def test_tryread_wait_readable_method
283 assert_nothing_raised { Kgio.wait_readable = :moo }
284 assert_equal Kgio::WaitReadable, @rd.kgio_tryread(5)
287 def test_trywrite_wait_readable_method
291 assert_nothing_raised { Kgio.wait_writable = :moo }
294 10000.times { tmp << @wr.kgio_trywrite(buf) }
295 assert_equal Kgio::WaitWritable, tmp.pop
298 def test_wait_writable_method
300 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
302 assert_nothing_raised { Kgio.wait_writable = :moo }
305 loop { n << @wr.kgio_write("HIHIHIHIHIHI") }
307 rescue RuntimeError => e
308 assert_equal("Hello", e.message)
311 assert_equal "HI", @wr.instance_variable_get(:@z)