resque-workers-lock 1.5 → 1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/Rakefile +5 -24
  2. data/test/lock_test.rb +71 -60
  3. metadata +7 -21
  4. data/test/lock_worker.rb +0 -22
data/Rakefile CHANGED
@@ -1,30 +1,11 @@
1
- require 'resque/tasks'
2
-
3
- task "resque:setup" do
4
- require_relative 'test/lock_worker'
5
- end
6
-
7
1
  require 'rake/testtask'
8
2
  require 'rdoc/task'
9
-
10
- def command?(command)
11
- system("type #{command} > /dev/null")
12
- end
13
-
14
- # Tests
3
+ require 'resque/tasks'
15
4
 
16
5
  task :default => :test
17
6
 
18
- if command? :turn
19
- desc "Run tests"
20
- task :test do
21
- suffix = "-n #{ENV['TEST']}" if ENV['TEST']
22
- sh "turn test/*.rb #{suffix}"
23
- end
24
- else
25
- Rake::TestTask.new do |t|
26
- t.libs << 'lib'
27
- t.pattern = 'test/**/*_test.rb'
28
- t.verbose = false
29
- end
7
+ Rake::TestTask.new do |t|
8
+ t.libs << 'lib'
9
+ t.pattern = 'test/**/*_test.rb'
10
+ t.verbose = false
30
11
  end
data/test/lock_test.rb CHANGED
@@ -1,38 +1,24 @@
1
1
  require 'test/unit'
2
2
  require 'resque/plugins/workers/lock'
3
- require_relative 'lock_worker'
3
+ require 'tempfile'
4
4
 
5
5
  class LockTest < Test::Unit::TestCase
6
- class SimilarJob
7
- extend Resque::Plugins::Workers::Lock
8
- @queue = :lock_test
9
-
10
- def self.perform
11
- raise "Woah woah! How did this happen?"
12
- end
13
- end
14
-
15
6
  class UniqueJob
16
7
  extend Resque::Plugins::Workers::Lock
17
8
  @queue = :lock_test
18
9
 
19
- def self.lock_enqueue(id)
20
- return id.to_s+"e"
10
+ def self.lock_workers(*)
11
+ self.name
21
12
  end
22
13
 
23
- def self.lock_workers(id)
24
- return id.to_s+"w"
14
+ def self.perform params
15
+ File.open(params['output_file'], 'a') do |output_file|
16
+ output_file.puts params['job']
17
+ output_file.flush
18
+ sleep 1
19
+ output_file.puts params['job']
20
+ end
25
21
  end
26
-
27
- def self.perform(id)
28
- raise "Woah woah! How did this happen?"
29
- end
30
- end
31
-
32
- def setup
33
- Resque.redis.del('queue:lock_test')
34
- Resque.redis.del(SimilarJob.lock_workers)
35
- Resque.redis.del(SimilarJob.lock_enqueue)
36
22
  end
37
23
 
38
24
  def test_lint
@@ -41,53 +27,78 @@ class LockTest < Test::Unit::TestCase
41
27
  end
42
28
  end
43
29
 
44
- def test_enqueue
45
- 3.times { Resque.enqueue(SimilarJob) }
30
+ def test_workers_dont_work_simultaneously
31
+ assert_locking_works_with jobs: 2, workers: 2
32
+ end
33
+
34
+ private
46
35
 
47
- assert_equal "LockTest::SimilarJob-[]", SimilarJob.lock_workers
48
- assert_equal "LockTest::SimilarJob-[]", SimilarJob.lock_enqueue
49
- assert_equal 1, Resque.redis.llen('queue:lock_test')
36
+ def assert_locking_works_with options
37
+ jobs = (1..options[:jobs]).map{|job| "Job #{job}" }
38
+ output_file = Tempfile.new 'output_file'
50
39
 
51
- 3.times do |i|
52
- Resque.enqueue(UniqueJob, i+100)
53
- assert_equal i.to_s+"e", UniqueJob.lock_enqueue(i)
54
- assert_equal i.to_s+"w", UniqueJob.lock_workers(i)
40
+ jobs.each do |job|
41
+ Resque.enqueue UniqueJob, job: job, output_file: output_file.path
55
42
  end
56
43
 
57
- assert_equal 4, Resque.redis.llen('queue:lock_test')
44
+ process_jobs workers: options[:workers], timeout: 10
58
45
 
59
- # Test for complete queue wipe
60
- Resque.remove_queue(:lock_test)
46
+ lines = File.readlines(output_file).map(&:chomp)
47
+ lines.each_slice(2) do |a,b|
48
+ assert_equal a,b, "#{a} was interrupted by #{b}"
49
+ end
50
+ ensure
51
+ output_file.close
52
+ end
61
53
 
