Repository: qpid-proton Updated Branches: refs/heads/master 3904225c7 -> 4856b6e18
PROTON-1064: [ruby] New Container with native ruby IO Minor doc correction, modify Container initialize parameters to match C++. Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/4856b6e1 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/4856b6e1 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/4856b6e1 Branch: refs/heads/master Commit: 4856b6e1816ad3be4dc9fb06289701a1835aa7a9 Parents: 3904225 Author: Alan Conway <acon...@redhat.com> Authored: Wed Nov 8 11:02:35 2017 -0500 Committer: Alan Conway <acon...@redhat.com> Committed: Wed Nov 8 11:02:35 2017 -0500 ---------------------------------------------------------------------- proton-c/bindings/ruby/lib/core/container.rb | 27 +++++++++++---------- proton-c/bindings/ruby/lib/core/listener.rb | 5 +++- proton-c/bindings/ruby/tests/test_container.rb | 22 ++++++++--------- 3 files changed, 29 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4856b6e1/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 29df51b..6e14d11 100644 --- a/proton-c/bindings/ruby/lib/core/container.rb +++ b/proton-c/bindings/ruby/lib/core/container.rb @@ -22,7 +22,6 @@ require 'set' require_relative 'listener' module Qpid::Proton - # An AMQP container manages a set of {Connection}s which contain {#Sender} and # {#Receiver} links to transfer messages. # @@ -49,20 +48,22 @@ module Qpid::Proton # Create a new Container # - # @param opts [Hash] Options - # @option opts [String] :id A unique ID for this container. Defaults to a random UUID. - # @option opts [MessagingHandler] :handler Default handler for connections + # @param handler [MessagingHandler] Optional default handler for connections # that do not have their own handler (see {#connect} and {#listen}) # - # @note In a multi-threaded, multi-connection container the default - # handler can be called concurrently for different connections. An - # individual handler attached to a single connection is never called - # concurrently, so that is the recommended approach for multi-threading. - def initialize(opts = {}) - opts = { :handler => opts } unless opts.is_a? Hash # Allow handler as only parameter - opts = { :handler => opts } if opts.is_a? String # Allow ID as only parameter option - @handler = opts[:handler] - @id = String.new(opts[:id] || SecureRandom.uuid).freeze + # @note For multi-threaded code, it is recommended to use a separate + # handler instance for every connection, as a shared global handler can be + # called concurrently for every connection that uses it. + # @param id [String] A unique ID for this container. Defaults to a random UUID. + # + def initialize(handler = nil, id = nil) + # Allow ID as sole argument + (handler, id = nil, handler.to_str) if (id.nil? && handler.respond_to?(:to_str)) + raise TypeError, "Expected MessagingHandler, got #{handler.class}" if handler && !handler.is_a?(Qpid::Proton::Handler::MessagingHandler) + + # TODO aconway 2017-11-08: allow handlers, opts for backwards compat? + @handler = handler + @id = (id || SecureRandom.uuid).freeze @work = Queue.new @work.push self # Let the first #run thread select @wake = IO.pipe http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4856b6e1/proton-c/bindings/ruby/lib/core/listener.rb ---------------------------------------------------------------------- diff --git a/proton-c/bindings/ruby/lib/core/listener.rb b/proton-c/bindings/ruby/lib/core/listener.rb index e5f5c0d..85dc976 100644 --- a/proton-c/bindings/ruby/lib/core/listener.rb +++ b/proton-c/bindings/ruby/lib/core/listener.rb @@ -20,7 +20,10 @@ module Qpid::Proton # A listener for incoming connections. # - # Create with {Container#listen} or {Container#listen_with} + # Create with {Container#listen} or {Container#listen_io}. + # To control the handler and connection options applied to incoming connections, + # pass a {ListenerHandler} on creation. + # class Listener # The listener's container attr_reader :container http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4856b6e1/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 41fa133..51b1760 100644 --- a/proton-c/bindings/ruby/tests/test_container.rb +++ b/proton-c/bindings/ruby/tests/test_container.rb @@ -28,8 +28,8 @@ Disposition = Qpid::Proton::Disposition # Container that listens on a random port class TestContainer < Container - def initialize(opts = {}, lopts = {}) - super opts + def initialize(handler, lopts = {}, id=nil) + super handler, id @server = TCPServer.open(0) @listener = listen_io(@server, ListenOnceHandler.new(lopts)) end @@ -69,7 +69,7 @@ class ContainerTest < Minitest::Test end end.new - c = TestContainer.new({:id => __method__.to_s, :handler => rh}) + c = TestContainer.new(rh, {}, "test_simple") c.connect(c.url, {:handler => sh}).open_sender({:name => "testlink"}) c.run @@ -85,8 +85,8 @@ class ContainerTest < Minitest::Test end def test_auto_stop - c1 = Container.new "#{__method__}1" - c2 = Container.new "#{__method__}2" + c1 = Container.new + c2 = Container.new # A listener and a connection t1 = 3.times.collect { Thread.new { c1.run } } @@ -104,7 +104,7 @@ class ContainerTest < Minitest::Test end def test_auto_stop_listener_only - c1 = Container.new "#{__method__}1" + c1 = Container.new # Listener only, external close t1 = Thread.new { c1.run } l = c1.listen_io(TCPServer.new(0)) @@ -113,7 +113,7 @@ class ContainerTest < Minitest::Test end def test_stop - c = Container.new __method__ + c = Container.new c.auto_stop = false l = c.listen_io(TCPServer.new(0)) c.connect("amqp://:#{l.to_io.addr[1]}") @@ -211,7 +211,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({:id => __method__.to_s, :handler => s}, {:sasl_allowed_mechs => "ANONYMOUS"}).run + TestContainer.new(s, {:sasl_allowed_mechs => "ANONYMOUS"}).run assert_nil(s.connections[0].user) end @@ -220,7 +220,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({:id => __method__.to_s, :handler => s}, opts).run + TestContainer.new(s, opts).run assert_equal(2, s.connections.size) assert_equal("user", s.auth_user) end @@ -231,7 +231,7 @@ mech_list: EXTERNAL DIGEST-MD5 SCRAM-SHA-1 CRAM-MD5 PLAIN ANONYMOUS opts = {:sasl_allowed_mechs => "PLAIN",:sasl_allow_insecure_mechs => true, :user => 'user', :password => 'default_password' } s = SASLHandler.new("amqp://", opts) - TestContainer.new({:id => __method__.to_s, :handler => s}, {:sasl_allowed_mechs => "PLAIN",:sasl_allow_insecure_mechs => true}).run + TestContainer.new(s, {:sasl_allowed_mechs => "PLAIN",:sasl_allow_insecure_mechs => true}).run assert_equal(2, s.connections.size) assert_equal("user", s.auth_user) end @@ -240,7 +240,7 @@ mech_list: EXTERNAL DIGEST-MD5 SCRAM-SHA-1 CRAM-MD5 PLAIN ANONYMOUS def test_disallow_insecure() # Don't set allow_insecure_mechs, but try to use PLAIN s = SASLHandler.new("amqp://user:password@", {:sasl_allowed_mechs => "PLAIN", :sasl_allow_insecure_mechs => true}) - e = assert_raises(TestError) { TestContainer.new({:id => __method__.to_s, :handler => s}, {:sasl_allowed_mechs => "PLAIN"}).run } + e = assert_raises(TestError) { TestContainer.new(s, {:sasl_allowed_mechs => "PLAIN"}).run } assert_match(/PN_TRANSPORT_ERROR.*unauthorized-access/, e.to_s) end end --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org