You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2017/06/09 01:25:33 UTC

[10/50] [abbrv] qpid-proton git commit: PROTON-1476: c and c++ example tests running on python 2.6

PROTON-1476: c and c++ example tests running on python 2.6

Using common exampletest.py library


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

Branch: refs/heads/go1
Commit: 81ba5a3b38e450c7159caed1ffa82313d0df8409
Parents: beb38d2
Author: Alan Conway <ac...@redhat.com>
Authored: Thu May 11 10:50:09 2017 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Thu May 11 12:50:39 2017 -0400

----------------------------------------------------------------------
 examples/c/proactor/CMakeLists.txt  |   3 +-
 examples/c/proactor/example_test.py |  88 ++++++++++
 examples/c/proactor/test.py         |  87 ----------
 examples/cpp/CMakeLists.txt         |  13 +-
 examples/cpp/example_test.py        | 284 +++++++++----------------------
 examples/exampletest.py             |  78 ++++++---
 6 files changed, 226 insertions(+), 327 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/81ba5a3b/examples/c/proactor/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/examples/c/proactor/CMakeLists.txt b/examples/c/proactor/CMakeLists.txt
index 11fb073..6ea8aaf 100644
--- a/examples/c/proactor/CMakeLists.txt
+++ b/examples/c/proactor/CMakeLists.txt
@@ -40,4 +40,5 @@ foreach(name broker send receive direct)
 endforeach()
 
 set(run_env ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/proton-c/env.py ${EXAMPLE_ENV} "PATH=${test_path}" ${VALGRIND_ENV})
