bunny 0.9.0.pre7 → 0.9.0.pre8

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.
@@ -15,21 +15,23 @@ describe "Message framing implementation" do
15
15
  end
16
16
 
17
17
 
18
- context "with payload ~ 248K in size including non-ASCII characters" do
19
- it "successfully frames the message" do
20
- ch = connection.create_channel
18
+ unless ENV["CI"]
19
+ context "with payload ~ 248K in size including non-ASCII characters" do
20
+ it "successfully frames the message" do
21
+ ch = connection.create_channel
21
22
 
22
- q = ch.queue("", :exclusive => true)
23
- x = ch.default_exchange
23
+ q = ch.queue("", :exclusive => true)
24
+ x = ch.default_exchange
24
25
 
25
- body = IO.read("spec/issues/issue97_attachment.json")
26
- x.publish(body, :routing_key => q.name, :persistent => true)
26
+ body = IO.read("spec/issues/issue97_attachment.json")
27
+ x.publish(body, :routing_key => q.name, :persistent => true)
27
28
 
28
- sleep(1)
29
- q.message_count.should == 1
29
+ sleep(1)
30
+ q.message_count.should == 1
30
31
 
31
- q.purge
32
- ch.close
32
+ q.purge
33
+ ch.close
34
+ end
33
35
  end
34
36
  end
35
37
 
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ describe "Rapidly opening and closing lots of channels" do
4
+ let(:connection) do
5
+ c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed", :automatic_recovery => false)
6
+ c.start
7
+ c
8
+ end
9
+
10
+ after :all do
11
+ connection.close
12
+ end
13
+
14
+ context "in a single-threaded scenario" do
15
+ let(:n) { 500 }
16
+
17
+ it "works correctly" do
18
+ xs = Array.new(n) { connection.create_channel }
19
+ puts "Opened #{n} channels"
20
+
21
+ xs.size.should == n
22
+ xs.each do |ch|
23
+ ch.close
24
+ end
25
+ end
26
+ end
27
+
28
+ context "in a multi-threaded scenario" do
29
+ # actually, on MRI values greater than ~100 will eventually cause write
30
+ # operations to fail with a timeout (1 second is not enough)
31
+ # which will cause recovery to re-acquire @channel_mutex in Session.
32
+ # Because Ruby's mutexes are not re-entrant, it will raise a ThreadError.
33
+ #
34
+ # But this already demonstrates that within these platform constraints,
35
+ # Bunny is safe to use in such scenarios.
36
+ let(:n) { 50 }
37
+
38
+ it "works correctly" do
39
+ n.times do
40
+ t = Thread.new do
41
+ ch = connection.create_channel
42
+
43
+ ch.close
44
+ end
45
+ t.abort_on_exception = true
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,66 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "spec_helper"
3
+
4
+ describe "Concurrent consumers sharing a connection" do
5
+ let(:connection) do
6
+ c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed", :automatic_recovery => false)
7
+ c.start
8
+ c
9
+ end
10
+
11
+ after :all do
12
+ connection.close
13
+ end
14
+
15
+ def any_not_drained?(qs)
16
+ qs.any? { |q| !q.message_count.zero? }
17
+ end
18
+
19
+ context "when publishing thousands of messages over 128K in size" do
20
+ let(:colors) { ["red", "blue", "white"] }
21
+
22
+ let(:n) { 32 }
23
+ let(:m) { 1000 }
24
+
25
+ it "successfully drain all queues" do
26
+ ch = connection.create_channel
27
+ body = "абвг"
28
+ x = ch.topic("bunny.stress.concurrent.consumers.topic", :durable => true)
29
+
30
+ chs = {}
31
+ n.times do |i|
32
+ chs[i] = connection.create_channel
33
+ end
34
+ qs = []
35
+
36
+ n.times do |i|
37
+ t = Thread.new do
38
+ cht = chs[i]
39
+
40
+ q = cht.queue("", :exclusive => true)
41
+ q.bind(x.name, :routing_key => colors.sample).subscribe do |delivery_info, meta, payload|
42
+ # no-op
43
+ end
44
+ qs << q
45
+ end
46
+ t.abort_on_exception = true
47
+ end
48
+
49
+ sleep 1.0
50
+
51
+ 5.times do |i|
52
+ m.times do
53
+ x.publish(body, :routing_key => colors.sample)
54
+ end
55
+ puts "Published #{(i + 1) * m} messages..."
56
+ end
57
+
58
+ while any_not_drained?(qs)
59
+ sleep 1.0
60
+ end
61
+ puts "Drained all the queues..."
62
+
63
+ ch.close
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,58 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "spec_helper"
3
+
4
+ describe "Concurrent publishers sharing a connection" do
5
+ let(:connection) do
6
+ c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed", :automatically_recover => false)
7
+ c.start
8
+ c
9
+ end
10
+
11
+ after :all do
12
+ connection.close
13
+ end
14
+
15
+ let(:n) { 32 }
16
+ let(:m) { 1000 }
17
+
18
+ it "successfully finish publishing" do
19
+ ch = connection.create_channel
20
+
21
+ q = ch.queue("", :exclusive => true)
22
+ body = "сообщение"
23
+
24
+ # let the queue name be sent back by RabbitMQ
25
+ sleep 0.25
26
+
27
+ chs = {}
28
+ n.times do |i|
29
+ chs[i] = connection.create_channel
30
+ end
31
+
32
+ ts = []
33
+
34
+ n.times do |i|
35
+ t = Thread.new do
36
+ cht = chs[i]
37
+ x = ch.default_exchange
38
+
39
+ 5.times do |i|
40
+ m.times do
41
+ x.publish(body, :routing_key => q.name)
42
+ end
43
+ puts "Published #{(i + 1) * m} messages..."
44
+ end
45
+ end
46
+ t.abort_on_exception = true
47
+
48
+ ts << t
49
+ end
50
+
51
+ ts.each do |t|
52
+ t.join
53
+ end
54
+
55
+ sleep 4.0
56
+ q.message_count.should == 5 * n * m
57
+ end
58
+ end
@@ -13,6 +13,7 @@ describe Bunny::Concurrent::Condition do
13
13
  sleep 0.25
