forked from khacanh/resque-multi-job-forks
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'lantins-resque_v1.9.10_and_above'
Conflicts: test/helper.rb
- Loading branch information
Showing
5 changed files
with
180 additions
and
87 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,12 +1,60 @@ | ||
require 'rubygems' | ||
require 'test/unit' | ||
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) | ||
$LOAD_PATH.unshift(File.dirname(__FILE__)) | ||
|
||
$TESTING = true | ||
|
||
require 'rubygems' | ||
require 'bundler' | ||
Bundler.setup | ||
Bundler.require | ||
require 'test/unit' | ||
require 'resque-multi-job-forks' | ||
|
||
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) | ||
$LOAD_PATH.unshift(File.dirname(__FILE__)) | ||
$TESTING = true | ||
# setup redis & resque. | ||
redis = Redis.new(:db => 1) | ||
Resque.redis = redis | ||
|
||
require 'resque-multi-job-forks' | ||
# adds simple STDOUT logging to test workers. | ||
# set `VERBOSE=true` when running the tests to view resques log output. | ||
module Resque | ||
class Worker | ||
def log(msg) | ||
puts "*** #{msg}" unless ENV['VERBOSE'].nil? | ||
end | ||
alias_method :log!, :log | ||
end | ||
end | ||
|
||
# stores a record of the job processing sequence. | ||
# you may wish to reset this in the test `setup` method. | ||
$SEQUENCE = [] | ||
|
||
# test job, tracks sequence. | ||
class SequenceJob | ||
@queue = :jobs | ||
def self.perform(i) | ||
$SEQUENCE << "work_#{i}".to_sym | ||
sleep(2) | ||
end | ||
end | ||
|
||
class QuickSequenceJob | ||
@queue = :jobs | ||
def self.perform(i) | ||
$SEQUENCE << "work_#{i}".to_sym | ||
end | ||
end | ||
|
||
|
||
# test hooks, tracks sequence. | ||
Resque.after_fork do | ||
$SEQUENCE << :after_fork | ||
end | ||
|
||
Resque.before_fork do | ||
$SEQUENCE << :before_fork | ||
end | ||
|
||
Resque.before_child_exit do |worker| | ||
$SEQUENCE << "before_child_exit_#{worker.jobs_processed}".to_sym | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,40 +1,58 @@ | ||
require 'helper' | ||
|
||
class SomeJob | ||
def self.perform(i) | ||
$SEQUENCE << "work_#{i}".to_sym | ||
puts 'working...' | ||
sleep(25) | ||
end | ||
end | ||
|
||
Resque.after_fork do | ||
$SEQUENCE << :after_fork | ||
end | ||
|
||
Resque.before_child_exit do |worker| | ||
$SEQUENCE << "before_child_exit_#{worker.jobs_processed}".to_sym | ||
end | ||
require File.dirname(__FILE__) + '/helper' | ||
|
||
class TestResqueMultiJobForks < Test::Unit::TestCase | ||
def setup | ||
$SEQUENCE = [] | ||
Resque.redis.flushdb | ||
@worker = Resque::Worker.new(:jobs) | ||
end | ||
|
||
def test_sequence_of_events | ||
Resque.redis.flush_all | ||
|
||
ENV['MINUTES_PER_FORK'] = '1' | ||
|
||
worker = Resque::Worker.new(:jobs) | ||
|
||
Resque::Job.create(:jobs, SomeJob, 1) | ||
Resque::Job.create(:jobs, SomeJob, 2) | ||
Resque::Job.create(:jobs, SomeJob, 3) | ||
Resque::Job.create(:jobs, SomeJob, 4) | ||
|
||
worker.work(0) | ||
def test_timeout_limit_sequence_of_events | ||
# only allow enough time for 3 jobs to process. | ||
@worker.seconds_per_fork = 3 | ||
|
||
Resque.enqueue(SequenceJob, 1) | ||
Resque.enqueue(SequenceJob, 2) | ||
Resque.enqueue(SequenceJob, 3) | ||
Resque.enqueue(SequenceJob, 4) | ||
|
||
# make sure we don't take longer then 15 seconds. | ||
begin | ||
Timeout::timeout(15) { @worker.work(1) } | ||
rescue Timeout::Error | ||
end | ||
|
||
# test the sequence is correct. | ||
assert_equal([:before_fork, :after_fork, :work_1, :work_2, :work_3, | ||
:before_child_exit_3, :before_fork, :after_fork, :work_4, | ||
:before_child_exit_1], $SEQUENCE, 'correct sequence') | ||
end | ||
|
||
assert_equal([:after_fork, :work_1, :work_2, :work_3, :before_child_exit_3, :after_fork, :work_4, :before_child_exit_1], $SEQUENCE) | ||
# test we can also limit fork job process by a job limit. | ||
def test_job_limit_sequence_of_events | ||
# only allow enough time for 3 jobs to process. | ||
ENV['JOBS_PER_FORK'] = '20' | ||
|
||
# queue 40 jobs. | ||
(1..40).each { |i| Resque.enqueue(QuickSequenceJob, i) } | ||
|
||
begin | ||
Timeout::timeout(3) { @worker.work(1) } | ||
rescue Timeout::Error | ||
end | ||
|
||
assert_equal :before_fork, $SEQUENCE[0], 'first before_fork call.' | ||
assert_equal :after_fork, $SEQUENCE[1], 'first after_fork call.' | ||
assert_equal :work_20, $SEQUENCE[21], '20th chunk of work.' | ||
assert_equal :before_child_exit_20, $SEQUENCE[22], 'first before_child_exit call.' | ||
assert_equal :before_fork, $SEQUENCE[23], 'final before_fork call.' | ||
assert_equal :after_fork, $SEQUENCE[24], 'final after_fork call.' | ||
assert_equal :work_40, $SEQUENCE[44], '40th chunk of work.' | ||
assert_equal :before_child_exit_20, $SEQUENCE[45], 'final before_child_exit call.' | ||
end | ||
|
||
def teardown | ||
# make sure we don't clobber any other tests. | ||
ENV['JOBS_PER_FORK'] = nil | ||
end | ||
end |