156 lines
3.4 KiB
Ruby
156 lines
3.4 KiB
Ruby
require 'em_test_helper'
|
|
|
|
class TestLineAndTextProtocol < Test::Unit::TestCase
|
|
|
|
class TLP_LineBuffer < EM::P::LineAndTextProtocol
|
|
attr_reader :line_buffer
|
|
|
|
def initialize
|
|
super
|
|
@line_buffer = []
|
|
end
|
|
|
|
def receive_line line
|
|
@line_buffer << line
|
|
end
|
|
end
|
|
|
|
module StopClient
|
|
def set_receive_data(&blk)
|
|
@rdb = blk
|
|
end
|
|
|
|
def receive_data data
|
|
@rdb.call(data) if @rdb
|
|
end
|
|
|
|
def unbind
|
|
EM.add_timer(0.1) { EM.stop }
|
|
end
|
|
end
|
|
|
|
def setup
|
|
@port = next_port
|
|
end
|
|
|
|
def test_simple_lines
|
|
conn = nil
|
|
EM.run {
|
|
EM.start_server( "127.0.0.1", @port, TLP_LineBuffer ) do |c|
|
|
conn = c
|
|
end
|
|
setup_timeout
|
|
|
|
EM.connect "127.0.0.1", @port, StopClient do |c|
|
|
c.send_data "aaa\nbbb\r\nccc\n"
|
|
c.close_connection_after_writing
|
|
end
|
|
}
|
|
assert_equal( %w(aaa bbb ccc), conn.line_buffer)
|
|
end
|
|
|
|
#--------------------------------------------------------------------
|
|
|
|
class TLP_ErrorMessage < EM::P::LineAndTextProtocol
|
|
attr_reader :error_message
|
|
|
|
def initialize
|
|
super
|
|
@error_message = []
|
|
end
|
|
|
|
def receive_line text
|
|
raise
|
|
end
|
|
|
|
def receive_error text
|
|
@error_message << text
|
|
end
|
|
end
|
|
|
|
def test_overlength_lines
|
|
conn = nil
|
|
EM.run {
|
|
EM.start_server( "127.0.0.1", @port, TLP_ErrorMessage ) do |c|
|
|
conn = c
|
|
end
|
|
setup_timeout
|
|
EM.connect "127.0.0.1", @port, StopClient do |c|
|
|
c.send_data "a" * (16*1024 + 1)
|
|
c.send_data "\n"
|
|
c.close_connection_after_writing
|
|
end
|
|
|
|
}
|
|
assert_equal( ["overlength line"], conn.error_message )
|
|
end
|
|
|
|
|
|
#--------------------------------------------------------------------
|
|
|
|
class LineAndTextTest < EM::P::LineAndTextProtocol
|
|
def receive_line line
|
|
if line =~ /content-length:\s*(\d+)/i
|
|
@content_length = $1.to_i
|
|
elsif line.length == 0
|
|
set_binary_mode @content_length
|
|
end
|
|
end
|
|
def receive_binary_data text
|
|
send_data "received #{text.length} bytes"
|
|
close_connection_after_writing
|
|
end
|
|
end
|
|
|
|
def test_lines_and_text
|
|
output = ''
|
|
EM.run {
|
|
EM.start_server( "127.0.0.1", @port, LineAndTextTest )
|
|
setup_timeout
|
|
|
|
EM.connect "127.0.0.1", @port, StopClient do |c|
|
|
c.set_receive_data { |data| output << data }
|
|
c.send_data "Content-length: 400\n"
|
|
c.send_data "\n"
|
|
c.send_data "A" * 400
|
|
EM.add_timer(0.1) { c.close_connection_after_writing }
|
|
end
|
|
}
|
|
assert_equal( "received 400 bytes", output )
|
|
end
|
|
|
|
#--------------------------------------------------------------------
|
|
|
|
|
|
class BinaryTextTest < EM::P::LineAndTextProtocol
|
|
def receive_line line
|
|
if line =~ /content-length:\s*(\d+)/i
|
|
set_binary_mode $1.to_i
|
|
else
|
|
raise "protocol error"
|
|
end
|
|
end
|
|
def receive_binary_data text
|
|
send_data "received #{text.length} bytes"
|
|
close_connection_after_writing
|
|
end
|
|
end
|
|
|
|
def test_binary_text
|
|
output = ''
|
|
EM.run {
|
|
EM.start_server( "127.0.0.1", @port, BinaryTextTest )
|
|
setup_timeout
|
|
|
|
EM.connect "127.0.0.1", @port, StopClient do |c|
|
|
c.set_receive_data { |data| output << data }
|
|
c.send_data "Content-length: 10000\n"
|
|
c.send_data "A" * 10000
|
|
EM.add_timer(0.1) { c.close_connection_after_writing }
|
|
end
|
|
}
|
|
assert_equal( "received 10000 bytes", output )
|
|
end
|
|
|
|
end
|