rocketjob 1.0.0 → 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 +4 -4
- data/Rakefile +6 -7
- data/lib/rocket_job/cli.rb +14 -15
- data/lib/rocket_job/concerns/singleton.rb +33 -0
- data/lib/rocket_job/concerns/worker.rb +70 -20
- data/lib/rocket_job/config.rb +3 -1
- data/lib/rocket_job/dirmon_entry.rb +260 -30
- data/lib/rocket_job/heartbeat.rb +3 -0
- data/lib/rocket_job/job.rb +77 -154
- data/lib/rocket_job/job_exception.rb +8 -6
- data/lib/rocket_job/jobs/dirmon_job.rb +26 -102
- data/lib/rocket_job/version.rb +1 -1
- data/lib/rocket_job/worker.rb +40 -31
- data/lib/rocketjob.rb +26 -9
- data/test/dirmon_entry_test.rb +197 -31
- data/test/dirmon_job_test.rb +91 -188
- data/test/job_test.rb +148 -30
- data/test/job_worker_test.rb +23 -22
- data/test/test_helper.rb +9 -9
- data/test/worker_test.rb +8 -4
- metadata +6 -5
data/test/dirmon_job_test.rb
CHANGED
@@ -5,122 +5,24 @@ require_relative 'jobs/test_job'
|
|
5
5
|
class DirmonJobTest < Minitest::Test
|
6
6
|
context RocketJob::Jobs::DirmonJob do
|
7
7
|
setup do
|
8
|
-
@
|
9
|
-
@
|
10
|
-
@dirmon_job = RocketJob::Jobs::DirmonJob.new
|
8
|
+
@dirmon_job = RocketJob::Jobs::DirmonJob.new
|
9
|
+
@directory = '/tmp/directory'
|
11
10
|
@archive_directory = '/tmp/archive_directory'
|
12
|
-
@entry
|
13
|
-
|
14
|
-
|
15
|
-
arguments:
|
16
|
-
properties:
|
11
|
+
@entry = RocketJob::DirmonEntry.new(
|
12
|
+
pattern: "#{@directory}/abc/*",
|
13
|
+
job_class_name: 'Jobs::TestJob',
|
14
|
+
arguments: [{input: 'yes'}],
|
15
|
+
properties: {priority: 23, perform_method: :event},
|
17
16
|
archive_directory: @archive_directory
|
18
17
|
)
|
19
|
-
@
|
20
|
-
@
|
21
|
-
'abc/*' => %w(abc/file1 abc/file2)
|
22
|
-
}
|
18
|
+
FileUtils.makedirs("#{@directory}/abc")
|
19
|
+
FileUtils.makedirs(@archive_directory)
|
23
20
|
end
|
24
21
|
|
25
22
|
teardown do
|
26
23
|
@dirmon_job.destroy if @dirmon_job && !@dirmon_job.new_record?
|
27
24
|
FileUtils.remove_dir(@archive_directory, true) if Dir.exist?(@archive_directory)
|
28
|
-
|
29
|
-
|
30
|
-
context '#archive_file' do
|
31
|
-
should 'archive absolute path file' do
|
32
|
-
begin
|
33
|
-
file = Tempfile.new('archive')
|
34
|
-
file_name = file.path
|
35
|
-
File.open(file_name, 'w') { |file| file.write('Hello World') }
|
36
|
-
assert File.exists?(file_name)
|
37
|
-
@dirmon_job.archive_file(file_name, @archive_directory)
|
38
|
-
archive_file_name = File.join(@archive_directory, File.basename(file_name))
|
39
|
-
assert File.exists?(archive_file_name), archive_file_name
|
40
|
-
ensure
|
41
|
-
file.delete if file
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
should 'archive relative path file' do
|
46
|
-
begin
|
47
|
-
relative_path = 'tmp'
|
48
|
-
FileUtils.mkdir_p(relative_path)
|
49
|
-
file_name = File.join(relative_path, 'dirmon_job_test.txt')
|
50
|
-
File.open(file_name, 'w') { |file| file.write('Hello World') }
|
51
|
-
@dirmon_job.archive_file(file_name, @archive_directory)
|
52
|
-
archive_file_name = File.join(@archive_directory, file_name)
|
53
|
-
assert File.exists?(archive_file_name), archive_file_name
|
54
|
-
ensure
|
55
|
-
File.delete(file_name) if file_name && File.exists?(file_name)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
context '#upload_default' do
|
61
|
-
should 'upload default case with no archive_directory' do
|
62
|
-
job = Jobs::TestJob.new
|
63
|
-
file_name = 'abc/myfile.txt'
|
64
|
-
archived_file_name = 'abc/_archive/myfile.txt'
|
65
|
-
@dirmon_job.stub(:archive_file, -> fn, tp { assert_equal [archived_file_name, 'abc/_archive'], [fn, tp] }) do
|
66
|
-
@dirmon_job.upload_default(job, file_name, nil)
|
67
|
-
end
|
68
|
-
assert_equal File.absolute_path(archived_file_name), job.arguments.first[:full_file_name]
|
69
|
-
end
|
70
|
-
|
71
|
-
should 'upload default case with archive_directory' do
|
72
|
-
job = Jobs::TestJob.new
|
73
|
-
file_name = 'abc/myfile.txt'
|
74
|
-
archived_file_name = "#{@archive_directory}/myfile.txt"
|
75
|
-
@dirmon_job.stub(:archive_file, -> fn, tp { assert_equal [archived_file_name, @archive_directory], [fn, tp] }) do
|
76
|
-
@dirmon_job.upload_default(job, file_name, @archive_directory)
|
77
|
-
end
|
78
|
-
assert_equal File.absolute_path(archived_file_name), job.arguments.first[:full_file_name]
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
context '#upload_file' do
|
83
|
-
should 'upload using #file_store_upload' do
|
84
|
-
job = Jobs::TestJob.new
|
85
|
-
job.define_singleton_method(:file_store_upload) do |file_name|
|
86
|
-
file_name
|
87
|
-
end
|
88
|
-
file_name = 'abc/myfile.txt'
|
89
|
-
@dirmon_job.stub(:archive_file, -> fn, tp { assert_equal [file_name, @archive_directory], [fn, tp] }) do
|
90
|
-
@dirmon_job.upload_file(job, file_name, @archive_directory)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
should 'upload using #upload' do
|
95
|
-
job = Jobs::TestJob.new
|
96
|
-
job.define_singleton_method(:upload) do |file_name|
|
97
|
-
file_name
|
98
|
-
end
|
99
|
-
file_name = 'abc/myfile.txt'
|
100
|
-
@dirmon_job.stub(:archive_file, -> fn, tp { assert_equal [file_name, @archive_directory], [fn, tp] }) do
|
101
|
-
@dirmon_job.upload_file(job, file_name, @archive_directory)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
context '#start_job' do
|
107
|
-
setup do
|
108
|
-
RocketJob::Config.inline_mode = true
|
109
|
-
end
|
110
|
-
|
111
|
-
teardown do
|
112
|
-
RocketJob::Config.inline_mode = false
|
113
|
-
end
|
114
|
-
|
115
|
-
should 'upload using #upload' do
|
116
|
-
file_name = 'abc/myfile.txt'
|
117
|
-
job = @dirmon_job.stub(:upload_file, -> j, fn, sp { assert_equal [file_name, @archive_directory], [fn, sp] }) do
|
118
|
-
@dirmon_job.start_job(@entry, file_name)
|
119
|
-
end
|
120
|
-
assert_equal @entry.job_name, job.class.name
|
121
|
-
assert_equal 23, job.priority
|
122
|
-
assert_equal [ {:input=>"yes", "before_event"=>true, "event"=>true, "after_event"=>true} ], job.arguments
|
123
|
-
end
|
25
|
+
FileUtils.remove_dir(@directory, true) if Dir.exist?(@directory)
|
124
26
|
end
|
125
27
|
|
126
28
|
context '#check_file' do
|
@@ -131,7 +33,9 @@ class DirmonJobTest < Minitest::Test
|
|
131
33
|
file_name = file.path
|
132
34
|
File.open(file_name, 'w') { |file| file.write('*' * new_size) }
|
133
35
|
assert_equal new_size, File.size(file_name)
|
134
|
-
result = @
|
36
|
+
result = @entry.stub(:later, nil) do
|
37
|
+
@dirmon_job.send(:check_file, @entry, file, previous_size)
|
38
|
+
end
|
135
39
|
assert_equal new_size, result
|
136
40
|
end
|
137
41
|
|
@@ -143,8 +47,8 @@ class DirmonJobTest < Minitest::Test
|
|
143
47
|
File.open(file_name, 'w') { |file| file.write('*' * new_size) }
|
144
48
|
assert_equal new_size, File.size(file_name)
|
145
49
|
started = false
|
146
|
-
result
|
147
|
-
@dirmon_job.check_file
|
50
|
+
result = @entry.stub(:later, -> fn { started = true }) do
|
51
|
+
@dirmon_job.send(:check_file, @entry, file, previous_size)
|
148
52
|
end
|
149
53
|
assert_equal nil, result
|
150
54
|
assert started
|
@@ -152,15 +56,16 @@ class DirmonJobTest < Minitest::Test
|
|
152
56
|
|
153
57
|
should 'check deleted file' do
|
154
58
|
previous_size = 5
|
155
|
-
file_name = 'blah'
|
156
|
-
result
|
59
|
+
file_name = Pathname.new('blah')
|
60
|
+
result = @dirmon_job.send(:check_file, @entry, file_name, previous_size)
|
157
61
|
assert_equal nil, result
|
158
62
|
end
|
159
63
|
end
|
160
64
|
|
161
65
|
context '#check_directories' do
|
162
66
|
setup do
|
163
|
-
|
67
|
+
RocketJob::DirmonEntry.destroy_all
|
68
|
+
@entry.enable!
|
164
69
|
end
|
165
70
|
|
166
71
|
teardown do
|
@@ -169,85 +74,80 @@ class DirmonJobTest < Minitest::Test
|
|
169
74
|
|
170
75
|
should 'no files' do
|
171
76
|
previous_file_names = {}
|
172
|
-
result
|
173
|
-
Dir.stub(:[], -> dir { [] }) do
|
174
|
-
result = @dirmon_job.check_directories(previous_file_names)
|
175
|
-
end
|
77
|
+
result = @dirmon_job.send(:check_directories, previous_file_names)
|
176
78
|
assert_equal 0, result.count
|
177
79
|
end
|
178
80
|
|
179
|
-
should 'new files' do
|
81
|
+
should 'collect new files without enqueuing them' do
|
82
|
+
create_file("#{@directory}/abc/file1", 5)
|
83
|
+
create_file("#{@directory}/abc/file2", 10)
|
84
|
+
|
180
85
|
previous_file_names = {}
|
181
|
-
result
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
end
|
186
|
-
end
|
187
|
-
assert_equal result.count, @paths['abc/*'].count
|
188
|
-
result.each_pair do |k,v|
|
189
|
-
assert_equal 5, v
|
190
|
-
end
|
86
|
+
result = @dirmon_job.send(:check_directories, previous_file_names)
|
87
|
+
assert_equal 2, result.count, result.inspect
|
88
|
+
assert_equal 5, result.values.first, result.inspect
|
89
|
+
assert_equal 10, result.values.second, result.inspect
|
191
90
|
end
|
192
91
|
|
193
92
|
should 'allow files to grow' do
|
93
|
+
create_file("#{@directory}/abc/file1", 5)
|
94
|
+
create_file("#{@directory}/abc/file2", 10)
|
194
95
|
previous_file_names = {}
|
195
|
-
@
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
assert_equal result.count, @paths['abc/*'].count
|
203
|
-
result.each_pair do |k,v|
|
204
|
-
assert_equal 10, v
|
205
|
-
end
|
96
|
+
@dirmon_job.send(:check_directories, previous_file_names)
|
97
|
+
create_file("#{@directory}/abc/file1", 10)
|
98
|
+
create_file("#{@directory}/abc/file2", 15)
|
99
|
+
result = @dirmon_job.send(:check_directories, previous_file_names)
|
100
|
+
assert_equal 2, result.count, result.inspect
|
101
|
+
assert_equal 10, result.values.first, result.inspect
|
102
|
+
assert_equal 15, result.values.second, result.inspect
|
206
103
|
end
|
207
104
|
|
208
105
|
should 'start all files' do
|
209
|
-
|
210
|
-
@
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
106
|
+
create_file("#{@directory}/abc/file1", 5)
|
107
|
+
create_file("#{@directory}/abc/file2", 10)
|
108
|
+
previous_file_names = @dirmon_job.send(:check_directories, {})
|
109
|
+
|
110
|
+
count = 0
|
111
|
+
result = RocketJob::DirmonEntry.stub_any_instance(:later, -> path { count += 1 }) do
|
112
|
+
@dirmon_job.send(:check_directories, previous_file_names)
|
216
113
|
end
|
217
|
-
|
114
|
+
assert 2, count
|
115
|
+
assert_equal 0, result.count, result.inspect
|
218
116
|
end
|
219
117
|
|
220
118
|
should 'skip files in archive directory' do
|
221
|
-
|
222
|
-
@
|
223
|
-
|
224
|
-
#
|
225
|
-
@
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
assert_equal result.count,
|
232
|
-
result.
|
233
|
-
|
234
|
-
end
|
119
|
+
@entry.archive_directory = nil
|
120
|
+
@entry.pattern = "#{@directory}/abc/**/*"
|
121
|
+
|
122
|
+
create_file("#{@directory}/abc/file1", 5)
|
123
|
+
create_file("#{@directory}/abc/file2", 10)
|
124
|
+
FileUtils.makedirs("#{@directory}/abc/#{@entry.archive_pathname}")
|
125
|
+
create_file("#{@directory}/abc/#{@entry.archive_pathname}/file3", 10)
|
126
|
+
|
127
|
+
result = @dirmon_job.send(:check_directories, {})
|
128
|
+
|
129
|
+
assert_equal 2, result.count, result.inspect
|
130
|
+
assert_equal 5, result.values.first, result.inspect
|
131
|
+
assert_equal 10, result.values.second, result.inspect
|
235
132
|
end
|
236
133
|
end
|
237
134
|
|
238
|
-
|
239
135
|
context '#perform' do
|
240
136
|
should 'check directories and reschedule' do
|
241
|
-
dirmon_job
|
242
|
-
previous_file_names = {
|
243
|
-
|
244
|
-
|
245
|
-
|
137
|
+
dirmon_job = nil
|
138
|
+
previous_file_names = {
|
139
|
+
"#{@directory}/abc/file1" => 5,
|
140
|
+
"#{@directory}/abc/file2" => 10,
|
141
|
+
}
|
142
|
+
new_file_names = {
|
143
|
+
"#{@directory}/abc/file1" => 10,
|
144
|
+
"#{@directory}/abc/file2" => 10,
|
145
|
+
}
|
246
146
|
RocketJob::Jobs::DirmonJob.destroy_all
|
247
147
|
RocketJob::Jobs::DirmonJob.stub_any_instance(:check_directories, new_file_names) do
|
248
148
|
# perform_now does not save the job, just runs it
|
249
149
|
dirmon_job = RocketJob::Jobs::DirmonJob.perform_now(previous_file_names) do |job|
|
250
|
-
job.priority
|
150
|
+
job.priority = 11
|
251
151
|
job.check_seconds = 30
|
252
152
|
end
|
253
153
|
end
|
@@ -265,29 +165,32 @@ class DirmonJobTest < Minitest::Test
|
|
265
165
|
new_dirmon_job.destroy
|
266
166
|
end
|
267
167
|
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
168
|
+
should 'check directories and reschedule even on exception' do
|
169
|
+
dirmon_job = nil
|
170
|
+
RocketJob::Jobs::DirmonJob.destroy_all
|
171
|
+
RocketJob::Jobs::DirmonJob.stub_any_instance(:check_directories, -> previous { raise RuntimeError.new("Oh no") }) do
|
172
|
+
# perform_now does not save the job, just runs it
|
173
|
+
dirmon_job = RocketJob::Jobs::DirmonJob.perform_now do |job|
|
174
|
+
job.priority = 11
|
175
|
+
job.check_seconds = 30
|
176
|
+
end
|
276
177
|
end
|
277
|
-
|
278
|
-
assert dirmon_job.failed?, dirmon_job.status.inspect
|
178
|
+
assert dirmon_job.failed?, dirmon_job.status.inspect
|
279
179
|
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
180
|
+
# It should have enqueued another instance to run in the future
|
181
|
+
assert_equal 2, RocketJob::Jobs::DirmonJob.count
|
182
|
+
assert new_dirmon_job = RocketJob::Jobs::DirmonJob.last
|
183
|
+
assert new_dirmon_job.run_at
|
184
|
+
assert_equal 11, new_dirmon_job.priority
|
185
|
+
assert_equal 30, new_dirmon_job.check_seconds
|
186
|
+
assert new_dirmon_job.queued?
|
287
187
|
|
288
|
-
|
289
|
-
|
188
|
+
new_dirmon_job.destroy
|
189
|
+
end
|
290
190
|
end
|
191
|
+
end
|
291
192
|
|
193
|
+
def create_file(file_name, size)
|
194
|
+
File.open(file_name, 'w') { |file| file.write('*' * size) }
|
292
195
|
end
|
293
196
|
end
|
data/test/job_test.rb
CHANGED
@@ -8,16 +8,22 @@ class JobTest < Minitest::Test
|
|
8
8
|
@worker = RocketJob::Worker.new
|
9
9
|
@worker.started
|
10
10
|
@description = 'Hello World'
|
11
|
-
@arguments = [
|
12
|
-
@job
|
11
|
+
@arguments = [1]
|
12
|
+
@job = Jobs::TestJob.new(
|
13
13
|
description: @description,
|
14
14
|
arguments: @arguments,
|
15
15
|
destroy_on_complete: false
|
16
16
|
)
|
17
|
+
@job2 = Jobs::TestJob.new(
|
18
|
+
description: "#{@description} 2",
|
19
|
+
arguments: @arguments,
|
20
|
+
destroy_on_complete: false
|
21
|
+
)
|
17
22
|
end
|
18
23
|
|
19
24
|
teardown do
|
20
25
|
@job.destroy if @job && !@job.new_record?
|
26
|
+
@job2.destroy if @job2 && !@job2.new_record?
|
21
27
|
end
|
22
28
|
|
23
29
|
context '.config' do
|
@@ -30,34 +36,38 @@ class JobTest < Minitest::Test
|
|
30
36
|
should 'handle hash' do
|
31
37
|
@job = Jobs::TestJob.new(
|
32
38
|
description: @description,
|
33
|
-
arguments: [
|
34
|
-
destroy_on_complete: false
|
39
|
+
arguments: [{key: 'value'}],
|
40
|
+
destroy_on_complete: false,
|
41
|
+
worker_name: 'worker:123'
|
35
42
|
)
|
36
43
|
|
37
44
|
assert_equal 'value', @job.arguments.first[:key]
|
45
|
+
@job.worker_name = nil
|
38
46
|
@job.save!
|
47
|
+
@job.worker_name = '123'
|
39
48
|
@job.reload
|
40
49
|
assert @job.arguments.first.is_a?(ActiveSupport::HashWithIndifferentAccess), @job.arguments.first.class.inspect
|
41
50
|
assert_equal 'value', @job.arguments.first['key']
|
42
51
|
assert_equal 'value', @job.arguments.first[:key]
|
52
|
+
assert_equal nil, @job.worker_name
|
43
53
|
end
|
44
54
|
end
|
45
55
|
|
46
56
|
context '#save!' do
|
47
57
|
should 'save a blank job' do
|
48
58
|
@job.save!
|
49
|
-
assert_nil
|
50
|
-
assert_nil
|
51
|
-
assert
|
59
|
+
assert_nil @job.worker_name
|
60
|
+
assert_nil @job.completed_at
|
61
|
+
assert @job.created_at
|
52
62
|
assert_equal @description, @job.description
|
53
63
|
assert_equal false, @job.destroy_on_complete
|
54
|
-
assert_nil
|
64
|
+
assert_nil @job.expires_at
|
55
65
|
assert_equal @arguments, @job.arguments
|
56
66
|
assert_equal 0, @job.percent_complete
|
57
67
|
assert_equal 50, @job.priority
|
58
68
|
assert_equal 0, @job.failure_count
|
59
|
-
assert_nil
|
60
|
-
assert_nil
|
69
|
+
assert_nil @job.run_at
|
70
|
+
assert_nil @job.started_at
|
61
71
|
assert_equal :queued, @job.state
|
62
72
|
end
|
63
73
|
end
|
@@ -66,23 +76,59 @@ class JobTest < Minitest::Test
|
|
66
76
|
should 'return status for a queued job' do
|
67
77
|
assert_equal true, @job.queued?
|
68
78
|
h = @job.status
|
69
|
-
assert_equal :queued,
|
70
|
-
assert_equal @description,
|
79
|
+
assert_equal :queued, h['state']
|
80
|
+
assert_equal @description, h['description']
|
71
81
|
end
|
72
82
|
|
73
83
|
should 'return status for a failed job' do
|
74
|
-
@job.
|
75
|
-
|
76
|
-
|
77
|
-
|
84
|
+
@job.start!
|
85
|
+
@job.fail!('worker:1234', 'oh no')
|
86
|
+
assert_equal true, @job.failed?
|
87
|
+
h = @job.status
|
88
|
+
assert_equal :failed, h['state']
|
89
|
+
assert_equal @description, h['description']
|
90
|
+
assert_equal 'RocketJob::JobException', h['exception']['class_name'], h
|
91
|
+
assert_equal 'oh no', h['exception']['message'], h
|
92
|
+
end
|
93
|
+
|
94
|
+
should 'mark user as reason for failure when not supplied' do
|
78
95
|
@job.start!
|
79
96
|
@job.fail!
|
80
97
|
assert_equal true, @job.failed?
|
98
|
+
assert_equal @description, @job.description
|
99
|
+
assert_equal 'RocketJob::JobException', @job.exception.class_name
|
100
|
+
assert_equal 'Job failed through user action', @job.exception.message
|
101
|
+
assert_equal 'user', @job.exception.worker_name
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context '#fail_with_exception!' do
|
106
|
+
should 'fail with message' do
|
107
|
+
@job.start!
|
108
|
+
@job.fail!('myworker:2323', 'oh no')
|
109
|
+
assert_equal true, @job.failed?
|
110
|
+
h = @job.status
|
111
|
+
assert_equal :failed, h['state']
|
112
|
+
assert_equal @description, h['description']
|
113
|
+
assert_equal 'RocketJob::JobException', h['exception']['class_name'], h
|
114
|
+
assert_equal 'oh no', h['exception']['message'], h
|
115
|
+
end
|
116
|
+
|
117
|
+
should 'fail with exception' do
|
118
|
+
@job.start!
|
119
|
+
exception = nil
|
120
|
+
begin
|
121
|
+
blah
|
122
|
+
rescue Exception => exc
|
123
|
+
exception = exc
|
124
|
+
end
|
125
|
+
@job.fail!('myworker:2323', exception)
|
126
|
+
assert_equal true, @job.failed?
|
81
127
|
h = @job.status
|
82
|
-
assert_equal :failed,
|
83
|
-
assert_equal @description,
|
84
|
-
assert_equal
|
85
|
-
|
128
|
+
assert_equal :failed, h['state']
|
129
|
+
assert_equal @description, h['description']
|
130
|
+
assert_equal exception.class.name.to_s, h['exception']['class_name'], h
|
131
|
+
assert h['exception']['message'].include?('undefined local variable or method'), h
|
86
132
|
end
|
87
133
|
end
|
88
134
|
|
@@ -90,17 +136,17 @@ class JobTest < Minitest::Test
|
|
90
136
|
should 'call default perform method' do
|
91
137
|
@job.start!
|
92
138
|
assert_equal false, @job.work(@worker)
|
93
|
-
assert_equal true,
|
94
|
-
assert_equal 2,
|
139
|
+
assert_equal true, @job.completed?, @job.state
|
140
|
+
assert_equal 2, Jobs::TestJob.result
|
95
141
|
end
|
96
142
|
|
97
143
|
should 'call specific method' do
|
98
144
|
@job.perform_method = :sum
|
99
|
-
@job.arguments
|
145
|
+
@job.arguments = [23, 45]
|
100
146
|
@job.start!
|
101
147
|
assert_equal false, @job.work(@worker)
|
102
148
|
assert_equal true, @job.completed?
|
103
|
-
assert_equal 68,
|
149
|
+
assert_equal 68, Jobs::TestJob.result
|
104
150
|
end
|
105
151
|
|
106
152
|
should 'destroy on complete' do
|
@@ -117,7 +163,7 @@ class JobTest < Minitest::Test
|
|
117
163
|
@job.arguments = []
|
118
164
|
@job.start!
|
119
165
|
logged = false
|
120
|
-
Jobs::TestJob.logger.stub(:log_internal, -> level, index, message, payload, exception { logged = true if message.include?('some very noisy logging')}) do
|
166
|
+
Jobs::TestJob.logger.stub(:log_internal, -> level, index, message, payload, exception { logged = true if message.include?('some very noisy logging') }) do
|
121
167
|
assert_equal false, @job.work(@worker), @job.inspect
|
122
168
|
end
|
123
169
|
assert_equal false, logged
|
@@ -140,9 +186,9 @@ class JobTest < Minitest::Test
|
|
140
186
|
end
|
141
187
|
|
142
188
|
should 'call before and after' do
|
143
|
-
named_parameters
|
189
|
+
named_parameters = {'counter' => 23}
|
144
190
|
@job.perform_method = :event
|
145
|
-
@job.arguments
|
191
|
+
@job.arguments = [named_parameters]
|
146
192
|
@job.start!
|
147
193
|
assert_equal false, @job.work(@worker), @job.inspect
|
148
194
|
assert_equal true, @job.completed?
|
@@ -162,7 +208,7 @@ class JobTest < Minitest::Test
|
|
162
208
|
|
163
209
|
should 'return the first job' do
|
164
210
|
@job.save!
|
165
|
-
assert job = RocketJob::Job.next_job(@worker.name),
|
211
|
+
assert job = RocketJob::Job.next_job(@worker.name), 'Failed to find job'
|
166
212
|
assert_equal @job.id, job.id
|
167
213
|
end
|
168
214
|
|
@@ -175,18 +221,90 @@ class JobTest < Minitest::Test
|
|
175
221
|
should 'Process future dated jobs when time is now' do
|
176
222
|
@job.run_at = Time.now
|
177
223
|
@job.save!
|
178
|
-
assert job = RocketJob::Job.next_job(@worker.name),
|
224
|
+
assert job = RocketJob::Job.next_job(@worker.name), 'Failed to find future job'
|
179
225
|
assert_equal @job.id, job.id
|
180
226
|
end
|
181
227
|
|
182
228
|
should 'Skip expired jobs' do
|
183
|
-
count
|
229
|
+
count = RocketJob::Job.count
|
184
230
|
@job.expires_at = Time.now - 100
|
185
231
|
@job.save!
|
186
232
|
assert_equal nil, RocketJob::Job.next_job(@worker.name)
|
187
233
|
assert_equal count, RocketJob::Job.count
|
188
234
|
end
|
235
|
+
end
|
236
|
+
|
237
|
+
context '#requeue!' do
|
238
|
+
should 'requeue jobs from dead workers' do
|
239
|
+
worker_name = 'server:12345'
|
240
|
+
@job.worker_name = worker_name
|
241
|
+
@job.start!
|
242
|
+
assert @job.running?
|
243
|
+
|
244
|
+
@job.requeue!
|
245
|
+
@job.reload
|
246
|
+
|
247
|
+
assert @job.queued?
|
248
|
+
assert_equal nil, @job.worker_name
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
context '#requeue' do
|
253
|
+
should 'requeue jobs from dead workers' do
|
254
|
+
worker_name = 'server:12345'
|
255
|
+
@job.worker_name = worker_name
|
256
|
+
@job.start!
|
257
|
+
assert @job.running?
|
258
|
+
|
259
|
+
@job.requeue
|
260
|
+
assert @job.queued?
|
261
|
+
assert_equal nil, @job.worker_name
|
189
262
|
|
263
|
+
@job.reload
|
264
|
+
assert @job.running?
|
265
|
+
assert_equal worker_name, @job.worker_name
|
266
|
+
end
|
190
267
|
end
|
268
|
+
|
269
|
+
context '.requeue_dead_worker' do
|
270
|
+
should 'requeue jobs from dead workers' do
|
271
|
+
worker_name = 'server:12345'
|
272
|
+
@job.worker_name = worker_name
|
273
|
+
@job.start!
|
274
|
+
assert @job.running?
|
275
|
+
|
276
|
+
worker_name2 = 'server:76467'
|
277
|
+
@job2.worker_name = worker_name2
|
278
|
+
@job2.start!
|
279
|
+
|
280
|
+
RocketJob::Job.requeue_dead_worker(worker_name)
|
281
|
+
@job.reload
|
282
|
+
|
283
|
+
assert @job.queued?
|
284
|
+
assert_equal nil, @job.worker_name
|
285
|
+
|
286
|
+
@job2.reload
|
287
|
+
assert @job2.running?
|
288
|
+
assert_equal worker_name2, @job2.worker_name
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
context '#retry!' do
|
293
|
+
should 'retry failed jobs' do
|
294
|
+
worker_name = 'server:12345'
|
295
|
+
@job.worker_name = worker_name
|
296
|
+
@job.start!
|
297
|
+
assert @job.running?
|
298
|
+
assert_equal worker_name, @job.worker_name
|
299
|
+
|
300
|
+
@job.fail!(worker_name, 'oh no')
|
301
|
+
assert @job.failed?
|
302
|
+
|
303
|
+
@job.retry!
|
304
|
+
assert @job.queued?
|
305
|
+
assert_equal nil, @job.worker_name
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
191
309
|
end
|
192
310
|
end
|