mirror of
https://github.com/puma/puma.git
synced 2022-11-09 13:48:40 -05:00
Merge pull request #2318 from MSP-Greg/test-port-0
Test fixups, port 0 and timeout handling [changelog skip]
This commit is contained in:
commit
22d6e9061a
11 changed files with 51 additions and 43 deletions
|
@ -16,6 +16,7 @@ require "minitest/autorun"
|
||||||
require "minitest/pride"
|
require "minitest/pride"
|
||||||
require "minitest/proveit"
|
require "minitest/proveit"
|
||||||
require "minitest/stub_const"
|
require "minitest/stub_const"
|
||||||
|
require "net/http"
|
||||||
require_relative "helpers/apps"
|
require_relative "helpers/apps"
|
||||||
|
|
||||||
Thread.abort_on_exception = true
|
Thread.abort_on_exception = true
|
||||||
|
@ -29,7 +30,6 @@ require "puma/detect"
|
||||||
# Either takes a string to do a get request against, or a tuple of [URI, HTTP] where
|
# Either takes a string to do a get request against, or a tuple of [URI, HTTP] where
|
||||||
# HTTP is some kind of Net::HTTP request object (POST, HEAD, etc.)
|
# HTTP is some kind of Net::HTTP request object (POST, HEAD, etc.)
|
||||||
def hit(uris)
|
def hit(uris)
|
||||||
require "net/http"
|
|
||||||
uris.map do |u|
|
uris.map do |u|
|
||||||
response =
|
response =
|
||||||
if u.kind_of? String
|
if u.kind_of? String
|
||||||
|
@ -58,11 +58,27 @@ module TimeoutEveryTestCase
|
||||||
class TestTookTooLong < Timeout::Error
|
class TestTookTooLong < Timeout::Error
|
||||||
end
|
end
|
||||||
|
|
||||||
def time_it
|
def run
|
||||||
t0 = Minitest.clock_time
|
with_info_handler do
|
||||||
::Timeout.timeout(RUBY_ENGINE == 'ruby' ? 60 : 120, TestTookTooLong) { yield }
|
time_it do
|
||||||
ensure
|
capture_exceptions do
|
||||||
self.time = Minitest.clock_time - t0
|
before_setup; setup; after_setup
|
||||||
|
|
||||||
|
# wrap timeout around test method only
|
||||||
|
::Timeout.timeout(RUBY_ENGINE == 'ruby' ? 60 : 120, TestTookTooLong) {
|
||||||
|
self.send self.name
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
Minitest::Test::TEARDOWN_METHODS.each do |hook|
|
||||||
|
capture_exceptions do
|
||||||
|
self.send hook
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Minitest::Result.from self # per contract
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -114,8 +114,8 @@ class TestIntegration < Minitest::Test
|
||||||
s
|
s
|
||||||
end
|
end
|
||||||
|
|
||||||
def read_body(connection)
|
def read_body(connection, time_out = 10)
|
||||||
Timeout.timeout(10) do
|
Timeout.timeout(time_out) do
|
||||||
loop do
|
loop do
|
||||||
response = connection.readpartial(1024)
|
response = connection.readpartial(1024)
|
||||||
body = response.split("\r\n\r\n", 2).last
|
body = response.split("\r\n\r\n", 2).last
|
||||||
|
|
|
@ -15,7 +15,7 @@ class TestBusyWorker < Minitest::Test
|
||||||
end
|
end
|
||||||
|
|
||||||
def new_connection
|
def new_connection
|
||||||
TCPSocket.new('127.0.0.1', @server.connected_ports[0]).tap {|s| @ios << s}
|
TCPSocket.new('127.0.0.1', @port).tap {|s| @ios << s}
|
||||||
rescue IOError
|
rescue IOError
|
||||||
Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue
|
Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue
|
||||||
retry
|
retry
|
||||||
|
@ -56,7 +56,7 @@ class TestBusyWorker < Minitest::Test
|
||||||
@server = Puma::Server.new request_handler, Puma::Events.strings, **options
|
@server = Puma::Server.new request_handler, Puma::Events.strings, **options
|
||||||
@server.min_threads = options[:min_threads] || 0
|
@server.min_threads = options[:min_threads] || 0
|
||||||
@server.max_threads = options[:max_threads] || 10
|
@server.max_threads = options[:max_threads] || 10
|
||||||
@server.add_tcp_listener '127.0.0.1', 0
|
@port = (@server.add_tcp_listener '127.0.0.1', 0).addr[1]
|
||||||
@server.run
|
@server.run
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -167,10 +167,9 @@ class TestEvents < Minitest::Test
|
||||||
events = Puma::Events.strings
|
events = Puma::Events.strings
|
||||||
server = Puma::Server.new app, events
|
server = Puma::Server.new app, events
|
||||||
|
|
||||||
server.add_tcp_listener host, port
|
port = (server.add_tcp_listener host, 0).addr[1]
|
||||||
server.run
|
server.run
|
||||||
|
|
||||||
port = server.connected_ports[0]
|
|
||||||
sock = TCPSocket.new host, port
|
sock = TCPSocket.new host, port
|
||||||
path = "/"
|
path = "/"
|
||||||
params = "a"*1024*10
|
params = "a"*1024*10
|
||||||
|
|
|
@ -448,7 +448,7 @@ RUBY
|
||||||
begin
|
begin
|
||||||
sleep delay
|
sleep delay
|
||||||
s = connect "sleep#{sleep_time}", unix: unix
|
s = connect "sleep#{sleep_time}", unix: unix
|
||||||
body = read_body(s)
|
body = read_body(s, 20)
|
||||||
mutex.synchronize { replies << body }
|
mutex.synchronize { replies << body }
|
||||||
rescue Errno::ECONNRESET
|
rescue Errno::ECONNRESET
|
||||||
# connection was accepted but then closed
|
# connection was accepted but then closed
|
||||||
|
|
|
@ -19,7 +19,7 @@ class TestOutOfBandServer < Minitest::Test
|
||||||
end
|
end
|
||||||
|
|
||||||
def new_connection
|
def new_connection
|
||||||
TCPSocket.new('127.0.0.1', @server.connected_ports[0]).tap {|s| @ios << s}
|
TCPSocket.new('127.0.0.1', @port).tap {|s| @ios << s}
|
||||||
rescue IOError
|
rescue IOError
|
||||||
Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue
|
Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue
|
||||||
retry
|
retry
|
||||||
|
@ -62,7 +62,7 @@ class TestOutOfBandServer < Minitest::Test
|
||||||
@server = Puma::Server.new app, Puma::Events.strings, out_of_band: [oob], **options
|
@server = Puma::Server.new app, Puma::Events.strings, out_of_band: [oob], **options
|
||||||
@server.min_threads = options[:min_threads] || 1
|
@server.min_threads = options[:min_threads] || 1
|
||||||
@server.max_threads = options[:max_threads] || 1
|
@server.max_threads = options[:max_threads] || 1
|
||||||
@server.add_tcp_listener '127.0.0.1', 0
|
@port = (@server.add_tcp_listener '127.0.0.1', 0).addr[1]
|
||||||
@server.run
|
@server.run
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -23,10 +23,8 @@ class TestPersistent < Minitest::Test
|
||||||
[status, @headers, @body]
|
[status, @headers, @body]
|
||||||
end
|
end
|
||||||
|
|
||||||
@port = UniquePort.call
|
|
||||||
|
|
||||||
@server = Puma::Server.new @simple
|
@server = Puma::Server.new @simple
|
||||||
@server.add_tcp_listener HOST, @port
|
@port = (@server.add_tcp_listener HOST, 0).addr[1]
|
||||||
@server.max_threads = 1
|
@server.max_threads = 1
|
||||||
@server.run
|
@server.run
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ class TestPumaServer < Minitest::Test
|
||||||
parallelize_me!
|
parallelize_me!
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
@port = 0
|
|
||||||
@host = "127.0.0.1"
|
@host = "127.0.0.1"
|
||||||
|
|
||||||
@ios = []
|
@ios = []
|
||||||
|
@ -24,7 +23,7 @@ class TestPumaServer < Minitest::Test
|
||||||
|
|
||||||
def server_run(app: @app, early_hints: false)
|
def server_run(app: @app, early_hints: false)
|
||||||
@server.app = app
|
@server.app = app
|
||||||
@server.add_tcp_listener @host, @port
|
@port = (@server.add_tcp_listener @host, 0).addr[1]
|
||||||
@server.early_hints = true if early_hints
|
@server.early_hints = true if early_hints
|
||||||
@server.run
|
@server.run
|
||||||
end
|
end
|
||||||
|
@ -49,8 +48,7 @@ class TestPumaServer < Minitest::Test
|
||||||
end
|
end
|
||||||
|
|
||||||
def new_connection
|
def new_connection
|
||||||
port = @server.connected_ports[0]
|
TCPSocket.new(@host, @port).tap {|sock| @ios << sock}
|
||||||
TCPSocket.new(@host, port).tap {|sock| @ios << sock}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_proper_stringio_body
|
def test_proper_stringio_body
|
||||||
|
@ -138,8 +136,7 @@ class TestPumaServer < Minitest::Test
|
||||||
req = Net::HTTP::Get.new '/'
|
req = Net::HTTP::Get.new '/'
|
||||||
req['HOST'] = 'example.com'
|
req['HOST'] = 'example.com'
|
||||||
|
|
||||||
port = @server.connected_ports[0]
|
res = Net::HTTP.start @host, @port do |http|
|
||||||
res = Net::HTTP.start @host, port do |http|
|
|
||||||
http.request(req)
|
http.request(req)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -155,8 +152,7 @@ class TestPumaServer < Minitest::Test
|
||||||
req['HOST'] = "example.com"
|
req['HOST'] = "example.com"
|
||||||
req['X-FORWARDED-PROTO'] = "https,http"
|
req['X-FORWARDED-PROTO'] = "https,http"
|
||||||
|
|
||||||
port = @server.connected_ports[0]
|
res = Net::HTTP.start @host, @port do |http|
|
||||||
res = Net::HTTP.start @host, port do |http|
|
|
||||||
http.request(req)
|
http.request(req)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1054,7 +1050,7 @@ EOF
|
||||||
end
|
end
|
||||||
|
|
||||||
def stub_accept_nonblock(error)
|
def stub_accept_nonblock(error)
|
||||||
@server.add_tcp_listener @host, @port
|
@port = (@server.add_tcp_listener @host, 0).addr[1]
|
||||||
io = @server.binder.ios.last
|
io = @server.binder.ios.last
|
||||||
accept_old = io.method(:accept_nonblock)
|
accept_old = io.method(:accept_nonblock)
|
||||||
accept_stub = -> do
|
accept_stub = -> do
|
||||||
|
|
|
@ -54,7 +54,6 @@ class TestPumaServerSSL < Minitest::Test
|
||||||
|
|
||||||
# yields ctx to block, use for ctx setup & configuration
|
# yields ctx to block, use for ctx setup & configuration
|
||||||
def start_server
|
def start_server
|
||||||
@port = 0
|
|
||||||
@host = "127.0.0.1"
|
@host = "127.0.0.1"
|
||||||
|
|
||||||
app = lambda { |env| [200, {}, [env['rack.url_scheme']]] }
|
app = lambda { |env| [200, {}, [env['rack.url_scheme']]] }
|
||||||
|
@ -75,10 +74,10 @@ class TestPumaServerSSL < Minitest::Test
|
||||||
|
|
||||||
@events = SSLEventsHelper.new STDOUT, STDERR
|
@events = SSLEventsHelper.new STDOUT, STDERR
|
||||||
@server = Puma::Server.new app, @events
|
@server = Puma::Server.new app, @events
|
||||||
@ssl_listener = @server.add_ssl_listener @host, @port, ctx
|
@port = (@server.add_ssl_listener @host, 0, ctx).addr[1]
|
||||||
@server.run
|
@server.run
|
||||||
|
|
||||||
@http = Net::HTTP.new @host, @server.connected_ports[0]
|
@http = Net::HTTP.new @host, @port
|
||||||
@http.use_ssl = true
|
@http.use_ssl = true
|
||||||
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
||||||
end
|
end
|
||||||
|
|
|
@ -35,8 +35,8 @@ class TestRackServer < Minitest::Test
|
||||||
def setup
|
def setup
|
||||||
@simple = lambda { |env| [200, { "X-Header" => "Works" }, ["Hello"]] }
|
@simple = lambda { |env| [200, { "X-Header" => "Works" }, ["Hello"]] }
|
||||||
@server = Puma::Server.new @simple
|
@server = Puma::Server.new @simple
|
||||||
@server.add_tcp_listener "127.0.0.1", 0
|
port = (@server.add_tcp_listener "127.0.0.1", 0).addr[1]
|
||||||
|
@tcp = "http://127.0.0.1:#{port}"
|
||||||
@stopped = false
|
@stopped = false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ class TestRackServer < Minitest::Test
|
||||||
|
|
||||||
@server.run
|
@server.run
|
||||||
|
|
||||||
hit(["http://127.0.0.1:#{ @server.connected_ports[0] }/test"])
|
hit(["#{@tcp}/test"])
|
||||||
|
|
||||||
stop
|
stop
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ class TestRackServer < Minitest::Test
|
||||||
|
|
||||||
big = "x" * (1024 * 16)
|
big = "x" * (1024 * 16)
|
||||||
|
|
||||||
Net::HTTP.post_form URI.parse("http://127.0.0.1:#{ @server.connected_ports[0] }/test"),
|
Net::HTTP.post_form URI.parse("#{@tcp}/test"),
|
||||||
{ "big" => big }
|
{ "big" => big }
|
||||||
|
|
||||||
stop
|
stop
|
||||||
|
@ -83,7 +83,7 @@ class TestRackServer < Minitest::Test
|
||||||
@server.app = lambda { |env| input = env; @simple.call(env) }
|
@server.app = lambda { |env| input = env; @simple.call(env) }
|
||||||
@server.run
|
@server.run
|
||||||
|
|
||||||
hit(["http://127.0.0.1:#{ @server.connected_ports[0] }/test/a/b/c"])
|
hit(["#{@tcp}/test/a/b/c"])
|
||||||
|
|
||||||
stop
|
stop
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ class TestRackServer < Minitest::Test
|
||||||
|
|
||||||
@server.run
|
@server.run
|
||||||
|
|
||||||
hit(["http://127.0.0.1:#{ @server.connected_ports[0] }/test"])
|
hit(["#{@tcp}/test"])
|
||||||
|
|
||||||
stop
|
stop
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ class TestRackServer < Minitest::Test
|
||||||
|
|
||||||
@server.run
|
@server.run
|
||||||
|
|
||||||
hit(["http://127.0.0.1:#{ @server.connected_ports[0] }/test"])
|
hit(["#{@tcp}/test"])
|
||||||
|
|
||||||
stop
|
stop
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,8 @@ class WebServerTest < Minitest::Test
|
||||||
def setup
|
def setup
|
||||||
@tester = TestHandler.new
|
@tester = TestHandler.new
|
||||||
@server = Puma::Server.new @tester, Puma::Events.strings
|
@server = Puma::Server.new @tester, Puma::Events.strings
|
||||||
@server.add_tcp_listener "127.0.0.1", 0
|
@port = (@server.add_tcp_listener "127.0.0.1", 0).addr[1]
|
||||||
|
@tcp = "http://127.0.0.1:#{@port}"
|
||||||
@server.run
|
@server.run
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -34,14 +34,14 @@ class WebServerTest < Minitest::Test
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_simple_server
|
def test_simple_server
|
||||||
hit(["http://127.0.0.1:#{@server.connected_ports[0]}/test"])
|
hit(["#{@tcp}/test"])
|
||||||
assert @tester.ran_test, "Handler didn't really run"
|
assert @tester.ran_test, "Handler didn't really run"
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_requests_count
|
def test_requests_count
|
||||||
assert_equal @server.requests_count, 0
|
assert_equal @server.requests_count, 0
|
||||||
3.times do
|
3.times do
|
||||||
hit(["http://127.0.0.1:#{@server.connected_ports[0]}/test"])
|
hit(["#{@tcp}/test"])
|
||||||
end
|
end
|
||||||
assert_equal @server.requests_count, 3
|
assert_equal @server.requests_count, 3
|
||||||
end
|
end
|
||||||
|
@ -83,7 +83,7 @@ class WebServerTest < Minitest::Test
|
||||||
|
|
||||||
def do_test(string, chunk)
|
def do_test(string, chunk)
|
||||||
# Do not use instance variables here, because it needs to be thread safe
|
# Do not use instance variables here, because it needs to be thread safe
|
||||||
socket = TCPSocket.new("127.0.0.1", @server.connected_ports[0]);
|
socket = TCPSocket.new("127.0.0.1", @port);
|
||||||
request = StringIO.new(string)
|
request = StringIO.new(string)
|
||||||
chunks_out = 0
|
chunks_out = 0
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ class WebServerTest < Minitest::Test
|
||||||
|
|
||||||
def do_test_raise(string, chunk, close_after = nil)
|
def do_test_raise(string, chunk, close_after = nil)
|
||||||
# Do not use instance variables here, because it needs to be thread safe
|
# Do not use instance variables here, because it needs to be thread safe
|
||||||
socket = TCPSocket.new("127.0.0.1", @server.connected_ports[0]);
|
socket = TCPSocket.new("127.0.0.1", @port);
|
||||||
request = StringIO.new(string)
|
request = StringIO.new(string)
|
||||||
chunks_out = 0
|
chunks_out = 0
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue