Add test that asserts unicorns terminate
This commit is contained in:
parent
a9da37434a
commit
b325d4a658
|
@ -0,0 +1,12 @@
|
|||
if Rails.env.test?
|
||||
class UnicornTestController < ActionController::Base
|
||||
def pid
|
||||
render plain: Process.pid.to_s
|
||||
end
|
||||
|
||||
def kill
|
||||
Process.kill(params[:signal], Process.pid)
|
||||
render plain: 'Bye!'
|
||||
end
|
||||
end
|
||||
end
|
|
@ -99,5 +99,7 @@ Rails.application.routes.draw do
|
|||
end
|
||||
end
|
||||
|
||||
draw :test if Rails.env.test?
|
||||
|
||||
get '*unmatched_route', to: 'application#route_not_found'
|
||||
end
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
get '/unicorn_test/pid' => 'unicorn_test#pid'
|
||||
post '/unicorn_test/kill' => 'unicorn_test#kill'
|
|
@ -2,7 +2,7 @@ desc 'Security check via brakeman'
|
|||
task :brakeman do
|
||||
# We get 0 warnings at level 'w3' but we would like to reach 'w2'. Merge
|
||||
# requests are welcome!
|
||||
if system(*%w(brakeman --no-progress --skip-files lib/backup/repository.rb -w3 -z))
|
||||
if system(*%w(brakeman --no-progress --skip-files lib/backup/repository.rb,app/controllers/unicorn_test_controller.rb -w3 -z))
|
||||
puts 'Security check succeed'
|
||||
else
|
||||
puts 'Security check failed'
|
||||
|
|
|
@ -0,0 +1,89 @@
|
|||
require 'fileutils'
|
||||
|
||||
require 'excon'
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
describe 'Unicorn' do
|
||||
before(:all) do
|
||||
config_lines = File.read('config/unicorn.rb.example').split("\n")
|
||||
|
||||
# Remove these because they make setup harder.
|
||||
config_lines = config_lines.reject do |line|
|
||||
%w[
|
||||
pid
|
||||
stderr_path
|
||||
stdout_path
|
||||
].any? { |prefix| line.start_with?(prefix) }
|
||||
end
|
||||
|
||||
config_lines = config_lines.reject { |l| l.start_with?('working_directory') }
|
||||
config_lines << "working_directory '#{Rails.root}'"
|
||||
|
||||
# We want to have exactly 1 worker process because that makes it
|
||||
# predictable which process will handle our requests.
|
||||
config_lines = config_lines.reject { |l| l.start_with?('worker_processes') }
|
||||
config_lines << 'worker_processes 1'
|
||||
|
||||
@socket_path = File.join(Dir.pwd, 'tmp/tests/unicorn.socket')
|
||||
config_lines = config_lines.reject { |l| l.start_with?('listen') }
|
||||
config_lines << "listen '#{@socket_path}'"
|
||||
|
||||
ready_file = 'tmp/tests/unicorn-worker-ready'
|
||||
FileUtils.rm_f(ready_file)
|
||||
after_fork_index = config_lines.index { |l| l.start_with?('after_fork') }
|
||||
config_lines.insert(after_fork_index + 1, "File.write('#{ready_file}', Process.pid)")
|
||||
|
||||
config_path = 'tmp/tests/unicorn.rb'
|
||||
File.write(config_path, config_lines.join("\n") + "\n")
|
||||
|
||||
cmd = %W[unicorn -E test -c #{config_path} #{Rails.root.join('config.ru')}]
|
||||
@unicorn_master_pid = spawn(*cmd)
|
||||
|
||||
120.times do
|
||||
break if File.exist?(ready_file)
|
||||
pid = Process.waitpid(@unicorn_master_pid, Process::WNOHANG)
|
||||
raise "unicorn failed to boot: #{$?}" unless pid.nil?
|
||||
|
||||
sleep 1
|
||||
end
|
||||
WebMock.allow_net_connect!
|
||||
end
|
||||
|
||||
%w[SIGQUIT SIGTERM SIGKILL].each do |signal|
|
||||
it "has a worker that self-terminates on signal #{signal}" do
|
||||
response = Excon.get('unix:///unicorn_test/pid', socket: @socket_path)
|
||||
expect(response.status).to eq(200)
|
||||
|
||||
worker_pid = response.body.to_i
|
||||
expect(worker_pid > 0).to eq(true)
|
||||
|
||||
begin
|
||||
Excon.post('unix:///unicorn_test/kill', socket: @socket_path, body: "signal=#{signal}")
|
||||
rescue Excon::Error::Socket
|
||||
# The connection may be closed abruptly
|
||||
end
|
||||
|
||||
expect(pid_gone?(worker_pid)).to eq(true)
|
||||
end
|
||||
end
|
||||
|
||||
after(:all) do
|
||||
WebMock.disable_net_connect!(allow_localhost: true)
|
||||
Process.kill('TERM', @unicorn_master_pid)
|
||||
end
|
||||
|
||||
def pid_gone?(pid)
|
||||
10.times do
|
||||
begin
|
||||
Process.kill(0, pid)
|
||||
rescue Errno::ESRCH
|
||||
return true
|
||||
end
|
||||
|
||||
sleep 1
|
||||
end
|
||||
|
||||
false
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue