sidekiq 3.5.4 → 7.2.0

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 (228) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +992 -6
  3. data/LICENSE.txt +9 -0
  4. data/README.md +52 -43
  5. data/bin/sidekiq +22 -4
  6. data/bin/sidekiqload +209 -115
  7. data/bin/sidekiqmon +11 -0
  8. data/lib/generators/sidekiq/job_generator.rb +57 -0
  9. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  10. data/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
  11. data/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
  12. data/lib/sidekiq/api.rb +633 -295
  13. data/lib/sidekiq/capsule.rb +127 -0
  14. data/lib/sidekiq/cli.rb +270 -248
  15. data/lib/sidekiq/client.rb +139 -108
  16. data/lib/sidekiq/component.rb +68 -0
  17. data/lib/sidekiq/config.rb +287 -0
  18. data/lib/sidekiq/deploy.rb +62 -0
  19. data/lib/sidekiq/embedded.rb +61 -0
  20. data/lib/sidekiq/fetch.rb +53 -121
  21. data/lib/sidekiq/job.rb +374 -0
  22. data/lib/sidekiq/job_logger.rb +51 -0
  23. data/lib/sidekiq/job_retry.rb +301 -0
  24. data/lib/sidekiq/job_util.rb +107 -0
  25. data/lib/sidekiq/launcher.rb +241 -69
  26. data/lib/sidekiq/logger.rb +131 -0
  27. data/lib/sidekiq/manager.rb +88 -190
  28. data/lib/sidekiq/metrics/query.rb +155 -0
  29. data/lib/sidekiq/metrics/shared.rb +95 -0
  30. data/lib/sidekiq/metrics/tracking.rb +136 -0
  31. data/lib/sidekiq/middleware/chain.rb +114 -56
  32. data/lib/sidekiq/middleware/current_attributes.rb +95 -0
  33. data/lib/sidekiq/middleware/i18n.rb +8 -7
  34. data/lib/sidekiq/middleware/modules.rb +21 -0
  35. data/lib/sidekiq/monitor.rb +146 -0
  36. data/lib/sidekiq/paginator.rb +29 -16
  37. data/lib/sidekiq/processor.rb +238 -118
  38. data/lib/sidekiq/rails.rb +57 -27
  39. data/lib/sidekiq/redis_client_adapter.rb +111 -0
  40. data/lib/sidekiq/redis_connection.rb +49 -50
  41. data/lib/sidekiq/ring_buffer.rb +29 -0
  42. data/lib/sidekiq/scheduled.rb +173 -52
  43. data/lib/sidekiq/sd_notify.rb +149 -0
  44. data/lib/sidekiq/systemd.rb +24 -0
  45. data/lib/sidekiq/testing/inline.rb +7 -5
  46. data/lib/sidekiq/testing.rb +197 -65
  47. data/lib/sidekiq/transaction_aware_client.rb +44 -0
  48. data/lib/sidekiq/version.rb +4 -1
  49. data/lib/sidekiq/web/action.rb +93 -0
  50. data/lib/sidekiq/web/application.rb +463 -0
  51. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  52. data/lib/sidekiq/web/helpers.rb +364 -0
  53. data/lib/sidekiq/web/router.rb +104 -0
  54. data/lib/sidekiq/web.rb +113 -216
  55. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  56. data/lib/sidekiq.rb +99 -142
  57. data/sidekiq.gemspec +26 -23
  58. data/web/assets/images/apple-touch-icon.png +0 -0
  59. data/web/assets/javascripts/application.js +163 -74
  60. data/web/assets/javascripts/base-charts.js +106 -0
  61. data/web/assets/javascripts/chart.min.js +13 -0
  62. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  63. data/web/assets/javascripts/dashboard-charts.js +182 -0
  64. data/web/assets/javascripts/dashboard.js +37 -280
  65. data/web/assets/javascripts/metrics.js +298 -0
  66. data/web/assets/stylesheets/application-dark.css +147 -0
  67. data/web/assets/stylesheets/application-rtl.css +153 -0
  68. data/web/assets/stylesheets/application.css +181 -198
  69. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  70. data/web/assets/stylesheets/bootstrap.css +4 -8
  71. data/web/locales/ar.yml +87 -0
  72. data/web/locales/cs.yml +62 -52
  73. data/web/locales/da.yml +60 -53
  74. data/web/locales/de.yml +65 -53
  75. data/web/locales/el.yml +43 -24
  76. data/web/locales/en.yml +86 -62
  77. data/web/locales/es.yml +70 -53
  78. data/web/locales/fa.yml +80 -0
  79. data/web/locales/fr.yml +86 -56
  80. data/web/locales/gd.yml +99 -0
  81. data/web/locales/he.yml +80 -0
  82. data/web/locales/hi.yml +59 -59
  83. data/web/locales/it.yml +53 -53
  84. data/web/locales/ja.yml +78 -56
  85. data/web/locales/ko.yml +52 -52
  86. data/web/locales/lt.yml +83 -0
  87. data/web/locales/nb.yml +61 -61
  88. data/web/locales/nl.yml +52 -52
  89. data/web/locales/pl.yml +45 -45
  90. data/web/locales/pt-br.yml +83 -55
  91. data/web/locales/pt.yml +51 -51
  92. data/web/locales/ru.yml +68 -60
  93. data/web/locales/sv.yml +53 -53
  94. data/web/locales/ta.yml +60 -60
  95. data/web/locales/uk.yml +62 -61
  96. data/web/locales/ur.yml +80 -0
  97. data/web/locales/vi.yml +83 -0
  98. data/web/locales/zh-cn.yml +43 -16
  99. data/web/locales/zh-tw.yml +42 -8
  100. data/web/views/_footer.erb +10 -9
  101. data/web/views/_job_info.erb +26 -5
  102. data/web/views/_metrics_period_select.erb +12 -0
  103. data/web/views/_nav.erb +6 -20
  104. data/web/views/_paging.erb +3 -1
  105. data/web/views/_poll_link.erb +3 -6
  106. data/web/views/_summary.erb +7 -7
  107. data/web/views/busy.erb +87 -28
  108. data/web/views/dashboard.erb +51 -21
  109. data/web/views/dead.erb +4 -4
  110. data/web/views/filtering.erb +7 -0
  111. data/web/views/layout.erb +15 -5
  112. data/web/views/metrics.erb +91 -0
  113. data/web/views/metrics_for_job.erb +59 -0
  114. data/web/views/morgue.erb +25 -22
  115. data/web/views/queue.erb +35 -25
  116. data/web/views/queues.erb +23 -7
  117. data/web/views/retries.erb +28 -23
  118. data/web/views/retry.erb +5 -5
  119. data/web/views/scheduled.erb +19 -17
  120. data/web/views/scheduled_job_info.erb +1 -1
  121. metadata +86 -268
  122. data/.gitignore +0 -12
  123. data/.travis.yml +0 -16
  124. data/3.0-Upgrade.md +0 -70
  125. data/COMM-LICENSE +0 -95
  126. data/Contributing.md +0 -32
  127. data/Ent-Changes.md +0 -39
  128. data/Gemfile +0 -27
  129. data/LICENSE +0 -9
  130. data/Pro-2.0-Upgrade.md +0 -138
  131. data/Pro-Changes.md +0 -454
  132. data/Rakefile +0 -9
  133. data/bin/sidekiqctl +0 -93
  134. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +0 -6
  135. data/lib/generators/sidekiq/templates/worker_test.rb.erb +0 -8
  136. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  137. data/lib/sidekiq/actor.rb +0 -39
  138. data/lib/sidekiq/core_ext.rb +0 -105
  139. data/lib/sidekiq/exception_handler.rb +0 -30
  140. data/lib/sidekiq/extensions/action_mailer.rb +0 -56
  141. data/lib/sidekiq/extensions/active_record.rb +0 -39
  142. data/lib/sidekiq/extensions/class_methods.rb +0 -39
  143. data/lib/sidekiq/extensions/generic_proxy.rb +0 -24
  144. data/lib/sidekiq/logging.rb +0 -104
  145. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  146. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  147. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -206
  148. data/lib/sidekiq/util.rb +0 -68
  149. data/lib/sidekiq/web_helpers.rb +0 -249
  150. data/lib/sidekiq/worker.rb +0 -103
  151. data/test/config.yml +0 -9
  152. data/test/env_based_config.yml +0 -11
  153. data/test/fake_env.rb +0 -0
  154. data/test/fixtures/en.yml +0 -2
  155. data/test/helper.rb +0 -49
  156. data/test/test_api.rb +0 -493
  157. data/test/test_cli.rb +0 -335
  158. data/test/test_client.rb +0 -194
  159. data/test/test_exception_handler.rb +0 -55
  160. data/test/test_extensions.rb +0 -126
  161. data/test/test_fetch.rb +0 -104
  162. data/test/test_logging.rb +0 -34
  163. data/test/test_manager.rb +0 -168
  164. data/test/test_middleware.rb +0 -159
  165. data/test/test_processor.rb +0 -237
  166. data/test/test_rails.rb +0 -21
  167. data/test/test_redis_connection.rb +0 -126
  168. data/test/test_retry.rb +0 -325
  169. data/test/test_scheduled.rb +0 -114
  170. data/test/test_scheduling.rb +0 -49
  171. data/test/test_sidekiq.rb +0 -99
  172. data/test/test_testing.rb +0 -142
  173. data/test/test_testing_fake.rb +0 -268
  174. data/test/test_testing_inline.rb +0 -93
  175. data/test/test_util.rb +0 -16
  176. data/test/test_web.rb +0 -608
  177. data/test/test_web_helpers.rb +0 -53
  178. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  179. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  180. data/web/assets/images/status/active.png +0 -0
  181. data/web/assets/images/status/idle.png +0 -0
  182. data/web/assets/javascripts/locales/README.md +0 -27
  183. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  184. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  185. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  186. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  187. data/web/assets/javascripts/locales/jquery.timeago.cs.js +0 -18
  188. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  189. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  190. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  191. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  192. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  193. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  194. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  195. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  196. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  197. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  198. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  199. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  200. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  201. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  202. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  203. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  204. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  205. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  206. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  207. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  208. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  209. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  210. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  211. data/web/assets/javascripts/locales/jquery.timeago.no.js +0 -18
  212. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  213. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  214. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  215. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  216. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  217. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  218. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  219. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  220. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  221. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  222. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  223. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  224. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  225. data/web/assets/javascripts/locales/jquery.timeago.zh-cn.js +0 -20
  226. data/web/assets/javascripts/locales/jquery.timeago.zh-tw.js +0 -20
  227. data/web/views/_poll_js.erb +0 -5
  228. /data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
