Skip to content

Commit f8b609d

Browse files
committed
Fix flaky test for process recovery
Especially with SQLite, where the forked process claims the job before the main process. See #602
1 parent be1a5bc commit f8b609d

File tree

1 file changed

+6
-33
lines changed

1 file changed

+6
-33
lines changed

test/unit/process_recovery_test.rb

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ class ProcessRecoveryTest < ActiveSupport::TestCase
2626
worker_process = SolidQueue::Process.find_by(kind: "Worker")
2727
assert worker_process
2828

29-
# Enqueue a job and manually claim it for the worker to avoid timing races
30-
job = enqueue_store_result_job(42)
31-
claimed_execution = SolidQueue::ReadyExecution.claim("*", 5, worker_process.id).first
29+
# Enqueue a job and wait for it to be claimed
30+
StoreResultJob.perform_later(42, pause: 10.seconds)
31+
wait_while_with_timeout(3.seconds) { SolidQueue::ClaimedExecution.none? }
32+
33+
claimed_execution = SolidQueue::ClaimedExecution.last
3234
assert claimed_execution.present?
3335
assert_equal worker_process.id, claimed_execution.process_id
3436

@@ -40,9 +42,8 @@ class ProcessRecoveryTest < ActiveSupport::TestCase
4042
worker_pid = worker_process.pid
4143
terminate_process(worker_pid, signal: :KILL)
4244

43-
4445
# Wait for the supervisor to reap the worker and fail the job
45-
wait_for_failed_executions(1, timeout: 5.seconds)
46+
wait_while_with_timeout(3.seconds) { SolidQueue::FailedExecution.none? }
4647

4748
# Assert the execution is failed
4849
failed_execution = SolidQueue::FailedExecution.last
@@ -53,32 +54,4 @@ class ProcessRecoveryTest < ActiveSupport::TestCase
5354
wait_for_registered_processes(2, timeout: 5.seconds)
5455
assert_operator SolidQueue::Process.where(kind: "Worker").count, :>=, 1
5556
end
56-
57-
private
58-
def assert_registered_workers_for(*queues, supervisor_pid: nil)
59-
workers = find_processes_registered_as("Worker")
60-
registered_queues = workers.map { |process| process.metadata["queues"] }.compact
61-
assert_equal queues.map(&:to_s).sort, registered_queues.sort
62-
if supervisor_pid
63-
assert_equal [ supervisor_pid ], workers.map { |process| process.supervisor.pid }.uniq
64-
end
65-
end
66-
67-
def enqueue_store_result_job(value, queue_name = :default, **options)
68-
StoreResultJob.set(queue: queue_name).perform_later(value, **options)
69-
end
70-
71-
def assert_no_claimed_jobs
72-
skip_active_record_query_cache do
73-
assert_empty SolidQueue::ClaimedExecution.all
74-
end
75-
end
76-
77-
def wait_for_claimed_executions(count, timeout: 1.second)
78-
wait_for(timeout: timeout) { SolidQueue::ClaimedExecution.count == count }
79-
end
80-
81-
def wait_for_failed_executions(count, timeout: 1.second)
82-
wait_for(timeout: timeout) { SolidQueue::FailedExecution.count == count }
83-
end
8457
end

0 commit comments

Comments
 (0)