spec/pool_spec.rb in spool-0.0.1 vs spec/pool_spec.rb in spool-0.1.1
- old
+ new
@@ -3,11 +3,11 @@
describe Spool::Pool do
after do
@pool.stop! if @pool
machine = Datacenter::Machine.new
- machine.processes('ruby -e').each(&:kill)
+ machine.processes('ruby -e').each {|p| p.send_signal :KILL}
end
def start_pool(&block)
@pool = Spool::Pool.new(&block).tap do |pool|
t = Thread.new { pool.start }
@@ -27,10 +27,11 @@
it 'Start and stop' do
pool = start_pool do
processes 1
command 'ruby -e "loop do; sleep 1; end"'
+ stop_signal :TERM
end
pool.must_be :started?
pool.processes.count.must_equal 1
pool.processes[0].must_be :alive?
@@ -42,31 +43,70 @@
pool.must_be :stopped?
pool.processes.must_be_empty
process.wont_be :alive?
end
+ it 'Start and force stop' do
+ pool = start_pool do
+ processes 1
+ command 'ruby -e "loop do; sleep 1; end"'
+ end
+
+ pool.must_be :started?
+ pool.processes.count.must_equal 1
+ pool.processes[0].must_be :alive?
+
+ process = pool.processes[0]
+
+ pool.stop!
+
+ pool.must_be :stopped?
+ pool.processes.must_be_empty
+ process.wont_be :alive?
+ end
+
it 'Recover killed process' do
pool = start_pool do
processes 1
command 'ruby -e "loop do; sleep 1; end"'
end
original_process = pool.processes[0]
- original_process.kill
+ original_process.send_signal :KILL
original_process.wont_be :alive?
until pool.processes[0] && pool.processes[0].pid != original_process.pid; end
pool.processes.count.must_equal 1
pool.processes[0].must_be :alive?
end
+ it 'Restart processes' do
+ pool = start_pool do
+ processes 2
+ command 'ruby -e "loop do; sleep 1; end"'
+ stop_signal :TERM
+ end
+
+ pool.processes.count.must_equal 2
+
+ original_pids = pool.processes.map(&:pid)
+
+ pool.restart
+
+ until pool.processes.count == 2 && pool.processes[0].pid != original_pids[0] && pool.processes[1].pid != original_pids[1]; end
+
+ pool.processes.count.must_equal 2
+ pool.processes.each { |p| p.must_be :alive?}
+ end
+
it 'Stop with timeout' do
pool = start_pool do
processes 1
- command 'ruby -e "Signal.trap(:TERM) { sleep 5; exit 0 }; loop { sleep 1 }"'
+ command 'ruby -e "Signal.trap(:QUIT) { puts :quit; sleep 5; exit 0 }; loop { sleep 1 }"'
+ stop_signal :QUIT
end
process = pool.processes[0]
Benchmark.realtime { pool.stop 0.1 }.must_be :<, 1
@@ -91,33 +131,65 @@
it 'Decrease processes' do
pool = start_pool do
processes 3
command 'ruby -e "loop do; sleep 1; end"'
+ stop_signal :TERM
end
pool.processes.count.must_equal 3
pool.decr 2
assert_with_timeout(1) { pool.processes.count == 1 }
end
it 'Change process when satisfied stop condition' do
+ file_name = File.expand_path 'used_memory.log'
+ ruby_command = "require 'datacenter'; Signal.trap(:TERM) { File.write('#{file_name}', Datacenter::Process.new(Process.pid).memory); exit 0 }; a = 50_000_000.times.to_a; loop do; end"
+
pool = start_pool do
processes 1
- command 'ruby -e "a = 50_000_000.times.to_a; loop do; end"'
+ command "ruby -e \"#{ruby_command}\""
restart_when { |p| p.memory > 300 }
+ stop_signal :TERM
end
memory = 0
process = pool.processes[0]
- while pool.processes.empty? || pool.processes[0].pid == process.pid
- memory = process.memory
+ while !File.exists?(file_name)
+ sleep 0.5
end
- memory.must_be :>, 100
+ memory = File.read(file_name).to_i
+ File.delete(file_name)
+
+ memory.must_be :>=, 300
pool.processes.count.must_equal 1
pool.processes[0].pid.wont_equal process.pid
+ end
+
+ it 'Reload config' do
+ config_file = File.expand_path('../loop_pool_config.rb', __FILE__)
+ config = Spool::DSL.configure config_file
+
+ pool = Spool::Pool.new(config).tap do |pool|
+ t = Thread.new { pool.start }
+ t.abort_on_exception = true
+ while pool.processes.count < pool.configuration.processes
+ end
+ end
+
+ pool.processes.count.must_equal 1
+
+ pool.incr 1
+
+ assert_with_timeout(1) { pool.processes.count == 2 }
+
+ pool.reload
+
+ assert_with_timeout(1) { pool.processes.count == 1 }
+
+ pool.stop!
end
end
\ No newline at end of file