forked from resque/resque
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmulti_queue_test.rb
More file actions
107 lines (85 loc) · 2.87 KB
/
multi_queue_test.rb
File metadata and controls
107 lines (85 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
require "test_helper"
describe "Resque::MultiQueue" do
let(:redis) { Resque.redis }
let(:coder) { Resque::JsonCoder.new }
before do
redis.flushall
end
it "poll times out and returns nil" do
foo = Resque::Queue.new 'foo', redis
bar = Resque::Queue.new 'bar', redis
queue = Resque::MultiQueue.new([foo, bar], redis)
assert_nil queue.poll(1)
end
it "poll is a no-op when queues are empty" do
queue = Resque::MultiQueue.new([], redis)
assert_nil queue.poll(1)
end
it "blocks on pop" do
foo = Resque::Queue.new 'foo', redis, coder
bar = Resque::Queue.new 'bar', redis, coder
queue = Resque::MultiQueue.new([foo, bar], redis)
t = Thread.new { queue.pop }
job = { 'class' => 'GoodJob', 'args' => [35, 'tar'] }
bar << job
assert_equal [bar, job], t.join.value
end
it "nonblocking pop works" do
foo = Resque::Queue.new 'foo', redis, coder
bar = Resque::Queue.new 'bar', redis, coder
queue = Resque::MultiQueue.new([foo, bar], redis)
job = { 'class' => 'GoodJob', 'args' => [35, 'tar'] }
bar << job
assert_equal [bar, job], queue.pop(true)
end
it "nonblocking pop doesn't block" do
foo = Resque::Queue.new 'foo', redis, coder
bar = Resque::Queue.new 'bar', redis, coder
queue = Resque::MultiQueue.new([foo, bar], redis)
assert_raises ThreadError do
queue.pop(true)
end
end
it "blocks forever on pop" do
foo = Resque::Queue.new 'foo', redis, coder
bar = Resque::Queue.new 'bar', redis, coder
queue = Resque::MultiQueue.new([foo, bar], redis)
assert_raises Timeout::Error do
Timeout::timeout(2) { queue.pop }
end
end
it "blocking pop processes queues in the order given" do
foo = Resque::Queue.new 'foo', redis, coder
bar = Resque::Queue.new 'bar', redis, coder
baz = Resque::Queue.new 'baz', redis, coder
queues = [foo, bar, baz]
queue = Resque::MultiQueue.new(queues, redis)
job = { 'class' => 'GoodJob', 'args' => [35, 'tar'] }
queues.each {|q| q << job }
processed_queues = queues.map do
q, j = queue.pop
q
end
assert_equal processed_queues, queues
end
it "nonblocking pop processes queues in the order given" do
foo = Resque::Queue.new 'foo', redis, coder
bar = Resque::Queue.new 'bar', redis, coder
baz = Resque::Queue.new 'baz', redis, coder
queues = [foo, bar, baz]
queue = Resque::MultiQueue.new(queues, redis)
job = { 'class' => 'GoodJob', 'args' => [35, 'tar'] }
queues.each {|q| q << job }
processed_queues = queues.map do
q, j = queue.pop(true)
q
end
assert_equal processed_queues, queues
end
it "blocking pop is a no-op if queues are empty" do
queue = Resque::MultiQueue.new([], redis)
assert_raises Timeout::Error do
Timeout.timeout(2) { queue.pop }
end
end
end