140 lines
3.5 KiB
Ruby
140 lines
3.5 KiB
Ruby
|
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
|