diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-06-06 08:03:47 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-06-06 08:03:47 +0000 |
commit | bd7c46a7aa8b4f44ef683e22f469033b96d3dd5f (patch) | |
tree | 8100dd93ab2032f3d61f3b82e80b0d37f0ae2f82 /test | |
parent | acc48fce30b413c158d06e5578ac73b07ed60b69 (diff) | |
download | ruby-bd7c46a7aa8b4f44ef683e22f469033b96d3dd5f.tar.gz |
Introduce write_timeout to Net::HTTP [Feature #13396]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63587 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r-- | test/net/http/test_http.rb | 24 | ||||
-rw-r--r-- | test/net/protocol/test_protocol.rb | 85 |
2 files changed, 109 insertions, 0 deletions
diff --git a/test/net/http/test_http.rb b/test/net/http/test_http.rb index d3c2aecb9f..778bf01f8f 100644 --- a/test/net/http/test_http.rb +++ b/test/net/http/test_http.rb @@ -529,6 +529,30 @@ module TestNetHTTP_version_1_1_methods assert_equal data, res.entity end + def test_timeout_during_HTTP_session_write + bug4246 = "expected the HTTP session to have timed out but have not. c.f. [ruby-core:34203]" + + th = nil + # listen for connections... but deliberately do not read + TCPServer.open('localhost', 0) {|server| + port = server.addr[1] + + conn = Net::HTTP.new('localhost', port) + conn.write_timeout = 0.01 + conn.open_timeout = 0.1 + + th = Thread.new do + assert_raise(Net::WriteTimeout) { + conn.post('/', "a"*5_000_000) + } + end + assert th.join(10), bug4246 + } + ensure + th.kill + th.join + end + def test_timeout_during_HTTP_session bug4246 = "expected the HTTP session to have timed out but have not. c.f. [ruby-core:34203]" diff --git a/test/net/protocol/test_protocol.rb b/test/net/protocol/test_protocol.rb index 048526b1c7..c1837ecf20 100644 --- a/test/net/protocol/test_protocol.rb +++ b/test/net/protocol/test_protocol.rb @@ -26,4 +26,89 @@ class TestProtocol < Test::Unit::TestCase assert_equal("\u3042\r\n.\r\n", sio.string) end end + + def create_mockio + mockio = Object.new + mockio.instance_variable_set(:@str, +'') + mockio.instance_variable_set(:@capacity, 100) + 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 + strs.each do |str| + len1 = @str.bytesize + break if @capacity <= len1 + @str << str[0, @capacity - @str.bytesize] + len2 = @str.bytesize + len += len2 - len1 + end + len + end + mockio + 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 |