ryansch-resque-loner 1.0.1.1 → 1.0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,332 @@
1
+ require 'test_helper'
2
+
3
+ context "Resque::Worker" do
4
+ setup do
5
+ Resque.redis.flushall
6
+
7
+ Resque.before_first_fork = nil
8
+ Resque.before_fork = nil
9
+ Resque.after_fork = nil
10
+
11
+ @worker = Resque::Worker.new(:jobs)
12
+ Resque::Job.create(:jobs, SomeJob, 20, '/tmp')
13
+ end
14
+
15
+ test "can fail jobs" do
16
+ Resque::Job.create(:jobs, BadJob)
17
+ @worker.work(0)
18
+ assert_equal 1, Resque::Failure.count
19
+ end
20
+
21
+ test "failed jobs report exception and message" do
22
+ Resque::Job.create(:jobs, BadJobWithSyntaxError)
23
+ @worker.work(0)
24
+ assert_equal('SyntaxError', Resque::Failure.all['exception'])
25
+ assert_equal('Extra Bad job!', Resque::Failure.all['error'])
26
+ end
27
+
28
+ test "does not allow exceptions from failure backend to escape" do
29
+ job = Resque::Job.new(:jobs, {})
30
+ with_failure_backend BadFailureBackend do
31
+ @worker.perform job
32
+ end
33
+ end
34
+
35
+ test "fails uncompleted jobs on exit" do
36
+ job = Resque::Job.new(:jobs, [GoodJob, "blah"])
37
+ @worker.working_on(job)
38
+ @worker.unregister_worker
39
+ assert_equal 1, Resque::Failure.count
40
+ end
41
+
42
+ test "can peek at failed jobs" do
43
+ 10.times { Resque::Job.create(:jobs, BadJob) }
44
+ @worker.work(0)
45
+ assert_equal 10, Resque::Failure.count
46
+
47
+ assert_equal 10, Resque::Failure.all(0, 20).size
48
+ end
49
+
50
+ test "can clear failed jobs" do
51
+ Resque::Job.create(:jobs, BadJob)
52
+ @worker.work(0)
53
+ assert_equal 1, Resque::Failure.count
54
+ Resque::Failure.clear
55
+ assert_equal 0, Resque::Failure.count
56
+ end
57
+
58
+ test "catches exceptional jobs" do
59
+ Resque::Job.create(:jobs, BadJob)
60
+ Resque::Job.create(:jobs, BadJob)
61
+ @worker.process
62
+ @worker.process
63
+ @worker.process
64
+ assert_equal 2, Resque::Failure.count
65
+ end
66
+
67
+ test "strips whitespace from queue names" do
68
+ queues = "critical, high, low".split(',')
69
+ worker = Resque::Worker.new(*queues)
70
+ assert_equal %w( critical high low ), worker.queues
71
+ end
72
+
73
+ test "can work on multiple queues" do
74
+ Resque::Job.create(:high, GoodJob)
75
+ Resque::Job.create(:critical, GoodJob)
76
+
77
+ worker = Resque::Worker.new(:critical, :high)
78
+
79
+ worker.process
80
+ assert_equal 1, Resque.size(:high)
81
+ assert_equal 0, Resque.size(:critical)
82
+
83
+ worker.process
84
+ assert_equal 0, Resque.size(:high)
85
+ end
86
+
87
+ test "can work on all queues" do
88
+ Resque::Job.create(:high, GoodJob)
89
+ Resque::Job.create(:critical, GoodJob)
90
+ Resque::Job.create(:blahblah, GoodJob)
91
+
92
+ worker = Resque::Worker.new("*")
93
+
94
+ worker.work(0)
95
+ assert_equal 0, Resque.size(:high)
96
+ assert_equal 0, Resque.size(:critical)
97
+ assert_equal 0, Resque.size(:blahblah)
98
+ end
99
+
100
+ test "processes * queues in alphabetical order" do
101
+ Resque::Job.create(:high, GoodJob)
102
+ Resque::Job.create(:critical, GoodJob)
103
+ Resque::Job.create(:blahblah, GoodJob)
104
+
105
+ worker = Resque::Worker.new("*")
106
+ processed_queues = []
107
+
108
+ worker.work(0) do |job|
109
+ processed_queues << job.queue
110
+ end
111
+
112
+ assert_equal %w( jobs high critical blahblah ).sort, processed_queues
113
+ end
114
+
115
+ test "has a unique id" do
116
+ assert_equal "#{`hostname`.chomp}:#{$$}:jobs", @worker.to_s
117
+ end
118
+
119
+ test "complains if no queues are given" do
120
+ assert_raise Resque::NoQueueError do
121
+ Resque::Worker.new
122
+ end
123
+ end
124
+
125
+ test "fails if a job class has no `perform` method" do
126
+ worker = Resque::Worker.new(:perform_less)
127
+ Resque::Job.create(:perform_less, Object)
128
+
129
+ assert_equal 0, Resque::Failure.count
130
+ worker.work(0)
131
+ assert_equal 1, Resque::Failure.count
132
+ end
133
+
134
+ test "inserts itself into the 'workers' list on startup" do
135
+ @worker.work(0) do
136
+ assert_equal @worker, Resque.workers[0]
137
+ end
138
+ end
139
+
140
+ test "removes itself from the 'workers' list on shutdown" do
141
+ @worker.work(0) do
142
+ assert_equal @worker, Resque.workers[0]
143
+ end
144
+
145
+ assert_equal [], Resque.workers
146
+ end
147
+
148
+ test "removes worker with stringified id" do
149
+ @worker.work(0) do
150
+ worker_id = Resque.workers[0].to_s
151
+ Resque.remove_worker(worker_id)
152
+ assert_equal [], Resque.workers
153
+ end
154
+ end
155
+
156
+ test "records what it is working on" do
157
+ @worker.work(0) do
158
+ task = @worker.job
159
+ assert_equal({"args"=>[20, "/tmp"], "class"=>"SomeJob"}, task['payload'])
160
+ assert task['run_at']
161
+ assert_equal 'jobs', task['queue']
162
+ end
163
+ end
164
+
165
+ test "clears its status when not working on anything" do
166
+ @worker.work(0)
167
+ assert_equal Hash.new, @worker.job
168
+ end
169
+
170
+ test "knows when it is working" do
171
+ @worker.work(0) do
172
+ assert @worker.working?
173
+ end
174
+ end
175
+
176
+ test "knows when it is idle" do
177
+ @worker.work(0)
178
+ assert @worker.idle?
179
+ end
180
+
181
+ test "knows who is working" do
182
+ @worker.work(0) do
183
+ assert_equal [@worker], Resque.working
184
+ end
185
+ end
186
+
187
+ test "keeps track of how many jobs it has processed" do
188
+ Resque::Job.create(:jobs, BadJob)
189
+ Resque::Job.create(:jobs, BadJob)
190
+
191
+ 3.times do
192
+ job = @worker.reserve
193
+ @worker.process job
194
+ end
195
+ assert_equal 3, @worker.processed
196
+ end
197
+
198
+ test "keeps track of how many failures it has seen" do
199
+ Resque::Job.create(:jobs, BadJob)
200
+ Resque::Job.create(:jobs, BadJob)
201
+
202
+ 3.times do
203
+ job = @worker.reserve
204
+ @worker.process job
205
+ end
206
+ assert_equal 2, @worker.failed
207
+ end
208
+
209
+ test "stats are erased when the worker goes away" do
210
+ @worker.work(0)
211
+ assert_equal 0, @worker.processed
212
+ assert_equal 0, @worker.failed
213
+ end
214
+
215
+ test "knows when it started" do
216
+ time = Time.now
217
+ @worker.work(0) do
218
+ assert_equal time.to_s, @worker.started.to_s
219
+ end
220
+ end
221
+
222
+ test "knows whether it exists or not" do
223
+ @worker.work(0) do
224
+ assert Resque::Worker.exists?(@worker)
225
+ assert !Resque::Worker.exists?('blah-blah')
226
+ end
227
+ end
228
+
229
+ test "sets $0 while working" do
230
+ @worker.work(0) do
231
+ ver = Resque::Version
232
+ assert_equal "resque-#{ver}: Processing jobs since #{Time.now.to_i}", $0
233
+ end
234
+ end
235
+
236
+ test "can be found" do
237
+ @worker.work(0) do
238
+ found = Resque::Worker.find(@worker.to_s)
239
+ assert_equal @worker.to_s, found.to_s
240
+ assert found.working?
241
+ assert_equal @worker.job, found.job
242
+ end
243
+ end
244
+
245
+ test "doesn't find fakes" do
246
+ @worker.work(0) do
247
+ found = Resque::Worker.find('blah-blah')
248
+ assert_equal nil, found
249
+ end
250
+ end
251
+
252
+ test "cleans up dead worker info on start (crash recovery)" do
253
+ # first we fake out two dead workers
254
+ workerA = Resque::Worker.new(:jobs)
255
+ workerA.instance_variable_set(:@to_s, "#{`hostname`.chomp}:1:jobs")
256
+ workerA.register_worker
257
+
258
+ workerB = Resque::Worker.new(:high, :low)
259
+ workerB.instance_variable_set(:@to_s, "#{`hostname`.chomp}:2:high,low")
260
+ workerB.register_worker
261
+
262
+ assert_equal 2, Resque.workers.size
263
+
264
+ # then we prune them
265
+ @worker.work(0) do
266
+ assert_equal 1, Resque.workers.size
267
+ end
268
+ end
269
+
270
+ test "Processed jobs count" do
271
+ @worker.work(0)
272
+ assert_equal 1, Resque.info[:processed]
273
+ end
274
+
275
+ test "Will call a before_first_fork hook only once" do
276
+ Resque.redis.flushall
277
+ $BEFORE_FORK_CALLED = 0
278
+ Resque.before_first_fork = Proc.new { $BEFORE_FORK_CALLED += 1 }
279
+ workerA = Resque::Worker.new(:jobs)
280
+ Resque::Job.create(:jobs, SomeJob, 20, '/tmp')
281
+
282
+ assert_equal 0, $BEFORE_FORK_CALLED
283
+
284
+ workerA.work(0)
285
+ assert_equal 1, $BEFORE_FORK_CALLED
286
+
287
+ # TODO: Verify it's only run once. Not easy.
288
+ # workerA.work(0)
289
+ # assert_equal 1, $BEFORE_FORK_CALLED
290
+ end
291
+
292
+ test "Will call a before_fork hook before forking" do
293
+ Resque.redis.flushall
294
+ $BEFORE_FORK_CALLED = false
295
+ Resque.before_fork = Proc.new { $BEFORE_FORK_CALLED = true }
296
+ workerA = Resque::Worker.new(:jobs)
297
+
298
+ assert !$BEFORE_FORK_CALLED
299
+ Resque::Job.create(:jobs, SomeJob, 20, '/tmp')
300
+ workerA.work(0)
301
+ assert $BEFORE_FORK_CALLED
302
+ end
303
+
304
+ test "very verbose works in the afternoon" do
305
+ require 'time'
306
+ $last_puts = ""
307
+ $fake_time = Time.parse("15:44:33 2011-03-02")
308
+ singleton = class << @worker; self end
309
+ singleton.send :define_method, :puts, lambda { |thing| $last_puts = thing }
310
+
311
+ @worker.very_verbose = true
312
+ @worker.log("some log text")
313
+
314
+ assert_match /\*\* \[15:44:33 2011-03-02\] \d+: some log text/, $last_puts
315
+ end
316
+
317
+ test "Will call an after_fork hook after forking" do
318
+ Resque.redis.flushall
319
+ $AFTER_FORK_CALLED = false
320
+ Resque.after_fork = Proc.new { $AFTER_FORK_CALLED = true }
321
+ workerA = Resque::Worker.new(:jobs)
322
+
323
+ assert !$AFTER_FORK_CALLED
324
+ Resque::Job.create(:jobs, SomeJob, 20, '/tmp')
325
+ workerA.work(0)
326
+ assert $AFTER_FORK_CALLED
327
+ end
328
+
329
+ test "returns PID of running process" do
330
+ assert_equal @worker.to_s.split(":")[1].to_i, @worker.pid
331
+ end
332
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ryansch-resque-loner
3
3
  version: !ruby/object:Gem::Version
