1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/net/protocol/test_protocol.rb

123 lines
3.4 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
require "test/unit"
require "net/protocol"
require "stringio"
class TestProtocol < Test::Unit::TestCase
def test_should_properly_dot_stuff_period_with_no_endline
bug9627 = '[ruby-core:61441] [Bug #9627]'
sio = StringIO.new("".dup)
imio = Net::InternetMessageIO.new(sio)
email = "To: bob@aol.com\nlook, a period with no endline\n."
imio.write_message(email)
assert_equal("To: bob@aol.com\r\nlook, a period with no endline\r\n..\r\n.\r\n", sio.string, bug9627)
end
def test_each_crlf_line
assert_output('', '') do
sio = StringIO.new("".dup)
imio = Net::InternetMessageIO.new(sio)
assert_equal(23, imio.write_message("\u3042\r\u3044\n\u3046\r\n\u3048"))
assert_equal("\u3042\r\n\u3044\r\n\u3046\r\n\u3048\r\n.\r\n", sio.string)
sio = StringIO.new("".dup)
imio = Net::InternetMessageIO.new(sio)
assert_equal(8, imio.write_message("\u3042\r"))
assert_equal("\u3042\r\n.\r\n", sio.string)
end
end
def create_mockio(capacity: 100, max: nil)
mockio = Object.new
mockio.instance_variable_set(:@str, +'')
Fix Net::Protocol::BufferedIO#write when sending large multi-byte string This commit should fix Net::Protocol::BufferedIO#write when sending large multi-byte string like following example. ``` $ ruby -rnet/http -rjson -v -e "Net::HTTP.post(URI('http://httpbin.org/post'), { text: 'あ'*100_000 }.to_json, 'Content-Type' => 'application/json')" ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux] Traceback (most recent call last): 19: from -e:1:in `<main>' 18: from lib/ruby/2.6.0/net/http.rb:500:in `post' 17: from lib/ruby/2.6.0/net/http.rb:605:in `start' 16: from lib/ruby/2.6.0/net/http.rb:920:in `start' 15: from lib/ruby/2.6.0/net/http.rb:502:in `block in post' 14: from lib/ruby/2.6.0/net/http.rb:1281:in `post' 13: from lib/ruby/2.6.0/net/http.rb:1493:in `send_entity' 12: from lib/ruby/2.6.0/net/http.rb:1479:in `request' 11: from lib/ruby/2.6.0/net/http.rb:1506:in `transport_request' 10: from lib/ruby/2.6.0/net/http.rb:1506:in `catch' 9: from lib/ruby/2.6.0/net/http.rb:1507:in `block in transport_request' 8: from lib/ruby/2.6.0/net/http/generic_request.rb:123:in `exec' 7: from lib/ruby/2.6.0/net/http/generic_request.rb:189:in `send_request_with_body' 6: from lib/ruby/2.6.0/net/protocol.rb:247:in `write' 5: from lib/ruby/2.6.0/net/protocol.rb:265:in `writing' 4: from lib/ruby/2.6.0/net/protocol.rb:248:in `block in write' 3: from lib/ruby/2.6.0/net/protocol.rb:275:in `write0' 2: from lib/ruby/2.6.0/net/protocol.rb:275:in `each_with_index' 1: from lib/ruby/2.6.0/net/protocol.rb:275:in `each' lib/ruby/2.6.0/net/protocol.rb:280:in `block in write0': undefined method `bytesize' for nil:NilClass (NoMethodError) ``` [Fix GH-2058] From: Eito Katagiri <eitoball@gmail.com> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66582 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-26 23:49:12 -05:00
mockio.instance_variable_set(:@capacity, capacity)
mockio.instance_variable_set(:@max, max)
def mockio.string; @str; end
def mockio.to_io; self; end
def mockio.wait_writable(sec); sleep sec; false; end
def mockio.write_nonblock(*strs, exception: true)
if @capacity <= @str.bytesize
if exception
raise Net::WaitWritable
else
return :wait_writable
end
end
len = 0
max = @max ? [@capacity, @str.bytesize + @max].min : @capacity
strs.each do |str|
len1 = @str.bytesize
break if max <= len1
@str << str.byteslice(0, max - @str.bytesize)
len2 = @str.bytesize
len += len2 - len1
end
len
end
mockio
end
Fix Net::Protocol::BufferedIO#write when sending large multi-byte string This commit should fix Net::Protocol::BufferedIO#write when sending large multi-byte string like following example. ``` $ ruby -rnet/http -rjson -v -e "Net::HTTP.post(URI('http://httpbin.org/post'), { text: 'あ'*100_000 }.to_json, 'Content-Type' => 'application/json')" ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux] Traceback (most recent call last): 19: from -e:1:in `<main>' 18: from lib/ruby/2.6.0/net/http.rb:500:in `post' 17: from lib/ruby/2.6.0/net/http.rb:605:in `start' 16: from lib/ruby/2.6.0/net/http.rb:920:in `start' 15: from lib/ruby/2.6.0/net/http.rb:502:in `block in post' 14: from lib/ruby/2.6.0/net/http.rb:1281:in `post' 13: from lib/ruby/2.6.0/net/http.rb:1493:in `send_entity' 12: from lib/ruby/2.6.0/net/http.rb:1479:in `request' 11: from lib/ruby/2.6.0/net/http.rb:1506:in `transport_request' 10: from lib/ruby/2.6.0/net/http.rb:1506:in `catch' 9: from lib/ruby/2.6.0/net/http.rb:1507:in `block in transport_request' 8: from lib/ruby/2.6.0/net/http/generic_request.rb:123:in `exec' 7: from lib/ruby/2.6.0/net/http/generic_request.rb:189:in `send_request_with_body' 6: from lib/ruby/2.6.0/net/protocol.rb:247:in `write' 5: from lib/ruby/2.6.0/net/protocol.rb:265:in `writing' 4: from lib/ruby/2.6.0/net/protocol.rb:248:in `block in write' 3: from lib/ruby/2.6.0/net/protocol.rb:275:in `write0' 2: from lib/ruby/2.6.0/net/protocol.rb:275:in `each_with_index' 1: from lib/ruby/2.6.0/net/protocol.rb:275:in `each' lib/ruby/2.6.0/net/protocol.rb:280:in `block in write0': undefined method `bytesize' for nil:NilClass (NoMethodError) ``` [Fix GH-2058] From: Eito Katagiri <eitoball@gmail.com> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66582 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-26 23:49:12 -05:00
def test_write0_multibyte
mockio = create_mockio(max: 1)
Fix Net::Protocol::BufferedIO#write when sending large multi-byte string This commit should fix Net::Protocol::BufferedIO#write when sending large multi-byte string like following example. ``` $ ruby -rnet/http -rjson -v -e "Net::HTTP.post(URI('http://httpbin.org/post'), { text: 'あ'*100_000 }.to_json, 'Content-Type' => 'application/json')" ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux] Traceback (most recent call last): 19: from -e:1:in `<main>' 18: from lib/ruby/2.6.0/net/http.rb:500:in `post' 17: from lib/ruby/2.6.0/net/http.rb:605:in `start' 16: from lib/ruby/2.6.0/net/http.rb:920:in `start' 15: from lib/ruby/2.6.0/net/http.rb:502:in `block in post' 14: from lib/ruby/2.6.0/net/http.rb:1281:in `post' 13: from lib/ruby/2.6.0/net/http.rb:1493:in `send_entity' 12: from lib/ruby/2.6.0/net/http.rb:1479:in `request' 11: from lib/ruby/2.6.0/net/http.rb:1506:in `transport_request' 10: from lib/ruby/2.6.0/net/http.rb:1506:in `catch' 9: from lib/ruby/2.6.0/net/http.rb:1507:in `block in transport_request' 8: from lib/ruby/2.6.0/net/http/generic_request.rb:123:in `exec' 7: from lib/ruby/2.6.0/net/http/generic_request.rb:189:in `send_request_with_body' 6: from lib/ruby/2.6.0/net/protocol.rb:247:in `write' 5: from lib/ruby/2.6.0/net/protocol.rb:265:in `writing' 4: from lib/ruby/2.6.0/net/protocol.rb:248:in `block in write' 3: from lib/ruby/2.6.0/net/protocol.rb:275:in `write0' 2: from lib/ruby/2.6.0/net/protocol.rb:275:in `each_with_index' 1: from lib/ruby/2.6.0/net/protocol.rb:275:in `each' lib/ruby/2.6.0/net/protocol.rb:280:in `block in write0': undefined method `bytesize' for nil:NilClass (NoMethodError) ``` [Fix GH-2058] From: Eito Katagiri <eitoball@gmail.com> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66582 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-26 23:49:12 -05:00
io = Net::BufferedIO.new(mockio)
assert_equal(3, io.write("\u3042"))
end
def test_write0_timeout
mockio = create_mockio
io = Net::BufferedIO.new(mockio)
io.write_timeout = 0.1
assert_raise(Net::WriteTimeout){ io.write("a"*1000) }
end
def test_write0_success
mockio = create_mockio
io = Net::BufferedIO.new(mockio)
io.write_timeout = 0.1
len = io.write("a"*10)
assert_equal "a"*10, mockio.string
assert_equal 10, len
end
def test_write0_success2
mockio = create_mockio
io = Net::BufferedIO.new(mockio)
io.write_timeout = 0.1
len = io.write("a"*100)
assert_equal "a"*100, mockio.string
assert_equal 100, len
end
def test_write0_success_multi1
mockio = create_mockio
io = Net::BufferedIO.new(mockio)
io.write_timeout = 0.1
len = io.write("a"*50, "a"*49)
assert_equal "a"*99, mockio.string
assert_equal 99, len
end
def test_write0_success_multi2
mockio = create_mockio
io = Net::BufferedIO.new(mockio)
io.write_timeout = 0.1
len = io.write("a"*50, "a"*50)
assert_equal "a"*100, mockio.string
assert_equal 100, len
end
def test_write0_timeout_multi1
mockio = create_mockio
io = Net::BufferedIO.new(mockio)
io.write_timeout = 0.1
assert_raise(Net::WriteTimeout){ io.write("a"*50,"a"*51) }
end
def test_write0_timeout_multi2
mockio = create_mockio
io = Net::BufferedIO.new(mockio)
io.write_timeout = 0.1
assert_raise(Net::WriteTimeout){ io.write("a"*50,"a"*50,"a") }
end
end