mirror of
https://github.com/puma/puma.git
synced 2022-11-09 13:48:40 -05:00
c71d149117
* Actions non MRI - use JDK11 on macOS, add Big Sur * Actions MRI - add macOS Big Sur Ruby 2.7 * test/helper.rb - run setup in same Timeout block as test * TestIntegrationSingle#test_int_refuse - skip on JRuby Seems to intermittently lockup CI * TestLauncher#test_puma_stats - fix intermittent non-MRI failure II * test_out_of_band_server.rb - JRuby - add small sleep after server.run * test_persistent.rb - JRuby - add small sleep after server.run * test_puma_server.rb - JRuby - add small sleep after server.run
166 lines
4.5 KiB
Ruby
166 lines
4.5 KiB
Ruby
require_relative "helper"
|
|
require_relative "helpers/integration"
|
|
|
|
class TestIntegrationSingle < TestIntegration
|
|
parallelize_me! if ::Puma.mri?
|
|
|
|
def workers ; 0 ; end
|
|
|
|
def test_hot_restart_does_not_drop_connections_threads
|
|
hot_restart_does_not_drop_connections num_threads: 5, total_requests: 1_000
|
|
end
|
|
|
|
def test_hot_restart_does_not_drop_connections
|
|
hot_restart_does_not_drop_connections
|
|
end
|
|
|
|
def test_usr2_restart
|
|
skip_unless_signal_exist? :USR2
|
|
_, new_reply = restart_server_and_listen("-q test/rackup/hello.ru")
|
|
assert_equal "Hello World", new_reply
|
|
end
|
|
|
|
# It does not share environments between multiple generations, which would break Dotenv
|
|
def test_usr2_restart_restores_environment
|
|
# jruby has a bug where setting `nil` into the ENV or `delete` do not change the
|
|
# next workers ENV
|
|
skip_on :jruby
|
|
skip_unless_signal_exist? :USR2
|
|
|
|
initial_reply, new_reply = restart_server_and_listen("-q test/rackup/hello-env.ru")
|
|
|
|
assert_includes initial_reply, "Hello RAND"
|
|
assert_includes new_reply, "Hello RAND"
|
|
refute_equal initial_reply, new_reply
|
|
end
|
|
|
|
def test_term_exit_code
|
|
skip_unless_signal_exist? :TERM
|
|
skip_on :jruby # JVM does not return correct exit code for TERM
|
|
|
|
cli_server "test/rackup/hello.ru"
|
|
_, status = stop_server
|
|
|
|
assert_equal 15, status
|
|
end
|
|
|
|
def test_term_suppress
|
|
skip_unless_signal_exist? :TERM
|
|
|
|
cli_server "-C test/config/suppress_exception.rb test/rackup/hello.ru"
|
|
_, status = stop_server
|
|
|
|
assert_equal 0, status
|
|
end
|
|
|
|
def test_prefer_rackup_file_specified_by_cli
|
|
skip_unless_signal_exist? :TERM
|
|
|
|
cli_server "-C test/config/with_rackup_from_dsl.rb test/rackup/hello.ru"
|
|
reply = read_body(connect)
|
|
stop_server
|
|
|
|
assert_match("Hello World", reply)
|
|
end
|
|
|
|
def test_term_not_accepts_new_connections
|
|
skip_unless_signal_exist? :TERM
|
|
skip_on :jruby
|
|
|
|
cli_server 'test/rackup/sleep.ru'
|
|
|
|
_stdin, curl_stdout, _stderr, curl_wait_thread = Open3.popen3({ 'LC_ALL' => 'C' }, "curl http://#{HOST}:#{@tcp_port}/sleep10")
|
|
sleep 1 # ensure curl send a request
|
|
|
|
Process.kill :TERM, @pid
|
|
true while @server.gets !~ /Gracefully stopping/ # wait for server to begin graceful shutdown
|
|
|
|
# Invoke a request which must be rejected
|
|
_stdin, _stdout, rejected_curl_stderr, rejected_curl_wait_thread = Open3.popen3("curl #{HOST}:#{@tcp_port}")
|
|
|
|
assert nil != Process.getpgid(@server.pid) # ensure server is still running
|
|
assert nil != Process.getpgid(curl_wait_thread[:pid]) # ensure first curl invocation still in progress
|
|
|
|
curl_wait_thread.join
|
|
rejected_curl_wait_thread.join
|
|
|
|
assert_match(/Slept 10/, curl_stdout.read)
|
|
assert_match(/Connection refused/, rejected_curl_stderr.read)
|
|
|
|
Process.wait(@server.pid)
|
|
@server.close unless @server.closed?
|
|
@server = nil # prevent `#teardown` from killing already killed server
|
|
end
|
|
|
|
def test_int_refuse
|
|
skip_unless_signal_exist? :INT
|
|
skip_on :jruby # seems to intermittently lockup JRuby CI
|
|
|
|
cli_server 'test/rackup/hello.ru'
|
|
begin
|
|
sock = TCPSocket.new(HOST, @tcp_port)
|
|
sock.close
|
|
rescue => ex
|
|
fail("Port didn't open properly: #{ex.message}")
|
|
end
|
|
|
|
Process.kill :INT, @pid
|
|
Process.wait @pid
|
|
|
|
assert_raises(Errno::ECONNREFUSED) { TCPSocket.new(HOST, @tcp_port) }
|
|
end
|
|
|
|
def test_siginfo_thread_print
|
|
skip_unless_signal_exist? :INFO
|
|
|
|
cli_server 'test/rackup/hello.ru'
|
|
output = []
|
|
t = Thread.new { output << @server.readlines }
|
|
Process.kill :INFO, @pid
|
|
Process.kill :INT , @pid
|
|
t.join
|
|
|
|
assert_match "Thread: TID", output.join
|
|
end
|
|
|
|
def test_write_to_log
|
|
skip_unless_signal_exist? :TERM
|
|
|
|
suppress_output = '> /dev/null 2>&1'
|
|
|
|
cli_server '-C test/config/t1_conf.rb test/rackup/hello.ru'
|
|
|
|
system "curl http://localhost:#{@tcp_port}/ #{suppress_output}"
|
|
|
|
stop_server
|
|
|
|
log = File.read('t1-stdout')
|
|
|
|
File.unlink 't1-stdout' if File.file? 't1-stdout'
|
|
File.unlink 't1-pid' if File.file? 't1-pid'
|
|
|
|
assert_match(%r!GET / HTTP/1\.1!, log)
|
|
end
|
|
|
|
def test_puma_started_log_writing
|
|
skip_unless_signal_exist? :TERM
|
|
|
|
suppress_output = '> /dev/null 2>&1'
|
|
|
|
cli_server '-C test/config/t2_conf.rb test/rackup/hello.ru'
|
|
|
|
system "curl http://localhost:#{@tcp_port}/ #{suppress_output}"
|
|
|
|
out=`#{BASE} bin/pumactl -F test/config/t2_conf.rb status`
|
|
|
|
stop_server
|
|
|
|
log = File.read('t2-stdout')
|
|
|
|
File.unlink 't2-stdout' if File.file? 't2-stdout'
|
|
|
|
assert_match(%r!GET / HTTP/1\.1!, log)
|
|
assert(!File.file?("t2-pid"))
|
|
assert_equal("Puma is started\n", out)
|
|
end
|
|
end
|