4
- hash: 89
4
+ hash: 95
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
9
  - 1
10
- - 1
11
- version: 1.0.1.1
10
+ - 2
11
+ version: 1.0.1.2
12
12
  platform: ruby
13
13
  authors:
14
14
  - Jannis Hermanns
@@ -17,13 +17,12 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2011-11-04 00:00:00 -07:00
20
+ date: 2011-11-08 00:00:00 -08:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
24
24
  name: resque
25
- prerelease: false
26
- requirement: &id001 !ruby/object:Gem::Requirement
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
27
26
  none: false
28
27
  requirements:
29
28
  - - ~>
@@ -33,15 +32,15 @@ dependencies:
33
32
  - 1
34
33
  - 0
35
34
  version: "1.0"
35
+ prerelease: false
36
36
  type: :runtime
37
- version_requirements: *id001
37
+ requirement: *id001
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: rake
40
- prerelease: false
41
- requirement: &id002 !ruby/object:Gem::Requirement
40
+ version_requirements: &id002 !ruby/object:Gem::Requirement
42
41
  none: false
43
42
  requirements:
44
- - - ~>
43
+ - - ">"
45
44
  - !ruby/object:Gem::Version
46
45
  hash: 49
47
46
  segments:
@@ -49,12 +48,12 @@ dependencies:
49
48
  - 8
