Skip to content

Commit

Permalink
Make sure tests are independent of real execution time
Browse files Browse the repository at this point in the history
Co-authored-by: Aftab Alam <[email protected]>
  • Loading branch information
svkrieger and iaftab-alam committed Feb 11, 2022
1 parent 7c7bc2b commit 4c6250b
Showing 1 changed file with 48 additions and 27 deletions.
75 changes: 48 additions & 27 deletions spec/unit/jobs/reoccurring_job_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,13 @@ def perform
job.polling_interval_seconds = 95
expect(job.polling_interval_seconds).to eq(95)

enqueued_time = Time.now
enqueued_time = 0

Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
Timecop.freeze do
Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
enqueued_time = Time.now
end

Timecop.freeze(94.seconds.after(enqueued_time)) do
execute_all_jobs(expected_successes: 0, expected_failures: 0)
Expand All @@ -103,10 +106,13 @@ def perform
it 'when changing exponential backoff rate only' do
TestConfig.config[:broker_client_async_poll_exponential_backoff_rate] = 2.0

enqueued_time = Time.now
enqueued_time = 0

Jobs::Enqueuer.new(FakeJob.new, queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
Timecop.freeze do
Jobs::Enqueuer.new(FakeJob.new, queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
enqueued_time = Time.now
end

[60, 180, 420, 900, 1860].each do |seconds|
Timecop.freeze((seconds - 1).seconds.after(enqueued_time)) do
Expand All @@ -122,10 +128,13 @@ def perform
TestConfig.config[:broker_client_async_poll_exponential_backoff_rate] = 1.3
TestConfig.config[:broker_client_default_async_poll_interval_seconds] = 10

enqueued_time = Time.now
enqueued_time = 0

Jobs::Enqueuer.new(FakeJob.new, queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
Timecop.freeze do
Jobs::Enqueuer.new(FakeJob.new, queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
enqueued_time = Time.now
end

[10, 23, 39.9, 61.8, 90.4].each do |seconds|
Timecop.freeze((seconds - 1).seconds.after(enqueued_time)) do
Expand All @@ -138,14 +147,16 @@ def perform
end
end
it 'when changing exponential backoff rate and retry_after from the job' do
job = FakeJob.new(retry_after: [20, 30])
TestConfig.config[:broker_client_async_poll_exponential_backoff_rate] = 1.3
TestConfig.config[:broker_client_default_async_poll_interval_seconds] = 10

enqueued_time = Time.now
enqueued_time = 0

Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
Timecop.freeze do
Jobs::Enqueuer.new(FakeJob.new(retry_after: [20, 30]), queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
enqueued_time = Time.now
end

# the job should run after 20s * 1.3^0 = 20 seconds
Timecop.freeze(19.seconds.after(enqueued_time)) do
Expand Down Expand Up @@ -176,8 +187,12 @@ def perform
# With a backoff rate of 1.3, 11 jobs could have been executed in 60 minutes (initial run + 10 retries).
job.instance_variable_set(:@retry_number, 10)

enqueued_time = Time.now
Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
enqueued_time = 0

Timecop.freeze do
Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
enqueued_time = Time.now
end

# The calculated backoff for the 11th retry would be 3384.321 seconds.
Timecop.freeze(enqueued_time + 3384.321.ceil.seconds) do
Expand All @@ -194,13 +209,15 @@ def perform

context 'updates the polling interval if config changes' do
it 'when changed from the job only' do
job = FakeJob.new(retry_after: [20, 30])
TestConfig.config[:broker_client_default_async_poll_interval_seconds] = 10

enqueued_time = Time.now
enqueued_time = 0

Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
Timecop.freeze do
Jobs::Enqueuer.new(FakeJob.new(retry_after: [20, 30]), queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
enqueued_time = Time.now
end

Timecop.freeze(19.seconds.after(enqueued_time)) do
execute_all_jobs(expected_successes: 0, expected_failures: 0)
Expand All @@ -221,13 +238,15 @@ def perform
end

it 'when default changed after changing from the job' do
job = FakeJob.new(retry_after: [20])
TestConfig.config[:broker_client_default_async_poll_interval_seconds] = 10

enqueued_time = Time.now
enqueued_time = 0

Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
Timecop.freeze do
Jobs::Enqueuer.new(FakeJob.new(retry_after: [20]), queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
enqueued_time = Time.now
end

Timecop.freeze(19.seconds.after(enqueued_time)) do
execute_all_jobs(expected_successes: 0, expected_failures: 0)
Expand All @@ -249,13 +268,15 @@ def perform
end

it 'when changing default only' do
job = FakeJob.new
TestConfig.config[:broker_client_default_async_poll_interval_seconds] = 10

enqueued_time = Time.now
enqueued_time = 0

Jobs::Enqueuer.new(job, queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
Timecop.freeze do
Jobs::Enqueuer.new(FakeJob.new, queue: Jobs::Queues.generic).enqueue_pollable
execute_all_jobs(expected_successes: 1, expected_failures: 0)
enqueued_time = Time.now
end

Timecop.freeze(9.seconds.after(enqueued_time)) do
execute_all_jobs(expected_successes: 0, expected_failures: 0)
Expand Down

0 comments on commit 4c6250b

Please sign in to comment.