You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2018/03/21 13:13:33 UTC

[2/4] qpid-proton git commit: PROTON-1790: [ruby] Link name not generated

PROTON-1790: [ruby] Link name not generated


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/de8df025
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/de8df025
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/de8df025

Branch: refs/heads/master
Commit: de8df0252ea66630d953ad9ba8d8c80f5983a9e3
Parents: c553d3d
Author: Alan Conway <ac...@redhat.com>
Authored: Tue Mar 20 17:10:30 2018 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Wed Mar 21 09:13:14 2018 -0400

----------------------------------------------------------------------
 proton-c/bindings/ruby/lib/core/session.rb     | 10 ++--
 proton-c/bindings/ruby/lib/core/terminus.rb    |  6 +++
 proton-c/bindings/ruby/tests/test_container.rb | 51 +++++++++++++++++----
 proton-c/bindings/ruby/tests/test_tools.rb     | 18 +++++---
 4 files changed, 64 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/de8df025/proton-c/bindings/ruby/lib/core/session.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/core/session.rb b/proton-c/bindings/ruby/lib/core/session.rb
index 5508fd9..91dabcf 100644
--- a/proton-c/bindings/ruby/lib/core/session.rb
+++ b/proton-c/bindings/ruby/lib/core/session.rb
@@ -114,16 +114,14 @@ module Qpid::Proton
     # @param opts [Hash] receiver options, see {Receiver#open}
     # @return [Receiver]
     def open_receiver(opts=nil) 
-      name = opts[:name] rescue connection.link_name
-      Receiver.new(Cproton.pn_receiver(@impl, name)).open(opts)
+      Receiver.new(Cproton.pn_receiver(@impl, link_name(opts))).open(opts)
     end
 
     # Create and open a {Sender} link, see {#open}
     # @param opts [Hash] sender options, see {Sender#open}
     # @return [Sender]
     def open_sender(opts=nil)
-      name = opts[:name] rescue connection.link_name
-      Sender.new(Cproton.pn_sender(@impl, name)).open(opts)
+      Sender.new(Cproton.pn_sender(@impl, link_name(opts))).open(opts)
     end
 
     # Get the links on this Session.
@@ -150,6 +148,10 @@ module Qpid::Proton
 
     private
 
+    def link_name(opts)
+      (opts.respond_to?(:to_hash) && opts[:name]) || connection.link_name
+    end
+
     def _local_condition
       Cproton.pn_session_condition(@impl)
     end

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/de8df025/proton-c/bindings/ruby/lib/core/terminus.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/core/terminus.rb b/proton-c/bindings/ruby/lib/core/terminus.rb
index ffa1e7d..a7a8af0 100644
--- a/proton-c/bindings/ruby/lib/core/terminus.rb
+++ b/proton-c/bindings/ruby/lib/core/terminus.rb
@@ -243,6 +243,12 @@ module Qpid::Proton
       end
     end
 
+    def inspect()
+      "\#<#{self.class}: address=#{address.inspect} dynamic?=#{dynamic?.inspect}>"
+    end
+
+    def to_s() inspect; end
+
     can_raise_error([:type=, :address=, :durability=, :expiry_policy=,
                      :timeout=, :dynamic=, :distribution_mode=, :copy],
                     :error_class => Qpid::Proton::LinkError)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/de8df025/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 29cf985..b35e24f 100644
--- a/proton-c/bindings/ruby/tests/test_container.rb
+++ b/proton-c/bindings/ruby/tests/test_container.rb
@@ -65,8 +65,7 @@ class ContainerTest < MiniTest::Test
 
     c = ServerContainer.new(__method__, {:handler => receive_handler})
     c.connect(c.url, {:handler => send_handler}).open_sender({:name => "testlink"})
-    send_handler.wait
-    c.wait
+    c.run
 
     assert send_handler.accepted
     assert_equal "testlink", receive_handler.link.name
@@ -160,9 +159,8 @@ class ContainerTest < MiniTest::Test
   def test_connection_options
     # Note: user, password and sasl_xxx options are tested by ContainerSASLTest below
     server_handler = Class.new(ExceptionMessagingHandler) do
-      def initialize() @connection = Queue.new; end
       def on_connection_open(c)
-        @connection << c
+        @connection = c
         c.open({
           :virtual_host => "server.to.client",
           :properties => { :server => :client },
@@ -191,10 +189,9 @@ class ContainerTest < MiniTest::Test
         :max_frame_size => 4096,
         :container_id => "bowl"
       })
-    server = server_handler.connection.pop
-    cont.wait
+    cont.run
 
-    c = server
+    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)
@@ -215,6 +212,39 @@ class ContainerTest < MiniTest::Test
     assert_equal 100, c.max_sessions
   end
 
