218 lines
4.8 KiB
Ruby
218 lines
4.8 KiB
Ruby
|
require 'em_test_helper'
|
||
|
require 'tempfile'
|
||
|
|
||
|
class TestSendFile < Test::Unit::TestCase
|
||
|
|
||
|
if EM.respond_to?(:send_file_data)
|
||
|
module TestModule
|
||
|
def initialize filename
|
||
|
@filename = filename
|
||
|
end
|
||
|
|
||
|
def post_init
|
||
|
send_file_data @filename
|
||
|
close_connection_after_writing
|
||
|
end
|
||
|
end
|
||
|
|
||
|
module TestClient
|
||
|
def data_to(&blk)
|
||
|
@data_to = blk
|
||
|
end
|
||
|
|
||
|
def receive_data(data)
|
||
|
@data_to.call(data) if @data_to
|
||
|
end
|
||
|
|
||
|
def unbind
|
||
|
EM.stop
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def setup
|
||
|
@file = Tempfile.new("em_test_file")
|
||
|
@filename = @file.path
|
||
|
@port = next_port
|
||
|
end
|
||
|
|
||
|
def test_send_file
|
||
|
File.open( @filename, "w" ) {|f|
|
||
|
f << ("A" * 5000)
|
||
|
}
|
||
|
|
||
|
data = ''
|
||
|
|
||
|
EM.run {
|
||
|
EM.start_server "127.0.0.1", @port, TestModule, @filename
|
||
|
setup_timeout
|
||
|
|
||
|
EM.connect "127.0.0.1", @port, TestClient do |c|
|
||
|
c.data_to { |d| data << d }
|
||
|
end
|
||
|
}
|
||
|
|
||
|
assert_equal( "A" * 5000, data )
|
||
|
end
|
||
|
|
||
|
# EM::Connection#send_file_data has a strict upper limit on the filesize it will work with.
|
||
|
def test_send_large_file
|
||
|
File.open( @filename, "w" ) {|f|
|
||
|
f << ("A" * 1000000)
|
||
|
}
|
||
|
|
||
|
data = ''
|
||
|
|
||
|
assert_raises(RuntimeError) {
|
||
|
EM.run {
|
||
|
EM.start_server "127.0.0.1", @port, TestModule, @filename
|
||
|
setup_timeout
|
||
|
EM.connect "127.0.0.1", @port, TestClient do |c|
|
||
|
c.data_to { |d| data << d }
|
||
|
end
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
module StreamTestModule
|
||
|
def initialize filename
|
||
|
@filename = filename
|
||
|
end
|
||
|
|
||
|
def post_init
|
||
|
EM::Deferrable.future( stream_file_data(@filename)) {
|
||
|
close_connection_after_writing
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
module ChunkStreamTestModule
|
||
|
def initialize filename
|
||
|
@filename = filename
|
||
|
end
|
||
|
|
||
|
def post_init
|
||
|
EM::Deferrable.future( stream_file_data(@filename, :http_chunks=>true)) {
|
||
|
close_connection_after_writing
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_stream_file_data
|
||
|
File.open( @filename, "w" ) {|f|
|
||
|
f << ("A" * 1000)
|
||
|
}
|
||
|
|
||
|
data = ''
|
||
|
|
||
|
EM.run {
|
||
|
EM.start_server "127.0.0.1", @port, StreamTestModule, @filename
|
||
|
setup_timeout
|
||
|
EM.connect "127.0.0.1", @port, TestClient do |c|
|
||
|
c.data_to { |d| data << d }
|
||
|
end
|
||
|
}
|
||
|
|
||
|
assert_equal( "A" * 1000, data )
|
||
|
end
|
||
|
|
||
|
def test_stream_chunked_file_data
|
||
|
File.open( @filename, "w" ) {|f|
|
||
|
f << ("A" * 1000)
|
||
|
}
|
||
|
|
||
|
data = ''
|
||
|
|
||
|
EM.run {
|
||
|
EM.start_server "127.0.0.1", @port, ChunkStreamTestModule, @filename
|
||
|
setup_timeout
|
||
|
EM.connect "127.0.0.1", @port, TestClient do |c|
|
||
|
c.data_to { |d| data << d }
|
||
|
end
|
||
|
}
|
||
|
|
||
|
assert_equal( "3e8\r\n#{"A" * 1000}\r\n0\r\n\r\n", data )
|
||
|
end
|
||
|
|
||
|
module BadFileTestModule
|
||
|
def initialize filename
|
||
|
@filename = filename
|
||
|
end
|
||
|
|
||
|
def post_init
|
||
|
de = stream_file_data( @filename+".wrong" )
|
||
|
de.errback {|msg|
|
||
|
send_data msg
|
||
|
close_connection_after_writing
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
def test_stream_bad_file
|
||
|
data = ''
|
||
|
EM.run {
|
||
|
EM.start_server "127.0.0.1", @port, BadFileTestModule, @filename
|
||
|
setup_timeout(5)
|
||
|
EM.connect "127.0.0.1", @port, TestClient do |c|
|
||
|
c.data_to { |d| data << d }
|
||
|
end
|
||
|
}
|
||
|
|
||
|
assert_equal( "file not found", data )
|
||
|
end
|
||
|
else
|
||
|
warn "EM.send_file_data not implemented, skipping tests in #{__FILE__}"
|
||
|
|
||
|
# Because some rubies will complain if a TestCase class has no tests
|
||
|
def test_em_send_file_data_not_implemented
|
||
|
assert !EM.respond_to?(:send_file_data)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
begin
|
||
|
require 'fastfilereaderext'
|
||
|
|
||
|
def test_stream_large_file_data
|
||
|
File.open( @filename, "w" ) {|f|
|
||
|
f << ("A" * 10000)
|
||
|
}
|
||
|
|
||
|
data = ''
|
||
|
|
||
|
EM.run {
|
||
|
EM.start_server "127.0.0.1", @port, StreamTestModule, @filename
|
||
|
setup_timeout
|
||
|
EM.connect "127.0.0.1", @port, TestClient do |c|
|
||
|
c.data_to { |d| data << d }
|
||
|
end
|
||
|
}
|
||
|
|
||
|
assert_equal( "A" * 10000, data )
|
||
|
end
|
||
|
|
||
|
def test_stream_large_chunked_file_data
|
||
|
File.open( @filename, "w" ) {|f|
|
||
|
f << ("A" * 100000)
|
||
|
}
|
||
|
|
||
|
data = ''
|
||
|
|
||
|
EM.run {
|
||
|
EM.start_server "127.0.0.1", @port, ChunkStreamTestModule, @filename
|
||
|
setup_timeout
|
||
|
EM.connect "127.0.0.1", @port, TestClient do |c|
|
||
|
c.data_to { |d| data << d }
|
||
|
end
|
||
|
}
|
||
|
|
||
|
expected = [
|
||
|
"4000\r\n#{"A" * 16384}\r\n" * 6,
|
||
|
"6a0\r\n#{"A" * 0x6a0}\r\n",
|
||
|
"0\r\n\r\n"
|
||
|
].join
|
||
|
assert_equal( expected, data )
|
||
|
end
|
||
|
rescue LoadError
|
||
|
warn "require 'fastfilereaderext' failed, skipping tests in #{__FILE__}"
|
||
|
end
|
||
|
|
||
|
end
|