sidekiq-failures 0.4.5 → 1.1.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.
- checksums.yaml +5 -5
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/ci.yml +37 -0
- data/CHANGELOG.md +35 -4
- data/Gemfile +6 -0
- data/README.md +13 -6
- data/lib/sidekiq/failures/locales/ja.yml +6 -0
- data/lib/sidekiq/failures/locales/pt-BR.yml +5 -0
- data/lib/sidekiq/failures/locales/zh-cn.yml +5 -0
- data/lib/sidekiq/failures/middleware.rb +3 -2
- data/lib/sidekiq/failures/sorted_entry.rb +8 -1
- data/lib/sidekiq/failures/version.rb +1 -1
- data/lib/sidekiq/failures/views/failure.erb +37 -29
- data/lib/sidekiq/failures/views/failure_legacy.erb +31 -0
- data/lib/sidekiq/failures/views/failures.erb +106 -78
- data/lib/sidekiq/failures/views/failures_legacy.erb +105 -0
- data/lib/sidekiq/failures/web_extension.rb +126 -28
- data/lib/sidekiq/failures.rb +38 -7
- data/sidekiq-failures.gemspec +10 -3
- data/test/failures_test.rb +16 -0
- data/test/middleware_test.rb +87 -82
- data/test/test_helper.rb +5 -5
- data/test/web_extension_test.rb +156 -89
- metadata +30 -15
- data/.travis.yml +0 -18
@@ -1,49 +1,130 @@
|
|
1
1
|
module Sidekiq
|
2
2
|
module Failures
|
3
3
|
module WebExtension
|
4
|
+
LEGACY_SIDEKIQ_VERSION = Gem::Version.new("7.3.9")
|
5
|
+
|
6
|
+
# Helper method to check Sidekiq version
|
7
|
+
def self.legacy_sidekiq?
|
8
|
+
Gem::Version.new(Sidekiq::VERSION) <= LEGACY_SIDEKIQ_VERSION
|
9
|
+
end
|
10
|
+
|
11
|
+
# Helper method to get parameters based on path and parameter name
|
12
|
+
def self.fetch_param_value(path, param_name)
|
13
|
+
if legacy_sidekiq?
|
14
|
+
# For newer Sidekiq, use route_params or url_params based on path
|
15
|
+
lambda { |env| env.params[param_name] }
|
16
|
+
else
|
17
|
+
# For legacy Sidekiq, just use params
|
18
|
+
if path.include?(":#{param_name}")
|
19
|
+
lambda { |env| env.route_params(param_name.to_sym) }
|
20
|
+
else
|
21
|
+
lambda { |env| env.url_params(param_name.to_s) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Helper method to handle parse_params vs parse_key compatibility
|
27
|
+
def self.parse_key_or_params
|
28
|
+
lambda do |env, key|
|
29
|
+
if env.respond_to?(:parse_key)
|
30
|
+
env.parse_key(key)
|
31
|
+
else
|
32
|
+
env.parse_params(key)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Define the helper method implementation that will be used in both versions
|
38
|
+
# Instead of a static lambda, we'll return a method that needs to be evaluated in context
|
39
|
+
def self.safe_relative_time_implementation
|
40
|
+
lambda do |time, context|
|
41
|
+
return unless time
|
42
|
+
|
43
|
+
time = if time.is_a?(Numeric)
|
44
|
+
Time.at(time)
|
45
|
+
else
|
46
|
+
Time.parse(time)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Use the context to call relative_time
|
50
|
+
context.relative_time(time)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Define the helpers module for Sidekiq 8.0+
|
55
|
+
module FailuresHelpers
|
56
|
+
def safe_relative_time(time)
|
57
|
+
# Pass self (the context with relative_time) to the implementation
|
58
|
+
WebExtension.safe_relative_time_implementation.call(time, self)
|
59
|
+
end
|
60
|
+
end
|
4
61
|
|
5
62
|
def self.registered(app)
|
6
63
|
view_path = File.join(File.expand_path("..", __FILE__), "views")
|
64
|
+
if legacy_sidekiq?
|
65
|
+
failures_view_path = File.join(view_path, "failures_legacy.erb")
|
66
|
+
failure_view_path = File.join(view_path, "failure_legacy.erb")
|
67
|
+
else
|
68
|
+
failures_view_path = File.join(view_path, "failures.erb")
|
69
|
+
failure_view_path = File.join(view_path, "failure.erb")
|
70
|
+
end
|
7
71
|
|
8
|
-
|
9
|
-
|
10
|
-
time = if time.is_a?(Numeric)
|
11
|
-
Time.at(time)
|
12
|
-
else
|
13
|
-
Time.parse(time)
|
14
|
-
end
|
72
|
+
# Create a parse helper for use in routes
|
73
|
+
parse_helper = parse_key_or_params
|
15
74
|
|
16
|
-
|
75
|
+
# Use appropriate helpers implementation based on Sidekiq version
|
76
|
+
if legacy_sidekiq?
|
77
|
+
# Original implementation for older Sidekiq versions
|
78
|
+
app.helpers do
|
79
|
+
define_method(:safe_relative_time) do |time|
|
80
|
+
# Pass self (the context with relative_time) to the implementation
|
81
|
+
WebExtension.safe_relative_time_implementation.call(time, self)
|
82
|
+
end
|
17
83
|
end
|
84
|
+
else
|
85
|
+
# New implementation for Sidekiq 8.0+
|
86
|
+
app.helpers(FailuresHelpers)
|
18
87
|
end
|
19
88
|
|
20
89
|
app.get "/failures" do
|
21
|
-
|
22
|
-
|
90
|
+
page_param = Sidekiq::Failures::WebExtension.fetch_param_value("/failures", "page").call(self)
|
91
|
+
count_param = Sidekiq::Failures::WebExtension.fetch_param_value("/failures", "count").call(self)
|
92
|
+
@count = (count_param || 25).to_i
|
93
|
+
|
94
|
+
(@current_page, @total_size, @failures) = page(LIST_KEY, page_param, @count, :reverse => true)
|
23
95
|
@failures = @failures.map {|msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
|
24
96
|
|
25
|
-
render(:erb, File.read(
|
97
|
+
render(:erb, File.read(failures_view_path))
|
26
98
|
end
|
27
99
|
|
28
100
|
app.get "/failures/:key" do
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
101
|
+
key_param = Sidekiq::Failures::WebExtension.fetch_param_value("/failures/:key", "key").call(self)
|
102
|
+
halt 404 unless key_param
|
103
|
+
|
104
|
+
@failure = FailureSet.new.fetch(*parse_helper.call(self, key_param)).first
|
105
|
+
if @failure.nil?
|
106
|
+
redirect "#{root_path}failures"
|
107
|
+
else
|
108
|
+
render(:erb, File.read(failure_view_path))
|
109
|
+
end
|
34
110
|
end
|
35
111
|
|
36
112
|
app.post "/failures" do
|
37
|
-
|
113
|
+
key_param = Sidekiq::Failures::WebExtension.fetch_param_value("/failures", "key").call(self)
|
114
|
+
halt 404 unless key_param
|
38
115
|
|
39
|
-
|
40
|
-
job = FailureSet.new.fetch(*
|
116
|
+
key_param.each do |key|
|
117
|
+
job = FailureSet.new.fetch(*parse_helper.call(self, key)).first
|
41
118
|
next unless job
|
42
119
|
|
43
|
-
|
120
|
+
retry_param = Sidekiq::Failures::WebExtension.fetch_param_value("/failures", "retry").call(self)
|
121
|
+
if retry_param
|
44
122
|
job.retry_failure
|
45
|
-
|
46
|
-
|
123
|
+
else
|
124
|
+
delete_param = Sidekiq::Failures::WebExtension.fetch_param_value("/failures", "delete").call(self)
|
125
|
+
if delete_param
|
126
|
+
job.delete
|
127
|
+
end
|
47
128
|
end
|
48
129
|
end
|
49
130
|
|
@@ -51,21 +132,26 @@ module Sidekiq
|
|
51
132
|
end
|
52
133
|
|
53
134
|
app.post "/failures/:key" do
|
54
|
-
|
135
|
+
key_param = Sidekiq::Failures::WebExtension.fetch_param_value("/failures/:key", "key").call(self)
|
136
|
+
halt 404 unless key_param
|
55
137
|
|
56
|
-
job = FailureSet.new.fetch(*
|
138
|
+
job = FailureSet.new.fetch(*parse_helper.call(self, key_param)).first
|
57
139
|
if job
|
58
|
-
|
140
|
+
retry_param = Sidekiq::Failures::WebExtension.fetch_param_value("/failures/:key", "retry").call(self)
|
141
|
+
if retry_param
|
59
142
|
job.retry_failure
|
60
|
-
|
61
|
-
|
143
|
+
else
|
144
|
+
delete_param = Sidekiq::Failures::WebExtension.fetch_param_value("/failures/:key", "delete").call(self)
|
145
|
+
if delete_param
|
146
|
+
job.delete
|
147
|
+
end
|
62
148
|
end
|
63
149
|
end
|
64
150
|
redirect_with_query("#{root_path}failures")
|
65
151
|
end
|
66
152
|
|
67
153
|
app.post "/failures/all/reset" do
|
68
|
-
Sidekiq::Failures.
|
154
|
+
Sidekiq::Failures.reset_failure_count
|
69
155
|
redirect "#{root_path}failures"
|
70
156
|
end
|
71
157
|
|
@@ -78,6 +164,18 @@ module Sidekiq
|
|
78
164
|
FailureSet.new.retry_all_failures
|
79
165
|
redirect "#{root_path}failures"
|
80
166
|
end
|
167
|
+
|
168
|
+
app.get '/filter/failures' do
|
169
|
+
redirect "#{root_path}failures"
|
170
|
+
end
|
171
|
+
|
172
|
+
app.post '/filter/failures' do
|
173
|
+
substr_param = Sidekiq::Failures::WebExtension.fetch_param_value("/filter/failures", "substr").call(self)
|
174
|
+
@failures = Sidekiq::Failures::FailureSet.new.scan("*#{substr_param}*")
|
175
|
+
@current_page = 1
|
176
|
+
@count = @total_size = @failures.count
|
177
|
+
render(:erb, File.read(failures_view_path))
|
178
|
+
end
|
81
179
|
end
|
82
180
|
end
|
83
181
|
end
|
data/lib/sidekiq/failures.rb
CHANGED
@@ -5,6 +5,7 @@ rescue LoadError
|
|
5
5
|
end
|
6
6
|
|
7
7
|
require "sidekiq/api"
|
8
|
+
require "sidekiq/version"
|
8
9
|
require "sidekiq/failures/version"
|
9
10
|
require "sidekiq/failures/sorted_entry"
|
10
11
|
require "sidekiq/failures/failure_set"
|
@@ -47,33 +48,63 @@ module Sidekiq
|
|
47
48
|
|
48
49
|
# Fetches the failures max count value
|
49
50
|
def self.failures_max_count
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
if !instance_variable_defined?(:@failures_max_count) || @failures_max_count.nil?
|
52
|
+
1000
|
53
|
+
else
|
54
|
+
@failures_max_count
|
55
|
+
end
|
53
56
|
end
|
54
57
|
|
55
58
|
module Failures
|
56
59
|
LIST_KEY = :failed
|
57
60
|
|
58
61
|
def self.reset_failures
|
62
|
+
warn "NOTE: Sidekiq::Failures.reset_failures is deprecated; use Sidekiq::Failures.reset_failure_count instead."
|
63
|
+
|
64
|
+
reset_failure_count
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.reset_failure_count
|
59
68
|
Sidekiq.redis { |c| c.set("stat:failed", 0) }
|
60
69
|
end
|
61
70
|
|
71
|
+
def self.clear_failures
|
72
|
+
FailureSet.new.clear
|
73
|
+
end
|
74
|
+
|
62
75
|
def self.count
|
63
76
|
Sidekiq.redis {|r| r.zcard(LIST_KEY) }
|
64
77
|
end
|
78
|
+
|
79
|
+
def self.retry_middleware_class
|
80
|
+
if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('5.0.0')
|
81
|
+
require 'sidekiq/job_retry'
|
82
|
+
Sidekiq::JobRetry
|
83
|
+
else
|
84
|
+
require 'sidekiq/middleware/server/retry_jobs'
|
85
|
+
Sidekiq::Middleware::Server::RetryJobs
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
65
89
|
end
|
66
90
|
end
|
67
91
|
|
68
92
|
Sidekiq.configure_server do |config|
|
69
93
|
config.server_middleware do |chain|
|
70
|
-
chain.insert_before Sidekiq::
|
94
|
+
chain.insert_before Sidekiq::Failures.retry_middleware_class,
|
71
95
|
Sidekiq::Failures::Middleware
|
72
96
|
end
|
73
97
|
end
|
74
98
|
|
75
99
|
if defined?(Sidekiq::Web)
|
76
|
-
|
77
|
-
|
78
|
-
|
100
|
+
if Sidekiq::Failures::WebExtension.legacy_sidekiq?
|
101
|
+
Sidekiq::Web.register Sidekiq::Failures::WebExtension
|
102
|
+
Sidekiq::Web.tabs["Failures"] = "failures"
|
103
|
+
Sidekiq::Web.settings.locales << File.join(File.dirname(__FILE__), "failures/locales")
|
104
|
+
else
|
105
|
+
Sidekiq::Web.configure do |config|
|
106
|
+
config.locales << File.join(File.dirname(__FILE__), "failures/locales")
|
107
|
+
config.register(Sidekiq::Failures::WebExtension, name: "failures", tab: ["Failures"], index: ["failures"])
|
108
|
+
end
|
109
|
+
end
|
79
110
|
end
|
data/sidekiq-failures.gemspec
CHANGED
@@ -7,16 +7,23 @@ Gem::Specification.new do |gem|
|
|
7
7
|
gem.description = %q{Keep track of Sidekiq failed jobs}
|
8
8
|
gem.summary = %q{Keeps track of Sidekiq failed jobs and adds a tab to the Web UI to let you browse them. Makes use of Sidekiq's custom tabs and middleware chain.}
|
9
9
|
gem.homepage = "https://github.com/mhfs/sidekiq-failures/"
|
10
|
+
gem.license = "MIT"
|
10
11
|
|
11
12
|
gem.files = `git ls-files`.split($\)
|
12
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
-
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
13
|
gem.name = "sidekiq-failures"
|
15
14
|
gem.require_paths = ["lib"]
|
16
15
|
gem.version = Sidekiq::Failures::VERSION
|
17
16
|
|
18
|
-
gem.add_dependency "sidekiq", ">=
|
17
|
+
gem.add_dependency "sidekiq", ">= 4.0.0"
|
19
18
|
|
19
|
+
# Redis 4.X is incompatible with Ruby < 2.3, but the Ruby version constraint
|
20
|
+
# wasn't added until 4.1.2, meaning you can get an incompatible version of the
|
21
|
+
# redis gem when running Ruby 2.2 without this constraint.
|
22
|
+
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.3.0")
|
23
|
+
gem.add_dependency "redis", "< 4.0"
|
24
|
+
end
|
25
|
+
|
26
|
+
gem.add_development_dependency "minitest"
|
20
27
|
gem.add_development_dependency "rake"
|
21
28
|
gem.add_development_dependency "rack-test"
|
22
29
|
gem.add_development_dependency "sprockets"
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Sidekiq
|
4
|
+
describe Failures do
|
5
|
+
describe '.retry_middleware_class' do
|
6
|
+
it 'returns based on Sidekiq::VERSION' do
|
7
|
+
case Sidekiq::VERSION[0]
|
8
|
+
when '5'
|
9
|
+
assert_equal Failures.retry_middleware_class, Sidekiq::JobRetry
|
10
|
+
when '4'
|
11
|
+
assert_equal Failures.retry_middleware_class, Sidekiq::Middleware::Server::RetryJobs
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/test/middleware_test.rb
CHANGED
@@ -1,19 +1,84 @@
|
|
1
1
|
require "test_helper"
|
2
2
|
|
3
|
+
class SidekiqPre6
|
4
|
+
def new_processor(boss)
|
5
|
+
num_options_calls.times { boss.expect(:options, {:queues => ['default'] }, []) }
|
6
|
+
::Sidekiq::Processor.new(boss)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def num_options_calls
|
12
|
+
if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('5.0.3')
|
13
|
+
3
|
14
|
+
else
|
15
|
+
2
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class SidekiqPre63
|
21
|
+
def new_processor(boss)
|
22
|
+
opts = {
|
23
|
+
queues: ['default'],
|
24
|
+
}
|
25
|
+
opts[:fetch] = Sidekiq::BasicFetch.new(opts)
|
26
|
+
::Sidekiq::Processor.new(boss, opts)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class SidekiqPost63
|
31
|
+
def new_processor(boss)
|
32
|
+
config = ::Sidekiq
|
33
|
+
config[:queues] = ['default']
|
34
|
+
config[:fetch] = ::Sidekiq::BasicFetch.new(config)
|
35
|
+
config[:error_handlers] << Sidekiq.method(:default_error_handler)
|
36
|
+
::Sidekiq::Processor.new(config) { |processor, reason = nil| }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class SidekiqPost7
|
41
|
+
def new_processor(boss)
|
42
|
+
config = ::Sidekiq.default_configuration
|
43
|
+
::Sidekiq::Processor.new(config.default_capsule) { |*args| }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
3
47
|
module Sidekiq
|
4
48
|
module Failures
|
5
49
|
describe "Middleware" do
|
50
|
+
def new_provider
|
51
|
+
version = Gem::Version.new(Sidekiq::VERSION)
|
52
|
+
if version >= Gem::Version.new('7')
|
53
|
+
SidekiqPost7
|
54
|
+
elsif version >= Gem::Version.new('6.4.0')
|
55
|
+
SidekiqPost63
|
56
|
+
elsif version >= Gem::Version.new('6.0')
|
57
|
+
SidekiqPre63
|
58
|
+
else
|
59
|
+
SidekiqPre6
|
60
|
+
end.new
|
61
|
+
end
|
62
|
+
|
6
63
|
before do
|
7
|
-
Celluloid.boot
|
8
64
|
$invokes = 0
|
9
|
-
@boss =
|
10
|
-
@
|
11
|
-
|
12
|
-
|
13
|
-
Sidekiq.
|
65
|
+
@boss = Minitest::Mock.new
|
66
|
+
@provider = new_provider
|
67
|
+
@processor = @provider.new_processor(@boss)
|
68
|
+
|
69
|
+
Sidekiq.configure_server do |config|
|
70
|
+
config.server_middleware do |chain|
|
71
|
+
chain.add Sidekiq::Failures::Middleware
|
72
|
+
end
|
73
|
+
end
|
74
|
+
Sidekiq.redis(&:flushdb)
|
14
75
|
Sidekiq.instance_eval { @failures_default_mode = nil }
|
15
76
|
end
|
16
77
|
|
78
|
+
after do
|
79
|
+
@boss.verify
|
80
|
+
end
|
81
|
+
|
17
82
|
TestException = Class.new(Exception)
|
18
83
|
ShutdownException = Class.new(Sidekiq::Shutdown)
|
19
84
|
|
@@ -42,13 +107,8 @@ module Sidekiq
|
|
42
107
|
|
43
108
|
assert_equal 0, failures_count
|
44
109
|
|
45
|
-
actor = MiniTest::Mock.new
|
46
|
-
actor.expect(:processor_done, nil, [@processor])
|
47
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
48
|
-
2.times { @boss.expect(:async, actor, []) }
|
49
|
-
|
50
110
|
assert_raises TestException do
|
51
|
-
@processor.process
|
111
|
+
@processor.send(:process, msg)
|
52
112
|
end
|
53
113
|
|
54
114
|
assert_equal 1, failures_count
|
@@ -60,13 +120,8 @@ module Sidekiq
|
|
60
120
|
|
61
121
|
assert_equal 0, failures_count
|
62
122
|
|
63
|
-
actor = MiniTest::Mock.new
|
64
|
-
actor.expect(:processor_done, nil, [@processor])
|
65
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
66
|
-
2.times { @boss.expect(:async, actor, []) }
|
67
|
-
|
68
123
|
assert_raises TestException do
|
69
|
-
@processor.process
|
124
|
+
@processor.send(:process, msg)
|
70
125
|
end
|
71
126
|
|
72
127
|
assert_equal 1, failures_count
|
@@ -78,13 +133,7 @@ module Sidekiq
|
|
78
133
|
|
79
134
|
assert_equal 0, failures_count
|
80
135
|
|
81
|
-
|
82
|
-
actor.expect(:processor_done, nil, [@processor])
|
83
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
84
|
-
2.times { @boss.expect(:async, actor, []) }
|
85
|
-
|
86
|
-
@processor.process(msg)
|
87
|
-
@boss.verify
|
136
|
+
@processor.send(:process, msg)
|
88
137
|
|
89
138
|
assert_equal 0, failures_count
|
90
139
|
assert_equal 1, $invokes
|
@@ -95,13 +144,8 @@ module Sidekiq
|
|
95
144
|
|
96
145
|
assert_equal 0, failures_count
|
97
146
|
|
98
|
-
actor = MiniTest::Mock.new
|
99
|
-
actor.expect(:processor_done, nil, [@processor])
|
100
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
101
|
-
2.times { @boss.expect(:async, actor, []) }
|
102
|
-
|
103
147
|
assert_raises TestException do
|
104
|
-
@processor.process
|
148
|
+
@processor.send(:process, msg)
|
105
149
|
end
|
106
150
|
|
107
151
|
assert_equal 0, failures_count
|
@@ -115,32 +159,21 @@ module Sidekiq
|
|
115
159
|
|
116
160
|
assert_equal 0, failures_count
|
117
161
|
|
118
|
-
actor = MiniTest::Mock.new
|
119
|
-
actor.expect(:processor_done, nil, [@processor])
|
120
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
121
|
-
2.times { @boss.expect(:async, actor, []) }
|
122
|
-
|
123
162
|
assert_raises TestException do
|
124
|
-
@processor.process
|
163
|
+
@processor.send(:process, msg)
|
125
164
|
end
|
126
165
|
|
127
166
|
assert_equal 0, failures_count
|
128
167
|
assert_equal 1, $invokes
|
129
168
|
end
|
130
169
|
|
131
|
-
|
132
170
|
it "doesn't record failure if going to be retired again and configured to track exhaustion" do
|
133
171
|
msg = create_work('class' => MockWorker.to_s, 'args' => ['myarg'], 'retry' => true, 'failures' => 'exhausted')
|
134
172
|
|
135
173
|
assert_equal 0, failures_count
|
136
174
|
|
137
|
-
actor = MiniTest::Mock.new
|
138
|
-
actor.expect(:processor_done, nil, [@processor])
|
139
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
140
|
-
2.times { @boss.expect(:async, actor, []) }
|
141
|
-
|
142
175
|
assert_raises TestException do
|
143
|
-
@processor.process
|
176
|
+
@processor.send(:process, msg)
|
144
177
|
end
|
145
178
|
|
146
179
|
assert_equal 0, failures_count
|
@@ -152,13 +185,8 @@ module Sidekiq
|
|
152
185
|
|
153
186
|
assert_equal 0, failures_count
|
154
187
|
|
155
|
-
actor = MiniTest::Mock.new
|
156
|
-
actor.expect(:processor_done, nil, [@processor])
|
157
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
158
|
-
2.times { @boss.expect(:async, actor, []) }
|
159
|
-
|
160
188
|
assert_raises TestException do
|
161
|
-
@processor.process
|
189
|
+
@processor.send(:process, msg)
|
162
190
|
end
|
163
191
|
|
164
192
|
assert_equal 1, failures_count
|
@@ -170,13 +198,8 @@ module Sidekiq
|
|
170
198
|
|
171
199
|
assert_equal 0, failures_count
|
172
200
|
|
173
|
-
actor = MiniTest::Mock.new
|
174
|
-
actor.expect(:processor_done, nil, [@processor])
|
175
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
176
|
-
2.times { @boss.expect(:async, actor, []) }
|
177
|
-
|
178
201
|
assert_raises TestException do
|
179
|
-
@processor.process
|
202
|
+
@processor.send(:process, msg)
|
180
203
|
end
|
181
204
|
|
182
205
|
assert_equal 1, failures_count
|
@@ -190,13 +213,8 @@ module Sidekiq
|
|
190
213
|
|
191
214
|
assert_equal 0, failures_count
|
192
215
|
|
193
|
-
actor = MiniTest::Mock.new
|
194
|
-
actor.expect(:processor_done, nil, [@processor])
|
195
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
196
|
-
2.times { @boss.expect(:async, actor, []) }
|
197
|
-
|
198
216
|
assert_raises TestException do
|
199
|
-
@processor.process
|
217
|
+
@processor.send(:process, msg)
|
200
218
|
end
|
201
219
|
|
202
220
|
assert_equal 1, failures_count
|
@@ -210,13 +228,8 @@ module Sidekiq
|
|
210
228
|
|
211
229
|
assert_equal 0, failures_count
|
212
230
|
|
213
|
-
actor = MiniTest::Mock.new
|
214
|
-
actor.expect(:processor_done, nil, [@processor])
|
215
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
216
|
-
2.times { @boss.expect(:async, actor, []) }
|
217
|
-
|
218
231
|
assert_raises TestException do
|
219
|
-
@processor.process
|
232
|
+
@processor.send(:process, msg)
|
220
233
|
end
|
221
234
|
|
222
235
|
assert_equal 1, failures_count
|
@@ -232,17 +245,14 @@ module Sidekiq
|
|
232
245
|
assert_equal 0, failures_count
|
233
246
|
|
234
247
|
3.times do
|
235
|
-
boss =
|
236
|
-
processor =
|
237
|
-
|
238
|
-
actor = MiniTest::Mock.new
|
239
|
-
actor.expect(:processor_done, nil, [processor])
|
240
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
241
|
-
2.times { boss.expect(:async, actor, []) }
|
248
|
+
boss = Minitest::Mock.new
|
249
|
+
processor = @provider.new_processor(boss)
|
242
250
|
|
243
251
|
assert_raises TestException do
|
244
|
-
processor.process
|
252
|
+
processor.send(:process, msg)
|
245
253
|
end
|
254
|
+
|
255
|
+
boss.verify
|
246
256
|
end
|
247
257
|
|
248
258
|
assert_equal 2, failures_count
|
@@ -259,13 +269,8 @@ module Sidekiq
|
|
259
269
|
|
260
270
|
assert_equal 0, Sidekiq::Failures.count
|
261
271
|
|
262
|
-
actor = MiniTest::Mock.new
|
263
|
-
actor.expect(:processor_done, nil, [@processor])
|
264
|
-
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
265
|
-
@boss.expect(:async, actor, [])
|
266
|
-
|
267
272
|
assert_raises TestException do
|
268
|
-
@processor.process
|
273
|
+
@processor.send(:process, msg)
|
269
274
|
end
|
270
275
|
|
271
276
|
assert_equal 1, Sidekiq::Failures.count
|
data/test/test_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
$TESTING = true
|
2
|
+
|
3
|
+
ENV["MT_CPU"] = "1" # Disable parallel testing to avoid flaky tests, force a single CPU for minitest
|
3
4
|
|
4
5
|
require "minitest/autorun"
|
5
6
|
require "minitest/spec"
|
@@ -7,14 +8,13 @@ require "minitest/mock"
|
|
7
8
|
|
8
9
|
require "rack/test"
|
9
10
|
|
10
|
-
require "celluloid"
|
11
11
|
require "sidekiq"
|
12
|
+
require "sidekiq-pro" if ENV['SIDEKIQ_PRO_VERSION']
|
12
13
|
require "sidekiq-failures"
|
13
14
|
require "sidekiq/processor"
|
14
15
|
require "sidekiq/fetch"
|
15
16
|
require "sidekiq/cli"
|
16
17
|
|
17
|
-
Celluloid.logger = nil
|
18
18
|
Sidekiq.logger.level = Logger::ERROR
|
19
19
|
|
20
|
-
REDIS = Sidekiq::RedisConnection.create(:
|
20
|
+
REDIS = Sidekiq::RedisConnection.create(url: "redis://127.0.0.1:6379/15") # Use DB 15 for testing
|