50
49
  - 7
51
50
  version: 0.8.7
51
+ prerelease: false
52
52
  type: :development
53
- version_requirements: *id002
53
+ requirement: *id002
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: rspec
56
- prerelease: false
57
- requirement: &id003 !ruby/object:Gem::Requirement
56
+ version_requirements: &id003 !ruby/object:Gem::Requirement
58
57
  none: false
59
58
  requirements:
60
59
  - - ~>
@@ -65,28 +64,28 @@ dependencies:
65
64
  - 5
66
65
  - 0
67
66
  version: 2.5.0
67
+ prerelease: false
68
68
  type: :development
69
- version_requirements: *id003
69
+ requirement: *id003
70
70
  - !ruby/object:Gem::Dependency
71
- name: bundler
72
- prerelease: false
73
- requirement: &id004 !ruby/object:Gem::Requirement
71
+ name: mock_redis
72
+ version_requirements: &id004 !ruby/object:Gem::Requirement
74
73
  none: false
75
74
  requirements:
76
75
  - - ~>
77
76
  - !ruby/object:Gem::Version
78
77
  hash: 23
79
78
  segments:
80
- - 1
81
79
  - 0
80
+ - 2
82
81
  - 0
83
- version: 1.0.0
82
+ version: 0.2.0
83
+ prerelease: false
84
84
  type: :development
