108 lines
2.4 KiB
Ruby
108 lines
2.4 KiB
Ruby
require 'em_test_helper'
|
|
|
|
class TestPause < Test::Unit::TestCase
|
|
if EM.respond_to? :pause_connection
|
|
def setup
|
|
@port = next_port
|
|
end
|
|
|
|
def teardown
|
|
assert(!EM.reactor_running?)
|
|
end
|
|
|
|
def test_pause_resume
|
|
server = nil
|
|
|
|
s_rx = c_rx = 0
|
|
|
|
test_server = Module.new do
|
|
define_method :post_init do
|
|
server = self
|
|
end
|
|
|
|
define_method :receive_data do |data|
|
|
s_rx += 1
|
|
|
|
EM.add_periodic_timer(0.01) { send_data 'hi' }
|
|
send_data 'hi'
|
|
|
|
# pause server, now no outgoing data will actually
|
|
# be sent and no more incoming data will be received
|
|
pause
|
|
end
|
|
end
|
|
|
|
test_client = Module.new do
|
|
def post_init
|
|
EM.add_periodic_timer(0.01) do
|
|
send_data 'hello'
|
|
end
|
|
end
|
|
|
|
define_method :receive_data do |data|
|
|
c_rx += 1
|
|
end
|
|
end
|
|
|
|
EM.run do
|
|
EM.start_server "127.0.0.1", @port, test_server
|
|
EM.connect "127.0.0.1", @port, test_client
|
|
|
|
EM.add_timer(0.05) do
|
|
assert_equal 1, s_rx
|
|
assert_equal 0, c_rx
|
|
assert server.paused?
|
|
|
|
# resume server, queued outgoing and incoming data will be flushed
|
|
server.resume
|
|
|
|
assert !server.paused?
|
|
|
|
EM.add_timer(0.05) do
|
|
assert server.paused?
|
|
assert s_rx > 1
|
|
assert c_rx > 0
|
|
EM.stop
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def test_pause_in_receive_data
|
|
incoming = []
|
|
|
|
test_server = Module.new do
|
|
define_method(:receive_data) do |data|
|
|
incoming << data
|
|
pause
|
|
EM.add_timer(0.5){ close_connection }
|
|
end
|
|
define_method(:unbind) do
|
|
EM.stop
|
|
end
|
|
end
|
|
|
|
buf = 'a' * 1024
|
|
|
|
EM.run do
|
|
EM.start_server "127.0.0.1", @port, test_server
|
|
cli = EM.connect "127.0.0.1", @port
|
|
128.times do
|
|
cli.send_data buf
|
|
end
|
|
end
|
|
|
|
assert_equal 1, incoming.size
|
|
assert incoming[0].bytesize > buf.bytesize
|
|
assert incoming[0].bytesize < buf.bytesize * 128
|
|
end
|
|
else
|
|
warn "EM.pause_connection not implemented, skipping tests in #{__FILE__}"
|
|
|
|
# Because some rubies will complain if a TestCase class has no tests
|
|
def test_em_pause_connection_not_implemented
|
|
assert true
|
|
end
|
|
end
|
|
end
|