1 # -*- encoding: binary -*-
9 module LibReadWriteTest
10 RANDOM_BLOB = File.open("/dev/urandom") do |fp|
13 # get roughly a 20MB block of random data
14 (buf * (20 * 1024 * 1024 / nr)) + (buf * rand(123))
18 @rd.close if defined?(@rd) && ! @rd.closed?
19 @wr.close if defined?(@wr) && ! @wr.closed?
20 FileUtils.remove_entry_secure(@tmpdir) if defined?(@tmpdir)
24 assert_nil @wr.kgio_write("")
27 def test_trywrite_empty
28 assert_nil @wr.kgio_trywrite("")
32 assert_nil @wr.kgio_writev([])
35 def test_trywritev_empty
36 assert_nil @wr.kgio_trywritev([])
40 assert_equal "", @rd.kgio_read(0)
42 assert_equal buf.object_id, @rd.kgio_read(0, buf).object_id
50 assert_equal "a", @rd.kgio_read(0x1000, a)
52 assert_equal "." * 0x1000, b
55 def test_read_shared_2
59 assert_equal "a", @rd.kgio_read(0x1000, b)
61 assert_equal "." * 0x1000, a
65 assert_equal "", @rd.kgio_tryread(0)
67 assert_equal buf.object_id, @rd.kgio_tryread(0, buf).object_id
71 def test_tryread_shared
75 IO.select([@rd]) # this seems needed on FreeBSD 9.0
76 assert_equal "a", @rd.kgio_tryread(0x1000, b)
78 assert_equal "." * 0x1000, a
81 def test_tryread_shared_2
85 IO.select([@rd]) # this seems needed on FreeBSD 9.0
86 assert_equal "a", @rd.kgio_tryread(0x1000, a)
88 assert_equal "." * 0x1000, b
93 assert_nil @rd.kgio_read(5)
96 def test_read_bang_eof
100 assert false, "should never get here (line:#{__LINE__})"
102 assert_equal [], e.backtrace
108 IO.select([@rd]) # this seems needed on FreeBSD 9.0
109 assert_nil @rd.kgio_tryread(5)
112 def test_write_closed
115 loop { @wr.kgio_write "HI" }
116 rescue Errno::EPIPE, Errno::ECONNRESET => e
117 assert_equal [], e.backtrace
120 assert false, "should never get here (line:#{__LINE__})"
123 def test_trywrite_closed
126 loop { @wr.kgio_trywrite "HI" }
127 rescue Errno::EPIPE, Errno::ECONNRESET => e
128 assert_equal [], e.backtrace
131 assert false, "should never get here (line:#{__LINE__})"
134 def test_writev_closed
137 loop { @wr.kgio_writev ["HI"] }
138 rescue Errno::EPIPE, Errno::ECONNRESET => e
139 assert_equal [], e.backtrace
142 assert false, "should never get here (line:#{__LINE__})"
145 def test_trywritev_closed
148 loop { @wr.kgio_trywritev ["HI"] }
149 rescue Errno::EPIPE, Errno::ECONNRESET => e
150 assert_equal [], e.backtrace
153 assert false, "should never get here (line:#{__LINE__})"
156 def test_trywrite_full
157 buf = "\302\251" * 1024 * 1024
159 dig = Digest::SHA1.new
164 dig.update(@rd.readpartial(4096, buf2))
169 warn "#{e.message} (#{e.class})"
176 rv = @wr.kgio_trywrite(wr)
181 assert false, "should never get here line=#{__LINE__}"
183 IO.select(nil, [ @wr ])
191 assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value
194 def test_trywritev_full
195 buf = ["\302\251" * 128] * 8 * 1024
197 dig = Digest::SHA1.new
202 dig.update(@rd.readpartial(4096, buf2))
207 warn "#{e.message} (#{e.class})"
214 rv = @wr.kgio_trywritev(wr)
219 assert false, "should never get here line=#{__LINE__}"
221 IO.select(nil, [ @wr ])
229 assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value
233 assert_equal nil, @wr.kgio_write(10)
234 assert_equal "10", @rd.kgio_read(2)
237 def test_trywrite_conv
238 assert_equal nil, @wr.kgio_trywrite(10)
239 IO.select([@rd]) # this seems needed on FreeBSD 9.0
240 assert_equal "10", @rd.kgio_tryread(2)
243 def test_tryread_empty
244 assert_equal :wait_readable, @rd.kgio_tryread(1)
247 def test_read_too_much
248 assert_equal nil, @wr.kgio_write("hi")
249 assert_equal "hi", @rd.kgio_read(4)
252 def test_tryread_too_much
253 assert_equal nil, @wr.kgio_trywrite("hi")
254 assert_equal @rd, @rd.kgio_wait_readable
255 assert_equal "hi", @rd.kgio_tryread(4)
259 assert_equal nil, @wr.kgio_write("hi")
260 assert_equal "h", @rd.kgio_read(1)
261 assert_equal "i", @rd.kgio_read(1)
264 def test_tryread_short
265 assert_equal nil, @wr.kgio_trywrite("hi")
266 IO.select([@rd]) # this seems needed on FreeBSD 9.0
267 assert_equal "h", @rd.kgio_tryread(1)
268 assert_equal "i", @rd.kgio_tryread(1)
271 def test_read_extra_buf
273 tmp_object_id = tmp.object_id
274 assert_equal nil, @wr.kgio_write("hi")
275 rv = @rd.kgio_read(2, tmp)
276 assert_equal "hi", rv
277 assert_equal rv.object_id, tmp.object_id
278 assert_equal tmp_object_id, rv.object_id
281 def test_trywrite_return_wait_writable
283 tmp << @wr.kgio_trywrite("HI") until tmp[-1] == :wait_writable
284 assert :wait_writable === tmp[-1]
285 assert(!(:wait_readable === tmp[-1]))
286 assert_equal :wait_writable, tmp.pop
288 penultimate = tmp.pop
289 assert(penultimate == "I" || penultimate == nil)
291 tmp.each { |count| assert_equal nil, count }
294 def test_trywritev_return_wait_writable
296 tmp << @wr.kgio_trywritev(["HI"]) until tmp[-1] == :wait_writable
297 assert :wait_writable === tmp[-1]
298 assert(!(:wait_readable === tmp[-1]))
299 assert_equal :wait_writable, tmp.pop
301 penultimate = tmp.pop
302 assert(penultimate == ["I"] || penultimate == nil,
303 "penultimate is #{penultimate.inspect}")
305 tmp.each { |count| assert_equal nil, count }
308 def test_tryread_extra_buf_eagain_clears_buffer
310 rv = @rd.kgio_tryread(2, tmp)
311 assert_equal :wait_readable, rv
315 def test_tryread_extra_buf_eof_clears_buffer
318 IO.select([@rd]) # this seems needed on FreeBSD 9.0
319 assert_nil @rd.kgio_tryread(2, tmp)
323 def test_monster_trywrite
324 buf = RANDOM_BLOB.dup
325 rv = @wr.kgio_trywrite(buf)
326 assert_kind_of String, rv
327 assert rv.size < buf.size
329 assert_equal(buf, @rd.read(buf.size - rv.size) + rv)
332 def test_monster_write
333 buf = RANDOM_BLOB.dup
334 thr = Thread.new { @wr.kgio_write(buf) }
336 readed = @rd.read(buf.size)
339 assert_equal buf, readed
342 def test_monster_trywritev
344 while start < RANDOM_BLOB.size
345 s = RANDOM_BLOB[start, 1000]
349 rv = @wr.kgio_trywritev(buf)
350 assert_kind_of Array, rv
352 assert rv.size < RANDOM_BLOB.size
354 assert_equal(RANDOM_BLOB, @rd.read(RANDOM_BLOB.size - rv.size) + rv)
357 def test_monster_writev
359 while start < RANDOM_BLOB.size
360 s = RANDOM_BLOB[start, 10000]
364 thr = Thread.new { @wr.kgio_writev(buf) }
366 readed = @rd.read(RANDOM_BLOB.size)
369 e = (RANDOM_BLOB == readed)
373 def test_monster_write_wait_writable
374 @wr.instance_variable_set :@nr, 0
375 def @wr.kgio_wait_writable
377 IO.select(nil, [self])
380 thr = Thread.new { @wr.kgio_write(buf) }
381 Thread.pass until thr.stop?
382 readed = @rd.read(buf.size)
385 assert_equal buf, readed
386 assert @wr.instance_variable_get(:@nr) > 0
389 def test_monster_writev_wait_writable
390 @wr.instance_variable_set :@nr, 0
391 def @wr.kgio_wait_writable
393 IO.select(nil, [self])
395 buf = [ RANDOM_BLOB, RANDOM_BLOB ]
396 buf_size = buf.inject(0){|c, s| c + s.size}
397 thr = Thread.new { @wr.kgio_writev(buf) }
398 Thread.pass until thr.stop?
399 readed = @rd.read(buf_size)
402 e = (buf.join == readed)
404 assert @wr.instance_variable_get(:@nr) > 0
407 def test_wait_readable_ruby_default
411 thr = Thread.new { sleep 1; @wr.write "HELLO" }
412 foo = @rd.kgio_read(5)
413 elapsed = Time.now - t0
414 assert elapsed >= 1.0, "elapsed: #{elapsed}"
415 assert_equal "HELLO", foo
417 assert_equal 5, thr.value
420 def test_wait_writable_ruby_default
424 nr += @wr.write_nonblock(buf)
431 thr = Thread.new { sleep 1; @rd.read(nr) }
432 foo = @wr.kgio_write("HELLO")
433 elapsed = Time.now - t0
437 assert elapsed >= 1.0, "elapsed: #{elapsed}"
439 assert(String === foo || foo == nil)
440 assert_kind_of String, thr.value
443 def test_wait_readable_method
444 def @rd.kgio_wait_readable
445 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
449 foo = @rd.kgio_read(5)
451 rescue RuntimeError => e
452 assert_equal("Hello", e.message)
454 assert_equal "HI", @rd.instance_variable_get(:@z)
458 def test_tryread_wait_readable_method
459 def @rd.kgio_wait_readable
462 assert_equal :wait_readable, @rd.kgio_tryread(5)
465 def test_trywrite_wait_readable_method
466 def @wr.kgio_wait_writable
471 until rv == :wait_writable
472 rv = @wr.kgio_trywrite(buf)
474 assert_equal :wait_writable, rv
477 def test_wait_writable_method
478 def @wr.kgio_wait_writable
479 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
483 loop { n << @wr.kgio_write("HIHIHIHIHIHI") }
485 rescue RuntimeError => e
486 assert_equal("Hello", e.message)
489 assert_equal "HI", @wr.instance_variable_get(:@z)