rocketjob 1.1.2 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rocket_job/dirmon_entry.rb +2 -2
- data/lib/rocket_job/job.rb +2 -1
- data/lib/rocket_job/job_exception.rb +1 -1
- data/lib/rocket_job/version.rb +1 -1
- data/test/dirmon_entry_test.rb +52 -50
- data/test/dirmon_job_test.rb +23 -23
- data/test/job_test.rb +40 -38
- data/test/job_worker_test.rb +12 -12
- data/test/test_helper.rb +0 -1
- data/test/worker_test.rb +15 -15
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0791ec0844d63115ea5d7b5a1205fe21e72a635c
|
4
|
+
data.tar.gz: 1898e2c267dce737cfa546796d700c72a06bcad7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14da955ecac4f0b1316c343de006c53d1df296c24c9982c72c48e4ca12631d1283e89e64b999d488a26907503e7b46801c5ace72096dd4b0d3f02c6631f4e001
|
7
|
+
data.tar.gz: f97236b79cfab5ade58b30afebbd8ef05e462ef3f264c70860ab9cc8c2061257f6789bbc3b8d339f80a7d9ca1b17c7e6834678ca1b44958296683543e8adb32f
|
@@ -51,13 +51,13 @@ module RocketJob
|
|
51
51
|
# Regular Expression
|
52
52
|
#
|
53
53
|
# Note: Date is not supported, convert it to a UTC time
|
54
|
-
key :arguments, Array
|
54
|
+
key :arguments, Array
|
55
55
|
|
56
56
|
# Any job properties to set
|
57
57
|
#
|
58
58
|
# Example, override the default job priority:
|
59
59
|
# { priority: 45 }
|
60
|
-
key :properties, Hash
|
60
|
+
key :properties, Hash
|
61
61
|
|
62
62
|
# Archive directory to move files to when processed to prevent processing the
|
63
63
|
# file again.
|
data/lib/rocket_job/job.rb
CHANGED
@@ -65,7 +65,7 @@ module RocketJob
|
|
65
65
|
# Regular Expression
|
66
66
|
#
|
67
67
|
# Note: Date is not supported, convert it to a UTC time
|
68
|
-
key :arguments, Array
|
68
|
+
key :arguments, Array
|
69
69
|
|
70
70
|
# Whether to store the results from this job
|
71
71
|
key :collect_output, Boolean, default: false
|
@@ -382,6 +382,7 @@ module RocketJob
|
|
382
382
|
|
383
383
|
def before_retry
|
384
384
|
self.completed_at = nil
|
385
|
+
self.exception = nil
|
385
386
|
end
|
386
387
|
|
387
388
|
def before_pause
|
data/lib/rocket_job/version.rb
CHANGED
data/test/dirmon_entry_test.rb
CHANGED
@@ -3,54 +3,56 @@ require_relative 'jobs/test_job'
|
|
3
3
|
|
4
4
|
# Unit Test for RocketJob::Job
|
5
5
|
class DirmonEntryTest < Minitest::Test
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
describe RocketJob::DirmonEntry do
|
7
|
+
describe '.config' do
|
8
|
+
it 'support multiple databases' do
|
9
9
|
assert_equal 'test_rocketjob', RocketJob::DirmonEntry.collection.db.name
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
describe '#job_class' do
|
14
|
+
describe 'with a nil job_class_name' do
|
15
|
+
it 'return nil' do
|
16
16
|
entry = RocketJob::DirmonEntry.new
|
17
17
|
assert_equal(nil, entry.job_class)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
describe 'with an unknown job_class_name' do
|
22
|
+
it 'return nil' do
|
23
23
|
entry = RocketJob::DirmonEntry.new(job_class_name: 'FakeJobThatDoesNotExistAnyWhereIPromise')
|
24
24
|
assert_equal(nil, entry.job_class)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
describe 'with a valid job_class_name' do
|
29
|
+
it 'return job class' do
|
30
30
|
entry = RocketJob::DirmonEntry.new(job_class_name: 'RocketJob::Job')
|
31
31
|
assert_equal(RocketJob::Job, entry.job_class)
|
32
|
+
assert_equal 0, entry.arguments.size
|
33
|
+
assert_equal 0, entry.properties.size
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
+
describe '.whitelist_paths' do
|
39
|
+
it 'default to []' do
|
38
40
|
assert_equal [], RocketJob::DirmonEntry.whitelist_paths
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
+
describe '.add_whitelist_path' do
|
45
|
+
after do
|
44
46
|
RocketJob::DirmonEntry.whitelist_paths.each { |path| RocketJob::DirmonEntry.delete_whitelist_path(path) }
|
45
47
|
end
|
46
48
|
|
47
|
-
|
49
|
+
it 'convert relative path to an absolute one' do
|
48
50
|
path = Pathname('test/jobs').realpath.to_s
|
49
51
|
assert_equal path, RocketJob::DirmonEntry.add_whitelist_path('test/jobs')
|
50
52
|
assert_equal [path], RocketJob::DirmonEntry.whitelist_paths
|
51
53
|
end
|
52
54
|
|
53
|
-
|
55
|
+
it 'prevent duplicates' do
|
54
56
|
path = Pathname('test/jobs').realpath.to_s
|
55
57
|
assert_equal path, RocketJob::DirmonEntry.add_whitelist_path('test/jobs')
|
56
58
|
assert_equal path, RocketJob::DirmonEntry.add_whitelist_path('test/jobs')
|
@@ -59,23 +61,23 @@ class DirmonEntryTest < Minitest::Test
|
|
59
61
|
end
|
60
62
|
end
|
61
63
|
|
62
|
-
|
63
|
-
|
64
|
+
describe '#fail_with_exception!' do
|
65
|
+
before do
|
64
66
|
@dirmon_entry = RocketJob::DirmonEntry.new(job_class_name: 'Jobs::TestJob', pattern: '/abc/**', arguments: [1])
|
65
67
|
@dirmon_entry.enable!
|
66
68
|
end
|
67
|
-
|
69
|
+
after do
|
68
70
|
@dirmon_entry.destroy if @dirmon_entry && @dirmon_entry.new_record?
|
69
71
|
end
|
70
72
|
|
71
|
-
|
73
|
+
it 'fail with message' do
|
72
74
|
@dirmon_entry.fail_with_exception!('myworker:2323', 'oh no')
|
73
75
|
assert_equal true, @dirmon_entry.failed?
|
74
76
|
assert_equal 'RocketJob::DirmonEntryException', @dirmon_entry.exception.class_name
|
75
77
|
assert_equal 'oh no', @dirmon_entry.exception.message
|
76
78
|
end
|
77
79
|
|
78
|
-
|
80
|
+
it 'fail with exception' do
|
79
81
|
exception = nil
|
80
82
|
begin
|
81
83
|
blah
|
@@ -90,16 +92,16 @@ class DirmonEntryTest < Minitest::Test
|
|
90
92
|
end
|
91
93
|
end
|
92
94
|
|
93
|
-
|
94
|
-
|
95
|
+
describe '#validate' do
|
96
|
+
it 'existance' do
|
95
97
|
assert entry = RocketJob::DirmonEntry.new(job_class_name: 'Jobs::TestJob')
|
96
98
|
assert_equal false, entry.valid?
|
97
99
|
assert_equal ["can't be blank"], entry.errors[:pattern], entry.errors.inspect
|
98
100
|
end
|
99
101
|
|
100
|
-
|
101
|
-
|
102
|
-
|
102
|
+
describe 'perform_method' do
|
103
|
+
describe 'with an invalid method' do
|
104
|
+
it 'add errors to the entry' do
|
103
105
|
entry = RocketJob::DirmonEntry.new(job_class_name: 'Jobs::TestJob', perform_method: :missing_perform_method)
|
104
106
|
assert_equal false, entry.valid?
|
105
107
|
assert_equal ['Method not implemented by Jobs::TestJob'], entry.errors[:perform_method], entry.errors.inspect
|
@@ -107,16 +109,16 @@ class DirmonEntryTest < Minitest::Test
|
|
107
109
|
end
|
108
110
|
end
|
109
111
|
|
110
|
-
|
111
|
-
|
112
|
+
describe 'job_class_name' do
|
113
|
+
it 'ensure presence' do
|
112
114
|
assert entry = RocketJob::DirmonEntry.new(pattern: '/abc/**')
|
113
115
|
assert_equal false, entry.valid?
|
114
116
|
assert_equal ["can't be blank", 'job_class_name must be defined and must be derived from RocketJob::Job'], entry.errors[:job_class_name], entry.errors.inspect
|
115
117
|
end
|
116
118
|
end
|
117
119
|
|
118
|
-
|
119
|
-
|
120
|
+
describe 'arguments' do
|
121
|
+
it 'allow no arguments' do
|
120
122
|
assert entry = RocketJob::DirmonEntry.new(
|
121
123
|
job_class_name: 'Jobs::TestJob',
|
122
124
|
pattern: '/abc/**',
|
@@ -126,7 +128,7 @@ class DirmonEntryTest < Minitest::Test
|
|
126
128
|
assert_equal [], entry.errors[:arguments], entry.errors.inspect
|
127
129
|
end
|
128
130
|
|
129
|
-
|
131
|
+
it 'ensure correct number of arguments' do
|
130
132
|
assert entry = RocketJob::DirmonEntry.new(
|
131
133
|
job_class_name: 'Jobs::TestJob',
|
132
134
|
pattern: '/abc/**'
|
@@ -135,7 +137,7 @@ class DirmonEntryTest < Minitest::Test
|
|
135
137
|
assert_equal ['There must be 1 argument(s)'], entry.errors[:arguments], entry.errors.inspect
|
136
138
|
end
|
137
139
|
|
138
|
-
|
140
|
+
it 'return false if the job name is bad' do
|
139
141
|
assert entry = RocketJob::DirmonEntry.new(
|
140
142
|
job_class_name: 'Jobs::Tests::Names::Things',
|
141
143
|
pattern: '/abc/**'
|
@@ -145,7 +147,7 @@ class DirmonEntryTest < Minitest::Test
|
|
145
147
|
end
|
146
148
|
end
|
147
149
|
|
148
|
-
|
150
|
+
it 'arguments with perform_method' do
|
149
151
|
assert entry = RocketJob::DirmonEntry.new(
|
150
152
|
job_class_name: 'Jobs::TestJob',
|
151
153
|
pattern: '/abc/**',
|
@@ -155,7 +157,7 @@ class DirmonEntryTest < Minitest::Test
|
|
155
157
|
assert_equal ['There must be 2 argument(s)'], entry.errors[:arguments], entry.errors.inspect
|
156
158
|
end
|
157
159
|
|
158
|
-
|
160
|
+
it 'valid' do
|
159
161
|
assert entry = RocketJob::DirmonEntry.new(
|
160
162
|
job_class_name: 'Jobs::TestJob',
|
161
163
|
pattern: '/abc/**',
|
@@ -164,7 +166,7 @@ class DirmonEntryTest < Minitest::Test
|
|
164
166
|
assert entry.valid?, entry.errors.inspect
|
165
167
|
end
|
166
168
|
|
167
|
-
|
169
|
+
it 'valid with perform_method' do
|
168
170
|
assert entry = RocketJob::DirmonEntry.new(
|
169
171
|
job_class_name: 'Jobs::TestJob',
|
170
172
|
pattern: '/abc/**',
|
@@ -175,8 +177,8 @@ class DirmonEntryTest < Minitest::Test
|
|
175
177
|
end
|
176
178
|
end
|
177
179
|
|
178
|
-
|
179
|
-
|
180
|
+
describe 'with valid entry' do
|
181
|
+
before do
|
180
182
|
@archive_directory = '/tmp/archive_directory'
|
181
183
|
@entry = RocketJob::DirmonEntry.new(
|
182
184
|
pattern: 'abc/*',
|
@@ -194,37 +196,37 @@ class DirmonEntryTest < Minitest::Test
|
|
194
196
|
@archive_file_name = File.join(@archive_directory, "#{@job.id}_#{File.basename(@file_name)}")
|
195
197
|
end
|
196
198
|
|
197
|
-
|
199
|
+
after do
|
198
200
|
@file.delete if @file
|
199
201
|
end
|
200
202
|
|
201
|
-
|
202
|
-
|
203
|
+
describe '#archive_pathname' do
|
204
|
+
it 'with archive directory' do
|
203
205
|
assert_equal @archive_directory.to_s, @entry.archive_pathname.to_s
|
204
206
|
end
|
205
207
|
|
206
|
-
|
208
|
+
it 'without archive directory' do
|
207
209
|
@entry.archive_directory = nil
|
208
210
|
assert_equal '_archive', @entry.archive_pathname.to_s
|
209
211
|
end
|
210
212
|
end
|
211
213
|
|
212
|
-
|
213
|
-
|
214
|
+
describe '#archive_file' do
|
215
|
+
it 'archive file' do
|
214
216
|
assert_equal @archive_file_name, @entry.send(:archive_file, @job, Pathname.new(@file_name))
|
215
217
|
assert File.exists?(@archive_file_name), @archive_file_name
|
216
218
|
end
|
217
219
|
end
|
218
220
|
|
219
|
-
|
220
|
-
|
221
|
+
describe '#upload_default' do
|
222
|
+
it 'upload' do
|
221
223
|
@entry.send(:upload_default, @job, @pathname)
|
222
224
|
assert_equal File.absolute_path(@archive_file_name), @job.arguments.first[:full_file_name], @job.arguments
|
223
225
|
end
|
224
226
|
end
|
225
227
|
|
226
|
-
|
227
|
-
|
228
|
+
describe '#upload_file' do
|
229
|
+
it 'upload using #file_store_upload' do
|
228
230
|
@job.define_singleton_method(:file_store_upload) do |file_name|
|
229
231
|
self.description = "FILE:#{file_name}"
|
230
232
|
end
|
@@ -232,7 +234,7 @@ class DirmonEntryTest < Minitest::Test
|
|
232
234
|
assert_equal "FILE:#{@file_name}", @job.description
|
233
235
|
end
|
234
236
|
|
235
|
-
|
237
|
+
it 'upload using #upload' do
|
236
238
|
@job.define_singleton_method(:upload) do |file_name|
|
237
239
|
self.description = "FILE:#{file_name}"
|
238
240
|
end
|
@@ -241,8 +243,8 @@ class DirmonEntryTest < Minitest::Test
|
|
241
243
|
end
|
242
244
|
end
|
243
245
|
|
244
|
-
|
245
|
-
|
246
|
+
describe '#later' do
|
247
|
+
it 'enqueue job' do
|
246
248
|
@entry.arguments = [{}]
|
247
249
|
@entry.perform_method = :event
|
248
250
|
job = @entry.later(@pathname)
|
data/test/dirmon_job_test.rb
CHANGED
@@ -3,8 +3,8 @@ require_relative 'jobs/test_job'
|
|
3
3
|
|
4
4
|
# Unit Test for RocketJob::Job
|
5
5
|
class DirmonJobTest < Minitest::Test
|
6
|
-
|
7
|
-
|
6
|
+
describe RocketJob::Jobs::DirmonJob do
|
7
|
+
before do
|
8
8
|
@dirmon_job = RocketJob::Jobs::DirmonJob.new
|
9
9
|
@directory = '/tmp/directory'
|
10
10
|
@archive_directory = '/tmp/archive_directory'
|
@@ -19,14 +19,14 @@ class DirmonJobTest < Minitest::Test
|
|
19
19
|
FileUtils.makedirs(@archive_directory)
|
20
20
|
end
|
21
21
|
|
22
|
-
|
22
|
+
after do
|
23
23
|
@dirmon_job.destroy if @dirmon_job && !@dirmon_job.new_record?
|
24
24
|
FileUtils.remove_dir(@archive_directory, true) if Dir.exist?(@archive_directory)
|
25
25
|
FileUtils.remove_dir(@directory, true) if Dir.exist?(@directory)
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
describe '#check_file' do
|
29
|
+
it 'check growing file' do
|
30
30
|
previous_size = 5
|
31
31
|
new_size = 10
|
32
32
|
file = Tempfile.new('check_file')
|
@@ -39,7 +39,7 @@ class DirmonJobTest < Minitest::Test
|
|
39
39
|
assert_equal new_size, result
|
40
40
|
end
|
41
41
|
|
42
|
-
|
42
|
+
it 'check completed file' do
|
43
43
|
previous_size = 10
|
44
44
|
new_size = 10
|
45
45
|
file = Tempfile.new('check_file')
|
@@ -54,7 +54,7 @@ class DirmonJobTest < Minitest::Test
|
|
54
54
|
assert started
|
55
55
|
end
|
56
56
|
|
57
|
-
|
57
|
+
it 'check deleted file' do
|
58
58
|
previous_size = 5
|
59
59
|
file_name = Pathname.new('blah')
|
60
60
|
result = @dirmon_job.send(:check_file, @entry, file_name, previous_size)
|
@@ -62,23 +62,23 @@ class DirmonJobTest < Minitest::Test
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
|
66
|
-
|
65
|
+
describe '#check_directories' do
|
66
|
+
before do
|
67
67
|
RocketJob::DirmonEntry.destroy_all
|
68
68
|
@entry.enable!
|
69
69
|
end
|
70
70
|
|
71
|
-
|
71
|
+
after do
|
72
72
|
@entry.destroy if @entry
|
73
73
|
end
|
74
74
|
|
75
|
-
|
75
|
+
it 'no files' do
|
76
76
|
previous_file_names = {}
|
77
77
|
result = @dirmon_job.send(:check_directories, previous_file_names)
|
78
78
|
assert_equal 0, result.count
|
79
79
|
end
|
80
80
|
|
81
|
-
|
81
|
+
it 'collect new files without enqueuing them' do
|
82
82
|
create_file("#{@directory}/abc/file1", 5)
|
83
83
|
create_file("#{@directory}/abc/file2", 10)
|
84
84
|
|
@@ -89,7 +89,7 @@ class DirmonJobTest < Minitest::Test
|
|
89
89
|
assert_equal 10, result.values.second, result.inspect
|
90
90
|
end
|
91
91
|
|
92
|
-
|
92
|
+
it 'allow files to grow' do
|
93
93
|
create_file("#{@directory}/abc/file1", 5)
|
94
94
|
create_file("#{@directory}/abc/file2", 10)
|
95
95
|
previous_file_names = {}
|
@@ -102,7 +102,7 @@ class DirmonJobTest < Minitest::Test
|
|
102
102
|
assert_equal 15, result.values.second, result.inspect
|
103
103
|
end
|
104
104
|
|
105
|
-
|
105
|
+
it 'start all files' do
|
106
106
|
create_file("#{@directory}/abc/file1", 5)
|
107
107
|
create_file("#{@directory}/abc/file2", 10)
|
108
108
|
previous_file_names = @dirmon_job.send(:check_directories, {})
|
@@ -115,7 +115,7 @@ class DirmonJobTest < Minitest::Test
|
|
115
115
|
assert_equal 0, result.count, result.inspect
|
116
116
|
end
|
117
117
|
|
118
|
-
|
118
|
+
it 'skip files in archive directory' do
|
119
119
|
@entry.archive_directory = nil
|
120
120
|
@entry.pattern = "#{@directory}/abc/**/*"
|
121
121
|
|
@@ -132,8 +132,8 @@ class DirmonJobTest < Minitest::Test
|
|
132
132
|
end
|
133
133
|
end
|
134
134
|
|
135
|
-
|
136
|
-
|
135
|
+
describe '#perform' do
|
136
|
+
it 'check directories and reschedule' do
|
137
137
|
dirmon_job = nil
|
138
138
|
previous_file_names = {
|
139
139
|
"#{@directory}/abc/file1" => 5,
|
@@ -153,7 +153,7 @@ class DirmonJobTest < Minitest::Test
|
|
153
153
|
end
|
154
154
|
assert dirmon_job.completed?, dirmon_job.status.inspect
|
155
155
|
|
156
|
-
# It
|
156
|
+
# It it have enqueued another instance to run in the future
|
157
157
|
assert_equal 1, RocketJob::Jobs::DirmonJob.count
|
158
158
|
assert new_dirmon_job = RocketJob::Jobs::DirmonJob.last
|
159
159
|
assert_equal false, dirmon_job.id == new_dirmon_job.id
|
@@ -165,7 +165,7 @@ class DirmonJobTest < Minitest::Test
|
|
165
165
|
new_dirmon_job.destroy
|
166
166
|
end
|
167
167
|
|
168
|
-
|
168
|
+
it 'check directories and reschedule even on exception' do
|
169
169
|
dirmon_job = nil
|
170
170
|
RocketJob::Jobs::DirmonJob.destroy_all
|
171
171
|
RocketJob::Jobs::DirmonJob.stub_any_instance(:check_directories, -> previous { raise RuntimeError.new("Oh no") }) do
|
@@ -177,7 +177,7 @@ class DirmonJobTest < Minitest::Test
|
|
177
177
|
end
|
178
178
|
assert dirmon_job.failed?, dirmon_job.status.inspect
|
179
179
|
|
180
|
-
# It
|
180
|
+
# It it have enqueued another instance to run in the future
|
181
181
|
assert_equal 2, RocketJob::Jobs::DirmonJob.count
|
182
182
|
assert new_dirmon_job = RocketJob::Jobs::DirmonJob.last
|
183
183
|
assert new_dirmon_job.run_at
|
@@ -188,9 +188,9 @@ class DirmonJobTest < Minitest::Test
|
|
188
188
|
new_dirmon_job.destroy
|
189
189
|
end
|
190
190
|
end
|
191
|
-
end
|
192
191
|
|
193
|
-
|
194
|
-
|
192
|
+
def create_file(file_name, size)
|
193
|
+
File.open(file_name, 'w') { |file| file.write('*' * size) }
|
194
|
+
end
|
195
195
|
end
|
196
196
|
end
|
data/test/job_test.rb
CHANGED
@@ -3,8 +3,8 @@ require_relative 'jobs/test_job'
|
|
3
3
|
|
4
4
|
# Unit Test for RocketJob::Job
|
5
5
|
class JobTest < Minitest::Test
|
6
|
-
|
7
|
-
|
6
|
+
describe RocketJob::Job do
|
7
|
+
before do
|
8
8
|
@worker = RocketJob::Worker.new
|
9
9
|
@worker.started
|
10
10
|
@description = 'Hello World'
|
@@ -21,19 +21,19 @@ class JobTest < Minitest::Test
|
|
21
21
|
)
|
22
22
|
end
|
23
23
|
|
24
|
-
|
24
|
+
after do
|
25
25
|
@job.destroy if @job && !@job.new_record?
|
26
26
|
@job2.destroy if @job2 && !@job2.new_record?
|
27
27
|
end
|
28
28
|
|
29
|
-
|
30
|
-
|
29
|
+
describe '.config' do
|
30
|
+
it 'support multiple databases' do
|
31
31
|
assert_equal 'test_rocketjob', RocketJob::Job.collection.db.name
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
|
36
|
-
|
35
|
+
describe '#reload' do
|
36
|
+
it 'handle hash' do
|
37
37
|
@job = Jobs::TestJob.new(
|
38
38
|
description: @description,
|
39
39
|
arguments: [{key: 'value'}],
|
@@ -53,8 +53,8 @@ class JobTest < Minitest::Test
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
|
57
|
-
|
56
|
+
describe '#save!' do
|
57
|
+
it 'save a blank job' do
|
58
58
|
@job.save!
|
59
59
|
assert_nil @job.worker_name
|
60
60
|
assert_nil @job.completed_at
|
@@ -72,15 +72,15 @@ class JobTest < Minitest::Test
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
|
76
|
-
|
75
|
+
describe '#status' do
|
76
|
+
it 'return status for a queued job' do
|
77
77
|
assert_equal true, @job.queued?
|
78
78
|
h = @job.status
|
79
79
|
assert_equal :queued, h['state']
|
80
80
|
assert_equal @description, h['description']
|
81
81
|
end
|
82
82
|
|
83
|
-
|
83
|
+
it 'return status for a failed job' do
|
84
84
|
@job.start!
|
85
85
|
@job.fail!('worker:1234', 'oh no')
|
86
86
|
assert_equal true, @job.failed?
|
@@ -91,7 +91,7 @@ class JobTest < Minitest::Test
|
|
91
91
|
assert_equal 'oh no', h['exception']['message'], h
|
92
92
|
end
|
93
93
|
|
94
|
-
|
94
|
+
it 'mark user as reason for failure when not supplied' do
|
95
95
|
@job.start!
|
96
96
|
@job.fail!
|
97
97
|
assert_equal true, @job.failed?
|
@@ -102,8 +102,8 @@ class JobTest < Minitest::Test
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
-
|
106
|
-
|
105
|
+
describe '#fail_with_exception!' do
|
106
|
+
it 'fail with message' do
|
107
107
|
@job.start!
|
108
108
|
@job.fail!('myworker:2323', 'oh no')
|
109
109
|
assert_equal true, @job.failed?
|
@@ -114,7 +114,7 @@ class JobTest < Minitest::Test
|
|
114
114
|
assert_equal 'oh no', h['exception']['message'], h
|
115
115
|
end
|
116
116
|
|
117
|
-
|
117
|
+
it 'fail with exception' do
|
118
118
|
@job.start!
|
119
119
|
exception = nil
|
120
120
|
begin
|
@@ -132,15 +132,15 @@ class JobTest < Minitest::Test
|
|
132
132
|
end
|
133
133
|
end
|
134
134
|
|
135
|
-
|
136
|
-
|
135
|
+
describe '#work' do
|
136
|
+
it 'call default perform method' do
|
137
137
|
@job.start!
|
138
138
|
assert_equal false, @job.work(@worker)
|
139
139
|
assert_equal true, @job.completed?, @job.state
|
140
140
|
assert_equal 2, Jobs::TestJob.result
|
141
141
|
end
|
142
142
|
|
143
|
-
|
143
|
+
it 'call specific method' do
|
144
144
|
@job.perform_method = :sum
|
145
145
|
@job.arguments = [23, 45]
|
146
146
|
@job.start!
|
@@ -149,14 +149,14 @@ class JobTest < Minitest::Test
|
|
149
149
|
assert_equal 68, Jobs::TestJob.result
|
150
150
|
end
|
151
151
|
|
152
|
-
|
152
|
+
it 'destroy on complete' do
|
153
153
|
@job.destroy_on_complete = true
|
154
154
|
@job.start!
|
155
155
|
assert_equal false, @job.work(@worker)
|
156
156
|
assert_equal nil, RocketJob::Job.find_by_id(@job.id)
|
157
157
|
end
|
158
158
|
|
159
|
-
|
159
|
+
it 'silence logging when log_level is set' do
|
160
160
|
@job.destroy_on_complete = true
|
161
161
|
@job.log_level = :warn
|
162
162
|
@job.perform_method = :noisy_logger
|
@@ -169,7 +169,7 @@ class JobTest < Minitest::Test
|
|
169
169
|
assert_equal false, logged
|
170
170
|
end
|
171
171
|
|
172
|
-
|
172
|
+
it 'raise logging when log_level is set' do
|
173
173
|
@job.destroy_on_complete = true
|
174
174
|
@job.log_level = :trace
|
175
175
|
@job.perform_method = :debug_logging
|
@@ -185,7 +185,7 @@ class JobTest < Minitest::Test
|
|
185
185
|
assert_equal false, logged
|
186
186
|
end
|
187
187
|
|
188
|
-
|
188
|
+
it 'call before and after' do
|
189
189
|
named_parameters = {'counter' => 23}
|
190
190
|
@job.perform_method = :event
|
191
191
|
@job.arguments = [named_parameters]
|
@@ -197,35 +197,35 @@ class JobTest < Minitest::Test
|
|
197
197
|
|
198
198
|
end
|
199
199
|
|
200
|
-
|
201
|
-
|
200
|
+
describe '.next_job' do
|
201
|
+
before do
|
202
202
|
RocketJob::Job.destroy_all
|
203
203
|
end
|
204
204
|
|
205
|
-
|
205
|
+
it 'return nil when no jobs available' do
|
206
206
|
assert_equal nil, RocketJob::Job.next_job(@worker.name)
|
207
207
|
end
|
208
208
|
|
209
|
-
|
209
|
+
it 'return the first job' do
|
210
210
|
@job.save!
|
211
211
|
assert job = RocketJob::Job.next_job(@worker.name), 'Failed to find job'
|
212
212
|
assert_equal @job.id, job.id
|
213
213
|
end
|
214
214
|
|
215
|
-
|
215
|
+
it 'Ignore future dated jobs' do
|
216
216
|
@job.run_at = Time.now + 1.hour
|
217
217
|
@job.save!
|
218
218
|
assert_equal nil, RocketJob::Job.next_job(@worker.name)
|
219
219
|
end
|
220
220
|
|
221
|
-
|
221
|
+
it 'Process future dated jobs when time is now' do
|
222
222
|
@job.run_at = Time.now
|
223
223
|
@job.save!
|
224
224
|
assert job = RocketJob::Job.next_job(@worker.name), 'Failed to find future job'
|
225
225
|
assert_equal @job.id, job.id
|
226
226
|
end
|
227
227
|
|
228
|
-
|
228
|
+
it 'Skip expired jobs' do
|
229
229
|
count = RocketJob::Job.count
|
230
230
|
@job.expires_at = Time.now - 100
|
231
231
|
@job.save!
|
@@ -234,8 +234,8 @@ class JobTest < Minitest::Test
|
|
234
234
|
end
|
235
235
|
end
|
236
236
|
|
237
|
-
|
238
|
-
|
237
|
+
describe '#requeue!' do
|
238
|
+
it 'requeue jobs from dead workers' do
|
239
239
|
worker_name = 'server:12345'
|
240
240
|
@job.worker_name = worker_name
|
241
241
|
@job.start!
|
@@ -249,8 +249,8 @@ class JobTest < Minitest::Test
|
|
249
249
|
end
|
250
250
|
end
|
251
251
|
|
252
|
-
|
253
|
-
|
252
|
+
describe '#requeue' do
|
253
|
+
it 'requeue jobs from dead workers' do
|
254
254
|
worker_name = 'server:12345'
|
255
255
|
@job.worker_name = worker_name
|
256
256
|
@job.start!
|
@@ -266,8 +266,8 @@ class JobTest < Minitest::Test
|
|
266
266
|
end
|
267
267
|
end
|
268
268
|
|
269
|
-
|
270
|
-
|
269
|
+
describe '.requeue_dead_worker' do
|
270
|
+
it 'requeue jobs from dead workers' do
|
271
271
|
worker_name = 'server:12345'
|
272
272
|
@job.worker_name = worker_name
|
273
273
|
@job.start!
|
@@ -289,8 +289,8 @@ class JobTest < Minitest::Test
|
|
289
289
|
end
|
290
290
|
end
|
291
291
|
|
292
|
-
|
293
|
-
|
292
|
+
describe '#retry!' do
|
293
|
+
it 'retry failed jobs' do
|
294
294
|
worker_name = 'server:12345'
|
295
295
|
@job.worker_name = worker_name
|
296
296
|
@job.start!
|
@@ -299,10 +299,12 @@ class JobTest < Minitest::Test
|
|
299
299
|
|
300
300
|
@job.fail!(worker_name, 'oh no')
|
301
301
|
assert @job.failed?
|
302
|
+
assert_equal 'oh no', @job.exception.message
|
302
303
|
|
303
304
|
@job.retry!
|
304
305
|
assert @job.queued?
|
305
306
|
assert_equal nil, @job.worker_name
|
307
|
+
assert_equal nil, @job.exception
|
306
308
|
end
|
307
309
|
end
|
308
310
|
|
data/test/job_worker_test.rb
CHANGED
@@ -3,22 +3,22 @@ require_relative 'jobs/test_job'
|
|
3
3
|
|
4
4
|
# Unit Test for RocketJob::Job
|
5
5
|
class WorkerTest < Minitest::Test
|
6
|
-
|
6
|
+
describe RocketJob::Job do
|
7
7
|
[true, false].each do |inline_mode|
|
8
|
-
|
8
|
+
before do
|
9
9
|
RocketJob::Config.inline_mode = inline_mode
|
10
10
|
|
11
11
|
@worker = RocketJob::Worker.new
|
12
12
|
@worker.started
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
after do
|
16
16
|
@job.destroy if @job && !@job.new_record?
|
17
17
|
RocketJob::Config.inline_mode = false
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
describe '.perform_later' do
|
21
|
+
it "process single request (inline_mode=#{inline_mode})" do
|
22
22
|
@job = Jobs::TestJob.perform_later(1) do |job|
|
23
23
|
job.destroy_on_complete = false
|
24
24
|
end
|
@@ -55,8 +55,8 @@ class WorkerTest < Minitest::Test
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
|
59
|
-
|
58
|
+
describe '.later' do
|
59
|
+
it "process non default method (inline_mode=#{inline_mode})" do
|
60
60
|
@job = Jobs::TestJob.later(:sum, 23, 45)
|
61
61
|
@job.start
|
62
62
|
assert_equal false, @job.work(@worker), @job.exception.inspect
|
@@ -65,16 +65,16 @@ class WorkerTest < Minitest::Test
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
-
|
69
|
-
|
68
|
+
describe '.perform_now' do
|
69
|
+
it "process perform (inline_mode=#{inline_mode})" do
|
70
70
|
@job = Jobs::TestJob.perform_now(5)
|
71
71
|
assert_equal true, @job.completed?
|
72
72
|
assert_equal 6, Jobs::TestJob.result
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
|
77
|
-
|
76
|
+
describe '.now' do
|
77
|
+
it "process non default method (inline_mode=#{inline_mode})" do
|
78
78
|
@job = Jobs::TestJob.now(:sum, 23, 45)
|
79
79
|
assert_equal true, @job.completed?, @job.inspect
|
80
80
|
assert_equal 68, Jobs::TestJob.result
|
@@ -83,4 +83,4 @@ class WorkerTest < Minitest::Test
|
|
83
83
|
|
84
84
|
end
|
85
85
|
end
|
86
|
-
end
|
86
|
+
end
|
data/test/test_helper.rb
CHANGED
data/test/worker_test.rb
CHANGED
@@ -3,8 +3,8 @@ require_relative 'jobs/test_job'
|
|
3
3
|
|
4
4
|
# Unit Test for RocketJob::Worker
|
5
5
|
class WorkerTest < Minitest::Test
|
6
|
-
|
7
|
-
|
6
|
+
describe RocketJob::Worker do
|
7
|
+
before do
|
8
8
|
RocketJob::Config.instance.heartbeat_seconds = 0.1
|
9
9
|
RocketJob::Config.instance.max_poll_seconds = 0.1
|
10
10
|
|
@@ -18,19 +18,19 @@ class WorkerTest < Minitest::Test
|
|
18
18
|
)
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
after do
|
22
22
|
@job.destroy if @job && !@job.new_record?
|
23
23
|
@worker.destroy if @worker && !@worker.new_record?
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
|
26
|
+
describe '.config' do
|
27
|
+
it 'support multiple databases' do
|
28
28
|
assert_equal 'test_rocketjob', RocketJob::Job.collection.db.name
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
|
33
|
-
|
32
|
+
describe '#run' do
|
33
|
+
it 'run a worker' do
|
34
34
|
Thread.new do
|
35
35
|
sleep 1
|
36
36
|
@worker.stop!
|
@@ -40,12 +40,12 @@ class WorkerTest < Minitest::Test
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
|
44
|
-
|
43
|
+
describe '#zombie?' do
|
44
|
+
before do
|
45
45
|
RocketJob::Config.instance.heartbeat_seconds = 1
|
46
46
|
end
|
47
47
|
|
48
|
-
|
48
|
+
it 'when not a zombie' do
|
49
49
|
@worker.build_heartbeat(
|
50
50
|
updated_at: 2.seconds.ago,
|
51
51
|
current_threads: 3
|
@@ -56,7 +56,7 @@ class WorkerTest < Minitest::Test
|
|
56
56
|
assert_equal true, @worker.zombie?(1)
|
57
57
|
end
|
58
58
|
|
59
|
-
|
59
|
+
it 'when a zombie' do
|
60
60
|
@worker.build_heartbeat(
|
61
61
|
updated_at: 1.hour.ago,
|
62
62
|
current_threads: 5
|
@@ -66,12 +66,12 @@ class WorkerTest < Minitest::Test
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
-
|
70
|
-
|
69
|
+
describe '.destroy_zombies' do
|
70
|
+
before do
|
71
71
|
RocketJob::Config.instance.heartbeat_seconds = 1
|
72
72
|
end
|
73
73
|
|
74
|
-
|
74
|
+
it 'when not a zombie' do
|
75
75
|
@worker.build_heartbeat(
|
76
76
|
updated_at: 2.seconds.ago,
|
77
77
|
current_threads: 3
|
@@ -81,7 +81,7 @@ class WorkerTest < Minitest::Test
|
|
81
81
|
assert_equal true, RocketJob::Worker.where(id: @worker.id).exist?
|
82
82
|
end
|
83
83
|
|
84
|
-
|
84
|
+
it 'when a zombie' do
|
85
85
|
@worker.build_heartbeat(
|
86
86
|
updated_at: 10.seconds.ago,
|
87
87
|
current_threads: 3
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rocketjob
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Morrison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aasm
|
@@ -160,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
160
|
version: '0'
|
161
161
|
requirements: []
|
162
162
|
rubyforge_project:
|
163
|
-
rubygems_version: 2.4.
|
163
|
+
rubygems_version: 2.4.5.1
|
164
164
|
signing_key:
|
165
165
|
specification_version: 4
|
166
166
|
summary: Next generation background job processing system for Ruby, JRuby and Rubinius
|