sidekiq 3.5.4 → 5.2.7
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 +5 -5
- data/.circleci/config.yml +61 -0
- data/{Contributing.md → .github/contributing.md} +0 -0
- data/.github/issue_template.md +11 -0
- data/.gitignore +3 -0
- data/.travis.yml +5 -10
- data/4.0-Upgrade.md +53 -0
- data/5.0-Upgrade.md +56 -0
- data/COMM-LICENSE +13 -11
- data/Changes.md +376 -1
- data/Ent-Changes.md +201 -2
- data/Gemfile +14 -18
- data/LICENSE +1 -1
- data/Pro-3.0-Upgrade.md +44 -0
- data/Pro-4.0-Upgrade.md +35 -0
- data/Pro-Changes.md +307 -2
- data/README.md +34 -22
- data/Rakefile +3 -3
- data/bin/sidekiq +0 -1
- data/bin/sidekiqctl +13 -86
- data/bin/sidekiqload +23 -27
- data/code_of_conduct.md +50 -0
- data/lib/generators/sidekiq/templates/worker_spec.rb.erb +3 -3
- data/lib/generators/sidekiq/templates/worker_test.rb.erb +6 -6
- data/lib/sidekiq.rb +72 -25
- data/lib/sidekiq/api.rb +206 -73
- data/lib/sidekiq/cli.rb +145 -101
- data/lib/sidekiq/client.rb +42 -36
- data/lib/sidekiq/core_ext.rb +1 -105
- data/lib/sidekiq/ctl.rb +221 -0
- data/lib/sidekiq/delay.rb +42 -0
- data/lib/sidekiq/exception_handler.rb +4 -5
- data/lib/sidekiq/extensions/action_mailer.rb +1 -0
- data/lib/sidekiq/extensions/active_record.rb +1 -0
- data/lib/sidekiq/extensions/class_methods.rb +1 -0
- data/lib/sidekiq/extensions/generic_proxy.rb +8 -1
- data/lib/sidekiq/fetch.rb +36 -111
- data/lib/sidekiq/job_logger.rb +25 -0
- data/lib/sidekiq/job_retry.rb +262 -0
- data/lib/sidekiq/launcher.rb +129 -55
- data/lib/sidekiq/logging.rb +21 -3
- data/lib/sidekiq/manager.rb +83 -182
- data/lib/sidekiq/middleware/chain.rb +1 -0
- data/lib/sidekiq/middleware/i18n.rb +1 -0
- data/lib/sidekiq/middleware/server/active_record.rb +10 -0
- data/lib/sidekiq/paginator.rb +1 -0
- data/lib/sidekiq/processor.rb +221 -103
- data/lib/sidekiq/rails.rb +47 -27
- data/lib/sidekiq/redis_connection.rb +74 -7
- data/lib/sidekiq/scheduled.rb +87 -28
- data/lib/sidekiq/testing.rb +150 -19
- data/lib/sidekiq/testing/inline.rb +1 -0
- data/lib/sidekiq/util.rb +15 -17
- data/lib/sidekiq/version.rb +2 -1
- data/lib/sidekiq/web.rb +120 -184
- data/lib/sidekiq/web/action.rb +89 -0
- data/lib/sidekiq/web/application.rb +353 -0
- data/lib/sidekiq/{web_helpers.rb → web/helpers.rb} +123 -47
- data/lib/sidekiq/web/router.rb +100 -0
- data/lib/sidekiq/worker.rb +135 -18
- data/sidekiq.gemspec +8 -14
- data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
- data/web/assets/javascripts/application.js +24 -20
- data/web/assets/javascripts/dashboard.js +33 -18
- data/web/assets/stylesheets/application-rtl.css +246 -0
- data/web/assets/stylesheets/application.css +401 -7
- data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
- data/web/assets/stylesheets/bootstrap.css +4 -8
- data/web/locales/ar.yml +81 -0
- data/web/locales/cs.yml +11 -1
- data/web/locales/de.yml +1 -1
- data/web/locales/en.yml +4 -0
- data/web/locales/es.yml +4 -3
- data/web/locales/fa.yml +80 -0
- data/web/locales/fr.yml +21 -12
- data/web/locales/he.yml +79 -0
- data/web/locales/ja.yml +24 -13
- data/web/locales/ru.yml +3 -0
- data/web/locales/ur.yml +80 -0
- data/web/views/_footer.erb +7 -9
- data/web/views/_job_info.erb +5 -1
- data/web/views/_nav.erb +5 -19
- data/web/views/_paging.erb +1 -1
- data/web/views/busy.erb +18 -9
- data/web/views/dashboard.erb +5 -5
- data/web/views/dead.erb +1 -1
- data/web/views/layout.erb +13 -5
- data/web/views/morgue.erb +16 -12
- data/web/views/queue.erb +12 -11
- data/web/views/queues.erb +5 -3
- data/web/views/retries.erb +19 -13
- data/web/views/retry.erb +2 -2
- data/web/views/scheduled.erb +4 -4
- data/web/views/scheduled_job_info.erb +1 -1
- metadata +45 -227
- data/lib/sidekiq/actor.rb +0 -39
- data/lib/sidekiq/middleware/server/logging.rb +0 -40
- data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -206
- data/test/config.yml +0 -9
- data/test/env_based_config.yml +0 -11
- data/test/fake_env.rb +0 -0
- data/test/fixtures/en.yml +0 -2
- data/test/helper.rb +0 -49
- data/test/test_api.rb +0 -493
- data/test/test_cli.rb +0 -335
- data/test/test_client.rb +0 -194
- data/test/test_exception_handler.rb +0 -55
- data/test/test_extensions.rb +0 -126
- data/test/test_fetch.rb +0 -104
- data/test/test_logging.rb +0 -34
- data/test/test_manager.rb +0 -168
- data/test/test_middleware.rb +0 -159
- data/test/test_processor.rb +0 -237
- data/test/test_rails.rb +0 -21
- data/test/test_redis_connection.rb +0 -126
- data/test/test_retry.rb +0 -325
- data/test/test_scheduled.rb +0 -114
- data/test/test_scheduling.rb +0 -49
- data/test/test_sidekiq.rb +0 -99
- data/test/test_testing.rb +0 -142
- data/test/test_testing_fake.rb +0 -268
- data/test/test_testing_inline.rb +0 -93
- data/test/test_util.rb +0 -16
- data/test/test_web.rb +0 -608
- data/test/test_web_helpers.rb +0 -53
- 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.cs.js +0 -18
- data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
- 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_js.erb +0 -5
data/test/test_sidekiq.rb
DELETED
@@ -1,99 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require_relative 'helper'
|
3
|
-
|
4
|
-
class TestSidekiq < Sidekiq::Test
|
5
|
-
describe 'json processing' do
|
6
|
-
it 'handles json' do
|
7
|
-
assert_equal({"foo" => "bar"}, Sidekiq.load_json("{\"foo\":\"bar\"}"))
|
8
|
-
assert_equal "{\"foo\":\"bar\"}", Sidekiq.dump_json({ "foo" => "bar" })
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
describe "redis connection" do
|
13
|
-
it "returns error without creating a connection if block is not given" do
|
14
|
-
assert_raises(ArgumentError) do
|
15
|
-
Sidekiq.redis
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe "❨╯°□°❩╯︵┻━┻" do
|
21
|
-
before { $stdout = StringIO.new }
|
22
|
-
after { $stdout = STDOUT }
|
23
|
-
|
24
|
-
it "allows angry developers to express their emotional constitution and remedies it" do
|
25
|
-
Sidekiq.❨╯°□°❩╯︵┻━┻
|
26
|
-
assert_equal "Calm down, yo.\n", $stdout.string
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe 'lifecycle events' do
|
31
|
-
it 'handles invalid input' do
|
32
|
-
Sidekiq.options[:lifecycle_events][:startup].clear
|
33
|
-
|
34
|
-
e = assert_raises ArgumentError do
|
35
|
-
Sidekiq.on(:startp)
|
36
|
-
end
|
37
|
-
assert_match(/Invalid event name/, e.message)
|
38
|
-
e = assert_raises ArgumentError do
|
39
|
-
Sidekiq.on('startup')
|
40
|
-
end
|
41
|
-
assert_match(/Symbols only/, e.message)
|
42
|
-
Sidekiq.on(:startup) do
|
43
|
-
1 + 1
|
44
|
-
end
|
45
|
-
|
46
|
-
assert_equal 2, Sidekiq.options[:lifecycle_events][:startup].first.call
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe 'default_worker_options' do
|
51
|
-
it 'stringifies keys' do
|
52
|
-
@old_options = Sidekiq.default_worker_options
|
53
|
-
begin
|
54
|
-
Sidekiq.default_worker_options = { queue: 'cat'}
|
55
|
-
assert_equal 'cat', Sidekiq.default_worker_options['queue']
|
56
|
-
ensure
|
57
|
-
Sidekiq.default_worker_options = @old_options
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
describe 'error handling' do
|
63
|
-
it 'deals with user-specified error handlers which raise errors' do
|
64
|
-
output = capture_logging do
|
65
|
-
begin
|
66
|
-
Sidekiq.error_handlers << proc {|x, hash|
|
67
|
-
raise 'boom'
|
68
|
-
}
|
69
|
-
cli = Sidekiq::CLI.new
|
70
|
-
cli.handle_exception(RuntimeError.new("hello"))
|
71
|
-
ensure
|
72
|
-
Sidekiq.error_handlers.pop
|
73
|
-
end
|
74
|
-
end
|
75
|
-
assert_includes output, "boom"
|
76
|
-
assert_includes output, "ERROR"
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
describe 'redis connection' do
|
81
|
-
it 'does not continually retry' do
|
82
|
-
assert_raises Redis::CommandError do
|
83
|
-
Sidekiq.redis do |c|
|
84
|
-
raise Redis::CommandError, "READONLY You can't write against a read only slave."
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'reconnects if connection is flagged as readonly' do
|
90
|
-
counts = []
|
91
|
-
Sidekiq.redis do |c|
|
92
|
-
counts << c.info['total_connections_received'].to_i
|
93
|
-
raise Redis::CommandError, "READONLY You can't write against a read only slave." if counts.size == 1
|
94
|
-
end
|
95
|
-
assert_equal 2, counts.size
|
96
|
-
assert_equal counts[0] + 1, counts[1]
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
data/test/test_testing.rb
DELETED
@@ -1,142 +0,0 @@
|
|
1
|
-
require_relative 'helper'
|
2
|
-
|
3
|
-
require 'active_record'
|
4
|
-
require 'action_mailer'
|
5
|
-
require 'sidekiq/rails'
|
6
|
-
require 'sidekiq/extensions/action_mailer'
|
7
|
-
require 'sidekiq/extensions/active_record'
|
8
|
-
|
9
|
-
Sidekiq.hook_rails!
|
10
|
-
|
11
|
-
class TestTesting < Sidekiq::Test
|
12
|
-
describe 'sidekiq testing' do
|
13
|
-
describe 'require/load sidekiq/testing.rb' do
|
14
|
-
before do
|
15
|
-
require 'sidekiq/testing'
|
16
|
-
end
|
17
|
-
|
18
|
-
after do
|
19
|
-
Sidekiq::Testing.disable!
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'enables fake testing' do
|
23
|
-
Sidekiq::Testing.fake!
|
24
|
-
assert Sidekiq::Testing.enabled?
|
25
|
-
assert Sidekiq::Testing.fake?
|
26
|
-
refute Sidekiq::Testing.inline?
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'enables fake testing in a block' do
|
30
|
-
Sidekiq::Testing.disable!
|
31
|
-
assert Sidekiq::Testing.disabled?
|
32
|
-
refute Sidekiq::Testing.fake?
|
33
|
-
|
34
|
-
Sidekiq::Testing.fake! do
|
35
|
-
assert Sidekiq::Testing.enabled?
|
36
|
-
assert Sidekiq::Testing.fake?
|
37
|
-
refute Sidekiq::Testing.inline?
|
38
|
-
end
|
39
|
-
|
40
|
-
refute Sidekiq::Testing.enabled?
|
41
|
-
refute Sidekiq::Testing.fake?
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'disables testing in a block' do
|
45
|
-
Sidekiq::Testing.fake!
|
46
|
-
assert Sidekiq::Testing.fake?
|
47
|
-
|
48
|
-
Sidekiq::Testing.disable! do
|
49
|
-
refute Sidekiq::Testing.fake?
|
50
|
-
assert Sidekiq::Testing.disabled?
|
51
|
-
end
|
52
|
-
|
53
|
-
assert Sidekiq::Testing.fake?
|
54
|
-
assert Sidekiq::Testing.enabled?
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
describe 'require/load sidekiq/testing/inline.rb' do
|
59
|
-
before do
|
60
|
-
require 'sidekiq/testing/inline'
|
61
|
-
end
|
62
|
-
|
63
|
-
after do
|
64
|
-
Sidekiq::Testing.disable!
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'enables inline testing' do
|
68
|
-
Sidekiq::Testing.inline!
|
69
|
-
assert Sidekiq::Testing.enabled?
|
70
|
-
assert Sidekiq::Testing.inline?
|
71
|
-
refute Sidekiq::Testing.fake?
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'enables inline testing in a block' do
|
75
|
-
Sidekiq::Testing.disable!
|
76
|
-
assert Sidekiq::Testing.disabled?
|
77
|
-
refute Sidekiq::Testing.fake?
|
78
|
-
|
79
|
-
Sidekiq::Testing.inline! do
|
80
|
-
assert Sidekiq::Testing.enabled?
|
81
|
-
assert Sidekiq::Testing.inline?
|
82
|
-
end
|
83
|
-
|
84
|
-
refute Sidekiq::Testing.enabled?
|
85
|
-
refute Sidekiq::Testing.inline?
|
86
|
-
refute Sidekiq::Testing.fake?
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
describe 'with middleware' do
|
92
|
-
before do
|
93
|
-
require 'sidekiq/testing'
|
94
|
-
end
|
95
|
-
|
96
|
-
after do
|
97
|
-
Sidekiq::Testing.disable!
|
98
|
-
end
|
99
|
-
|
100
|
-
class AttributeWorker
|
101
|
-
include Sidekiq::Worker
|
102
|
-
class_attribute :count
|
103
|
-
self.count = 0
|
104
|
-
attr_accessor :foo
|
105
|
-
|
106
|
-
def perform
|
107
|
-
self.class.count += 1 if foo == :bar
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
class AttributeMiddleware
|
112
|
-
def call(worker, msg, queue)
|
113
|
-
worker.foo = :bar if worker.respond_to?(:foo=)
|
114
|
-
yield
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'wraps the inlined worker with middleware' do
|
119
|
-
Sidekiq::Testing.server_middleware do |chain|
|
120
|
-
chain.add AttributeMiddleware
|
121
|
-
end
|
122
|
-
|
123
|
-
begin
|
124
|
-
Sidekiq::Testing.fake! do
|
125
|
-
AttributeWorker.perform_async
|
126
|
-
assert_equal 0, AttributeWorker.count
|
127
|
-
end
|
128
|
-
|
129
|
-
AttributeWorker.perform_one
|
130
|
-
assert_equal 1, AttributeWorker.count
|
131
|
-
|
132
|
-
Sidekiq::Testing.inline! do
|
133
|
-
AttributeWorker.perform_async
|
134
|
-
assert_equal 2, AttributeWorker.count
|
135
|
-
end
|
136
|
-
ensure
|
137
|
-
Sidekiq::Testing.server_middleware.clear
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
end
|
data/test/test_testing_fake.rb
DELETED
@@ -1,268 +0,0 @@
|
|
1
|
-
require_relative 'helper'
|
2
|
-
|
3
|
-
require 'active_record'
|
4
|
-
require 'action_mailer'
|
5
|
-
require 'sidekiq/rails'
|
6
|
-
require 'sidekiq/extensions/action_mailer'
|
7
|
-
require 'sidekiq/extensions/active_record'
|
8
|
-
|
9
|
-
Sidekiq.hook_rails!
|
10
|
-
|
11
|
-
class TestTesting < Sidekiq::Test
|
12
|
-
describe 'sidekiq testing' do
|
13
|
-
class PerformError < RuntimeError; end
|
14
|
-
|
15
|
-
class DirectWorker
|
16
|
-
include Sidekiq::Worker
|
17
|
-
def perform(a, b)
|
18
|
-
a + b
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
class EnqueuedWorker
|
23
|
-
include Sidekiq::Worker
|
24
|
-
def perform(a, b)
|
25
|
-
a + b
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class StoredWorker
|
30
|
-
include Sidekiq::Worker
|
31
|
-
def perform(error)
|
32
|
-
raise PerformError if error
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class FooMailer < ActionMailer::Base
|
37
|
-
def bar(str)
|
38
|
-
str
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
class FooModel < ActiveRecord::Base
|
43
|
-
def bar(str)
|
44
|
-
str
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
before do
|
49
|
-
require 'sidekiq/testing'
|
50
|
-
Sidekiq::Testing.fake!
|
51
|
-
EnqueuedWorker.jobs.clear
|
52
|
-
DirectWorker.jobs.clear
|
53
|
-
end
|
54
|
-
|
55
|
-
after do
|
56
|
-
Sidekiq::Testing.disable!
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'stubs the async call' do
|
60
|
-
assert_equal 0, DirectWorker.jobs.size
|
61
|
-
assert DirectWorker.perform_async(1, 2)
|
62
|
-
assert_equal 1, DirectWorker.jobs.size
|
63
|
-
assert DirectWorker.perform_in(10, 1, 2)
|
64
|
-
assert_equal 2, DirectWorker.jobs.size
|
65
|
-
assert DirectWorker.perform_at(10, 1, 2)
|
66
|
-
assert_equal 3, DirectWorker.jobs.size
|
67
|
-
assert_in_delta 10.seconds.from_now.to_f, DirectWorker.jobs.last['at'], 0.01
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'stubs the delay call on mailers' do
|
71
|
-
assert_equal 0, Sidekiq::Extensions::DelayedMailer.jobs.size
|
72
|
-
FooMailer.delay.bar('hello!')
|
73
|
-
assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs.size
|
74
|
-
end
|
75
|
-
|
76
|
-
class Something
|
77
|
-
def self.foo(x)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
it 'stubs the delay call on models' do
|
82
|
-
assert_equal 0, Sidekiq::Extensions::DelayedClass.jobs.size
|
83
|
-
Something.delay.foo(Date.today)
|
84
|
-
assert_equal 1, Sidekiq::Extensions::DelayedClass.jobs.size
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'stubs the enqueue call' do
|
88
|
-
assert_equal 0, EnqueuedWorker.jobs.size
|
89
|
-
assert Sidekiq::Client.enqueue(EnqueuedWorker, 1, 2)
|
90
|
-
assert_equal 1, EnqueuedWorker.jobs.size
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'stubs the enqueue_to call' do
|
94
|
-
assert_equal 0, EnqueuedWorker.jobs.size
|
95
|
-
assert Sidekiq::Client.enqueue_to('someq', EnqueuedWorker, 1, 2)
|
96
|
-
assert_equal 1, EnqueuedWorker.jobs.size
|
97
|
-
end
|
98
|
-
|
99
|
-
it 'executes all stored jobs' do
|
100
|
-
assert StoredWorker.perform_async(false)
|
101
|
-
assert StoredWorker.perform_async(true)
|
102
|
-
|
103
|
-
assert_equal 2, StoredWorker.jobs.size
|
104
|
-
assert_raises PerformError do
|
105
|
-
StoredWorker.drain
|
106
|
-
end
|
107
|
-
assert_equal 0, StoredWorker.jobs.size
|
108
|
-
end
|
109
|
-
|
110
|
-
class SpecificJidWorker
|
111
|
-
include Sidekiq::Worker
|
112
|
-
class_attribute :count
|
113
|
-
self.count = 0
|
114
|
-
def perform(worker_jid)
|
115
|
-
return unless worker_jid == self.jid
|
116
|
-
self.class.count += 1
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
it 'execute only jobs with assigned JID' do
|
121
|
-
4.times do |i|
|
122
|
-
jid = SpecificJidWorker.perform_async(nil)
|
123
|
-
if i % 2 == 0
|
124
|
-
SpecificJidWorker.jobs[-1]["args"] = ["wrong_jid"]
|
125
|
-
else
|
126
|
-
SpecificJidWorker.jobs[-1]["args"] = [jid]
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
SpecificJidWorker.perform_one
|
131
|
-
assert_equal 0, SpecificJidWorker.count
|
132
|
-
|
133
|
-
SpecificJidWorker.perform_one
|
134
|
-
assert_equal 1, SpecificJidWorker.count
|
135
|
-
|
136
|
-
SpecificJidWorker.drain
|
137
|
-
assert_equal 2, SpecificJidWorker.count
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'round trip serializes the job arguments' do
|
141
|
-
assert StoredWorker.perform_async(:mike)
|
142
|
-
job = StoredWorker.jobs.first
|
143
|
-
assert_equal "mike", job['args'].first
|
144
|
-
StoredWorker.clear
|
145
|
-
end
|
146
|
-
|
147
|
-
it 'perform_one runs only one job' do
|
148
|
-
DirectWorker.perform_async(1, 2)
|
149
|
-
DirectWorker.perform_async(3, 4)
|
150
|
-
assert_equal 2, DirectWorker.jobs.size
|
151
|
-
|
152
|
-
DirectWorker.perform_one
|
153
|
-
assert_equal 1, DirectWorker.jobs.size
|
154
|
-
|
155
|
-
DirectWorker.clear
|
156
|
-
end
|
157
|
-
|
158
|
-
it 'perform_one raise error upon empty queue' do
|
159
|
-
DirectWorker.clear
|
160
|
-
assert_raises Sidekiq::EmptyQueueError do
|
161
|
-
DirectWorker.perform_one
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
class FirstWorker
|
166
|
-
include Sidekiq::Worker
|
167
|
-
class_attribute :count
|
168
|
-
self.count = 0
|
169
|
-
def perform
|
170
|
-
self.class.count += 1
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
class SecondWorker
|
175
|
-
include Sidekiq::Worker
|
176
|
-
class_attribute :count
|
177
|
-
self.count = 0
|
178
|
-
def perform
|
179
|
-
self.class.count += 1
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
class ThirdWorker
|
184
|
-
include Sidekiq::Worker
|
185
|
-
class_attribute :count
|
186
|
-
def perform
|
187
|
-
FirstWorker.perform_async
|
188
|
-
SecondWorker.perform_async
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
it 'clears jobs across all workers' do
|
193
|
-
Sidekiq::Worker.jobs.clear
|
194
|
-
FirstWorker.count = 0
|
195
|
-
SecondWorker.count = 0
|
196
|
-
|
197
|
-
assert_equal 0, FirstWorker.jobs.size
|
198
|
-
assert_equal 0, SecondWorker.jobs.size
|
199
|
-
|
200
|
-
FirstWorker.perform_async
|
201
|
-
SecondWorker.perform_async
|
202
|
-
|
203
|
-
assert_equal 1, FirstWorker.jobs.size
|
204
|
-
assert_equal 1, SecondWorker.jobs.size
|
205
|
-
|
206
|
-
Sidekiq::Worker.clear_all
|
207
|
-
|
208
|
-
assert_equal 0, FirstWorker.jobs.size
|
209
|
-
assert_equal 0, SecondWorker.jobs.size
|
210
|
-
|
211
|
-
assert_equal 0, FirstWorker.count
|
212
|
-
assert_equal 0, SecondWorker.count
|
213
|
-
end
|
214
|
-
|
215
|
-
it 'drains jobs across all workers' do
|
216
|
-
Sidekiq::Worker.jobs.clear
|
217
|
-
FirstWorker.count = 0
|
218
|
-
SecondWorker.count = 0
|
219
|
-
|
220
|
-
assert_equal 0, FirstWorker.jobs.size
|
221
|
-
assert_equal 0, SecondWorker.jobs.size
|
222
|
-
|
223
|
-
assert_equal 0, FirstWorker.count
|
224
|
-
assert_equal 0, SecondWorker.count
|
225
|
-
|
226
|
-
FirstWorker.perform_async
|
227
|
-
SecondWorker.perform_async
|
228
|
-
|
229
|
-
assert_equal 1, FirstWorker.jobs.size
|
230
|
-
assert_equal 1, SecondWorker.jobs.size
|
231
|
-
|
232
|
-
Sidekiq::Worker.drain_all
|
233
|
-
|
234
|
-
assert_equal 0, FirstWorker.jobs.size
|
235
|
-
assert_equal 0, SecondWorker.jobs.size
|
236
|
-
|
237
|
-
assert_equal 1, FirstWorker.count
|
238
|
-
assert_equal 1, SecondWorker.count
|
239
|
-
end
|
240
|
-
|
241
|
-
it 'drains jobs across all workers even when workers create new jobs' do
|
242
|
-
Sidekiq::Worker.jobs.clear
|
243
|
-
FirstWorker.count = 0
|
244
|
-
SecondWorker.count = 0
|
245
|
-
|
246
|
-
assert_equal 0, ThirdWorker.jobs.size
|
247
|
-
|
248
|
-
assert_equal 0, FirstWorker.count
|
249
|
-
assert_equal 0, SecondWorker.count
|
250
|
-
|
251
|
-
ThirdWorker.perform_async
|
252
|
-
|
253
|
-
assert_equal 1, ThirdWorker.jobs.size
|
254
|
-
|
255
|
-
Sidekiq::Worker.drain_all
|
256
|
-
|
257
|
-
assert_equal 0, ThirdWorker.jobs.size
|
258
|
-
|
259
|
-
assert_equal 1, FirstWorker.count
|
260
|
-
assert_equal 1, SecondWorker.count
|
261
|
-
end
|
262
|
-
|
263
|
-
it 'can execute a job' do
|
264
|
-
DirectWorker.execute_job(DirectWorker.new, [2, 3])
|
265
|
-
end
|
266
|
-
|
267
|
-
end
|
268
|
-
end
|