+  def test_link_options
+    server_handler = Class.new(ExceptionMessagingHandler) do
+      def initialize() @links = []; end
+      attr_reader :links
+      def on_sender_open(l) @links << l; end
+      def on_receiver_open(l) @links << l; end
+    end.new
+
+    client_handler = Class.new(ExceptionMessagingHandler) do
+      def on_connection_open(c)
+        @links = [];
+        @links << c.open_sender("s1")
+        @links << c.open_sender({:name => "s2-n", :target => "s2-t", :source => "s2-s"})
+        @links << c.open_receiver("r1")
+        @links << c.open_receiver({:name => "r2-n", :target => "r2-t", :source => "r2-s"})
+        c.close
+      end
+      attr_reader :links
+    end.new
+
+    cont = ServerContainer.new(__method__, {:handler => server_handler }, 1)
+    cont.connect(cont.url, :handler => client_handler)
+    cont.run
+
+    expect = ["test_link_options/1", "s2-n", "test_link_options/2", "r2-n"]
+    assert_equal expect, server_handler.links.map(&:name)
+    assert_equal expect, client_handler.links.map(&:name)
+
+    expect = [[nil,"s1"], ["s2-s","s2-t"], ["r1",nil], ["r2-s","r2-t"]]
+    assert_equal expect, server_handler.links.map { |l| [l.remote_source.address, l.remote_target.address] }
+    assert_equal expect, client_handler.links.map { |l| [l.source.address, l.target.address] }
+  end
+
   # Test for time out on connecting to an unresponsive server
   def test_idle_timeout_server_no_open
     s = TCPServer.new(0)
@@ -228,7 +258,7 @@ class ContainerTest < MiniTest::Test
 
   # Test for time out on unresponsive client
   def test_idle_timeout_client
-    server = ServerContainer.new("#{__method__}.server", {:idle_timeout => 0.1})
+    server = ServerContainerThread.new("#{__method__}.server", {:idle_timeout => 0.1})
     client_handler = Class.new(ExceptionMessagingHandler) do
       def initialize() @ready, @block = Queue.new, Queue.new; end
       attr_reader :ready, :block
@@ -237,11 +267,12 @@ class ContainerTest < MiniTest::Test
         @block.pop             # Block the client so the server will time it out
       end
     end.new
+
     client = Container.new(nil, "#{__method__}.client")
     client.connect(server.url, {:handler => client_handler})
     client_thread = Thread.new { client.run }
     client_handler.ready.pop    # Wait till the client has connected
-    server.wait                 # Exits when the connection closes from idle-timeout
+    server.join                 # Exits when the connection closes from idle-timeout
     client_handler.block.push nil   # Unblock the client
     ex = assert_raises(Qpid::Proton::Condition) { client_thread.join }
     assert_match(/resource-limit-exceeded/, ex.to_s)
@@ -250,7 +281,7 @@ class ContainerTest < MiniTest::Test
   # Make sure we stop and clean up if an aborted connection causes a handler to raise.
   # https://issues.apache.org/jira/browse/PROTON-1791
   def test_handler_raise
-    cont = ServerContainer.new(__method__)
+    cont = ServerContainer.new(__method__, {}, 0) # Don't auto-close the listener
     client_handler = Class.new(MessagingHandler) do
       # TestException is < Exception so not handled by default rescue clause
       def on_connection_open(c) raise TestException.new("Bad Dog"); end

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/de8df025/proton-c/bindings/ruby/tests/test_tools.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/tests/test_tools.rb b/proton-c/bindings/ruby/tests/test_tools.rb
index a4110d4..911669b 100644
--- a/proton-c/bindings/ruby/tests/test_tools.rb
+++ b/proton-c/bindings/ruby/tests/test_tools.rb
@@ -147,23 +147,27 @@ DriverPair = Struct.new(:client, :server) do
   end
 end
 
-# Container that listens on a random port and runs itself
+# Container that listens on a random port
 class ServerContainer < Qpid::Proton::Container
   include Qpid::Proton
 
-  def initialize(id=nil, listener_opts=nil, n=0)
+  def initialize(id=nil, listener_opts=nil, n=1)
     super id
     @listener = listen_io(TCPServer.open(0), ListenOnceHandler.new(listener_opts, n))
-    @thread = Thread.new { run }
   end
 
   attr_reader :listener
 
   def port() @listener.port; end
   def url() "amqp://:#{port}"; end
-
-  # NOTE: the test must have already waited for some events to happen before
-  # calling this, otherwise the listener can close before it opens and nothing happens
-  def wait() @listener.close; @thread.join; end
 end
 
+class ServerContainerThread < ServerContainer
+  def initialize(id=nil, listener_opts=nil, n=1)
+    super
+    @thread = Thread.new { run }
+  end
+
+  attr_reader :thread
+  def join() @thread.join; end
+end


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org