bunny 1.7.1 → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/CONTRIBUTING.md +14 -0
  4. data/ChangeLog.md +21 -6
  5. data/Gemfile +1 -1
  6. data/LICENSE +1 -1
  7. data/README.md +22 -23
  8. data/bunny.gemspec +1 -1
  9. data/lib/bunny/channel.rb +12 -0
  10. data/lib/bunny/concurrent/continuation_queue.rb +30 -13
  11. data/lib/bunny/exchange.rb +0 -5
  12. data/lib/bunny/jruby/socket.rb +1 -2
  13. data/lib/bunny/queue.rb +9 -0
  14. data/lib/bunny/session.rb +7 -6
  15. data/lib/bunny/version.rb +1 -1
  16. data/spec/higher_level_api/integration/basic_ack_spec.rb +9 -9
  17. data/spec/higher_level_api/integration/basic_cancel_spec.rb +4 -4
  18. data/spec/higher_level_api/integration/basic_consume_spec.rb +22 -22
  19. data/spec/higher_level_api/integration/basic_consume_with_objects_spec.rb +1 -1
  20. data/spec/higher_level_api/integration/basic_get_spec.rb +2 -2
  21. data/spec/higher_level_api/integration/basic_nack_spec.rb +6 -6
  22. data/spec/higher_level_api/integration/basic_publish_spec.rb +14 -14
  23. data/spec/higher_level_api/integration/basic_qos_spec.rb +11 -2
  24. data/spec/higher_level_api/integration/basic_recover_spec.rb +2 -2
  25. data/spec/higher_level_api/integration/basic_reject_spec.rb +6 -6
  26. data/spec/higher_level_api/integration/basic_return_spec.rb +1 -1
  27. data/spec/higher_level_api/integration/channel_close_spec.rb +2 -2
  28. data/spec/higher_level_api/integration/channel_open_spec.rb +11 -11
  29. data/spec/higher_level_api/integration/connection_recovery_spec.rb +52 -52
  30. data/spec/higher_level_api/integration/connection_spec.rb +83 -83
  31. data/spec/higher_level_api/integration/connection_stop_spec.rb +11 -11
  32. data/spec/higher_level_api/integration/consistent_hash_exchange_spec.rb +2 -2
  33. data/spec/higher_level_api/integration/consumer_cancellation_notification_spec.rb +3 -3
  34. data/spec/higher_level_api/integration/dead_lettering_spec.rb +6 -6
  35. data/spec/higher_level_api/integration/exchange_bind_spec.rb +1 -1
  36. data/spec/higher_level_api/integration/exchange_declare_spec.rb +20 -20
  37. data/spec/higher_level_api/integration/exchange_delete_spec.rb +11 -11
  38. data/spec/higher_level_api/integration/exchange_unbind_spec.rb +2 -2
  39. data/spec/higher_level_api/integration/merry_go_round_spec.rb +2 -2
  40. data/spec/higher_level_api/integration/message_properties_access_spec.rb +27 -27
  41. data/spec/higher_level_api/integration/predeclared_exchanges_spec.rb +1 -1
  42. data/spec/higher_level_api/integration/publisher_confirms_spec.rb +19 -19
  43. data/spec/higher_level_api/integration/publishing_edge_cases_spec.rb +9 -9
  44. data/spec/higher_level_api/integration/queue_bind_spec.rb +13 -13
  45. data/spec/higher_level_api/integration/queue_declare_spec.rb +23 -23
  46. data/spec/higher_level_api/integration/queue_delete_spec.rb +1 -1
  47. data/spec/higher_level_api/integration/queue_purge_spec.rb +2 -2
  48. data/spec/higher_level_api/integration/queue_unbind_spec.rb +2 -2
  49. data/spec/higher_level_api/integration/read_only_consumer_spec.rb +3 -3
  50. data/spec/higher_level_api/integration/sender_selected_distribution_spec.rb +4 -4
  51. data/spec/higher_level_api/integration/tls_connection_spec.rb +5 -5
  52. data/spec/higher_level_api/integration/with_channel_spec.rb +1 -1
  53. data/spec/issues/issue100_spec.rb +9 -10
  54. data/spec/issues/issue141_spec.rb +11 -12
  55. data/spec/issues/issue224_spec.rb +2 -2
  56. data/spec/issues/issue78_spec.rb +14 -18
  57. data/spec/issues/issue83_spec.rb +5 -6
  58. data/spec/issues/issue97_spec.rb +25 -26
  59. data/spec/lower_level_api/integration/basic_cancel_spec.rb +15 -16
  60. data/spec/lower_level_api/integration/basic_consume_spec.rb +19 -20
  61. data/spec/stress/channel_open_stress_spec.rb +1 -1
  62. data/spec/stress/channel_open_stress_with_single_threaded_connection_spec.rb +6 -7
  63. data/spec/stress/concurrent_consumers_stress_spec.rb +6 -7
  64. data/spec/stress/concurrent_publishers_stress_spec.rb +6 -7
  65. data/spec/stress/connection_open_close_spec.rb +6 -6
  66. data/spec/stress/long_running_consumer_spec.rb +6 -7
  67. data/spec/unit/bunny_spec.rb +5 -5
  68. data/spec/unit/concurrent/atomic_fixnum_spec.rb +6 -6
  69. data/spec/unit/concurrent/condition_spec.rb +3 -3
  70. data/spec/unit/concurrent/linked_continuation_queue_spec.rb +2 -2
  71. data/spec/unit/concurrent/synchronized_sorted_set_spec.rb +16 -16
  72. data/spec/unit/system_timer_spec.rb +2 -2
  73. data/spec/unit/version_delivery_tag_spec.rb +3 -3
  74. metadata +8 -7
