1 # -*- encoding: binary -*-
8 module LibReadWriteTest
9 RANDOM_BLOB = File.open("/dev/urandom") { |fp| fp.read(10 * 1024 * 1024) }
12 @rd.close if defined?(@rd) && ! @rd.closed?
13 @wr.close if defined?(@wr) && ! @wr.closed?
17 assert_nil @wr.kgio_write("")
20 def test_trywrite_empty
21 assert_nil @wr.kgio_trywrite("")
25 assert_nil @wr.kgio_writev([])
28 def test_trywritev_empty
29 assert_nil @wr.kgio_trywritev([])
33 assert_equal "", @rd.kgio_read(0)
35 assert_equal buf.object_id, @rd.kgio_read(0, buf).object_id
43 assert_equal "a", @rd.kgio_read(0x1000, a)
45 assert_equal "." * 0x1000, b
48 def test_read_shared_2
52 assert_equal "a", @rd.kgio_read(0x1000, b)
54 assert_equal "." * 0x1000, a
58 assert_equal "", @rd.kgio_tryread(0)
60 assert_equal buf.object_id, @rd.kgio_tryread(0, buf).object_id
64 def test_tryread_shared
68 IO.select([@rd]) # this seems needed on FreeBSD 9.0
69 assert_equal "a", @rd.kgio_tryread(0x1000, b)
71 assert_equal "." * 0x1000, a
74 def test_tryread_shared_2
78 IO.select([@rd]) # this seems needed on FreeBSD 9.0
79 assert_equal "a", @rd.kgio_tryread(0x1000, a)
81 assert_equal "." * 0x1000, b
86 assert_nil @rd.kgio_read(5)
89 def test_read_bang_eof
93 assert false, "should never get here (line:#{__LINE__})"
95 assert_equal [], e.backtrace
101 IO.select([@rd]) # this seems needed on FreeBSD 9.0
102 assert_nil @rd.kgio_tryread(5)
105 def test_write_closed
108 loop { @wr.kgio_write "HI" }
109 rescue Errno::EPIPE, Errno::ECONNRESET => e
110 assert_equal [], e.backtrace
113 assert false, "should never get here (line:#{__LINE__})"
116 def test_trywrite_closed
119 loop { @wr.kgio_trywrite "HI" }
120 rescue Errno::EPIPE, Errno::ECONNRESET => e
121 assert_equal [], e.backtrace
124 assert false, "should never get here (line:#{__LINE__})"
127 def test_writev_closed
130 loop { @wr.kgio_writev ["HI"] }
131 rescue Errno::EPIPE, Errno::ECONNRESET => e
132 assert_equal [], e.backtrace
135 assert false, "should never get here (line:#{__LINE__})"
138 def test_trywritev_closed
141 loop { @wr.kgio_trywritev ["HI"] }
142 rescue Errno::EPIPE, Errno::ECONNRESET => e
143 assert_equal [], e.backtrace
146 assert false, "should never get here (line:#{__LINE__})"
149 def test_trywrite_full
150 buf = "\302\251" * 1024 * 1024
152 dig = Digest::SHA1.new
157 dig.update(@rd.readpartial(4096, buf2))
168 rv = @wr.kgio_trywrite(wr)
173 assert false, "should never get here line=#{__LINE__}"
175 IO.select(nil, [ @wr ])
183 assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value
186 def test_trywritev_full
187 buf = ["\302\251" * 128] * 8 * 1024
189 dig = Digest::SHA1.new
194 dig.update(@rd.readpartial(4096, buf2))
205 rv = @wr.kgio_trywritev(wr)
210 assert false, "should never get here line=#{__LINE__}"
212 IO.select(nil, [ @wr ])
220 assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value
224 assert_equal nil, @wr.kgio_write(10)
225 assert_equal "10", @rd.kgio_read(2)
228 def test_trywrite_conv
229 assert_equal nil, @wr.kgio_trywrite(10)
230 IO.select([@rd]) # this seems needed on FreeBSD 9.0
231 assert_equal "10", @rd.kgio_tryread(2)
234 def test_tryread_empty
235 assert_equal :wait_readable, @rd.kgio_tryread(1)
238 def test_read_too_much
239 assert_equal nil, @wr.kgio_write("hi")
240 assert_equal "hi", @rd.kgio_read(4)
243 def test_tryread_too_much
244 assert_equal nil, @wr.kgio_trywrite("hi")
245 assert_equal @rd, @rd.kgio_wait_readable
246 assert_equal "hi", @rd.kgio_tryread(4)
250 assert_equal nil, @wr.kgio_write("hi")
251 assert_equal "h", @rd.kgio_read(1)
252 assert_equal "i", @rd.kgio_read(1)
255 def test_tryread_short
256 assert_equal nil, @wr.kgio_trywrite("hi")
257 IO.select([@rd]) # this seems needed on FreeBSD 9.0
258 assert_equal "h", @rd.kgio_tryread(1)
259 assert_equal "i", @rd.kgio_tryread(1)
262 def test_read_extra_buf
264 tmp_object_id = tmp.object_id
265 assert_equal nil, @wr.kgio_write("hi")
266 rv = @rd.kgio_read(2, tmp)
267 assert_equal "hi", rv
268 assert_equal rv.object_id, tmp.object_id
269 assert_equal tmp_object_id, rv.object_id
272 def test_trywrite_return_wait_writable
274 tmp << @wr.kgio_trywrite("HI") until tmp[-1] == :wait_writable
275 assert :wait_writable === tmp[-1]
276 assert(!(:wait_readable === tmp[-1]))
277 assert_equal :wait_writable, tmp.pop
279 penultimate = tmp.pop
280 assert(penultimate == "I" || penultimate == nil)
282 tmp.each { |count| assert_equal nil, count }
285 def test_trywritev_return_wait_writable
287 tmp << @wr.kgio_trywritev(["HI"]) until tmp[-1] == :wait_writable
288 assert :wait_writable === tmp[-1]
289 assert(!(:wait_readable === tmp[-1]))
290 assert_equal :wait_writable, tmp.pop
292 penultimate = tmp.pop
293 assert(penultimate == "I" || penultimate == nil)
295 tmp.each { |count| assert_equal nil, count }
298 def test_tryread_extra_buf_eagain_clears_buffer
300 rv = @rd.kgio_tryread(2, tmp)
301 assert_equal :wait_readable, rv
305 def test_tryread_extra_buf_eof_clears_buffer
308 IO.select([@rd]) # this seems needed on FreeBSD 9.0
309 assert_nil @rd.kgio_tryread(2, tmp)
313 def test_monster_trywrite
314 buf = RANDOM_BLOB.dup
315 rv = @wr.kgio_trywrite(buf)
316 assert_kind_of String, rv
317 assert rv.size < buf.size
319 assert_equal(buf, @rd.read(buf.size - rv.size) + rv)
322 def test_monster_write
323 buf = RANDOM_BLOB.dup
324 thr = Thread.new { @wr.kgio_write(buf) }
326 readed = @rd.read(buf.size)
329 assert_equal buf, readed
332 def test_monster_trywritev
334 while start < RANDOM_BLOB.size
335 s = RANDOM_BLOB[start, 1000]
339 rv = @wr.kgio_trywritev(buf)
340 assert_kind_of Array, rv
342 assert rv.size < RANDOM_BLOB.size
344 assert_equal(RANDOM_BLOB, @rd.read(RANDOM_BLOB.size - rv.size) + rv)
347 def test_monster_writev
349 while start < RANDOM_BLOB.size
350 s = RANDOM_BLOB[start, 10000]
354 thr = Thread.new { @wr.kgio_writev(buf) }
356 readed = @rd.read(RANDOM_BLOB.size)
359 e = (RANDOM_BLOB == readed)
363 def test_monster_write_wait_writable
364 @wr.instance_variable_set :@nr, 0
365 def @wr.kgio_wait_writable
367 IO.select(nil, [self])
369 buf = "." * 1024 * 1024 * 10
370 thr = Thread.new { @wr.kgio_write(buf) }
371 Thread.pass until thr.stop?
372 readed = @rd.read(buf.size)
375 assert_equal buf, readed
376 assert @wr.instance_variable_get(:@nr) > 0
379 def test_monster_writev_wait_writable
380 @wr.instance_variable_set :@nr, 0
381 def @wr.kgio_wait_writable
383 IO.select(nil, [self])
385 buf = ["." * 1024] * 1024 * 10
386 buf_size = buf.inject(0){|c, s| c + s.size}
387 thr = Thread.new { @wr.kgio_writev(buf) }
388 Thread.pass until thr.stop?
389 readed = @rd.read(buf_size)
392 e = (buf.join == readed)
394 assert @wr.instance_variable_get(:@nr) > 0
397 def test_wait_readable_ruby_default
401 thr = Thread.new { sleep 1; @wr.write "HELLO" }
402 foo = @rd.kgio_read(5)
403 elapsed = Time.now - t0
404 assert elapsed >= 1.0, "elapsed: #{elapsed}"
405 assert_equal "HELLO", foo
407 assert_equal 5, thr.value
410 def test_wait_writable_ruby_default
414 nr += @wr.write_nonblock(buf)
421 thr = Thread.new { sleep 1; @rd.read(nr) }
422 foo = @wr.kgio_write("HELLO")
423 elapsed = Time.now - t0
427 assert elapsed >= 1.0, "elapsed: #{elapsed}"
429 assert(String === foo || foo == nil)
430 assert_kind_of String, thr.value
433 def test_wait_readable_method
434 def @rd.kgio_wait_readable
435 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
439 foo = @rd.kgio_read(5)
441 rescue RuntimeError => e
442 assert_equal("Hello", e.message)
444 assert_equal "HI", @rd.instance_variable_get(:@z)
448 def test_tryread_wait_readable_method
449 def @rd.kgio_wait_readable
452 assert_equal :wait_readable, @rd.kgio_tryread(5)
455 def test_trywrite_wait_readable_method
456 def @wr.kgio_wait_writable
461 until rv == :wait_writable
462 rv = @wr.kgio_trywrite(buf)
464 assert_equal :wait_writable, rv
467 def test_wait_writable_method
468 def @wr.kgio_wait_writable
469 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
473 loop { n << @wr.kgio_write("HIHIHIHIHIHI") }
475 rescue RuntimeError => e
476 assert_equal("Hello", e.message)
479 assert_equal "HI", @wr.instance_variable_get(:@z)