summaryrefslogtreecommitdiff
path: root/jni/ruby/test/io/wait
diff options
context:
space:
mode:
Diffstat (limited to 'jni/ruby/test/io/wait')
-rw-r--r--jni/ruby/test/io/wait/test_io_wait.rb112
1 files changed, 112 insertions, 0 deletions
diff --git a/jni/ruby/test/io/wait/test_io_wait.rb b/jni/ruby/test/io/wait/test_io_wait.rb
new file mode 100644
index 0000000..7729d45
--- /dev/null
+++ b/jni/ruby/test/io/wait/test_io_wait.rb
@@ -0,0 +1,112 @@
+# -*- coding: us-ascii -*-
+require 'test/unit'
+require 'timeout'
+require 'socket'
+begin
+ require 'io/wait'
+rescue LoadError
+end
+
+class TestIOWait < Test::Unit::TestCase
+
+ def setup
+ if /mswin|mingw/ =~ RUBY_PLATFORM
+ @r, @w = Socket.pair(Socket::AF_INET, Socket::SOCK_STREAM, 0)
+ else
+ @r, @w = IO.pipe
+ end
+ end
+
+ def teardown
+ @r.close unless @r.closed?
+ @w.close unless @w.closed?
+ end
+
+ def test_nread
+ assert_equal 0, @r.nread
+ @w.syswrite "."
+ sleep 0.1
+ assert_equal 1, @r.nread
+ end
+
+ def test_nread_buffered
+ @w.syswrite ".\n!"
+ assert_equal ".\n", @r.gets
+ assert_equal 1, @r.nread
+ end
+
+ def test_ready?
+ refute @r.ready?, "shouldn't ready, but ready"
+ @w.syswrite "."
+ sleep 0.1
+ assert @r.ready?, "should ready, but not"
+ end
+
+ def test_buffered_ready?
+ @w.syswrite ".\n!"
+ assert_equal ".\n", @r.gets
+ assert @r.ready?
+ end
+
+ def test_wait
+ assert_nil @r.wait(0)
+ @w.syswrite "."
+ sleep 0.1
+ assert_equal @r, @r.wait(0)
+ end
+
+ def test_wait_buffered
+ @w.syswrite ".\n!"
+ assert_equal ".\n", @r.gets
+ assert_equal true, @r.wait(0)
+ end
+
+ def test_wait_forever
+ th = Thread.new { sleep 0.01; @w.syswrite "." }
+ assert_equal @r, @r.wait
+ ensure
+ th.join
+ end
+
+ def test_wait_eof
+ th = Thread.new { sleep 0.01; @w.close }
+ assert_nil @r.wait
+ ensure
+ th.join
+ end
+
+ def test_wait_writable
+ assert_equal @w, @w.wait_writable
+ end
+
+ def test_wait_writable_timeout
+ assert_equal @w, @w.wait_writable(0.01)
+ written = fill_pipe
+ assert_nil @w.wait_writable(0.01)
+ @r.read(written)
+ assert_equal @w, @w.wait_writable(0.01)
+ end
+
+ def test_wait_writable_EPIPE
+ fill_pipe
+ @r.close
+ assert_equal @w, @w.wait_writable
+ end
+
+ def test_wait_writable_closed
+ @w.close
+ assert_raises(IOError) { @w.wait_writable }
+ end
+
+private
+
+ def fill_pipe
+ written = 0
+ buf = " " * 4096
+ begin
+ written += @w.write_nonblock(buf)
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK
+ return written
+ end while true
+ end
+end if IO.method_defined?(:wait)