@@ -20,6 +20,6 @@ describe Bunny::Channel, "#with_channel" do
20
20
  end
21
21
  rescue Exception
22
22
  end
23
- ch.should be_closed
23
+ expect(ch).to be_closed
24
24
  end
25
25
  end
@@ -2,18 +2,17 @@ require "spec_helper"
2
2
 
3
3
  unless ENV["CI"]
4
4
  describe Bunny::Channel, "#basic_publish" do
5
- let(:connection) do
6
- c = Bunny.new(:user => "bunny_gem",
7
- :password => "bunny_password",
8
- :vhost => "bunny_testbed",
9
- :write_timeout => 0,
10
- :read_timeout => 0)
11
- c.start
12
- c
5
+ before :all do
6
+ @connection = Bunny.new(:user => "bunny_gem",
7
+ :password => "bunny_password",
8
+ :vhost => "bunny_testbed",
9
+ :write_timeout => 0,
10
+ :read_timeout => 0)
11
+ @connection.start
13
12
  end
14
13
 
15
14
  after :all do
16
- connection.close if connection.open?
15
+ @connection.close if @connection.open?
17
16
  end
18
17
 
19
18
 
@@ -22,7 +21,7 @@ unless ENV["CI"]
22
21
  let(:m) { 10 }
23
22
 
24
23
  it "successfully publishers them all" do
25
- ch = connection.create_channel
24
+ ch = @connection.create_channel
26
25
 
27
26
  q = ch.queue("", :exclusive => true)
28
27
  x = ch.default_exchange
@@ -1,22 +1,21 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe "Registering 2nd exclusive consumer on queue" do
4
- let(:connection) do
5
- c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
6
- c.start
7
- c
4
+ before :all do
5
+ @connection = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
6
+ @connection.start
8
7
  end
9
8
 
10
9
  after :each do
11
- connection.close if connection.open?
10
+ @connection.close if @connection.open?
12
11
  end
13
12
 
14
13
 
15
14
  it "raises a meaningful exception" do
16
15
  xs = []
17
16
 
18
- ch1 = connection.create_channel
19
- ch2 = connection.create_channel
17
+ ch1 = @connection.create_channel
18
+ ch2 = @connection.create_channel
20
19
  q1 = ch1.queue("", :auto_delete => true)
