1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activejob/test/support/integration/test_case_helpers.rb
Will Jessop 171e788ccd Fix race condition testing for job execution order
On most filesystems file ctime is limited to 1 second granularity, which means that on
faster computers multiple simple jobs (for instance dummy TestJob) can finish within the
same second.

The execution order test in ActiveJob integration tests relies on multiple TestJobs
writing files then comparing the ctime. As a result integration tests would sometimes
fail as the ctime of the files written by these TestJobs could have coincidental ctimes
making the comparison for job order fail.

This commit adds a far more precise execution time (to the extent that the Ruby Time
class allows) to the file created by TestJob, and updates the execution order assertion
to use it, removing the race condition.
2015-11-23 14:24:49 +00:00

64 lines
1.2 KiB
Ruby

require 'active_support/concern'
require 'support/integration/jobs_manager'
module TestCaseHelpers
extend ActiveSupport::Concern
included do
self.use_transactional_tests = false
setup do
clear_jobs
@id = "AJ-#{SecureRandom.uuid}"
end
teardown do
clear_jobs
end
end
protected
def jobs_manager
JobsManager.current_manager
end
def clear_jobs
jobs_manager.clear_jobs
end
def adapter_is?(*adapter_class_symbols)
adapter_class_symbols.map(&:to_s).include?(ActiveJob::Base.queue_adapter.class.name.split("::").last.gsub(/Adapter$/, '').underscore)
end
def wait_for_jobs_to_finish_for(seconds=60)
begin
Timeout.timeout(seconds) do
while !job_executed do
sleep 0.25
end
end
rescue Timeout::Error
end
end
def job_file(id)
Dummy::Application.root.join("tmp/#{id}")
end
def job_executed(id=@id)
job_file(id).exist?
end
def job_data(id)
Marshal.load(File.binread(job_file(id)))
end
def job_executed_at(id=@id)
job_data(id)["executed_at"]
end
def job_executed_in_locale(id=@id)
job_data(id)["locale"]
end
end