amq-client 0.5.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 (108) hide show
  1. data/.gitignore +8 -0
  2. data/.gitmodules +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +7 -0
  5. data/.yardopts +1 -0
  6. data/CONTRIBUTORS +3 -0
  7. data/Gemfile +27 -0
  8. data/LICENSE +20 -0
  9. data/README.textile +61 -0
  10. data/amq-client.gemspec +34 -0
  11. data/bin/jenkins.sh +23 -0
  12. data/bin/set_test_suite_realms_up.sh +24 -0
  13. data/examples/coolio_adapter/basic_consume.rb +49 -0
  14. data/examples/coolio_adapter/basic_consume_with_acknowledgements.rb +43 -0
  15. data/examples/coolio_adapter/basic_consume_with_rejections.rb +43 -0
  16. data/examples/coolio_adapter/basic_publish.rb +35 -0
  17. data/examples/coolio_adapter/channel_close.rb +24 -0
  18. data/examples/coolio_adapter/example_helper.rb +39 -0
  19. data/examples/coolio_adapter/exchange_declare.rb +28 -0
  20. data/examples/coolio_adapter/kitchen_sink1.rb +48 -0
  21. data/examples/coolio_adapter/queue_bind.rb +32 -0
  22. data/examples/coolio_adapter/queue_purge.rb +32 -0
  23. data/examples/coolio_adapter/queue_unbind.rb +37 -0
  24. data/examples/eventmachine_adapter/authentication/plain_password_with_custom_role_credentials.rb +36 -0
  25. data/examples/eventmachine_adapter/authentication/plain_password_with_default_role_credentials.rb +27 -0
  26. data/examples/eventmachine_adapter/authentication/plain_password_with_incorrect_credentials.rb +18 -0
  27. data/examples/eventmachine_adapter/basic_cancel.rb +49 -0
  28. data/examples/eventmachine_adapter/basic_consume.rb +51 -0
  29. data/examples/eventmachine_adapter/basic_consume_with_acknowledgements.rb +45 -0
  30. data/examples/eventmachine_adapter/basic_consume_with_rejections.rb +45 -0
  31. data/examples/eventmachine_adapter/basic_get.rb +57 -0
  32. data/examples/eventmachine_adapter/basic_get_with_empty_queue.rb +53 -0
  33. data/examples/eventmachine_adapter/basic_publish.rb +38 -0
  34. data/examples/eventmachine_adapter/basic_qos.rb +29 -0
  35. data/examples/eventmachine_adapter/basic_recover.rb +29 -0
  36. data/examples/eventmachine_adapter/basic_return.rb +34 -0
  37. data/examples/eventmachine_adapter/channel_close.rb +24 -0
  38. data/examples/eventmachine_adapter/channel_flow.rb +36 -0
  39. data/examples/eventmachine_adapter/channel_level_exception_handling.rb +44 -0
  40. data/examples/eventmachine_adapter/example_helper.rb +39 -0
  41. data/examples/eventmachine_adapter/exchange_declare.rb +54 -0
  42. data/examples/eventmachine_adapter/extensions/rabbitmq/handling_confirm_select_ok.rb +31 -0
  43. data/examples/eventmachine_adapter/extensions/rabbitmq/publisher_confirmations_with_transient_messages.rb +56 -0
  44. data/examples/eventmachine_adapter/extensions/rabbitmq/publisher_confirmations_with_unroutable_message.rb +46 -0
  45. data/examples/eventmachine_adapter/kitchen_sink1.rb +50 -0
  46. data/examples/eventmachine_adapter/queue_bind.rb +32 -0
  47. data/examples/eventmachine_adapter/queue_declare.rb +34 -0
  48. data/examples/eventmachine_adapter/queue_purge.rb +32 -0
  49. data/examples/eventmachine_adapter/queue_unbind.rb +37 -0
  50. data/examples/eventmachine_adapter/tx_commit.rb +29 -0
  51. data/examples/eventmachine_adapter/tx_rollback.rb +29 -0
  52. data/examples/eventmachine_adapter/tx_select.rb +27 -0
  53. data/examples/socket_adapter/basics.rb +19 -0
  54. data/examples/socket_adapter/connection.rb +53 -0
  55. data/examples/socket_adapter/multiple_connections.rb +17 -0
  56. data/irb.rb +66 -0
  57. data/lib/amq/client.rb +15 -0
  58. data/lib/amq/client/adapter.rb +356 -0
  59. data/lib/amq/client/adapters/coolio.rb +221 -0
  60. data/lib/amq/client/adapters/event_machine.rb +228 -0
  61. data/lib/amq/client/adapters/socket.rb +89 -0
  62. data/lib/amq/client/channel.rb +338 -0
  63. data/lib/amq/client/connection.rb +246 -0
  64. data/lib/amq/client/entity.rb +117 -0
  65. data/lib/amq/client/exceptions.rb +86 -0
  66. data/lib/amq/client/exchange.rb +163 -0
  67. data/lib/amq/client/extensions/rabbitmq.rb +5 -0
  68. data/lib/amq/client/extensions/rabbitmq/basic.rb +36 -0
  69. data/lib/amq/client/extensions/rabbitmq/confirm.rb +254 -0
  70. data/lib/amq/client/framing/io/frame.rb +32 -0
  71. data/lib/amq/client/framing/string/frame.rb +62 -0
  72. data/lib/amq/client/logging.rb +56 -0
  73. data/lib/amq/client/mixins/anonymous_entity.rb +21 -0
  74. data/lib/amq/client/mixins/status.rb +62 -0
  75. data/lib/amq/client/protocol/get_response.rb +55 -0
  76. data/lib/amq/client/queue.rb +450 -0
  77. data/lib/amq/client/settings.rb +83 -0
  78. data/lib/amq/client/version.rb +5 -0
  79. data/spec/benchmarks/adapters.rb +77 -0
  80. data/spec/client/framing/io_frame_spec.rb +57 -0
  81. data/spec/client/framing/string_frame_spec.rb +57 -0
  82. data/spec/client/protocol/get_response_spec.rb +79 -0
  83. data/spec/integration/coolio/basic_ack_spec.rb +41 -0
  84. data/spec/integration/coolio/basic_get_spec.rb +73 -0
  85. data/spec/integration/coolio/basic_return_spec.rb +33 -0
  86. data/spec/integration/coolio/channel_close_spec.rb +26 -0
  87. data/spec/integration/coolio/channel_flow_spec.rb +46 -0
  88. data/spec/integration/coolio/spec_helper.rb +31 -0
  89. data/spec/integration/coolio/tx_commit_spec.rb +40 -0
  90. data/spec/integration/coolio/tx_rollback_spec.rb +44 -0
  91. data/spec/integration/eventmachine/basic_ack_spec.rb +40 -0
  92. data/spec/integration/eventmachine/basic_get_spec.rb +73 -0
  93. data/spec/integration/eventmachine/basic_return_spec.rb +35 -0
  94. data/spec/integration/eventmachine/channel_close_spec.rb +26 -0
  95. data/spec/integration/eventmachine/channel_flow_spec.rb +32 -0
  96. data/spec/integration/eventmachine/spec_helper.rb +22 -0
  97. data/spec/integration/eventmachine/tx_commit_spec.rb +47 -0
  98. data/spec/integration/eventmachine/tx_rollback_spec.rb +35 -0
  99. data/spec/regression/bad_frame_slicing_in_adapters_spec.rb +59 -0
  100. data/spec/spec_helper.rb +24 -0
  101. data/spec/unit/client/adapter_spec.rb +49 -0
  102. data/spec/unit/client/entity_spec.rb +49 -0
  103. data/spec/unit/client/logging_spec.rb +60 -0
  104. data/spec/unit/client/mixins/status_spec.rb +72 -0
  105. data/spec/unit/client/settings_spec.rb +27 -0
  106. data/spec/unit/client_spec.rb +11 -0
  107. data/tasks.rb +11 -0
  108. metadata +202 -0