-add_test(c-example-proactor ${run_env} -- ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test.py -v)
+
+add_test(c-example-proactor ${run_env} -- ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/example_test.py -v)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/81ba5a3b/examples/c/proactor/example_test.py
----------------------------------------------------------------------
diff --git a/examples/c/proactor/example_test.py b/examples/c/proactor/example_test.py
new file mode 100644
index 0000000..38f7fc8
--- /dev/null
+++ b/examples/c/proactor/example_test.py
@@ -0,0 +1,88 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License
+#
+
+# This is a test script to run the examples and verify that they behave as expected.
+
+import unittest, sys, time
+from exampletest import *
+
+def python_cmd(name):
+    dir = os.path.dirname(__file__)
+    return [sys.executable, os.path.join(dir, "..", "..", "python", name)]
+
+def receive_expect(n):
+    return ''.join('{"sequence"=%s}\n'%i for i in xrange(1, n+1)) + "%s messages received\n"%n
+
+class Broker(object):
+    def __init__(self, test):
+        self.test = test
+
+    def __enter__(self):
+        with TestPort() as tp:
+            self.port = tp.port
+            self.host = tp.host
+            self.addr = tp.addr
+            self.proc = self.test.proc(["broker", "", self.port])
+            self.proc.wait_re("listening")
+            return self
+
+    def __exit__(self, *args):
+        b = getattr(self, "proc")
+        if b:
+            if b.poll() !=  None: # Broker crashed
+                raise ProcError(b, "broker crash")
+            b.kill()
+
+class CExampleTest(ExampleTestCase):
+
+    def test_send_receive(self):
+        """Send first then receive"""
+        with Broker(self) as b:
+            s = self.proc(["send", "", b.port])
+            self.assertEqual("10 messages sent and acknowledged\n", s.wait_exit())
+            r = self.proc(["receive", "", b.port])
+            self.assertEqual(receive_expect(10), r.wait_exit())
+
+    def test_receive_send(self):
+        """Start receiving  first, then send."""
+        with Broker(self) as b:
+            r = self.proc(["receive", "", b.port]);
+            s = self.proc(["send", "", b.port]);
+            self.assertEqual("10 messages sent and acknowledged\n", s.wait_exit())
+            self.assertEqual(receive_expect(10), r.wait_exit())
+
+    def test_send_direct(self):
+        """Send to direct server"""
+        with TestPort() as tp:
+            d = self.proc(["direct", "", tp.port])
+            d.wait_re("listening")
+            self.assertEqual("10 messages sent and acknowledged\n", self.proc(["send", "", tp.port]).wait_exit())
+            self.assertIn(receive_expect(10), d.wait_exit())
+
+    def test_receive_direct(self):
+        """Receive from direct server"""
+        with TestPort() as tp:
+            d = self.proc(["direct", "", tp.port])
+            d.wait_re("listening")
+            self.assertEqual(receive_expect(10), self.proc(["receive", "", tp.port]).wait_exit())
+            self.assertIn("10 messages sent and acknowledged\n", d.wait_exit())
+
+
+if __name__ == "__main__":
+    unittest.main()

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/81ba5a3b/examples/c/proactor/test.py
----------------------------------------------------------------------
diff --git a/examples/c/proactor/test.py b/examples/c/proactor/test.py
deleted file mode 100644
index f62ea4e..0000000
--- a/examples/c/proactor/test.py
+++ /dev/null
@@ -1,87 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License
-#
-
-# This is a test script to run the examples and verify that they behave as expected.
-
-import unittest, sys, time
-from exampletest import *
-
-def python_cmd(name):
-    dir = os.path.dirname(__file__)
-    return [sys.executable, os.path.join(dir, "..", "..", "python", name)]
-
-def receive_expect(n):
-    return ''.join('{"sequence"=%s}\n'%i for i in xrange(1, n+1)) + "%s messages received\n"%n
-
-class Broker(object):
-    def __init__(self, test):
-        self.test = test
-
-    def __enter__(self):
-        with TestPort() as port:
-            self.port = port
-            self.proc = self.test.proc(["broker", "", self.port])
-            self.proc.wait_re("listening")
-            return self
-
-    def __exit__(self, *args):
-        b = getattr(self, "proc")
-        if b:
-            if b.poll() !=  None: # Broker crashed
-                raise ProcError(b, "broker crash")
-            b.kill()
-
-class CExampleTest(ExampleTestCase):
-
-    def test_send_receive(self):
-        """Send first then receive"""
-        with Broker(self) as b:
-            s = self.proc(["send", "", b.port])
-            self.assertEqual("10 messages sent and acknowledged\n", s.wait_out())
-            r = self.proc(["receive", "", b.port])
-            self.assertEqual(receive_expect(10), r.wait_out())
-
-    def test_receive_send(self):
-        """Start receiving  first, then send."""
-        with Broker(self) as b:
-            r = self.proc(["receive", "", b.port]);
-            s = self.proc(["send", "", b.port]);
-            self.assertEqual("10 messages sent and acknowledged\n", s.wait_out())
-            self.assertEqual(receive_expect(10), r.wait_out())
-
-    def test_send_direct(self):
-        """Send to direct server"""
-        with TestPort() as port:
-            d = self.proc(["direct", "", port])
-            d.wait_re("listening")
-            self.assertEqual("10 messages sent and acknowledged\n", self.proc(["send", "", port]).wait_out())
-            self.assertIn(receive_expect(10), d.wait_out())
-
-    def test_receive_direct(self):
-        """Receive from direct server"""
-        with TestPort() as port:
-            addr = "127.0.0.1:%s" % port
-            d = self.proc(["direct", "", port])
-            d.wait_re("listening")
-            self.assertEqual(receive_expect(10), self.proc(["receive", "", port]).wait_out())
-            self.assertIn("10 messages sent and acknowledged\n", d.wait_out())
-
-
-if __name__ == "__main__":
-    unittest.main()

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/81ba5a3b/examples/cpp/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/examples/cpp/CMakeLists.txt b/examples/cpp/CMakeLists.txt
index 304d899..236aac7 100644
--- a/examples/cpp/CMakeLists.txt
+++ b/examples/cpp/CMakeLists.txt
@@ -30,7 +30,7 @@ macro(add_cpp_test name)
   else(WIN32)
     set(test_path "$<TARGET_FILE_DIR:broker>:$ENV{PATH}")
   endif(WIN32)
