sidekiq 3.5.4 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -1,114 +0,0 @@
1
- require_relative 'helper'
2
- require 'sidekiq/scheduled'
3
-
4
- class TestScheduled < Sidekiq::Test
5
- class ScheduledWorker
6
- include Sidekiq::Worker
7
- def perform(x)
8
- end
9
- end
10
-
11
- describe 'poller' do
12
- before do
13
- Sidekiq.redis{|c| c.flushdb}
14
- @error_1 = { 'class' => ScheduledWorker.name, 'args' => [0], 'queue' => 'queue_1' }
15
- @error_2 = { 'class' => ScheduledWorker.name, 'args' => [1], 'queue' => 'queue_2' }
16
- @error_3 = { 'class' => ScheduledWorker.name, 'args' => [2], 'queue' => 'queue_3' }
17
- @future_1 = { 'class' => ScheduledWorker.name, 'args' => [3], 'queue' => 'queue_4' }
18
- @future_2 = { 'class' => ScheduledWorker.name, 'args' => [4], 'queue' => 'queue_5' }
19
- @future_3 = { 'class' => ScheduledWorker.name, 'args' => [5], 'queue' => 'queue_6' }
20
-
21
- @retry = Sidekiq::RetrySet.new
22
- @scheduled = Sidekiq::ScheduledSet.new
23
- @poller = Sidekiq::Scheduled::Poller.new
24
- end
25
-
26
- class Stopper
27
- def call(worker_class, job, queue, r)
28
- yield if job['args'].first.odd?
29
- end
30
- end
31
-
32
- it 'executes client middleware' do
33
- Sidekiq.client_middleware.add Stopper
34
- begin
35
- @retry.schedule (Time.now - 60).to_f, @error_1
36
- @retry.schedule (Time.now - 60).to_f, @error_2
37
- @scheduled.schedule (Time.now - 60).to_f, @future_2
38
- @scheduled.schedule (Time.now - 60).to_f, @future_3
39
-
40
- @poller.poll
41
-
42
- assert_equal 0, Sidekiq::Queue.new("queue_1").size
43
- assert_equal 1, Sidekiq::Queue.new("queue_2").size
44
- assert_equal 0, Sidekiq::Queue.new("queue_5").size
45
- assert_equal 1, Sidekiq::Queue.new("queue_6").size
46
- ensure
47
- Sidekiq.client_middleware.remove Stopper
48
- end
49
- end
50
-
51
- it 'should empty the retry and scheduled queues up to the current time' do
52
- created_time = Time.new(2013, 2, 3)
53
- enqueued_time = Time.new(2013, 2, 4)
54
-
55
- Time.stub(:now, created_time) do
56
- @retry.schedule (enqueued_time - 60).to_f, @error_1.merge!('created_at' => created_time.to_f)
57
- @retry.schedule (enqueued_time - 50).to_f, @error_2.merge!('created_at' => created_time.to_f)
58
- @retry.schedule (enqueued_time + 60).to_f, @error_3.merge!('created_at' => created_time.to_f)
59
- @scheduled.schedule (enqueued_time - 60).to_f, @future_1.merge!('created_at' => created_time.to_f)
60
- @scheduled.schedule (enqueued_time - 50).to_f, @future_2.merge!('created_at' => created_time.to_f)
61
- @scheduled.schedule (enqueued_time + 60).to_f, @future_3.merge!('created_at' => created_time.to_f)
62
- end
63
-
64
- Time.stub(:now, enqueued_time) do
65
- @poller.poll
66
-
67
- Sidekiq.redis do |conn|
68
- %w(queue:queue_1 queue:queue_2 queue:queue_4 queue:queue_5).each do |queue_name|
69
- assert_equal 1, conn.llen(queue_name)
70
- job = Sidekiq.load_json(conn.lrange(queue_name, 0, -1)[0])
71
- assert_equal enqueued_time.to_f, job['enqueued_at']
72
- assert_equal created_time.to_f, job['created_at']
73
- end
74
- end
75
-
76
- assert_equal 1, @retry.size
77
- assert_equal 1, @scheduled.size
78
- end
79
- end
80
-
81
- def with_sidekiq_option(name, value)
82
- _original, Sidekiq.options[name] = Sidekiq.options[name], value
83
- begin
84
- yield
85
- ensure
86
- Sidekiq.options[name] = _original
87
- end
88
- end
89
-
90
- it 'generates random intervals that target a configured average' do
91
- with_sidekiq_option(:poll_interval_average, 10) do
92
- i = 500
93
- intervals = i.times.map{ @poller.send(:random_poll_interval) }
94
-
95
- assert intervals.all?{|x| x >= 5}
96
- assert intervals.all?{|x| x <= 15}
97
- assert_in_delta 10, intervals.reduce(&:+).to_f / i, 0.5
98
- end
99
- end
100
-
101
- it 'calculates an average poll interval based on the number of known Sidekiq processes' do
102
- with_sidekiq_option(:average_scheduled_poll_interval, 10) do
103
- 3.times do |i|
104
- Sidekiq.redis do |conn|
105
- conn.sadd("processes", "process-#{i}")
106
- conn.hset("process-#{i}", "info", nil)
107
- end
108
- end
109
-
110
- assert_equal 30, @poller.send(:scaled_poll_interval)
111
- end
112
- end
113
- end
114
- end
@@ -1,49 +0,0 @@
1
- require_relative 'helper'
2
- require 'sidekiq/scheduled'
3
-
4
- class TestScheduling < Sidekiq::Test
5
- describe 'middleware' do
6
- class ScheduledWorker
7
- include Sidekiq::Worker
8
- sidekiq_options :queue => :custom_queue
9
- def perform(x)
10
- end
11
- end
12
-
13
- it 'schedules jobs' do
14
- ss = Sidekiq::ScheduledSet.new
15
- ss.clear
16
-
17
- assert_equal 0, ss.size
18
-
19
- assert ScheduledWorker.perform_in(600, 'mike')
20
- assert_equal 1, ss.size
21
-
22
- assert ScheduledWorker.perform_in(1.month, 'mike')
23
- assert_equal 2, ss.size
24
-
25
- assert ScheduledWorker.perform_in(5.days.from_now, 'mike')
26
- assert_equal 3, ss.size
27
-
28
- q = Sidekiq::Queue.new("custom_queue")
29
- qs = q.size
30
- assert ScheduledWorker.perform_in(-300, 'mike')
31
- assert_equal 3, ss.size
32
- assert_equal qs+1, q.size
33
-
34
- assert Sidekiq::Client.push_bulk('class' => ScheduledWorker, 'args' => [['mike'], ['mike']], 'at' => 600)
35
- assert_equal 5, ss.size
36
- end
37
-
38
- it 'removes the enqueued_at field when scheduling' do
39
- ss = Sidekiq::ScheduledSet.new
40
- ss.clear
41
-
42
- assert ScheduledWorker.perform_in(1.month, 'mike')
43
- job = ss.first
44
- assert job['created_at']
45
- refute job['enqueued_at']
46
- end
47
- end
48
-
49
- end
data/test/test_sidekiq.rb DELETED
@@ -1,99 +0,0 @@
1
- # encoding: utf-8
2
- require_relative 'helper'
3
-
4
- class TestSidekiq < Sidekiq::Test
5
- describe 'json processing' do
6
- it 'handles json' do
7
- assert_equal({"foo" => "bar"}, Sidekiq.load_json("{\"foo\":\"bar\"}"))
8
- assert_equal "{\"foo\":\"bar\"}", Sidekiq.dump_json({ "foo" => "bar" })
9
- end
10
- end
11
-
12
- describe "redis connection" do
13
- it "returns error without creating a connection if block is not given" do
14
- assert_raises(ArgumentError) do
15
- Sidekiq.redis
16
- end
17
- end
18
- end
19
-
20
- describe "❨╯°□°❩╯︵┻━┻" do
21
- before { $stdout = StringIO.new }
22
- after { $stdout = STDOUT }
23
-
24
- it "allows angry developers to express their emotional constitution and remedies it" do
25
- Sidekiq.❨╯°□°❩╯︵┻━┻
26
- assert_equal "Calm down, yo.\n", $stdout.string
27
- end
28
- end
29
-
30
- describe 'lifecycle events' do
31
- it 'handles invalid input' do
32
- Sidekiq.options[:lifecycle_events][:startup].clear
33
-
34
- e = assert_raises ArgumentError do
35
- Sidekiq.on(:startp)
36
- end
37
- assert_match(/Invalid event name/, e.message)
38
- e = assert_raises ArgumentError do
39
- Sidekiq.on('startup')
40
- end
41
- assert_match(/Symbols only/, e.message)
42
- Sidekiq.on(:startup) do
43
- 1 + 1
44
- end
45
-
46
- assert_equal 2, Sidekiq.options[:lifecycle_events][:startup].first.call
47
- end
48
- end
49
-
50
- describe 'default_worker_options' do
51
- it 'stringifies keys' do
52
- @old_options = Sidekiq.default_worker_options
53
- begin
54
- Sidekiq.default_worker_options = { queue: 'cat'}
55
- assert_equal 'cat', Sidekiq.default_worker_options['queue']
56
- ensure
57
- Sidekiq.default_worker_options = @old_options
58
- end
59
- end
60
- end
61
-
62
- describe 'error handling' do
63
- it 'deals with user-specified error handlers which raise errors' do
64
- output = capture_logging do
65
- begin
66
- Sidekiq.error_handlers << proc {|x, hash|
67
- raise 'boom'
68
- }
69
- cli = Sidekiq::CLI.new
70
- cli.handle_exception(RuntimeError.new("hello"))
71
- ensure
72
- Sidekiq.error_handlers.pop
73
- end
74
- end
75
- assert_includes output, "boom"
76
- assert_includes output, "ERROR"
77
- end
78
- end
79
-
80
- describe 'redis connection' do
81
- it 'does not continually retry' do
82
- assert_raises Redis::CommandError do
83
- Sidekiq.redis do |c|
84
- raise Redis::CommandError, "READONLY You can't write against a read only slave."
85
- end
86
- end
87
- end
88
-
89
- it 'reconnects if connection is flagged as readonly' do
90
- counts = []
91
- Sidekiq.redis do |c|
92
- counts << c.info['total_connections_received'].to_i
93
- raise Redis::CommandError, "READONLY You can't write against a read only slave." if counts.size == 1
94
- end
95
- assert_equal 2, counts.size
96
- assert_equal counts[0] + 1, counts[1]
97
- end
98
- end
99
- end
data/test/test_testing.rb DELETED
@@ -1,142 +0,0 @@
1
- require_relative 'helper'
2
-
3
- require 'active_record'
4
- require 'action_mailer'
5
- require 'sidekiq/rails'
6
- require 'sidekiq/extensions/action_mailer'
7
- require 'sidekiq/extensions/active_record'
8
-
9
- Sidekiq.hook_rails!
10
-
11
- class TestTesting < Sidekiq::Test
12
- describe 'sidekiq testing' do
13
- describe 'require/load sidekiq/testing.rb' do
14
- before do
15
- require 'sidekiq/testing'
16
- end
17
-
18
- after do
19
- Sidekiq::Testing.disable!
20
- end
21
-
22
- it 'enables fake testing' do
23
- Sidekiq::Testing.fake!
24
- assert Sidekiq::Testing.enabled?
25
- assert Sidekiq::Testing.fake?
26
- refute Sidekiq::Testing.inline?
27
- end
28
-
29
- it 'enables fake testing in a block' do
30
- Sidekiq::Testing.disable!
31
- assert Sidekiq::Testing.disabled?
32
- refute Sidekiq::Testing.fake?
33
-
34
- Sidekiq::Testing.fake! do
35
- assert Sidekiq::Testing.enabled?
36
- assert Sidekiq::Testing.fake?
37
- refute Sidekiq::Testing.inline?
38
- end
39
-
40
- refute Sidekiq::Testing.enabled?
41
- refute Sidekiq::Testing.fake?
42
- end
43
-
44
- it 'disables testing in a block' do
45
- Sidekiq::Testing.fake!
46
- assert Sidekiq::Testing.fake?
47
-
48
- Sidekiq::Testing.disable! do
49
- refute Sidekiq::Testing.fake?
50
- assert Sidekiq::Testing.disabled?
51
- end
52
-
53
- assert Sidekiq::Testing.fake?
54
- assert Sidekiq::Testing.enabled?
55
- end
56
- end
57
-
58
- describe 'require/load sidekiq/testing/inline.rb' do
59
- before do
60
- require 'sidekiq/testing/inline'
61
- end
62
-
63
- after do
64
- Sidekiq::Testing.disable!
65
- end
66
-
67
- it 'enables inline testing' do
68
- Sidekiq::Testing.inline!
69
- assert Sidekiq::Testing.enabled?
70
- assert Sidekiq::Testing.inline?
71
- refute Sidekiq::Testing.fake?
72
- end
73
-
74
- it 'enables inline testing in a block' do
75
- Sidekiq::Testing.disable!
76
- assert Sidekiq::Testing.disabled?
77
- refute Sidekiq::Testing.fake?
78
-
79
- Sidekiq::Testing.inline! do
80
- assert Sidekiq::Testing.enabled?
81
- assert Sidekiq::Testing.inline?
82
- end
83
-
84
- refute Sidekiq::Testing.enabled?
85
- refute Sidekiq::Testing.inline?
86
- refute Sidekiq::Testing.fake?
87
- end
88
- end
89
- end
90
-
91
- describe 'with middleware' do
92
- before do
93
- require 'sidekiq/testing'
94
- end
95
-
96
- after do
97
- Sidekiq::Testing.disable!
98
- end
99
-
100
- class AttributeWorker
101
- include Sidekiq::Worker
102
- class_attribute :count
103
- self.count = 0
104
- attr_accessor :foo
105
-
106
- def perform
107
- self.class.count += 1 if foo == :bar
108
- end
109
- end
110
-
111
- class AttributeMiddleware
112
- def call(worker, msg, queue)
113
- worker.foo = :bar if worker.respond_to?(:foo=)
114
- yield
115
- end
116
- end
117
-
118
- it 'wraps the inlined worker with middleware' do
119
- Sidekiq::Testing.server_middleware do |chain|
120
- chain.add AttributeMiddleware
121
- end
122
-
123
- begin
124
- Sidekiq::Testing.fake! do
125
- AttributeWorker.perform_async
126
- assert_equal 0, AttributeWorker.count
127
- end
128
-
129
- AttributeWorker.perform_one
130
- assert_equal 1, AttributeWorker.count
131
-
132
- Sidekiq::Testing.inline! do
133
- AttributeWorker.perform_async
134
- assert_equal 2, AttributeWorker.count
135
- end
136
- ensure
137
- Sidekiq::Testing.server_middleware.clear
138
- end
139
- end
140
- end
141
-
142
- end
@@ -1,268 +0,0 @@
1
- require_relative 'helper'
2
-
3
- require 'active_record'
4
- require 'action_mailer'
5
- require 'sidekiq/rails'
6
- require 'sidekiq/extensions/action_mailer'
7
- require 'sidekiq/extensions/active_record'
8
-
9
- Sidekiq.hook_rails!
10
-
11
- class TestTesting < Sidekiq::Test
12
- describe 'sidekiq testing' do
13
- class PerformError < RuntimeError; end
14
-
15
- class DirectWorker
16
- include Sidekiq::Worker
17
- def perform(a, b)
18
- a + b
19
- end
20
- end
21
-
22
- class EnqueuedWorker
23
- include Sidekiq::Worker
24
- def perform(a, b)
25
- a + b
26
- end
27
- end
28
-
29
- class StoredWorker
30
- include Sidekiq::Worker
31
- def perform(error)
32
- raise PerformError if error
33
- end
34
- end
35
-
36
- class FooMailer < ActionMailer::Base
37
- def bar(str)
38
- str
39
- end
40
- end
41
-
42
- class FooModel < ActiveRecord::Base
43
- def bar(str)
44
- str
45
- end
46
- end
47
-
48
- before do
49
- require 'sidekiq/testing'
50
- Sidekiq::Testing.fake!
51
- EnqueuedWorker.jobs.clear
52
- DirectWorker.jobs.clear
53
- end
54
-
55
- after do
56
- Sidekiq::Testing.disable!
57
- end
58
-
59
- it 'stubs the async call' do
60
- assert_equal 0, DirectWorker.jobs.size
61
- assert DirectWorker.perform_async(1, 2)
62
- assert_equal 1, DirectWorker.jobs.size
63
- assert DirectWorker.perform_in(10, 1, 2)
64
- assert_equal 2, DirectWorker.jobs.size
65
- assert DirectWorker.perform_at(10, 1, 2)
66
- assert_equal 3, DirectWorker.jobs.size
67
- assert_in_delta 10.seconds.from_now.to_f, DirectWorker.jobs.last['at'], 0.01
68
- end
69
-
70
- it 'stubs the delay call on mailers' do
71
- assert_equal 0, Sidekiq::Extensions::DelayedMailer.jobs.size
72
- FooMailer.delay.bar('hello!')
73
- assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs.size
74
- end
75
-
76
- class Something
77
- def self.foo(x)
78
- end
79
- end
80
-
81
- it 'stubs the delay call on models' do
82
- assert_equal 0, Sidekiq::Extensions::DelayedClass.jobs.size
83
- Something.delay.foo(Date.today)
84
- assert_equal 1, Sidekiq::Extensions::DelayedClass.jobs.size
85
- end
86
-
87
- it 'stubs the enqueue call' do
88
- assert_equal 0, EnqueuedWorker.jobs.size
89
- assert Sidekiq::Client.enqueue(EnqueuedWorker, 1, 2)
90
- assert_equal 1, EnqueuedWorker.jobs.size
91
- end
92
-
93
- it 'stubs the enqueue_to call' do
94
- assert_equal 0, EnqueuedWorker.jobs.size
95
- assert Sidekiq::Client.enqueue_to('someq', EnqueuedWorker, 1, 2)
96
- assert_equal 1, EnqueuedWorker.jobs.size
97
- end
98
-
99
- it 'executes all stored jobs' do
100
- assert StoredWorker.perform_async(false)
101
- assert StoredWorker.perform_async(true)
102
-
103
- assert_equal 2, StoredWorker.jobs.size
104
- assert_raises PerformError do
105
- StoredWorker.drain
106
- end
107
- assert_equal 0, StoredWorker.jobs.size
108
- end
109
-
110
- class SpecificJidWorker
111
- include Sidekiq::Worker
112
- class_attribute :count
113
- self.count = 0
114
- def perform(worker_jid)
115
- return unless worker_jid == self.jid
116
- self.class.count += 1
117
- end
118
- end
119
-
120
- it 'execute only jobs with assigned JID' do
121
- 4.times do |i|
122
- jid = SpecificJidWorker.perform_async(nil)
123
- if i % 2 == 0
124
- SpecificJidWorker.jobs[-1]["args"] = ["wrong_jid"]
125
- else
126
- SpecificJidWorker.jobs[-1]["args"] = [jid]
127
- end
128
- end
129
-
130
- SpecificJidWorker.perform_one
131
- assert_equal 0, SpecificJidWorker.count
132
-
133
- SpecificJidWorker.perform_one
134
- assert_equal 1, SpecificJidWorker.count
135
-
136
- SpecificJidWorker.drain
137
- assert_equal 2, SpecificJidWorker.count
138
- end
139
-
140
- it 'round trip serializes the job arguments' do
141
- assert StoredWorker.perform_async(:mike)
142
- job = StoredWorker.jobs.first
143
- assert_equal "mike", job['args'].first
144
- StoredWorker.clear
145
- end
146
-
147
- it 'perform_one runs only one job' do
148
- DirectWorker.perform_async(1, 2)
149
- DirectWorker.perform_async(3, 4)
150
- assert_equal 2, DirectWorker.jobs.size
151
-
152
- DirectWorker.perform_one
153
- assert_equal 1, DirectWorker.jobs.size
154
-
155
- DirectWorker.clear
156
- end
157
-
158
- it 'perform_one raise error upon empty queue' do
159
- DirectWorker.clear
160
- assert_raises Sidekiq::EmptyQueueError do
161
- DirectWorker.perform_one
162
- end
163
- end
164
-
165
- class FirstWorker
166
- include Sidekiq::Worker
167
- class_attribute :count
168
- self.count = 0
169
- def perform
170
- self.class.count += 1
171
- end
172
- end
173
-
174
- class SecondWorker
175
- include Sidekiq::Worker
176
- class_attribute :count
177
- self.count = 0
178
- def perform
179
- self.class.count += 1
180
- end
181
- end
182
-
183
- class ThirdWorker
184
- include Sidekiq::Worker
185
- class_attribute :count
186
- def perform
187
- FirstWorker.perform_async
188
- SecondWorker.perform_async
189
- end
190
- end
191
-
192
- it 'clears jobs across all workers' do
193
- Sidekiq::Worker.jobs.clear
194
- FirstWorker.count = 0
195
- SecondWorker.count = 0
196
-
197
- assert_equal 0, FirstWorker.jobs.size
198
- assert_equal 0, SecondWorker.jobs.size
199
-
200
- FirstWorker.perform_async
201
- SecondWorker.perform_async
202
-
203
- assert_equal 1, FirstWorker.jobs.size
204
- assert_equal 1, SecondWorker.jobs.size
205
-
206
- Sidekiq::Worker.clear_all
207
-
208
- assert_equal 0, FirstWorker.jobs.size
209
- assert_equal 0, SecondWorker.jobs.size
210
-
211
- assert_equal 0, FirstWorker.count
212
- assert_equal 0, SecondWorker.count
213
- end
214
-
215
- it 'drains jobs across all workers' do
216
- Sidekiq::Worker.jobs.clear
217
- FirstWorker.count = 0
218
- SecondWorker.count = 0
219
-
220
- assert_equal 0, FirstWorker.jobs.size
221
- assert_equal 0, SecondWorker.jobs.size
222
-
223
- assert_equal 0, FirstWorker.count
224
- assert_equal 0, SecondWorker.count
225
-
226
- FirstWorker.perform_async
227
- SecondWorker.perform_async
228
-
229
- assert_equal 1, FirstWorker.jobs.size
230
- assert_equal 1, SecondWorker.jobs.size
231
-
232
- Sidekiq::Worker.drain_all
233
-
234
- assert_equal 0, FirstWorker.jobs.size
235
- assert_equal 0, SecondWorker.jobs.size
236
-
237
- assert_equal 1, FirstWorker.count
238
- assert_equal 1, SecondWorker.count
239
- end
240
-
241
- it 'drains jobs across all workers even when workers create new jobs' do
242
- Sidekiq::Worker.jobs.clear
243
- FirstWorker.count = 0
244
- SecondWorker.count = 0
245
-
246
- assert_equal 0, ThirdWorker.jobs.size
247
-
248
- assert_equal 0, FirstWorker.count
249
- assert_equal 0, SecondWorker.count
250
-
251
- ThirdWorker.perform_async
252
-
253
- assert_equal 1, ThirdWorker.jobs.size
254
-
255
- Sidekiq::Worker.drain_all
256
-
257
- assert_equal 0, ThirdWorker.jobs.size
258
-
259
- assert_equal 1, FirstWorker.count
260
- assert_equal 1, SecondWorker.count
261
- end
262
-
263
- it 'can execute a job' do
264
- DirectWorker.execute_job(DirectWorker.new, [2, 3])
265
- end
266
-
267
- end
268
- end