@@ -0,0 +1,83 @@
1
+ # encoding: utf-8
2
+
3
+ require "amq/protocol/client" # TODO: "amq/protocol/constants"
4
+
5
+ module AMQ
6
+ module Client
7
+ # @see AMQ::Client::Settings.configure
8
+ module Settings
9
+ # Default connection settings used by AMQ clients
10
+ #
11
+ # @see AMQ::Client::Settings.configure
12
+ def self.default
13
+ {
14
+ # server
15
+ :host => "127.0.0.1",
16
+ :port => AMQ::Protocol::DEFAULT_PORT,
17
+
18
+ # login
19
+ :user => "guest",
20
+ :pass => "guest",
21
+ :vhost => "/",
22
+
23
+ # connection timeout
24
+ :timeout => nil,
25
+
26
+ # logging
27
+ :logging => false,
28
+
29
+ # ssl
30
+ :ssl => false,
31
+
32
+ # broker
33
+ # if you want to load broker-specific extensions
34
+ :broker => nil,
35
+
36
+ :frame_max => 131072
37
+ }
38
+ end
39
+
40
+ # Merges given configuration parameters with defaults and returns
41
+ # the result.
42
+ #
43
+ # @param [Hash] Configuration parameters to use.
44
+ #
45
+ # @option settings [String] :host ("127.0.0.1") Hostname AMQ broker runs on.
46
+ # @option settings [String] :port (5672) Port AMQ broker listens on.
47
+ # @option settings [String] :vhost ("/") Virtual host to use.
48
+ # @option settings [String] :user ("guest") Username to use for authentication.
49
+ # @option settings [String] :pass ("guest") Password to use for authentication.
50
+ # @option settings [String] :ssl (false) Should be use TLS (SSL) for connection?
51
+ # @option settings [String] :timeout (nil) Connection timeout.
52
+ # @option settings [String] :logging (false) Turns logging on or off.
53
+ # @option settings [String] :broker (nil) Broker name (use if you intend to use broker-specific features).
54
+ # @option settings [Fixnum] :frame_max (131072) Maximum frame size to use. If broker cannot support frames this large, broker's maximum value will be used instead.
55
+ #
56
+ # @return [Hash] Merged configuration parameters.
57
+ def self.configure(settings = nil)
58
+ case settings
59
+ when Hash then
60
+ if username = settings.delete(:username)
61
+ settings[:user] ||= username
62
+ end
63
+
64
+ if password = settings.delete(:password)
65
+ settings[:pass] ||= password
66
+ end
67
+
68
+
69
+ self.default.merge(settings)
70
+ when String then
71
+ settings = self.parse_amqp_url(settings)
72
+ self.default.merge(settings)
73
+ when NilClass then
74
+ self.default
75
+ end
76
+ end
77
+
78
+ def self.parse_amqp_url(string)
79
+ raise NotImplementedError.new
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,5 @@
1
+ module AMQ
2
+ module Client
3
+ VERSION = "0.5.0".freeze
4
+ end
5
+ end
@@ -0,0 +1,77 @@
1
+ Bundler.setup
2
+ Bundler.require(:default)
3
+ $LOAD_PATH.unshift(File.expand_path("../../../lib", __FILE__))
4
+
5
+ require "amq/client/adapters/coolio"
6
+ require "amq/client/adapters/event_machine"
7
+ require "amq/client/queue"
8
+ require "amq/client/exchange"
9
+
10
+ TOTAL_MESSAGES = 10000
11
+ # Short messages
12
+ # Cool.io
13
+ coolio_start = Time.now
14
+ AMQ::Client::Coolio.connect(:port => 5672, :vhost => "/amq_client_testbed") do |client|
15
+ received_messages = 0
16
+ channel = AMQ::Client::Channel.new(client, 1)
17
+ channel.open { }
18
+ queue = AMQ::Client::Queue.new(client, channel)
19
+ queue.declare(false, false, false, true) { }
20
+
21
+ queue.bind("amq.fanout") { }
22
+
23
+ queue.consume(true) do |_, consumer_tag|
24
+
25
+ queue.on_delivery do |_, header, payload, consumer_tag, delivery_tag, redelivered, exchange, routing_key|
26
+ received_messages += 1
27
+ if received_messages == TOTAL_MESSAGES
28
+ client.disconnect do
29
+ Coolio::Loop.default.stop
30
+ end
31
+ end
32
+ end
33
+
34
+ exchange = AMQ::Client::Exchange.new(client, channel, "amq.fanout", :fanout)
35
+ TOTAL_MESSAGES.times do |i|
36
+ exchange.publish("Message ##{i}")
37
+ end
38
+ end
39
+ end
40
+ cool.io.run
41
+ coolio_finish = Time.now
42
+
43
+ # Eventmachine
44
+ em_start = Time.now
45
+ EM.run do
46
+ AMQ::Client::EventMachineClient.connect(:port => 5672, :vhost => "/amq_client_testbed") do |client|
47
+ received_messages = 0
48
+ channel = AMQ::Client::Channel.new(client, 1)
49
+ channel.open { }
50
+ queue = AMQ::Client::Queue.new(client, channel)
51
+ queue.declare(false, false, false, true) { }
52
+
53
+ queue.bind("amq.fanout") { }
54
+
55
+ queue.consume(true) do |_, consumer_tag|
56
+
57
+ queue.on_delivery do |_, header, payload, consumer_tag, delivery_tag, redelivered, exchange, routing_key|
58
+ received_messages += 1
59
+ if received_messages == TOTAL_MESSAGES
60
+ client.disconnect do
61
+ EM.stop
62
+ end
63
+ end
64
+ end
65
+
66
+ exchange = AMQ::Client::Exchange.new(client, channel, "amq.fanout", :fanout)
67
+ TOTAL_MESSAGES.times do |i|
68
+ exchange.publish("Message ##{i}")
69
+ end
70
+ end
71
+ end
72
+ end
73
+ em_finish = Time.now
74
+
75
+ puts "Results for #{TOTAL_MESSAGES} messages:"
76
+ puts "\tcool.io adapter: #{sprintf("%.3f", coolio_finish - coolio_start)}s"
77
+ puts "\teventmachine adapter: #{sprintf("%.3f", em_finish - em_start)}s"
@@ -0,0 +1,57 @@
1
+ # encoding: binary
2
+
3
+ require "spec_helper"
4
+ require "stringio"
5
+
6
+ # We need to require AMQ-Protocol manually.
7
+ # In the library this is required in the file
8
+ # amq/client.rb, but this is a unit test and
9
+ # we don't want to mess around with unecessary
10
+ # dependencies.
11
+ require "amq/protocol/client"
12
+ require "amq/protocol/frame"
13
+
14
+ # We have to use Kernel#load so extensions to the
15
+ # Logging module from client.rb will be overridden.
16
+ load "amq/client/framing/io/frame.rb"
17
+
18
+ describe AMQ::Client::Framing::IO do
19
+ subject do
20
+ AMQ::Client::Framing::IO::Frame
21
+ end
22
+
23
+ # Created by:
24
+ # frame = AMQ::Protocol::Queue::Declare.encode(1, "tasks", false, false, false, false, {})
25
+ # frame.encode
26
+ # frame.payload
27
+ before do
28
+ data = ["\x01\x00\x00\x00\x00\x00\b"]
29
+ data << "\x00\n\x00(\x01/\x00\x00"
30
+ data << "\xCE"
31
+ @io = StringIO.new(data.join)
32
+
33
+ subject.stub(:decode_header).with(data.first).and_return([1, 0, data[1].bytesize])
34
+ end
35
+
36
+ it "should be able to decode frame type" do
37
+ subject.decode(@io).should be_kind_of(AMQ::Protocol::MethodFrame)
38
+ end
39
+
40
+ it "should be able to decode channel" do
41
+ subject.decode(@io).channel.should eql(0)
42
+ end
43
+
44
+ it "should be able to decode payload" do
45
+ subject.decode(@io).payload.should eql("\x00\n\x00(\x01/\x00\x00")
46
+ end
47
+
48
+ it "should raise an error if the frame length is miscalculated" do
49
+ pending "How to do that with socket?"
50
+ end
51
+
52
+ it "should raise an error if the frame doesn't end with FINAL_OCTET" do
53
+ data = @io.read[0..-2] + "too long" + "\xCE"
54
+ io = StringIO.new(data)
55
+ lambda { subject.decode(io) }.should raise_error(AMQ::Client::NoFinalOctetError)
56
+ end
57
+ end
@@ -0,0 +1,57 @@
1
+ # encoding: utf-8
2
+
3
+ require "spec_helper"
4
+
5
+ # We need to require AMQ-Protocol manually.
6
+ # In the library this is required in the file
7
+ # amq/client.rb, but this is a unit test and
8
+ # we don't want to mess around with unecessary
9
+ # dependencies.
10
+ require "amq/protocol/client"
11
+ require "amq/protocol/frame"
12
+
13
+ # We have to use Kernel#load so extensions to the
14
+ # Logging module from client.rb will be overridden.
15
+ load "amq/client/framing/string/frame.rb"
16
+
17
+ describe AMQ::Client::Framing::String do
18
+ subject do
19
+ AMQ::Client::Framing::String::Frame
20
+ end
21
+
22
+ # Created by:
23
+ # frame = AMQ::Protocol::Queue::Declare.encode(1, "tasks", false, false, false, false, {})
24
+ # frame.encode
25
+ # frame.payload
26
+ before do
27
+ data = ["\x01\x00\x00\x00\x00\x00\b"]
28
+ data << "\x00\n\x00(\x01/\x00\x00"
29
+ data << "\xCE"
30
+ @string = data.join
31
+
32
+ subject.stub(:decode_header).with(data.first).and_return([1, 0, data[1].bytesize])
33
+ end
34
+
35
+ it "should be able to decode frame type" do
36
+ subject.decode(@string).should be_kind_of(AMQ::Protocol::MethodFrame)
37
+ end
38
+
39
+ it "should be able to decode channel" do
40
+ subject.decode(@string).channel.should eql(0)
41
+ end
42
+
43
+ it "should be able to decode payload" do
44
+ subject.decode(@string).payload.should eql("\x00\n\x00(\x01/\x00\x00")
45
+ end
46
+
47
+ it "should raise an error if the frame length is miscalculated" do
48
+ data = @string[0..-2] + "too long" + "\xCE"
49
+ string = String.new(data)
50
+ lambda { subject.decode(string) }.should raise_error(AMQ::Client::BadLengthError)
51
+ end
52
+
53
+ it "should raise an error if the frame doesn't end with FINAL_OCTET" do
54
+ string = @string[0..-2] + "x"
55
+ lambda { subject.decode(string) }.should raise_error(AMQ::Client::NoFinalOctetError)
56
+ end
57
+ end
@@ -0,0 +1,79 @@
1
+ # encoding: utf-8
2
+
3
+ require "spec_helper"
4
+
5
+ require "amq/protocol/client"
6
+ require "amq/client/protocol/get_response"
7
+ # require "amq/protocol/frame"
8
+ #
9
+ # # We have to use Kernel#load so extensions to the
10
+ # # Logging module from client.rb will be overridden.
11
+ # load "amq/client/framing/string/frame.rb"
12
+
13
+ describe AMQ::Protocol::GetResponse do
14
+ describe "when method is GetOk" do
15
+ before { @method = AMQ::Protocol::Basic::GetOk.new("dtag", true, "tasks", "foo", 1) }
16
+ subject { AMQ::Protocol::GetResponse.new(@method) }
17
+
18
+ it "should NOT be #empty?" do
19
+ should_not be_empty
20
+ end
21
+
22
+ it "should have #delivery_tag" do
23
+ subject.delivery_tag.should eql("dtag")
24
+ end
25
+
26
+ it "should have #redelivered" do
27
+ subject.redelivered.should be_true
28
+ end
29
+
30
+ it "should have #exchange" do
31
+ subject.exchange.should eql("tasks")
32
+ end
33
+
34
+ it "should have #routing_key" do
35
+ subject.routing_key.should eql("foo")
36
+ end
37
+
38
+ it "should have #message_count" do
39
+ subject.message_count.should eql(1)
40
+ end
41
+
42
+ it "should NOT have #cluster_id" do
43
+ subject.cluster_id.should be_nil
44
+ end
45
+ end
46
+
47
+ describe "when method is GetEmpty" do
48
+ before { @method = AMQ::Protocol::Basic::GetEmpty.new("ID") }
49
+ subject { AMQ::Protocol::GetResponse.new(@method) }
50
+
51
+ it "should be #empty?" do
52
+ should be_empty
53
+ end
54
+
55
+ it "should NOT have #delivery_tag" do
56
+ subject.delivery_tag.should be_nil
57
+ end
58
+
59
+ it "should NOT have #redelivered" do
60
+ subject.redelivered.should be_nil
61
+ end
62
+
63
+ it "should NOT have #exchange" do
64
+ subject.exchange.should be_nil
65
+ end
66
+
67
+ it "should NOT have #routing_key" do
68
+ subject.routing_key.should be_nil
69
+ end
70
+
71
+ it "should NOT have #message_count" do
72
+ subject.message_count.should be_nil
73
+ end
74
+
75
+ it "should have #cluster_id" do
76
+ subject.cluster_id.should eql("ID")
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+ require 'integration/coolio/spec_helper'
3
+
4
+ require 'spec_helper'
5
+ require 'integration/coolio/spec_helper'
6
+
7
+ describe "AMQ::Client::Coolio", "Basic.Ack", :nojruby => true do
8
+ include EventedSpec::SpecHelper
9
+ default_timeout 1
10
+
11
+ context "sending 100 messages" do
12
+ let(:messages) { (0..99).map {|i| "Message #{i}" } }
13
+
14
+ it "should receive & acknowledge all the messages" do
15
+ @received_messages = []
16
+ coolio_amqp_connect do |client|
17
+ channel = AMQ::Client::Channel.new(client, 1)
18
+ channel.open do
19
+ queue = AMQ::Client::Queue.new(client, channel)
20
+ queue.declare.bind("amq.fanout")
21
+
22
+ queue.consume do |_, consumer_tag|
23
+ queue.on_delivery do |method, header, payload|
24
+ queue.acknowledge(method.delivery_tag)
25
+ @received_messages << payload
26
+ end
27
+
28
+ exchange = AMQ::Client::Exchange.new(client, channel, "amq.fanout", :fanout)
29
+ messages.each do |message|
30
+ exchange.publish(message)
31
+ end
32
+ end # consume
33
+ end # open
34
+
35
+ done(0.8) {
36
+ @received_messages.size.should == messages.size
37
+ }
38
+ end # coolio_amqp_connect
39
+ end # it
40
+ end # context
41
+ end # describe
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+ require 'integration/coolio/spec_helper'
3
+
4
+ describe "AMQ::Client::Coolio", "Basic.Get", :nojruby => true do
5
+ include EventedSpec::SpecHelper
6
+ default_timeout 1
7
+
8
+ context "when set two messages beforehand" do
9
+ let(:messages) { ["message 1", "message 2"] }
10
+
11
+ it "synchronously fetches all the messages" do
12
+ @received_messages = []
13
+ coolio_amqp_connect do |client|
14
+ channel = AMQ::Client::Channel.new(client, 1)
15
+
16
+ channel.open do
17
+ queue = AMQ::Client::Queue.new(client, channel)
18
+ queue.declare(false, false, false, true) do
19
+ queue.bind("amq.fanout")
20
+ exchange = AMQ::Client::Exchange.new(client, channel, "amq.fanout", :fanout)
21
+
22
+ messages.each do |message|
23
+ exchange.publish(message) do
24
+ puts "Published a message: #{message}"
25
+ end
26
+ end
27
+
28
+ queue.get(true) do |method, header, payload|
29
+ puts "Got #{payload}"
30
+ @received_messages << payload
31
+ end
32
+ queue.get(true) do |method, header, payload|
33
+ puts "Got #{payload}"
34
+ @received_messages << payload
35
+ end
36
+
37
+ done(0.5) {
38
+ @received_messages.should =~ messages
39
+
40
+ queue.purge
41
+ }
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+
49
+ context "when sent no messages beforehand" do
50
+ it "should receive nils" do
51
+ coolio_amqp_connect do |client|
52
+ channel = AMQ::Client::Channel.new(client, 1)
53
+ channel.open do
54
+ queue = AMQ::Client::Queue.new(client, channel)
55
+ queue.declare(false, false, false, true)
56
+ queue.bind("amq.fanout")
57
+
58
+ exchange = AMQ::Client::Exchange.new(client, channel, "amq.fanout", :fanout)
59
+
60
+ queue.get(true) do |method, header, payload|
61
+ header.should be_nil
62
+ payload.should be_nil
63
+
64
+ done {
65
+ queue.purge
66
+ }
67
+ end # get
68
+ end
69
+ end # em_amqp_connect
70
+ end # it
71
+
72
+ end # context
73
+ end