2015-12-31 15:33:35 -08:00
|
|
|
# frozen_string_literal: true
|
2015-10-02 15:44:29 -07:00
|
|
|
|
2022-03-03 12:50:03 -08:00
|
|
|
require_relative "helper"
|
|
|
|
require "sidekiq/cli"
|
|
|
|
require "sidekiq/fetch"
|
|
|
|
require "sidekiq/scheduled"
|
|
|
|
require "sidekiq/processor"
|
2022-08-25 10:15:11 -07:00
|
|
|
require "sidekiq/api"
|
2022-03-03 12:50:03 -08:00
|
|
|
|
2022-05-31 13:37:31 -07:00
|
|
|
class JoeWorker
|
|
|
|
include Sidekiq::Job
|
|
|
|
def perform(slp)
|
|
|
|
raise "boom" if slp == "boom"
|
|
|
|
sleep(slp) if slp > 0
|
|
|
|
$count += 1
|
2015-10-02 15:44:29 -07:00
|
|
|
end
|
2022-05-31 13:37:31 -07:00
|
|
|
end
|
2015-10-02 15:44:29 -07:00
|
|
|
|
2022-05-31 13:37:31 -07:00
|
|
|
describe "Actors" do
|
2019-02-28 12:43:50 -08:00
|
|
|
before do
|
2022-08-25 10:15:11 -07:00
|
|
|
@config = reset!
|
|
|
|
@cap = @config.default_capsule
|
2019-02-28 12:43:50 -08:00
|
|
|
end
|
|
|
|
|
2022-03-03 12:50:03 -08:00
|
|
|
describe "scheduler" do
|
|
|
|
it "can start and stop" do
|
2022-05-31 13:37:31 -07:00
|
|
|
f = Sidekiq::Scheduled::Poller.new(@config)
|
2019-02-28 12:43:50 -08:00
|
|
|
f.start
|
|
|
|
f.terminate
|
2015-10-20 22:04:36 -07:00
|
|
|
end
|
2015-10-02 21:07:09 -07:00
|
|
|
|
2022-03-03 12:50:03 -08:00
|
|
|
it "can schedule" do
|
2019-02-28 12:43:50 -08:00
|
|
|
ss = Sidekiq::ScheduledSet.new
|
|
|
|
q = Sidekiq::Queue.new
|
2015-10-02 21:07:09 -07:00
|
|
|
|
2019-02-28 12:43:50 -08:00
|
|
|
JoeWorker.perform_in(0.01, 0)
|
2015-10-02 21:07:09 -07:00
|
|
|
|
2019-02-28 12:43:50 -08:00
|
|
|
assert_equal 0, q.size
|
|
|
|
assert_equal 1, ss.size
|
2015-10-02 21:07:09 -07:00
|
|
|
|
2019-02-28 12:43:50 -08:00
|
|
|
sleep 0.015
|
2022-05-31 13:37:31 -07:00
|
|
|
s = Sidekiq::Scheduled::Poller.new(@config)
|
2019-02-28 12:43:50 -08:00
|
|
|
s.enqueue
|
|
|
|
assert_equal 1, q.size
|
|
|
|
assert_equal 0, ss.size
|
|
|
|
s.terminate
|
|
|
|
end
|
|
|
|
end
|
2015-10-02 21:07:09 -07:00
|
|
|
|
2022-03-03 12:50:03 -08:00
|
|
|
describe "processor" do
|
2019-02-28 12:43:50 -08:00
|
|
|
before do
|
|
|
|
$count = 0
|
2022-05-31 13:37:31 -07:00
|
|
|
@mutex = ::Mutex.new
|
|
|
|
@cond = ::ConditionVariable.new
|
|
|
|
@latest_error = nil
|
2015-10-05 10:13:00 -07:00
|
|
|
end
|
|
|
|
|
2022-05-31 13:37:31 -07:00
|
|
|
def result(pr, ex)
|
|
|
|
@latest_error = ex
|
|
|
|
@mutex.synchronize do
|
|
|
|
@cond.signal
|
2019-02-28 12:43:50 -08:00
|
|
|
end
|
2022-08-25 11:03:28 -07:00
|
|
|
pr.job
|
2022-05-31 13:37:31 -07:00
|
|
|
end
|
2022-03-03 12:50:03 -08:00
|
|
|
|
2022-06-05 07:44:52 -07:00
|
|
|
def await(timeout = 0.5)
|
2022-05-31 13:37:31 -07:00
|
|
|
@mutex.synchronize do
|
|
|
|
yield
|
|
|
|
@cond.wait(@mutex, timeout)
|
2015-10-08 21:50:45 -07:00
|
|
|
end
|
2022-05-31 13:37:31 -07:00
|
|
|
end
|
2022-03-03 12:50:03 -08:00
|
|
|
|
2022-08-25 11:03:28 -07:00
|
|
|
it "can stop" do
|
2022-08-25 10:15:11 -07:00
|
|
|
f = Sidekiq::Processor.new(@cap) { |p, ex| raise "should not raise!" }
|
2022-05-31 13:37:31 -07:00
|
|
|
f.terminate
|
2022-08-25 11:03:28 -07:00
|
|
|
assert_nil f.thread # didnt start it
|
2019-02-28 12:43:50 -08:00
|
|
|
end
|
2015-10-05 10:13:00 -07:00
|
|
|
|
2022-03-03 12:50:03 -08:00
|
|
|
it "can process" do
|
2022-05-31 13:37:31 -07:00
|
|
|
q = Sidekiq::Queue.new
|
|
|
|
assert_equal 0, q.size
|
2022-08-25 10:15:11 -07:00
|
|
|
p = Sidekiq::Processor.new(@cap) do |pr, ex|
|
2022-05-31 13:37:31 -07:00
|
|
|
result(pr, ex)
|
|
|
|
end
|
2019-02-28 12:43:50 -08:00
|
|
|
JoeWorker.perform_async(0)
|
2022-05-31 13:37:31 -07:00
|
|
|
assert_equal 1, q.size
|
2015-10-05 10:13:00 -07:00
|
|
|
|
2019-02-28 12:43:50 -08:00
|
|
|
a = $count
|
2022-05-31 13:37:31 -07:00
|
|
|
await do
|
|
|
|
p.start
|
|
|
|
end
|
|
|
|
|
2022-08-25 11:03:28 -07:00
|
|
|
p.terminate
|
|
|
|
val = p.kill(true)
|
|
|
|
assert_nil val
|
|
|
|
|
|
|
|
# TODO this is necessary for the test below to pass!?!?!
|
|
|
|
# Is there a rogue thread alive and fetching?
|
|
|
|
# Comment out and run "bundle exec ruby test/actors.rb"
|
|
|
|
JoeWorker.perform_async(0)
|
|
|
|
|
2019-02-28 12:43:50 -08:00
|
|
|
b = $count
|
2022-05-31 13:37:31 -07:00
|
|
|
assert_nil @latest_error
|
2022-08-25 11:03:28 -07:00
|
|
|
assert_equal false, p.thread.status
|
2019-02-28 12:43:50 -08:00
|
|
|
assert_equal a + 1, b
|
2022-05-31 13:37:31 -07:00
|
|
|
assert_equal 0, q.size
|
2019-02-28 12:43:50 -08:00
|
|
|
end
|
2015-10-05 10:13:00 -07:00
|
|
|
|
2022-03-03 12:50:03 -08:00
|
|
|
it "deals with errors" do
|
2019-02-28 12:43:50 -08:00
|
|
|
q = Sidekiq::Queue.new
|
2022-05-31 13:37:31 -07:00
|
|
|
assert_equal 0, q.size
|
2022-08-25 10:15:11 -07:00
|
|
|
p = Sidekiq::Processor.new(@cap) do |pr, ex|
|
2022-05-31 13:37:31 -07:00
|
|
|
result(pr, ex)
|
|
|
|
end
|
|
|
|
jid = JoeWorker.perform_async("boom")
|
|
|
|
assert jid, jid
|
2019-02-28 12:43:50 -08:00
|
|
|
assert_equal 1, q.size
|
2015-10-05 10:13:00 -07:00
|
|
|
|
2019-02-28 12:43:50 -08:00
|
|
|
a = $count
|
2022-05-31 13:37:31 -07:00
|
|
|
await do
|
2019-02-28 12:43:50 -08:00
|
|
|
p.start
|
2015-10-05 10:13:00 -07:00
|
|
|
end
|
2019-02-28 12:43:50 -08:00
|
|
|
b = $count
|
|
|
|
assert_equal a, b
|
|
|
|
|
2022-05-31 13:37:31 -07:00
|
|
|
p.kill(true)
|
|
|
|
assert @latest_error
|
2022-08-25 11:03:28 -07:00
|
|
|
assert_equal false, p.thread.status
|
2022-05-31 13:37:31 -07:00
|
|
|
assert_equal "boom", @latest_error.message
|
|
|
|
assert_equal RuntimeError, @latest_error.class
|
2019-02-28 12:43:50 -08:00
|
|
|
end
|
2015-10-05 10:13:00 -07:00
|
|
|
|
2022-03-03 12:50:03 -08:00
|
|
|
it "gracefully kills" do
|
2019-02-28 12:43:50 -08:00
|
|
|
q = Sidekiq::Queue.new
|
2022-05-31 13:37:31 -07:00
|
|
|
assert_equal 0, q.size
|
2022-08-25 10:15:11 -07:00
|
|
|
p = Sidekiq::Processor.new(@cap) do |pr, ex|
|
2022-05-31 13:37:31 -07:00
|
|
|
result(pr, ex)
|
|
|
|
end
|
2022-08-25 10:15:11 -07:00
|
|
|
jid = JoeWorker.perform_async(2)
|
2022-05-31 13:37:31 -07:00
|
|
|
assert jid, jid
|
2019-02-28 12:43:50 -08:00
|
|
|
assert_equal 1, q.size
|
2015-10-05 10:13:00 -07:00
|
|
|
|
2019-02-28 12:43:50 -08:00
|
|
|
a = $count
|
|
|
|
p.start
|
|
|
|
sleep(0.05)
|
|
|
|
p.terminate
|
|
|
|
p.kill(true)
|
|
|
|
|
|
|
|
b = $count
|
|
|
|
assert_equal a, b
|
|
|
|
assert_equal false, p.thread.status
|
2022-05-31 13:37:31 -07:00
|
|
|
refute @latest_error, @latest_error.to_s
|
2015-10-05 10:13:00 -07:00
|
|
|
end
|
|
|
|
end
|
2015-10-02 15:44:29 -07:00
|
|
|
end
|