14
14
  condition.notify
15
15
  end
16
+ t.abort_on_exception = true
16
17
 
17
18
  condition.wait
18
19
  xs.should == [:notified]
@@ -28,11 +29,13 @@ describe Bunny::Concurrent::Condition do
28
29
  condition.wait
29
30
  xs << :notified1
30
31
  end
32
+ t1.abort_on_exception = true
31
33
 
32
34
  t2 = Thread.new do
33
35
  condition.wait
34
36
  xs << :notified2
35
37
  end
38
+ t2.abort_on_exception = true
36
39
 
37
40
  sleep 0.25
38
41
  condition.notify
@@ -50,11 +53,13 @@ describe Bunny::Concurrent::Condition do
50
53
  condition.wait
51
54
  @xs << :notified1
52
55
  end
56
+ t1.abort_on_exception = true
53
57
 
54
58
  t2 = Thread.new do
55
59
  condition.wait
56
60
  @xs << :notified2
57
61
  end
62
+ t2.abort_on_exception = true
58
63
 
59
64
  sleep 0.5
60
65
  condition.notify_all
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bunny
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0.pre7
4
+ version: 0.9.0.pre8
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2013-02-12 00:00:00.000000000 Z
16
+ date: 2013-03-12 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: amq-protocol
@@ -64,6 +64,7 @@ files:
64
64
  - examples/connection/automatic_recovery_with_multiple_consumers.rb
65
65
  - examples/connection/automatic_recovery_with_server_named_queues.rb
66
66
  - examples/connection/channel_level_exception.rb
67
+ - examples/connection/disabled_automatic_recovery.rb
67
68
  - examples/connection/heartbeat.rb
68
69
  - examples/connection/unknown_host.rb
69
70
  - examples/guides/exchanges/direct_exchange_routing.rb
@@ -106,6 +107,7 @@ files:
106
107
  - lib/bunny/return_info.rb
107
108
  - lib/bunny/session.rb
108
109
  - lib/bunny/socket.rb
110
+ - lib/bunny/ssl_socket.rb
109
111
  - lib/bunny/system_timer.rb
110
112
  - lib/bunny/transport.rb
111
113
  - lib/bunny/version.rb
@@ -123,9 +125,9 @@ files:
123
125
  - spec/higher_level_api/integration/channel_close_spec.rb