-  set(run_env ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/proton-c/env.py)
+  set(run_env ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/proton-c/env.py ${EXAMPLE_ENV})
   add_test(NAME ${name} COMMAND ${run_env} "PATH=${test_path}" ${VALGRIND_ENV} -- ${ARGN})
 endmacro()
 
@@ -64,17 +64,6 @@ if(HAS_CPP11)
       scheduled_send)
     add_executable(${example} ${example}.cpp)
   endforeach()
-
-  # Linux-only multi-threaded examples (TODO make these portable)
-#   if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
-#     set(container_src mt/epoll_container.cpp)
-#     foreach(example
-#         broker)
-#       add_executable(mt_${example} mt/${example}.cpp ${container_src})
-#       target_link_libraries(mt_${example} pthread)
-#     endforeach()
-#     add_cpp_test(cpp-example-mt ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/example_test.py -v MtBrokerTest)
-#   endif()
 endif()
 
 add_cpp_test(cpp-example-container ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/example_test.py -v ContainerExampleTest)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/81ba5a3b/examples/cpp/example_test.py
----------------------------------------------------------------------
diff --git a/examples/cpp/example_test.py b/examples/cpp/example_test.py
index e2052dc..a80ee5c 100644
--- a/examples/cpp/example_test.py
+++ b/examples/cpp/example_test.py
@@ -21,6 +21,7 @@
 
 import unittest
 import os, sys, socket, time, re, inspect
+from exampletest import *
 from  random import randrange
 from subprocess import Popen, PIPE, STDOUT, call
 from copy import copy
@@ -80,148 +81,6 @@ def ensureCanTestExtendedSASL():
   if not createdSASLDb:
     raise Skipped("Can't Test Extended SASL: Couldn't create auth db")
 
