mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
171e788ccd
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.
64 lines
1.2 KiB
Ruby
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
|