62
- Resque.enqueue(SimilarJob)
63
- assert_equal 1, Resque.redis.llen('queue:lock_test')
54
+ def process_jobs options
55
+ with_workers options[:workers] do
56
+ wait_until(options[:timeout]) do
57
+ no_busy_workers && no_queued_jobs
58
+ end
59
+ end
64
60
  end
65
61
 
66
- def test_zcleanup
67
- Resque.remove_queue(:lock_test)
62
+ def with_workers n
63
+ pids = []
64
+ n.times do
65
+ if pid = fork
66
+ pids << pid
67
+ else
68
+ pids = [] # Don't kill from child's ensure
69
+ worker = Resque::Worker.new('*')
70
+ worker.reconnect
71
+ worker.work(0.5)
72
+ exit!
73
+ end
74
+ end
75
+
76
+ yield
77
+
78
+ ensure
79
+ pids.each do |pid|
80
+ Process.kill("QUIT", pid)
81
+ end
82
+
83
+ pids.each do |pid|
84
+ Process.waitpid(pid)
85
+ end
86
+ end
68
87
 
69
- Resque.redis.keys('enqueuelock:*').collect { |x| Resque.redis.del(x) }
70
- Resque.redis.keys('workerslock:*').collect { |x| Resque.redis.del(x) }
88
+ def no_busy_workers
89
+ Resque::Worker.working.size == 0
90
+ end
71
91
 
72
- assert_equal 0, Resque.redis.llen('queue:lock_test')
92
+ def no_queued_jobs
93
+ Resque.redis.llen("queue:lock_test") == 0
73
94
  end
74
95
 
75
- # To test this, make sure to run `TERM_CHILD=1 COUNT=2 VVERBOSE=1 QUEUES=* rake resque:work`
76
- def test_lock
77
- 2.times { Resque.enqueue(SimilarSleepJob, 'writing_and_sleeping') }
78
-
79
- # After 3 seconds only 1 job had the change of running
80
- sleep(3)
81
- file = File.open('test/test.txt', 'rb')
82
- contents = file.read
83
- file.close
84
- assert_equal '1', contents
85
-
86
- # After 12 seconds the 2 jobs should have been processed (not at the same time because of the lock)
87
- sleep(12)
88
- file = File.open('test/test.txt', 'rb')
89
- contents = file.read
90
- file.close
91
- assert_equal '11', contents
96
+ def wait_until(timeout)
97
+ timeout.times do
98
+ return if yield
99
+ sleep 1
100
+ end
101
+
102
+ raise "Timout occured"
92
103
  end
93
104
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-workers-lock
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.5'
4
+ version: '1.6'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -27,22 +27,6 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
- - !ruby/object:Gem::Dependency
31
- name: turn
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ! '>='
36
- - !ruby/object:Gem::Version
37
- version: '0'
38
- type: :development
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
46
30
  - !ruby/object:Gem::Dependency
47
31
  name: rake
48
32
  requirement: !ruby/object:Gem::Requirement
@@ -59,9 +43,12 @@ dependencies:
59
43
  - - ! '>='
60
44
  - !ruby/object:Gem::Version
61
45
  version: '0'
62
- description: ! "A Resque plugin. Two or more jobs with the same lock cannot be processed
63
- simultaneously by multiple workers. \nWhen this situation occurs the second job
64
- gets pushed back to the queue.\n"
46
+ description: ! 'A Resque plugin. Two or more jobs with the same lock cannot be processed
47
+ simultaneously by multiple workers.
48
+
49
+ When this situation occurs the second job gets pushed back to the queue.
50
+
51
+ '
65
52
  email: bartolsthoorn@gmail.com
66
53
  executables: []
67
54
  extensions: []
@@ -72,7 +59,6 @@ files:
72
59
  - LICENSE
73
60
  - lib/resque/plugins/workers/lock.rb
74
61
  - test/lock_test.rb
75
- - test/lock_worker.rb
76
62
  homepage: http://github.com/bartolsthoorn/resque-workers-lock
77
63
  licenses: []
78
64
  post_install_message:
data/test/lock_worker.rb DELETED
@@ -1,22 +0,0 @@
1
- require 'resque'
2
- require 'resque/plugins/workers/lock'
3
-
4
- # Sleep job, for testing that two workers are not processing two jobs with
5
- # the same lock.
6
- class SimilarSleepJob
7
- extend Resque::Plugins::Workers::Lock
8
- @queue = :lock_test_workers
9
-
10
- def self.lock_enqueue(id)
11
- false
12
- end
13
-
14
- def self.lock_workers(id)
15
- return id.to_s
16
- end
17
-
18
- def self.perform(id)
19
- File.open('test/test.txt', 'a') {|f| f.write('1') }
20
- sleep(5)
21
- end
22
- end