Skip to content

Commit 8e79ee8

Browse files
More tests
1 parent 8916e4a commit 8e79ee8

10 files changed

+194
-15
lines changed

examples/connection/automatic_recovery_with_basic_get.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
conn.start
1313

1414
ch = conn.create_channel
15-
x = ch.topic("bunny.examples.recovery.topic", :durable => false)
16-
q = ch.queue("bunny.examples.recovery.client_named_queue2", :durable => true)
15+
x = ch.topic("bunny.examples.recovery.topic", durable: false)
16+
q = ch.queue("bunny.examples.recovery.client_named_queue2", durable: true)
1717
q.purge
1818

1919
q.bind(x, :routing_key => "abc").bind(x, :routing_key => "def")

examples/connection/automatic_recovery_with_client_named_queues.rb

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
conn.start
1313

1414
ch = conn.create_channel
15-
x = ch.topic("bunny.examples.recovery.topic", :durable => false)
16-
q = ch.queue("bunny.examples.recovery.client_named_queue1", :durable => false)
15+
x = ch.topic("bunny.examples.recovery.topic", durable: false)
16+
q = ch.queue("bunny.examples.recovery.client_named_queue1", durable: false)
1717

18-
q.bind(x, :routing_key => "abc").bind(x, :routing_key => "def")
18+
q.bind(x, routing_key: "abc").bind(x, routing_key: "def")
1919

2020
q.subscribe do |delivery_info, metadata, payload|
2121
puts "Consumed #{payload}"
@@ -27,7 +27,7 @@
2727
rk = ["abc", "def"].sample
2828

2929
begin
30-
x.publish(data, :routing_key => rk)
30+
x.publish(data, routing_key: rk)
3131
puts "Published #{data}, routing key: #{rk}"
3232
# happens when a message is published before the connection
3333
# is recovered

lib/bunny/channel.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1077,6 +1077,8 @@ def any_consumers?
10771077
def queue_declare(name, opts = {})
10781078
raise_if_no_longer_open!
10791079

1080+
Bunny::Queue.verify_type!(opts[:arguments]) if opts[:arguments]
1081+
10801082
# strip trailing new line and carriage returns
10811083
# just like RabbitMQ does
10821084
safe_name = name.gsub(/[\r\n]/, "")

lib/bunny/queue.rb

+9-3
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,14 @@ def consumer_count
352352
s[:consumer_count]
353353
end
354354

355+
def self.verify_type!(args0 = {})
356+
# be extra defensive
357+
args = args0 || {}
358+
q_type = args["x-queue-type"] || args[:"x-queue-type"]
359+
throw ArgumentError.new(
360+
"unsupported queue type #{q_type.inspect}, supported ones: #{Types::KNOWN.join(', ')}") if (q_type and !Types.known?(q_type))
361+
end
362+
355363
#
356364
# Recovery
357365
#
@@ -419,9 +427,7 @@ def self.add_default_options(name, opts)
419427
end
420428

421429
def verify_type!(args)
422-
q_type = (args || {})["x-queue-type"]
423-
throw ArgumentError.new(
424-
"unsupported queue type #{q_type.inspect}, supported ones: #{Types::KNOWN.join(', ')}") if (q_type and !Types.known?(q_type))
430+
self.class.verify_type!(args)
425431
end
426432
end
427433
end

spec/higher_level_api/integration/basic_consume_spec.rb

+9-3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
expect(ch.queue(queue_name, auto_delete: true, durable: false).message_count).to eq 0
4242

43+
ch.queue_delete(@queue_name)
4344
ch.close
4445
end
4546

@@ -69,6 +70,7 @@
6970

7071
expect(ch.queue(queue_name, auto_delete: true, durable: false).message_count).to eq 0
7172

73+
q.delete
7274
ch.close
7375
end
7476
end
@@ -103,6 +105,7 @@
103105

104106
expect(ch.queue(queue_name, auto_delete: true, durable: false).message_count).to eq 0
105107

108+
q.delete
106109
ch.close
107110
end
108111
end
@@ -138,6 +141,7 @@
138141

139142
expect(ch.queue(queue_name, auto_delete: true, durable: false).message_count).to eq 0
140143

144+
ch.queue_delete(@queue_name)
141145
ch.close
142146
end
143147
end
@@ -176,6 +180,7 @@
176180

177181
expect(ch.queue(queue_name, auto_delete: true, durable: false).message_count).to eq 0
178182

