rocketjob 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|