about summary refs log tree commit homepage
path: root/test
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2010-09-23 22:56:44 +0000
committerEric Wong <e@yhbt.net>2010-09-25 02:28:32 +0000
commit460e6b025896dee64b39d194d4c1a536129654de (patch)
treef38119dbf55b0e0a9f8ebca7acd41860245461a9 /test
downloadkgio-460e6b025896dee64b39d194d4c1a536129654de.tar.gz
everything shou^Wmight be working...
Diffstat (limited to 'test')
-rw-r--r--test/lib_read_write.rb152
-rw-r--r--test/test_pipe_popen.rb14
-rw-r--r--test/test_pipe_read_write.rb9
-rw-r--r--test/test_socketpair_read_write.rb9
-rw-r--r--test/test_tcp_connect.rb56
-rw-r--r--test/test_tcp_server.rb31
-rw-r--r--test/test_unix_connect.rb58
-rw-r--r--test/test_unix_server.rb34
8 files changed, 363 insertions, 0 deletions
diff --git a/test/lib_read_write.rb b/test/lib_read_write.rb
new file mode 100644
index 0000000..7fd24d5
--- /dev/null
+++ b/test/lib_read_write.rb
@@ -0,0 +1,152 @@
+require 'test/unit'
+require 'io/nonblock'
+$-w = true
+require 'kgio'
+
+module LibReadWriteTest
+  def teardown
+    assert_nothing_raised do
+      @rd.close unless @rd.closed?
+      @wr.close unless @wr.closed?
+    end
+    assert_nothing_raised do
+      Kgio.wait_readable = Kgio.wait_writable = nil
+    end
+  end
+
+  def test_read_eof
+    @wr.close
+    assert_raises(EOFError) { @rd.kgio_read 5 }
+  end
+
+  def test_write_closed
+    @rd.close
+    assert_raises(Errno::EPIPE) { @wr.kgio_write "HI" }
+  end
+
+  def test_write_conv
+    assert_equal nil, @wr.kgio_write(10)
+    assert_equal "10", @rd.kgio_read(2)
+  end
+
+  def test_read_empty
+    assert_equal Kgio::WaitReadable, @rd.kgio_read(1)
+  end
+
+  def test_read_too_much
+    assert_equal nil, @wr.kgio_write("hi")
+    assert_equal "hi", @rd.kgio_read(4)
+  end
+
+  def test_read_short
+    assert_equal nil, @wr.kgio_write("hi")
+    assert_equal "h", @rd.kgio_read(1)
+    assert_equal "i", @rd.kgio_read(1)
+  end
+
+  def test_read_extra_buf
+    tmp = ""
+    tmp_object_id = tmp.object_id
+    assert_equal nil, @wr.kgio_write("hi")
+    rv = @rd.kgio_read(2, tmp)
+    assert_equal "hi", rv
+    assert_equal rv.object_id, tmp.object_id
+    assert_equal tmp_object_id, rv.object_id
+  end
+
+  def test_write_return_wait_writable
+    tmp = []
+    tmp << @wr.kgio_write("HI") until tmp[-1] == Kgio::WaitWritable
+    assert_equal Kgio::WaitWritable, tmp.pop
+    assert tmp.size > 0
+    penultimate = tmp.pop
+    assert(penultimate == "I" || penultimate == nil)
+    assert tmp.size > 0
+    tmp.each { |count| assert_equal nil, count }
+  end
+
+  def test_monster_write
+    buf = "." * 1024 * 1024 * 10
+    rv = @wr.kgio_write(buf)
+    assert_kind_of String, rv
+    assert rv.size < buf.size
+    assert_equal(buf, (rv + @rd.read(buf.size - rv.size)))
+  end
+
+  def test_wait_readable_ruby_default
+    def @rd.ruby
+      raise RuntimeError, "Hello"
+    end
+    assert_nothing_raised { Kgio.wait_readable = :ruby }
+    elapsed = 0
+    foo = nil
+    t0 = Time.now
+    thr = Thread.new { sleep 1; @wr.write "HELLO" }
+    assert_nothing_raised do
+      foo = @rd.kgio_read(5)
+      elapsed = Time.now - t0
+    end
+    assert elapsed >= 1.0
+    assert_equal "HELLO", foo
+    thr.join
+    assert_equal 5, thr.value
+  end
+
+  def test_wait_writable_ruby_default
+    def @wr.ruby
+      raise RuntimeError, "Hello"
+    end
+    buf = "." * 512
+    nr = 0
+    begin
+      nr += @wr.write_nonblock(buf)
+    rescue Errno::EAGAIN
+      break
+    end while true
+    assert_nothing_raised { Kgio.wait_writable = :ruby }
+    elapsed = 0
+    foo = nil
+    t0 = Time.now
+    thr = Thread.new { sleep 1; @rd.readpartial(nr) }
+    assert_nothing_raised do
+      foo = @wr.kgio_write("HELLO")
+      elapsed = Time.now - t0
+    end
+    assert_nil foo
+    assert elapsed >= 1.0
+    assert(String === foo || foo == nil)
+    assert_kind_of String, thr.value
+  end
+
+  def test_wait_readable_method
+    def @rd.moo
+      defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
+    end
+    assert_nothing_raised { Kgio.wait_readable = :moo }
+    foo = nil
+    begin
+      foo = @rd.kgio_read(5)
+      assert false
+    rescue RuntimeError => e
+      assert_equal("Hello", e.message)
+    end
+    assert_equal "HI", @rd.instance_variable_get(:@z)
+    assert_nil foo
+  end
+
+  def test_wait_writable_method
+    def @wr.moo
+      defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
+    end
+    assert_nothing_raised { Kgio.wait_writable = :moo }
+    n = []
+    begin
+      loop { n << @wr.kgio_write("HIHIHIHIHIHI") }
+      assert false
+    rescue RuntimeError => e
+      assert_equal("Hello", e.message)
+    end
+    assert n.size > 0
+    assert_equal "HI", @wr.instance_variable_get(:@z)
+  end
+end
diff --git a/test/test_pipe_popen.rb b/test/test_pipe_popen.rb
new file mode 100644
index 0000000..af72032
--- /dev/null
+++ b/test/test_pipe_popen.rb
@@ -0,0 +1,14 @@
+require 'test/unit'
+require 'io/nonblock'
+$-w = true
+require 'kgio'
+
+class TestPipePopen < Test::Unit::TestCase
+  def test_popen
+    io = Kgio::Pipe.popen("sleep 1 && echo HI")
+    assert_equal Kgio::WaitReadable, io.kgio_read(2)
+    sleep 1.5
+    assert_equal "HI\n", io.kgio_read(3)
+    assert_raises(EOFError) { io.kgio_read 5 }
+  end
+end
diff --git a/test/test_pipe_read_write.rb b/test/test_pipe_read_write.rb
new file mode 100644
index 0000000..a200aeb
--- /dev/null
+++ b/test/test_pipe_read_write.rb
@@ -0,0 +1,9 @@
+require './test/lib_read_write.rb'
+
+class TestKgioPipe < Test::Unit::TestCase
+  def setup
+    @rd, @wr = Kgio::Pipe.new
+  end
+
+  include LibReadWriteTest
+end
diff --git a/test/test_socketpair_read_write.rb b/test/test_socketpair_read_write.rb
new file mode 100644
index 0000000..611313a
--- /dev/null
+++ b/test/test_socketpair_read_write.rb
@@ -0,0 +1,9 @@
+require './test/lib_read_write.rb'
+
+class TestKgioUNIXSocketPair < Test::Unit::TestCase
+  def setup
+    @rd, @wr = Kgio::UNIXSocket.pair
+  end
+
+  include LibReadWriteTest
+end
diff --git a/test/test_tcp_connect.rb b/test/test_tcp_connect.rb
new file mode 100644
index 0000000..028f852
--- /dev/null
+++ b/test/test_tcp_connect.rb
@@ -0,0 +1,56 @@
+require 'test/unit'
+require 'io/nonblock'
+$-w = true
+require 'kgio'
+
+class SubSocket < Kgio::Socket
+  attr_accessor :foo
+  def wait_writable
+    @foo = "waited"
+  end
+end
+
+class TestKgioTcpConnect < Test::Unit::TestCase
+
+  def setup
+    @host = ENV["TEST_HOST"] || '127.0.0.1'
+    @srv = Kgio::TCPServer.new(@host, 0)
+    @port = @srv.addr[1]
+    @addr = Socket.pack_sockaddr_in(@port, @host)
+  end
+
+  def teardown
+    @srv.close unless @srv.closed?
+    Kgio.accept_cloexec = true
+    Kgio.accept_nonblock = false
+    Kgio.wait_readable = Kgio.wait_writable = nil
+  end
+
+  def test_new
+    sock = Kgio::Socket.new(@addr)
+    assert_kind_of Kgio::Socket, sock
+    ready = IO.select(nil, [ sock ])
+    assert_equal sock, ready[1][0]
+    assert_equal nil, sock.kgio_write("HELLO")
+  end
+
+  def test_tcp_socket_new_invalid
+    assert_raises(ArgumentError) { Kgio::TCPSocket.new('example.com', 80) }
+    assert_raises(ArgumentError) { Kgio::TCPSocket.new('999.999.999.999', 80) }
+  end
+
+  def test_tcp_socket_new
+    sock = Kgio::TCPSocket.new(@host, @port)
+    assert_instance_of Kgio::TCPSocket, sock
+    ready = IO.select(nil, [ sock ])
+    assert_equal sock, ready[1][0]
+    assert_equal nil, sock.kgio_write("HELLO")
+  end
+
+  def test_wait_writable_set
+    Kgio::wait_writable = :wait_writable
+    sock = SubSocket.new(@addr)
+    assert_equal "waited", sock.foo
+    assert_equal nil, sock.kgio_write("HELLO")
+  end
+end
diff --git a/test/test_tcp_server.rb b/test/test_tcp_server.rb
new file mode 100644
index 0000000..c2bb518
--- /dev/null
+++ b/test/test_tcp_server.rb
@@ -0,0 +1,31 @@
+require 'test/unit'
+require 'io/nonblock'
+$-w = true
+require 'kgio'
+
+class TestKgioTCPServer < Test::Unit::TestCase
+
+  def setup
+    @host = ENV["TEST_HOST"] || '127.0.0.1'
+    @srv = Kgio::TCPServer.new(@host, 0)
+    @port = @srv.addr[1]
+  end
+
+  def teardown
+    @srv.close unless @srv.closed?
+    Kgio.accept_cloexec = true
+    Kgio.accept_nonblock = false
+  end
+
+  def test_accept
+    a = TCPSocket.new(@host, @port)
+    b = @srv.kgio_accept
+    assert_kind_of Kgio::Socket, b
+    assert_equal @host, b.kgio_addr
+  end
+
+  def test_accept_nonblock
+    @srv.nonblock = true
+    assert_equal nil, @srv.kgio_accept
+  end
+end
diff --git a/test/test_unix_connect.rb b/test/test_unix_connect.rb
new file mode 100644
index 0000000..458149d
--- /dev/null
+++ b/test/test_unix_connect.rb
@@ -0,0 +1,58 @@
+require 'test/unit'
+require 'io/nonblock'
+$-w = true
+require 'kgio'
+require 'tempfile'
+
+class SubSocket < Kgio::Socket
+  attr_accessor :foo
+  def wait_writable
+    @foo = "waited"
+  end
+end
+
+class TestKgioUnixConnect < Test::Unit::TestCase
+
+  def setup
+    tmp = Tempfile.new('kgio_unix')
+    @path = tmp.path
+    File.unlink(@path)
+    tmp.close rescue nil
+    @srv = Kgio::UNIXServer.new(@path)
+    @addr = Socket.pack_sockaddr_un(@path)
+  end
+
+  def teardown
+    @srv.close unless @srv.closed?
+    File.unlink(@path)
+    Kgio.accept_cloexec = true
+  end
+
+  def test_unix_socket_new_invalid
+    assert_raises(ArgumentError) { Kgio::UNIXSocket.new('*' * 1024 * 1024) }
+  end
+
+  def test_unix_socket_new
+    sock = Kgio::UNIXSocket.new(@path)
+    assert_instance_of Kgio::UNIXSocket, sock
+    ready = IO.select(nil, [ sock ])
+    assert_equal sock, ready[1][0]
+    assert_equal nil, sock.kgio_write("HELLO")
+  end
+
+  def test_new
+    sock = Kgio::Socket.new(@addr)
+    assert_instance_of Kgio::Socket, sock
+    ready = IO.select(nil, [ sock ])
+    assert_equal sock, ready[1][0]
+    assert_equal nil, sock.kgio_write("HELLO")
+  end
+
+  def test_wait_writable_set
+    Kgio::wait_writable = :wait_writable
+    sock = SubSocket.new(@addr)
+    assert_kind_of Kgio::Socket, sock
+    assert_instance_of SubSocket, sock
+    assert_equal nil, sock.kgio_write("HELLO")
+  end
+end
diff --git a/test/test_unix_server.rb b/test/test_unix_server.rb
new file mode 100644
index 0000000..91b91b8
--- /dev/null
+++ b/test/test_unix_server.rb
@@ -0,0 +1,34 @@
+require 'test/unit'
+require 'io/nonblock'
+$-w = true
+require 'kgio'
+require 'tempfile'
+
+class TestKgioUNIXServer < Test::Unit::TestCase
+
+  def setup
+    tmp = Tempfile.new('kgio_unix')
+    @path = tmp.path
+    File.unlink(@path)
+    tmp.close rescue nil
+    @srv = Kgio::UNIXServer.new(@path)
+  end
+
+  def teardown
+    @srv.close unless @srv.closed?
+    File.unlink(@path)
+    Kgio.accept_cloexec = true
+  end
+
+  def test_accept
+    a = UNIXSocket.new(@path)
+    b = @srv.kgio_accept
+    assert_kind_of Kgio::Socket, b
+    assert_equal "127.0.0.1", b.kgio_addr
+  end
+
+  def test_accept_nonblock
+    @srv.nonblock = true
+    assert_equal nil, @srv.kgio_accept
+  end
+end