rocketjob 3.4.3 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +27 -0
- data/bin/rocketjob +1 -1
- data/lib/rocket_job/active_worker.rb +4 -3
- data/lib/rocket_job/cli.rb +13 -12
- data/lib/rocket_job/config.rb +17 -13
- data/lib/rocket_job/dirmon_entry.rb +88 -91
- data/lib/rocket_job/extensions/mongo/logging.rb +8 -4
- data/lib/rocket_job/extensions/mongoid/factory.rb +8 -6
- data/lib/rocket_job/extensions/rocket_job_adapter.rb +2 -4
- data/lib/rocket_job/heartbeat.rb +7 -8
- data/lib/rocket_job/job_exception.rb +6 -5
- data/lib/rocket_job/jobs/dirmon_job.rb +5 -7
- data/lib/rocket_job/jobs/housekeeping_job.rb +3 -2
- data/lib/rocket_job/jobs/on_demand_job.rb +104 -0
- data/lib/rocket_job/jobs/simple_job.rb +0 -2
- data/lib/rocket_job/jobs/upload_file_job.rb +100 -0
- data/lib/rocket_job/performance.rb +15 -10
- data/lib/rocket_job/plugins/cron.rb +7 -124
- data/lib/rocket_job/plugins/document.rb +8 -10
- data/lib/rocket_job/plugins/job/callbacks.rb +0 -1
- data/lib/rocket_job/plugins/job/logger.rb +0 -1
- data/lib/rocket_job/plugins/job/model.rb +15 -20
- data/lib/rocket_job/plugins/job/persistence.rb +3 -13
- data/lib/rocket_job/plugins/job/state_machine.rb +1 -2
- data/lib/rocket_job/plugins/job/throttle.rb +16 -12
- data/lib/rocket_job/plugins/job/worker.rb +15 -19
- data/lib/rocket_job/plugins/processing_window.rb +2 -2
- data/lib/rocket_job/plugins/restart.rb +3 -4
- data/lib/rocket_job/plugins/retry.rb +2 -3
- data/lib/rocket_job/plugins/singleton.rb +2 -3
- data/lib/rocket_job/plugins/state_machine.rb +19 -23
- data/lib/rocket_job/rocket_job.rb +4 -5
- data/lib/rocket_job/server.rb +35 -41
- data/lib/rocket_job/version.rb +2 -2
- data/lib/rocket_job/worker.rb +22 -21
- data/lib/rocketjob.rb +2 -0
- data/test/config/mongoid.yml +2 -2
- data/test/config_test.rb +0 -2
- data/test/dirmon_entry_test.rb +161 -134
- data/test/dirmon_job_test.rb +80 -78
- data/test/job_test.rb +0 -2
- data/test/jobs/housekeeping_job_test.rb +0 -1
- data/test/jobs/on_demand_job_test.rb +59 -0
- data/test/jobs/upload_file_job_test.rb +99 -0
- data/test/plugins/cron_test.rb +1 -3
- data/test/plugins/job/callbacks_test.rb +8 -13
- data/test/plugins/job/defaults_test.rb +0 -1
- data/test/plugins/job/logger_test.rb +2 -4
- data/test/plugins/job/model_test.rb +1 -2
- data/test/plugins/job/persistence_test.rb +0 -2
- data/test/plugins/job/state_machine_test.rb +0 -2
- data/test/plugins/job/throttle_test.rb +6 -8
- data/test/plugins/job/worker_test.rb +1 -2
- data/test/plugins/processing_window_test.rb +0 -2
- data/test/plugins/restart_test.rb +0 -1
- data/test/plugins/retry_test.rb +1 -2
- data/test/plugins/singleton_test.rb +0 -2
- data/test/plugins/state_machine_event_callbacks_test.rb +1 -2
- data/test/plugins/state_machine_test.rb +0 -2
- data/test/plugins/transaction_test.rb +5 -7
- data/test/test_db.sqlite3 +0 -0
- data/test/test_helper.rb +2 -1
- metadata +42 -36
data/test/config_test.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
2
|
class ConfigTest < Minitest::Test
|
3
3
|
describe RocketJob::Config do
|
4
|
-
|
5
4
|
describe '.config' do
|
6
5
|
it 'support multiple databases' do
|
7
6
|
assert_equal 'rocketjob_test', RocketJob::Job.collection.database.name
|
8
7
|
end
|
9
8
|
end
|
10
|
-
|
11
9
|
end
|
12
10
|
end
|
data/test/dirmon_entry_test.rb
CHANGED
@@ -2,30 +2,47 @@ require_relative 'test_helper'
|
|
2
2
|
|
3
3
|
# Unit Test for RocketJob::Job
|
4
4
|
class DirmonEntryTest < Minitest::Test
|
5
|
-
|
6
|
-
class WithFullFileNameJob < RocketJob::Job
|
5
|
+
class TestJob < RocketJob::Job
|
7
6
|
# Dirmon will store the filename in this property when starting the job
|
8
7
|
field :upload_file_name, type: String
|
9
8
|
|
9
|
+
field :user_id, type: Integer
|
10
|
+
|
10
11
|
def perform
|
11
12
|
# Do something with the file name stored in :upload_file_name
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
describe RocketJob::DirmonEntry do
|
17
|
+
let :archive_directory do
|
18
|
+
'/tmp/archive_directory'
|
19
|
+
end
|
17
20
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
+
let :archive_path do
|
22
|
+
archive_path = Pathname.new(archive_directory)
|
23
|
+
archive_path.mkpath
|
24
|
+
archive_path.realdirpath
|
21
25
|
end
|
22
26
|
|
23
|
-
|
24
|
-
|
27
|
+
let :dirmon_entry do
|
28
|
+
dirmon_entry = RocketJob::DirmonEntry.new(
|
29
|
+
name: 'Test',
|
30
|
+
job_class_name: 'DirmonEntryTest::TestJob',
|
31
|
+
pattern: 'test/files/**',
|
32
|
+
properties: {user_id: 341},
|
33
|
+
archive_directory: archive_directory
|
34
|
+
)
|
35
|
+
dirmon_entry.enable!
|
36
|
+
assert dirmon_entry.valid?, dirmon_entry.errors.messages.ai
|
37
|
+
dirmon_entry
|
38
|
+
end
|
39
|
+
|
40
|
+
before do
|
41
|
+
RocketJob::Jobs::DirmonJob.delete_all
|
42
|
+
RocketJob::Jobs::UploadFileJob.delete_all
|
43
|
+
RocketJob::DirmonEntry.delete_all
|
25
44
|
end
|
26
|
-
end
|
27
45
|
|
28
|
-
describe RocketJob::DirmonEntry do
|
29
46
|
describe '.config' do
|
30
47
|
it 'support multiple databases' do
|
31
48
|
assert_equal 'rocketjob_test', RocketJob::DirmonEntry.collection.database.name
|
@@ -83,21 +100,11 @@ class DirmonEntryTest < Minitest::Test
|
|
83
100
|
end
|
84
101
|
|
85
102
|
describe '#fail!' do
|
86
|
-
before do
|
87
|
-
@dirmon_entry = RocketJob::DirmonEntry.new(job_class_name: 'DirmonEntryTest::WithFullFileNameJob', pattern: 'test/files/**')
|
88
|
-
@dirmon_entry.enable!
|
89
|
-
assert @dirmon_entry.valid?, @dirmon_entry.errors.messages.ai
|
90
|
-
end
|
91
|
-
|
92
|
-
after do
|
93
|
-
@dirmon_entry.destroy if @dirmon_entry && @dirmon_entry.new_record?
|
94
|
-
end
|
95
|
-
|
96
103
|
it 'fail with message' do
|
97
|
-
|
98
|
-
|
99
|
-
assert_equal 'RocketJob::DirmonEntryException',
|
100
|
-
assert_equal 'oh no',
|
104
|
+
dirmon_entry.fail!('myworker:2323', 'oh no')
|
105
|
+
assert dirmon_entry.failed?
|
106
|
+
assert_equal 'RocketJob::DirmonEntryException', dirmon_entry.exception.class_name
|
107
|
+
assert_equal 'oh no', dirmon_entry.exception.message
|
101
108
|
end
|
102
109
|
|
103
110
|
it 'fail with exception' do
|
@@ -107,138 +114,100 @@ class DirmonEntryTest < Minitest::Test
|
|
107
114
|
rescue Exception => exc
|
108
115
|
exception = exc
|
109
116
|
end
|
110
|
-
|
117
|
+
dirmon_entry.fail!('myworker:2323', exception)
|
111
118
|
|
112
|
-
assert_equal true,
|
113
|
-
assert_equal exception.class.name.to_s,
|
114
|
-
assert
|
119
|
+
assert_equal true, dirmon_entry.failed?
|
120
|
+
assert_equal exception.class.name.to_s, dirmon_entry.exception.class_name
|
121
|
+
assert dirmon_entry.exception.message.include?('undefined local variable or method'), dirmon_entry.attributes.inspect
|
115
122
|
end
|
116
123
|
end
|
117
124
|
|
118
125
|
describe '#validate' do
|
119
|
-
it '
|
120
|
-
|
121
|
-
|
122
|
-
|
126
|
+
it 'strip_whitespace' do
|
127
|
+
dirmon_entry.pattern = ' test/files/*'
|
128
|
+
dirmon_entry.archive_directory = ' test/archive/ '
|
129
|
+
assert dirmon_entry.valid?
|
130
|
+
assert_equal 'test/files/*', dirmon_entry.pattern
|
131
|
+
assert_equal 'test/archive/', dirmon_entry.archive_directory
|
132
|
+
end
|
133
|
+
|
134
|
+
describe 'pattern' do
|
135
|
+
it 'present' do
|
136
|
+
dirmon_entry.pattern = nil
|
137
|
+
refute dirmon_entry.valid?
|
138
|
+
assert_equal ["can't be blank"], dirmon_entry.errors[:pattern], dirmon_entry.errors.messages.ai
|
139
|
+
end
|
123
140
|
end
|
124
141
|
|
125
142
|
describe 'job_class_name' do
|
126
143
|
it 'ensure presence' do
|
127
|
-
|
128
|
-
|
129
|
-
assert_equal ["can't be blank"
|
144
|
+
dirmon_entry.job_class_name = nil
|
145
|
+
refute dirmon_entry.valid?
|
146
|
+
assert_equal ["can't be blank"], dirmon_entry.errors[:job_class_name], dirmon_entry.errors.messages.ai
|
130
147
|
end
|
131
|
-
end
|
132
|
-
end
|
133
148
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
@archive_path.mkpath
|
140
|
-
@archive_path = @archive_path.realdirpath
|
141
|
-
@entry = RocketJob::DirmonEntry.new(
|
142
|
-
pattern: 'test/files/**/*',
|
143
|
-
job_class_name: 'RocketJob::Jobs::DirmonJob',
|
144
|
-
properties: {priority: 23},
|
145
|
-
archive_directory: @archive_directory
|
146
|
-
)
|
147
|
-
@job = DirmonEntryTest::WithFullFileNameJob.new(
|
148
|
-
@entry.properties
|
149
|
-
)
|
150
|
-
@file = Tempfile.new('archive')
|
151
|
-
@file_name = @file.path
|
152
|
-
@pathname = Pathname.new(@file_name)
|
153
|
-
File.open(@file_name, 'w') { |file| file.write('Hello World') }
|
154
|
-
assert File.exist?(@file_name)
|
155
|
-
@archive_real_name = @archive_path.join("#{@job.id}_#{File.basename(@file_name)}").to_s
|
156
|
-
end
|
149
|
+
it 'is a RocketJob::Job' do
|
150
|
+
dirmon_entry.job_class_name = 'String'
|
151
|
+
refute dirmon_entry.valid?
|
152
|
+
assert_equal ['Job String must be defined and inherit from RocketJob::Job'], dirmon_entry.errors[:job_class_name], dirmon_entry.errors.messages.ai
|
153
|
+
end
|
157
154
|
|
158
|
-
|
159
|
-
|
160
|
-
|
155
|
+
it 'is invalid' do
|
156
|
+
dirmon_entry.job_class_name = 'Blah'
|
157
|
+
refute dirmon_entry.valid?
|
158
|
+
assert_equal ['Job Blah must be defined and inherit from RocketJob::Job'], dirmon_entry.errors[:job_class_name], dirmon_entry.errors.messages.ai
|
159
|
+
end
|
161
160
|
end
|
162
161
|
|
163
|
-
describe '
|
164
|
-
it '
|
165
|
-
|
162
|
+
describe 'properties' do
|
163
|
+
it 'are valid' do
|
164
|
+
dirmon_entry.properties = {user_id: 123}
|
165
|
+
assert dirmon_entry.valid?, dirmon_entry.errors.messages.ai
|
166
166
|
end
|
167
167
|
|
168
|
-
it '
|
169
|
-
|
170
|
-
|
168
|
+
it 'not valid' do
|
169
|
+
dirmon_entry.properties = {blah: 123}
|
170
|
+
refute dirmon_entry.valid?
|
171
|
+
assert_equal ['Unknown Property: Attempted to set a value for :blah which is not allowed on the job DirmonEntryTest::TestJob'], dirmon_entry.errors[:properties], dirmon_entry.errors.messages.ai
|
171
172
|
end
|
172
173
|
end
|
174
|
+
end
|
173
175
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
176
|
+
describe 'with valid entry' do
|
177
|
+
let :file do
|
178
|
+
file = Tempfile.new('archive')
|
179
|
+
File.open(file.path, 'w') { |file| file.write('Hello World') }
|
180
|
+
file
|
179
181
|
end
|
180
182
|
|
181
|
-
|
182
|
-
|
183
|
-
@entry = RocketJob::DirmonEntry.new(
|
184
|
-
pattern: 'test/files/**/*',
|
185
|
-
job_class_name: 'DirmonEntryTest::WithFullFileNameJob',
|
186
|
-
archive_directory: @archive_directory
|
187
|
-
)
|
188
|
-
assert @entry.valid?, @entry.errors.messages
|
189
|
-
job = @entry.job_class.new
|
190
|
-
@entry.send(:upload_default, job, @pathname)
|
191
|
-
archive_real_name = @archive_path.join("#{job.id}_#{File.basename(@file_name)}").to_s
|
192
|
-
assert_equal archive_real_name, job.upload_file_name
|
193
|
-
end
|
183
|
+
let :file_name do
|
184
|
+
file.path
|
194
185
|
end
|
195
186
|
|
196
|
-
|
197
|
-
|
198
|
-
@job.define_singleton_method(:upload) do |file_name|
|
199
|
-
self.description = "FILE:#{file_name}"
|
200
|
-
end
|
201
|
-
@entry.send(:upload_file, @job, @pathname)
|
202
|
-
assert_equal "FILE:#{@file_name}", @job.description
|
203
|
-
end
|
187
|
+
let :pathname do
|
188
|
+
Pathname.new(file_name)
|
204
189
|
end
|
205
190
|
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
pattern: 'test/files/**/*',
|
210
|
-
job_class_name: 'DirmonEntryTest::WithFullFileNameJob',
|
211
|
-
archive_directory: @archive_directory
|
212
|
-
)
|
213
|
-
job = @entry.later(@pathname)
|
214
|
-
assert_equal Pathname.new(@archive_directory).join("#{job.id}_#{File.basename(@file_name)}").realdirpath.to_s, job.upload_file_name
|
215
|
-
assert job.queued?
|
216
|
-
assert_equal 50, job.priority
|
217
|
-
end
|
218
|
-
|
219
|
-
it 'fails with bad job class name' do
|
220
|
-
@entry.job_class_name = 'Blah'
|
221
|
-
assert_raises ArgumentError do
|
222
|
-
@entry.later(@pathname)
|
223
|
-
end
|
224
|
-
end
|
191
|
+
after do
|
192
|
+
file.delete
|
193
|
+
RocketJob::Jobs::DirmonJob.delete_all
|
225
194
|
end
|
226
195
|
|
227
196
|
describe '#each' do
|
228
197
|
it 'without archive path' do
|
229
|
-
|
230
|
-
files
|
231
|
-
|
198
|
+
dirmon_entry.archive_directory = nil
|
199
|
+
files = []
|
200
|
+
dirmon_entry.each do |file_name|
|
232
201
|
files << file_name
|
233
202
|
end
|
234
|
-
assert_nil
|
203
|
+
assert_nil dirmon_entry.archive_directory
|
235
204
|
assert_equal 1, files.count
|
236
205
|
assert_equal Pathname.new('test/files/text.txt').realpath, files.first
|
237
206
|
end
|
238
207
|
|
239
208
|
it 'with archive path' do
|
240
209
|
files = []
|
241
|
-
|
210
|
+
dirmon_entry.each do |file_name|
|
242
211
|
files << file_name
|
243
212
|
end
|
244
213
|
assert_equal 1, files.count
|
@@ -246,9 +215,9 @@ class DirmonEntryTest < Minitest::Test
|
|
246
215
|
end
|
247
216
|
|
248
217
|
it 'with case-insensitive pattern' do
|
249
|
-
|
250
|
-
files
|
251
|
-
|
218
|
+
dirmon_entry.pattern = 'test/files/**/*.TxT'
|
219
|
+
files = []
|
220
|
+
dirmon_entry.each do |file_name|
|
252
221
|
files << file_name
|
253
222
|
end
|
254
223
|
assert_equal 1, files.count
|
@@ -256,31 +225,89 @@ class DirmonEntryTest < Minitest::Test
|
|
256
225
|
end
|
257
226
|
|
258
227
|
it 'reads paths inside of the whitelist' do
|
259
|
-
|
260
|
-
files
|
261
|
-
|
262
|
-
|
228
|
+
dirmon_entry.archive_directory = nil
|
229
|
+
files = []
|
230
|
+
dirmon_entry.stub(:whitelist_paths, [Pathname.new('test/files').realpath.to_s]) do
|
231
|
+
dirmon_entry.each do |file_name|
|
263
232
|
files << file_name
|
264
233
|
end
|
265
234
|
end
|
266
|
-
assert_nil
|
235
|
+
assert_nil dirmon_entry.archive_directory
|
267
236
|
assert_equal 1, files.count
|
268
237
|
assert_equal Pathname.new('test/files/text.txt').realpath, files.first
|
269
238
|
end
|
270
239
|
|
271
240
|
it 'skips paths outside of the whitelist' do
|
272
|
-
|
273
|
-
files
|
274
|
-
|
275
|
-
|
241
|
+
dirmon_entry.archive_directory = nil
|
242
|
+
files = []
|
243
|
+
dirmon_entry.stub(:whitelist_paths, [Pathname.new('test/config').realpath.to_s]) do
|
244
|
+
dirmon_entry.each do |file_name|
|
276
245
|
files << file_name
|
277
246
|
end
|
278
247
|
end
|
279
|
-
assert_nil
|
248
|
+
assert_nil dirmon_entry.archive_directory
|
280
249
|
assert_equal 0, files.count
|
281
250
|
end
|
282
251
|
end
|
283
|
-
end
|
284
252
|
|
253
|
+
describe '#later' do
|
254
|
+
it 'enqueues job' do
|
255
|
+
job = dirmon_entry.later(pathname)
|
256
|
+
assert created_job = RocketJob::Jobs::UploadFileJob.last
|
257
|
+
assert_equal job.id, created_job.id
|
258
|
+
assert job.queued?
|
259
|
+
end
|
260
|
+
|
261
|
+
it 'sets attributes' do
|
262
|
+
job = dirmon_entry.later(pathname)
|
263
|
+
|
264
|
+
upload_file_name = Pathname.new(archive_directory).join("#{job.job_id}_#{File.basename(file_name)}").realdirpath.to_s
|
265
|
+
|
266
|
+
assert_equal dirmon_entry.job_class_name, job.job_class_name
|
267
|
+
assert_equal dirmon_entry.properties, job.properties
|
268
|
+
assert_equal upload_file_name, job.upload_file_name
|
269
|
+
assert_equal "#{dirmon_entry.name}: #{pathname.basename}", job.description
|
270
|
+
assert_equal pathname.to_s, job.original_file_name
|
271
|
+
assert job.job_id
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
describe '#archive_file' do
|
276
|
+
it 'moves file to archive dir' do
|
277
|
+
job_id = BSON::ObjectId.new
|
278
|
+
archive_real_name = archive_path.join("#{job_id}_#{File.basename(file_name)}").to_s
|
279
|
+
|
280
|
+
assert File.exist?(file_name)
|
281
|
+
assert_equal archive_real_name, dirmon_entry.send(:archive_file, job_id, pathname)
|
282
|
+
refute File.exist?(file_name)
|
283
|
+
assert File.exist?(archive_real_name)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
describe '#archive_pathname' do
|
288
|
+
it 'with fully qualified archive directory' do
|
289
|
+
assert_equal archive_path.to_s, dirmon_entry.send(:archive_pathname, pathname).to_s
|
290
|
+
end
|
291
|
+
|
292
|
+
describe 'with relative' do
|
293
|
+
let :archive_directory do
|
294
|
+
'my_archive/files'
|
295
|
+
end
|
296
|
+
|
297
|
+
it 'archive directory' do
|
298
|
+
archive_dir = File.join(pathname.realdirpath.dirname, archive_directory)
|
299
|
+
assert_equal archive_dir, dirmon_entry.send(:archive_pathname, pathname).to_s
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
it 'has a default archive directory' do
|
304
|
+
e = RocketJob::DirmonEntry.new(
|
305
|
+
pattern: 'test/files/**/*',
|
306
|
+
job_class_name: 'RocketJob::Jobs::DirmonJob'
|
307
|
+
)
|
308
|
+
assert_equal 'archive', e.archive_directory
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
285
312
|
end
|
286
313
|
end
|
data/test/dirmon_job_test.rb
CHANGED
@@ -2,44 +2,51 @@ require_relative 'test_helper'
|
|
2
2
|
|
3
3
|
# Unit Test for RocketJob::Job
|
4
4
|
class DirmonJobTest < Minitest::Test
|
5
|
-
class
|
5
|
+
class TestJob < RocketJob::Job
|
6
6
|
def perform
|
7
7
|
3645
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
11
|
describe RocketJob::Jobs::DirmonJob do
|
12
|
-
|
13
|
-
RocketJob::Jobs::DirmonJob.
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
let :dirmon_job do
|
13
|
+
RocketJob::Jobs::DirmonJob.new
|
14
|
+
end
|
15
|
+
|
16
|
+
let :directory do
|
17
|
+
'/tmp/directory'
|
18
|
+
end
|
19
|
+
|
20
|
+
let :archive_directory do
|
21
|
+
'/tmp/archive_directory'
|
22
|
+
end
|
23
|
+
|
24
|
+
let :dirmon_entry do
|
25
|
+
RocketJob::DirmonEntry.new(
|
26
|
+
pattern: "#{directory}/abc/*",
|
27
|
+
job_class_name: 'DirmonJobTest::TestJob',
|
20
28
|
properties: {priority: 23},
|
21
|
-
archive_directory:
|
29
|
+
archive_directory: archive_directory
|
22
30
|
)
|
23
|
-
|
24
|
-
|
31
|
+
end
|
32
|
+
|
33
|
+
before do
|
34
|
+
RocketJob::Jobs::DirmonJob.delete_all
|
35
|
+
FileUtils.makedirs("#{directory}/abc")
|
25
36
|
end
|
26
37
|
|
27
38
|
after do
|
28
|
-
|
29
|
-
FileUtils.remove_dir(
|
30
|
-
FileUtils.remove_dir(@directory, true) if Dir.exist?(@directory)
|
39
|
+
FileUtils.remove_dir(archive_directory, true) if Dir.exist?(archive_directory)
|
40
|
+
FileUtils.remove_dir(directory, true) if Dir.exist?(directory)
|
31
41
|
end
|
32
42
|
|
33
43
|
describe '#check_file' do
|
34
44
|
it 'check growing file' do
|
35
45
|
previous_size = 5
|
36
46
|
new_size = 10
|
37
|
-
file =
|
38
|
-
|
39
|
-
|
40
|
-
assert_equal new_size, File.size(file_name)
|
41
|
-
result = @entry.stub(:later, nil) do
|
42
|
-
@dirmon_job.send(:check_file, @entry, file, previous_size)
|
47
|
+
file = create_temp_file(new_size)
|
48
|
+
result = dirmon_entry.stub(:later, nil) do
|
49
|
+
dirmon_job.send(:check_file, dirmon_entry, file, previous_size)
|
43
50
|
end
|
44
51
|
assert_equal new_size, result
|
45
52
|
end
|
@@ -47,13 +54,10 @@ class DirmonJobTest < Minitest::Test
|
|
47
54
|
it 'check completed file' do
|
48
55
|
previous_size = 10
|
49
56
|
new_size = 10
|
50
|
-
file =
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
started = false
|
55
|
-
result = @entry.stub(:later, -> fn { started = true }) do
|
56
|
-
@dirmon_job.send(:check_file, @entry, file, previous_size)
|
57
|
+
file = create_temp_file(new_size)
|
58
|
+
started = false
|
59
|
+
result = dirmon_entry.stub(:later, ->(_fn) { started = true }) do
|
60
|
+
dirmon_job.send(:check_file, dirmon_entry, file, previous_size)
|
57
61
|
end
|
58
62
|
assert_nil result
|
59
63
|
assert started
|
@@ -63,7 +67,7 @@ class DirmonJobTest < Minitest::Test
|
|
63
67
|
previous_size = 5
|
64
68
|
file_name = Pathname.new('blah')
|
65
69
|
assert_raises Errno::ENOENT do
|
66
|
-
|
70
|
+
dirmon_job.send(:check_file, dirmon_entry, file_name, previous_size)
|
67
71
|
end
|
68
72
|
end
|
69
73
|
end
|
@@ -71,104 +75,94 @@ class DirmonJobTest < Minitest::Test
|
|
71
75
|
describe '#check_directories' do
|
72
76
|
before do
|
73
77
|
RocketJob::DirmonEntry.destroy_all
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
after do
|
78
|
-
@entry.destroy if @entry
|
78
|
+
dirmon_entry.enable!
|
79
79
|
end
|
80
80
|
|
81
81
|
it 'no files' do
|
82
|
-
result =
|
82
|
+
result = dirmon_job.send(:check_directories)
|
83
83
|
assert_equal 0, result.count
|
84
84
|
end
|
85
85
|
|
86
86
|
it 'collect new files without enqueuing them' do
|
87
|
-
create_file("#{
|
88
|
-
create_file("#{
|
87
|
+
create_file("#{directory}/abc/file1", 5)
|
88
|
+
create_file("#{directory}/abc/file2", 10)
|
89
89
|
|
90
|
-
result =
|
91
|
-
assert_equal
|
92
|
-
assert_equal 5, result.values.first, result
|
93
|
-
assert_equal 10, result.values.second, result
|
90
|
+
result = dirmon_job.send(:check_directories)
|
91
|
+
assert_equal [5, 10], result.values.sort
|
94
92
|
end
|
95
93
|
|
96
94
|
it 'allow files to grow' do
|
97
|
-
create_file("#{
|
98
|
-
create_file("#{
|
99
|
-
|
100
|
-
create_file("#{
|
101
|
-
create_file("#{
|
102
|
-
result =
|
103
|
-
assert_equal
|
104
|
-
assert_equal 10, result.values.first, result
|
105
|
-
assert_equal 15, result.values.second, result
|
95
|
+
create_file("#{directory}/abc/file1", 5)
|
96
|
+
create_file("#{directory}/abc/file2", 10)
|
97
|
+
dirmon_job.send(:check_directories)
|
98
|
+
create_file("#{directory}/abc/file1", 10)
|
99
|
+
create_file("#{directory}/abc/file2", 15)
|
100
|
+
result = dirmon_job.send(:check_directories)
|
101
|
+
assert_equal [10, 15], result.values.sort
|
106
102
|
end
|
107
103
|
|
108
104
|
it 'start all files' do
|
109
|
-
create_file("#{
|
110
|
-
create_file("#{
|
111
|
-
files =
|
105
|
+
create_file("#{directory}/abc/file1", 5)
|
106
|
+
create_file("#{directory}/abc/file2", 10)
|
107
|
+
files = dirmon_job.send(:check_directories)
|
112
108
|
assert_equal 2, files.count, files
|
113
|
-
assert_equal 2,
|
109
|
+
assert_equal 2, dirmon_job.previous_file_names.count, files
|
114
110
|
|
115
|
-
# files =
|
111
|
+
# files = dirmon_job.send(:check_directories)
|
116
112
|
# assert_equal 0, files.count, files
|
117
113
|
|
118
114
|
count = 0
|
119
|
-
result = RocketJob::DirmonEntry.stub_any_instance(:later, ->
|
120
|
-
|
115
|
+
result = RocketJob::DirmonEntry.stub_any_instance(:later, ->(_path) { count += 1 }) do
|
116
|
+
dirmon_job.send(:check_directories)
|
121
117
|
end
|
122
118
|
assert_equal 0, result.count, result
|
123
119
|
assert 2, count
|
124
120
|
end
|
125
121
|
|
126
122
|
it 'skip files in archive directory' do
|
127
|
-
|
128
|
-
|
129
|
-
file_pathname = Pathname.new("#{@directory}/abc/file1")
|
123
|
+
dirmon_entry.archive_directory = 'archive'
|
124
|
+
dirmon_entry.pattern = "#{directory}/abc/**/*"
|
130
125
|
|
126
|
+
file_pathname = Pathname.new("#{directory}/abc/file1")
|
131
127
|
create_file(file_pathname.to_s, 5)
|
132
|
-
create_file("#{
|
133
|
-
FileUtils.makedirs(@entry.archive_pathname(file_pathname))
|
134
|
-
create_file("#{@entry.archive_pathname(file_pathname)}/file3", 10)
|
128
|
+
create_file("#{directory}/abc/file2", 10)
|
135
129
|
|
136
|
-
|
130
|
+
archive_pathname = dirmon_entry.send(:archive_pathname, file_pathname)
|
131
|
+
create_file("#{archive_pathname}/file3", 21)
|
137
132
|
|
138
|
-
|
139
|
-
assert_equal 5, result.values.
|
140
|
-
assert_equal 10, result.values.second, result
|
133
|
+
result = dirmon_job.send(:check_directories)
|
134
|
+
assert_equal [5, 10], result.values.sort
|
141
135
|
end
|
142
136
|
end
|
143
137
|
|
144
138
|
describe '#perform' do
|
145
139
|
it 'check directories and reschedule' do
|
146
140
|
previous_file_names = {
|
147
|
-
"#{
|
148
|
-
"#{
|
141
|
+
"#{directory}/abc/file1" => 5,
|
142
|
+
"#{directory}/abc/file2" => 10
|
149
143
|
}
|
150
144
|
new_file_names = {
|
151
|
-
"#{
|
152
|
-
"#{
|
145
|
+
"#{directory}/abc/file1" => 10,
|
146
|
+
"#{directory}/abc/file2" => 10
|
153
147
|
}
|
154
148
|
assert_equal 0, RocketJob::Jobs::DirmonJob.count
|
155
149
|
# perform_now does not save the job, just runs it
|
156
|
-
|
150
|
+
dirmon_job = RocketJob::Jobs::DirmonJob.create!(
|
157
151
|
previous_file_names: previous_file_names,
|
158
152
|
priority: 11,
|
159
153
|
check_seconds: 30
|
160
154
|
)
|
161
155
|
RocketJob::Jobs::DirmonJob.stub_any_instance(:check_directories, new_file_names) do
|
162
|
-
|
156
|
+
dirmon_job.perform_now
|
163
157
|
end
|
164
|
-
assert
|
158
|
+
assert dirmon_job.completed?, dirmon_job.status.inspect
|
165
159
|
# Job must destroy on complete
|
166
|
-
assert_equal 0, RocketJob::Jobs::DirmonJob.where(id:
|
160
|
+
assert_equal 0, RocketJob::Jobs::DirmonJob.where(id: dirmon_job.id).count, -> { RocketJob::Jobs::DirmonJob.all.to_a.ai }
|
167
161
|
|
168
162
|
# Must have enqueued another instance to run in the future
|
169
163
|
assert_equal 1, RocketJob::Jobs::DirmonJob.count
|
170
164
|
assert new_dirmon_job = RocketJob::Jobs::DirmonJob.last
|
171
|
-
refute_equal
|
165
|
+
refute_equal dirmon_job.id.to_s, new_dirmon_job.id.to_s
|
172
166
|
assert new_dirmon_job.run_at
|
173
167
|
assert_equal 11, new_dirmon_job.priority
|
174
168
|
assert_equal 30, new_dirmon_job.check_seconds
|
@@ -185,7 +179,7 @@ class DirmonJobTest < Minitest::Test
|
|
185
179
|
check_seconds: 30,
|
186
180
|
destroy_on_complete: false
|
187
181
|
)
|
188
|
-
RocketJob::Jobs::DirmonJob.stub_any_instance(:check_directories, -> { raise
|
182
|
+
RocketJob::Jobs::DirmonJob.stub_any_instance(:check_directories, -> { raise 'Oh no' }) do
|
189
183
|
assert_raises RuntimeError do
|
190
184
|
dirmon_job.perform_now
|
191
185
|
end
|
@@ -208,7 +202,15 @@ class DirmonJobTest < Minitest::Test
|
|
208
202
|
end
|
209
203
|
|
210
204
|
def create_file(file_name, size)
|
211
|
-
File.open(file_name, '
|
205
|
+
File.open(file_name, 'wb') { |file| file.write('*' * size) }
|
206
|
+
end
|
207
|
+
|
208
|
+
def create_temp_file(size)
|
209
|
+
file = Tempfile.new('check_file')
|
210
|
+
file_name = file.path
|
211
|
+
File.open(file_name, 'wb') { |f| f.write('*' * size) }
|
212
|
+
assert_equal size, File.size(file_name)
|
213
|
+
file
|
212
214
|
end
|
213
215
|
end
|
214
216
|
end
|