112 lines
3.0 KiB
Ruby
112 lines
3.0 KiB
Ruby
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
|
require 'stringio'
|
|
|
|
class CompositeReadIOTest < Faraday::TestCase
|
|
Part = Struct.new(:to_io) do
|
|
def length() to_io.string.length end
|
|
end
|
|
|
|
def part(str)
|
|
Part.new StringIO.new(str)
|
|
end
|
|
|
|
def composite_io(*parts)
|
|
Faraday::CompositeReadIO.new(*parts)
|
|
end
|
|
|
|
def test_empty
|
|
io = composite_io
|
|
assert_equal 0, io.length
|
|
assert_equal "", io.read
|
|
end
|
|
|
|
def test_empty_returns_nil_for_limited_read
|
|
assert_nil composite_io.read(1)
|
|
end
|
|
|
|
def test_empty_parts_returns_nil_for_limited_read
|
|
io = composite_io(part(""), part(""))
|
|
assert_nil io.read(1)
|
|
end
|
|
|
|
def test_multipart_read_all
|
|
io = composite_io(part("abcd"), part("1234"))
|
|
assert_equal 8, io.length
|
|
assert_equal "abcd1234", io.read
|
|
end
|
|
|
|
def test_multipart_read_limited
|
|
io = composite_io(part("abcd"), part("1234"))
|
|
assert_equal "abc", io.read(3)
|
|
assert_equal "d12", io.read(3)
|
|
assert_equal "34", io.read(3)
|
|
assert_equal nil, io.read(3)
|
|
assert_equal nil, io.read(3)
|
|
end
|
|
|
|
def test_multipart_read_limited_size_larger_than_part
|
|
io = composite_io(part("abcd"), part("1234"))
|
|
assert_equal "abcd12", io.read(6)
|
|
assert_equal "34", io.read(6)
|
|
assert_equal nil, io.read(6)
|
|
end
|
|
|
|
def test_multipart_read_with_blank_parts
|
|
io = composite_io(part(""), part("abcd"), part(""), part("1234"), part(""))
|
|
assert_equal "abcd12", io.read(6)
|
|
assert_equal "34", io.read(6)
|
|
assert_equal nil, io.read(6)
|
|
end
|
|
|
|
def test_multipart_rewind
|
|
io = composite_io(part("abcd"), part("1234"))
|
|
assert_equal "abc", io.read(3)
|
|
assert_equal "d12", io.read(3)
|
|
io.rewind
|
|
assert_equal "abc", io.read(3)
|
|
assert_equal "d1234", io.read(5)
|
|
assert_equal nil, io.read(3)
|
|
io.rewind
|
|
assert_equal "ab", io.read(2)
|
|
end
|
|
|
|
# JRuby enforces types to copy_stream to be String or IO
|
|
if IO.respond_to?(:copy_stream) && !jruby?
|
|
def test_compatible_with_copy_stream
|
|
target_io = StringIO.new
|
|
def target_io.ensure_open_and_writable
|
|
# Rubinius compatibility
|
|
end
|
|
io = composite_io(part("abcd"), part("1234"))
|
|
|
|
Faraday::Timer.timeout(1) do
|
|
IO.copy_stream(io, target_io)
|
|
end
|
|
assert_equal "abcd1234", target_io.string
|
|
end
|
|
end
|
|
|
|
unless RUBY_VERSION < '1.9'
|
|
def test_read_from_multibyte
|
|
File.open(File.dirname(__FILE__) + '/multibyte.txt') do |utf8|
|
|
io = composite_io(part("\x86"), Part.new(utf8))
|
|
assert_equal bin("\x86\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\n"), io.read
|
|
end
|
|
end
|
|
|
|
def test_limited_from_multibyte
|
|
File.open(File.dirname(__FILE__) + '/multibyte.txt') do |utf8|
|
|
io = composite_io(part("\x86"), Part.new(utf8))
|
|
assert_equal bin("\x86\xE3\x83"), io.read(3)
|
|
assert_equal bin("\x95\xE3\x82"), io.read(3)
|
|
assert_equal bin("\xA1\xE3\x82\xA4\xE3\x83\xAB\n"), io.read(8)
|
|
end
|
|
end
|
|
end
|
|
|
|
def bin(str)
|
|
str.force_encoding("BINARY") if str.respond_to?(:force_encoding)
|
|
str
|
|
end
|
|
end
|