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