-def pick_addr():
-    """Pick a new host:port address."""
-    # TODO Conway 2015-07-14: need a safer way to pick ports.
-    p =  randrange(10000, 20000)
-    return "127.0.0.1:%s" % p
-
-class ProcError(Exception):
-    """An exception that captures failed process output"""
-    def __init__(self, proc, what="non-0 exit"):
-        out = proc.out.strip()
-        if out:
-            out = "\nvvvvvvvvvvvvvvvv\n%s\n^^^^^^^^^^^^^^^^\n" % out
-        else:
-            out = ", no output)"
-        super(Exception, self, ).__init__(
-            "%s %s, code=%s%s" % (proc.args, what, proc.returncode, out))
-
-class Proc(Popen):
-    """A example process that stores its stdout and can scan it for a 'ready' pattern'"""
-
-    if "VALGRIND" in os.environ and os.environ["VALGRIND"]:
-        env_args = [os.environ["VALGRIND"], "--error-exitcode=42", "--quiet", "--leak-check=full"]
-    else:
-        env_args = []
-
-    def __init__(self, args, ready=None, timeout=30, skip_valgrind=False, **kwargs):
-        """Start an example process"""
-        args = list(args)
-        if platform.system() == "Windows":
-            args[0] += ".exe"
-        self.timeout = timeout
-        self.args = args
-        self.out = ""
-        if not skip_valgrind:
-            args = self.env_args + args
-        try:
-            Popen.__init__(self, args, stdout=PIPE, stderr=STDOUT,
-                           universal_newlines=True,  **kwargs)
-        except Exception as e:
-            raise ProcError(self, str(e))
-        # Start reader thread.
-        self.pattern = ready
-        self.ready = Event()
-        # Help with Python 2.5, 2.6, 2.7 changes to Event.wait(), Event.is_set
-        self.ready_set = False
-        self.error = None
-        self.thread = Thread(target=self.run_)
-        self.thread.daemon = True
-        self.thread.start()
-        if self.pattern:
-            self.wait_ready()
-
-    def run_(self):
-        try:
-            while True:
-                l = self.stdout.readline()
-                if not l: break
-                self.out += l
-                if self.pattern is not None:
-                    if re.search(self.pattern, l):
-                        self.ready_set = True
-                        self.ready.set()
-            if self.wait() != 0:
-                raise ProcError(self)
-        except Exception as e:
-            self.error = e
-        finally:
-            self.stdout.close()
-            self.ready_set = True
-            self.ready.set()
-
-    def safe_kill(self):
-        """Kill and clean up zombie but don't wait forever. No exceptions."""
-        try:
-            self.kill()
-            self.thread.join(self.timeout)
-        except: pass
-        return self.out
-
-    def check_(self):
-        if self.error:
-            raise self.error
-
-    def wait_ready(self):
-        """Wait for ready to appear in output"""
-        self.ready.wait(self.timeout)
-        if self.ready_set:
-            self.check_()
-            return self.out
-        else:
-            self.safe_kill()
-            raise ProcError(self, "timeout waiting for '%s'" % self.pattern)
-
-    def wait_exit(self):
-        """Wait for process to exit, return output. Raise ProcError on failure."""
-        self.thread.join(self.timeout)
-        if self.poll() is not None:
-            self.check_()
-            return self.out
-        else:
-            raise ProcError(self, "timeout waiting for exit")
-
-
-if hasattr(unittest.TestCase, 'setUpClass') and  hasattr(unittest.TestCase, 'tearDownClass'):
-    TestCase = unittest.TestCase
-else:
-    class TestCase(unittest.TestCase):
-        """
-        Roughly provides setUpClass and tearDownClass functionality for older python
-        versions in our test scenarios. If subclasses override setUp or tearDown
-        they *must* call the superclass.
-        """
-        def setUp(self):
-            if not hasattr(type(self), '_setup_class_count'):
-                type(self)._setup_class_count = len(
-                    inspect.getmembers(
-                        type(self),
-                        predicate=lambda m: inspect.ismethod(m) and m.__name__.startswith('test_')))
-                type(self).setUpClass()
-
-        def tearDown(self):
-            self.assertTrue(self._setup_class_count > 0)
-            self._setup_class_count -=  1
-            if self._setup_class_count == 0:
-                type(self).tearDownClass()
-
-
-class ExampleTestCase(TestCase):
-    """TestCase that manages started processes"""
-    def setUp(self):
-        super(ExampleTestCase, self).setUp()
-        self.procs = []
-
-    def tearDown(self):
-        for p in self.procs:
-            p.safe_kill()
-        super(ExampleTestCase, self).tearDown()
-
-    def proc(self, *args, **kwargs):
-        p = Proc(*args, **kwargs)
-        self.procs.append(p)
-        return p
 
 class BrokerTestCase(ExampleTestCase):
     """
@@ -231,14 +90,16 @@ class BrokerTestCase(ExampleTestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.addr = pick_addr() + "/examples"
         cls.broker = None       # In case Proc throws, create the attribute.
-        cls.broker = Proc([cls.broker_exe, "-a", cls.addr], ready="listening")
-        cls.broker.wait_ready()
+        with TestPort() as tp:
+            cls.addr = "%s:%s/example" % (tp.host, tp.port)
+            cls.broker = Proc([cls.broker_exe, "-a", tp.addr])
+            cls.broker.wait_re("listening")
 
     @classmethod
     def tearDownClass(cls):
-        if cls.broker: cls.broker.safe_kill()
+        if cls.broker:
+            cls.broker.kill()
 
     def tearDown(self):
         b = type(self).broker
@@ -267,7 +128,8 @@ class ContainerExampleTest(BrokerTestCase):
         self.assertEqual('Hello World!\n', self.proc(["helloworld", self.addr]).wait_exit())
 
     def test_helloworld_direct(self):
-        self.assertEqual('Hello World!\n', self.proc(["helloworld_direct", pick_addr()]).wait_exit())
+        with TestPort() as tp:
+            self.assertEqual('Hello World!\n', self.proc(["helloworld_direct", tp.addr]).wait_exit())
 
     def test_simple_send_recv(self):
         self.assertEqual("all messages confirmed\n",
@@ -283,21 +145,22 @@ class ContainerExampleTest(BrokerTestCase):
 
 
     def test_simple_send_direct_recv(self):
-        addr = pick_addr()
-        recv = self.proc(["direct_recv", "-a", addr], "listening")
-        self.assertEqual("all messages confirmed\n",
-                         self.proc(["simple_send", "-a", addr]).wait_exit())
-        self.assertEqual(recv_expect("direct_recv", addr), recv.wait_exit())
+        with TestPort() as tp:
+            addr = "%s/examples" % tp.addr
+            recv = self.proc(["direct_recv", "-a", addr], "listening")
+            self.assertEqual("all messages confirmed\n",
+                             self.proc(["simple_send", "-a", addr]).wait_exit())
+            self.assertEqual(recv_expect("direct_recv", addr), recv.wait_exit())
 
     def test_simple_recv_direct_send(self):
-        addr = pick_addr()
-        send = self.proc(["direct_send", "-a", addr], "listening")
-        self.assertEqual(recv_expect("simple_recv", addr),
-                         self.proc(["simple_recv", "-a", addr]).wait_exit())
-
-        self.assertEqual(
-            "direct_send listening on %s\nall messages confirmed\n" % addr,
-            send.wait_exit())
+        with TestPort() as tp:
+            addr = "%s/examples" % tp.addr
+            send = self.proc(["direct_send", "-a", addr], "listening")
+            self.assertEqual(recv_expect("simple_recv", addr),
+                             self.proc(["simple_recv", "-a", addr]).wait_exit())
+            self.assertEqual(
+                "direct_send listening on %s\nall messages confirmed\n" % addr,
+                send.wait_exit())
 
     def test_request_response(self):
         server = self.proc(["server", "-a", self.addr], "connected")
@@ -305,10 +168,11 @@ class ContainerExampleTest(BrokerTestCase):
                          self.proc(["client", "-a", self.addr]).wait_exit())
 
     def test_request_response_direct(self):
-        addr = pick_addr()
-        server = self.proc(["server_direct", "-a", addr+"/examples"], "listening")
-        self.assertEqual(CLIENT_EXPECT,
-                         self.proc(["client", "-a", addr+"/examples"]).wait_exit())
+        with TestPort() as tp:
+            addr = "%s/examples" % tp.addr
+            server = self.proc(["server_direct", "-a", addr], "listening")
+            self.assertEqual(CLIENT_EXPECT,
+                             self.proc(["client", "-a", addr]).wait_exit())
 
     def test_flow_control(self):
         want="""success: Example 1: simple credit
