bunny 2.7.4 → 2.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +61 -35
  3. data/lib/bunny/channel.rb +186 -50
  4. data/lib/bunny/channel_id_allocator.rb +3 -1
  5. data/lib/bunny/consumer.rb +2 -2
  6. data/lib/bunny/consumer_work_pool.rb +2 -1
  7. data/lib/bunny/cruby/socket.rb +3 -0
  8. data/lib/bunny/cruby/ssl_socket.rb +6 -1
  9. data/lib/bunny/delivery_info.rb +1 -1
  10. data/lib/bunny/heartbeat_sender.rb +2 -1
  11. data/lib/bunny/jruby/ssl_socket.rb +5 -0
  12. data/lib/bunny/queue.rb +36 -8
  13. data/lib/bunny/reader_loop.rb +22 -10
  14. data/lib/bunny/session.rb +152 -65
  15. data/lib/bunny/test_kit.rb +14 -0
  16. data/lib/bunny/transport.rb +132 -49
  17. data/lib/bunny/version.rb +1 -1
  18. data/lib/bunny.rb +45 -4
  19. metadata +37 -225
  20. data/.github/ISSUE_TEMPLATE.md +0 -18
  21. data/.gitignore +0 -28
  22. data/.rspec +0 -1
  23. data/.travis.yml +0 -20
  24. data/.yardopts +0 -8
  25. data/CONTRIBUTING.md +0 -111
  26. data/ChangeLog.md +0 -1831
  27. data/Gemfile +0 -53
  28. data/LICENSE +0 -21
  29. data/Rakefile +0 -46
  30. data/benchmarks/basic_publish/with_128K_messages.rb +0 -35
  31. data/benchmarks/basic_publish/with_1k_messages.rb +0 -35
  32. data/benchmarks/basic_publish/with_4K_messages.rb +0 -35
  33. data/benchmarks/basic_publish/with_64K_messages.rb +0 -35
  34. data/benchmarks/channel_open.rb +0 -28
  35. data/benchmarks/mutex_and_monitor.rb +0 -42
  36. data/benchmarks/queue_declare.rb +0 -29
  37. data/benchmarks/queue_declare_and_bind.rb +0 -29
  38. data/benchmarks/queue_declare_bind_and_delete.rb +0 -29
  39. data/benchmarks/synchronized_sorted_set.rb +0 -53
  40. data/benchmarks/write_vs_write_nonblock.rb +0 -49
  41. data/bin/ci/before_build +0 -46
  42. data/bunny.gemspec +0 -35
  43. data/docker/Dockerfile +0 -16
  44. data/docker/docker-entrypoint.sh +0 -37
  45. data/docker-compose.yml +0 -18
  46. data/examples/connection/authentication_failure.rb +0 -16
  47. data/examples/connection/automatic_recovery_with_basic_get.rb +0 -40
  48. data/examples/connection/automatic_recovery_with_client_named_queues.rb +0 -36
  49. data/examples/connection/automatic_recovery_with_multiple_consumers.rb +0 -46
  50. data/examples/connection/automatic_recovery_with_republishing.rb +0 -109
  51. data/examples/connection/automatic_recovery_with_server_named_queues.rb +0 -35
  52. data/examples/connection/channel_level_exception.rb +0 -27
  53. data/examples/connection/disabled_automatic_recovery.rb +0 -34
  54. data/examples/connection/heartbeat.rb +0 -17
  55. data/examples/connection/manually_reconnecting_consumer.rb +0 -23
  56. data/examples/connection/manually_reconnecting_publisher.rb +0 -28
  57. data/examples/connection/unknown_host.rb +0 -16
  58. data/examples/consumers/high_and_low_priority.rb +0 -50
  59. data/examples/guides/exchanges/direct_exchange_routing.rb +0 -36
  60. data/examples/guides/exchanges/fanout_exchange_routing.rb +0 -28
  61. data/examples/guides/exchanges/headers_exchange_routing.rb +0 -31
  62. data/examples/guides/exchanges/mandatory_messages.rb +0 -30
  63. data/examples/guides/extensions/alternate_exchange.rb +0 -30
  64. data/examples/guides/extensions/basic_nack.rb +0 -33
  65. data/examples/guides/extensions/connection_blocked.rb +0 -35
  66. data/examples/guides/extensions/consumer_cancellation_notification.rb +0 -39
  67. data/examples/guides/extensions/dead_letter_exchange.rb +0 -32
  68. data/examples/guides/extensions/exchange_to_exchange_bindings.rb +0 -29
  69. data/examples/guides/extensions/per_message_ttl.rb +0 -36
  70. data/examples/guides/extensions/per_queue_message_ttl.rb +0 -36
  71. data/examples/guides/extensions/publisher_confirms.rb +0 -28
  72. data/examples/guides/extensions/queue_lease.rb +0 -26
  73. data/examples/guides/extensions/sender_selected_distribution.rb +0 -32
  74. data/examples/guides/getting_started/blabbr.rb +0 -27
  75. data/examples/guides/getting_started/hello_world.rb +0 -22
  76. data/examples/guides/getting_started/weathr.rb +0 -49
  77. data/examples/guides/queues/one_off_consumer.rb +0 -25
  78. data/examples/guides/queues/redeliveries.rb +0 -81
  79. data/profiling/basic_publish/with_4K_messages.rb +0 -33
  80. data/repl +0 -3
  81. data/spec/config/enabled_plugins +0 -1
  82. data/spec/config/rabbitmq.config +0 -19
  83. data/spec/higher_level_api/integration/basic_ack_spec.rb +0 -230
  84. data/spec/higher_level_api/integration/basic_cancel_spec.rb +0 -142
  85. data/spec/higher_level_api/integration/basic_consume_spec.rb +0 -349
  86. data/spec/higher_level_api/integration/basic_consume_with_objects_spec.rb +0 -54
  87. data/spec/higher_level_api/integration/basic_get_spec.rb +0 -80
  88. data/spec/higher_level_api/integration/basic_nack_spec.rb +0 -82
  89. data/spec/higher_level_api/integration/basic_publish_spec.rb +0 -74
  90. data/spec/higher_level_api/integration/basic_qos_spec.rb +0 -57
  91. data/spec/higher_level_api/integration/basic_reject_spec.rb +0 -152
  92. data/spec/higher_level_api/integration/basic_return_spec.rb +0 -33
  93. data/spec/higher_level_api/integration/channel_close_spec.rb +0 -25
  94. data/spec/higher_level_api/integration/channel_open_spec.rb +0 -57
  95. data/spec/higher_level_api/integration/connection_recovery_spec.rb +0 -471
  96. data/spec/higher_level_api/integration/connection_spec.rb +0 -559
  97. data/spec/higher_level_api/integration/connection_stop_spec.rb +0 -83
  98. data/spec/higher_level_api/integration/consumer_cancellation_notification_spec.rb +0 -128
  99. data/spec/higher_level_api/integration/dead_lettering_spec.rb +0 -75
  100. data/spec/higher_level_api/integration/exchange_bind_spec.rb +0 -31
  101. data/spec/higher_level_api/integration/exchange_declare_spec.rb +0 -237
  102. data/spec/higher_level_api/integration/exchange_delete_spec.rb +0 -105
  103. data/spec/higher_level_api/integration/exchange_unbind_spec.rb +0 -40
  104. data/spec/higher_level_api/integration/exclusive_queue_spec.rb +0 -28
  105. data/spec/higher_level_api/integration/heartbeat_spec.rb +0 -49
  106. data/spec/higher_level_api/integration/merry_go_round_spec.rb +0 -85
  107. data/spec/higher_level_api/integration/message_properties_access_spec.rb +0 -95
  108. data/spec/higher_level_api/integration/predeclared_exchanges_spec.rb +0 -24
  109. data/spec/higher_level_api/integration/publisher_confirms_spec.rb +0 -191
  110. data/spec/higher_level_api/integration/publishing_edge_cases_spec.rb +0 -87
  111. data/spec/higher_level_api/integration/queue_bind_spec.rb +0 -109
  112. data/spec/higher_level_api/integration/queue_declare_spec.rb +0 -221
  113. data/spec/higher_level_api/integration/queue_delete_spec.rb +0 -41
  114. data/spec/higher_level_api/integration/queue_purge_spec.rb +0 -30
  115. data/spec/higher_level_api/integration/queue_unbind_spec.rb +0 -54
  116. data/spec/higher_level_api/integration/read_only_consumer_spec.rb +0 -60
  117. data/spec/higher_level_api/integration/sender_selected_distribution_spec.rb +0 -36
  118. data/spec/higher_level_api/integration/tls_connection_spec.rb +0 -222
  119. data/spec/higher_level_api/integration/tx_commit_spec.rb +0 -21
  120. data/spec/higher_level_api/integration/tx_rollback_spec.rb +0 -21
  121. data/spec/higher_level_api/integration/with_channel_spec.rb +0 -25
  122. data/spec/issues/issue100_spec.rb +0 -42
  123. data/spec/issues/issue141_spec.rb +0 -43
  124. data/spec/issues/issue202_spec.rb +0 -15
  125. data/spec/issues/issue224_spec.rb +0 -40
  126. data/spec/issues/issue465_spec.rb +0 -32
  127. data/spec/issues/issue78_spec.rb +0 -72
  128. data/spec/issues/issue83_spec.rb +0 -30
  129. data/spec/issues/issue97_attachment.json +0 -1
  130. data/spec/issues/issue97_spec.rb +0 -175
  131. data/spec/lower_level_api/integration/basic_cancel_spec.rb +0 -83
  132. data/spec/lower_level_api/integration/basic_consume_spec.rb +0 -99
  133. data/spec/spec_helper.rb +0 -51
  134. data/spec/stress/channel_close_stress_spec.rb +0 -64
  135. data/spec/stress/channel_open_stress_spec.rb +0 -84
  136. data/spec/stress/channel_open_stress_with_single_threaded_connection_spec.rb +0 -28
  137. data/spec/stress/concurrent_consumers_stress_spec.rb +0 -71
  138. data/spec/stress/concurrent_publishers_stress_spec.rb +0 -54
  139. data/spec/stress/connection_open_close_spec.rb +0 -52
  140. data/spec/stress/long_running_consumer_spec.rb +0 -84
  141. data/spec/tls/ca_certificate.pem +0 -29
  142. data/spec/tls/ca_key.pem +0 -52
  143. data/spec/tls/client_certificate.pem +0 -29
  144. data/spec/tls/client_key.pem +0 -51
  145. data/spec/tls/generate-server-cert.sh +0 -8
  146. data/spec/tls/server-openssl.cnf +0 -10
  147. data/spec/tls/server.csr +0 -16
  148. data/spec/tls/server_certificate.pem +0 -29
  149. data/spec/tls/server_key.pem +0 -51
  150. data/spec/unit/bunny_spec.rb +0 -15
  151. data/spec/unit/concurrent/atomic_fixnum_spec.rb +0 -35
  152. data/spec/unit/concurrent/condition_spec.rb +0 -82
  153. data/spec/unit/concurrent/linked_continuation_queue_spec.rb +0 -35
  154. data/spec/unit/concurrent/synchronized_sorted_set_spec.rb +0 -73
  155. data/spec/unit/exchange_recovery_spec.rb +0 -39
  156. data/spec/unit/version_delivery_tag_spec.rb +0 -28
