sidekiq 2.15.1 → 4.2.10
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sidekiq might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/.github/contributing.md +32 -0
- data/.github/issue_template.md +9 -0
- data/.gitignore +1 -0
- data/.travis.yml +16 -17
- data/3.0-Upgrade.md +70 -0
- data/4.0-Upgrade.md +53 -0
- data/COMM-LICENSE +56 -44
- data/Changes.md +644 -1
- data/Ent-Changes.md +173 -0
- data/Gemfile +27 -0
- data/LICENSE +1 -1
- data/Pro-2.0-Upgrade.md +138 -0
- data/Pro-3.0-Upgrade.md +44 -0
- data/Pro-Changes.md +457 -3
- data/README.md +46 -29
- data/Rakefile +6 -3
- data/bin/sidekiq +4 -0
- data/bin/sidekiqctl +41 -20
- data/bin/sidekiqload +154 -0
- data/code_of_conduct.md +50 -0
- data/lib/generators/sidekiq/templates/worker.rb.erb +9 -0
- data/lib/generators/sidekiq/templates/worker_spec.rb.erb +6 -0
- data/lib/generators/sidekiq/templates/worker_test.rb.erb +8 -0
- data/lib/generators/sidekiq/worker_generator.rb +49 -0
- data/lib/sidekiq.rb +141 -29
- data/lib/sidekiq/api.rb +540 -106
- data/lib/sidekiq/cli.rb +131 -71
- data/lib/sidekiq/client.rb +168 -96
- data/lib/sidekiq/core_ext.rb +36 -8
- data/lib/sidekiq/exception_handler.rb +20 -28
- data/lib/sidekiq/extensions/action_mailer.rb +25 -5
- data/lib/sidekiq/extensions/active_record.rb +8 -4
- data/lib/sidekiq/extensions/class_methods.rb +9 -5
- data/lib/sidekiq/extensions/generic_proxy.rb +1 -0
- data/lib/sidekiq/fetch.rb +45 -101
- data/lib/sidekiq/launcher.rb +144 -30
- data/lib/sidekiq/logging.rb +69 -12
- data/lib/sidekiq/manager.rb +90 -140
- data/lib/sidekiq/middleware/chain.rb +18 -5
- data/lib/sidekiq/middleware/i18n.rb +9 -2
- data/lib/sidekiq/middleware/server/active_record.rb +1 -1
- data/lib/sidekiq/middleware/server/logging.rb +11 -11
- data/lib/sidekiq/middleware/server/retry_jobs.rb +98 -44
- data/lib/sidekiq/paginator.rb +20 -8
- data/lib/sidekiq/processor.rb +157 -96
- data/lib/sidekiq/rails.rb +109 -5
- data/lib/sidekiq/redis_connection.rb +70 -24
- data/lib/sidekiq/scheduled.rb +122 -50
- data/lib/sidekiq/testing.rb +171 -31
- data/lib/sidekiq/testing/inline.rb +1 -0
- data/lib/sidekiq/util.rb +31 -5
- data/lib/sidekiq/version.rb +2 -1
- data/lib/sidekiq/web.rb +136 -263
- data/lib/sidekiq/web/action.rb +93 -0
- data/lib/sidekiq/web/application.rb +336 -0
- data/lib/sidekiq/web/helpers.rb +278 -0
- data/lib/sidekiq/web/router.rb +100 -0
- data/lib/sidekiq/worker.rb +40 -7
- data/sidekiq.gemspec +18 -14
- data/web/assets/images/favicon.ico +0 -0
- data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
- data/web/assets/javascripts/application.js +67 -19
- data/web/assets/javascripts/dashboard.js +138 -29
- data/web/assets/stylesheets/application.css +267 -406
- data/web/assets/stylesheets/bootstrap.css +4 -8
- data/web/locales/cs.yml +78 -0
- data/web/locales/da.yml +9 -1
- data/web/locales/de.yml +18 -9
- data/web/locales/el.yml +68 -0
- data/web/locales/en.yml +19 -4
- data/web/locales/es.yml +10 -1
- data/web/locales/fa.yml +79 -0
- data/web/locales/fr.yml +50 -32
- data/web/locales/hi.yml +75 -0
- data/web/locales/it.yml +27 -18
- data/web/locales/ja.yml +27 -12
- data/web/locales/ko.yml +8 -3
- data/web/locales/{no.yml → nb.yml} +19 -5
- data/web/locales/nl.yml +8 -3
- data/web/locales/pl.yml +0 -1
- data/web/locales/pt-br.yml +11 -4
- data/web/locales/pt.yml +8 -1
- data/web/locales/ru.yml +39 -21
- data/web/locales/sv.yml +68 -0
- data/web/locales/ta.yml +75 -0
- data/web/locales/uk.yml +76 -0
- data/web/locales/zh-cn.yml +68 -0
- data/web/locales/zh-tw.yml +68 -0
- data/web/views/_footer.erb +17 -0
- data/web/views/_job_info.erb +72 -60
- data/web/views/_nav.erb +58 -25
- data/web/views/_paging.erb +5 -5
- data/web/views/_poll_link.erb +7 -0
- data/web/views/_summary.erb +20 -14
- data/web/views/busy.erb +94 -0
- data/web/views/dashboard.erb +34 -21
- data/web/views/dead.erb +34 -0
- data/web/views/layout.erb +8 -30
- data/web/views/morgue.erb +75 -0
- data/web/views/queue.erb +37 -30
- data/web/views/queues.erb +26 -20
- data/web/views/retries.erb +60 -47
- data/web/views/retry.erb +23 -19
- data/web/views/scheduled.erb +39 -35
- data/web/views/scheduled_job_info.erb +2 -1
- metadata +152 -195
- data/Contributing.md +0 -29
- data/config.ru +0 -18
- data/lib/sidekiq/actor.rb +0 -7
- data/lib/sidekiq/capistrano.rb +0 -54
- data/lib/sidekiq/yaml_patch.rb +0 -21
- data/test/config.yml +0 -11
- data/test/env_based_config.yml +0 -11
- data/test/fake_env.rb +0 -0
- data/test/helper.rb +0 -42
- data/test/test_api.rb +0 -341
- data/test/test_cli.rb +0 -326
- data/test/test_client.rb +0 -211
- data/test/test_exception_handler.rb +0 -124
- data/test/test_extensions.rb +0 -105
- data/test/test_fetch.rb +0 -44
- data/test/test_manager.rb +0 -83
- data/test/test_middleware.rb +0 -135
- data/test/test_processor.rb +0 -160
- data/test/test_redis_connection.rb +0 -97
- data/test/test_retry.rb +0 -306
- data/test/test_scheduled.rb +0 -86
- data/test/test_scheduling.rb +0 -47
- data/test/test_sidekiq.rb +0 -37
- data/test/test_testing.rb +0 -82
- data/test/test_testing_fake.rb +0 -265
- data/test/test_testing_inline.rb +0 -92
- data/test/test_util.rb +0 -18
- data/test/test_web.rb +0 -372
- data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
- data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
- data/web/assets/images/status/active.png +0 -0
- data/web/assets/images/status/idle.png +0 -0
- data/web/assets/javascripts/locales/README.md +0 -27
- data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
- data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
- data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.cz.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
- data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
- data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
- data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
- data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
- data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
- data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
- data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
- data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.no.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
- data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
- data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
- data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
- data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
- data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
- data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
- data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
- data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
- data/web/assets/javascripts/locales/jquery.timeago.zh-CN.js +0 -20
- data/web/assets/javascripts/locales/jquery.timeago.zh-TW.js +0 -20
- data/web/views/_poll.erb +0 -14
- data/web/views/_workers.erb +0 -29
- data/web/views/index.erb +0 -16
data/test/test_scheduled.rb
DELETED
@@ -1,86 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq/scheduled'
|
3
|
-
|
4
|
-
class TestScheduled < Sidekiq::Test
|
5
|
-
class ScheduledWorker
|
6
|
-
include Sidekiq::Worker
|
7
|
-
def perform(x)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
describe 'poller' do
|
12
|
-
before do
|
13
|
-
Sidekiq.redis = REDIS
|
14
|
-
Sidekiq.redis do |conn|
|
15
|
-
conn.flushdb
|
16
|
-
end
|
17
|
-
|
18
|
-
@error_1 = { 'class' => ScheduledWorker.name, 'args' => [0], 'queue' => 'queue_1' }
|
19
|
-
@error_2 = { 'class' => ScheduledWorker.name, 'args' => [1], 'queue' => 'queue_2' }
|
20
|
-
@error_3 = { 'class' => ScheduledWorker.name, 'args' => [2], 'queue' => 'queue_3' }
|
21
|
-
@future_1 = { 'class' => ScheduledWorker.name, 'args' => [3], 'queue' => 'queue_4' }
|
22
|
-
@future_2 = { 'class' => ScheduledWorker.name, 'args' => [4], 'queue' => 'queue_5' }
|
23
|
-
@future_3 = { 'class' => ScheduledWorker.name, 'args' => [5], 'queue' => 'queue_6' }
|
24
|
-
|
25
|
-
@retry = Sidekiq::RetrySet.new
|
26
|
-
@scheduled = Sidekiq::ScheduledSet.new
|
27
|
-
@poller = Sidekiq::Scheduled::Poller.new
|
28
|
-
end
|
29
|
-
|
30
|
-
class Stopper
|
31
|
-
def call(worker_class, message, queue)
|
32
|
-
yield if message['args'].first.odd?
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'executes client middleware' do
|
37
|
-
Sidekiq.client_middleware.add Stopper
|
38
|
-
begin
|
39
|
-
@retry.schedule (Time.now - 60).to_f, @error_1
|
40
|
-
@retry.schedule (Time.now - 60).to_f, @error_2
|
41
|
-
@scheduled.schedule (Time.now - 60).to_f, @future_2
|
42
|
-
@scheduled.schedule (Time.now - 60).to_f, @future_3
|
43
|
-
|
44
|
-
@poller.poll
|
45
|
-
|
46
|
-
Sidekiq.redis do |conn|
|
47
|
-
assert_equal 0, conn.llen("queue:queue_1")
|
48
|
-
assert_equal 1, conn.llen("queue:queue_2")
|
49
|
-
assert_equal 0, conn.llen("queue:queue_5")
|
50
|
-
assert_equal 1, conn.llen("queue:queue_6")
|
51
|
-
end
|
52
|
-
ensure
|
53
|
-
Sidekiq.client_middleware.remove Stopper
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'should empty the retry and scheduled queues up to the current time' do
|
58
|
-
enqueued_time = Time.new(2013, 2, 4)
|
59
|
-
|
60
|
-
Time.stub(:now, enqueued_time) do
|
61
|
-
@retry.schedule (Time.now - 60).to_f, @error_1
|
62
|
-
@retry.schedule (Time.now - 50).to_f, @error_2
|
63
|
-
@retry.schedule (Time.now + 60).to_f, @error_3
|
64
|
-
@scheduled.schedule (Time.now - 60).to_f, @future_1
|
65
|
-
@scheduled.schedule (Time.now - 50).to_f, @future_2
|
66
|
-
@scheduled.schedule (Time.now + 60).to_f, @future_3
|
67
|
-
|
68
|
-
@poller.poll
|
69
|
-
|
70
|
-
Sidekiq.redis do |conn|
|
71
|
-
assert_equal 1, conn.llen("queue:queue_1")
|
72
|
-
assert_equal enqueued_time.to_f, Sidekiq.load_json(conn.lrange("queue:queue_1", 0, -1)[0])['enqueued_at']
|
73
|
-
assert_equal 1, conn.llen("queue:queue_2")
|
74
|
-
assert_equal enqueued_time.to_f, Sidekiq.load_json(conn.lrange("queue:queue_2", 0, -1)[0])['enqueued_at']
|
75
|
-
assert_equal 1, conn.llen("queue:queue_4")
|
76
|
-
assert_equal enqueued_time.to_f, Sidekiq.load_json(conn.lrange("queue:queue_4", 0, -1)[0])['enqueued_at']
|
77
|
-
assert_equal 1, conn.llen("queue:queue_5")
|
78
|
-
assert_equal enqueued_time.to_f, Sidekiq.load_json(conn.lrange("queue:queue_5", 0, -1)[0])['enqueued_at']
|
79
|
-
end
|
80
|
-
|
81
|
-
assert_equal 1, @retry.size
|
82
|
-
assert_equal 1, @scheduled.size
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
data/test/test_scheduling.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq/scheduled'
|
3
|
-
|
4
|
-
class TestScheduling < Sidekiq::Test
|
5
|
-
describe 'middleware' do
|
6
|
-
before do
|
7
|
-
@redis = Minitest::Mock.new
|
8
|
-
# Ugh, this is terrible.
|
9
|
-
Sidekiq.instance_variable_set(:@redis, @redis)
|
10
|
-
def @redis.multi; [yield] * 2 if block_given?; end
|
11
|
-
def @redis.with; yield self; end
|
12
|
-
end
|
13
|
-
|
14
|
-
class ScheduledWorker
|
15
|
-
include Sidekiq::Worker
|
16
|
-
sidekiq_options :queue => :custom_queue
|
17
|
-
def perform(x)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'schedules a job via interval' do
|
22
|
-
@redis.expect :zadd, true, ['schedule', Array]
|
23
|
-
assert ScheduledWorker.perform_in(600, 'mike')
|
24
|
-
@redis.verify
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'schedules a job via timestamp' do
|
28
|
-
@redis.expect :zadd, true, ['schedule', Array]
|
29
|
-
assert ScheduledWorker.perform_in(5.days.from_now, 'mike')
|
30
|
-
@redis.verify
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'schedules job right away on negative timestamp/interval' do
|
34
|
-
@redis.expect :sadd, true, ['queues', :custom_queue]
|
35
|
-
@redis.expect :lpush, true, ['queue:custom_queue', Array]
|
36
|
-
assert ScheduledWorker.perform_in(-300, 'mike')
|
37
|
-
@redis.verify
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'schedules multiple jobs at once' do
|
41
|
-
@redis.expect :zadd, true, ['schedule', Array]
|
42
|
-
assert Sidekiq::Client.push_bulk('class' => ScheduledWorker, 'args' => [['mike'], ['mike']], 'at' => 600)
|
43
|
-
@redis.verify
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
data/test/test_sidekiq.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'helper'
|
3
|
-
|
4
|
-
class TestSidekiq < Sidekiq::Test
|
5
|
-
describe 'json processing' do
|
6
|
-
it 'loads json' do
|
7
|
-
assert_equal ({"foo" => "bar"}), Sidekiq.load_json("{\"foo\":\"bar\"}")
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'dumps json' do
|
11
|
-
assert_equal "{\"foo\":\"bar\"}", Sidekiq.dump_json({ "foo" => "bar" })
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
describe "redis connection" do
|
16
|
-
it "returns error without creating a connection if block is not given" do
|
17
|
-
mock = Minitest::Mock.new
|
18
|
-
mock.expect :create, nil #Sidekiq::RedisConnection, create
|
19
|
-
assert_raises(ArgumentError) {
|
20
|
-
Sidekiq.redis
|
21
|
-
}
|
22
|
-
assert_raises(MockExpectationError, "create should not be called") do
|
23
|
-
mock.verify
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe "❨╯°□°❩╯︵┻━┻" do
|
29
|
-
before { $stdout = StringIO.new }
|
30
|
-
after { $stdout = STDOUT }
|
31
|
-
|
32
|
-
it "allows angry developers to express their emotional constitution and remedies it" do
|
33
|
-
Sidekiq.❨╯°□°❩╯︵┻━┻
|
34
|
-
assert_equal "Calm down, bro\n", $stdout.string
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
data/test/test_testing.rb
DELETED
@@ -1,82 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq'
|
3
|
-
require 'sidekiq/worker'
|
4
|
-
require 'active_record'
|
5
|
-
require 'action_mailer'
|
6
|
-
require 'sidekiq/rails'
|
7
|
-
require 'sidekiq/extensions/action_mailer'
|
8
|
-
require 'sidekiq/extensions/active_record'
|
9
|
-
|
10
|
-
Sidekiq.hook_rails!
|
11
|
-
|
12
|
-
class TestTesting < Sidekiq::Test
|
13
|
-
describe 'sidekiq testing' do
|
14
|
-
describe 'require/load sidekiq/testing.rb' do
|
15
|
-
before do
|
16
|
-
require 'sidekiq/testing.rb'
|
17
|
-
end
|
18
|
-
|
19
|
-
after do
|
20
|
-
Sidekiq::Testing.disable!
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'enables fake testing' do
|
24
|
-
Sidekiq::Testing.fake!
|
25
|
-
assert_equal true, Sidekiq::Testing.enabled?
|
26
|
-
assert_equal true, Sidekiq::Testing.fake?
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'enables fake testing in a block' do
|
30
|
-
Sidekiq::Testing.disable!
|
31
|
-
assert_equal true, Sidekiq::Testing.disabled?
|
32
|
-
|
33
|
-
Sidekiq::Testing.fake! do
|
34
|
-
assert_equal true, Sidekiq::Testing.enabled?
|
35
|
-
assert_equal true, Sidekiq::Testing.fake?
|
36
|
-
end
|
37
|
-
|
38
|
-
assert_equal false, Sidekiq::Testing.enabled?
|
39
|
-
assert_equal false, Sidekiq::Testing.fake?
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'disables testing in a block' do
|
43
|
-
Sidekiq::Testing.fake!
|
44
|
-
|
45
|
-
Sidekiq::Testing.disable! do
|
46
|
-
assert_equal true, Sidekiq::Testing.disabled?
|
47
|
-
end
|
48
|
-
|
49
|
-
assert_equal true, Sidekiq::Testing.enabled?
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe 'require/load sidekiq/testing/inline.rb' do
|
54
|
-
before do
|
55
|
-
require 'sidekiq/testing/inline.rb'
|
56
|
-
end
|
57
|
-
|
58
|
-
after do
|
59
|
-
Sidekiq::Testing.disable!
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'enables inline testing' do
|
63
|
-
Sidekiq::Testing.inline!
|
64
|
-
assert_equal true, Sidekiq::Testing.enabled?
|
65
|
-
assert_equal true, Sidekiq::Testing.inline?
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'enables inline testing in a block' do
|
69
|
-
Sidekiq::Testing.disable!
|
70
|
-
assert_equal true, Sidekiq::Testing.disabled?
|
71
|
-
|
72
|
-
Sidekiq::Testing.inline! do
|
73
|
-
assert_equal true, Sidekiq::Testing.enabled?
|
74
|
-
assert_equal true, Sidekiq::Testing.inline?
|
75
|
-
end
|
76
|
-
|
77
|
-
assert_equal false, Sidekiq::Testing.enabled?
|
78
|
-
assert_equal false, Sidekiq::Testing.inline?
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
data/test/test_testing_fake.rb
DELETED
@@ -1,265 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq'
|
3
|
-
require 'sidekiq/worker'
|
4
|
-
require 'active_record'
|
5
|
-
require 'action_mailer'
|
6
|
-
require 'sidekiq/rails'
|
7
|
-
require 'sidekiq/extensions/action_mailer'
|
8
|
-
require 'sidekiq/extensions/active_record'
|
9
|
-
|
10
|
-
Sidekiq.hook_rails!
|
11
|
-
|
12
|
-
class TestTesting < Sidekiq::Test
|
13
|
-
describe 'sidekiq testing' do
|
14
|
-
class PerformError < RuntimeError; end
|
15
|
-
|
16
|
-
class DirectWorker
|
17
|
-
include Sidekiq::Worker
|
18
|
-
def perform(a, b)
|
19
|
-
a + b
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
class EnqueuedWorker
|
24
|
-
include Sidekiq::Worker
|
25
|
-
def perform(a, b)
|
26
|
-
a + b
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
class StoredWorker
|
31
|
-
include Sidekiq::Worker
|
32
|
-
def perform(error)
|
33
|
-
raise PerformError if error
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
class FooMailer < ActionMailer::Base
|
38
|
-
def bar(str)
|
39
|
-
str
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
class FooModel < ActiveRecord::Base
|
44
|
-
def bar(str)
|
45
|
-
str
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
before do
|
50
|
-
require 'sidekiq/testing.rb'
|
51
|
-
Sidekiq::Testing.fake!
|
52
|
-
EnqueuedWorker.jobs.clear
|
53
|
-
DirectWorker.jobs.clear
|
54
|
-
end
|
55
|
-
|
56
|
-
after do
|
57
|
-
Sidekiq::Testing.disable!
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'stubs the async call' do
|
61
|
-
assert_equal 0, DirectWorker.jobs.size
|
62
|
-
assert DirectWorker.perform_async(1, 2)
|
63
|
-
assert_equal 1, DirectWorker.jobs.size
|
64
|
-
assert DirectWorker.perform_in(10, 1, 2)
|
65
|
-
assert_equal 2, DirectWorker.jobs.size
|
66
|
-
assert DirectWorker.perform_at(10, 1, 2)
|
67
|
-
assert_equal 3, DirectWorker.jobs.size
|
68
|
-
assert_in_delta 10.seconds.from_now.to_f, DirectWorker.jobs.last['at'], 0.01
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'stubs the delay call on mailers' do
|
72
|
-
assert_equal 0, Sidekiq::Extensions::DelayedMailer.jobs.size
|
73
|
-
FooMailer.delay.bar('hello!')
|
74
|
-
assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs.size
|
75
|
-
end
|
76
|
-
|
77
|
-
class Something
|
78
|
-
def self.foo(x)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'stubs the delay call on models' do
|
83
|
-
assert_equal 0, Sidekiq::Extensions::DelayedClass.jobs.size
|
84
|
-
Something.delay.foo(Date.today)
|
85
|
-
assert_equal 1, Sidekiq::Extensions::DelayedClass.jobs.size
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'stubs the enqueue call' do
|
89
|
-
assert_equal 0, EnqueuedWorker.jobs.size
|
90
|
-
assert Sidekiq::Client.enqueue(EnqueuedWorker, 1, 2)
|
91
|
-
assert_equal 1, EnqueuedWorker.jobs.size
|
92
|
-
end
|
93
|
-
|
94
|
-
it 'stubs the enqueue_to call' do
|
95
|
-
assert_equal 0, EnqueuedWorker.jobs.size
|
96
|
-
assert Sidekiq::Client.enqueue_to('someq', EnqueuedWorker, 1, 2)
|
97
|
-
assert_equal 1, EnqueuedWorker.jobs.size
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'executes all stored jobs' do
|
101
|
-
assert StoredWorker.perform_async(false)
|
102
|
-
assert StoredWorker.perform_async(true)
|
103
|
-
|
104
|
-
assert_equal 2, StoredWorker.jobs.size
|
105
|
-
assert_raises PerformError do
|
106
|
-
StoredWorker.drain
|
107
|
-
end
|
108
|
-
assert_equal 0, StoredWorker.jobs.size
|
109
|
-
|
110
|
-
end
|
111
|
-
|
112
|
-
class SpecificJidWorker
|
113
|
-
include Sidekiq::Worker
|
114
|
-
class_attribute :count
|
115
|
-
self.count = 0
|
116
|
-
def perform(worker_jid)
|
117
|
-
return unless worker_jid == self.jid
|
118
|
-
self.class.count += 1
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
it 'execute only jobs with assigned JID' do
|
123
|
-
4.times do |i|
|
124
|
-
jid = SpecificJidWorker.perform_async(nil)
|
125
|
-
if i % 2 == 0
|
126
|
-
SpecificJidWorker.jobs[-1]["args"] = ["wrong_jid"]
|
127
|
-
else
|
128
|
-
SpecificJidWorker.jobs[-1]["args"] = [jid]
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
SpecificJidWorker.perform_one
|
133
|
-
assert_equal 0, SpecificJidWorker.count
|
134
|
-
|
135
|
-
SpecificJidWorker.perform_one
|
136
|
-
assert_equal 1, SpecificJidWorker.count
|
137
|
-
|
138
|
-
SpecificJidWorker.drain
|
139
|
-
assert_equal 2, SpecificJidWorker.count
|
140
|
-
end
|
141
|
-
|
142
|
-
it 'round trip serializes the job arguments' do
|
143
|
-
assert StoredWorker.perform_async(:mike)
|
144
|
-
job = StoredWorker.jobs.first
|
145
|
-
assert_equal "mike", job['args'].first
|
146
|
-
StoredWorker.clear
|
147
|
-
end
|
148
|
-
|
149
|
-
it 'perform_one runs only one job' do
|
150
|
-
DirectWorker.perform_async(1, 2)
|
151
|
-
DirectWorker.perform_async(3, 4)
|
152
|
-
assert_equal 2, DirectWorker.jobs.size
|
153
|
-
|
154
|
-
DirectWorker.perform_one
|
155
|
-
assert_equal 1, DirectWorker.jobs.size
|
156
|
-
|
157
|
-
DirectWorker.clear
|
158
|
-
end
|
159
|
-
|
160
|
-
it 'perform_one raise error upon empty queue' do
|
161
|
-
DirectWorker.clear
|
162
|
-
assert_raises Sidekiq::EmptyQueueError do
|
163
|
-
DirectWorker.perform_one
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
class FirstWorker
|
168
|
-
include Sidekiq::Worker
|
169
|
-
class_attribute :count
|
170
|
-
self.count = 0
|
171
|
-
def perform
|
172
|
-
self.class.count += 1
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
class SecondWorker
|
177
|
-
include Sidekiq::Worker
|
178
|
-
class_attribute :count
|
179
|
-
self.count = 0
|
180
|
-
def perform
|
181
|
-
self.class.count += 1
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
class ThirdWorker
|
186
|
-
include Sidekiq::Worker
|
187
|
-
class_attribute :count
|
188
|
-
def perform
|
189
|
-
FirstWorker.perform_async
|
190
|
-
SecondWorker.perform_async
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
it 'clears jobs across all workers' do
|
195
|
-
Sidekiq::Worker.jobs.clear
|
196
|
-
FirstWorker.count = 0
|
197
|
-
SecondWorker.count = 0
|
198
|
-
|
199
|
-
assert_equal 0, FirstWorker.jobs.size
|
200
|
-
assert_equal 0, SecondWorker.jobs.size
|
201
|
-
|
202
|
-
FirstWorker.perform_async
|
203
|
-
SecondWorker.perform_async
|
204
|
-
|
205
|
-
assert_equal 1, FirstWorker.jobs.size
|
206
|
-
assert_equal 1, SecondWorker.jobs.size
|
207
|
-
|
208
|
-
Sidekiq::Worker.clear_all
|
209
|
-
|
210
|
-
assert_equal 0, FirstWorker.jobs.size
|
211
|
-
assert_equal 0, SecondWorker.jobs.size
|
212
|
-
|
213
|
-
assert_equal 0, FirstWorker.count
|
214
|
-
assert_equal 0, SecondWorker.count
|
215
|
-
end
|
216
|
-
|
217
|
-
it 'drains jobs across all workers' do
|
218
|
-
Sidekiq::Worker.jobs.clear
|
219
|
-
FirstWorker.count = 0
|
220
|
-
SecondWorker.count = 0
|
221
|
-
|
222
|
-
assert_equal 0, FirstWorker.jobs.size
|
223
|
-
assert_equal 0, SecondWorker.jobs.size
|
224
|
-
|
225
|
-
assert_equal 0, FirstWorker.count
|
226
|
-
assert_equal 0, SecondWorker.count
|
227
|
-
|
228
|
-
FirstWorker.perform_async
|
229
|
-
SecondWorker.perform_async
|
230
|
-
|
231
|
-
assert_equal 1, FirstWorker.jobs.size
|
232
|
-
assert_equal 1, SecondWorker.jobs.size
|
233
|
-
|
234
|
-
Sidekiq::Worker.drain_all
|
235
|
-
|
236
|
-
assert_equal 0, FirstWorker.jobs.size
|
237
|
-
assert_equal 0, SecondWorker.jobs.size
|
238
|
-
|
239
|
-
assert_equal 1, FirstWorker.count
|
240
|
-
assert_equal 1, SecondWorker.count
|
241
|
-
end
|
242
|
-
|
243
|
-
it 'drains jobs across all workers even when workers create new jobs' do
|
244
|
-
Sidekiq::Worker.jobs.clear
|
245
|
-
FirstWorker.count = 0
|
246
|
-
SecondWorker.count = 0
|
247
|
-
|
248
|
-
assert_equal 0, ThirdWorker.jobs.size
|
249
|
-
|
250
|
-
assert_equal 0, FirstWorker.count
|
251
|
-
assert_equal 0, SecondWorker.count
|
252
|
-
|
253
|
-
ThirdWorker.perform_async
|
254
|
-
|
255
|
-
assert_equal 1, ThirdWorker.jobs.size
|
256
|
-
|
257
|
-
Sidekiq::Worker.drain_all
|
258
|
-
|
259
|
-
assert_equal 0, ThirdWorker.jobs.size
|
260
|
-
|
261
|
-
assert_equal 1, FirstWorker.count
|
262
|
-
assert_equal 1, SecondWorker.count
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|