rocketjob 1.1.2 → 1.1.3
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/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
|