183+
q.delete
179184
ch.close
180185
end
181186
end
@@ -235,7 +240,7 @@
235240
caught = nil
236241
t = Thread.new do
237242
ch = connection.create_channel
238-
q = ch.queue(queue_name, auto_delete: true, durable: false)
243+
q = ch.queue(queue_name, auto_delete: true, durable: false, exclusive: true)
239244

240245
ch.on_uncaught_exception do |e, consumer|
241246
caught = e
@@ -269,7 +274,7 @@
269274
allow(connection.logger).to receive(:error) { |x| caughts << x }
270275

271276
ch = connection.create_channel
272-
q = ch.queue(queue_name, auto_delete: true, durable: false)
277+
q = ch.queue(queue_name, auto_delete: true, durable: false, exclusive: true)
273278

274279
q.subscribe(exclusive: false, manual_ack: false) do |delivery_info, properties, payload|
275280
raise RuntimeError.new(queue_name)
@@ -284,7 +289,6 @@
284289
sleep 1.5
285290

286291
expect(caughts.size).to eq(5)
287-
288292
ch.close
289293
end
290294
end
@@ -316,6 +320,7 @@
316320

317321
expect(ch.queue(queue_name, auto_delete: true, durable: false).message_count).to eq 0
318322

323+
q.delete
319324
ch.close
320325
end
321326
end
@@ -350,6 +355,7 @@
350355

351356
expect(ch.queue(queue_name, auto_delete: true, durable: false).message_count).to eq 0
352357

358+
q.delete
353359
ch.close
354360
end
355361
end

spec/higher_level_api/integration/connection_recovery_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@
146146
it "recovers client-named queues" do
147147
with_open do |c|
148148
ch = c.create_channel
149-
q = ch.queue("bunny.tests.recovery.client-named#{rand}")
149+
q = ch.queue("bunny.tests.recovery.client-named#{rand}", durable: false)
150150
close_all_connections!
151151
wait_for_recovery_with { connections.any? }
152152
expect(ch).to be_open

spec/higher_level_api/integration/message_properties_access_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
t = Thread.new do
2222
ch = connection.create_channel
23-
q = ch.queue(queue_name, auto_delete: true, durable: false)
23+
q = ch.queue(queue_name, auto_delete: true, durable: false, exclusive: true)
2424
q.subscribe(exclusive: true, manual_ack: false) do |delivery_info, properties, payload|
2525
metadata = properties
2626
envelope = delivery_info

spec/higher_level_api/integration/read_only_consumer_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
end
2020

2121
context "with automatic acknowledgement mode" do
22-
let(:queue_name) { "bunny.basic_consume#{rand}" }
22+
let(:queue_name) { "bunny.basic_consume.read-only.#{rand}" }
2323

2424
it "registers the consumer" do
2525
delivered_keys = []

spec/lower_level_api/integration/basic_consume_spec.rb

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959

6060
expect(ch.queue(queue_name, auto_delete: true, durable: false).message_count).to eq 0
6161

