PROTON-1798: [c,cpp] update example drivers to work with python 3
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/b41f60d4 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/b41f60d4 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/b41f60d4 Branch: refs/heads/master Commit: b41f60d46cb81909c349ef705c0b5ccccf402231 Parents: e2858e6 Author: Alan Conway <acon...@redhat.com> Authored: Thu Jul 5 14:25:40 2018 -0400 Committer: Alan Conway <acon...@redhat.com> Committed: Fri Jul 6 12:20:32 2018 -0400 ---------------------------------------------------------------------- c/examples/example_test.py | 78 +++++++++++++++++++--------------- c/tests/fdlimit.py | 2 +- cpp/examples/example_test.py | 88 ++++++++++++++++++++++----------------- 3 files changed, 94 insertions(+), 74 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b41f60d4/c/examples/example_test.py ---------------------------------------------------------------------- diff --git a/c/examples/example_test.py b/c/examples/example_test.py index f7aa911..2cf87d8 100644 --- a/c/examples/example_test.py +++ b/c/examples/example_test.py @@ -21,7 +21,31 @@ # Example executables must be in PATH import unittest, sys, time, re -from subprocess import Popen, PIPE, check_output, CalledProcessError, STDOUT + +import subprocess + +class Server(subprocess.Popen): + def __init__(self, *args, **kwargs): + self.kill_me = kwargs.pop('kill_me', False) + kwargs.update({'universal_newlines': True, + 'stdout': subprocess.PIPE, + 'stderr': subprocess.STDOUT}) + super(Server, self).__init__(*args, **kwargs) + + def __enter__(self): + line = self.stdout.readline() + self.port = re.search("listening on ([0-9]+)$", line).group(1) + return self + + def __exit__(self, *args): + if self.kill_me: + self.kill() + self.stdout.close() # Doesn't get closed if killed + self.wait() + +def check_output(*args, **kwargs): + kwargs.update({'universal_newlines': True}) + return subprocess.check_output(*args, **kwargs) MESSAGES=10 @@ -31,25 +55,15 @@ def receive_expect(n=MESSAGES): return receive_expect_messages(n)+receive_expect def send_expect(n=MESSAGES): return "%s messages sent and acknowledged\n" % n def send_abort_expect(n=MESSAGES): return "%s messages started and aborted\n" % n -def wait_listening(p): - return re.search("listening on ([0-9]+)$", p.stdout.readline()).group(1) - -class Broker(Popen): +class Broker(Server): def __init__(self): - super(Broker, self).__init__(["broker", "", "0"], stdout=PIPE) - - def __enter__(self): - self.port = wait_listening(self) - return self - - def __exit__(self, *args): - self.kill() + super(Broker, self).__init__(["broker", "", "0"], kill_me=True) class ExampleTest(unittest.TestCase): def runex(self, name, port, messages=MESSAGES): """Run an example with standard arguments, return output""" - return check_output([name, "", str(port), "xtest", str(messages)], stderr=STDOUT) + return check_output([name, "", port, "xtest", str(messages)]) def test_send_receive(self): """Send first then receive""" @@ -65,24 +79,22 @@ class ExampleTest(unittest.TestCase): def test_send_direct(self): """Send to direct server""" - d = Popen(["direct", "", "0"], stdout=PIPE) - port = wait_listening(d) - self.assertEqual(send_expect(), self.runex("send", port)) - self.assertMultiLineEqual(receive_expect(), d.communicate()[0]) + with Server(["direct", "", "0"]) as d: + self.assertEqual(send_expect(), self.runex("send", d.port)) + self.assertMultiLineEqual(receive_expect(), d.communicate()[0]) def test_receive_direct(self): """Receive from direct server""" - d = Popen(["direct", "", "0"], stdout=PIPE) - port = wait_listening(d) - self.assertMultiLineEqual(receive_expect(), self.runex("receive", port)) - self.assertEqual("10 messages sent and acknowledged\n", d.communicate()[0]) + with Server(["direct", "", "0"]) as d: + self.assertMultiLineEqual(receive_expect(), self.runex("receive", d.port)) + self.assertEqual("10 messages sent and acknowledged\n", d.communicate()[0]) def test_send_abort_broker(self): """Sending aborted messages to a broker""" with Broker() as b: self.assertEqual(send_expect(), self.runex("send", b.port)) self.assertEqual(send_abort_expect(), self.runex("send-abort", b.port)) - for i in xrange(MESSAGES): + for i in range(MESSAGES): self.assertEqual("Message aborted\n", b.stdout.readline()) self.assertEqual(send_expect(), self.runex("send", b.port)) expect = receive_expect_messages(MESSAGES)+receive_expect_messages(MESSAGES)+receive_expect_total(20) @@ -90,14 +102,13 @@ class ExampleTest(unittest.TestCase): def test_send_abort_direct(self): """Send aborted messages to the direct server""" - d = Popen(["direct", "", "0", "examples", "20"], stdout=PIPE) - port = wait_listening(d) - self.assertEqual(send_expect(), self.runex("send", port)) - self.assertEqual(send_abort_expect(), self.runex("send-abort", port)) - self.assertEqual(send_expect(), self.runex("send", port)) - expect = receive_expect_messages() + "Message aborted\n"*MESSAGES + receive_expect_messages()+receive_expect_total(20) - self.maxDiff = None - self.assertMultiLineEqual(expect, d.communicate()[0]) + with Server(["direct", "", "0", "examples", "20"]) as d: + self.assertEqual(send_expect(), self.runex("send", d.port)) + self.assertEqual(send_abort_expect(), self.runex("send-abort", d.port)) + self.assertEqual(send_expect(), self.runex("send", d.port)) + expect = receive_expect_messages() + "Message aborted\n"*MESSAGES + receive_expect_messages()+receive_expect_total(20) + self.maxDiff = None + self.assertMultiLineEqual(expect, d.communicate()[0]) def test_send_ssl_receive(self): """Send with SSL, then receive""" @@ -107,9 +118,8 @@ class ExampleTest(unittest.TestCase): self.assertIn("secure connection:", got) self.assertIn(send_expect(), got) self.assertMultiLineEqual(receive_expect(), self.runex("receive", b.port)) - except CalledProcessError as e: - print "FIXME", e.output - if e.output.startswith("error initializing SSL"): + except subprocess.CalledProcessError as e: + if e.output.startswith(b"error initializing SSL"): print("Skipping %s: SSL not available" % self.id()) else: raise http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b41f60d4/c/tests/fdlimit.py ---------------------------------------------------------------------- diff --git a/c/tests/fdlimit.py b/c/tests/fdlimit.py index 4836140..e5cedac 100644 --- a/c/tests/fdlimit.py +++ b/c/tests/fdlimit.py @@ -22,7 +22,7 @@ import os, sys from subprocess import Popen, PIPE def wait_listening(p): - return re.search("listening on ([0-9]+)$", p.stdout.readline()).group(1) + return re.search(b"listening on ([0-9]+)$", p.stdout.readline()).group(1) class LimitedBroker(Popen): def __init__(self, fdlimit): http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/b41f60d4/cpp/examples/example_test.py ---------------------------------------------------------------------- diff --git a/cpp/examples/example_test.py b/cpp/examples/example_test.py index b83540f..e287ba5 100644 --- a/cpp/examples/example_test.py +++ b/cpp/examples/example_test.py @@ -21,10 +21,40 @@ # Example executables must be in PATH import unittest, sys, time, re, shutil, os -from subprocess import Popen, PIPE, STDOUT, check_output, check_call from os.path import dirname from string import Template +import subprocess + +class Server(subprocess.Popen): + def __init__(self, *args, **kwargs): + self.port = None + self.kill_me = kwargs.pop('kill_me', False) + kwargs.update({'universal_newlines': True, + 'stdout': subprocess.PIPE, + 'stderr': subprocess.STDOUT}) + super(Server, self).__init__(*args, **kwargs) + + def __enter__(self): + return self + + def __exit__(self, *args): + if self.kill_me: + self.kill() + self.stdout.close() # Doesn't get closed if killed + self.wait() + + @property + def addr(self): + if not self.port: + line = self.stdout.readline() + self.port = re.search("listening on ([0-9]+)$", line).group(1) + return ":%s/example" % self.port + +def check_output(*args, **kwargs): + kwargs.update({'universal_newlines': True}) + return subprocess.check_output(*args, **kwargs) + def _cyrusSetup(conf_dir): """Write out simple SASL config.tests """ @@ -42,24 +72,18 @@ mech_list: EXTERNAL DIGEST-MD5 SCRAM-SHA-1 CRAM-MD5 PLAIN ANONYMOUS f.write(t.substitute(db=db)) cmd_template = Template("echo password | ${saslpasswd} -c -p -f ${db} -u proton user") cmd = cmd_template.substitute(db=db, saslpasswd=saslpasswd) - check_call(args=cmd, shell=True) + check_output(args=cmd, shell=True) os.environ['PN_SASL_CONFIG_PATH'] = abs_conf_dir # Globally initialize Cyrus SASL configuration _cyrusSetup('sasl-conf') def wait_listening(p): - return re.search("listening on ([0-9]+)$", p.stdout.readline()).group(1) - -class Broker(Popen): - port = None - def __init__(self): - super(Broker, self).__init__(["broker", "-a", "//:0"], stdout=PIPE, stderr=open(os.devnull)) - Broker.port = wait_listening(self) - Broker.addr = "amqp://:%s/example" % self.port - def __enter__(self): return self - def __exit__(self, *args): self.kill() + return re.search(b"listening on ([0-9]+)$", p.stdout.readline()).group(1) +class Broker(Server): + def __init__(self): + super(Broker, self).__init__(["broker", "-a", "//:0"], kill_me=True) CLIENT_EXPECT="""Twas brillig, and the slithy toves => TWAS BRILLIG, AND THE SLITHY TOVES Did gire and gymble in the wabe. => DID GIRE AND GYMBLE IN THE WABE. @@ -73,49 +97,36 @@ def recv_expect(): class ContainerExampleTest(unittest.TestCase): """Run the container examples, verify they behave as expected.""" - broker_exe = "broker" - def test_helloworld(self): - self.assertMultiLineEqual('Hello World!\n', check_output(["helloworld", Broker.addr])) + self.assertMultiLineEqual('Hello World!\n', check_output(["helloworld", Broker.addr])) def test_simple_send_recv(self): self.assertMultiLineEqual("all messages confirmed\n", check_output(["simple_send", "-a", Broker.addr])) self.assertMultiLineEqual(recv_expect(), check_output(["simple_recv", "-a", Broker.addr])) def test_simple_recv_send(self): - recv = Popen(["simple_recv", "-a", Broker.addr], stdout=PIPE) + recv = Server(["simple_recv", "-a", Broker.addr]) self.assertMultiLineEqual("all messages confirmed\n", check_output(["simple_send", "-a", Broker.addr])) self.assertMultiLineEqual(recv_expect(), recv.communicate()[0]) - def test_simple_send_direct_recv(self): - recv = Popen(["direct_recv", "-a", "//:0"], stdout=PIPE) - addr = "//:%s/examples" % wait_listening(recv) - self.assertMultiLineEqual("all messages confirmed\n", check_output(["simple_send", "-a", addr])) + recv = Server(["direct_recv", "-a", "//:0"]) + self.assertMultiLineEqual("all messages confirmed\n", check_output(["simple_send", "-a", recv.addr])) self.assertMultiLineEqual(recv_expect(), recv.communicate()[0]) - def test_simple_recv_direct_send(self): - send = Popen(["direct_send", "-a", "//:0"], stdout=PIPE) - addr = "//:%s/examples" % wait_listening(send) - self.assertMultiLineEqual(recv_expect(), check_output(["simple_recv", "-a", addr])) + send = Server(["direct_send", "-a", "//:0"]) + self.assertMultiLineEqual(recv_expect(), check_output(["simple_recv", "-a", send.addr])) self.assertMultiLineEqual("all messages confirmed\n", send.communicate()[0]) def test_request_response(self): - server = Popen(["server", Broker.addr, "example"], stdout=PIPE) - self.assertIn("connected to", server.stdout.readline()) - try: + with Server(["server", Broker.addr, "example"], kill_me=True) as server: + self.assertIn("connected to", server.stdout.readline()) self.assertMultiLineEqual(CLIENT_EXPECT, check_output(["client", "-a", Broker.addr])) - finally: - server.kill() def test_request_response_direct(self): - server = Popen(["server_direct", "-a", "//:0"], stdout=PIPE) - addr = "//:%s/examples" % wait_listening(server); - try: - self.assertMultiLineEqual(CLIENT_EXPECT, check_output(["client", "-a", addr])) - finally: - server.kill() + with Server(["server_direct", "-a", "//:0"], kill_me=True) as server: + self.assertMultiLineEqual(CLIENT_EXPECT, check_output(["client", "-a", server.addr])) def test_flow_control(self): want="""success: Example 1: simple credit @@ -192,8 +203,6 @@ expected conversion_error: "unexpected type, want: uint got: string" class ContainerExampleSSLTest(unittest.TestCase): """Run the SSL container examples, verify they behave as expected.""" - broker_exe = "broker" - def ssl_certs_dir(self): """Absolute path to the test SSL certificates""" return os.path.join(dirname(sys.argv[0]), "ssl-certs") @@ -225,5 +234,6 @@ Hello World! self.assertIn(expect, out) if __name__ == "__main__": - with Broker(): - unittest.main() + with Broker() as b: + Broker.addr = b.addr + unittest.main() --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org