1 # -*- encoding: binary -*-
9 module LibReadWriteTest
10 RANDOM_BLOB = File.open("/dev/urandom") { |fp| fp.read(10 * 1024 * 1024) }
13 @rd.close if defined?(@rd) && ! @rd.closed?
14 @wr.close if defined?(@wr) && ! @wr.closed?
15 FileUtils.remove_entry_secure(@tmpdir) if defined?(@tmpdir)
19 assert_nil @wr.kgio_write("")
22 def test_trywrite_empty
23 assert_nil @wr.kgio_trywrite("")
27 assert_nil @wr.kgio_writev([])
30 def test_trywritev_empty
31 assert_nil @wr.kgio_trywritev([])
35 assert_equal "", @rd.kgio_read(0)
37 assert_equal buf.object_id, @rd.kgio_read(0, buf).object_id
45 assert_equal "a", @rd.kgio_read(0x1000, a)
47 assert_equal "." * 0x1000, b
50 def test_read_shared_2
54 assert_equal "a", @rd.kgio_read(0x1000, b)
56 assert_equal "." * 0x1000, a
60 assert_equal "", @rd.kgio_tryread(0)
62 assert_equal buf.object_id, @rd.kgio_tryread(0, buf).object_id
66 def test_tryread_shared
70 IO.select([@rd]) # this seems needed on FreeBSD 9.0
71 assert_equal "a", @rd.kgio_tryread(0x1000, b)
73 assert_equal "." * 0x1000, a
76 def test_tryread_shared_2
80 IO.select([@rd]) # this seems needed on FreeBSD 9.0
81 assert_equal "a", @rd.kgio_tryread(0x1000, a)
83 assert_equal "." * 0x1000, b
88 assert_nil @rd.kgio_read(5)
91 def test_read_bang_eof
95 assert false, "should never get here (line:#{__LINE__})"
97 assert_equal [], e.backtrace
103 IO.select([@rd]) # this seems needed on FreeBSD 9.0
104 assert_nil @rd.kgio_tryread(5)
107 def test_write_closed
110 loop { @wr.kgio_write "HI" }
111 rescue Errno::EPIPE, Errno::ECONNRESET => e
112 assert_equal [], e.backtrace
115 assert false, "should never get here (line:#{__LINE__})"
118 def test_trywrite_closed
121 loop { @wr.kgio_trywrite "HI" }
122 rescue Errno::EPIPE, Errno::ECONNRESET => e
123 assert_equal [], e.backtrace
126 assert false, "should never get here (line:#{__LINE__})"
129 def test_writev_closed
132 loop { @wr.kgio_writev ["HI"] }
133 rescue Errno::EPIPE, Errno::ECONNRESET => e
134 assert_equal [], e.backtrace
137 assert false, "should never get here (line:#{__LINE__})"
140 def test_trywritev_closed
143 loop { @wr.kgio_trywritev ["HI"] }
144 rescue Errno::EPIPE, Errno::ECONNRESET => e
145 assert_equal [], e.backtrace
148 assert false, "should never get here (line:#{__LINE__})"
151 def test_trywrite_full
152 buf = "\302\251" * 1024 * 1024
154 dig = Digest::SHA1.new
159 dig.update(@rd.readpartial(4096, buf2))
170 rv = @wr.kgio_trywrite(wr)
175 assert false, "should never get here line=#{__LINE__}"
177 IO.select(nil, [ @wr ])
185 assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value
188 def test_trywritev_full
189 buf = ["\302\251" * 128] * 8 * 1024
191 dig = Digest::SHA1.new
196 dig.update(@rd.readpartial(4096, buf2))
207 rv = @wr.kgio_trywritev(wr)
212 assert false, "should never get here line=#{__LINE__}"
214 IO.select(nil, [ @wr ])
222 assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value
226 assert_equal nil, @wr.kgio_write(10)
227 assert_equal "10", @rd.kgio_read(2)
230 def test_trywrite_conv
231 assert_equal nil, @wr.kgio_trywrite(10)
232 IO.select([@rd]) # this seems needed on FreeBSD 9.0
233 assert_equal "10", @rd.kgio_tryread(2)
236 def test_tryread_empty
237 assert_equal :wait_readable, @rd.kgio_tryread(1)
240 def test_read_too_much
241 assert_equal nil, @wr.kgio_write("hi")
242 assert_equal "hi", @rd.kgio_read(4)
245 def test_tryread_too_much
246 assert_equal nil, @wr.kgio_trywrite("hi")
247 assert_equal @rd, @rd.kgio_wait_readable
248 assert_equal "hi", @rd.kgio_tryread(4)
252 assert_equal nil, @wr.kgio_write("hi")
253 assert_equal "h", @rd.kgio_read(1)
254 assert_equal "i", @rd.kgio_read(1)
257 def test_tryread_short
258 assert_equal nil, @wr.kgio_trywrite("hi")
259 IO.select([@rd]) # this seems needed on FreeBSD 9.0
260 assert_equal "h", @rd.kgio_tryread(1)
261 assert_equal "i", @rd.kgio_tryread(1)
264 def test_read_extra_buf
266 tmp_object_id = tmp.object_id
267 assert_equal nil, @wr.kgio_write("hi")
268 rv = @rd.kgio_read(2, tmp)
269 assert_equal "hi", rv
270 assert_equal rv.object_id, tmp.object_id
271 assert_equal tmp_object_id, rv.object_id
274 def test_trywrite_return_wait_writable
276 tmp << @wr.kgio_trywrite("HI") until tmp[-1] == :wait_writable
277 assert :wait_writable === tmp[-1]
278 assert(!(:wait_readable === tmp[-1]))
279 assert_equal :wait_writable, tmp.pop
281 penultimate = tmp.pop
282 assert(penultimate == "I" || penultimate == nil)
284 tmp.each { |count| assert_equal nil, count }
287 def test_trywritev_return_wait_writable
289 tmp << @wr.kgio_trywritev(["HI"]) until tmp[-1] == :wait_writable
290 assert :wait_writable === tmp[-1]
291 assert(!(:wait_readable === tmp[-1]))
292 assert_equal :wait_writable, tmp.pop
294 penultimate = tmp.pop
295 assert(penultimate == ["I"] || penultimate == nil,
296 "penultimate is #{penultimate.inspect}")
298 tmp.each { |count| assert_equal nil, count }
301 def test_tryread_extra_buf_eagain_clears_buffer
303 rv = @rd.kgio_tryread(2, tmp)
304 assert_equal :wait_readable, rv
308 def test_tryread_extra_buf_eof_clears_buffer
311 IO.select([@rd]) # this seems needed on FreeBSD 9.0
312 assert_nil @rd.kgio_tryread(2, tmp)
316 def test_monster_trywrite
317 buf = RANDOM_BLOB.dup
318 rv = @wr.kgio_trywrite(buf)
319 assert_kind_of String, rv
320 assert rv.size < buf.size
322 assert_equal(buf, @rd.read(buf.size - rv.size) + rv)
325 def test_monster_write
326 buf = RANDOM_BLOB.dup
327 thr = Thread.new { @wr.kgio_write(buf) }
329 readed = @rd.read(buf.size)
332 assert_equal buf, readed
335 def test_monster_trywritev
337 while start < RANDOM_BLOB.size
338 s = RANDOM_BLOB[start, 1000]
342 rv = @wr.kgio_trywritev(buf)
343 assert_kind_of Array, rv
345 assert rv.size < RANDOM_BLOB.size
347 assert_equal(RANDOM_BLOB, @rd.read(RANDOM_BLOB.size - rv.size) + rv)
350 def test_monster_writev
352 while start < RANDOM_BLOB.size
353 s = RANDOM_BLOB[start, 10000]
357 thr = Thread.new { @wr.kgio_writev(buf) }
359 readed = @rd.read(RANDOM_BLOB.size)
362 e = (RANDOM_BLOB == readed)
366 def test_monster_write_wait_writable
367 @wr.instance_variable_set :@nr, 0
368 def @wr.kgio_wait_writable
370 IO.select(nil, [self])
372 buf = "." * 1024 * 1024 * 10
373 thr = Thread.new { @wr.kgio_write(buf) }
374 Thread.pass until thr.stop?
375 readed = @rd.read(buf.size)
378 assert_equal buf, readed
379 assert @wr.instance_variable_get(:@nr) > 0
382 def test_monster_writev_wait_writable
383 @wr.instance_variable_set :@nr, 0
384 def @wr.kgio_wait_writable
386 IO.select(nil, [self])
388 buf = ["." * 1024] * 1024 * 10
389 buf_size = buf.inject(0){|c, s| c + s.size}
390 thr = Thread.new { @wr.kgio_writev(buf) }
391 Thread.pass until thr.stop?
392 readed = @rd.read(buf_size)
395 e = (buf.join == readed)
397 assert @wr.instance_variable_get(:@nr) > 0
400 def test_wait_readable_ruby_default
404 thr = Thread.new { sleep 1; @wr.write "HELLO" }
405 foo = @rd.kgio_read(5)
406 elapsed = Time.now - t0
407 assert elapsed >= 1.0, "elapsed: #{elapsed}"
408 assert_equal "HELLO", foo
410 assert_equal 5, thr.value
413 def test_wait_writable_ruby_default
417 nr += @wr.write_nonblock(buf)
424 thr = Thread.new { sleep 1; @rd.read(nr) }
425 foo = @wr.kgio_write("HELLO")
426 elapsed = Time.now - t0
430 assert elapsed >= 1.0, "elapsed: #{elapsed}"
432 assert(String === foo || foo == nil)
433 assert_kind_of String, thr.value
436 def test_wait_readable_method
437 def @rd.kgio_wait_readable
438 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
442 foo = @rd.kgio_read(5)
444 rescue RuntimeError => e
445 assert_equal("Hello", e.message)
447 assert_equal "HI", @rd.instance_variable_get(:@z)
451 def test_tryread_wait_readable_method
452 def @rd.kgio_wait_readable
455 assert_equal :wait_readable, @rd.kgio_tryread(5)
458 def test_trywrite_wait_readable_method
459 def @wr.kgio_wait_writable
464 until rv == :wait_writable
465 rv = @wr.kgio_trywrite(buf)
467 assert_equal :wait_writable, rv
470 def test_wait_writable_method
471 def @wr.kgio_wait_writable
472 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
476 loop { n << @wr.kgio_write("HIHIHIHIHIHI") }
478 rescue RuntimeError => e
479 assert_equal("Hello", e.message)
482 assert_equal "HI", @wr.instance_variable_get(:@z)