Permalink
Fetching contributors…
Cannot retrieve contributors at this time
140 lines (118 sloc) 3.47 KB
require 'em_test_helper'
class TestPure < Test::Unit::TestCase
def setup
@port = next_port
end
# These tests are intended to exercise problems that come up in the
# pure-Ruby implementation. However, we DON'T constrain them such that
# they only run in pure-Ruby. These tests need to work identically in
# any implementation.
#-------------------------------------
# The EM reactor needs to run down open connections and release other resources
# when it stops running. Make sure this happens even if user code throws a Ruby
# exception.
# If exception handling is incorrect, the second test will fail with a no-bind error
# because the TCP server opened in the first test will not have been closed.
def test_exception_handling_releases_resources
exception = Class.new(StandardError)
2.times do
assert_raises(exception) do
EM.run do
EM.start_server "127.0.0.1", @port
raise exception
end
end
end
end
# Under some circumstances, the pure Ruby library would emit an Errno::ECONNREFUSED
# exception on certain kinds of TCP connect-errors.
# It's always been something of an open question whether EM should throw an exception
# in these cases but the defined answer has always been to catch it the unbind method.
# With a connect failure, the latter will always fire, but connection_completed will
# never fire. So even though the point is arguable, it's incorrect for the pure Ruby
# version to throw an exception.
module TestConnrefused
def unbind
EM.stop
end
def connection_completed
raise "should never get here"
end
end
def test_connrefused
assert_nothing_raised do
EM.run {
setup_timeout(2)
EM.connect "127.0.0.1", @port, TestConnrefused
}
end
end
# Make sure connection_completed gets called as expected with TCP clients. This is the
# opposite of test_connrefused.
# If the test fails, it will hang because EM.stop never gets called.
#
module TestConnaccepted
def connection_completed
EM.stop
end
end
def test_connaccepted
assert_nothing_raised do
EM.run {
EM.start_server "127.0.0.1", @port
EM.connect "127.0.0.1", @port, TestConnaccepted
setup_timeout(1)
}
end
end
def test_reactor_running
a = false
EM.run {
a = EM.reactor_running?
EM.next_tick {EM.stop}
}
assert a
end
module TLSServer
def post_init
start_tls
end
def ssl_handshake_completed
$server_handshake_completed = true
end
def receive_data(data)
$server_received_data = data
send_data(data)
end
end
module TLSClient
def post_init
start_tls
end
def ssl_handshake_completed
$client_handshake_completed = true
end
def connection_completed
send_data('Hello World!')
end
def receive_data(data)
$client_received_data = data
close_connection
end
def unbind
EM.stop_event_loop
end
end
def test_start_tls
$client_handshake_completed, $server_handshake_completed = false, false
$client_received_data, $server_received_data = nil, nil
EM.run do
EM.start_server("127.0.0.1", 16789, TLSServer)
EM.connect("127.0.0.1", 16789, TLSClient)
end
assert($client_handshake_completed)
assert($server_handshake_completed)
assert($client_received_data == "Hello World!")
assert($server_received_data == "Hello World!")
end
end