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.

Files changed (187) hide show
  1. checksums.yaml +7 -0
  2. data/.github/contributing.md +32 -0
  3. data/.github/issue_template.md +9 -0
  4. data/.gitignore +1 -0
  5. data/.travis.yml +16 -17
  6. data/3.0-Upgrade.md +70 -0
  7. data/4.0-Upgrade.md +53 -0
  8. data/COMM-LICENSE +56 -44
  9. data/Changes.md +644 -1
  10. data/Ent-Changes.md +173 -0
  11. data/Gemfile +27 -0
  12. data/LICENSE +1 -1
  13. data/Pro-2.0-Upgrade.md +138 -0
  14. data/Pro-3.0-Upgrade.md +44 -0
  15. data/Pro-Changes.md +457 -3
  16. data/README.md +46 -29
  17. data/Rakefile +6 -3
  18. data/bin/sidekiq +4 -0
  19. data/bin/sidekiqctl +41 -20
  20. data/bin/sidekiqload +154 -0
  21. data/code_of_conduct.md +50 -0
  22. data/lib/generators/sidekiq/templates/worker.rb.erb +9 -0
  23. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +6 -0
  24. data/lib/generators/sidekiq/templates/worker_test.rb.erb +8 -0
  25. data/lib/generators/sidekiq/worker_generator.rb +49 -0
  26. data/lib/sidekiq.rb +141 -29
  27. data/lib/sidekiq/api.rb +540 -106
  28. data/lib/sidekiq/cli.rb +131 -71
  29. data/lib/sidekiq/client.rb +168 -96
  30. data/lib/sidekiq/core_ext.rb +36 -8
  31. data/lib/sidekiq/exception_handler.rb +20 -28
  32. data/lib/sidekiq/extensions/action_mailer.rb +25 -5
  33. data/lib/sidekiq/extensions/active_record.rb +8 -4
  34. data/lib/sidekiq/extensions/class_methods.rb +9 -5
  35. data/lib/sidekiq/extensions/generic_proxy.rb +1 -0
  36. data/lib/sidekiq/fetch.rb +45 -101
  37. data/lib/sidekiq/launcher.rb +144 -30
  38. data/lib/sidekiq/logging.rb +69 -12
  39. data/lib/sidekiq/manager.rb +90 -140
  40. data/lib/sidekiq/middleware/chain.rb +18 -5
  41. data/lib/sidekiq/middleware/i18n.rb +9 -2
  42. data/lib/sidekiq/middleware/server/active_record.rb +1 -1
  43. data/lib/sidekiq/middleware/server/logging.rb +11 -11
  44. data/lib/sidekiq/middleware/server/retry_jobs.rb +98 -44
  45. data/lib/sidekiq/paginator.rb +20 -8
  46. data/lib/sidekiq/processor.rb +157 -96
  47. data/lib/sidekiq/rails.rb +109 -5
  48. data/lib/sidekiq/redis_connection.rb +70 -24
  49. data/lib/sidekiq/scheduled.rb +122 -50
  50. data/lib/sidekiq/testing.rb +171 -31
  51. data/lib/sidekiq/testing/inline.rb +1 -0
  52. data/lib/sidekiq/util.rb +31 -5
  53. data/lib/sidekiq/version.rb +2 -1
  54. data/lib/sidekiq/web.rb +136 -263
  55. data/lib/sidekiq/web/action.rb +93 -0
  56. data/lib/sidekiq/web/application.rb +336 -0
  57. data/lib/sidekiq/web/helpers.rb +278 -0
  58. data/lib/sidekiq/web/router.rb +100 -0
  59. data/lib/sidekiq/worker.rb +40 -7
  60. data/sidekiq.gemspec +18 -14
  61. data/web/assets/images/favicon.ico +0 -0
  62. data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
  63. data/web/assets/javascripts/application.js +67 -19
  64. data/web/assets/javascripts/dashboard.js +138 -29
  65. data/web/assets/stylesheets/application.css +267 -406
  66. data/web/assets/stylesheets/bootstrap.css +4 -8
  67. data/web/locales/cs.yml +78 -0
  68. data/web/locales/da.yml +9 -1
  69. data/web/locales/de.yml +18 -9
  70. data/web/locales/el.yml +68 -0
  71. data/web/locales/en.yml +19 -4
  72. data/web/locales/es.yml +10 -1
  73. data/web/locales/fa.yml +79 -0
  74. data/web/locales/fr.yml +50 -32
  75. data/web/locales/hi.yml +75 -0
  76. data/web/locales/it.yml +27 -18
  77. data/web/locales/ja.yml +27 -12
  78. data/web/locales/ko.yml +8 -3
  79. data/web/locales/{no.yml → nb.yml} +19 -5
  80. data/web/locales/nl.yml +8 -3
  81. data/web/locales/pl.yml +0 -1
  82. data/web/locales/pt-br.yml +11 -4
  83. data/web/locales/pt.yml +8 -1
  84. data/web/locales/ru.yml +39 -21
  85. data/web/locales/sv.yml +68 -0
  86. data/web/locales/ta.yml +75 -0
  87. data/web/locales/uk.yml +76 -0
  88. data/web/locales/zh-cn.yml +68 -0
  89. data/web/locales/zh-tw.yml +68 -0
  90. data/web/views/_footer.erb +17 -0
  91. data/web/views/_job_info.erb +72 -60
  92. data/web/views/_nav.erb +58 -25
  93. data/web/views/_paging.erb +5 -5
  94. data/web/views/_poll_link.erb +7 -0
  95. data/web/views/_summary.erb +20 -14
  96. data/web/views/busy.erb +94 -0
  97. data/web/views/dashboard.erb +34 -21
  98. data/web/views/dead.erb +34 -0
  99. data/web/views/layout.erb +8 -30
  100. data/web/views/morgue.erb +75 -0
  101. data/web/views/queue.erb +37 -30
  102. data/web/views/queues.erb +26 -20
  103. data/web/views/retries.erb +60 -47
  104. data/web/views/retry.erb +23 -19
  105. data/web/views/scheduled.erb +39 -35
  106. data/web/views/scheduled_job_info.erb +2 -1
  107. metadata +152 -195
  108. data/Contributing.md +0 -29
  109. data/config.ru +0 -18
  110. data/lib/sidekiq/actor.rb +0 -7
  111. data/lib/sidekiq/capistrano.rb +0 -54
  112. data/lib/sidekiq/yaml_patch.rb +0 -21
  113. data/test/config.yml +0 -11
  114. data/test/env_based_config.yml +0 -11
  115. data/test/fake_env.rb +0 -0
  116. data/test/helper.rb +0 -42
  117. data/test/test_api.rb +0 -341
  118. data/test/test_cli.rb +0 -326
  119. data/test/test_client.rb +0 -211
  120. data/test/test_exception_handler.rb +0 -124
  121. data/test/test_extensions.rb +0 -105
  122. data/test/test_fetch.rb +0 -44
  123. data/test/test_manager.rb +0 -83
  124. data/test/test_middleware.rb +0 -135
  125. data/test/test_processor.rb +0 -160
  126. data/test/test_redis_connection.rb +0 -97
  127. data/test/test_retry.rb +0 -306
  128. data/test/test_scheduled.rb +0 -86
  129. data/test/test_scheduling.rb +0 -47
  130. data/test/test_sidekiq.rb +0 -37
  131. data/test/test_testing.rb +0 -82
  132. data/test/test_testing_fake.rb +0 -265
  133. data/test/test_testing_inline.rb +0 -92
  134. data/test/test_util.rb +0 -18
  135. data/test/test_web.rb +0 -372
  136. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  137. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  138. data/web/assets/images/status/active.png +0 -0
  139. data/web/assets/images/status/idle.png +0 -0
  140. data/web/assets/javascripts/locales/README.md +0 -27
  141. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  142. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  143. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  144. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  145. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  146. data/web/assets/javascripts/locales/jquery.timeago.cz.js +0 -18
  147. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  148. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  149. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  150. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  151. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  152. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  153. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  154. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  155. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  156. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  157. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  158. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  159. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  160. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  161. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  162. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  163. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  164. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  165. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  166. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  167. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  168. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  169. data/web/assets/javascripts/locales/jquery.timeago.no.js +0 -18
  170. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  171. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  172. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  173. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  174. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  175. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  176. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  177. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  178. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  179. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  180. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  181. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  182. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  183. data/web/assets/javascripts/locales/jquery.timeago.zh-CN.js +0 -20
  184. data/web/assets/javascripts/locales/jquery.timeago.zh-TW.js +0 -20
  185. data/web/views/_poll.erb +0 -14
  186. data/web/views/_workers.erb +0 -29
  187. 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
@@ -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
@@ -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
@@ -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
@@ -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