PROTON-1720: [ruby] Add missing connection options, update Connection API.
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/055f3dc6 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/055f3dc6 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/055f3dc6 Branch: refs/heads/go1 Commit: 055f3dc6b94332c353bf3e93aa7318209a2d9e6d Parents: c4d5fde Author: Alan Conway <[email protected]> Authored: Fri Dec 15 16:53:30 2017 -0500 Committer: Alan Conway <[email protected]> Committed: Fri Dec 15 17:37:05 2017 -0500 ---------------------------------------------------------------------- examples/ruby/server.rb | 4 +- proton-c/bindings/ruby/lib/core/connection.rb | 121 +++++++++++-------- .../bindings/ruby/lib/core/connection_driver.rb | 1 - proton-c/bindings/ruby/lib/core/container.rb | 3 +- proton-c/bindings/ruby/lib/core/message.rb | 6 +- proton-c/bindings/ruby/lib/core/transport.rb | 54 ++------- proton-c/bindings/ruby/lib/reactor/container.rb | 2 +- proton-c/bindings/ruby/lib/types/array.rb | 6 +- proton-c/bindings/ruby/lib/types/hash.rb | 13 +- proton-c/bindings/ruby/lib/util/deprecation.rb | 7 +- .../bindings/ruby/tests/old_examples/server.rb | 4 +- proton-c/bindings/ruby/tests/test_container.rb | 63 +++++++++- 12 files changed, 171 insertions(+), 113 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/055f3dc6/examples/ruby/server.rb ---------------------------------------------------------------------- diff --git a/examples/ruby/server.rb b/examples/ruby/server.rb index 7a4832b..7538d61 100644 --- a/examples/ruby/server.rb +++ b/examples/ruby/server.rb @@ -36,8 +36,8 @@ class Server < Qpid::Proton::MessagingHandler end def on_connection_open(connection) - if connection.remote_offered_capabilities && - connection.remote_offered_capabilities.contain?("ANONYMOUS-RELAY") + if connection.offered_capabilities && + connection.offered_capabilities.contain?("ANONYMOUS-RELAY") @relay = connection.open_sender({:target => nil}) end end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/055f3dc6/proton-c/bindings/ruby/lib/core/connection.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/core/connection.rb b/proton-c/bindings/ruby/lib/core/connection.rb index b9b5746..f9a80a7 100644 --- a/proton-c/bindings/ruby/lib/core/connection.rb +++ b/proton-c/bindings/ruby/lib/core/connection.rb @@ -20,32 +20,17 @@ module Qpid::Proton # An AMQP connection. class Connection < Endpoint - include Util::Deprecation - - # @private PROTON_METHOD_PREFIX = "pn_connection" - # @private include Util::Wrapper + include Util::Deprecation - # @!attribute hostname - # @return [String] The AMQP hostname for the connection. - proton_set_get :hostname - - # @!attribute user - # @return [String] User name used for authentication (outgoing connection) or the authenticated user name (incoming connection) - proton_set_get :user - - private - - proton_set :password - attr_accessor :overrides - attr_accessor :session_policy - + # @private def self.wrap(impl) return nil if impl.nil? self.fetch_instance(impl, :pn_connection_attachments) || Connection.new(impl) end + # @private def initialize(impl = Cproton.pn_connection) super() @impl = impl @@ -56,7 +41,19 @@ module Qpid::Proton self.class.store_instance(self, :pn_connection_attachments) end - public + # @return [String] The AMQP hostname for the connection. + def virtual_host() Cproton.pn_connection_remote_hostname(@impl); end + deprecated_alias :remote_hostname, :virtual_host + + # @!attribute hostname + # @deprecated use {#virtual_host} + proton_set_get :hostname + + # @return [String] User name used for authentication (outgoing connection) + # or the authenticated user name (incoming connection) + def user() + Cproton.pn_connection_get_user(impl) or (connection.transport && connection.transport.user) + end # @deprecated no replacement def overrides?() deprecated __method__; false; end @@ -68,49 +65,54 @@ module Qpid::Proton def connection() self; end # @return [Transport, nil] transport bound to this connection, or nil if unbound. - # def transport() Transport.wrap(Cproton.pn_connection_transport(@impl)); end - # @return AMQP container ID advertised by the remote peer - def remote_container_id() Cproton.pn_connection_remote_container(@impl); end - - alias remote_container remote_container_id + # @return AMQP container ID advertised by the remote peer. + # To get the local container ID use {#container} and {Container#id} + def container_id() Cproton.pn_connection_remote_container(@impl); end + deprecated_alias :remote_container, :container_id # @return [Container] the container managing this connection attr_reader :container - # @return AMQP container ID for the local end of the connection - def container_id() Cproton.pn_connection_get_container(@impl); end - - # @return [String] hostname used by the remote end of the connection - def remote_hostname() Cproton.pn_connection_remote_hostname(@impl); end - # @return [Array<Symbol>] offered capabilities provided by the remote peer - def remote_offered_capabilities + def offered_capabilities Codec::Data.to_object(Cproton.pn_connection_remote_offered_capabilities(@impl)) end + deprecated_alias :remote_offered_capabilities, :offered_capabilities # @return [Array<Symbol>] desired capabilities provided by the remote peer - def remote_desired_capabilities + def desired_capabilities Codec::Data.to_object(Cproton.pn_connection_remote_desired_capabilities(@impl)) end + deprecated_alias :remote_desired_capabilities, :desired_capabilities # @return [Hash] connection-properties provided by the remote peer - def remote_properties - Codec::Data.to_object(Cproton.pn_connection_remote_properites(@impl)) + def properties + Codec::Data.to_object(Cproton.pn_connection_remote_properties(@impl)) end + deprecated_alias :remote_properties, :properties # Open the local end of the connection. # # @option opts [MessagingHandler] :handler handler for events related to this connection. - # @option opts [String] :user user-name for authentication. - # @option opts [String] :password password for authentication. - # @option opts [Numeric] :idle_timeout seconds before closing an idle connection - # @option opts [Boolean] :sasl_enabled Enable or disable SASL. - # @option opts [Boolean] :sasl_allow_insecure_mechs Allow mechanisms that disclose clear text - # passwords, even over an insecure connection. - # @option opts [String] :sasl_allowed_mechs the allowed SASL mechanisms for use on the connection. - # @option opts [String] :container_id AMQP container ID, normally provided by {Container} + # + # @option opts [String] :user User name for authentication + # @option opts [String] :password Authentication secret + # @option opts [String] :virtual_host Virtual host name + # @option opts [String] :container_id (provided by {Container}) override advertised container-id + # + # @option opts [Hash<Symbol=>Object>] :properties Application-defined properties + # @option opts [Array<Symbol>] :offered_capabilities Extensions the endpoint supports + # @option opts [Array<Symbol>] :desired_capabilities Extensions the endpoint can use + # + # @option opts [Numeric] :idle_timeout Seconds before closing an idle connection + # @option opts [Integer] :max_sessions Limit the number of active sessions + # @option opts [Integer] :max_frame_size Limit the size of AMQP frames + # + # @option opts [Boolean] :sasl_enabled (false) Enable or disable SASL. + # @option opts [Boolean] :sasl_allow_insecure_mechs (false) Allow mechanisms send secrets in clear text + # @option opts [String] :sasl_allowed_mechs SASL mechanisms allowed by this end of the connection # def open(opts=nil) return if local_active? @@ -129,23 +131,44 @@ module Qpid::Proton Cproton.pn_connection_set_container(@impl, cid) Cproton.pn_connection_set_user(@impl, opts[:user]) if opts[:user] Cproton.pn_connection_set_password(@impl, opts[:password]) if opts[:password] - @link_prefix = opts[:link_prefix] || container_id - Codec::Data.from_object(Cproton.pn_connection_offered_capabilities(@impl), opts[:offered_capabilities]) - Codec::Data.from_object(Cproton.pn_connection_desired_capabilities(@impl), opts[:desired_capabilities]) - Codec::Data.from_object(Cproton.pn_connection_properties(@impl), opts[:properties]) + Cproton.pn_connection_set_hostname(@impl, opts[:virtual_host]) if opts[:virtual_host] + @link_prefix = opts[:link_prefix] || cid + Codec::Data.from_object(Cproton.pn_connection_offered_capabilities(@impl), + Types.symbol_array(opts[:offered_capabilities])) + Codec::Data.from_object(Cproton.pn_connection_desired_capabilities(@impl), + Types.symbol_array(opts[:desired_capabilities])) + Codec::Data.from_object(Cproton.pn_connection_properties(@impl), + Types.symbol_keys(opts[:properties])) end # Idle-timeout advertised by the remote peer, in seconds. - # Set by {Connection#open} with the +:idle_timeout+ option. # @return [Numeric] Idle-timeout advertised by the remote peer, in seconds. - # @return [nil] if The peer does not advertise an idle time-out - # @option :idle_timeout (see {#open}) + # @return [nil] if the peer does not advertise an idle time-out def idle_timeout() if transport && (t = transport.remote_idle_timeout) Rational(t, 1000) # More precise than Float end end + # Session limit advertised by the remote peer. See {Connection#open :max_sessions} + # @return [Integer] maximum number of sessions per connection allowed by remote peer. + # @return [nil] no specific limit is set. + def max_sessions() + raise StateError, "connection not bound to transport" unless transport + max = transport.remote_channel_max + return max.zero? ? nil : max + end + + # Maximum frame size, in bytes, advertised by the remote peer. + # See {Connection#open :max_frame_size} + # @return [Integer] maximum frame size + # @return [nil] no limit + def max_frame_size() + raise StateError, "connection not bound to transport" unless transport + max = transport.remote_max_frame + return max.zero? ? nil : max + end + # Closes the local end of the connection. The remote end may or may not be closed. # @param error [Condition] Optional error condition to send with the close. def close(error=nil) http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/055f3dc6/proton-c/bindings/ruby/lib/core/connection_driver.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/core/connection_driver.rb b/proton-c/bindings/ruby/lib/core/connection_driver.rb index 2ce132e..12dcb68 100644 --- a/proton-c/bindings/ruby/lib/core/connection_driver.rb +++ b/proton-c/bindings/ruby/lib/core/connection_driver.rb @@ -181,7 +181,6 @@ module Qpid::Proton case e.method # Events that affect the driver when :on_transport_tail_closed then close_read when :on_transport_head_closed then close_write - when :on_transport_authenticated then connection.user = transport.user end e.dispatch @adapter end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/055f3dc6/proton-c/bindings/ruby/lib/core/container.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/core/container.rb b/proton-c/bindings/ruby/lib/core/container.rb index 5dc9d60..9d9463e 100644 --- a/proton-c/bindings/ruby/lib/core/container.rb +++ b/proton-c/bindings/ruby/lib/core/container.rb @@ -125,7 +125,8 @@ module Qpid::Proton @handler = args[0] unless @id else raise ArgumentError, "wrong number of arguments (given #{args.size}, expected 0..2" end - @adapter = Handler::Adapter.adapt(@handler) + # Use an empty messaging adapter to give default behaviour if there's no global handler. + @adapter = Handler::Adapter.adapt(@handler) || Handler::MessagingAdapter.new(nil) @id = (@id || SecureRandom.uuid).freeze # Implementation note: http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/055f3dc6/proton-c/bindings/ruby/lib/core/message.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/core/message.rb b/proton-c/bindings/ruby/lib/core/message.rb index 8b13de2..9afaa0a 100644 --- a/proton-c/bindings/ruby/lib/core/message.rb +++ b/proton-c/bindings/ruby/lib/core/message.rb @@ -73,8 +73,10 @@ module Qpid::Proton # @private def pre_encode # encode elements from the message - Codec::Data.from_object(Cproton::pn_message_properties(@impl), [email protected]? && @properties) - Codec::Data.from_object(Cproton::pn_message_instructions(@impl), [email protected]? && @instructions) + Codec::Data.from_object(Cproton::pn_message_properties(@impl), + [email protected]? && Types.symbol_keys!(@properties)) + Codec::Data.from_object(Cproton::pn_message_instructions(@impl), + [email protected]? && Types.symbol_keys!(@instructions)) if @annotations # Make sure keys are symbols @annotations.keys.each do |k| @annotations[k.to_sym] = @annotations.delete(k) unless k.is_a? Symbol http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/055f3dc6/proton-c/bindings/ruby/lib/core/transport.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/core/transport.rb b/proton-c/bindings/ruby/lib/core/transport.rb index 9b36335..eb5fb01 100644 --- a/proton-c/bindings/ruby/lib/core/transport.rb +++ b/proton-c/bindings/ruby/lib/core/transport.rb @@ -18,49 +18,7 @@ module Qpid::Proton - # A transport is used by a connection to interface with the network. - # - # A transport is associated with, at most, one Connection. - # - # == Client And Server Mode - # - # Initially, a transport is configured to be a client tranpsort. It can be - # configured to act as a server when it is created. - # - # A client transport initiates outgoing connections. - # - # A client transport must be configured with the protocol layers to use and - # cannot configure itself automatically. - # - # A server transport accepts incoming connections. It can automatically - # configure itself to include the various protocol layers depending on the - # incoming protocol headers. - # - # == Tracing Data - # - # Data can be traced into and out of the transport programmatically by setting - # the #trace level to one of the defined trace values (TRACE_RAW, TRACE_FRM or - # TRACE_DRV). Tracing can also be turned off programmatically by setting the - # #trace level to TRACE_OFF. - # - # @example - # - # # turns on frame tracing - # @transport.trace = Qpid::Proton::Transport::TRACE_FRM - # - # # ... do something where the frames are of interest, such as debugging - # - # # turn tracing off again - # @transport.trace = Qpid::Proton::Transport::TRACE_NONE - # - # Tracing can also be enabled from the command line by defining the similarly - # named environment variable before starting a Proton application: - # - # @example - # - # # enable tracing from the command line - # PN_TRACE_FRM=1 ruby my_proton_app.rb - # + # @deprecated all important features are available from {#Connection} class Transport include Util::Deprecation @@ -78,6 +36,7 @@ module Qpid::Proton # Log driver related events; i.e., initialization, end of stream, etc. TRACE_DRV = Cproton::PN_TRACE_DRV + proton_get :user # @!attribute channel_max # @@ -94,8 +53,8 @@ module Qpid::Proton # @!attribute max_frame_size # # @return [Integer] The maximum frame size. - # - proton_set_get :max_frame_size + proton_set_get :max_frame + proton_get :remote_max_frame # @!attribute [r] remote_max_frame_size # @@ -394,14 +353,15 @@ module Qpid::Proton end # @private + # Options are documented {Connection#open}, keep that consistent with this def apply opts sasl if opts[:sasl_enabled] # Explicitly enabled unless opts.include?(:sasl_enabled) && !opts[:sasl_enabled] # Not explicitly disabled sasl.allowed_mechs = opts[:sasl_allowed_mechs] if opts.include? :sasl_allowed_mechs sasl.allow_insecure_mechs = opts[:sasl_allow_insecure_mechs] if opts.include? :sasl_allow_insecure_mechs end - self.channel_max= opts[:channel_max] if opts.include? :channel_max - self.max_frame_size= opts[:max_frame_size] if opts.include? :max_frame_size + self.channel_max= opts[:max_sessions] if opts.include? :max_sessions + self.max_frame = opts[:max_frame_size] if opts.include? :max_frame_size # NOTE: The idle_timeout option is in Numeric *seconds*, can be Integer, Float or Rational. # This is consistent with idiomatic ruby. # The transport #idle_timeout property is in *milliseconds* passed direct to C. http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/055f3dc6/proton-c/bindings/ruby/lib/reactor/container.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/reactor/container.rb b/proton-c/bindings/ruby/lib/reactor/container.rb index 22cb0e8..98c35e2 100644 --- a/proton-c/bindings/ruby/lib/reactor/container.rb +++ b/proton-c/bindings/ruby/lib/reactor/container.rb @@ -31,7 +31,7 @@ module Qpid::Proton # @deprecated use {Qpid::Proton::Container} def initialize(handlers, opts=nil) deprecated Qpid::Proton::Reactor::Container, Qpid::Proton::Container - h = handlers || (opts && opts[:global_handler]) + h = handlers || (opts && opts[:global_handler]) || Handler::ReactorMessagingAdapter.new(nil) id = opts && opts[:container_id] super(h, id) end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/055f3dc6/proton-c/bindings/ruby/lib/types/array.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/types/array.rb b/proton-c/bindings/ruby/lib/types/array.rb index 7a20adb..d7e15e6 100644 --- a/proton-c/bindings/ruby/lib/types/array.rb +++ b/proton-c/bindings/ruby/lib/types/array.rb @@ -51,7 +51,11 @@ module Qpid::Proton @type, @descriptor = type, descriptor raise ArgumentError, "no type specified for array" if @type.nil? super elements if elements - @proton_array_header = ArrayHeader.new(@type, @descriptor) # Deprecated + end + + # @deprecated backwards compatibility {UniformArray} + def proton_array_header + @proton_array_header ||= ArrayHeader.new(@type, @descriptor) # Deprecated end # @return [Type] Array elements must be convertible to this AMQP type http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/055f3dc6/proton-c/bindings/ruby/lib/types/hash.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/types/hash.rb b/proton-c/bindings/ruby/lib/types/hash.rb index 2d78f74..2702ab2 100644 --- a/proton-c/bindings/ruby/lib/types/hash.rb +++ b/proton-c/bindings/ruby/lib/types/hash.rb @@ -23,7 +23,6 @@ # @private class Hash # :nodoc: - # @deprecated def proton_data_put(data) @@ -37,3 +36,15 @@ class Hash # :nodoc: data.map end end + +module Qpid::Proton::Types + # @private + def self.symbol_keys(h) + h && h.reduce({}) { |x, (k, v)| x[k.to_sym] = v; x } + end + + # @private + def self.symbol_array(a) + a && UniformArray.new(SYMBOL, a.collect { |v| v.to_sym }) + end +end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/055f3dc6/proton-c/bindings/ruby/lib/util/deprecation.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/util/deprecation.rb b/proton-c/bindings/ruby/lib/util/deprecation.rb index d9d0563..4980a9e 100644 --- a/proton-c/bindings/ruby/lib/util/deprecation.rb +++ b/proton-c/bindings/ruby/lib/util/deprecation.rb @@ -20,10 +20,13 @@ module Qpid::Proton::Util module Deprecation MATCH_DIR = /#{File.dirname(File.dirname(__FILE__))}/ + DEPRECATE_FULL_TRACE = false + def self.deprecated(old, new=nil) replace = new ? "use `#{new}`" : "internal use only" - line = caller.find { |l| not MATCH_DIR.match(l) } - warn "[DEPRECATION] `#{old}` is deprecated, #{replace}. Called from #{line}" + + from = DEPRECATE_FULL_TRACE ? caller(2).join("\n") : caller.find { |l| not MATCH_DIR.match(l) } + warn "[DEPRECATION] `#{old}` is deprecated, #{replace}. Called from #{from}" end def deprecated(*arg) Deprecation.deprecated(*arg); end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/055f3dc6/proton-c/bindings/ruby/tests/old_examples/server.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/tests/old_examples/server.rb b/proton-c/bindings/ruby/tests/old_examples/server.rb index 265a63d..1908c24 100644 --- a/proton-c/bindings/ruby/tests/old_examples/server.rb +++ b/proton-c/bindings/ruby/tests/old_examples/server.rb @@ -36,8 +36,8 @@ class Server < Qpid::Proton::Handler::MessagingHandler end def on_connection_opened(event) - if event.connection.remote_offered_capabilities && - event.connection.remote_offered_capabilities.contain?("ANONYMOUS-RELAY") + if event.connection.offered_capabilities && + event.connection.offered_capabilities.contain?("ANONYMOUS-RELAY") @relay = @container.create_sender(@conn, nil) end end http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/055f3dc6/proton-c/bindings/ruby/tests/test_container.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/tests/test_container.rb b/proton-c/bindings/ruby/tests/test_container.rb index d8bd52c..82c34e2 100644 --- a/proton-c/bindings/ruby/tests/test_container.rb +++ b/proton-c/bindings/ruby/tests/test_container.rb @@ -75,7 +75,7 @@ class ContainerTest < Minitest::Test end class CloseOnOpenHandler < TestHandler - def on_connection_open(c) c.close; end + def on_connection_open(c) super; c.close; end end def test_auto_stop_one @@ -159,6 +159,61 @@ class ContainerTest < Minitest::Test assert_match(/badconnect.example.com:999/, c.transport.condition.description) end + # Verify that connection options are sent to the peer and available as Connection methods + def test_connection_options + # Note: user, password and sasl_xxx options are tested by ContainerSASLTest below + server_handler = Class.new(MessagingHandler) do + def on_error(e) raise e.inspect; end + def on_connection_open(c) @connection = c + c.open({ + :virtual_host => "server.to.client", + :properties => { :server => :client }, + :offered_capabilities => [ :s1 ], + :desired_capabilities => [ :s2 ], + :container_id => "box", + }) + c.close + end + attr_reader :connection + end.new + # Transport options must be provided to the listener, by Connection#open it is too late + cont = TestContainer.new(nil, { + :handler => server_handler, + :idle_timeout => 88, + :max_sessions =>1000, + :max_frame_size => 8888, + }) + client = cont.connect(cont.url, + {:virtual_host => "client.to.server", + :properties => { :foo => :bar, "str" => "str" }, + :offered_capabilities => [:c1 ], + :desired_capabilities => ["c2" ], + :idle_timeout => 42, + :max_sessions =>100, + :max_frame_size => 4096, + :container_id => "bowl" + }) + cont.run + c = server_handler.connection + assert_equal "client.to.server", c.virtual_host + assert_equal({ :foo => :bar, :str => "str" }, c.properties) + assert_equal([:c1], c.offered_capabilities) + assert_equal([:c2], c.desired_capabilities) + assert_equal 21, c.idle_timeout # Proton divides by 2 + assert_equal 100, c.max_sessions + assert_equal 4096, c.max_frame_size + assert_equal "bowl", c.container_id + + c = client + assert_equal "server.to.client", c.virtual_host + assert_equal({ :server => :client }, c.properties) + assert_equal([:s1], c.offered_capabilities) + assert_equal([:s2], c.desired_capabilities) + assert_equal "box", c.container_id + assert_equal 8888, c.max_frame_size + assert_equal 44, c.idle_timeout # Proton divides by 2 + assert_equal 100, c.max_sessions + end end @@ -184,7 +239,7 @@ class ContainerSASLTest < Minitest::Test if connection == @client connection.close else - @auth_user = connection.transport.sasl.user + @auth_user = connection.user end end end @@ -231,7 +286,7 @@ mech_list: EXTERNAL DIGEST-MD5 SCRAM-SHA-1 CRAM-MD5 PLAIN ANONYMOUS def test_sasl_anonymous() s = SASLHandler.new("amqp://", {:sasl_allowed_mechs => "ANONYMOUS"}) TestContainer.new(s, {:sasl_allowed_mechs => "ANONYMOUS"}, __method__).run - assert_nil(s.connections[0].user) + assert_equal "anonymous", s.connections[0].user end def test_sasl_plain_url() @@ -239,7 +294,7 @@ mech_list: EXTERNAL DIGEST-MD5 SCRAM-SHA-1 CRAM-MD5 PLAIN ANONYMOUS # Use default realm with URL, should authenticate with "default_password" opts = {:sasl_allowed_mechs => "PLAIN", :sasl_allow_insecure_mechs => true} s = SASLHandler.new("amqp://user:default_password@", opts) - TestContainer.new(s, opts).run + TestContainer.new(s, opts, __method__).run assert_equal(2, s.connections.size) assert_equal("user", s.auth_user) end --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