data/test/test_web.rb DELETED
@@ -1,608 +0,0 @@
1
- # encoding: utf-8
2
- require_relative 'helper'
3
- require 'sidekiq/web'
4
- require 'rack/test'
5
- require 'tilt/erubis'
6
-
7
- class TestWeb < Sidekiq::Test
8
-
9
- describe 'sidekiq web' do
10
- include Rack::Test::Methods
11
-
12
- def app
13
- Sidekiq::Web
14
- end
15
-
16
- def job_params(job, score)
17
- "#{score}-#{job['jid']}"
18
- end
19
-
20
- before do
21
- Sidekiq.redis {|c| c.flushdb }
22
- end
23
-
24
- class WebWorker
25
- include Sidekiq::Worker
26
-
27
- def perform(a, b)
28
- a + b
29
- end
30
- end
31
-
32
- it 'can show text with any locales' do
33
- rackenv = {'HTTP_ACCEPT_LANGUAGE' => 'ru,en'}
34
- get '/', {}, rackenv
35
- assert_match(/Панель управления/, last_response.body)
36
- rackenv = {'HTTP_ACCEPT_LANGUAGE' => 'es,en'}
37
- get '/', {}, rackenv
38
- assert_match(/Panel de Control/, last_response.body)
39
- rackenv = {'HTTP_ACCEPT_LANGUAGE' => 'en-us'}
40
- get '/', {}, rackenv
41
- assert_match(/Dashboard/, last_response.body)
42
- rackenv = {'HTTP_ACCEPT_LANGUAGE' => 'zh-cn'}
43
- get '/', {}, rackenv
44
- assert_match(/信息板/, last_response.body)
45
- rackenv = {'HTTP_ACCEPT_LANGUAGE' => 'zh-tw'}
46
- get '/', {}, rackenv
47
- assert_match(/資訊主頁/, last_response.body)
48
- rackenv = {'HTTP_ACCEPT_LANGUAGE' => 'nb'}
49
- get '/', {}, rackenv
50
- assert_match(/Oversikt/, last_response.body)
51
- end
52
-
53
- describe 'busy' do
54
-
55
- it 'can display workers' do
56
- Sidekiq.redis do |conn|
57
- conn.incr('busy')
58
- conn.sadd('processes', 'foo:1234')
59
- conn.hmset('foo:1234', 'info', Sidekiq.dump_json('hostname' => 'foo', 'started_at' => Time.now.to_f, "queues" => []), 'at', Time.now.to_f, 'busy', 4)
60
- identity = 'foo:1234:workers'
61
- hash = {:queue => 'critical', :payload => { 'class' => WebWorker.name, 'args' => [1,'abc'] }, :run_at => Time.now.to_i }
62
- conn.hmset(identity, 1001, Sidekiq.dump_json(hash))
63
- end
64
- assert_equal ['1001'], Sidekiq::Workers.new.map { |pid, tid, data| tid }
65
-
66
- get '/busy'
67
- assert_equal 200, last_response.status
68
- assert_match(/status-active/, last_response.body)
69
- assert_match(/critical/, last_response.body)
70
- assert_match(/WebWorker/, last_response.body)
71
- end
72
-
73
- it 'can quiet a process' do
74
- identity = 'identity'
75
- signals_key = "#{identity}-signals"
76
-
77
- assert_nil Sidekiq.redis { |c| c.lpop signals_key }
78
- post '/busy', 'quiet' => '1', 'identity' => identity
79
- assert_equal 302, last_response.status
80
- assert_equal 'USR1', Sidekiq.redis { |c| c.lpop signals_key }
81
- end
82
-
83
- it 'can stop a process' do
84
- identity = 'identity'
85
- signals_key = "#{identity}-signals"
86
-
87
- assert_nil Sidekiq.redis { |c| c.lpop signals_key }
88
- post '/busy', 'stop' => '1', 'identity' => identity
89
- assert_equal 302, last_response.status
90
- assert_equal 'TERM', Sidekiq.redis { |c| c.lpop signals_key }
91
- end
92
- end
93
-
94
- it 'can display queues' do
95
- assert Sidekiq::Client.push('queue' => :foo, 'class' => WebWorker, 'args' => [1, 3])
96
-
97
- get '/queues'
98
- assert_equal 200, last_response.status
99
- assert_match(/foo/, last_response.body)
100
- refute_match(/HardWorker/, last_response.body)
101
- end
102
-
103
- it 'handles queue view' do
104
- get '/queues/default'
105
- assert_equal 200, last_response.status
106
- end
107
-
108
- it 'can delete a queue' do
109
- Sidekiq.redis do |conn|
110
- conn.rpush('queue:foo', '{}')
111
- conn.sadd('queues', 'foo')
112
- end
113
-
114
- get '/queues/foo'
115
- assert_equal 200, last_response.status
116
-
117
- post '/queues/foo'
118
- assert_equal 302, last_response.status
119
-
120
- Sidekiq.redis do |conn|
121
- refute conn.smembers('queues').include?('foo')
122
- refute conn.exists('queue:foo')
123
- end
124
- end
125
-
126
- it 'can delete a job' do
127
- Sidekiq.redis do |conn|
128
- conn.rpush('queue:foo', "{}")
129
- conn.rpush('queue:foo', "{\"foo\":\"bar\"}")
130
- conn.rpush('queue:foo', "{\"foo2\":\"bar2\"}")
131
- end
132
-
133
- get '/queues/foo'
134
- assert_equal 200, last_response.status
135
-
136
- post '/queues/foo/delete', key_val: "{\"foo\":\"bar\"}"
137
- assert_equal 302, last_response.status
138
-
139
- Sidekiq.redis do |conn|
140
- refute conn.lrange('queue:foo', 0, -1).include?("{\"foo\":\"bar\"}")
141
- end
142
- end
143
-
144
- it 'can display retries' do
145
- get '/retries'
146
- assert_equal 200, last_response.status
147
- assert_match(/found/, last_response.body)
148
- refute_match(/HardWorker/, last_response.body)
149
-
150
- add_retry
151
-
152
- get '/retries'
153
- assert_equal 200, last_response.status
154
- refute_match(/found/, last_response.body)
155
- assert_match(/HardWorker/, last_response.body)
156
- end
157
-
158
- it 'can display a single retry' do
159
- params = add_retry
160
- get '/retries/0-shouldntexist'
161
- assert_equal 302, last_response.status
162
- get "/retries/#{job_params(*params)}"
163
- assert_equal 200, last_response.status
164
- assert_match(/HardWorker/, last_response.body)
165
- end
166
-
167
- it 'handles missing retry' do
168
- get "/retries/0-shouldntexist"
169
- assert_equal 302, last_response.status
170
- end
171
-
172
- it 'can delete a single retry' do
173
- params = add_retry
174
- post "/retries/#{job_params(*params)}", 'delete' => 'Delete'
175
- assert_equal 302, last_response.status
176
- assert_equal 'http://example.org/retries', last_response.header['Location']
177
-
178
- get "/retries"
179
- assert_equal 200, last_response.status
180
- refute_match(/#{params.first['args'][2]}/, last_response.body)
181
- end
182
-
183
- it 'can delete all retries' do
184
- 3.times { add_retry }
185
-
186
- post "/retries/all/delete", 'delete' => 'Delete'
187
- assert_equal 0, Sidekiq::RetrySet.new.size
188
- assert_equal 302, last_response.status
189
- assert_equal 'http://example.org/retries', last_response.header['Location']
190
- end
191
-
192
- it 'can retry a single retry now' do
193
- params = add_retry
194
- post "/retries/#{job_params(*params)}", 'retry' => 'Retry'
195
- assert_equal 302, last_response.status
196
- assert_equal 'http://example.org/retries', last_response.header['Location']
197
-
198
- get '/queues/default'
199
- assert_equal 200, last_response.status
200
- assert_match(/#{params.first['args'][2]}/, last_response.body)
201
- end
202
-
203
- it 'can kill a single retry now' do
204
- params = add_retry
205
- post "/retries/#{job_params(*params)}", 'kill' => 'Kill'
206
- assert_equal 302, last_response.status
207
- assert_equal 'http://example.org/retries', last_response.header['Location']
208
-
209
- get '/morgue'
210
- assert_equal 200, last_response.status
211
- assert_match(/#{params.first['args'][2]}/, last_response.body)
212
- end
213
-
214
- it 'can display scheduled' do
215
- get '/scheduled'
216
- assert_equal 200, last_response.status
217
- assert_match(/found/, last_response.body)
218
- refute_match(/HardWorker/, last_response.body)
219
-
220
- add_scheduled
221
-
222
- get '/scheduled'
223
- assert_equal 200, last_response.status
224
- refute_match(/found/, last_response.body)
225
- assert_match(/HardWorker/, last_response.body)
226
- end
227
-
228
- it 'can display a single scheduled job' do
229
- params = add_scheduled
230
- get '/scheduled/0-shouldntexist'
231
- assert_equal 302, last_response.status
232
- get "/scheduled/#{job_params(*params)}"
233
- assert_equal 200, last_response.status
234
- assert_match(/HardWorker/, last_response.body)
235
- end
236
-
237
- it 'handles missing scheduled job' do
238
- get "/scheduled/0-shouldntexist"
239
- assert_equal 302, last_response.status
240
- end
241
-
242
- it 'can add to queue a single scheduled job' do
243
- params = add_scheduled
244
- post "/scheduled/#{job_params(*params)}", 'add_to_queue' => true
245
- assert_equal 302, last_response.status
246
- assert_equal 'http://example.org/scheduled', last_response.header['Location']
247
-
248
- get '/queues/default'
249
- assert_equal 200, last_response.status
250
- assert_match(/#{params.first['args'][2]}/, last_response.body)
251
- end
252
-
253
- it 'can delete a single scheduled job' do
254
- params = add_scheduled
255
- post "/scheduled/#{job_params(*params)}", 'delete' => 'Delete'
256
- assert_equal 302, last_response.status
257
- assert_equal 'http://example.org/scheduled', last_response.header['Location']
258
-
259
- get "/scheduled"
260
- assert_equal 200, last_response.status
261
- refute_match(/#{params.first['args'][2]}/, last_response.body)
262
- end
263
-
264
- it 'can delete scheduled' do
265
- params = add_scheduled
266
- Sidekiq.redis do |conn|
267
- assert_equal 1, conn.zcard('schedule')
268
- post '/scheduled', 'key' => [job_params(*params)], 'delete' => 'Delete'
269
- assert_equal 302, last_response.status
270
- assert_equal 'http://example.org/scheduled', last_response.header['Location']
271
- assert_equal 0, conn.zcard('schedule')
272
- end
273
- end
274
-
275
- it "can move scheduled to default queue" do
276
- q = Sidekiq::Queue.new
277
- params = add_scheduled
278
- Sidekiq.redis do |conn|
279
- assert_equal 1, conn.zcard('schedule')
280
- assert_equal 0, q.size
281
- post '/scheduled', 'key' => [job_params(*params)], 'add_to_queue' => 'AddToQueue'
282
- assert_equal 302, last_response.status
283
- assert_equal 'http://example.org/scheduled', last_response.header['Location']
284
- assert_equal 0, conn.zcard('schedule')
285
- assert_equal 1, q.size
286
- get '/queues/default'
287
- assert_equal 200, last_response.status
288
- assert_match(/#{params[0]['args'][2]}/, last_response.body)
289
- end
290
- end
291
-
292
- it 'can retry all retries' do
293
- msg = add_retry.first
294
- add_retry
295
-
296
- post "/retries/all/retry", 'retry' => 'Retry'
297
- assert_equal 302, last_response.status
298
- assert_equal 'http://example.org/retries', last_response.header['Location']
299
- assert_equal 2, Sidekiq::Queue.new("default").size
300
-
301
- get '/queues/default'
302
- assert_equal 200, last_response.status
303
- assert_match(/#{msg['args'][2]}/, last_response.body)
304
- end
305
-
306
- it 'calls updatePage() once when polling' do
307
- get '/busy?poll=true'
308
- assert_equal 200, last_response.status
309
- assert_equal 1, last_response.body.scan('updatePage(').count
310
- end
311
-
312
- it 'escape job args and error messages' do
313
- # on /retries page
314
- params = add_xss_retry
315
- get '/retries'
316
- assert_equal 200, last_response.status
317
- assert_match(/FailWorker/, last_response.body)
318
-
319
- assert last_response.body.include?( "fail message: &lt;a&gt;hello&lt;&#x2F;a&gt;" )
320
- assert !last_response.body.include?( "fail message: <a>hello</a>" )
321
-
322
- assert last_response.body.include?( "args\">&quot;&lt;a&gt;hello&lt;&#x2F;a&gt;&quot;<" )
323
- assert !last_response.body.include?( "args\"><a>hello</a><" )
324
-
325
- # on /workers page
326
- Sidekiq.redis do |conn|
327
- pro = 'foo:1234'
328
- conn.sadd('processes', pro)
329
- conn.hmset(pro, 'info', Sidekiq.dump_json('started_at' => Time.now.to_f, 'labels' => ['frumduz'], 'queues' =>[]), 'busy', 1, 'beat', Time.now.to_f)
330
- identity = "#{pro}:workers"
331
- hash = {:queue => 'critical', :payload => { 'class' => "FailWorker", 'args' => ["<a>hello</a>"] }, :run_at => Time.now.to_i }
332
- conn.hmset(identity, 100001, Sidekiq.dump_json(hash))
333
- conn.incr('busy')
334
- end
335
-
336
- get '/busy'
337
- assert_equal 200, last_response.status
338
- assert_match(/FailWorker/, last_response.body)
339
- assert_match(/frumduz/, last_response.body)
340
- assert last_response.body.include?( "&lt;a&gt;hello&lt;&#x2F;a&gt;" )
341
- assert !last_response.body.include?( "<a>hello</a>" )
342
-
343
-
344
- # on /queues page
345
- params = add_xss_retry # sorry, don't know how to easily make this show up on queues page otherwise.
346
- post "/retries/#{job_params(*params)}", 'retry' => 'Retry'
347
- assert_equal 302, last_response.status
348
-
349
- get '/queues/foo'
350
- assert_equal 200, last_response.status
351
- assert last_response.body.include?( "&lt;a&gt;hello&lt;&#x2F;a&gt;" )
352
- assert !last_response.body.include?( "<a>hello</a>" )
353
- end
354
-
355
- it 'can show user defined tab' do
356
- begin
357
- Sidekiq::Web.tabs['Custom Tab'] = '/custom'
358
-
359
- get '/'
360
- assert_match 'Custom Tab', last_response.body
361
-
362
- ensure
363
- Sidekiq::Web.tabs.delete 'Custom Tab'
364
- end
365
- end
366
-
367
- it 'can display home' do
368
- get '/'
369
- assert_equal 200, last_response.status
370
- end
371
-
372
- Sidekiq::Web.settings.locales << File.join(File.dirname(__FILE__), "fixtures")
373
- it 'can show user defined tab with custom locales' do
374
- begin
375
- Sidekiq::Web.tabs['Custom Tab'] = '/custom'
376
- Sidekiq::Web.get('/custom') do
377
- t('translated_text')
378
- end
379
-
380
- get '/custom'
381
- assert_match(/Changed text/, last_response.body)
382
-
383
- ensure
384
- Sidekiq::Web.tabs.delete 'Custom Tab'
385
- end
386
- end
387
-
388
- describe 'dashboard/stats' do
389
- it 'redirects to stats' do
390
- get '/dashboard/stats'
391
- assert_equal 302, last_response.status
392
- assert_equal 'http://example.org/stats', last_response.header['Location']
393
- end
394
- end
395
-
396
- describe 'stats' do
397
- include Sidekiq::Util
398
-
399
- before do
400
- Sidekiq.redis do |conn|
401
- conn.set("stat:processed", 5)
402
- conn.set("stat:failed", 2)
403
- conn.sadd("queues", "default")
404
- end
405
- 2.times { add_retry }
406
- 3.times { add_scheduled }
407
- 4.times { add_worker }
408
-
409
- get '/stats'
410
- @response = Sidekiq.load_json(last_response.body)
411
- end
412
-
413
- it 'can refresh dashboard stats' do
414
- assert_equal 200, last_response.status
415
- end
416
-
417
- describe "for sidekiq" do
418
- it 'are namespaced' do
419
- assert_includes @response.keys, "sidekiq"
420
- end
421
-
422
- it 'reports processed' do
423
- assert_equal 5, @response["sidekiq"]["processed"]
424
- end
425
-
426
- it 'reports failed' do
427
- assert_equal 2, @response["sidekiq"]["failed"]
428
- end
429
-
430
- it 'reports busy' do
431
- assert_equal 4, @response["sidekiq"]["busy"]
432
- end
433
-
434
- it 'reports processes' do
435
- assert_equal 1, @response["sidekiq"]["processes"]
436
- end
437
-
438
- it 'reports retries' do
439
- assert_equal 2, @response["sidekiq"]["retries"]
440
- end
441
-
442
- it 'reports scheduled' do
443
- assert_equal 3, @response["sidekiq"]["scheduled"]
444
- end
445
-
446
- it 'reports latency' do
447
- assert_equal 0, @response["sidekiq"]["default_latency"]
448
- end
449
- end
450
-
451
- describe "for redis" do
452
- it 'are namespaced' do
453
- assert_includes @response.keys, "redis"
454
- end
455
-
456
- it 'reports version' do
457
- assert_includes @response["redis"].keys, "redis_version"
458
- end
459
-
460
- it 'reports uptime' do
461
- assert_includes @response["redis"].keys, "uptime_in_days"
462
- end
463
-
464
- it 'reports connected clients' do
465
- assert_includes @response["redis"].keys, "connected_clients"
466
- end
467
-
468
- it 'reports user memory' do
469
- assert_includes @response["redis"].keys, "used_memory_human"
470
- end
471
-
472
- it 'reports memory peak' do
473
- assert_includes @response["redis"].keys, "used_memory_peak_human"
474
- end
475
- end
476
- end
477
-
478
- describe 'stats/queues' do
479
- include Sidekiq::Util
480
-
481
- before do
482
- Sidekiq.redis do |conn|
483
- conn.set("stat:processed", 5)
484
- conn.set("stat:failed", 2)
485
- conn.sadd("queues", "default")
486
- conn.sadd("queues", "queue2")
487
- end
488
- 2.times { add_retry }
489
- 3.times { add_scheduled }
490
- 4.times { add_worker }
491
-
492
- get '/stats/queues'
493
- @response = Sidekiq.load_json(last_response.body)
494
- end
495
-
496
- it 'reports the queue depth' do
497
- assert_equal 0, @response["default"]
498
- assert_equal 0, @response["queue2"]
499
- end
500
- end
501
-
502
- describe 'dead jobs' do
503
- it 'shows empty index' do
504
- get 'morgue'
505
- assert_equal 200, last_response.status
506
- end
507
-
508
- it 'shows index with jobs' do
509
- (_, score) = add_dead
510
- get 'morgue'
511
- assert_equal 200, last_response.status
512
- assert_match(/#{score}/, last_response.body)
513
- end
514
-
515
- it 'can delete all dead' do
516
- 3.times { add_dead }
517
-
518
- assert_equal 3, Sidekiq::DeadSet.new.size
519
- post "/morgue/all/delete", 'delete' => 'Delete'
520
- assert_equal 0, Sidekiq::DeadSet.new.size
521
- assert_equal 302, last_response.status
522
- assert_equal 'http://example.org/morgue', last_response.header['Location']
523
- end
524
-
525
- it 'can retry a dead job' do
526
- params = add_dead
527
- post "/morgue/#{job_params(*params)}", 'retry' => 'Retry'
528
- assert_equal 302, last_response.status
529
- assert_equal 'http://example.org/morgue', last_response.header['Location']
530
-
531
- get '/queues/foo'
532
- assert_equal 200, last_response.status
533
- assert_match(/#{params.first['args'][2]}/, last_response.body)
534
- end
535
- end
536
-
537
- def add_scheduled
538
- score = Time.now.to_f
539
- msg = { 'class' => 'HardWorker',
540
- 'args' => ['bob', 1, Time.now.to_f],
541
- 'jid' => SecureRandom.hex(12) }
542
- Sidekiq.redis do |conn|
543
- conn.zadd('schedule', score, Sidekiq.dump_json(msg))
544
- end
545
- [msg, score]
546
- end
547
-
548
- def add_retry
549
- msg = { 'class' => 'HardWorker',
550
- 'args' => ['bob', 1, Time.now.to_f],
551
- 'queue' => 'default',
552
- 'error_message' => 'Some fake message',
553
- 'error_class' => 'RuntimeError',
554
- 'retry_count' => 0,
555
- 'failed_at' => Time.now.to_f,
556
- 'jid' => SecureRandom.hex(12) }
557
- score = Time.now.to_f
558
- Sidekiq.redis do |conn|
559
- conn.zadd('retry', score, Sidekiq.dump_json(msg))
560
- end
561
- [msg, score]
562
- end
563
-
564
- def add_dead
565
- msg = { 'class' => 'HardWorker',
566
- 'args' => ['bob', 1, Time.now.to_f],
567
- 'queue' => 'foo',
568
- 'error_message' => 'Some fake message',
569
- 'error_class' => 'RuntimeError',
570
- 'retry_count' => 0,
571
- 'failed_at' => Time.now.utc,
572
- 'jid' => SecureRandom.hex(12) }
573
- score = Time.now.to_f
574
- Sidekiq.redis do |conn|
575
- conn.zadd('dead', score, Sidekiq.dump_json(msg))
576
- end
577
- [msg, score]
578
- end
579
-
580
- def add_xss_retry
581
- msg = { 'class' => 'FailWorker',
582
- 'args' => ['<a>hello</a>'],
583
- 'queue' => 'foo',
584
- 'error_message' => 'fail message: <a>hello</a>',
585
- 'error_class' => 'RuntimeError',
586
- 'retry_count' => 0,
587
- 'failed_at' => Time.now.to_f,
588
- 'jid' => SecureRandom.hex(12) }
589
- score = Time.now.to_f
590
- Sidekiq.redis do |conn|
591
- conn.zadd('retry', score, Sidekiq.dump_json(msg))
592
- end
593
- [msg, score]
594
- end
595
-
596
- def add_worker
597
- key = "#{hostname}:#{$$}"
598
- msg = "{\"queue\":\"default\",\"payload\":{\"retry\":true,\"queue\":\"default\",\"timeout\":20,\"backtrace\":5,\"class\":\"HardWorker\",\"args\":[\"bob\",10,5],\"jid\":\"2b5ad2b016f5e063a1c62872\"},\"run_at\":1361208995}"
599
- Sidekiq.redis do |conn|
600
- conn.multi do
601
- conn.sadd("processes", key)
602
- conn.hmset(key, 'info', Sidekiq.dump_json('hostname' => 'foo', 'started_at' => Time.now.to_f, "queues" => []), 'at', Time.now.to_f, 'busy', 4)
603
- conn.hmset("#{key}:workers", Time.now.to_f, msg)
604
- end
605
- end
606
- end
607
- end
608
- end
@@ -1,53 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class TestWebHelpers < Sidekiq::Test
4
-
5
- class Helpers
6
- include Sidekiq::WebHelpers
7
-
8
- def initialize(params={})
9
- @thehash = default.merge(params)
10
- end
11
-
12
- def request
13
- self
14
- end
15
-
16
- def settings
17
- self
18
- end
19
-
20
- def locales
21
- ['web/locales']
22
- end
23
-
24
- def env
25
- @thehash
26
- end
27
-
28
- def default
29
- {
30
- }
31
- end
32
- end
33
-
34
- def test_locale_determination
35
- obj = Helpers.new
36
- assert_equal 'en', obj.locale
37
-
38
- obj = Helpers.new('HTTP_ACCEPT_LANGUAGE' => 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4,ru;q=0.2')
39
- assert_equal 'fr', obj.locale
40
-
41
- obj = Helpers.new('HTTP_ACCEPT_LANGUAGE' => 'zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4,ru;q=0.2')
42
- assert_equal 'zh-cn', obj.locale
43
-
44
- obj = Helpers.new('HTTP_ACCEPT_LANGUAGE' => 'nb-NO,nb;q=0.2')
45
- assert_equal 'nb', obj.locale
46
-
47
- obj = Helpers.new('HTTP_ACCEPT_LANGUAGE' => 'en-us; *')
48
- assert_equal 'en', obj.locale
49
-
50
- obj = Helpers.new('HTTP_ACCEPT_LANGUAGE' => '*')
51
- assert_equal 'en', obj.locale
52
- end
53
- end
Binary file
Binary file
@@ -1,27 +0,0 @@
1
- # Locale override examples for timeago
2
-
3
- You can represent time statements in most western languages where
4
- a prefix and/or suffix is used.
5
-
6
- The default case is to use suffix only (as in English), which you
7
- do by providing the `suffixAgo` and `suffixFromNow` settings in
8
- the strings hash (earlier versions of timeago used the deprecated
9
- `ago` and `fromNow` options). If present, they are used.
10
-
11
- 2 minutes [suffixAgo]
12
- 2 minutes [suffixFromNow]
13
-
14
- In case you want to use prefix only instead of
15
- suffix (e.g. Greek), you provide the `prefixAgo` and
16
- `prefixFromNow` options in the strings hash and leave `suffixAgo`
17
- and `suffixFromNow` empty or null.
18
-
19
- [prefixAgo] 2 minutes
20
- [prefixFromNow] 2 minutes
21
-
22
- For languages where you want to use a prefix only for future
23
- tense and prefix/suffix for past tense (for example swedish), you
24
- can combine the prefix and suffixes as needed.
25
-
26
- [prefixAgo] 2 minutes [suffixAgo]
27
- [prefixFromNow] 2 minutes