You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kg...@apache.org on 2013/04/26 16:35:49 UTC

svn commit: r1476228 - in /qpid/proton/trunk: proton-c/include/proton/ tests/python/proton_tests/ tests/tools/ tests/tools/apps/c/

Author: kgiusti
Date: Fri Apr 26 14:35:48 2013
New Revision: 1476228

URL: http://svn.apache.org/r1476228
Log:
PROTON-301: modify test infrastructure to allow valgrind tests of SSL

Modified:
    qpid/proton/trunk/proton-c/include/proton/messenger.h
    qpid/proton/trunk/tests/python/proton_tests/common.py
    qpid/proton/trunk/tests/python/proton_tests/soak.py
    qpid/proton/trunk/tests/python/proton_tests/ssl.py
    qpid/proton/trunk/tests/tools/apps/c/msgr-common.c
    qpid/proton/trunk/tests/tools/apps/c/msgr-common.h
    qpid/proton/trunk/tests/tools/apps/c/msgr-recv.c
    qpid/proton/trunk/tests/tools/apps/c/msgr-send.c
    qpid/proton/trunk/tests/tools/soak-check

Modified: qpid/proton/trunk/proton-c/include/proton/messenger.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/messenger.h?rev=1476228&r1=1476227&r2=1476228&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/messenger.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/messenger.h Fri Apr 26 14:35:48 2013
@@ -62,7 +62,8 @@ PN_EXTERN pn_messenger_t *pn_messenger(c
  */
 PN_EXTERN const char *pn_messenger_name(pn_messenger_t *messenger);
 
-/** Sets the certificate file for a Messenger.
+/** Provides a certificate that will be used to identify the local
+ * Messenger to the peer.
  *
  * @param[in] messenger the messenger
  * @param[in] certificate a path to a certificate file
@@ -71,14 +72,15 @@ PN_EXTERN const char *pn_messenger_name(
  */
 PN_EXTERN int pn_messenger_set_certificate(pn_messenger_t *messenger, const char *certificate);
 
-/** Gets the certificate file fora Messenger.
+/** Gets the certificate file for a Messenger.
  *
  * @param[in] messenger the messenger
  * @return the certificate file path
  */
 PN_EXTERN const char *pn_messenger_get_certificate(pn_messenger_t *messenger);
 
-/** Sets the private key file for a Messenger.
+/** Provides the private key that was used to sign the certificate.
+ * See ::pn_messenger_set_certificate
  *
  * @param[in] messenger the Messenger
  * @param[in] private_key a path to a private key file
@@ -110,7 +112,9 @@ PN_EXTERN int pn_messenger_set_password(
  */
 PN_EXTERN const char *pn_messenger_get_password(pn_messenger_t *messenger);
 
-/** Sets the trusted certificates database for a Messenger.
+/** Sets the trusted certificates database for a Messenger.  Messenger
+ * will use this database to validate the certificate provided by the
+ * peer.
  *
  * @param[in] messenger the messenger
  * @param[in] cert_db a path to the certificates database

Modified: qpid/proton/trunk/tests/python/proton_tests/common.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tests/python/proton_tests/common.py?rev=1476228&r1=1476227&r2=1476228&view=diff
==============================================================================
--- qpid/proton/trunk/tests/python/proton_tests/common.py (original)
+++ qpid/proton/trunk/tests/python/proton_tests/common.py Fri Apr 26 14:35:48 2013
@@ -20,6 +20,8 @@
 from random import randint
 from threading import Thread
 from socket import socket, AF_INET, SOCK_STREAM
+from subprocess import Popen,PIPE
+import sys, os
 from proton import Driver, Connection, SASL, Endpoint, Delivery
 
 
@@ -269,3 +271,246 @@ class TestServerDrain(TestServer):
     if link.credit == 0:
       link.flow(self.credit_batch)
 
+
+#
+# Classes that wrap the messenger applications msgr-send and msgr-recv.
+# These applications reside in the tests/tools/apps directory
+#
+
+class MessengerApp(object):
+    """ Interface to control a MessengerApp """
+    def __init__(self):
+        self._cmdline = None
+        # options common to Receivers and Senders:
+        self.ca_db = None
+        self.certificate = None
+        self.privatekey = None
+        self.password = None
+
+    def start(self, verbose=False):
+        """ Begin executing the test """
+        if sys.platform.startswith("java"):
+            raise common.Skipped("Skipping soak tests - not supported under Jython")
+        cmd = self.cmdline()
+        self._verbose = verbose
+        if self._verbose:
+            print("COMMAND='%s'" % str(cmd))
+        #print("ENV='%s'" % str(os.environ.copy()))
+        try:
+            self._process = Popen(cmd, stdout=PIPE, bufsize=4096)
+        except OSError, e:
+            assert False, "Unable to execute command '%s', is it in your PATH?" % cmd[0]
+        self._ready()  # wait for it to initialize
+
+    def stop(self):
+        """ Signal the client to start clean shutdown """
+        pass
+
+    def wait(self):
+        """ Wait for client to complete """
+        self._output = self._process.communicate()
+        if self._verbose:
+            print("OUTPUT='%s'" % self.stdout())
+
+    def status(self):
+        """ Return status from client process """
+        return self._process.returncode
+
+    def stdout(self):
+        #self._process.communicate()[0]
+        return self._output[0]
+
+    def cmdline(self):
+        if not self._cmdline:
+            self._build_command()
+        return self._cmdline
+
+    def _build_command(self):
+        assert False, "_build_command() needs override"
+
+    def _ready(self):
+        assert False, "_ready() needs override"
+
+    def _do_common_options(self):
+        """ Common option handling """
+        if self.ca_db is not None:
+            self._cmdline.append("-T")
+            self._cmdline.append(str(self.ca_db))
+        if self.certificate is not None:
+            self._cmdline.append("-C")
+            self._cmdline.append(str(self.certificate))
+        if self.privatekey is not None:
+            self._cmdline.append("-K")
+            self._cmdline.append(str(self.privatekey))
+        if self.password is not None:
+            self._cmdline.append("-P")
+            self._cmdline.append("pass:" + str(self.password))
+
+
+class MessengerSender(MessengerApp):
+    """ Interface to configure a sending MessengerApp """
+    def __init__(self):
+        MessengerApp.__init__(self)
+        self._command = None
+        # @todo make these properties
+        self.targets = []
+        self.send_count = None
+        self.msg_size = None
+        self.send_batch = None
+        self.outgoing_window = None
+        self.report_interval = None
+        self.get_reply = False
+        self.timeout = None
+        self.incoming_window = None
+        self.recv_count = None
+        self.name = None
+
+    # command string?
+    def _build_command(self):
+        self._cmdline = self._command
+        self._do_common_options()
+        assert self.targets, "Missing targets, required for sender!"
+        self._cmdline.append("-a")
+        self._cmdline.append(",".join(self.targets))
+        if self.send_count is not None:
+            self._cmdline.append("-c")
+            self._cmdline.append(str(self.send_count))
+        if self.msg_size is not None:
+            self._cmdline.append("-b")
+            self._cmdline.append(str(self.msg_size))
+        if self.send_batch is not None:
+            self._cmdline.append("-p")
+            self._cmdline.append(str(self.send_batch))
+        if self.outgoing_window is not None:
+            self._cmdline.append("-w")
+            self._cmdline.append(str(self.outgoing_window))
+        if self.report_interval is not None:
+            self._cmdline.append("-e")
+            self._cmdline.append(str(self.report_interval))
+        if self.get_reply:
+            self._cmdline.append("-R")
+        if self.timeout is not None:
+            self._cmdline.append("-t")
+            self._cmdline.append(str(self.timeout))
+        if self.incoming_window is not None:
+            self._cmdline.append("-W")
+            self._cmdline.append(str(self.incoming_window))
+        if self.recv_count is not None:
+            self._cmdline.append("-B")
+            self._cmdline.append(str(self.recv_count))
+        if self.name is not None:
+            self._cmdline.append("-N")
+            self._cmdline.append(str(self.name))
+
+    def _ready(self):
+        pass
+
+
+class MessengerReceiver(MessengerApp):
+    """ Interface to configure a receiving MessengerApp """
+    def __init__(self):
+        MessengerApp.__init__(self)
+        self._command = None
+        # @todo make these properties
+        self.subscriptions = []
+        self.receive_count = None
+        self.recv_count = None
+        self.incoming_window = None
+        self.timeout = None
+        self.report_interval = None
+        self.send_reply = False
+        self.outgoing_window = None
+        self.forwards = []
+        self.name = None
+
+    # command string?
+    def _build_command(self):
+        self._cmdline = self._command
+        self._do_common_options()
+        self._cmdline += ["-X", "READY"]
+        assert self.subscriptions, "Missing subscriptions, required for receiver!"
+        self._cmdline.append("-a")
+        self._cmdline.append(",".join(self.subscriptions))
+        if self.receive_count is not None:
+            self._cmdline.append("-c")
+            self._cmdline.append(str(self.receive_count))
+        if self.recv_count is not None:
+            self._cmdline.append("-b")
+            self._cmdline.append(str(self.recv_count))
+        if self.incoming_window is not None:
+            self._cmdline.append("-w")
+            self._cmdline.append(str(self.incoming_window))
+        if self.timeout is not None:
+            self._cmdline.append("-t")
+            self._cmdline.append(str(self.timeout))
+        if self.report_interval is not None:
+            self._cmdline.append("-e")
+            self._cmdline.append(str(self.report_interval))
+        if self.send_reply:
+            self._cmdline.append("-R")
+        if self.outgoing_window is not None:
+            self._cmdline.append("-W")
+            self._cmdline.append(str(self.outgoing_window))
+        if self.forwards:
+            self._cmdline.append("-F")
+            self._cmdline.append(",".join(self.forwards))
+        if self.name is not None:
+            self._cmdline.append("-N")
+            self._cmdline.append(str(self.name))
+
+    def _ready(self):
+        """ wait for subscriptions to complete setup. """
+        r = self._process.stdout.readline()
+        assert r == "READY\n", "Unexpected input while waiting for receiver to initialize: %s" % r
+
+class MessengerSenderC(MessengerSender):
+    def __init__(self):
+        MessengerSender.__init__(self)
+        self._command = ["msgr-send"]
+
+class MessengerSenderValgrind(MessengerSenderC):
+    """ Run the C sender under Valgrind
+    """
+    def __init__(self, suppressions=None):
+        if "VALGRIND" not in os.environ:
+            raise Skipped("Skipping test - $VALGRIND not set.")
+        MessengerSenderC.__init__(self)
+        if not suppressions:
+            suppressions = os.path.join(os.path.dirname(__file__),
+                                        "valgrind.supp" )
+        self._command = ["valgrind", "--error-exitcode=1", "--quiet",
+                         "--trace-children=yes", "--leak-check=full",
+                         "--suppressions=%s" % suppressions] + self._command
+
+class MessengerReceiverC(MessengerReceiver):
+    def __init__(self):
+        MessengerReceiver.__init__(self)
+        self._command = ["msgr-recv"]
+
+class MessengerReceiverValgrind(MessengerReceiverC):
+    """ Run the C receiver under Valgrind
+    """
+    def __init__(self, suppressions=None):
+        if "VALGRIND" not in os.environ:
+            raise Skipped("Skipping test - $VALGRIND not set.")
+        MessengerReceiverC.__init__(self)
+        if not suppressions:
+            suppressions = os.path.join(os.path.dirname(__file__),
+                                        "valgrind.supp" )
+        self._command = ["valgrind", "--error-exitcode=1", "--quiet",
+                         "--trace-children=yes", "--leak-check=full",
+                         "--suppressions=%s" % suppressions] + self._command
+
+class MessengerSenderPython(MessengerSender):
+    def __init__(self):
+        MessengerSender.__init__(self)
+        self._command = ["msgr-send.py"]
+
+
+class MessengerReceiverPython(MessengerReceiver):
+    def __init__(self):
+        MessengerReceiver.__init__(self)
+        self._command = ["msgr-recv.py"]
+
+
+

Modified: qpid/proton/trunk/tests/python/proton_tests/soak.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tests/python/proton_tests/soak.py?rev=1476228&r1=1476227&r2=1476228&view=diff
==============================================================================
--- qpid/proton/trunk/tests/python/proton_tests/soak.py (original)
+++ qpid/proton/trunk/tests/python/proton_tests/soak.py Fri Apr 26 14:35:48 2013
@@ -16,234 +16,22 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-import os, common
-from subprocess import Popen,PIPE
-from proton import *
+import os
 import sys
-
-#
-# Classes that wrap the messenger applications
-#
-
-class MessengerApp(object):
-    """ Interface to control a MessengerApp """
-    def __init__(self):
-        self._cmdline = None
-
-    def start(self, verbose=False):
-        """ Begin executing the test """
-        if sys.platform.startswith("java"):
-            raise common.Skipped("Skipping soak tests - not supported under Jython")
-        cmd = self.cmdline()
-        self._verbose = verbose
-        if self._verbose:
-            print("COMMAND='%s'" % str(cmd))
-        #print("ENV='%s'" % str(os.environ.copy()))
-        try:
-            self._process = Popen(cmd, stdout=PIPE, bufsize=4096)
-        except OSError, e:
-            assert False, "Unable to execute command '%s', is it in your PATH?" % cmd[0]
-        self._ready()  # wait for it to initialize
-
-    def stop(self):
-        """ Signal the client to start clean shutdown """
-        pass
-
-    def wait(self):
-        """ Wait for client to complete """
-        self._output = self._process.communicate()
-        if self._verbose:
-            print("OUTPUT='%s'" % self.stdout())
-
-    def status(self):
-        """ Return status from client process """
-        return self._process.returncode
-
-    def stdout(self):
-        #self._process.communicate()[0]
-        return self._output[0]
-
-    def cmdline(self):
-        if not self._cmdline:
-            self._build_command()
-        return self._cmdline
-
-    def _build_command(self):
-        assert False, "_build_command() needs override"
-
-    def _ready(self):
-        assert False, "_ready() needs override"
-
-
-
-class MessengerSender(MessengerApp):
-    """ Interface to configure a sending MessengerApp """
-    def __init__(self):
-        MessengerApp.__init__(self)
-        self._command = None
-        # @todo make these properties
-        self.targets = []
-        self.send_count = None
-        self.msg_size = None
-        self.send_batch = None
-        self.outgoing_window = None
-        self.report_interval = None
-        self.get_reply = False
-        self.timeout = None
-        self.incoming_window = None
-        self.recv_count = None
-        self.name = None
-
-    # command string?
-    def _build_command(self):
-        self._cmdline = self._command
-        assert self.targets, "Missing targets, required for sender!"
-        self._cmdline.append("-a")
-        self._cmdline.append(",".join(self.targets))
-        if self.send_count is not None:
-            self._cmdline.append("-c")
-            self._cmdline.append(str(self.send_count))
-        if self.msg_size is not None:
-            self._cmdline.append("-b")
-            self._cmdline.append(str(self.msg_size))
-        if self.send_batch is not None:
-            self._cmdline.append("-p")
-            self._cmdline.append(str(self.send_batch))
-        if self.outgoing_window is not None:
-            self._cmdline.append("-w")
-            self._cmdline.append(str(self.outgoing_window))
-        if self.report_interval is not None:
-            self._cmdline.append("-e")
-            self._cmdline.append(str(self.report_interval))
-        if self.get_reply:
-            self._cmdline.append("-R")
-        if self.timeout is not None:
-            self._cmdline.append("-t")
-            self._cmdline.append(str(self.timeout))
-        if self.incoming_window is not None:
-            self._cmdline.append("-W")
-            self._cmdline.append(str(self.incoming_window))
-        if self.recv_count is not None:
-            self._cmdline.append("-B")
-            self._cmdline.append(str(self.recv_count))
-        if self.name is not None:
-            self._cmdline.append("-N")
-            self._cmdline.append(str(self.name))
-
-    def _ready(self):
-        pass
-
-
-class MessengerReceiver(MessengerApp):
-    """ Interface to configure a receiving MessengerApp """
-    def __init__(self):
-        MessengerApp.__init__(self)
-        self._command = None
-        # @todo make these properties
-        self.subscriptions = []
-        self.receive_count = None
-        self.recv_count = None
-        self.incoming_window = None
-        self.timeout = None
-        self.report_interval = None
-        self.send_reply = False
-        self.outgoing_window = None
-        self.forwards = []
-        self.name = None
-
-    # command string?
-    def _build_command(self):
-        self._cmdline = self._command
-        self._cmdline += ["-X", "READY"]
-        assert self.subscriptions, "Missing subscriptions, required for receiver!"
-        self._cmdline.append("-a")
-        self._cmdline.append(",".join(self.subscriptions))
-        if self.receive_count is not None:
-            self._cmdline.append("-c")
-            self._cmdline.append(str(self.receive_count))
-        if self.recv_count is not None:
-            self._cmdline.append("-b")
-            self._cmdline.append(str(self.recv_count))
-        if self.incoming_window is not None:
-            self._cmdline.append("-w")
-            self._cmdline.append(str(self.incoming_window))
-        if self.timeout is not None:
-            self._cmdline.append("-t")
-            self._cmdline.append(str(self.timeout))
-        if self.report_interval is not None:
-            self._cmdline.append("-e")
-            self._cmdline.append(str(self.report_interval))
-        if self.send_reply:
-            self._cmdline.append("-R")
-        if self.outgoing_window is not None:
-            self._cmdline.append("-W")
-            self._cmdline.append(str(self.outgoing_window))
-        if self.forwards:
-            self._cmdline.append("-F")
-            self._cmdline.append(",".join(self.forwards))
-        if self.name is not None:
-            self._cmdline.append("-N")
-            self._cmdline.append(str(self.name))
-
-    def _ready(self):
-        """ wait for subscriptions to complete setup. """
-        r = self._process.stdout.readline()
-        assert r == "READY\n", "Unexpected input while waiting for receiver to initialize: %s" % r
-
-class MessengerSenderC(MessengerSender):
-    def __init__(self):
-        MessengerSender.__init__(self)
-        self._command = ["msgr-send"]
-
-class MessengerSenderValgrind(MessengerSenderC):
-    """ Run the C sender under Valgrind
-    """
-    def __init__(self, suppressions=None):
-        MessengerSenderC.__init__(self)
-        if not suppressions:
-            suppressions = os.path.join(os.path.dirname(__file__),
-                                        "valgrind.supp" )
-        self._command = ["valgrind", "--error-exitcode=1", "--quiet",
-                         "--trace-children=yes", "--leak-check=full",
-                         "--suppressions=%s" % suppressions] + self._command
-
-class MessengerReceiverC(MessengerReceiver):
-    def __init__(self):
-        MessengerReceiver.__init__(self)
-        self._command = ["msgr-recv"]
-
-class MessengerReceiverValgrind(MessengerReceiverC):
-    """ Run the C receiver under Valgrind
-    """
-    def __init__(self, suppressions=None):
-        MessengerReceiverC.__init__(self)
-        if not suppressions:
-            suppressions = os.path.join(os.path.dirname(__file__),
-                                        "valgrind.supp" )
-        self._command = ["valgrind", "--error-exitcode=1", "--quiet",
-                         "--trace-children=yes", "--leak-check=full",
-                         "--suppressions=%s" % suppressions] + self._command
-
-class MessengerSenderPython(MessengerSender):
-    def __init__(self):
-        MessengerSender.__init__(self)
-        self._command = ["msgr-send.py"]
-
-
-class MessengerReceiverPython(MessengerReceiver):
-    def __init__(self):
-        MessengerReceiver.__init__(self)
-        self._command = ["msgr-recv.py"]
-
+from common import Test, Skipped, free_tcp_ports, \
+    MessengerReceiverC, MessengerSenderC, \
+    MessengerReceiverValgrind, MessengerSenderValgrind, \
+    MessengerReceiverPython, MessengerSenderPython
+from proton import *
 
 #
 # Tests that run the apps
 #
 
-class AppTests(common.Test):
+class AppTests(Test):
 
     def __init__(self, *args):
-        common.Test.__init__(self, *args)
+        Test.__init__(self, *args)
         self.is_valgrind = False
 
     def default(self, name, value, **kwargs):
@@ -251,7 +39,7 @@ class AppTests(common.Test):
             default = kwargs.get("valgrind", value)
         else:
             default = value
-        return common.Test.default(self, name, default, **kwargs)
+        return Test.default(self, name, default, **kwargs)
 
     @property
     def iterations(self):
@@ -282,8 +70,6 @@ class AppTests(common.Test):
         return int(self.default("sender_count", 3, fast=1, valgrind=1))
 
     def valgrind_test(self):
-        if "VALGRIND" not in os.environ:
-            raise common.Skipped("Skipping test - $VALGRIND not set.")
         self.is_valgrind = True
 
     def setup(self):
@@ -326,7 +112,7 @@ class MessengerTests(AppTests):
     def __init__(self, *args):
         AppTests.__init__(self, *args)
 
-    def _do_oneway_test(self, receiver, sender):
+    def _do_oneway_test(self, receiver, sender, domain="amqp"):
         """ Send N messages to a receiver.
         Parameters:
         iterations - repeat the senders this many times
@@ -340,21 +126,21 @@ class MessengerTests(AppTests):
         send_total = send_count * target_count
         receive_total = send_total * iterations
 
-        port = common.free_tcp_ports()[0]
+        port = free_tcp_ports()[0]
 
-        receiver.subscriptions = ["amqp://~0.0.0.0:%s" % port]
+        receiver.subscriptions = ["%s://~0.0.0.0:%s" % (domain, port)]
         receiver.receive_count = receive_total
         receiver.timeout = MessengerTests._timeout
         self.receivers.append( receiver )
 
-        sender.targets = ["amqp://0.0.0.0:%s/X%d" % (port, j) for j in range(target_count)]
+        sender.targets = ["%s://0.0.0.0:%s/X%d" % (domain, port, j) for j in range(target_count)]
         sender.send_count = send_total
         sender.timeout = MessengerTests._timeout
         self.senders.append( sender )
 
         self._do_test(iterations)
 
-    def _do_echo_test(self, receiver, sender):
+    def _do_echo_test(self, receiver, sender, domain="amqp"):
         """ Send N messages to a receiver, which responds to each.
         Parameters:
         iterations - repeat the senders this many times
@@ -370,15 +156,15 @@ class MessengerTests(AppTests):
         send_total = send_count * target_count
         receive_total = send_total * iterations
 
-        port = common.free_tcp_ports()[0]
+        port = free_tcp_ports()[0]
 
-        receiver.subscriptions = ["amqp://~0.0.0.0:%s" % port]
+        receiver.subscriptions = ["%s://~0.0.0.0:%s" % (domain, port)]
         receiver.receive_count = receive_total
         receiver.send_reply = True
         receiver.timeout = MessengerTests._timeout
         self.receivers.append( receiver )
 
-        sender.targets = ["amqp://0.0.0.0:%s/%dY" % (port, j) for j in range(target_count)]
+        sender.targets = ["%s://0.0.0.0:%s/%dY" % (domain, port, j) for j in range(target_count)]
         sender.send_count = send_total
         sender.get_reply = True
         sender.send_batch = send_batch
@@ -387,7 +173,7 @@ class MessengerTests(AppTests):
 
         self._do_test(iterations)
 
-    def _do_relay_test(self, receiver, relay, sender):
+    def _do_relay_test(self, receiver, relay, sender, domain="amqp"):
         """ Send N messages to a receiver, which replies to each and forwards
         each of them to different receiver.
         Parameters:
@@ -406,26 +192,26 @@ class MessengerTests(AppTests):
         send_total = send_count * target_count
         receive_total = send_total * iterations
 
-        port = common.free_tcp_ports()[0]
+        port = free_tcp_ports()[0]
 
-        receiver.subscriptions = ["amqp://~0.0.0.0:%s" % port]
+        receiver.subscriptions = ["%s://~0.0.0.0:%s" % (domain, port)]
         receiver.receive_count = receive_total
         receiver.send_reply = True
         # forward to 'relay' - uses two links
         # ## THIS FAILS:
         # receiver.forwards = ["amqp://Relay/%d" % j for j in range(forward_count)]
-        receiver.forwards = ["amqp://Relay"]
+        receiver.forwards = ["%s://Relay" % domain]
         receiver.timeout = MessengerTests._timeout
         self.receivers.append( receiver )
 
-        relay.subscriptions = ["amqp://0.0.0.0:%s" % port]
+        relay.subscriptions = ["%s://0.0.0.0:%s" % (domain, port)]
         relay.name = "Relay"
         relay.receive_count = receive_total
         relay.timeout = MessengerTests._timeout
         self.receivers.append( relay )
 
         # send to 'receiver'
-        sender.targets = ["amqp://0.0.0.0:%s/X%dY" % (port, j) for j in range(target_count)]
+        sender.targets = ["%s://0.0.0.0:%s/X%dY" % (domain, port, j) for j in range(target_count)]
         sender.send_count = send_total
         sender.get_reply = True
         sender.timeout = MessengerTests._timeout
@@ -434,7 +220,7 @@ class MessengerTests(AppTests):
         self._do_test(iterations)
 
 
-    def _do_star_topology_test(self, r_factory, s_factory):
+    def _do_star_topology_test(self, r_factory, s_factory, domain="amqp"):
         """
         A star-like topology, with a central receiver at the hub, and senders at
         the spokes.  Each sender will connect to each of the ports the receiver is
@@ -459,10 +245,10 @@ class MessengerTests(AppTests):
         send_total = port_count * target_count * send_count
         receive_total = send_total * sender_count * iterations
 
-        ports = common.free_tcp_ports(port_count)
+        ports = free_tcp_ports(port_count)
 
         receiver = r_factory()
-        receiver.subscriptions = ["amqp://~0.0.0.0:%s" % port for port in ports]
+        receiver.subscriptions = ["%s://~0.0.0.0:%s" % (domain, port) for port in ports]
         receiver.receive_count = receive_total
         receiver.send_reply = True
         receiver.timeout = MessengerTests._timeout
@@ -470,7 +256,7 @@ class MessengerTests(AppTests):
 
         for i in range(sender_count):
             sender = s_factory()
-            sender.targets = ["amqp://0.0.0.0:%s/%d" % (port, j) for port in ports for j in range(target_count)]
+            sender.targets = ["%s://0.0.0.0:%s/%d" % (domain, port, j) for port in ports for j in range(target_count)]
             sender.send_count = send_total
             sender.send_batch = send_batch
             sender.get_reply = True
@@ -482,6 +268,9 @@ class MessengerTests(AppTests):
     def test_oneway_C(self):
         self._do_oneway_test(MessengerReceiverC(), MessengerSenderC())
 
+    def test_oneway_C_SSL(self):
+        self._do_oneway_test(MessengerReceiverC(), MessengerSenderC(), "amqps")
+
     def test_oneway_valgrind(self):
         self.valgrind_test()
         self._do_oneway_test(MessengerReceiverValgrind(), MessengerSenderValgrind())
@@ -498,6 +287,9 @@ class MessengerTests(AppTests):
     def test_echo_C(self):
         self._do_echo_test(MessengerReceiverC(), MessengerSenderC())
 
+    def test_echo_C_SSL(self):
+        self._do_echo_test(MessengerReceiverC(), MessengerSenderC(), "amqps")
+
     def test_echo_valgrind(self):
         self.valgrind_test()
         self._do_echo_test(MessengerReceiverValgrind(), MessengerSenderValgrind())
@@ -514,6 +306,9 @@ class MessengerTests(AppTests):
     def test_relay_C(self):
         self._do_relay_test(MessengerReceiverC(), MessengerReceiverC(), MessengerSenderC())
 
+    def test_relay_C_SSL(self):
+        self._do_relay_test(MessengerReceiverC(), MessengerReceiverC(), MessengerSenderC(), "amqps")
+
     def test_relay_valgrind(self):
         self.valgrind_test()
         self._do_relay_test(MessengerReceiverValgrind(), MessengerReceiverValgrind(), MessengerSenderValgrind())
@@ -527,6 +322,9 @@ class MessengerTests(AppTests):
     def test_star_topology_C(self):
         self._do_star_topology_test( MessengerReceiverC, MessengerSenderC )
 
+    def test_star_topology_C_SSL(self):
+        self._do_star_topology_test( MessengerReceiverC, MessengerSenderC, "amqps" )
+
     def test_star_topology_valgrind(self):
         self.valgrind_test()
         self._do_star_topology_test( MessengerReceiverValgrind, MessengerSenderValgrind )

Modified: qpid/proton/trunk/tests/python/proton_tests/ssl.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tests/python/proton_tests/ssl.py?rev=1476228&r1=1476227&r2=1476228&view=diff
==============================================================================
--- qpid/proton/trunk/tests/python/proton_tests/ssl.py (original)
+++ qpid/proton/trunk/tests/python/proton_tests/ssl.py Fri Apr 26 14:35:48 2013
@@ -25,6 +25,8 @@ from common import Skipped
 
 class SslTest(common.Test):
 
+    _timeout = 60
+
     def __init__(self, *args):
         common.Test.__init__(self, *args)
 
@@ -677,3 +679,91 @@ class SslTest(common.Test):
         except TransportException:
             pass
         self.teardown()
+
+
+    def test_defaults_messenger_app(self):
+        """ Test an SSL connection using the Messenger apps (no certificates)
+        """
+        port = common.free_tcp_ports()[0]
+
+        receiver = common.MessengerReceiverC()
+        receiver.subscriptions = ["amqps://~0.0.0.0:%s" % port]
+        receiver.receive_count = 1
+        receiver.timeout = SslTest._timeout
+        receiver.start()
+
+        sender = common.MessengerSenderC()
+        sender.targets = ["amqps://0.0.0.0:%s/X" % port]
+        sender.send_count = 1
+        sender.timeout = SslTest._timeout
+        sender.start()
+        sender.wait()
+        assert sender.status() == 0, "Command '%s' failed" % str(sender.cmdline())
+
+        receiver.wait()
+        assert receiver.status() == 0, "Command '%s' failed" % str(receiver.cmdline())
+
+    def test_server_authentication_messenger_app(self):
+        """ Test an SSL authentication using the Messenger apps.
+        """
+        port = common.free_tcp_ports()[0]
+
+        receiver = common.MessengerReceiverC()
+        receiver.subscriptions = ["amqps://~0.0.0.0:%s" % port]
+        receiver.receive_count = 1
+        receiver.timeout = SslTest._timeout
+        # Note hack - we use the client-certificate for the _server_ because
+        # the client-certificate's common name field is "127.0.0.1", which will
+        # match the target address used by the sender.
+        receiver.certificate = self._testpath("client-certificate.pem")
+        receiver.privatekey = self._testpath("client-private-key.pem")
+        receiver.password = "client-password"
+        receiver.start()
+
+        sender = common.MessengerSenderC()
+        sender.targets = ["amqps://127.0.0.1:%s/X" % port]
+        sender.send_count = 1
+        sender.timeout = SslTest._timeout
+        sender.ca_db = self._testpath("ca-certificate.pem")
+        sender.start()
+        sender.wait()
+        assert sender.status() == 0, "Command '%s' failed" % str(sender.cmdline())
+
+        receiver.wait()
+        assert receiver.status() == 0, "Command '%s' failed" % str(receiver.cmdline())
+
+
+    def DISABLED_test_defaults_valgrind(self):
+        """ Run valgrind over a simple SSL connection (no certificates)
+        """
+        # the openssl libraries produce far too many valgrind errors to be
+        # useful.  AFAIK, there is no way to wriate a valgrind suppression
+        # expression that will ignore all errors from a given library.
+        # Until we can, skip this test.
+        port = common.free_tcp_ports()[0]
+
+        receiver = common.MessengerReceiverValgrind()
+        receiver.subscriptions = ["amqps://~127.0.0.1:%s" % port]
+        receiver.receive_count = 1
+        receiver.timeout = SslTest._timeout
+        receiver.start()
+
+        sender = common.MessengerSenderValgrind()
+        sender.targets = ["amqps://127.0.0.1:%s/X" % port]
+        sender.send_count = 1
+        sender.timeout = SslTest._timeout
+        sender.start()
+        sender.wait()
+        assert sender.status() == 0, "Command '%s' failed" % str(sender.cmdline())
+
+        receiver.wait()
+        assert receiver.status() == 0, "Command '%s' failed" % str(receiver.cmdline())
+
+        # self.server_domain.set_credentials(self._testpath("client-certificate.pem"),
+        #                                    self._testpath("client-private-key.pem"),
+        #                                    "client-password")
+
+        # self.client_domain.set_trusted_ca_db(self._testpath("ca-certificate.pem"))
+        # self.client_domain.set_peer_authentication( SSLDomain.VERIFY_PEER )
+
+

Modified: qpid/proton/trunk/tests/tools/apps/c/msgr-common.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tests/tools/apps/c/msgr-common.c?rev=1476228&r1=1476227&r2=1476228&view=diff
==============================================================================
--- qpid/proton/trunk/tests/tools/apps/c/msgr-common.c (original)
+++ qpid/proton/trunk/tests/tools/apps/c/msgr-common.c Fri Apr 26 14:35:48 2013
@@ -24,6 +24,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/time.h>
+#include <assert.h>
 
 void msgr_die(const char *file, int line, const char *message)
 {
@@ -142,3 +143,18 @@ void statistics_report( Statistics_t *s,
           (s->latency_samples) ? (s->latency_total/s->latency_samples)/1000.0 : 0);
 }
 
+void parse_password( const char *input, char **password )
+{
+    if (strncmp( input, "pass:", 5 ) == 0) {
+        // password provided on command line (not secure, shows up in 'ps')
+        *password = msgr_strdup( input + 5 );
+    } else {    // input assumed to be file containing password
+        FILE *f = fopen( input, "r" );
+        check( f, "Cannot open password file\n" );
+        *password = (char *)malloc(256);    // 256 should be enough for anybody!
+        check( *password, "malloc failure" );
+        int rc = fscanf( f, "%255s", *password );
+        check( rc == 1, "Cannot read password from file\n" );
+        fclose(f);
+    }
+}

Modified: qpid/proton/trunk/tests/tools/apps/c/msgr-common.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tests/tools/apps/c/msgr-common.h?rev=1476228&r1=1476227&r2=1476228&view=diff
==============================================================================
--- qpid/proton/trunk/tests/tools/apps/c/msgr-common.h (original)
+++ qpid/proton/trunk/tests/tools/apps/c/msgr-common.h Fri Apr 26 14:35:48 2013
@@ -24,6 +24,7 @@
 void msgr_die(const char *file, int line, const char *message);
 char *msgr_strdup( const char *src );
 pn_timestamp_t msgr_now();
+void parse_password( const char *, char ** );
 
 #define check_messenger(m)  \
   { check(pn_messenger_errno(m) == 0, pn_messenger_error(m)) }

Modified: qpid/proton/trunk/tests/tools/apps/c/msgr-recv.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tests/tools/apps/c/msgr-recv.c?rev=1476228&r1=1476227&r2=1476228&view=diff
==============================================================================
--- qpid/proton/trunk/tests/tools/apps/c/msgr-recv.c (original)
+++ qpid/proton/trunk/tests/tools/apps/c/msgr-recv.c Fri Apr 26 14:35:48 2013
@@ -40,10 +40,10 @@ typedef struct {
     int   reply;
     const char *name;
     const char *ready_text;
-    // @todo add SSL support
     char *certificate;
-    char *privatekey;
-    char *password;
+    char *privatekey;   // used to sign certificate
+    char *password;     // for private key file
+    char *ca_db;        // trusted CA database
 } Options_t;
 
 static int log = 0;
@@ -65,10 +65,12 @@ static void usage(int rc)
            " -N <name> \tSet the container name to <name>\n"
            " -X <text> \tPrint '<text>\\n' to stdout after all subscriptions are created\n"
            " -V \tEnable debug logging\n"
+           " SSL options:\n"
+           " -T <path> \tDatabase of trusted CA certificates for validating peer\n"
+           " -C <path> \tFile containing self-identifying certificate\n"
+           " -K <path> \tFile containing private key used to sign certificate\n"
+           " -P [pass:<password>|path] \tPassword to unlock private key file.\n"
            );
-    //  printf("-C    \tPath to the certificate file.\n");
-    //  printf("-K    \tPath to the private key file.\n");
-    //  printf("-P    \tPassword for the private key.\n");
     exit(rc);
 }
 
@@ -83,64 +85,61 @@ static void parse_options( int argc, cha
     addresses_init(&opts->subscriptions);
     addresses_init(&opts->forwarding_targets);
 
-    while((c = getopt(argc, argv, "a:c:b:w:t:e:RW:F:VN:X:")) != -1)
-        {
-            switch(c)
-                {
-                case 'a': addresses_merge( &opts->subscriptions, optarg ); break;
-                case 'c':
-                    if (sscanf( optarg, "%llu", &opts->msg_count ) != 1) {
-                        fprintf(stderr, "Option -%c requires an integer argument.\n", optopt);
-                        usage(1);
-                    }
-                    break;
-                case 'b':
-                    if (sscanf( optarg, "%d", &opts->recv_count ) != 1) {
-                        fprintf(stderr, "Option -%c requires an integer argument.\n", optopt);
-                        usage(1);
-                    }
-                    break;
-                case 'w':
-                    if (sscanf( optarg, "%d", &opts->incoming_window ) != 1) {
-                        fprintf(stderr, "Option -%c requires an integer argument.\n", optopt);
-                        usage(1);
-                    }
-                    break;
-                case 't':
-                    if (sscanf( optarg, "%d", &opts->timeout ) != 1) {
-                        fprintf(stderr, "Option -%c requires an integer argument.\n", optopt);
-                        usage(1);
-                    }
-                    if (opts->timeout > 0) opts->timeout *= 1000;
-                    break;
-                case 'e':
-                    if (sscanf( optarg, "%u", &opts->report_interval ) != 1) {
-                        fprintf(stderr, "Option -%c requires an integer argument.\n", optopt);
-                        usage(1);
-                    }
-                    break;
-                case 'R': opts->reply = 1; break;
-                case 'W':
-                    if (sscanf( optarg, "%d", &opts->outgoing_window ) != 1) {
-                        fprintf(stderr, "Option -%c requires an integer argument.\n", optopt);
-                        usage(1);
-                    }
-                    break;
-                case 'F': addresses_merge( &opts->forwarding_targets, optarg ); break;
-                case 'V': log = 1; break;
-                case 'N': opts->name = optarg; break;
-                case 'X': opts->ready_text = optarg; break;
-
-                    /*
-                      case 'C': opts->certificate = optarg; break;
-                      case 'K': opts->privatekey = optarg; break;
-                      case 'P': opts->password = optarg; break;
-                    */
+    while ((c = getopt(argc, argv,
+                       "a:c:b:w:t:e:RW:F:VN:X:T:C:K:P:")) != -1) {
+        switch (c) {
+        case 'a': addresses_merge( &opts->subscriptions, optarg ); break;
+        case 'c':
+            if (sscanf( optarg, "%llu", &opts->msg_count ) != 1) {
+                fprintf(stderr, "Option -%c requires an integer argument.\n", optopt);
+                usage(1);
+            }
+            break;
+        case 'b':
+            if (sscanf( optarg, "%d", &opts->recv_count ) != 1) {
+                fprintf(stderr, "Option -%c requires an integer argument.\n", optopt);
+                usage(1);
+            }
+            break;
+        case 'w':
+            if (sscanf( optarg, "%d", &opts->incoming_window ) != 1) {
+                fprintf(stderr, "Option -%c requires an integer argument.\n", optopt);
+                usage(1);
+            }
+            break;
+        case 't':
+            if (sscanf( optarg, "%d", &opts->timeout ) != 1) {
+                fprintf(stderr, "Option -%c requires an integer argument.\n", optopt);
+                usage(1);
+            }
+            if (opts->timeout > 0) opts->timeout *= 1000;
+            break;
+        case 'e':
+            if (sscanf( optarg, "%u", &opts->report_interval ) != 1) {
+                fprintf(stderr, "Option -%c requires an integer argument.\n", optopt);
+                usage(1);
+            }
+            break;
+        case 'R': opts->reply = 1; break;
+        case 'W':
+            if (sscanf( optarg, "%d", &opts->outgoing_window ) != 1) {
+                fprintf(stderr, "Option -%c requires an integer argument.\n", optopt);
+                usage(1);
+            }
+            break;
+        case 'F': addresses_merge( &opts->forwarding_targets, optarg ); break;
+        case 'V': log = 1; break;
+        case 'N': opts->name = optarg; break;
+        case 'X': opts->ready_text = optarg; break;
+        case 'T': opts->ca_db = optarg; break;
+        case 'C': opts->certificate = optarg; break;
+        case 'K': opts->privatekey = optarg; break;
+        case 'P': parse_password( optarg, &opts->password ); break;
 
-                default:
-                    usage(1);
-                }
+        default:
+            usage(1);
         }
+    }
 
     // default subscription if none specified
     if (opts->subscriptions.count == 0) addresses_add( &opts->subscriptions,
@@ -169,20 +168,25 @@ int main(int argc, char** argv)
     messenger = pn_messenger( opts.name );
 
     /* load the various command line options if they're set */
-    if(opts.certificate)
-        {
-            pn_messenger_set_certificate(messenger, opts.certificate);
-        }
+    if (opts.certificate) {
+        rc = pn_messenger_set_certificate(messenger, opts.certificate);
+        check( rc == 0, "Failed to set certificate" );
+    }
 
-    if(opts.privatekey)
-        {
-            pn_messenger_set_private_key(messenger, opts.privatekey);
-        }
+    if (opts.privatekey) {
+        rc = pn_messenger_set_private_key(messenger, opts.privatekey);
+        check( rc == 0, "Failed to set private key" );
+    }
 
-    if(opts.password)
-        {
-            pn_messenger_set_password(messenger, opts.password);
-        }
+    if (opts.password) {
+        rc = pn_messenger_set_password(messenger, opts.password);
+        check( rc == 0, "Failed to set password" );
+    }
+
+    if (opts.ca_db) {
+        rc = pn_messenger_set_trusted_certificates(messenger, opts.ca_db);
+        check( rc == 0, "Failed to set trusted CA database" );
+    }
 
     if (opts.incoming_window) {
         // RAFI: seems to cause receiver to hang:

Modified: qpid/proton/trunk/tests/tools/apps/c/msgr-send.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tests/tools/apps/c/msgr-send.c?rev=1476228&r1=1476227&r2=1476228&view=diff
==============================================================================
--- qpid/proton/trunk/tests/tools/apps/c/msgr-send.c (original)
+++ qpid/proton/trunk/tests/tools/apps/c/msgr-send.c Fri Apr 26 14:35:48 2013
@@ -44,6 +44,10 @@ typedef struct {
     int   incoming_window;
     int   recv_count;
     const char *name;
+    char *certificate;
+    char *privatekey;   // used to sign certificate
+    char *password;     // for private key file
+    char *ca_db;        // trusted CA database
 } Options_t;
 
 static int log = 0;
@@ -65,6 +69,11 @@ static void usage(int rc)
            " -B # \tArgument to Messenger::recv(n) [-1]\n"
            " -N <name> \tSet the container name to <name>\n"
            " -V \tEnable debug logging\n"
+           " SSL options:\n"
+           " -T <path> \tDatabase of trusted CA certificates for validating peer\n"
+           " -C <path> \tFile containing self-identifying certificate\n"
+           " -K <path> \tFile containing private key used to sign certificate\n"
+           " -P [pass:<password>|path] \tPassword to unlock private key file.\n"
            );
     //printf("-p     \t*TODO* Add N sample properties to each message [3]\n");
     exit(rc);
@@ -82,7 +91,8 @@ static void parse_options( int argc, cha
     opts->recv_count = -1;
     addresses_init(&opts->targets);
 
-    while((c = getopt(argc, argv, "a:c:b:p:w:e:l:Rt:W:B:VN:")) != -1) {
+    while ((c = getopt(argc, argv,
+                       "a:c:b:p:w:e:l:Rt:W:B:VN:T:C:K:P:")) != -1) {
         switch(c) {
         case 'a': addresses_merge( &opts->targets, optarg ); break;
         case 'c':
@@ -137,6 +147,11 @@ static void parse_options( int argc, cha
             break;
         case 'V': log = 1; break;
         case 'N': opts->name = optarg; break;
+        case 'T': opts->ca_db = optarg; break;
+        case 'C': opts->certificate = optarg; break;
+        case 'K': opts->privatekey = optarg; break;
+        case 'P': parse_password( optarg, &opts->password ); break;
+
         default:
             usage(1);
         }
@@ -187,6 +202,27 @@ int main(int argc, char** argv)
     parse_options( argc, argv, &opts );
 
     messenger = pn_messenger( opts.name );
+
+    if (opts.certificate) {
+        rc = pn_messenger_set_certificate(messenger, opts.certificate);
+        check( rc == 0, "Failed to set certificate" );
+    }
+
+    if (opts.privatekey) {
+        rc = pn_messenger_set_private_key(messenger, opts.privatekey);
+        check( rc == 0, "Failed to set private key" );
+    }
+
+    if (opts.password) {
+        rc = pn_messenger_set_password(messenger, opts.password);
+        check( rc == 0, "Failed to set password" );
+    }
+
+    if (opts.ca_db) {
+        rc = pn_messenger_set_trusted_certificates(messenger, opts.ca_db);
+        check( rc == 0, "Failed to set trusted CA database" );
+    }
+
     if (opts.outgoing_window) {
         pn_messenger_set_outgoing_window( messenger, opts.outgoing_window );
     }

Modified: qpid/proton/trunk/tests/tools/soak-check
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/tests/tools/soak-check?rev=1476228&r1=1476227&r2=1476228&view=diff
==============================================================================
--- qpid/proton/trunk/tests/tools/soak-check (original)
+++ qpid/proton/trunk/tests/tools/soak-check Fri Apr 26 14:35:48 2013
@@ -96,6 +96,17 @@ def main(argv=None):
            "sender_count": 10,
            "target_count": 11,
            "send_count": 311,
+           "send_batch": 3}]),
+
+        ("proton_tests.soak.MessengerTests.test_star_topology_C_SSL",
+         # 10 ports * 10 senders = 100 connections per iteration
+         # 100 connections * 11 targets = 1100 links per iteration
+         # 1100 links * 30 msg * 2 (send/reply) = 66000 msgs per iteration
+         [{"iterations": iterations,
+           "port_count": 10,
+           "sender_count": 10,
+           "target_count": 11,
+           "send_count": 30,
            "send_batch": 3}])
         ]
 



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