21
20
  q2 = ch2.queue(q1.name, :auto_delete => true, :passive => true)
22
21
 
@@ -25,19 +24,19 @@ describe "Registering 2nd exclusive consumer on queue" do
25
24
  end
26
25
  sleep 0.1
27
26
 
28
- lambda do
27
+ expect do
29
28
  q2.subscribe(:exclusive => true) do |_, _, _|
30
29
  end
31
- end.should raise_error(Bunny::AccessRefused)
30
+ end.to raise_error(Bunny::AccessRefused)
32
31
 
33
- ch1.should be_open
34
- ch2.should be_closed
32
+ expect(ch1).to be_open
33
+ expect(ch2).to be_closed
35
34
 
36
35
  q1.publish("abc")
37
36
  sleep 0.1
38
37
 
39
38
  # verify that the first consumer is fine
40
- xs.should == ["abc"]
39
+ expect(xs).to eq ["abc"]
41
40
 
42
41
  q1.delete
43
42
  end
@@ -28,10 +28,10 @@ unless ENV["CI"]
28
28
  x.publish(as, :routing_key => q.name, :persistent => true)
29
29
 
30
30
  sleep(1)
31
- q.message_count.should == 1
31
+ expect(q.message_count).to eq 1
32
32
 
33
33
  _, _, payload = q.pop
34
- payload.bytesize.should == as.bytesize
34
+ expect(payload.bytesize).to eq as.bytesize
35
35
 
36
36
  ch.close
37
37
  end
@@ -2,20 +2,16 @@ require "spec_helper"
2
2
 
3
3
  unless ENV["CI"]
4
4
  describe Bunny::Queue, "#subscribe" do
5
- let(:connection1) do
6
- c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
7
- c.start
8
- c
9
- end
10
- let(:connection2) do
11
- c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
12
- c.start
13
- c
5
+ before :all do
6
+ @connection1 = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
7
+ @connection1.start
8
+ @connection2 = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
9
+ @connection2.start
14
10
  end
15
11
 
16
12
  after :all do
17
- connection1.close if connection1.open?
18
- connection2.close if connection2.open?
13
+ @connection1.close if @connection1.open?
14
+ @connection2.close if @connection2.open?
19
15
  end
20
16
 
21
17
 
@@ -23,8 +19,8 @@ unless ENV["CI"]
23
19
  it "consumes messages" do
24
20
  delivered_data = []
25
21
 
26
- ch1 = connection1.create_channel
27
- ch2 = connection1.create_channel
22
+ ch1 = @connection1.create_channel
23
+ ch2 = @connection1.create_channel
28
24
 
29
25
  q = ch1.queue("", :exclusive => true)
30
26
  q.subscribe(:manual_ack => false, :block => false) do |delivery_info, properties, payload|
@@ -36,7 +32,7 @@ unless ENV["CI"]
36
32
  x.publish("abc", :routing_key => q.name)
37
33
  sleep 0.7
38
34
 
39
- delivered_data.should == ["abc"]
35
+ expect(delivered_data).to eq ["abc"]
40
36
 
41
37
  ch1.close
42
38
  ch2.close
@@ -49,8 +45,8 @@ unless ENV["CI"]
49
45
  it "consumes messages" do
50
46
  delivered_data = []
51
47
 
52
- ch1 = connection1.create_channel
53
- ch2 = connection1.create_channel
48
+ ch1 = @connection1.create_channel
49
+ ch2 = @connection1.create_channel
54
50
 
55
51
  q = ch1.queue(queue_name, :exclusive => true)
56
52
  x = ch2.default_exchange
@@ -58,14 +54,14 @@ unless ENV["CI"]
58
54
  x.publish("data#{i}", :routing_key => queue_name)
59
55
  end
60
56
  sleep 0.7
61
- q.message_count.should == 3
57
+ expect(q.message_count).to eq 3
62
58
 