@@ -316,7 +180,8 @@ success: Example 2: basic drain
 success: Example 3: drain without credit
 success: Exmaple 4: high/low watermark
 """
-        self.assertEqual(want, self.proc(["flow_control", "--address", pick_addr(), "--quiet"]).wait_exit())
+        with TestPort() as tp:
+            self.assertEqual(want, self.proc(["flow_control", "--address", tp.addr, "--quiet"]).wait_exit())
 
     def test_encode_decode(self):
         want="""
@@ -345,6 +210,21 @@ map{string(k1):int(42), symbol(k2):boolean(0)}
         self.maxDiff = None
         self.assertEqual(want, self.proc(["encode_decode"]).wait_exit())
 
+
+class ContainerExampleSSLTest(BrokerTestCase):
+    """Run the SSL container examples, verify they behave as expected."""
+
+    broker_exe = "broker"
+
+    def setUp(self):
+        if not SSL.present:
+            self.skip("SSL not available")
+        self.vg_args = Proc.vg_args
+        Proc.vg_args = []       # Disable
+
+    def tearDown(self):
+        Proc.vg_args = self.vg_args
+
     def ssl_certs_dir(self):
         """Absolute path to the test SSL certificates"""
         pn_root = dirname(dirname(dirname(sys.argv[0])))
