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
@@ -1,124 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq'
|
3
|
-
require 'sidekiq/exception_handler'
|
4
|
-
require 'stringio'
|
5
|
-
require 'logger'
|
6
|
-
|
7
|
-
ExceptionHandlerTestException = Class.new(StandardError)
|
8
|
-
TEST_EXCEPTION = ExceptionHandlerTestException.new("Something didn't work!")
|
9
|
-
|
10
|
-
class Component
|
11
|
-
include Sidekiq::ExceptionHandler
|
12
|
-
|
13
|
-
def invoke_exception(args)
|
14
|
-
raise TEST_EXCEPTION
|
15
|
-
rescue ExceptionHandlerTestException => e
|
16
|
-
handle_exception(e,args)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
class TestExceptionHandler < Sidekiq::Test
|
21
|
-
describe "with mock logger" do
|
22
|
-
before do
|
23
|
-
@old_logger = Sidekiq.logger
|
24
|
-
@str_logger = StringIO.new
|
25
|
-
Sidekiq.logger = Logger.new(@str_logger)
|
26
|
-
end
|
27
|
-
|
28
|
-
after do
|
29
|
-
Sidekiq.logger = @old_logger
|
30
|
-
end
|
31
|
-
|
32
|
-
it "logs the exception to Sidekiq.logger" do
|
33
|
-
Component.new.invoke_exception(:a => 1)
|
34
|
-
@str_logger.rewind
|
35
|
-
log = @str_logger.readlines
|
36
|
-
assert_match /a=>1/, log[0], "didn't include the context"
|
37
|
-
assert_match /Something didn't work!/, log[1], "didn't include the exception message"
|
38
|
-
assert_match /test\/test_exception_handler.rb/, log[2], "didn't include the backtrace"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe "with fake Airbrake" do
|
43
|
-
before do
|
44
|
-
::Airbrake = Minitest::Mock.new
|
45
|
-
end
|
46
|
-
|
47
|
-
after do
|
48
|
-
Object.send(:remove_const, "Airbrake") # HACK should probably inject Airbrake etc into this class in the future
|
49
|
-
end
|
50
|
-
|
51
|
-
it "notifies Airbrake" do
|
52
|
-
::Airbrake.expect(:notify_or_ignore,nil,[TEST_EXCEPTION,:parameters => { :a => 1 }])
|
53
|
-
Component.new.invoke_exception(:a => 1)
|
54
|
-
::Airbrake.verify
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
describe "with fake Honeybadger" do
|
59
|
-
before do
|
60
|
-
::Honeybadger = Minitest::Mock.new
|
61
|
-
end
|
62
|
-
|
63
|
-
after do
|
64
|
-
Object.send(:remove_const, "Honeybadger") # HACK should probably inject Honeybadger etc into this class in the future
|
65
|
-
end
|
66
|
-
|
67
|
-
it "notifies Honeybadger" do
|
68
|
-
::Honeybadger.expect(:notify_or_ignore,nil,[TEST_EXCEPTION,:parameters => { :a => 1 }])
|
69
|
-
Component.new.invoke_exception(:a => 1)
|
70
|
-
::Honeybadger.verify
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
describe "with fake ExceptionNotifier" do
|
75
|
-
before do
|
76
|
-
::ExceptionNotifier = MiniTest::Mock.new
|
77
|
-
end
|
78
|
-
|
79
|
-
after do
|
80
|
-
Object.send(:remove_const, "ExceptionNotifier")
|
81
|
-
end
|
82
|
-
|
83
|
-
it "notifies ExceptionNotifier" do
|
84
|
-
::ExceptionNotifier.expect(:notify_exception,true,[TEST_EXCEPTION, :data => { :message => { :b => 2 } }])
|
85
|
-
Component.new.invoke_exception(:b => 2)
|
86
|
-
::ExceptionNotifier.verify
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe "with fake Exceptional" do
|
91
|
-
before do
|
92
|
-
::Exceptional = Class.new do
|
93
|
-
|
94
|
-
def self.context(msg)
|
95
|
-
@msg = msg
|
96
|
-
end
|
97
|
-
|
98
|
-
def self.check_context
|
99
|
-
@msg
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
::Exceptional::Config = Minitest::Mock.new
|
104
|
-
::Exceptional::Remote = Minitest::Mock.new
|
105
|
-
::Exceptional::ExceptionData = Minitest::Mock.new
|
106
|
-
end
|
107
|
-
|
108
|
-
after do
|
109
|
-
Object.send(:remove_const, "Exceptional")
|
110
|
-
end
|
111
|
-
|
112
|
-
it "notifies Exceptional" do
|
113
|
-
::Exceptional::Config.expect(:should_send_to_api?,true)
|
114
|
-
exception_data = Object.new
|
115
|
-
::Exceptional::Remote.expect(:error,nil,[exception_data])
|
116
|
-
::Exceptional::ExceptionData.expect(:new,exception_data,[TEST_EXCEPTION])
|
117
|
-
Component.new.invoke_exception(:c => 3)
|
118
|
-
assert_equal({:c => 3},::Exceptional.check_context,"did not record arguments properly")
|
119
|
-
::Exceptional::Config.verify
|
120
|
-
::Exceptional::Remote.verify
|
121
|
-
::Exceptional::ExceptionData.verify
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
data/test/test_extensions.rb
DELETED
@@ -1,105 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq'
|
3
|
-
require 'active_record'
|
4
|
-
require 'action_mailer'
|
5
|
-
require 'sidekiq/extensions/action_mailer'
|
6
|
-
require 'sidekiq/extensions/active_record'
|
7
|
-
require 'sidekiq/rails'
|
8
|
-
|
9
|
-
Sidekiq.hook_rails!
|
10
|
-
|
11
|
-
class TestExtensions < Sidekiq::Test
|
12
|
-
describe 'sidekiq extensions' do
|
13
|
-
before do
|
14
|
-
Sidekiq.redis = REDIS
|
15
|
-
Sidekiq.redis {|c| c.flushdb }
|
16
|
-
end
|
17
|
-
|
18
|
-
class MyModel < ActiveRecord::Base
|
19
|
-
def self.long_class_method
|
20
|
-
raise "Should not be called!"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'allows delayed execution of ActiveRecord class methods' do
|
25
|
-
assert_equal [], Sidekiq::Client.registered_queues
|
26
|
-
assert_equal 0, Sidekiq.redis {|c| c.llen('queue:default') }
|
27
|
-
MyModel.delay.long_class_method
|
28
|
-
assert_equal ['default'], Sidekiq::Client.registered_queues
|
29
|
-
assert_equal 1, Sidekiq.redis {|c| c.llen('queue:default') }
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'uses and stringifies specified options' do
|
33
|
-
assert_equal [], Sidekiq::Client.registered_queues
|
34
|
-
assert_equal 0, Sidekiq.redis {|c| c.llen('queue:notdefault') }
|
35
|
-
MyModel.delay(queue: :notdefault).long_class_method
|
36
|
-
assert_equal ['notdefault'], Sidekiq::Client.registered_queues
|
37
|
-
assert_equal 1, Sidekiq.redis {|c| c.llen('queue:notdefault') }
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'allows delayed scheduling of AR class methods' do
|
41
|
-
assert_equal 0, Sidekiq.redis {|c| c.zcard('schedule') }
|
42
|
-
MyModel.delay_for(5.days).long_class_method
|
43
|
-
assert_equal 1, Sidekiq.redis {|c| c.zcard('schedule') }
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'allows until delayed scheduling of AR class methods' do
|
47
|
-
assert_equal 0, Sidekiq.redis {|c| c.zcard('schedule') }
|
48
|
-
MyModel.delay_until(1.day.from_now).long_class_method
|
49
|
-
assert_equal 1, Sidekiq.redis {|c| c.zcard('schedule') }
|
50
|
-
end
|
51
|
-
|
52
|
-
class UserMailer < ActionMailer::Base
|
53
|
-
def greetings(a, b)
|
54
|
-
raise "Should not be called!"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'allows delayed delivery of ActionMailer mails' do
|
59
|
-
assert_equal [], Sidekiq::Client.registered_queues
|
60
|
-
assert_equal 0, Sidekiq.redis {|c| c.llen('queue:default') }
|
61
|
-
UserMailer.delay.greetings(1, 2)
|
62
|
-
assert_equal ['default'], Sidekiq::Client.registered_queues
|
63
|
-
assert_equal 1, Sidekiq.redis {|c| c.llen('queue:default') }
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'allows delayed scheduling of AM mails' do
|
67
|
-
assert_equal 0, Sidekiq.redis {|c| c.zcard('schedule') }
|
68
|
-
UserMailer.delay_for(5.days).greetings(1, 2)
|
69
|
-
assert_equal 1, Sidekiq.redis {|c| c.zcard('schedule') }
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'allows until delay scheduling of AM mails' do
|
73
|
-
assert_equal 0, Sidekiq.redis {|c| c.zcard('schedule') }
|
74
|
-
UserMailer.delay_until(5.days.from_now).greetings(1, 2)
|
75
|
-
assert_equal 1, Sidekiq.redis {|c| c.zcard('schedule') }
|
76
|
-
end
|
77
|
-
|
78
|
-
class SomeClass
|
79
|
-
def self.doit(arg)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'allows delay of any ole class method' do
|
84
|
-
assert_equal 0, queue_size
|
85
|
-
SomeClass.delay.doit(Date.today)
|
86
|
-
assert_equal 1, queue_size
|
87
|
-
end
|
88
|
-
|
89
|
-
module SomeModule
|
90
|
-
def self.doit(arg)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
it 'allows delay of any module class method' do
|
95
|
-
assert_equal 0, queue_size
|
96
|
-
SomeModule.delay.doit(Date.today)
|
97
|
-
assert_equal 1, queue_size
|
98
|
-
end
|
99
|
-
|
100
|
-
def queue_size(name='default')
|
101
|
-
Sidekiq::Queue.new(name).size
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
data/test/test_fetch.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq/fetch'
|
3
|
-
|
4
|
-
class TestFetcher < Sidekiq::Test
|
5
|
-
describe 'fetcher' do
|
6
|
-
before do
|
7
|
-
Sidekiq.redis = { :namespace => 'fuzzy' }
|
8
|
-
Sidekiq.redis do |conn|
|
9
|
-
conn.flushdb
|
10
|
-
conn.rpush('queue:basic', 'msg')
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'retrieves' do
|
15
|
-
fetch = Sidekiq::BasicFetch.new(:queues => ['basic', 'bar'])
|
16
|
-
uow = fetch.retrieve_work
|
17
|
-
refute_nil uow
|
18
|
-
assert_equal 'basic', uow.queue_name
|
19
|
-
assert_equal 'msg', uow.message
|
20
|
-
q = Sidekiq::Queue.new('basic')
|
21
|
-
assert_equal 0, q.size
|
22
|
-
uow.requeue
|
23
|
-
assert_equal 1, q.size
|
24
|
-
assert_nil uow.acknowledge
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'retrieves with strict setting' do
|
28
|
-
fetch = Sidekiq::BasicFetch.new(:queues => ['basic', 'bar', 'bar'], :strict => true)
|
29
|
-
cmd = fetch.queues_cmd
|
30
|
-
assert_equal cmd, ['queue:basic', 'queue:bar', 1]
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'bulk requeues' do
|
34
|
-
q1 = Sidekiq::Queue.new('foo')
|
35
|
-
q2 = Sidekiq::Queue.new('bar')
|
36
|
-
assert_equal 0, q1.size
|
37
|
-
assert_equal 0, q2.size
|
38
|
-
uow = Sidekiq::BasicFetch::UnitOfWork
|
39
|
-
Sidekiq::BasicFetch.bulk_requeue([uow.new('fuzzy:queue:foo', 'bob'), uow.new('fuzzy:queue:foo', 'bar'), uow.new('fuzzy:queue:bar', 'widget')])
|
40
|
-
assert_equal 2, q1.size
|
41
|
-
assert_equal 1, q2.size
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
data/test/test_manager.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq/manager'
|
3
|
-
|
4
|
-
class TestManager < Sidekiq::Test
|
5
|
-
|
6
|
-
describe 'manager' do
|
7
|
-
it 'creates N processor instances' do
|
8
|
-
mgr = Sidekiq::Manager.new(options)
|
9
|
-
assert_equal options[:concurrency], mgr.ready.size
|
10
|
-
assert_equal [], mgr.busy
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'assigns work to a processor' do
|
14
|
-
uow = Minitest::Mock.new
|
15
|
-
processor = Minitest::Mock.new
|
16
|
-
processor.expect(:async, processor, [])
|
17
|
-
processor.expect(:process, nil, [uow])
|
18
|
-
|
19
|
-
mgr = Sidekiq::Manager.new(options)
|
20
|
-
mgr.ready << processor
|
21
|
-
mgr.assign(uow)
|
22
|
-
assert_equal 1, mgr.busy.size
|
23
|
-
|
24
|
-
processor.verify
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'requeues work if stopping' do
|
28
|
-
uow = Minitest::Mock.new
|
29
|
-
uow.expect(:requeue, nil, [])
|
30
|
-
|
31
|
-
mgr = Sidekiq::Manager.new(options)
|
32
|
-
mgr.stop
|
33
|
-
mgr.assign(uow)
|
34
|
-
uow.verify
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'shuts down the system' do
|
38
|
-
mgr = Sidekiq::Manager.new(options)
|
39
|
-
mgr.stop
|
40
|
-
|
41
|
-
assert mgr.busy.empty?
|
42
|
-
assert mgr.ready.empty?
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'returns finished processors to the ready pool' do
|
46
|
-
fetcher = MiniTest::Mock.new
|
47
|
-
fetcher.expect :async, fetcher, []
|
48
|
-
fetcher.expect :fetch, nil, []
|
49
|
-
mgr = Sidekiq::Manager.new(options)
|
50
|
-
mgr.fetcher = fetcher
|
51
|
-
init_size = mgr.ready.size
|
52
|
-
processor = mgr.ready.pop
|
53
|
-
mgr.busy << processor
|
54
|
-
mgr.processor_done(processor)
|
55
|
-
|
56
|
-
assert_equal 0, mgr.busy.size
|
57
|
-
assert_equal init_size, mgr.ready.size
|
58
|
-
fetcher.verify
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'throws away dead processors' do
|
62
|
-
fetcher = MiniTest::Mock.new
|
63
|
-
fetcher.expect :async, fetcher, []
|
64
|
-
fetcher.expect :fetch, nil, []
|
65
|
-
mgr = Sidekiq::Manager.new(options)
|
66
|
-
mgr.fetcher = fetcher
|
67
|
-
init_size = mgr.ready.size
|
68
|
-
processor = mgr.ready.pop
|
69
|
-
mgr.busy << processor
|
70
|
-
mgr.processor_died(processor, 'ignored')
|
71
|
-
|
72
|
-
assert_equal 0, mgr.busy.size
|
73
|
-
assert_equal init_size, mgr.ready.size
|
74
|
-
refute mgr.ready.include?(processor)
|
75
|
-
fetcher.verify
|
76
|
-
end
|
77
|
-
|
78
|
-
def options
|
79
|
-
{ :concurrency => 3, :queues => ['default'] }
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
data/test/test_middleware.rb
DELETED
@@ -1,135 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq/middleware/chain'
|
3
|
-
require 'sidekiq/processor'
|
4
|
-
|
5
|
-
class TestMiddleware < Sidekiq::Test
|
6
|
-
describe 'middleware chain' do
|
7
|
-
before do
|
8
|
-
$errors = []
|
9
|
-
Sidekiq.redis = REDIS
|
10
|
-
end
|
11
|
-
|
12
|
-
class CustomMiddleware
|
13
|
-
def initialize(name, recorder)
|
14
|
-
@name = name
|
15
|
-
@recorder = recorder
|
16
|
-
end
|
17
|
-
|
18
|
-
def call(*args)
|
19
|
-
@recorder << [@name, 'before']
|
20
|
-
yield
|
21
|
-
@recorder << [@name, 'after']
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'supports custom middleware' do
|
26
|
-
chain = Sidekiq::Middleware::Chain.new
|
27
|
-
chain.add CustomMiddleware, 1, []
|
28
|
-
|
29
|
-
assert_equal CustomMiddleware, chain.entries.last.klass
|
30
|
-
end
|
31
|
-
|
32
|
-
class CustomWorker
|
33
|
-
$recorder = []
|
34
|
-
include Sidekiq::Worker
|
35
|
-
def perform(recorder)
|
36
|
-
$recorder << ['work_performed']
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
class NonYieldingMiddleware
|
41
|
-
def call(*args)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
class AnotherCustomMiddleware
|
46
|
-
def initialize(name, recorder)
|
47
|
-
@name = name
|
48
|
-
@recorder = recorder
|
49
|
-
end
|
50
|
-
|
51
|
-
def call(*args)
|
52
|
-
@recorder << [@name, 'before']
|
53
|
-
yield
|
54
|
-
@recorder << [@name, 'after']
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
class YetAnotherCustomMiddleware
|
59
|
-
def initialize(name, recorder)
|
60
|
-
@name = name
|
61
|
-
@recorder = recorder
|
62
|
-
end
|
63
|
-
|
64
|
-
def call(*args)
|
65
|
-
@recorder << [@name, 'before']
|
66
|
-
yield
|
67
|
-
@recorder << [@name, 'after']
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'executes middleware in the proper order' do
|
72
|
-
msg = Sidekiq.dump_json({ 'class' => CustomWorker.to_s, 'args' => [$recorder] })
|
73
|
-
|
74
|
-
Sidekiq.server_middleware do |chain|
|
75
|
-
# should only add once, second should replace the first
|
76
|
-
2.times { |i| chain.add CustomMiddleware, i.to_s, $recorder }
|
77
|
-
chain.insert_before CustomMiddleware, AnotherCustomMiddleware, '2', $recorder
|
78
|
-
chain.insert_after AnotherCustomMiddleware, YetAnotherCustomMiddleware, '3', $recorder
|
79
|
-
end
|
80
|
-
|
81
|
-
boss = Minitest::Mock.new
|
82
|
-
processor = Sidekiq::Processor.new(boss)
|
83
|
-
actor = Minitest::Mock.new
|
84
|
-
actor.expect(:processor_done, nil, [processor])
|
85
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
86
|
-
boss.expect(:async, actor, [])
|
87
|
-
boss.expect(:async, actor, [])
|
88
|
-
processor.process(Sidekiq::BasicFetch::UnitOfWork.new('queue:default', msg))
|
89
|
-
assert_equal %w(2 before 3 before 1 before work_performed 1 after 3 after 2 after), $recorder.flatten
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'correctly replaces middleware when using middleware with options in the initializer' do
|
93
|
-
chain = Sidekiq::Middleware::Chain.new
|
94
|
-
chain.add Sidekiq::Middleware::Server::RetryJobs
|
95
|
-
chain.add Sidekiq::Middleware::Server::RetryJobs, {:max_retries => 5}
|
96
|
-
assert_equal 1, chain.count
|
97
|
-
end
|
98
|
-
|
99
|
-
it 'allows middleware to abruptly stop processing rest of chain' do
|
100
|
-
recorder = []
|
101
|
-
chain = Sidekiq::Middleware::Chain.new
|
102
|
-
chain.add NonYieldingMiddleware
|
103
|
-
chain.add CustomMiddleware, 1, recorder
|
104
|
-
|
105
|
-
final_action = nil
|
106
|
-
chain.invoke { final_action = true }
|
107
|
-
assert_equal nil, final_action
|
108
|
-
assert_equal [], recorder
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
describe 'i18n' do
|
113
|
-
before do
|
114
|
-
require 'i18n'
|
115
|
-
require 'sidekiq/middleware/i18n'
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'saves and restores locale' do
|
119
|
-
I18n.locale = 'fr'
|
120
|
-
msg = {}
|
121
|
-
mw = Sidekiq::Middleware::I18n::Client.new
|
122
|
-
mw.call(nil, msg, nil) { }
|
123
|
-
assert_equal :fr, msg['locale']
|
124
|
-
|
125
|
-
msg['locale'] = 'jp'
|
126
|
-
I18n.locale = nil
|
127
|
-
assert_equal :en, I18n.locale
|
128
|
-
mw = Sidekiq::Middleware::I18n::Server.new
|
129
|
-
mw.call(nil, msg, nil) do
|
130
|
-
assert_equal :jp, I18n.locale
|
131
|
-
end
|
132
|
-
assert_equal :en, I18n.locale
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|