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_cli.rb
DELETED
@@ -1,326 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq/cli'
|
3
|
-
require 'tempfile'
|
4
|
-
|
5
|
-
cli = Sidekiq::CLI.instance
|
6
|
-
def cli.die(code)
|
7
|
-
@code = code
|
8
|
-
end
|
9
|
-
|
10
|
-
def cli.valid?
|
11
|
-
!@code
|
12
|
-
end
|
13
|
-
|
14
|
-
class TestCli < Sidekiq::Test
|
15
|
-
describe 'with cli' do
|
16
|
-
|
17
|
-
before do
|
18
|
-
@cli = Sidekiq::CLI.instance
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'blows up with an invalid require' do
|
22
|
-
assert_raises ArgumentError do
|
23
|
-
@cli.parse(['sidekiq', '-r', 'foobar'])
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'requires the specified Ruby code' do
|
28
|
-
@cli.parse(['sidekiq', '-r', './test/fake_env.rb'])
|
29
|
-
assert($LOADED_FEATURES.any? { |x| x =~ /fake_env/ })
|
30
|
-
assert @cli.valid?
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'changes concurrency' do
|
34
|
-
@cli.parse(['sidekiq', '-c', '60', '-r', './test/fake_env.rb'])
|
35
|
-
assert_equal 60, Sidekiq.options[:concurrency]
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'changes queues' do
|
39
|
-
@cli.parse(['sidekiq', '-q', 'foo', '-r', './test/fake_env.rb'])
|
40
|
-
assert_equal ['foo'], Sidekiq.options[:queues]
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'accepts a process index' do
|
44
|
-
@cli.parse(['sidekiq', '-i', '7', '-r', './test/fake_env.rb'])
|
45
|
-
assert_equal 7, Sidekiq.options[:index]
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'accepts a stringy process index' do
|
49
|
-
@cli.parse(['sidekiq', '-i', 'worker.7', '-r', './test/fake_env.rb'])
|
50
|
-
assert_equal 7, Sidekiq.options[:index]
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'sets strictly ordered queues if weights are not present' do
|
54
|
-
@cli.parse(['sidekiq', '-q', 'foo,bar', '-r', './test/fake_env.rb'])
|
55
|
-
assert_equal true, !!Sidekiq.options[:strict]
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'does not set strictly ordered queues if weights are present' do
|
59
|
-
@cli.parse(['sidekiq', '-q', 'foo,3', '-r', './test/fake_env.rb'])
|
60
|
-
assert_equal false, !!Sidekiq.options[:strict]
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'changes timeout' do
|
64
|
-
@cli.parse(['sidekiq', '-t', '30', '-r', './test/fake_env.rb'])
|
65
|
-
assert_equal 30, Sidekiq.options[:timeout]
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'handles multiple queues with weights with multiple switches' do
|
69
|
-
@cli.parse(['sidekiq', '-q', 'foo,3', '-q', 'bar', '-r', './test/fake_env.rb'])
|
70
|
-
assert_equal %w(foo foo foo bar), Sidekiq.options[:queues]
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'handles multiple queues with weights with a single switch' do
|
74
|
-
@cli.parse(['sidekiq', '-q', 'bar,foo,3', '-r', './test/fake_env.rb'])
|
75
|
-
assert_equal %w(bar foo foo foo), Sidekiq.options[:queues]
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'handles queues with multi-word names' do
|
79
|
-
@cli.parse(['sidekiq', '-q', 'queue_one,queue-two', '-r', './test/fake_env.rb'])
|
80
|
-
assert_equal %w(queue_one queue-two), Sidekiq.options[:queues]
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'handles queues with dots in the name' do
|
84
|
-
@cli.parse(['sidekiq', '-q', 'foo.bar', '-r', './test/fake_env.rb'])
|
85
|
-
assert_equal ['foo.bar'], Sidekiq.options[:queues]
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'sets verbose' do
|
89
|
-
old = Sidekiq.logger.level
|
90
|
-
@cli.parse(['sidekiq', '-v', '-r', './test/fake_env.rb'])
|
91
|
-
assert_equal Logger::DEBUG, Sidekiq.logger.level
|
92
|
-
# If we leave the logger at DEBUG it'll add a lot of noise to the test output
|
93
|
-
Sidekiq.options.delete(:verbose)
|
94
|
-
Sidekiq.logger.level = old
|
95
|
-
end
|
96
|
-
|
97
|
-
describe 'with logfile' do
|
98
|
-
before do
|
99
|
-
@old_logger = Sidekiq.logger
|
100
|
-
@tmp_log_path = '/tmp/sidekiq.log'
|
101
|
-
end
|
102
|
-
|
103
|
-
after do
|
104
|
-
Sidekiq.logger = @old_logger
|
105
|
-
Sidekiq.options.delete(:logfile)
|
106
|
-
File.unlink @tmp_log_path if File.exists?(@tmp_log_path)
|
107
|
-
end
|
108
|
-
|
109
|
-
it 'sets the logfile path' do
|
110
|
-
@cli.parse(['sidekiq', '-L', @tmp_log_path, '-r', './test/fake_env.rb'])
|
111
|
-
|
112
|
-
assert_equal @tmp_log_path, Sidekiq.options[:logfile]
|
113
|
-
end
|
114
|
-
|
115
|
-
it 'creates and writes to a logfile' do
|
116
|
-
@cli.parse(['sidekiq', '-L', @tmp_log_path, '-r', './test/fake_env.rb'])
|
117
|
-
|
118
|
-
Sidekiq.logger.info('test message')
|
119
|
-
|
120
|
-
assert_match(/test message/, File.read(@tmp_log_path), "didn't include the log message")
|
121
|
-
end
|
122
|
-
|
123
|
-
it 'appends messages to a logfile' do
|
124
|
-
File.open(@tmp_log_path, 'w') do |f|
|
125
|
-
f.puts 'already existant log message'
|
126
|
-
end
|
127
|
-
|
128
|
-
@cli.parse(['sidekiq', '-L', @tmp_log_path, '-r', './test/fake_env.rb'])
|
129
|
-
|
130
|
-
Sidekiq.logger.info('test message')
|
131
|
-
|
132
|
-
log_file_content = File.read(@tmp_log_path)
|
133
|
-
assert_match(/already existant/, log_file_content, "didn't include the old message")
|
134
|
-
assert_match(/test message/, log_file_content, "didn't include the new message")
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
describe 'with pidfile' do
|
139
|
-
before do
|
140
|
-
@tmp_file = Tempfile.new('sidekiq-test')
|
141
|
-
@tmp_path = @tmp_file.path
|
142
|
-
@tmp_file.close!
|
143
|
-
|
144
|
-
@cli.parse(['sidekiq', '-P', @tmp_path, '-r', './test/fake_env.rb'])
|
145
|
-
end
|
146
|
-
|
147
|
-
after do
|
148
|
-
File.unlink @tmp_path if File.exist? @tmp_path
|
149
|
-
end
|
150
|
-
|
151
|
-
it 'sets pidfile path' do
|
152
|
-
assert_equal @tmp_path, Sidekiq.options[:pidfile]
|
153
|
-
end
|
154
|
-
|
155
|
-
it 'writes pidfile' do
|
156
|
-
assert_equal File.read(@tmp_path).strip.to_i, Process.pid
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
describe 'with config file' do
|
161
|
-
before do
|
162
|
-
@cli.parse(['sidekiq', '-C', './test/config.yml'])
|
163
|
-
end
|
164
|
-
|
165
|
-
it 'takes a path' do
|
166
|
-
assert_equal './test/config.yml', Sidekiq.options[:config_file]
|
167
|
-
end
|
168
|
-
|
169
|
-
it 'sets verbose' do
|
170
|
-
refute Sidekiq.options[:verbose]
|
171
|
-
end
|
172
|
-
|
173
|
-
it 'sets require file' do
|
174
|
-
assert_equal './test/fake_env.rb', Sidekiq.options[:require]
|
175
|
-
end
|
176
|
-
|
177
|
-
it 'sets environment' do
|
178
|
-
assert_equal 'xzibit', Sidekiq.options[:environment]
|
179
|
-
end
|
180
|
-
|
181
|
-
it 'sets concurrency' do
|
182
|
-
assert_equal 50, Sidekiq.options[:concurrency]
|
183
|
-
end
|
184
|
-
|
185
|
-
it 'sets pid file' do
|
186
|
-
assert_equal '/tmp/sidekiq-config-test.pid', Sidekiq.options[:pidfile]
|
187
|
-
end
|
188
|
-
|
189
|
-
it 'sets logfile' do
|
190
|
-
assert_equal '/tmp/sidekiq.log', Sidekiq.options[:logfile]
|
191
|
-
end
|
192
|
-
|
193
|
-
it 'sets queues' do
|
194
|
-
assert_equal 2, Sidekiq.options[:queues].count { |q| q == 'very_often' }
|
195
|
-
assert_equal 1, Sidekiq.options[:queues].count { |q| q == 'seldom' }
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
describe 'with env based config file' do
|
200
|
-
before do
|
201
|
-
@cli.parse(['sidekiq', '-e', 'staging', '-C', './test/env_based_config.yml'])
|
202
|
-
end
|
203
|
-
|
204
|
-
it 'takes a path' do
|
205
|
-
assert_equal './test/env_based_config.yml', Sidekiq.options[:config_file]
|
206
|
-
end
|
207
|
-
|
208
|
-
it 'sets verbose' do
|
209
|
-
refute Sidekiq.options[:verbose]
|
210
|
-
end
|
211
|
-
|
212
|
-
it 'sets require file' do
|
213
|
-
assert_equal './test/fake_env.rb', Sidekiq.options[:require]
|
214
|
-
end
|
215
|
-
|
216
|
-
it 'sets environment' do
|
217
|
-
assert_equal 'staging', Sidekiq.options[:environment]
|
218
|
-
end
|
219
|
-
|
220
|
-
it 'sets concurrency' do
|
221
|
-
assert_equal 5, Sidekiq.options[:concurrency]
|
222
|
-
end
|
223
|
-
|
224
|
-
it 'sets pid file' do
|
225
|
-
assert_equal '/tmp/sidekiq-config-test.pid', Sidekiq.options[:pidfile]
|
226
|
-
end
|
227
|
-
|
228
|
-
it 'sets logfile' do
|
229
|
-
assert_equal '/tmp/sidekiq.log', Sidekiq.options[:logfile]
|
230
|
-
end
|
231
|
-
|
232
|
-
it 'sets queues' do
|
233
|
-
assert_equal 2, Sidekiq.options[:queues].count { |q| q == 'very_often' }
|
234
|
-
assert_equal 1, Sidekiq.options[:queues].count { |q| q == 'seldom' }
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
describe 'with config file and flags' do
|
239
|
-
before do
|
240
|
-
# We need an actual file here.
|
241
|
-
@tmp_lib_path = '/tmp/require-me.rb'
|
242
|
-
File.open(@tmp_lib_path, 'w') do |f|
|
243
|
-
f.puts "# do work"
|
244
|
-
end
|
245
|
-
|
246
|
-
@tmp_file = Tempfile.new('sidekiqr')
|
247
|
-
@tmp_path = @tmp_file.path
|
248
|
-
@tmp_file.close!
|
249
|
-
|
250
|
-
@cli.parse(['sidekiq',
|
251
|
-
'-C', './test/config.yml',
|
252
|
-
'-e', 'snoop',
|
253
|
-
'-c', '100',
|
254
|
-
'-r', @tmp_lib_path,
|
255
|
-
'-P', @tmp_path,
|
256
|
-
'-q', 'often,7',
|
257
|
-
'-q', 'seldom,3'])
|
258
|
-
end
|
259
|
-
|
260
|
-
after do
|
261
|
-
File.unlink @tmp_lib_path if File.exist? @tmp_lib_path
|
262
|
-
File.unlink @tmp_path if File.exist? @tmp_path
|
263
|
-
end
|
264
|
-
|
265
|
-
it 'uses concurrency flag' do
|
266
|
-
assert_equal 100, Sidekiq.options[:concurrency]
|
267
|
-
end
|
268
|
-
|
269
|
-
it 'uses require file flag' do
|
270
|
-
assert_equal @tmp_lib_path, Sidekiq.options[:require]
|
271
|
-
end
|
272
|
-
|
273
|
-
it 'uses environment flag' do
|
274
|
-
assert_equal 'snoop', Sidekiq.options[:environment]
|
275
|
-
end
|
276
|
-
|
277
|
-
it 'uses pidfile flag' do
|
278
|
-
assert_equal @tmp_path, Sidekiq.options[:pidfile]
|
279
|
-
end
|
280
|
-
|
281
|
-
it 'sets queues' do
|
282
|
-
assert_equal 7, Sidekiq.options[:queues].count { |q| q == 'often' }
|
283
|
-
assert_equal 3, Sidekiq.options[:queues].count { |q| q == 'seldom' }
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
describe 'Sidekiq::CLI#parse_queues' do
|
288
|
-
describe 'when weight is present' do
|
289
|
-
it 'concatenates queues by factor of weight and sets strict to false' do
|
290
|
-
opts = {}
|
291
|
-
@cli.send :parse_queues, opts, [['often', 7]]
|
292
|
-
assert_equal %w[often] * 7, opts[:queues]
|
293
|
-
assert !opts[:strict]
|
294
|
-
end
|
295
|
-
end
|
296
|
-
|
297
|
-
describe 'when weight is not present' do
|
298
|
-
it 'returns queues and sets strict' do
|
299
|
-
opts = {}
|
300
|
-
@cli.send :parse_queues, opts, [['once']]
|
301
|
-
assert_equal %w[once], opts[:queues]
|
302
|
-
assert opts[:strict]
|
303
|
-
end
|
304
|
-
end
|
305
|
-
end
|
306
|
-
|
307
|
-
describe 'Sidekiq::CLI#parse_queue' do
|
308
|
-
describe 'when weight is present' do
|
309
|
-
it 'concatenates queue to opts[:queues] weight number of times' do
|
310
|
-
opts = {}
|
311
|
-
@cli.send :parse_queue, opts, 'often', 7
|
312
|
-
assert_equal %w[often] * 7, opts[:queues]
|
313
|
-
end
|
314
|
-
end
|
315
|
-
|
316
|
-
describe 'when weight is not present' do
|
317
|
-
it 'concatenates queue to opts[:queues] once' do
|
318
|
-
opts = {}
|
319
|
-
@cli.send :parse_queue, opts, 'once', nil
|
320
|
-
assert_equal %w[once], opts[:queues]
|
321
|
-
end
|
322
|
-
end
|
323
|
-
end
|
324
|
-
end
|
325
|
-
|
326
|
-
end
|
data/test/test_client.rb
DELETED
@@ -1,211 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'sidekiq/client'
|
3
|
-
require 'sidekiq/worker'
|
4
|
-
|
5
|
-
class TestClient < Sidekiq::Test
|
6
|
-
describe 'with mock redis' do
|
7
|
-
before do
|
8
|
-
@redis = Minitest::Mock.new
|
9
|
-
def @redis.multi; [yield] * 2 if block_given?; end
|
10
|
-
def @redis.set(*); true; end
|
11
|
-
def @redis.sadd(*); true; end
|
12
|
-
def @redis.srem(*); true; end
|
13
|
-
def @redis.get(*); nil; end
|
14
|
-
def @redis.del(*); nil; end
|
15
|
-
def @redis.incrby(*); nil; end
|
16
|
-
def @redis.setex(*); true; end
|
17
|
-
def @redis.expire(*); true; end
|
18
|
-
def @redis.watch(*); true; end
|
19
|
-
def @redis.with_connection; yield self; end
|
20
|
-
def @redis.with; yield self; end
|
21
|
-
def @redis.exec; true; end
|
22
|
-
Sidekiq.instance_variable_set(:@redis, @redis)
|
23
|
-
end
|
24
|
-
|
25
|
-
after do
|
26
|
-
Sidekiq.instance_variable_set(:@redis, REDIS)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'raises ArgumentError with invalid params' do
|
30
|
-
assert_raises ArgumentError do
|
31
|
-
Sidekiq::Client.push('foo', 1)
|
32
|
-
end
|
33
|
-
|
34
|
-
assert_raises ArgumentError do
|
35
|
-
Sidekiq::Client.push('foo', :class => 'Foo', :noargs => [1, 2])
|
36
|
-
end
|
37
|
-
|
38
|
-
assert_raises ArgumentError do
|
39
|
-
Sidekiq::Client.push('queue' => 'foo', 'class' => MyWorker, 'noargs' => [1, 2])
|
40
|
-
end
|
41
|
-
|
42
|
-
assert_raises ArgumentError do
|
43
|
-
Sidekiq::Client.push('queue' => 'foo', 'class' => 42, 'args' => [1, 2])
|
44
|
-
end
|
45
|
-
|
46
|
-
assert_raises ArgumentError do
|
47
|
-
Sidekiq::Client.push('queue' => 'foo', 'class' => MyWorker, 'args' => 1)
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'pushes messages to redis' do
|
53
|
-
@redis.expect :lpush, 1, ['queue:foo', Array]
|
54
|
-
pushed = Sidekiq::Client.push('queue' => 'foo', 'class' => MyWorker, 'args' => [1, 2])
|
55
|
-
assert pushed
|
56
|
-
assert_equal 24, pushed.size
|
57
|
-
@redis.verify
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'pushes messages to redis using a String class' do
|
61
|
-
@redis.expect :lpush, 1, ['queue:foo', Array]
|
62
|
-
pushed = Sidekiq::Client.push('queue' => 'foo', 'class' => 'MyWorker', 'args' => [1, 2])
|
63
|
-
assert pushed
|
64
|
-
assert_equal 24, pushed.size
|
65
|
-
@redis.verify
|
66
|
-
end
|
67
|
-
|
68
|
-
class MyWorker
|
69
|
-
include Sidekiq::Worker
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'has default options' do
|
73
|
-
assert_equal Sidekiq.default_worker_options, MyWorker.get_sidekiq_options
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'handles perform_async' do
|
77
|
-
@redis.expect :lpush, 1, ['queue:default', Array]
|
78
|
-
pushed = MyWorker.perform_async(1, 2)
|
79
|
-
assert pushed
|
80
|
-
@redis.verify
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'handles perform_async on failure' do
|
84
|
-
@redis.expect :lpush, nil, ['queue:default', Array]
|
85
|
-
pushed = MyWorker.perform_async(1, 2)
|
86
|
-
refute pushed
|
87
|
-
@redis.verify
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'enqueues messages to redis' do
|
91
|
-
@redis.expect :lpush, 1, ['queue:default', Array]
|
92
|
-
pushed = Sidekiq::Client.enqueue(MyWorker, 1, 2)
|
93
|
-
assert pushed
|
94
|
-
@redis.verify
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'enqueues messages to redis' do
|
98
|
-
@redis.expect :lpush, 1, ['queue:custom_queue', Array]
|
99
|
-
pushed = Sidekiq::Client.enqueue_to(:custom_queue, MyWorker, 1, 2)
|
100
|
-
assert pushed
|
101
|
-
@redis.verify
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'enqueues messages to redis (delayed, custom queue)' do
|
105
|
-
@redis.expect :zadd, 1, ['schedule', Array]
|
106
|
-
pushed = Sidekiq::Client.enqueue_to_in(:custom_queue, 3.minutes, MyWorker, 1, 2)
|
107
|
-
assert pushed
|
108
|
-
@redis.verify
|
109
|
-
end
|
110
|
-
|
111
|
-
it 'enqueues messages to redis (delayed into past, custom queue)' do
|
112
|
-
@redis.expect :lpush, 1, ['queue:custom_queue', Array]
|
113
|
-
pushed = Sidekiq::Client.enqueue_to_in(:custom_queue, -3.minutes, MyWorker, 1, 2)
|
114
|
-
assert pushed
|
115
|
-
@redis.verify
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'enqueues messages to redis (delayed)' do
|
119
|
-
@redis.expect :zadd, 1, ['schedule', Array]
|
120
|
-
pushed = Sidekiq::Client.enqueue_in(3.minutes, MyWorker, 1, 2)
|
121
|
-
assert pushed
|
122
|
-
@redis.verify
|
123
|
-
end
|
124
|
-
|
125
|
-
class QueuedWorker
|
126
|
-
include Sidekiq::Worker
|
127
|
-
sidekiq_options :queue => :flimflam
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'enqueues to the named queue' do
|
131
|
-
@redis.expect :lpush, 1, ['queue:flimflam', Array]
|
132
|
-
pushed = QueuedWorker.perform_async(1, 2)
|
133
|
-
assert pushed
|
134
|
-
@redis.verify
|
135
|
-
end
|
136
|
-
|
137
|
-
it 'retrieves queues' do
|
138
|
-
@redis.expect :smembers, ['bob'], ['queues']
|
139
|
-
assert_equal ['bob'], Sidekiq::Client.registered_queues
|
140
|
-
end
|
141
|
-
|
142
|
-
it 'retrieves workers' do
|
143
|
-
@redis.expect :smembers, ['bob'], ['workers']
|
144
|
-
assert_equal ['bob'], Sidekiq::Client.registered_workers
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
describe 'bulk' do
|
149
|
-
after do
|
150
|
-
Sidekiq::Queue.new.clear
|
151
|
-
end
|
152
|
-
it 'can push a large set of jobs at once' do
|
153
|
-
count = Sidekiq::Client.push_bulk('class' => QueuedWorker, 'args' => (1..1_000).to_a.map { |x| Array(x) })
|
154
|
-
assert_equal 1_000, count
|
155
|
-
end
|
156
|
-
it 'can push a large set of jobs at once using a String class' do
|
157
|
-
count = Sidekiq::Client.push_bulk('class' => 'QueuedWorker', 'args' => (1..1_000).to_a.map { |x| Array(x) })
|
158
|
-
assert_equal 1_000, count
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
class BaseWorker
|
163
|
-
include Sidekiq::Worker
|
164
|
-
sidekiq_options 'retry' => 'base'
|
165
|
-
end
|
166
|
-
class AWorker < BaseWorker
|
167
|
-
end
|
168
|
-
class BWorker < BaseWorker
|
169
|
-
sidekiq_options 'retry' => 'b'
|
170
|
-
end
|
171
|
-
class CWorker < BaseWorker
|
172
|
-
sidekiq_options 'retry' => 2
|
173
|
-
end
|
174
|
-
|
175
|
-
describe 'client middleware' do
|
176
|
-
|
177
|
-
class Stopper
|
178
|
-
def call(worker_class, message, queue)
|
179
|
-
yield if message['args'].first.odd?
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
it 'can stop some of the jobs from pushing' do
|
184
|
-
Sidekiq.client_middleware.add Stopper
|
185
|
-
begin
|
186
|
-
assert_equal nil, Sidekiq::Client.push('class' => MyWorker, 'args' => [0])
|
187
|
-
assert_match /[0-9a-f]{12}/, Sidekiq::Client.push('class' => MyWorker, 'args' => [1])
|
188
|
-
assert_equal 1, Sidekiq::Client.push_bulk('class' => MyWorker, 'args' => [[0], [1]])
|
189
|
-
ensure
|
190
|
-
Sidekiq.client_middleware.remove Stopper
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
describe 'inheritance' do
|
196
|
-
it 'inherits sidekiq options' do
|
197
|
-
assert_equal 'base', AWorker.get_sidekiq_options['retry']
|
198
|
-
assert_equal 'b', BWorker.get_sidekiq_options['retry']
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
describe 'item normalization' do
|
203
|
-
it 'defaults retry to true' do
|
204
|
-
assert_equal true, Sidekiq::Client.send(:normalize_item, 'class' => QueuedWorker, 'args' => [])['retry']
|
205
|
-
end
|
206
|
-
|
207
|
-
it "does not normalize numeric retry's" do
|
208
|
-
assert_equal 2, Sidekiq::Client.send(:normalize_item, 'class' => CWorker, 'args' => [])['retry']
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|