Extend stdlib queue for the test queue

This commit is contained in:
Aaron Patterson 2012-04-27 14:26:26 -07:00
parent 673fe05899
commit 2187b5f2f1
2 changed files with 12 additions and 28 deletions

@ -7,27 +7,11 @@ module Queueing
#
# Jobs are run in a separate thread to catch mistakes where code
# assumes that the job is run in the same thread.
class TestQueue
attr_reader :contents
def initialize
@contents = []
end
class TestQueue < ::Queue
def drain
# run the jobs in a separate thread so assumptions of synchronous
# jobs are caught in test mode.
t = Thread.new do
while job = @contents.shift
job.run
end
end
t.join
end
# implement the Queue API
def push(object)
@contents << object
Thread.new { pop.run until empty? }.join
end
end

@ -3,9 +3,7 @@
class TestQueueTest < ActiveSupport::TestCase
class Job
attr_reader :id
def initialize(id, &block)
@id = id
def initialize(&block)
@block = block
end
@ -15,21 +13,23 @@ def run
end
def setup
#@queue = Rails::Queueing::TestQueue.new
@queue = Rails::Queueing::TestQueue.new
end
def test_contents
assert_equal [], @queue.contents
job = Job.new(1)
assert @queue.empty?
job = Job.new
@queue.push job
assert_equal [job], @queue.contents
refute @queue.empty?
assert_equal job, @queue.pop
end
def test_order
processed = []
job1 = Job.new(1) { processed << 1 }
job2 = Job.new(2) { processed << 2 }
job1 = Job.new { processed << 1 }
job2 = Job.new { processed << 2 }
@queue.push job1
@queue.push job2
@ -42,7 +42,7 @@ def test_drain
t = nil
ran = false
job = Job.new(1) do
job = Job.new do
ran = true
t = Thread.current
end
@ -50,7 +50,7 @@ def test_drain
@queue.push job
@queue.drain
assert_equal [], @queue.contents
assert @queue.empty?
assert ran, "The job runs synchronously when the queue is drained"
assert_not_equal t, Thread.current
end