kulesa-sidekiq 1.2.2
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.
- data/.gitignore +6 -0
- data/.rvmrc +4 -0
- data/COMM-LICENSE +83 -0
- data/Changes.md +207 -0
- data/Gemfile +12 -0
- data/LICENSE +22 -0
- data/README.md +61 -0
- data/Rakefile +9 -0
- data/bin/client +7 -0
- data/bin/sidekiq +14 -0
- data/bin/sidekiqctl +74 -0
- data/config.ru +18 -0
- data/examples/chef/cookbooks/sidekiq/README.rdoc +11 -0
- data/examples/chef/cookbooks/sidekiq/recipes/default.rb +55 -0
- data/examples/chef/cookbooks/sidekiq/templates/default/monitrc.conf.erb +8 -0
- data/examples/chef/cookbooks/sidekiq/templates/default/sidekiq.erb +219 -0
- data/examples/chef/cookbooks/sidekiq/templates/default/sidekiq.yml.erb +22 -0
- data/examples/clockwork.rb +44 -0
- data/examples/config.yml +10 -0
- data/examples/monitrc.conf +6 -0
- data/examples/por.rb +27 -0
- data/examples/scheduling.rb +37 -0
- data/examples/sinkiq.rb +59 -0
- data/examples/web-ui.png +0 -0
- data/lib/sidekiq.rb +98 -0
- data/lib/sidekiq/capistrano.rb +35 -0
- data/lib/sidekiq/cli.rb +214 -0
- data/lib/sidekiq/client.rb +72 -0
- data/lib/sidekiq/extensions/action_mailer.rb +26 -0
- data/lib/sidekiq/extensions/active_record.rb +27 -0
- data/lib/sidekiq/extensions/generic_proxy.rb +21 -0
- data/lib/sidekiq/fetch.rb +76 -0
- data/lib/sidekiq/logging.rb +46 -0
- data/lib/sidekiq/manager.rb +163 -0
- data/lib/sidekiq/middleware/chain.rb +96 -0
- data/lib/sidekiq/middleware/client/unique_jobs.rb +36 -0
- data/lib/sidekiq/middleware/server/active_record.rb +13 -0
- data/lib/sidekiq/middleware/server/exception_handler.rb +38 -0
- data/lib/sidekiq/middleware/server/failure_jobs.rb +25 -0
- data/lib/sidekiq/middleware/server/logging.rb +31 -0
- data/lib/sidekiq/middleware/server/retry_jobs.rb +69 -0
- data/lib/sidekiq/middleware/server/timeout.rb +21 -0
- data/lib/sidekiq/middleware/server/unique_jobs.rb +17 -0
- data/lib/sidekiq/processor.rb +92 -0
- data/lib/sidekiq/rails.rb +21 -0
- data/lib/sidekiq/redis_connection.rb +27 -0
- data/lib/sidekiq/retry.rb +59 -0
- data/lib/sidekiq/testing.rb +44 -0
- data/lib/sidekiq/testing/inline.rb +37 -0
- data/lib/sidekiq/util.rb +40 -0
- data/lib/sidekiq/version.rb +3 -0
- data/lib/sidekiq/web.rb +185 -0
- data/lib/sidekiq/worker.rb +62 -0
- data/lib/sidekiq/yaml_patch.rb +21 -0
- data/myapp/.gitignore +15 -0
- data/myapp/Capfile +5 -0
- data/myapp/Gemfile +19 -0
- data/myapp/Rakefile +7 -0
- data/myapp/app/controllers/application_controller.rb +3 -0
- data/myapp/app/controllers/work_controller.rb +38 -0
- data/myapp/app/helpers/application_helper.rb +2 -0
- data/myapp/app/mailers/.gitkeep +0 -0
- data/myapp/app/mailers/user_mailer.rb +9 -0
- data/myapp/app/models/.gitkeep +0 -0
- data/myapp/app/models/post.rb +5 -0
- data/myapp/app/views/layouts/application.html.erb +14 -0
- data/myapp/app/views/user_mailer/greetings.html.erb +3 -0
- data/myapp/app/views/work/index.html.erb +1 -0
- data/myapp/app/workers/hard_worker.rb +10 -0
- data/myapp/config.ru +4 -0
- data/myapp/config/application.rb +59 -0
- data/myapp/config/boot.rb +6 -0
- data/myapp/config/database.yml +25 -0
- data/myapp/config/deploy.rb +15 -0
- data/myapp/config/environment.rb +5 -0
- data/myapp/config/environments/development.rb +38 -0
- data/myapp/config/environments/production.rb +67 -0
- data/myapp/config/environments/test.rb +37 -0
- data/myapp/config/initializers/backtrace_silencers.rb +7 -0
- data/myapp/config/initializers/inflections.rb +15 -0
- data/myapp/config/initializers/mime_types.rb +5 -0
- data/myapp/config/initializers/secret_token.rb +7 -0
- data/myapp/config/initializers/session_store.rb +8 -0
- data/myapp/config/initializers/sidekiq.rb +6 -0
- data/myapp/config/initializers/wrap_parameters.rb +14 -0
- data/myapp/config/locales/en.yml +5 -0
- data/myapp/config/routes.rb +10 -0
- data/myapp/db/migrate/20120123214055_create_posts.rb +10 -0
- data/myapp/db/seeds.rb +7 -0
- data/myapp/lib/assets/.gitkeep +0 -0
- data/myapp/lib/tasks/.gitkeep +0 -0
- data/myapp/log/.gitkeep +0 -0
- data/myapp/script/rails +6 -0
- data/sidekiq.gemspec +27 -0
- data/test/config.yml +9 -0
- data/test/fake_env.rb +0 -0
- data/test/helper.rb +16 -0
- data/test/test_cli.rb +168 -0
- data/test/test_client.rb +119 -0
- data/test/test_extensions.rb +69 -0
- data/test/test_manager.rb +51 -0
- data/test/test_middleware.rb +92 -0
- data/test/test_processor.rb +32 -0
- data/test/test_retry.rb +125 -0
- data/test/test_stats.rb +68 -0
- data/test/test_testing.rb +97 -0
- data/test/test_testing_inline.rb +75 -0
- data/test/test_web.rb +122 -0
- data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
- data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
- data/web/assets/javascripts/application.js +20 -0
- data/web/assets/javascripts/vendor/bootstrap.js +12 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-alert.js +91 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-button.js +98 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-carousel.js +154 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-collapse.js +136 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-dropdown.js +92 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-modal.js +210 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-popover.js +95 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-scrollspy.js +125 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-tab.js +130 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-tooltip.js +270 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-transition.js +51 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-typeahead.js +271 -0
- data/web/assets/javascripts/vendor/jquery.js +9266 -0
- data/web/assets/javascripts/vendor/jquery.timeago.js +148 -0
- data/web/assets/stylesheets/application.css +27 -0
- data/web/assets/stylesheets/vendor/bootstrap-responsive.css +567 -0
- data/web/assets/stylesheets/vendor/bootstrap.css +3365 -0
- data/web/views/index.slim +48 -0
- data/web/views/layout.slim +26 -0
- data/web/views/queue.slim +11 -0
- data/web/views/retries.slim +29 -0
- data/web/views/retry.slim +52 -0
- metadata +371 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
require 'sidekiq'
|
|
3
|
+
require 'sidekiq/manager'
|
|
4
|
+
|
|
5
|
+
# for TimedQueue
|
|
6
|
+
require 'connection_pool'
|
|
7
|
+
|
|
8
|
+
class TestManager < MiniTest::Unit::TestCase
|
|
9
|
+
describe 'with redis' do
|
|
10
|
+
before do
|
|
11
|
+
Sidekiq.redis = REDIS
|
|
12
|
+
Sidekiq.redis {|c| c.flushdb }
|
|
13
|
+
$processed = 0
|
|
14
|
+
$mutex = Mutex.new
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class IntegrationWorker
|
|
18
|
+
include Sidekiq::Worker
|
|
19
|
+
sidekiq_options :queue => 'foo'
|
|
20
|
+
|
|
21
|
+
def perform(a, b)
|
|
22
|
+
$mutex.synchronize do
|
|
23
|
+
$processed += 1
|
|
24
|
+
end
|
|
25
|
+
a + b
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'processes messages' do
|
|
30
|
+
IntegrationWorker.perform_async(1, 2)
|
|
31
|
+
IntegrationWorker.perform_async(1, 3)
|
|
32
|
+
|
|
33
|
+
q = TimedQueue.new
|
|
34
|
+
mgr = Sidekiq::Manager.new(:queues => [:foo], :concurrency => 2)
|
|
35
|
+
mgr.when_done do |_|
|
|
36
|
+
q << 'done' if $processed == 2
|
|
37
|
+
end
|
|
38
|
+
mgr.start!
|
|
39
|
+
result = q.timed_pop(1.0)
|
|
40
|
+
assert_equal 'done', result
|
|
41
|
+
mgr.stop
|
|
42
|
+
mgr.terminate
|
|
43
|
+
|
|
44
|
+
# Gross bloody hack because I can't get the actor threads
|
|
45
|
+
# to shut down cleanly in the test. Need @bascule's help here.
|
|
46
|
+
(Thread.list - [Thread.current]).each do |t|
|
|
47
|
+
t.raise Interrupt
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
require 'sidekiq/middleware/chain'
|
|
3
|
+
require 'sidekiq/middleware/server/unique_jobs'
|
|
4
|
+
require 'sidekiq/processor'
|
|
5
|
+
|
|
6
|
+
class TestMiddleware < MiniTest::Unit::TestCase
|
|
7
|
+
describe 'middleware chain' do
|
|
8
|
+
before do
|
|
9
|
+
$errors = []
|
|
10
|
+
Sidekiq.redis = REDIS
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'handles errors' do
|
|
14
|
+
handler = Sidekiq::Middleware::Server::ExceptionHandler.new
|
|
15
|
+
|
|
16
|
+
assert_raises ArgumentError do
|
|
17
|
+
handler.call('', { :a => 1 }, 'default') do
|
|
18
|
+
raise ArgumentError
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
assert_equal 1, $errors.size
|
|
22
|
+
assert_equal({ :a => 1 }, $errors[0][:parameters])
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class CustomMiddleware
|
|
26
|
+
def initialize(name, recorder)
|
|
27
|
+
@name = name
|
|
28
|
+
@recorder = recorder
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def call(*args)
|
|
32
|
+
@recorder << [@name, 'before']
|
|
33
|
+
yield
|
|
34
|
+
@recorder << [@name, 'after']
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'supports custom middleware' do
|
|
39
|
+
chain = Sidekiq::Middleware::Chain.new
|
|
40
|
+
chain.add CustomMiddleware, 1, []
|
|
41
|
+
|
|
42
|
+
assert_equal CustomMiddleware, chain.entries.last.klass
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class CustomWorker
|
|
46
|
+
include Sidekiq::Worker
|
|
47
|
+
def perform(recorder)
|
|
48
|
+
recorder << ['work_performed']
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
class NonYieldingMiddleware
|
|
53
|
+
def call(*args)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'executes middleware in the proper order' do
|
|
58
|
+
recorder = []
|
|
59
|
+
msg = { 'class' => CustomWorker.to_s, 'args' => [recorder] }
|
|
60
|
+
|
|
61
|
+
Sidekiq.server_middleware do |chain|
|
|
62
|
+
# should only add once, second should be ignored
|
|
63
|
+
2.times { |i| chain.add CustomMiddleware, i.to_s, recorder }
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
boss = MiniTest::Mock.new
|
|
67
|
+
processor = Sidekiq::Processor.new(boss)
|
|
68
|
+
boss.expect(:processor_done!, nil, [processor])
|
|
69
|
+
processor.process(msg, 'default')
|
|
70
|
+
assert_equal %w(0 before work_performed 0 after), recorder.flatten
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'allows middleware to abruptly stop processing rest of chain' do
|
|
74
|
+
recorder = []
|
|
75
|
+
chain = Sidekiq::Middleware::Chain.new
|
|
76
|
+
chain.add NonYieldingMiddleware
|
|
77
|
+
chain.add CustomMiddleware, 1, recorder
|
|
78
|
+
|
|
79
|
+
final_action = nil
|
|
80
|
+
chain.invoke { final_action = true }
|
|
81
|
+
assert_equal nil, final_action
|
|
82
|
+
assert_equal [], recorder
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
class FakeAirbrake
|
|
88
|
+
def self.notify(ex, hash)
|
|
89
|
+
$errors << hash
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
Airbrake = FakeAirbrake
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
require 'sidekiq/processor'
|
|
3
|
+
|
|
4
|
+
class TestProcessor < MiniTest::Unit::TestCase
|
|
5
|
+
describe 'with mock setup' do
|
|
6
|
+
before do
|
|
7
|
+
$invokes = 0
|
|
8
|
+
$errors = []
|
|
9
|
+
@boss = MiniTest::Mock.new
|
|
10
|
+
Celluloid.logger = nil
|
|
11
|
+
Sidekiq.redis = REDIS
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class MockWorker
|
|
15
|
+
include Sidekiq::Worker
|
|
16
|
+
def perform(args)
|
|
17
|
+
raise "kerboom!" if args == 'boom'
|
|
18
|
+
$invokes += 1
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'processes as expected' do
|
|
23
|
+
msg = { 'class' => MockWorker.to_s, 'args' => ['myarg'] }
|
|
24
|
+
processor = ::Sidekiq::Processor.new(@boss)
|
|
25
|
+
@boss.expect(:processor_done!, nil, [processor])
|
|
26
|
+
processor.process(msg, 'default')
|
|
27
|
+
@boss.verify
|
|
28
|
+
assert_equal 1, $invokes
|
|
29
|
+
assert_equal 0, $errors.size
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
data/test/test_retry.rb
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
require 'multi_json'
|
|
3
|
+
require 'sidekiq/retry'
|
|
4
|
+
require 'sidekiq/middleware/server/retry_jobs'
|
|
5
|
+
|
|
6
|
+
class TestRetry < MiniTest::Unit::TestCase
|
|
7
|
+
describe 'middleware' do
|
|
8
|
+
before do
|
|
9
|
+
@redis = MiniTest::Mock.new
|
|
10
|
+
# Ugh, this is terrible.
|
|
11
|
+
Sidekiq.instance_variable_set(:@redis, @redis)
|
|
12
|
+
|
|
13
|
+
def @redis.with; yield self; end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'allows disabling retry' do
|
|
17
|
+
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => false }
|
|
18
|
+
msg2 = msg.dup
|
|
19
|
+
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
|
20
|
+
assert_raises RuntimeError do
|
|
21
|
+
handler.call('', msg2, 'default') do
|
|
22
|
+
raise "kerblammo!"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
assert_equal msg, msg2
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'saves backtraces' do
|
|
29
|
+
@redis.expect :zadd, 1, ['retry', String, String]
|
|
30
|
+
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => true, 'backtrace' => true }
|
|
31
|
+
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
|
32
|
+
c = nil
|
|
33
|
+
assert_raises RuntimeError do
|
|
34
|
+
handler.call('', msg, 'default') do
|
|
35
|
+
c = caller(0); raise "kerblammo!"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
assert msg["error_backtrace"]
|
|
39
|
+
assert_equal c, msg["error_backtrace"]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'saves partial backtraces' do
|
|
43
|
+
@redis.expect :zadd, 1, ['retry', String, String]
|
|
44
|
+
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => true, 'backtrace' => 3 }
|
|
45
|
+
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
|
46
|
+
c = nil
|
|
47
|
+
assert_raises RuntimeError do
|
|
48
|
+
handler.call('', msg, 'default') do
|
|
49
|
+
c = caller(0)[0..3]; raise "kerblammo!"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
assert msg["error_backtrace"]
|
|
53
|
+
assert_equal c, msg["error_backtrace"]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'handles a new failed message' do
|
|
57
|
+
@redis.expect :zadd, 1, ['retry', String, String]
|
|
58
|
+
msg = { 'class' => 'Bob', 'args' => [1,2,'foo'], 'retry' => true }
|
|
59
|
+
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
|
60
|
+
assert_raises RuntimeError do
|
|
61
|
+
handler.call('', msg, 'default') do
|
|
62
|
+
raise "kerblammo!"
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
assert_equal 'default', msg["queue"]
|
|
66
|
+
assert_equal 'kerblammo!', msg["error_message"]
|
|
67
|
+
assert_equal 'RuntimeError', msg["error_class"]
|
|
68
|
+
assert_equal 0, msg["retry_count"]
|
|
69
|
+
refute msg["error_backtrace"]
|
|
70
|
+
assert msg["failed_at"]
|
|
71
|
+
@redis.verify
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it 'handles a recurring failed message' do
|
|
75
|
+
@redis.expect :zadd, 1, ['retry', String, String]
|
|
76
|
+
now = Time.now.utc
|
|
77
|
+
msg = {"class"=>"Bob", "args"=>[1, 2, "foo"], 'retry' => true, "queue"=>"default", "error_message"=>"kerblammo!", "error_class"=>"RuntimeError", "failed_at"=>now, "retry_count"=>10}
|
|
78
|
+
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
|
79
|
+
assert_raises RuntimeError do
|
|
80
|
+
handler.call('', msg, 'default') do
|
|
81
|
+
raise "kerblammo!"
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
assert_equal 'default', msg["queue"]
|
|
85
|
+
assert_equal 'kerblammo!', msg["error_message"]
|
|
86
|
+
assert_equal 'RuntimeError', msg["error_class"]
|
|
87
|
+
assert_equal 11, msg["retry_count"]
|
|
88
|
+
assert msg["failed_at"]
|
|
89
|
+
@redis.verify
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it 'throws away old messages after too many retries' do
|
|
93
|
+
now = Time.now.utc
|
|
94
|
+
msg = {"class"=>"Bob", "args"=>[1, 2, "foo"], "queue"=>"default", "error_message"=>"kerblammo!", "error_class"=>"RuntimeError", "failed_at"=>now, "retry_count"=>25}
|
|
95
|
+
handler = Sidekiq::Middleware::Server::RetryJobs.new
|
|
96
|
+
assert_raises RuntimeError do
|
|
97
|
+
handler.call('', msg, 'default') do
|
|
98
|
+
raise "kerblammo!"
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
@redis.verify
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
describe 'poller' do
|
|
106
|
+
before do
|
|
107
|
+
@redis = MiniTest::Mock.new
|
|
108
|
+
Sidekiq.instance_variable_set(:@redis, @redis)
|
|
109
|
+
|
|
110
|
+
def @redis.with; yield self; end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'should poll like a bad mother...SHUT YO MOUTH' do
|
|
114
|
+
fake_msg = Sidekiq.dump_json({ 'class' => 'Bob', 'args' => [1,2], 'queue' => 'someq' })
|
|
115
|
+
@redis.expect :multi, [[fake_msg], 1], []
|
|
116
|
+
@redis.expect :rpush, 1, ['queue:someq', fake_msg]
|
|
117
|
+
|
|
118
|
+
inst = Sidekiq::Retry::Poller.new
|
|
119
|
+
inst.poll
|
|
120
|
+
|
|
121
|
+
@redis.verify
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
data/test/test_stats.rb
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
require 'sidekiq'
|
|
3
|
+
require 'sidekiq/processor'
|
|
4
|
+
|
|
5
|
+
class TestStats < MiniTest::Unit::TestCase
|
|
6
|
+
describe 'with redis' do
|
|
7
|
+
before do
|
|
8
|
+
@redis = Sidekiq.redis = REDIS
|
|
9
|
+
Sidekiq.redis {|c| c.flushdb }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class DumbWorker
|
|
13
|
+
include Sidekiq::Worker
|
|
14
|
+
|
|
15
|
+
def perform(arg)
|
|
16
|
+
raise 'bang' if arg == nil
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'updates global stats in the success case' do
|
|
21
|
+
msg = { 'class' => DumbWorker.to_s, 'args' => [""] }
|
|
22
|
+
boss = MiniTest::Mock.new
|
|
23
|
+
|
|
24
|
+
@redis.with do |conn|
|
|
25
|
+
|
|
26
|
+
set = conn.smembers('workers')
|
|
27
|
+
assert_equal 0, set.size
|
|
28
|
+
|
|
29
|
+
processor = Sidekiq::Processor.new(boss)
|
|
30
|
+
boss.expect(:processor_done!, nil, [processor])
|
|
31
|
+
boss.expect(:processor_done!, nil, [processor])
|
|
32
|
+
boss.expect(:processor_done!, nil, [processor])
|
|
33
|
+
|
|
34
|
+
assert_equal 0, conn.get('stat:failed').to_i
|
|
35
|
+
assert_equal 0, conn.get('stat:processed').to_i
|
|
36
|
+
|
|
37
|
+
processor.process(msg, 'xyzzy')
|
|
38
|
+
processor.process(msg, 'xyzzy')
|
|
39
|
+
processor.process(msg, 'xyzzy')
|
|
40
|
+
|
|
41
|
+
assert_equal 0, conn.get('stat:failed').to_i
|
|
42
|
+
assert_equal 3, conn.get('stat:processed').to_i
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'updates global stats in the error case' do
|
|
47
|
+
msg = { 'class' => DumbWorker.to_s, 'args' => [nil] }
|
|
48
|
+
boss = MiniTest::Mock.new
|
|
49
|
+
|
|
50
|
+
@redis.with do |conn|
|
|
51
|
+
assert_equal [], conn.smembers('workers')
|
|
52
|
+
assert_equal 0, conn.get('stat:failed').to_i
|
|
53
|
+
assert_equal 0, conn.get('stat:processed').to_i
|
|
54
|
+
|
|
55
|
+
processor = Sidekiq::Processor.new(boss)
|
|
56
|
+
|
|
57
|
+
pstr = processor.to_s
|
|
58
|
+
assert_raises RuntimeError do
|
|
59
|
+
processor.process(msg, 'xyzzy')
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
assert_equal 1, conn.get('stat:failed').to_i
|
|
63
|
+
assert_equal 1, conn.get('stat:processed').to_i
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
require 'sidekiq'
|
|
3
|
+
require 'sidekiq/worker'
|
|
4
|
+
require 'active_record'
|
|
5
|
+
require 'action_mailer'
|
|
6
|
+
require 'sidekiq/rails'
|
|
7
|
+
require 'sidekiq/extensions/action_mailer'
|
|
8
|
+
require 'sidekiq/extensions/active_record'
|
|
9
|
+
|
|
10
|
+
Sidekiq.hook_rails!
|
|
11
|
+
|
|
12
|
+
class TestTesting < MiniTest::Unit::TestCase
|
|
13
|
+
describe 'sidekiq testing' do
|
|
14
|
+
class PerformError < RuntimeError; end
|
|
15
|
+
|
|
16
|
+
class DirectWorker
|
|
17
|
+
include Sidekiq::Worker
|
|
18
|
+
def perform(a, b)
|
|
19
|
+
a + b
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class EnqueuedWorker
|
|
24
|
+
include Sidekiq::Worker
|
|
25
|
+
def perform(a, b)
|
|
26
|
+
a + b
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class StoredWorker
|
|
31
|
+
include Sidekiq::Worker
|
|
32
|
+
def perform(error)
|
|
33
|
+
raise PerformError if error
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class FooMailer < ActionMailer::Base
|
|
38
|
+
def bar(str)
|
|
39
|
+
str
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
class FooModel < ActiveRecord::Base
|
|
44
|
+
def bar(str)
|
|
45
|
+
str
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
before do
|
|
50
|
+
load 'sidekiq/testing.rb'
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
after do
|
|
54
|
+
# Undo override
|
|
55
|
+
Sidekiq::Worker::ClassMethods.class_eval do
|
|
56
|
+
remove_method :perform_async
|
|
57
|
+
alias_method :perform_async, :perform_async_old
|
|
58
|
+
remove_method :perform_async_old
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it 'stubs the async call' do
|
|
63
|
+
assert_equal 0, DirectWorker.jobs.size
|
|
64
|
+
assert DirectWorker.perform_async(1, 2)
|
|
65
|
+
assert_equal 1, DirectWorker.jobs.size
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it 'stubs the delay call on mailers' do
|
|
69
|
+
assert_equal 0, Sidekiq::Extensions::DelayedMailer.jobs.size
|
|
70
|
+
FooMailer.delay.bar('hello!')
|
|
71
|
+
assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs.size
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it 'stubs the delay call on models' do
|
|
75
|
+
assert_equal 0, Sidekiq::Extensions::DelayedModel.jobs.size
|
|
76
|
+
FooModel.delay.bar('hello!')
|
|
77
|
+
assert_equal 1, Sidekiq::Extensions::DelayedModel.jobs.size
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it 'stubs the enqueue call' do
|
|
81
|
+
assert_equal 0, EnqueuedWorker.jobs.size
|
|
82
|
+
assert Sidekiq::Client.enqueue(EnqueuedWorker, 1, 2)
|
|
83
|
+
assert_equal 1, EnqueuedWorker.jobs.size
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'executes all stored jobs' do
|
|
87
|
+
assert StoredWorker.perform_async(false)
|
|
88
|
+
assert StoredWorker.perform_async(true)
|
|
89
|
+
|
|
90
|
+
assert_equal 2, StoredWorker.jobs.size
|
|
91
|
+
assert_raises PerformError do
|
|
92
|
+
StoredWorker.drain
|
|
93
|
+
end
|
|
94
|
+
assert_equal 0, StoredWorker.jobs.size
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|