@@ -352,30 +232,33 @@ map{string(k1):int(42), symbol(k2):boolean(0)}
 
     def test_ssl(self):
         # SSL without SASL, VERIFY_PEER_NAME
-        addr = "amqps://" + pick_addr() + "/examples"
-        # Disable valgrind when using OpenSSL
-        out = self.proc(["ssl", "-a", addr, "-c", self.ssl_certs_dir()], skip_valgrind=True).wait_exit()
-        expect = "Outgoing client connection connected via SSL.  Server certificate identity CN=test_server\nHello World!"
-        expect_found = (out.find(expect) >= 0)
-        self.assertEqual(expect_found, True)
+        with TestPort() as tp:
+            addr = "amqps://%s/examples" % tp.addr
+            # Disable valgrind when using OpenSSL
+            out = self.proc(["ssl", "-a", addr, "-c", self.ssl_certs_dir()], skip_valgrind=True).wait_exit()
+            expect = "Outgoing client connection connected via SSL.  Server certificate identity CN=test_server\nHello World!"
+            expect_found = (out.find(expect) >= 0)
+            self.assertEqual(expect_found, True)
 
     def test_ssl_no_name(self):
         # VERIFY_PEER
-        addr = "amqps://" + pick_addr() + "/examples"
-        # Disable valgrind when using OpenSSL
-        out = self.proc(["ssl", "-a", addr, "-c", self.ssl_certs_dir(), "-v", "noname"], skip_valgrind=True).wait_exit()
-        expect = "Outgoing client connection connected via SSL.  Server certificate identity CN=test_server\nHello World!"
-        expect_found = (out.find(expect) >= 0)
-        self.assertEqual(expect_found, True)
+        with TestPort() as tp:
+            addr = "amqps://%s/examples" % tp.addr
+            # Disable valgrind when using OpenSSL
+            out = self.proc(["ssl", "-a", addr, "-c", self.ssl_certs_dir(), "-v", "noname"], skip_valgrind=True).wait_exit()
+            expect = "Outgoing client connection connected via SSL.  Server certificate identity CN=test_server\nHello World!"
+            expect_found = (out.find(expect) >= 0)
+            self.assertEqual(expect_found, True)
 
     def test_ssl_bad_name(self):
         # VERIFY_PEER
-        addr = "amqps://" + pick_addr() + "/examples"
-        # Disable valgrind when using OpenSSL
-        out = self.proc(["ssl", "-a", addr, "-c", self.ssl_certs_dir(), "-v", "fail"], skip_valgrind=True).wait_exit()
-        expect = "Expected failure of connection with wrong peer name"
-        expect_found = (out.find(expect) >= 0)
-        self.assertEqual(expect_found, True)
+        with TestPort() as tp:
+            addr = "amqps://%s/examples" % tp.addr
+            # Disable valgrind when using OpenSSL
+            out = self.proc(["ssl", "-a", addr, "-c", self.ssl_certs_dir(), "-v", "fail"], skip_valgrind=True).wait_exit()
+            expect = "Expected failure of connection with wrong peer name"
+            expect_found = (out.find(expect) >= 0)
+            self.assertEqual(expect_found, True)
 
     def test_ssl_client_cert(self):
         # SSL with SASL EXTERNAL