85
- version_requirements: *id004
85
+ requirement: *id004
86
86
  - !ruby/object:Gem::Dependency
87
87
  name: rack-test
88
- prerelease: false
89
- requirement: &id005 !ruby/object:Gem::Requirement
88
+ version_requirements: &id005 !ruby/object:Gem::Requirement
90
89
  none: false
91
90
  requirements:
92
91
  - - ~>
@@ -97,8 +96,25 @@ dependencies:
97
96
  - 5
98
97
  - 7
99
98
  version: 0.5.7
99
+ prerelease: false
100
+ type: :development
101
+ requirement: *id005
102
+ - !ruby/object:Gem::Dependency
103
+ name: yajl-ruby
104
+ version_requirements: &id006 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ hash: 59
110
+ segments:
111
+ - 0
112
+ - 8
113
+ - 2
114
+ version: 0.8.2
115
+ prerelease: false
100
116
  type: :development
101
- version_requirements: *id005
117
+ requirement: *id006
102
118
  description: |
103
119
  Makes sure that for special jobs, there can be only one job with the same workload in one queue.
104
120
 
@@ -124,13 +140,35 @@ extensions: []
124
140
  extra_rdoc_files: []
125
141
 
126
142
  files:
143
+ - .gitignore
144
+ - CHANGELOG.markdown
145
+ - Gemfile
146
+ - LICENSE
147
+ - README.markdown
148
+ - Rakefile
149
+ - init.rb
127
150
  - lib/resque-ext/job.rb
128
151
  - lib/resque-ext/resque.rb
152
+ - lib/resque-loner.rb
129
153
  - lib/resque-loner/helpers.rb
130
154
  - lib/resque-loner/unique_job.rb
131
155
  - lib/resque-loner/version.rb
132
- - lib/resque-loner.rb
133
- - README.markdown
156
+ - rails/init.rb
157
+ - resque-loner.gemspec
158
+ - spec/loner_spec.rb
159
+ - spec/redis-test.conf
160
+ - spec/spec_helper.rb
161
+ - tasks/redis.rake
162
+ - tasks/resque.rake
163
+ - test/hoptoad_test.rb
164
+ - test/job_hooks_test.rb
165
+ - test/job_plugins_test.rb
166
+ - test/plugin_test.rb
167
+ - test/redis-test.conf
168
+ - test/resque-web_test.rb
169
+ - test/resque_test.rb
170
+ - test/test_helper.rb
171
+ - test/worker_test.rb
134
172
  has_rdoc: true
135
173
  homepage: http://github.com/ryansch/resque-loner
136
174
  licenses: []
@@ -165,5 +203,16 @@ rubygems_version: 1.6.2
165
203
  signing_key:
166
204
  specification_version: 3
167
205
  summary: Adds unique jobs to resque
168
- test_files: []
169
-
206
+ test_files:
207
+ - spec/loner_spec.rb
208
+ - spec/redis-test.conf
209
+ - spec/spec_helper.rb
210
+ - test/hoptoad_test.rb
211
+ - test/job_hooks_test.rb
212
+ - test/job_plugins_test.rb
213
+ - test/plugin_test.rb
214
+ - test/redis-test.conf
215
+ - test/resque-web_test.rb
216
+ - test/resque_test.rb
217
+ - test/test_helper.rb
218
+ - test/worker_test.rb