143 lines
3.4 KiB
Ruby
143 lines
3.4 KiB
Ruby
require 'em_test_helper'
|
|
|
|
|
|
class TestEpoll < Test::Unit::TestCase
|
|
|
|
module TestEchoServer
|
|
def receive_data data
|
|
send_data data
|
|
close_connection_after_writing
|
|
end
|
|
end
|
|
|
|
module TestEchoClient
|
|
def connection_completed
|
|
send_data "ABCDE"
|
|
$max += 1
|
|
end
|
|
def receive_data data
|
|
raise "bad response" unless data == "ABCDE"
|
|
end
|
|
def unbind
|
|
$n -= 1
|
|
EM.stop if $n == 0
|
|
end
|
|
end
|
|
|
|
|
|
# We can set the rlimit/nofile of a process but we can only set it
|
|
# higher if we're running as root.
|
|
# On most systems, the default value is 1024.
|
|
def test_rlimit
|
|
omit_if(windows? || jruby?)
|
|
unless EM.set_descriptor_table_size >= 1024
|
|
a = EM.set_descriptor_table_size
|
|
assert( a <= 1024 )
|
|
a = EM.set_descriptor_table_size( 1024 )
|
|
assert( a == 1024 )
|
|
end
|
|
end
|
|
|
|
# Run a high-volume version of this test by kicking the number of connections
|
|
# up past 512. (Each connection uses two sockets, a client and a server.)
|
|
# (Will require running the test as root)
|
|
# This test exercises TCP clients and servers.
|
|
#
|
|
# XXX this test causes all sort of weird issues on OSX (when run as part of the suite)
|
|
def _test_descriptors
|
|
EM.epoll
|
|
EM.set_descriptor_table_size 60000
|
|
EM.run {
|
|
EM.start_server "127.0.0.1", 9800, TestEchoServer
|
|
$n = 0
|
|
$max = 0
|
|
100.times {
|
|
EM.connect("127.0.0.1", 9800, TestEchoClient) {$n += 1}
|
|
}
|
|
}
|
|
assert_equal(0, $n)
|
|
assert_equal(100, $max)
|
|
end
|
|
|
|
def setup
|
|
@port = next_port
|
|
end
|
|
|
|
module TestDatagramServer
|
|
def receive_data dgm
|
|
$in = dgm
|
|
send_data "abcdefghij"
|
|
end
|
|
end
|
|
module TestDatagramClient
|
|
def initialize port
|
|
@port = port
|
|
end
|
|
|
|
def post_init
|
|
send_datagram "1234567890", "127.0.0.1", @port
|
|
end
|
|
|
|
def receive_data dgm
|
|
$out = dgm
|
|
EM.stop
|
|
end
|
|
end
|
|
|
|
def test_datagrams
|
|
$in = $out = ""
|
|
EM.run {
|
|
EM.open_datagram_socket "127.0.0.1", @port, TestDatagramServer
|
|
EM.open_datagram_socket "127.0.0.1", 0, TestDatagramClient, @port
|
|
}
|
|
assert_equal( "1234567890", $in )
|
|
assert_equal( "abcdefghij", $out )
|
|
end
|
|
|
|
# XXX this test fails randomly...
|
|
def _test_unix_domain
|
|
fn = "/tmp/xxx.chain"
|
|
EM.epoll
|
|
EM.set_descriptor_table_size 60000
|
|
EM.run {
|
|
# The pure-Ruby version won't let us open the socket if the node already exists.
|
|
# Not sure, that actually may be correct and the compiled version is wrong.
|
|
# Pure Ruby also oddly won't let us make that many connections. This test used
|
|
# to run 100 times. Not sure where that lower connection-limit is coming from in
|
|
# pure Ruby.
|
|
# Let's not sweat the Unix-ness of the filename, since this test can't possibly
|
|
# work on Windows anyway.
|
|
#
|
|
File.unlink(fn) if File.exist?(fn)
|
|
EM.start_unix_domain_server fn, TestEchoServer
|
|
$n = 0
|
|
$max = 0
|
|
50.times {
|
|
EM.connect_unix_domain(fn, TestEchoClient) {$n += 1}
|
|
}
|
|
EM::add_timer(1) { $stderr.puts("test_unix_domain timed out!"); EM::stop }
|
|
}
|
|
assert_equal(0, $n)
|
|
assert_equal(50, $max)
|
|
ensure
|
|
File.unlink(fn) if File.exist?(fn)
|
|
end
|
|
|
|
def test_attach_detach
|
|
EM.epoll
|
|
EM.run {
|
|
EM.add_timer(0.01) { EM.stop }
|
|
|
|
r, _ = IO.pipe
|
|
|
|
# This tests a regression where detach in the same tick as attach crashes EM
|
|
EM.watch(r) do |connection|
|
|
connection.detach
|
|
end
|
|
}
|
|
|
|
assert true
|
|
end
|
|
end
|
|
|