@@ -383,11 +266,12 @@ map{string(k1):int(42), symbol(k2):boolean(0)}
 Outgoing client connection connected via SSL.  Server certificate identity CN=test_server
 Hello World!
 """
-        addr = "amqps://" + pick_addr() + "/examples"
-        # Disable valgrind when using OpenSSL
-        out = self.proc(["ssl_client_cert", addr, self.ssl_certs_dir()], skip_valgrind=True).wait_exit()
-        expect_found = (out.find(expect) >= 0)
-        self.assertEqual(expect_found, True)
+        with TestPort() as tp:
+            addr = "amqps://%s/examples" % tp.addr
+            # Disable valgrind when using OpenSSL
+            out = self.proc(["ssl_client_cert", addr, self.ssl_certs_dir()], skip_valgrind=True).wait_exit()
+            expect_found = (out.find(expect) >= 0)
+            self.assertEqual(expect_found, True)
 
     def test_scheduled_send_03(self):
         # Output should be a bunch of "send" lines but can't guarantee exactly how many.
@@ -424,19 +308,21 @@ class EngineTestCase(BrokerTestCase):
 
 
     def test_simple_send_direct_recv(self):
-        addr = pick_addr()
-        recv = self.proc(["direct_recv", "-a", addr], "listening")
-        self.assertEqual("all messages confirmed\n",
-                         self.proc(["simple_send", "-a", addr]).wait_exit())
-        self.assertEqual(recv_expect("direct_recv", addr), recv.wait_exit())
+        with TestPort() as tp:
+            addr = "%s/examples" % tp.addr
+            recv = self.proc(["direct_recv", "-a", addr], "listening")
+            self.assertEqual("all messages confirmed\n",
+                             self.proc(["simple_send", "-a", addr]).wait_exit())
+            self.assertEqual(recv_expect("direct_recv", addr), recv.wait_exit())
 
     def test_simple_recv_direct_send(self):
-        addr = pick_addr()
-        send = self.proc(["direct_send", "-a", addr], "listening")
-        self.assertEqual(recv_expect("simple_recv", addr),
-                         self.proc(["simple_recv", "-a", addr]).wait_exit())
-        self.assertEqual("direct_send listening on %s\nall messages confirmed\n" % addr,
-                         send.wait_exit())
+        with TestPort() as tp:
+            addr = "%s/examples" % tp.addr
+            send = self.proc(["direct_send", "-a", tp.addr], "listening")
+            self.assertEqual(recv_expect("simple_recv", addr),
+                             self.proc(["simple_recv", "-a", addr]).wait_exit())
+            self.assertEqual("direct_send listening on %s\nall messages confirmed\n" % addr,
+                             send.wait_exit())
 
     def test_request_response(self):
         server = self.proc(["server", "-a", self.addr], "connected")

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/81ba5a3b/examples/exampletest.py
----------------------------------------------------------------------
diff --git a/examples/exampletest.py b/examples/exampletest.py
index 71aa463..bb055a1 100644
--- a/examples/exampletest.py
+++ b/examples/exampletest.py
@@ -36,11 +36,12 @@ class TestPort(object):
     def __init__(self):
         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-        self.sock.bind(('', 0))
-        self.port = socket.getnameinfo(self.sock.getsockname(), 0)[1]
+        self.sock.bind(('127.0.0.1', 0)) # Testing exampless is local only
+        self.host, self.port = socket.getnameinfo(self.sock.getsockname(), 0)
+        self.addr = "%s:%s" % (self.host, self.port)
 
     def __enter__(self):
-        return self.port
+        return self
 
     def __exit__(self, *args):
         self.close()
@@ -57,32 +58,36 @@ class ProcError(Exception):
         else:
             out = ", no output)"
         super(Exception, self, ).__init__(
-            "%s %s, code=%s%s" % (proc.args, what, proc.returncode, out))
+            "%s %s, code=%s%s" % (proc.args, what, getattr(proc, 'returncode', 'noreturn'), out))
 
 class NotFoundError(ProcError):
     pass
 
 class Proc(Popen):
-    """A example process that stores its output, optionally run with valgrind."""
+    """A example process that stores its stdout and can scan it for a 'ready' pattern'"""
 
     if "VALGRIND" in os.environ and os.environ["VALGRIND"]:
