|
require 'rails_helper'
describe AgentRunner do
context "without traps" do
before do
stub.instance_of(Rufus::Scheduler).every
stub.instance_of(AgentRunner).set_traps
@agent_runner = AgentRunner.new
end
context "#run" do
before do
mock(@agent_runner).run_workers
mock.instance_of(IO).puts('Stopping AgentRunner...')
end
it "runs until stop is called" do
mock.instance_of(Rufus::Scheduler).join
Thread.new { while @agent_runner.instance_variable_get(:@running) != false do sleep 0.1; @agent_runner.stop end }
@agent_runner.run
end
it "handles signals" do
@agent_runner.instance_variable_set(:@signal_queue, ['TERM'])
@agent_runner.run
end
end
context "#load_workers" do
before do
AgentRunner.class_variable_set(:@@agents, [HuginnScheduler, DelayedJobWorker])
end
it "loads all workers" do
workers = @agent_runner.send(:load_workers)
expect(workers).to be_a(Hash)
expect(workers.keys).to eq(['HuginnScheduler', 'DelayedJobWorker'])
end
it "loads only the workers specified in the :only option" do
@agent_runner = AgentRunner.new(only: HuginnScheduler)
workers = @agent_runner.send(:load_workers)
expect(workers.keys).to eq(['HuginnScheduler'])
end
it "does not load workers specified in the :except option" do
@agent_runner = AgentRunner.new(except: HuginnScheduler)
workers = @agent_runner.send(:load_workers)
expect(workers.keys).to eq(['DelayedJobWorker'])
end
end
context "running workers" do
before do
AgentRunner.class_variable_set(:@@agents, [HuginnScheduler, DelayedJobWorker])
stub.instance_of(IO).puts
stub.instance_of(LongRunnable::Worker).setup!
end
context "#run_workers" do
it "runs all the workers" do
mock.instance_of(HuginnScheduler).run!
mock.instance_of(DelayedJobWorker).run!
@agent_runner.send(:run_workers)
end
it "kills no long active workers" do
mock.instance_of(HuginnScheduler).run!
mock.instance_of(DelayedJobWorker).run!
@agent_runner.send(:run_workers)
AgentRunner.class_variable_set(:@@agents, [DelayedJobWorker])
mock.instance_of(HuginnScheduler).stop!
@agent_runner.send(:run_workers)
end
end
context "#restart_dead_workers" do
before do
mock.instance_of(HuginnScheduler).run!
mock.instance_of(DelayedJobWorker).run!
@agent_runner.send(:run_workers)
end
it "restarts dead workers" do
stub.instance_of(HuginnScheduler).thread { OpenStruct.new(alive?: false) }
mock.instance_of(HuginnScheduler).run!
@agent_runner.send(:restart_dead_workers)
end
end
end
end
context "#set_traps" do
it "sets traps for INT TERM and QUIT" do
agent_runner = AgentRunner.new
mock(Signal).trap('INT')
mock(Signal).trap('TERM')
mock(Signal).trap('QUIT')
agent_runner.set_traps
end
end
end
|