This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user