63
59
  q.subscribe(:manual_ack => false, :block => false) do |delivery_info, properties, payload|
64
60
  delivered_data << payload
65
61
  end
66
62
  sleep 0.7
67
63
 
68
- delivered_data.should == ["data0", "data1", "data2"]
64
+ expect(delivered_data).to eq ["data0", "data1", "data2"]
69
65
 
70
66
  ch1.close
71
67
  ch2.close
@@ -1,19 +1,18 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Bunny::Channel, "#open" do
4
- let(:connection) do
5
- c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
6
- c.start
7
- c
4
+ before :all do
5
+ @connection = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
6
+ @connection.start
8
7
  end
9
8
 
10
9
  after :all do
11
- connection.close if connection.open?
10
+ @connection.close if @connection.open?
12
11
  end
13
12
 
14
13
 
15
14
  it "properly resets channel exception state" do
16
- ch = connection.create_channel
15
+ ch = @connection.create_channel
17
16
 
18
17
  begin
19
18
  ch.queue("bunny.tests.does.not.exist", :passive => true)
@@ -1,24 +1,23 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe "Message framing implementation" do
4
- let(:connection) do
5
- c = Bunny.new(:user => "bunny_gem",
4
+ before :all do
5
+ @connection = Bunny.new(:user => "bunny_gem",
6
6
  :password => "bunny_password",
7
7
  :vhost => "bunny_testbed",
8
8
  :port => ENV.fetch("RABBITMQ_PORT", 5672))
9
- c.start
10
- c
9
+ @connection.start
11
10
  end
12
11
 
13
12
  after :all do
14
- connection.close if connection.open?
13
+ @connection.close if @connection.open?
15
14
  end
16
15
 
17
16
 
18
17
  unless ENV["CI"]
19
18
  context "with payload ~ 248K in size including non-ASCII characters" do
20
19
  it "successfully frames the message" do
21
- ch = connection.create_channel
20
+ ch = @connection.create_channel
22
21
 
23
22
  q = ch.queue("", :exclusive => true)
24
23
  x = ch.default_exchange
@@ -27,7 +26,7 @@ describe "Message framing implementation" do
27
26
  x.publish(body, :routing_key => q.name, :persistent => true)
28
27
 
29
28
  sleep(1)
30
- q.message_count.should == 1
29
+ expect(q.message_count).to eq 1
31
30
 
32
31
  q.purge
33
32
  ch.close
@@ -38,7 +37,7 @@ describe "Message framing implementation" do
38
37
 
39
38
  context "with payload of several MBs in size" do
40
39
  it "successfully frames the message" do
41
- ch = connection.create_channel
40
+ ch = @connection.create_channel
42
41
 
43
42
  q = ch.queue("", :exclusive => true)
44
43
  x = ch.default_exchange
@@ -47,10 +46,10 @@ describe "Message framing implementation" do
47
46
  x.publish(as, :routing_key => q.name, :persistent => true)
48
47
 
49
48
  sleep(1)
50
- q.message_count.should == 1
49
+ expect(q.message_count).to eq 1
51
50
 
52
51
  _, _, payload = q.pop
53
- payload.bytesize.should == as.bytesize
52
+ expect(payload.bytesize).to eq as.bytesize
54
53
 
55
54
  ch.close
56
55
  end
@@ -60,7 +59,7 @@ describe "Message framing implementation" do
60
59
 
61
60
  context "with empty message body" do
62
61
  it "successfully publishes the message" do
63
- ch = connection.create_channel
62
+ ch = @connection.create_channel
64
63
 
65
64
  q = ch.queue("", :exclusive => true)
66
65
  x = ch.default_exchange
@@ -68,15 +67,15 @@ describe "Message framing implementation" do
68
67
  x.publish("", :routing_key => q.name, :persistent => true)
69
68
 
70
69
  sleep(1)
71
- q.message_count.should == 1
70
+ expect(q.message_count).to eq 1
72
71
 
73
72
  envelope, headers, payload = q.pop
74
73
 
75
- payload.should == ""
74
+ expect(payload).to eq ""
76
75
 
77
- headers[:content_type].should == "application/octet-stream"
78
- headers[:delivery_mode].should == 2
79
- headers[:priority].should == 0
76
+ expect(headers[:content_type]).to eq "application/octet-stream"
77
+ expect(headers[:delivery_mode]).to eq 2
78
+ expect(headers[:priority]).to eq 0
80
79
 
81
80
  ch.close
82
81
  end
@@ -85,7 +84,7 @@ describe "Message framing implementation" do
85
84
 
86
85
  context "with payload being 2 bytes less than 128K bytes in size" do
87
86
  it "successfully frames the message" do
88
- ch = connection.create_channel
87
+ ch = @connection.create_channel
89
88
 
90
89
  q = ch.queue("", :exclusive => true)
91
90
  x = ch.default_exchange
@@ -94,7 +93,7 @@ describe "Message framing implementation" do
94
93
  x.publish(as, :routing_key => q.name, :persistent => true)
95
94
 
96
95
  sleep(1)
97
- q.message_count.should == 1
96
+ expect(q.message_count).to eq 1
98
97
 
99
98
  q.purge
100
99
  ch.close
@@ -103,7 +102,7 @@ describe "Message framing implementation" do
103
102
 
104
103
  context "with payload being 1 byte less than 128K bytes in size" do
105
104
  it "successfully frames the message" do
106
- ch = connection.create_channel
105
+ ch = @connection.create_channel
107
106
 
108
107
  q = ch.queue("", :exclusive => true)
109
108
  x = ch.default_exchange
@@ -112,7 +111,7 @@ describe "Message framing implementation" do
112
111
  x.publish(as, :routing_key => q.name, :persistent => true)
113
112
 
114
113
  sleep(1)
115
- q.message_count.should == 1
114
+ expect(q.message_count).to eq 1
116
115
 
117
116
  q.purge
118
117
  ch.close
@@ -121,7 +120,7 @@ describe "Message framing implementation" do
121
120
 
122
121
  context "with payload being exactly 128K bytes in size" do
123
122
  it "successfully frames the message" do
124
- ch = connection.create_channel
123
+ ch = @connection.create_channel
125
124
 
126
125
  q = ch.queue("", :exclusive => true)
127
126
  x = ch.default_exchange
@@ -130,7 +129,7 @@ describe "Message framing implementation" do
130
129
  x.publish(as, :routing_key => q.name, :persistent => true)
131
130
 
132
131
  sleep(1)
133
- q.message_count.should == 1
132
+ expect(q.message_count).to eq 1
134
133
 
135
134
  q.purge
136
135
  ch.close
@@ -140,7 +139,7 @@ describe "Message framing implementation" do
140
139
 
141
140
  context "with payload being 1 byte greater than 128K bytes in size" do
142
141
  it "successfully frames the message" do
143
- ch = connection.create_channel
142
+ ch = @connection.create_channel
144
143
 
145
144
  q = ch.queue("", :exclusive => true)
146
145
  x = ch.default_exchange
@@ -149,7 +148,7 @@ describe "Message framing implementation" do
149
148
  x.publish(as, :routing_key => q.name, :persistent => true)
150
149
 
151
150
  sleep(1)
152
- q.message_count.should == 1
151
+ expect(q.message_count).to eq 1
153
152
 
154
153
  q.purge
155
154
  ch.close
@@ -158,7 +157,7 @@ describe "Message framing implementation" do
158
157
 
159
158
  context "with payload being 2 bytes greater than 128K bytes in size" do
160
159
  it "successfully frames the message" do
161
- ch = connection.create_channel
160
+ ch = @connection.create_channel
162
161
 
163
162
  q = ch.queue("", :exclusive => true)
164
163
  x = ch.default_exchange
@@ -167,7 +166,7 @@ describe "Message framing implementation" do
167
166
  x.publish(as, :routing_key => q.name, :persistent => true)
168
167
 
169
168
  sleep(1)
170
- q.message_count.should == 1
169
+ expect(q.message_count).to eq 1
171
170
 
172
171
  q.purge
173
172
  ch.close
@@ -1,27 +1,26 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Bunny::Channel, "#basic_cancel" do
4
- let(:connection) do
5
- c = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
6
- c.start
7
- c
4
+ before(:all) do
5
+ @connection = Bunny.new(:user => "bunny_gem", :password => "bunny_password", :vhost => "bunny_testbed")
6
+ @connection.start
8
7
  end
9
8
 
10
9
  after :all do
11
- connection.close if connection.open?
10
+ @connection.close if @connection.open?
12
11
  end
13
12
 
14
13
  let(:queue_name) { "bunny.queues.#{rand}" }
15
14
 
16
15
  it "returns basic.cancel-ok" do
17
- ch = connection.create_channel
16
+ ch = @connection.create_channel
18
17
  q = ch.queue("", :exclusive => true)
19
18
 
20
19
  consume_ok = ch.basic_consume(q, "")
21
20
  cancel_ok = ch.basic_cancel(consume_ok.consumer_tag)
22
21
 
23
- cancel_ok.should be_instance_of(AMQ::Protocol::Basic::CancelOk)
24
- cancel_ok.consumer_tag.should == consume_ok.consumer_tag
22
+ expect(cancel_ok).to be_instance_of AMQ::Protocol::Basic::CancelOk
23
+ expect(cancel_ok.consumer_tag).to eq consume_ok.consumer_tag
25
24
 
26
25
  ch.close
27
26
  end
@@ -33,32 +32,32 @@ describe Bunny::Channel, "#basic_cancel" do
33
32
  delivered_data = []
34
33
 
35
34
  t = Thread.new do
36
- ch = connection.create_channel
35
+ ch = @connection.create_channel
37
36
  q = ch.queue(queue_name, :auto_delete => true, :durable => false)
38
37
  consume_ok = ch.basic_consume(q, "", true, false) do |_, _, payload|
39
38
  delivered_data << payload
40
39
  end
41
40
 
42
- consume_ok.consumer_tag.should_not be_nil
41
+ expect(consume_ok.consumer_tag).not_to be_nil
43
42
  cancel_ok = ch.basic_cancel(consume_ok.consumer_tag)
44
- cancel_ok.consumer_tag.should == consume_ok.consumer_tag
43
+ expect(cancel_ok.consumer_tag).to eq consume_ok.consumer_tag
45
44
 
46
45
  ch.close
47
46
  end
48
47
  t.abort_on_exception = true
49
48
  sleep 0.5
50
49
 
51
- ch = connection.create_channel
50
+ ch = @connection.create_channel
52
51
  ch.default_exchange.publish("", :routing_key => queue_name)
53
52
 
54
53
  sleep 0.7
55
- delivered_data.should be_empty
54
+ expect(delivered_data).to be_empty
56
55
  end
57
56
  end
58
57
 
59
58
  context "when the given consumer tag is invalid (was never registered)" do
60
59
  it "DOES NOT cause a channel error" do
61
- ch = connection.create_channel
60
+ ch = @connection.create_channel
62
61
 
63
62
  # RabbitMQ 3.1 does not raise an exception w/ unknown consumer tag. MK.
64
63
  ch.basic_cancel("878798s7df89#{rand}#{Time.now.to_i}")
@@ -69,8 +68,8 @@ describe Bunny::Channel, "#basic_cancel" do
69
68
 
70
69
  context "when the given consumer tag belongs to a different channel" do
71
70
  it "DOES NOT cause a channel error" do
72
- ch1 = connection.create_channel
73
- ch2 = connection.create_channel
71
+ ch1 = @connection.create_channel
72
+ ch2 = @connection.create_channel
74
73
 
75
74
  q = ch1.queue("", :exclusive => true)
76
75
  cons = q.subscribe do |_, _, _|