-        env_args = [os.environ["VALGRIND"], "--error-exitcode=42", "--quiet", "--leak-check=full"]
+        vg_args = [os.environ["VALGRIND"], "--error-exitcode=42", "--quiet", "--leak-check=full"]
     else:
-        env_args = []
+        vg_args = []
 
     @property
     def out(self):
         self._out.seek(0)
-        return self._out.read()
+        # Normalize line endings, os.tmpfile() opens in binary mode.
+        return self._out.read().replace('\r\n','\n').replace('\r','\n')
 
-    def __init__(self, args, **kwargs):
+    def __init__(self, args, skip_valgrind=False, **kwargs):
         """Start an example process"""
         args = list(args)
-        self.args = args
+        if skip_valgrind:
+            self.args = args
+        else:
+            self.args = self.vg_args + args
         self.kwargs = kwargs
         self._out = os.tmpfile()
         try:
-            Popen.__init__(self, self.env_args + self.args, stdout=self._out, stderr=STDOUT, **kwargs)
+            Popen.__init__(self, self.args, stdout=self._out, stderr=STDOUT, **kwargs)
         except OSError, e:
             if e.errno == errno.ENOENT:
                 raise NotFoundError(self, str(e))
@@ -98,7 +103,7 @@ class Proc(Popen):
             pass                # Already exited.
         return self.out
 
-    def wait_out(self, timeout=DEFAULT_TIMEOUT, expect=0):
+    def wait_exit(self, timeout=DEFAULT_TIMEOUT, expect=0):
         """Wait for process to exit, return output. Raise ProcError  on failure."""
         t = threading.Thread(target=self.wait)
         t.start()
@@ -124,29 +129,46 @@ class Proc(Popen):
             time.sleep(0.01)    # Not very efficient
         raise ProcError(self, "gave up waiting for '%s' after %ss" % (regexp, timeout))
 
-# Work-around older python unittest that lacks setUpClass.
-if hasattr(unittest.TestCase, 'setUpClass') and  hasattr(unittest.TestCase, 'tearDownClass'):
-    TestCase = unittest.TestCase
-else:
-    class TestCase(unittest.TestCase):
-        """
-        Roughly provides setUpClass and tearDownClass functionality for older python
-        versions in our test scenarios. If subclasses override setUp or tearDown
-        they *must* call the superclass.
-        """
+def _tc_missing(attr):
+    return not hasattr(unittest.TestCase, attr)
+
+class TestCase(unittest.TestCase):
+    """
+    Roughly provides setUpClass() and tearDownClass() and other features missing
+    in python 2.6. If subclasses override setUp() or tearDown() they *must*
+    call the superclass.
+    """
+
+    if _tc_missing('setUpClass') and _tc_missing('tearDownClass'):
+
+        @classmethod
+        def setUpClass(cls):
+            pass
+
+        @classmethod
+        def tearDownClass(cls):
+            pass
+
         def setUp(self):
-            if not hasattr(type(self), '_setup_class_count'):
-                type(self)._setup_class_count = len(
-                    inspect.getmembers(
-                        type(self),
-                        predicate=lambda(m): inspect.ismethod(m) and m.__name__.startswith('test_')))
-                type(self).setUpClass()
+            super(TestCase, self).setUp()
+            cls = type(self)
+            if not hasattr(cls, '_setup_class_count'): # First time
+                def is_test(m):
+                    return inspect.ismethod(m) and m.__name__.startswith('test_')
+                cls._setup_class_count = len(inspect.getmembers(cls, predicate=is_test))
+                cls.setUpClass()
 
         def tearDown(self):
             self.assertTrue(self._setup_class_count > 0)
             self._setup_class_count -=  1
             if self._setup_class_count == 0:
                 type(self).tearDownClass()
+            super(TestCase, self).tearDown()
+
+    if _tc_missing('assertIn'):
+
+        def assertIn(self, a, b):
+            self.assertTrue(a in b, "%r not in %r" % (a, b))
 
 class ExampleTestCase(TestCase):
     """TestCase that manages started processes"""


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