124
126
  - spec/higher_level_api/integration/channel_flow_spec.rb
125
127
  - spec/higher_level_api/integration/channel_open_spec.rb
126
- - spec/higher_level_api/integration/channel_open_stress_spec.rb
127
128
  - spec/higher_level_api/integration/confirm_select_spec.rb
128
129
  - spec/higher_level_api/integration/connection_spec.rb
130
+ - spec/higher_level_api/integration/consistent_hash_exchange_spec.rb
129
131
  - spec/higher_level_api/integration/consumer_cancellation_notification_spec.rb
130
132
  - spec/higher_level_api/integration/dead_lettering_spec.rb
131
133
  - spec/higher_level_api/integration/exchange_bind_spec.rb
@@ -144,6 +146,7 @@ files:
144
146
  - spec/higher_level_api/integration/sender_selected_distribution_spec.rb
145
147
  - spec/higher_level_api/integration/tx_commit_spec.rb
146
148
  - spec/higher_level_api/integration/tx_rollback_spec.rb
149
+ - spec/issues/issue100_spec.rb
147
150
  - spec/issues/issue78_spec.rb
148
151
  - spec/issues/issue83_spec.rb
149
152
  - spec/issues/issue97_attachment.json
@@ -151,6 +154,9 @@ files:
151
154
  - spec/lower_level_api/integration/basic_cancel_spec.rb
152
155
  - spec/lower_level_api/integration/basic_consume_spec.rb
153
156
  - spec/spec_helper.rb
157
+ - spec/stress/channel_open_stress_spec.rb
158
+ - spec/stress/concurrent_consumers_stress_spec.rb
159
+ - spec/stress/concurrent_publishers_stress_spec.rb
154
160
  - spec/unit/bunny_spec.rb
155
161
  - spec/unit/concurrent/condition_spec.rb
156
162
  - spec/unit/transport_spec.rb
@@ -196,9 +202,9 @@ test_files:
196
202
  - spec/higher_level_api/integration/channel_close_spec.rb
197
203
  - spec/higher_level_api/integration/channel_flow_spec.rb
198
204
  - spec/higher_level_api/integration/channel_open_spec.rb
199
- - spec/higher_level_api/integration/channel_open_stress_spec.rb
200
205
  - spec/higher_level_api/integration/confirm_select_spec.rb
201
206
  - spec/higher_level_api/integration/connection_spec.rb
207
+ - spec/higher_level_api/integration/consistent_hash_exchange_spec.rb
202
208
  - spec/higher_level_api/integration/consumer_cancellation_notification_spec.rb
203
209
  - spec/higher_level_api/integration/dead_lettering_spec.rb
204
210
  - spec/higher_level_api/integration/exchange_bind_spec.rb
@@ -217,6 +223,7 @@ test_files:
217
223
  - spec/higher_level_api/integration/sender_selected_distribution_spec.rb
218
224
  - spec/higher_level_api/integration/tx_commit_spec.rb
219
225
  - spec/higher_level_api/integration/tx_rollback_spec.rb
226
+ - spec/issues/issue100_spec.rb
220
227
  - spec/issues/issue78_spec.rb
221
228
  - spec/issues/issue83_spec.rb
222
229
  - spec/issues/issue97_attachment.json
@@ -224,6 +231,9 @@ test_files:
224
231
  - spec/lower_level_api/integration/basic_cancel_spec.rb
225
232
  - spec/lower_level_api/integration/basic_consume_spec.rb
226
233
  - spec/spec_helper.rb
234
+ - spec/stress/channel_open_stress_spec.rb
235
+ - spec/stress/concurrent_consumers_stress_spec.rb
236
+ - spec/stress/concurrent_publishers_stress_spec.rb
227
237
  - spec/unit/bunny_spec.rb
228
238
  - spec/unit/concurrent/condition_spec.rb
229
239
  - spec/unit/transport_spec.rb
@@ -1,22 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Rapidly opening and closing lots of channels" 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 :all do
11
- connection.close
12
- end
13
-
14
- it "works correctly" do
15
- xs = Array.new(2000) { connection.create_channel }
16
-
17
- xs.size.should == 2000
18
- xs.each do |ch|
19
- ch.close
20
- end
21
- end
22
- end