62+
ch.queue_delete(@queue_name) rescue Bunny::NotFound => nil
6263
ch.close
6364
end
6465
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
require "spec_helper"
2+
3+
describe Bunny::Queue do
4+
let(:connection) do
5+
c = Bunny.new(user: "bunny_gem", password: "bunny_password", vhost: "bunny_testbed")
6+
c.start
7+
c
8+
end
9+
10+
after :each do
11+
connection.close if connection.open?
12+
end
13+
14+
#
15+
# These lower-level tests primarily exist to test redeclaration, because the
16+
# low-level API bypasses channel object caching.
17+
#
18+
19+
context "when queue is declared with optional arguments" do
20+
it "declares it with those arguments" do
21+
ch = connection.create_channel
22+
name = "bunny.tests.low-level.queues.x-args.1"
23+
24+
args = {
25+
Bunny::Queue::XArgs::MAX_LENGTH => 1000
26+
}
27+
ch.queue_declare(name, durable: true, arguments: args)
28+
ch.queue_delete(name)
29+
30+
ch.close
31+
end
32+
end
33+
34+
context "when queue is declared with type using x-args and a literal string" do
35+
it "declares a queue of that type" do
36+
ch = connection.create_channel
37+
name = "bunny.tests.low-level.queues.x-args.2.qq"
38+
39+
args = {
40+
Bunny::Queue::XArgs::QUEUE_TYPE => "quorum"
41+
}
42+
ch.queue_declare(name, durable: true, arguments: args)
43+
ch.queue_delete(name)
44+
45+
ch.close
46+
end
47+
end
48+
49+
context "when queue is declared with type using x-args and a constant" do
50+
it "declares a queue of that type" do
51+
ch = connection.create_channel
52+
name = "bunny.tests.low-level.queues.x-args.2.qq"
53+
54+
args = {
55+
Bunny::Queue::XArgs::QUEUE_TYPE => Bunny::Queue::Types::QUORUM
56+
}
57+
ch.queue_declare(name, durable: true, arguments: args)
58+
ch.queue_delete(name)
59+
60+
ch.close
61+
end
62+
end
63+
64+
context "when queue is declared with type using :type and a literal string" do
65+
it "declares a queue of that type" do
66+
ch = connection.create_channel
67+
name = "bunny.tests.queues.x-args.3.qq"
68+
69+
args = {
70+
Bunny::Queue::XArgs::QUEUE_TYPE => "quorum"
71+
}
72+
ch.queue_declare(name, durable: true, type: Bunny::Queue::Types::QUORUM)
73+
ch.queue_delete(name)
74+
75+
ch.close
76+
end
77+
end
78+
79+
context "when queue is declared with type using :type and a constant" do
80+
it "declares a queue of that type" do
81+
ch = connection.create_channel
82+
name = "bunny.tests.low-level.queues.x-args.3.qq"
83+
84+
args = {
85+
Bunny::Queue::XArgs::QUEUE_TYPE => Bunny::Queue::Types::QUORUM
86+
}
87+
ch.queue_declare(name, durable: true, type: Bunny::Queue::Types::QUORUM)
88+
ch.queue_delete(name)
89+
90+
ch.close
91+
end
92+
end
93+
94+
context "when queue is declared with an unsupported :type" do
95+
it "raises an exception" do
96+
ch = connection.create_channel
97+
name = "bunny.tests.low-level.queues.unsupported.type"
98+
args = {
99+
"x-queue-type": "super-duper-q"
100+
}
101+
102+
ch.queue_delete(name)
103+
expect {
104+
ch.queue_declare(name, durable: true, arguments: args)
105+
}.to raise_error(ArgumentError)
106+
ch.queue_delete(name)
107+
108+
ch.close
109+
end
110+
end
111+
112+
context "when classic queue is declared with an explicit type and redeclared without it" do
113+
it "declares a queue of that type" do
114+
ch = connection.create_channel
115+
name = "bunny.tests.low-level.queues.redeclarations.#{rand}.cq"
116+
ch.queue_delete(name)
117+
118+
args = {
119+
Bunny::Queue::XArgs::QUEUE_TYPE => "classic"
120+
}
121+
ch.queue_declare(name, durable: true, arguments: args)
122+
# no explicit argument specified
123+
ch.queue_declare(name, durable: true, arguments: {})
124+
ch.queue_delete(name)
125+
126+
ch.close
127+
end
128+
end
129+
130+
context "when classic queue is declared without an explicit type and redeclared with it" do
131+
it "declares a queue of that type" do
132+
ch = connection.create_channel
133+
name = "bunny.tests.low-level.queues.redeclarations.#{rand}.cq"
134+
ch.queue_delete(name)
135+
136+
args = {
137+
Bunny::Queue::XArgs::QUEUE_TYPE => "classic"
138+
}
139+
# no explicit argument specified
140+
ch.queue_declare(name, durable: true, arguments: {})
141+
ch.queue_declare(name, durable: true, arguments: args)
142+
ch.queue_delete(name)
143+
144+
ch.close
145+
end
146+
end
147+
148+
context "when queue is declared with a set of mismatching values" do
149+
it "raises an exception" do
150+
ch = connection.create_channel
151+
name = "bunny.tests.low-level.queues.proprty-equivalence"
152+
153+
q = ch.queue_declare(name, auto_delete: true, durable: false)
154+
expect {
155+
ch.queue_declare(name, auto_delete: false, durable: true)
156+
}.to raise_error(Bunny::PreconditionFailed)
157+
158+
expect(ch).to be_closed
159+
160+
cleanup_ch = connection.create_channel
161+
cleanup_ch.queue_delete(name)
162+
end
163+
end
164+
end

0 commit comments

Comments
 (0)