@@ -1,221 +0,0 @@
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
- context "when queue name is specified" do
15
- let(:name) { "a queue declared at #{Time.now.to_i}" }
16
-
17
- it "declares a new queue with that name" do
18
- ch = connection.create_channel
19
-
20
- q = ch.queue(name)
21
- expect(q.name).to eq name
22
-
23
- q.delete
24
- ch.close
25
- end
26
-
27
- it "caches that queue" do
28
- ch = connection.create_channel
29
-
30
- q = ch.queue(name)
31
- expect(ch.queue(name).object_id).to eq q.object_id
32
-
33
- q.delete
34
- ch.close
35
- end
36
- end
37
-
38
-
39
- context "when queue name is passed on as an empty string" do
40
- it "uses server-assigned queue name" do
41
- ch = connection.create_channel
42
-
43
- q = ch.queue("")
44
- expect(q.name).not_to be_empty
45
- expect(q.name).to match /^amq.gen.+/
46
- expect(q).to be_server_named
47
- q.delete
48
-
49
- ch.close
50
- end
51
- end
52
-
53
-
54
- context "when queue is declared as durable" do
55
- it "declares it as durable" do
56
- ch = connection.create_channel
57
-
58
- q = ch.queue("bunny.tests.queues.durable", durable: true)
59
- expect(q).to be_durable
60
- expect(q).not_to be_auto_delete
61
- expect(q).not_to be_exclusive
62
- expect(q.arguments).to be_nil
63
- q.delete
64
-
65
- ch.close
66
- end
67
- end
68
-
69
-
70
- context "when queue is declared as exclusive" do
71
- it "declares it as exclusive" do
72
- ch = connection.create_channel
73
-
74
- q = ch.queue("bunny.tests.queues.exclusive", exclusive: true)
75
- expect(q).to be_exclusive
76
- expect(q).not_to be_durable
77
- q.delete
78
-
79
- ch.close
80
- end
81
- end
82
-
83
-
84
- context "when queue is declared as auto-delete" do
85
- it "declares it as auto-delete" do
86
- ch = connection.create_channel
87
-
88
- q = ch.queue("bunny.tests.queues.auto-delete", auto_delete: true)
89
- expect(q).to be_auto_delete
90
- expect(q).not_to be_exclusive
91
- expect(q).not_to be_durable
92
- q.delete
93
-
94
- ch.close
95
- end
96
- end
97
-
98
-
99
-
100
- context "when queue is declared with a different set of attributes" do
101
- it "raises an exception" do
102
- ch = connection.create_channel
103
-
104
- q = ch.queue("bunny.tests.queues.auto-delete", auto_delete: true, durable: false)
105
- expect {
106
- # force re-declaration
107
- ch.queue_declare("bunny.tests.queues.auto-delete", auto_delete: false, durable: true)
108
- }.to raise_error(Bunny::PreconditionFailed)
109
-
110
- expect(ch).to be_closed
111
- end
112
- end
113
-
114
-
115
- context "when queue is declared with message TTL" do
116
- let(:args) do
117
- # in ms
118
- {"x-message-ttl" => 1000}
119
- end
120
-
121
- it "causes all messages in it to have a TTL" do
122
- ch = connection.create_channel
123
-
124
- q = ch.queue("bunny.tests.queues.with-arguments.ttl", arguments: args, exclusive: true)
125
- expect(q.arguments).to eq args
126
-
127
- q.publish("xyzzy")
128
- sleep 0.1
129
-
130
- expect(q.message_count).to eq 1
131
- sleep 1.5
132
- expect(q.message_count).to eq 0
133
-
134
- ch.close
135
- end
136
- end
137
-
138
-
139
- context "when queue is declared with priorities" do
140
- let(:args) do
141
- {"x-max-priority" => 5}
142
- end
143
-
144
- it "enables priority implementation" do
145
- c = Bunny.new(user: "bunny_gem", password: "bunny_password", vhost: "bunny_testbed")
146
- c.start
147
-
148
- ch = c.create_channel
149
- ch.confirm_select
150
-
151
- q = ch.queue("bunny.tests.queues.with-arguments.priority #{rand}", arguments: args, exclusive: true)
152
- expect(q.arguments).to eq args
153
-
154
- q.publish("xyzzy")
155
- ch.wait_for_confirms
156
- sleep 0.1
157
-
158
- # this test only does sanity checking,
159
- # without trying to actually test prioritisation.
160
- #
161
- # added to guard against issues such as
162
- # https://github.com/rabbitmq/rabbitmq-server/issues/488
163
- expect(q.message_count).to eq 1
164
-
165
- ch.close
166
- end
167
- end
168
-
169
-
170
- describe "#queue_exists?" do
171
- context "when a queue exists" do
172
- it "returns true" do
173
- ch = connection.create_channel
174
- q = ch.queue("", exlusive: true)
175
-
176
- expect(connection.queue_exists?(q.name)).to eq true
177
- end
178
- end
179
-
180
- context "when a queue DOES NOT exist" do
181
- it "returns false" do
182
- expect(connection.queue_exists?("suf89u9a4jo3ndnakls##{Time.now.to_i}")).to eq false
183
- end
184
- end
185
- end
186
-
187
-
188
-
189
- unless ENV["CI"]
190
- # requires RabbitMQ 3.1+
191
- context "when queue is declared with bounded length" do
192
- let(:n) { 10 }
193
- let(:args) do
194
- # in ms
195
- {"x-max-length" => n}
196
- end
197
-
198
- # see http://www.rabbitmq.com/maxlength.html for more info
199
- it "causes the queue to be bounded" do
200
- ch = connection.create_channel
201
-
202
- q = ch.queue("bunny.tests.queues.with-arguments.max-length", arguments: args, exclusive: true)
203
- expect(q.arguments).to eq args
204
-
205
- (n * 10).times do
206
- q.publish("xyzzy")
207
- end
208
-
209
- expect(q.message_count).to eq n
210
- (n * 5).times do
211
- q.publish("xyzzy")
212
- end
213
-
214
- expect(q.message_count).to eq n
215
- q.delete
216
-
217
- ch.close
218
- end
219
- end
220
- end
221
- end
@@ -1,41 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Bunny::Queue, "#delete" do
4
- let(:connection) do
5
- c = Bunny.new(username: "bunny_gem", password: "bunny_password", vhost: "bunny_testbed")
6
- c.start
7
- c
8
- end
9
-
10
- after :each do
11
- connection.close
12
- end
13
-
14
-
15
-
16
- context "with a name of an existing queue" do
17
- it "deletes that queue" do
18
- ch = connection.create_channel
19
- q = ch.queue("")
20
-
21
- q.delete
22
- # no exception as of RabbitMQ 3.2. MK.
23
- q.delete
24
-
25
- expect(ch.queues.size).to eq 0
26
- end
27
- end
28
-
29
-
30
- context "with a name of an existing queue" do
31
- it "DOES NOT raise an exception" do
32
- ch = connection.create_channel
33
-
34
- # no exception as of RabbitMQ 3.2. MK.
35
- ch.queue_delete("sdkhflsdjflskdjflsd#{rand}")
36
- ch.queue_delete("sdkhflsdjflskdjflsd#{rand}")
37
- ch.queue_delete("sdkhflsdjflskdjflsd#{rand}")
38
- ch.queue_delete("sdkhflsdjflskdjflsd#{rand}")
39
- end
40
- end
41
- end
@@ -1,30 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Bunny::Queue do
4
- let(:connection) do
5
- c = Bunny.new(username: "bunny_gem", password: "bunny_password", vhost: "bunny_testbed")
6
- c.start
7
- c
8
- end
9
-
10
- after :each do
11
- connection.close
12
- end
13
-
14
-
15
- it "can be purged" do
16
- ch = connection.create_channel
17
-
18
- q = ch.queue("", exclusive: true)
19
- x = ch.default_exchange
20
-
21
- x.publish("xyzzy", routing_key: q.name)
22
- sleep(0.5)
23
-
24
- expect(q.message_count).to eq 1
25
- q.purge
26
- expect(q.message_count).to eq 0
27
-
28
- ch.close
29
- end
30
- end
@@ -1,54 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Bunny::Queue, "bound to an exchange" do
4
- let(:connection) do
5
- c = Bunny.new(username: "bunny_gem", password: "bunny_password", vhost: "bunny_testbed")
6
- c.start
7
- c
8
- end
9
-
10
- after :each do
11
- connection.close
12
- end
13
-
14
-
15
- it "can be unbound from an exchange it was bound to" do
16
- ch = connection.create_channel
17
- x = ch.fanout("amq.fanout")
18
- q = ch.queue("", exclusive: true).bind(x)
19
-
20
- x.publish("")
21
- sleep 0.3
22
- expect(q.message_count).to eq 1
23
-
24
- q.unbind(x)
25
-
26
- x.publish("")
27
- expect(q.message_count).to eq 1
28
- end
29
- end
30
-
31
-
32
-
33
- describe Bunny::Queue, "NOT bound to an exchange" do
34
- let(:connection) do
35
- c = Bunny.new(username: "bunny_gem", password: "bunny_password", vhost: "bunny_testbed")
36
- c.start
37
- c
38
- end
39
-
40
- after :each do
41
- connection.close
42
- end
43
-
44
-
45
- it "is idempotent (succeeds)" do
46
- ch = connection.create_channel
47
- x = ch.fanout("amq.fanout")
48
- q = ch.queue("", exclusive: true)
49
-
50
- # No exception as of RabbitMQ 3.2. MK.
51
- q.unbind(x)
52
- q.unbind(x)
53
- end
54
- end
@@ -1,60 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Bunny::Queue, "#subscribe" do
4
- let(:publisher_connection) do
5
- c = Bunny.new(username: "bunny_gem", password: "bunny_password", vhost: "bunny_testbed")
6
- c.start
7
- c
8
- end
9
-
10
- let(:consumer_connection) do
11
- c = Bunny.new(username: "bunny_reader", password: "reader_password", vhost: "bunny_testbed")
12
- c.start
13
- c
14
- end
15
-
16
- after :each do
17
- publisher_connection.close if publisher_connection.open?
18
- consumer_connection.close if consumer_connection.open?
19
- end
20
-
21
- context "with automatic acknowledgement mode" do
22
- let(:queue_name) { "bunny.basic_consume#{rand}" }
23
-
24
- it "registers the consumer" do
25
- delivered_keys = []
26
- delivered_data = []
27
-
28
- ch = publisher_connection.create_channel
29
- # declare the queue because the read-only user won't be able to issue
30
- # queue.declare
31
- q = ch.queue(queue_name, auto_delete: true, durable: false)
32
-
33
- t = Thread.new do
34
- # give the main thread a bit of time to declare the queue
35
- sleep 0.5
36
- ch = consumer_connection.create_channel
37
- # this connection is read only, use passive declare to only get
38
- # a reference to the queue
39
- q = ch.queue(queue_name, auto_delete: true, durable: false, passive: true)
40
- q.subscribe(exclusive: false) do |delivery_info, properties, payload|
41
- delivered_keys << delivery_info.routing_key
42
- delivered_data << payload
43
- end
44
- end
45
- t.abort_on_exception = true
46
- sleep 0.5
47
-
48
- x = ch.default_exchange
49
- x.publish("hello", routing_key: queue_name)
50
-
51
- sleep 0.7
52
- expect(delivered_keys).to include(queue_name)
53
- expect(delivered_data).to include("hello")
54
-
55
- expect(ch.queue(queue_name, auto_delete: true, durable: false).message_count).to eq 0
56
-
57
- ch.close
58
- end
59
- end
60
- end # describe
@@ -1,36 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Sender-selected distribution" do
4
- let(:connection) do
5
- c = Bunny.new(username: "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
- it "lets publishers specify additional routing keys using CC and BCC headers" do
15
- ch = connection.create_channel
16
- x = ch.direct("bunny.tests.ssd.exchange")
17
- q1 = ch.queue("", exclusive: true).bind(x, routing_key: "one")
18
- q2 = ch.queue("", exclusive: true).bind(x, routing_key: "two")
19
- q3 = ch.queue("", exclusive: true).bind(x, routing_key: "three")
20
- q4 = ch.queue("", exclusive: true).bind(x, routing_key: "four")
21
-
22
- n = 10
23
- n.times do |i|
24
- x.publish("Message #{i}", routing_key: "one", headers: {"CC" => ["two", "three"]})
25
- end
26
-
27
- sleep 0.5
28
-
29
- expect(q1.message_count).to eq n
30
- expect(q2.message_count).to eq n
31
- expect(q3.message_count).to eq n
32
- expect(q4.message_count).to be_zero
33
-
34
- x.delete
35
- end
36
- end
@@ -1,222 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- require "spec_helper"
3
-
4
- unless ENV["CI"]
5
- CERTIFICATE_DIR=ENV.fetch("BUNNY_CERTIFICATE_DIR", "./spec/tls")
6
- puts "Will use certificates from #{CERTIFICATE_DIR}"
7
-
8
- shared_examples_for "successful TLS connection" do
9
- it "succeeds" do
10
- expect(subject).to be_tls
11
- ch = subject.create_channel
12
- ch.confirm_select
13
-
14
- q = ch.queue("", exclusive: true)
15
- x = ch.default_exchange
16
-
17
- x.publish("xyzzy", routing_key: q.name).
18
- publish("xyzzy", routing_key: q.name).
19
- publish("xyzzy", routing_key: q.name).
20
- publish("xyzzy", routing_key: q.name)
21
-
22
- x.wait_for_confirms
23
- expect(q.message_count).to eq 4
24
-
25
- i = 0
26
- q.subscribe do |delivery_info, _, payload|
27
- i += 1
28
- end
29
- sleep 1.0
30
- expect(i).to eq 4
31
- expect(q.message_count).to eq 0
32
-
33
- ch.close
34
- end
35
- end
36
-
37
- def local_hostname
38
- ENV.fetch("BUNNY_RABBITMQ_HOSTNAME", "127.0.0.1")
39
- end
40
-
41
- context "initialized with :tls => true" do
42
- let(:subject) do
43
- Bunny.new(:user => "bunny_gem",
44
- :password => "bunny_password",
45
- :vhost => "bunny_testbed",
46
- :tls => true,
47
- :verify_peer => verify_peer,
48
- :tls_cert => "#{CERTIFICATE_DIR}/client_certificate.pem",
49
- :tls_key => "#{CERTIFICATE_DIR}/client_key.pem",
50
- :tls_ca_certificates => ["#{CERTIFICATE_DIR}/ca_certificate.pem"])
51
- end
52
-
53
- context "peer verification is off" do
54
- let(:verify_peer) { false }
55
-
56
- it "uses TLS port" do
57
- expect(subject.port).to eq AMQ::Protocol::TLS_PORT
58
- end
59
-
60
- it "sends the SNI details" do
61
- # https://github.com/ruby-amqp/bunny/issues/440
62
- subject.start
63
- expect(subject.transport.socket.hostname).to_not be_empty
64
- end
65
-
66
- after :each do
67
- subject.close
68
- end
69
- end
70
-
71
- context "peer verification is on" do
72
- let(:verify_peer) { true }
73
-
74
- it "uses TLS port" do
75
- expect(subject.port).to eq AMQ::Protocol::TLS_PORT
76
- end
77
- end
78
- end
79
-
80
- describe "TLS connection to RabbitMQ with client certificates" do
81
- let(:subject) do
82
- c = Bunny.new(username: "bunny_gem",
83
- password: "bunny_password",
84
- vhost: "bunny_testbed",
85
- tls: true,
86
- tls_cert: "#{CERTIFICATE_DIR}/client_certificate.pem",
87
- tls_key: "#{CERTIFICATE_DIR}/client_key.pem",
88
- tls_ca_certificates: ["#{CERTIFICATE_DIR}/ca_certificate.pem"],
89
- verify_peer: false)
90
- c.start
91
- c
92
- end
93
-
94
- after :each do
95
- subject.close
96
- end
97
-
98
- include_examples "successful TLS connection"
99
- end
100
-
101
-
102
- describe "TLS connection to RabbitMQ without client certificates" do
103
- let(:subject) do
104
- c = Bunny.new(username: "bunny_gem",
105
- password: "bunny_password",
106
- vhost: "bunny_testbed",
107
- tls: true,
108
- tls_ca_certificates: ["#{CERTIFICATE_DIR}/ca_certificate.pem"],
109
- verify_peer: false)
110
- c.start
111
- c
112
- end
113
-
114
- after :each do
115
- subject.close
116
- end
117
-
118
- include_examples "successful TLS connection"
119
- end
120
-
121
-
122
- describe "TLS connection to RabbitMQ with a connection string" do
123
- let(:subject) do
124
- c = Bunny.new("amqps://bunny_gem:bunny_password@#{local_hostname}/bunny_testbed",
125
- tls_cert: "#{CERTIFICATE_DIR}/client_certificate.pem",
126
- tls_key: "#{CERTIFICATE_DIR}/client_key.pem",
127
- tls_ca_certificates: ["#{CERTIFICATE_DIR}/ca_certificate.pem"],
128
- verify_peer: false)
129
- c.start
130
- c
131
- end
132
-
133
- after :each do
134
- subject.close
135
- end
136
-
137
- include_examples "successful TLS connection"
138
- end
139
-
140
-
141
- describe "TLS connection to RabbitMQ with a connection string and w/o client certificate and key" do
142
- let(:subject) do
143
- c = Bunny.new("amqps://bunny_gem:bunny_password@#{local_hostname}/bunny_testbed",
144
- tls_ca_certificates: ["#{CERTIFICATE_DIR}/ca_certificate.pem"],
145
- verify_peer: verify_peer)
146
- c.start
147
- c
148
- end
149
-
150
- after :each do
151
- subject.close
152
- end
153
-
154
- context "peer verification is off" do
155
- let(:verify_peer) { false }
156
-
157
- include_examples "successful TLS connection"
158
-
159
- it "sends the SNI details" do
160
- # https://github.com/ruby-amqp/bunny/issues/440
161
- expect(subject.transport.socket.hostname).to_not be_empty
162
- end
163
- end
164
-
165
- context "peer verification is on" do
166
- let(:verify_peer) { true }
167
-
168
- include_examples "successful TLS connection"
169
-
170
- it "sends the SNI details" do
171
- # https://github.com/ruby-amqp/bunny/issues/440
172
- expect(subject.transport.socket.hostname).to_not be_empty
173
- end
174
- end
175
- end
176
-
177
-
178
- describe "TLS connection to RabbitMQ with client certificates provided inline" do
179
- let(:subject) do
180
- c = Bunny.new(username: "bunny_gem",
181
- password: "bunny_password",
182
- vhost: "bunny_testbed",
183
- tls: true,
184
- tls_cert: File.read("#{CERTIFICATE_DIR}/client_certificate.pem"),
185
- tls_key: File.read("#{CERTIFICATE_DIR}/client_key.pem"),
186
- tls_ca_certificates: ["#{CERTIFICATE_DIR}/ca_certificate.pem"],
187
- verify_peer: false)
188
- c.start
189
- c
190
- end
191
-
192
- after :each do
193
- subject.close
194
- end
195
-
196
- include_examples "successful TLS connection"
197
- end
198
-
199
- describe "TLS connection to RabbitMQ with tls_version TLSv1.1 specified" do
200
- let(:subject) do
201
- c = Bunny.new(username: "bunny_gem",
202
- password: "bunny_password",
203
- vhost: "bunny_testbed",
204
- tls: true,
205
- tls_protocol: :TLSv1_1,
206
- tls_ca_certificates: ["#{CERTIFICATE_DIR}/ca_certificate.pem"],
207
- verify_peer: false)
208
- c.start
209
- c
210
- end
211
-
212
- after :each do
213
- subject.close
214
- end
215
-
216
- include_examples "successful TLS connection"
217
-
218
- it "connects using TLSv1.1" do
219
- expect(subject.transport.socket.ssl_version).to eq "TLSv1.1"
220
- end
221
- end
222
- end
@@ -1,21 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Bunny::Channel, "#tx_commit" do
4
- let(:connection) do
5
- c = Bunny.new(username: "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
- it "is supported" do
15
- ch = connection.create_channel
16
- ch.tx_select
17
- ch.tx_commit
18
-
19
- ch.close
20
- end
21
- end
@@ -1,21 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Bunny::Channel, "#tx_rollback" do
4
- let(:connection) do
5
- c = Bunny.new(username: "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
- it "is supported" do
15
- ch = connection.create_channel
16
- ch.tx_select
17
- ch.tx_rollback
18
-
19
- ch.close
20
- end
21
- end