diff options
author | Eric Wong <e@yhbt.net> | 2010-09-23 22:56:44 +0000 |
---|---|---|
committer | Eric Wong <e@yhbt.net> | 2010-09-25 02:28:32 +0000 |
commit | 460e6b025896dee64b39d194d4c1a536129654de (patch) | |
tree | f38119dbf55b0e0a9f8ebca7acd41860245461a9 /test | |
download | kgio-460e6b025896dee64b39d194d4c1a536129654de.tar.gz |
everything shou^Wmight be working...
Diffstat (limited to 'test')
-rw-r--r-- | test/lib_read_write.rb | 152 | ||||
-rw-r--r-- | test/test_pipe_popen.rb | 14 | ||||
-rw-r--r-- | test/test_pipe_read_write.rb | 9 | ||||
-rw-r--r-- | test/test_socketpair_read_write.rb | 9 | ||||
-rw-r--r-- | test/test_tcp_connect.rb | 56 | ||||
-rw-r--r-- | test/test_tcp_server.rb | 31 | ||||
-rw-r--r-- | test/test_unix_connect.rb | 58 | ||||
-rw-r--r-- | test/test_unix_server.rb | 34 |
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 |