You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kp...@apache.org on 2018/03/01 17:10:49 UTC

qpid-interop-test git commit: QPIDIT-61: This is more of a renaming of modules so that all common libs have a name starting with qit_. This makes it easier to see the common lib modules in a file list.

Repository: qpid-interop-test
Updated Branches:
  refs/heads/master 71ea06dfc -> 4b1c194aa


QPIDIT-61: This is more of a renaming of modules so that all common libs have a name starting with qit_. This makes it easier to see the common lib modules in a file list.


Project: http://git-wip-us.apache.org/repos/asf/qpid-interop-test/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-interop-test/commit/4b1c194a
Tree: http://git-wip-us.apache.org/repos/asf/qpid-interop-test/tree/4b1c194a
Diff: http://git-wip-us.apache.org/repos/asf/qpid-interop-test/diff/4b1c194a

Branch: refs/heads/master
Commit: 4b1c194aaa0053025943b01a117bbd87319796e6
Parents: 71ea06d
Author: Kim van der Riet <kv...@localhost.localdomain>
Authored: Thu Mar 1 12:10:19 2018 -0500
Committer: Kim van der Riet <kv...@localhost.localdomain>
Committed: Thu Mar 1 12:10:19 2018 -0500

----------------------------------------------------------------------
 docs/Test_HOWTO.txt                             |  18 +-
 .../src/jms_hdrs_props_test/Receiver.py         |   4 +-
 .../src/jms_hdrs_props_test/Sender.py           |   4 +-
 .../src/jms_messages_test/Receiver.py           |   4 +-
 .../src/jms_messages_test/Sender.py             |   4 +-
 src/python/qpid_interop_test/.gitignore         |   4 +-
 src/python/qpid_interop_test/__init__.py        |   4 +-
 .../amqp_large_content_test.py                  |   4 +-
 src/python/qpid_interop_test/amqp_types_test.py |   4 +-
 .../qpid_interop_test/broker_properties.py      |  58 ------
 .../qpid_interop_test/interop_test_errors.py    |  34 ----
 .../qpid_interop_test/jms_hdrs_props_test.py    |   4 +-
 .../qpid_interop_test/jms_messages_test.py      |   4 +-
 src/python/qpid_interop_test/jms_types.py       |  39 ----
 .../qpid_interop_test/qit_broker_props.py       |  58 ++++++
 src/python/qpid_interop_test/qit_common.py      |  36 ++--
 src/python/qpid_interop_test/qit_errors.py      |  34 ++++
 src/python/qpid_interop_test/qit_jms_types.py   |  39 ++++
 src/python/qpid_interop_test/qit_shim.py        | 176 +++++++++++++++++++
 src/python/qpid_interop_test/qit_xunit_log.py   | 116 ++++++++++++
 src/python/qpid_interop_test/shims.py           | 176 -------------------
 src/python/qpid_interop_test/xunit_log.py       | 116 ------------
 22 files changed, 466 insertions(+), 474 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/docs/Test_HOWTO.txt
----------------------------------------------------------------------
diff --git a/docs/Test_HOWTO.txt b/docs/Test_HOWTO.txt
index 78ff534..84e1cbd 100644
--- a/docs/Test_HOWTO.txt
+++ b/docs/Test_HOWTO.txt
@@ -49,24 +49,24 @@ src/python/qpid_interop_test directory. The test is named
 =================
 The following modules are available to Tests:
 
-2.1 broker_properties.py
-------------------------
+2.1 qit_broker_props.py
+-----------------------
   Opens a connection to a broker and reads the connection properties in
   order to return a string containing the broker name. This is useful
   if you need to know the broker name for any reason. One of the common
   uses of this is to conditionally skip certain tests which fail based
   on the broker against which they are running.
 
-2.2 interop_test_errors.py
---------------------------
+2.2 qit_errors.py
+-----------------
   Defines error classes for use with tests. Currently this only
   defines a single error class (InteropTestError) which accepts
   a text error message, but more complex error classes may
   be added if needed.
 
-2.3 jms_types.py
-----------------
-  Used by JMS tests, this module defines common QpidJMS values and
+2.3 qit_jms_types.py
+--------------------
+  Used by JMS tests, this module defines common QpidJms values and
   operations.
 
 2.4 shims.py
@@ -151,10 +151,10 @@ parameter name | action     | default        | metavar      | help
 
 Notes:
 [1] --no-skip: Only applies if you are using the broke name (through
-    broker_properties.py) to exclude some tests bassed on the broker
+    qit_broker_props.py) to exclude some tests bassed on the broker
     name.
 [2] --broker-type: Should skip checking for the broker name (through
-    broker_properties.py) and use the given name. "None" may have
+    qit_broker_props.py) and use the given name. "None" may have
     specific meaning to some tests for broker that don't return
     connection properties.
 [3] --include-shim, --exclude-shim: These are mutually exclusive.

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/shims/qpid-proton-python/src/jms_hdrs_props_test/Receiver.py
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-python/src/jms_hdrs_props_test/Receiver.py b/shims/qpid-proton-python/src/jms_hdrs_props_test/Receiver.py
index fb54111..2cabf10 100755
--- a/shims/qpid-proton-python/src/jms_hdrs_props_test/Receiver.py
+++ b/shims/qpid-proton-python/src/jms_hdrs_props_test/Receiver.py
@@ -34,8 +34,8 @@ import traceback
 import proton
 import proton.handlers
 import proton.reactor
-from qpid_interop_test.jms_types import QPID_JMS_TYPE_ANNOTATION_NAME
-from qpid_interop_test.interop_test_errors import InteropTestError
+from qpid_interop_test.qit_errors import InteropTestError
+from qpid_interop_test.qit_jms_types import QPID_JMS_TYPE_ANNOTATION_NAME
 import _compat
 
 

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/shims/qpid-proton-python/src/jms_hdrs_props_test/Sender.py
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-python/src/jms_hdrs_props_test/Sender.py b/shims/qpid-proton-python/src/jms_hdrs_props_test/Sender.py
index 020c4fd..b3d5d7e 100755
--- a/shims/qpid-proton-python/src/jms_hdrs_props_test/Sender.py
+++ b/shims/qpid-proton-python/src/jms_hdrs_props_test/Sender.py
@@ -34,9 +34,9 @@ import json
 import proton
 import proton.handlers
 import proton.reactor
-from qpid_interop_test.interop_test_errors import InteropTestError
-from qpid_interop_test.jms_types import create_annotation
 from qpid_interop_test.qit_common import QitTestTypeMap
+from qpid_interop_test.qit_errors import InteropTestError
+from qpid_interop_test.qit_jms_types import create_annotation
 import _compat
 
 

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/shims/qpid-proton-python/src/jms_messages_test/Receiver.py
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-python/src/jms_messages_test/Receiver.py b/shims/qpid-proton-python/src/jms_messages_test/Receiver.py
index 967fd23..c2d27bf 100755
--- a/shims/qpid-proton-python/src/jms_messages_test/Receiver.py
+++ b/shims/qpid-proton-python/src/jms_messages_test/Receiver.py
@@ -33,8 +33,8 @@ import traceback
 import proton
 import proton.handlers
 import proton.reactor
-from qpid_interop_test.interop_test_errors import InteropTestError
-from qpid_interop_test.jms_types import QPID_JMS_TYPE_ANNOTATION_NAME
+from qpid_interop_test.qit_errors import InteropTestError
+from qpid_interop_test.qit_jms_types import QPID_JMS_TYPE_ANNOTATION_NAME
 import _compat
 
 class JmsMessagesTestReceiver(proton.handlers.MessagingHandler):

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/shims/qpid-proton-python/src/jms_messages_test/Sender.py
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-python/src/jms_messages_test/Sender.py b/shims/qpid-proton-python/src/jms_messages_test/Sender.py
index eb7b4b2..734ded2 100755
--- a/shims/qpid-proton-python/src/jms_messages_test/Sender.py
+++ b/shims/qpid-proton-python/src/jms_messages_test/Sender.py
@@ -33,8 +33,8 @@ import traceback
 import proton
 import proton.handlers
 import proton.reactor
-from qpid_interop_test.interop_test_errors import InteropTestError
-from qpid_interop_test.jms_types import create_annotation
+from qpid_interop_test.qit_errors import InteropTestError
+from qpid_interop_test.qit_jms_types import create_annotation
 import _compat
 
 class JmsMessagesTestSender(proton.handlers.MessagingHandler):

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/.gitignore
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/.gitignore b/src/python/qpid_interop_test/.gitignore
index 835fca3..a42f904 100644
--- a/src/python/qpid_interop_test/.gitignore
+++ b/src/python/qpid_interop_test/.gitignore
@@ -1,4 +1,4 @@
-/interop_test_errors.pyc
+/qit_errors.pyc
 /shim_utils.pyc
-/broker_properties.pyc
+/qit_broker_props.pyc
 /test_type_map.pyc

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/__init__.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/__init__.py b/src/python/qpid_interop_test/__init__.py
index 31d5a2e..fe95886 100644
--- a/src/python/qpid_interop_test/__init__.py
+++ b/src/python/qpid_interop_test/__init__.py
@@ -6,9 +6,9 @@
 # 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

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/amqp_large_content_test.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/amqp_large_content_test.py b/src/python/qpid_interop_test/amqp_large_content_test.py
index 08b935e..1619b0f 100755
--- a/src/python/qpid_interop_test/amqp_large_content_test.py
+++ b/src/python/qpid_interop_test/amqp_large_content_test.py
@@ -30,10 +30,8 @@ import unittest
 from itertools import product
 from json import dumps
 
-import qpid_interop_test.broker_properties
 import qpid_interop_test.qit_common
-import qpid_interop_test.shims
-from qpid_interop_test.interop_test_errors import InteropTestError, InteropTestTimeout
+from qpid_interop_test.qit_errors import InteropTestError, InteropTestTimeout
 
 DEFAULT_TEST_TIMEOUT = 180 # seconds
 

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/amqp_types_test.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/amqp_types_test.py b/src/python/qpid_interop_test/amqp_types_test.py
index 965677a..3bf5987 100755
--- a/src/python/qpid_interop_test/amqp_types_test.py
+++ b/src/python/qpid_interop_test/amqp_types_test.py
@@ -32,10 +32,8 @@ from json import dumps
 from time import mktime, time
 from uuid import UUID, uuid4
 
-import qpid_interop_test.broker_properties
 import qpid_interop_test.qit_common
-import qpid_interop_test.shims
-from qpid_interop_test.interop_test_errors import InteropTestError, InteropTestTimeout
+from qpid_interop_test.qit_errors import InteropTestError, InteropTestTimeout
 
 DEFAULT_TEST_TIMEOUT = 10 # seconds
 

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/broker_properties.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/broker_properties.py b/src/python/qpid_interop_test/broker_properties.py
deleted file mode 100644
index ed0c35e..0000000
--- a/src/python/qpid_interop_test/broker_properties.py
+++ /dev/null
@@ -1,58 +0,0 @@
-"""
-Module containing a small client which connects to the broker and
-gets the broker connection properties so as to identify the broker.
-"""
-
-#
-# 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.
-#
-
-import proton.handlers
-import proton.reactor
-from qpid_interop_test.interop_test_errors import InteropTestError
-
-class Client(proton.handlers.MessagingHandler):
-    """
-    Client to connect to broker and collect connection properties, used to identify the test broker
-    """
-    def __init__(self, url):
-        super(Client, self).__init__()
-        self.url = url
-        self.remote_properties = None
-
-    def on_start(self, event):
-        """Event loop start"""
-        event.container.connect(url=self.url, sasl_enabled=False, reconnect=False)
-
-    def on_connection_remote_open(self, event):
-        """Callback for remote connection open"""
-        self.remote_properties = event.connection.remote_properties
-        event.connection.close()
-
-    def get_connection_properties(self):
-        """Return the connection properties"""
-        return self.remote_properties
-
-    def on_transport_error(self, event):
-        raise InteropTestError('ERROR: broker not found at %s' % self.url)
-
-def get_broker_properties(broker_url):
-    """Start client, then return its connection properties"""
-    msg_handler = Client(broker_url)
-    proton.reactor.Container(msg_handler).run()
-    return msg_handler.get_connection_properties()

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/interop_test_errors.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/interop_test_errors.py b/src/python/qpid_interop_test/interop_test_errors.py
deleted file mode 100644
index 8f03ba1..0000000
--- a/src/python/qpid_interop_test/interop_test_errors.py
+++ /dev/null
@@ -1,34 +0,0 @@
-"""
-Module containing Error classes for interop testing
-"""
-
-#
-# 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.
-#
-
-class InteropTestError(Exception):
-    """
-    Generic simple error class for use in interop tests
-    """
-    pass
-
-class InteropTestTimeout(InteropTestError):
-    """
-    Test timeout error
-    """
-    pass

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/jms_hdrs_props_test.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/jms_hdrs_props_test.py b/src/python/qpid_interop_test/jms_hdrs_props_test.py
index a05e9bb..477abf7 100755
--- a/src/python/qpid_interop_test/jms_hdrs_props_test.py
+++ b/src/python/qpid_interop_test/jms_hdrs_props_test.py
@@ -30,10 +30,8 @@ import unittest
 from itertools import combinations, product
 from json import dumps
 
-import qpid_interop_test.broker_properties
 import qpid_interop_test.qit_common
-import qpid_interop_test.shims
-from qpid_interop_test.interop_test_errors import InteropTestError, InteropTestTimeout
+from qpid_interop_test.qit_errors import InteropTestError, InteropTestTimeout
 
 DEFAULT_TEST_TIMEOUT = 10 # seconds
 

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/jms_messages_test.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/jms_messages_test.py b/src/python/qpid_interop_test/jms_messages_test.py
index e1f4e66..6c5c4d4 100755
--- a/src/python/qpid_interop_test/jms_messages_test.py
+++ b/src/python/qpid_interop_test/jms_messages_test.py
@@ -30,10 +30,8 @@ import unittest
 from itertools import product
 from json import dumps
 
-import qpid_interop_test.broker_properties
 import qpid_interop_test.qit_common
-import qpid_interop_test.shims
-from qpid_interop_test.interop_test_errors import InteropTestError, InteropTestTimeout
+from qpid_interop_test.qit_errors import InteropTestError, InteropTestTimeout
 
 DEFAULT_TEST_TIMEOUT = 10 # seconds
 

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/jms_types.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/jms_types.py b/src/python/qpid_interop_test/jms_types.py
deleted file mode 100644
index 32745da..0000000
--- a/src/python/qpid_interop_test/jms_types.py
+++ /dev/null
@@ -1,39 +0,0 @@
-"""
-Common JMS types and definitions as implemented by QpidJMS
-"""
-
-#
-# 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.
-#
-
-from proton import byte, symbol
-
-QPID_JMS_TYPE_ANNOTATION_NAME = symbol(u'x-opt-jms-msg-type')
-
-QPID_JMS_TYPE_ANNOTATIONS = {
-    'JMS_MESSAGE_TYPE': byte(0),
-    'JMS_BYTESMESSAGE_TYPE': byte(3),
-    'JMS_MAPMESSAGE_TYPE': byte(2),
-    'JMS_OBJECTMESSAGE_TYPE': byte(1),
-    'JMS_STREAMMESSAGE_TYPE': byte(4),
-    'JMS_TEXTMESSAGE_TYPE': byte(5)
-    }
-
-def create_annotation(jms_msg_type):
-    """Function which creates a message annotation for JMS message type as used by the Qpid JMS client"""
-    return {QPID_JMS_TYPE_ANNOTATION_NAME: QPID_JMS_TYPE_ANNOTATIONS[jms_msg_type]}

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/qit_broker_props.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/qit_broker_props.py b/src/python/qpid_interop_test/qit_broker_props.py
new file mode 100644
index 0000000..144f2a0
--- /dev/null
+++ b/src/python/qpid_interop_test/qit_broker_props.py
@@ -0,0 +1,58 @@
+"""
+Module containing a small client which connects to the broker and
+gets the broker connection properties so as to identify the broker.
+"""
+
+#
+# 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.
+#
+
+import proton.handlers
+import proton.reactor
+from qpid_interop_test.qit_errors import InteropTestError
+
+class Client(proton.handlers.MessagingHandler):
+    """
+    Client to connect to broker and collect connection properties, used to identify the test broker
+    """
+    def __init__(self, url):
+        super(Client, self).__init__()
+        self.url = url
+        self.remote_properties = None
+
+    def on_start(self, event):
+        """Event loop start"""
+        event.container.connect(url=self.url, sasl_enabled=False, reconnect=False)
+
+    def on_connection_remote_open(self, event):
+        """Callback for remote connection open"""
+        self.remote_properties = event.connection.remote_properties
+        event.connection.close()
+
+    def get_connection_properties(self):
+        """Return the connection properties"""
+        return self.remote_properties
+
+    def on_transport_error(self, event):
+        raise InteropTestError('ERROR: broker not found at %s' % self.url)
+
+def get_broker_properties(broker_url):
+    """Start client, then return its connection properties"""
+    msg_handler = Client(broker_url)
+    proton.reactor.Container(msg_handler).run()
+    return msg_handler.get_connection_properties()

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/qit_common.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/qit_common.py b/src/python/qpid_interop_test/qit_common.py
index 07cd33a..f81df64 100644
--- a/src/python/qpid_interop_test/qit_common.py
+++ b/src/python/qpid_interop_test/qit_common.py
@@ -28,9 +28,9 @@ from time import time
 import unittest
 
 from proton import symbol
-import qpid_interop_test.broker_properties
-import qpid_interop_test.shims
-import qpid_interop_test.xunit_log
+import qpid_interop_test.qit_broker_props
+import qpid_interop_test.qit_shim
+import qpid_interop_test.qit_xunit_log
 
 # TODO: propose a sensible default when installation details are worked out
 QIT_INSTALL_PREFIX = getenv('QIT_INSTALL_PREFIX')
@@ -268,8 +268,8 @@ class QitTest(object):
             xunit_log_dir = self.args.xunit_log_dir
         else:
             xunit_log_dir = DEFUALT_XUNIT_LOG_DIR
-        qpid_interop_test.xunit_log.Xunit(self.args.xunit_log, self.TEST_NAME, xunit_log_dir, self.test_suite,
-                                          self.test_result, self.duration)
+        qpid_interop_test.qit_xunit_log.Xunit(self.args.xunit_log, self.TEST_NAME, xunit_log_dir, self.test_suite,
+                                              self.test_result, self.duration)
 
     def _create_shim_map(self):
         """Create a shim map {'shim_name': <shim_instance>}"""
@@ -278,12 +278,12 @@ class QitTest(object):
         proton_python_rcv_shim = path.join(QIT_TEST_SHIM_HOME, 'qpid-proton-python', self.TEST_NAME, 'Receiver.py')
         proton_python_snd_shim = path.join(QIT_TEST_SHIM_HOME, 'qpid-proton-python', self.TEST_NAME, 'Sender.py')
 
-        self.shim_map = {qpid_interop_test.shims.ProtonCppShim.NAME: \
-                         qpid_interop_test.shims.ProtonCppShim(proton_cpp_snd_shim, proton_cpp_rcv_shim),
-                         qpid_interop_test.shims.ProtonPython2Shim.NAME: \
-                         qpid_interop_test.shims.ProtonPython2Shim(proton_python_snd_shim, proton_python_rcv_shim),
-                         qpid_interop_test.shims.ProtonPython3Shim.NAME: \
-                         qpid_interop_test.shims.ProtonPython3Shim(proton_python_snd_shim, proton_python_rcv_shim),
+        self.shim_map = {qpid_interop_test.qit_shim.ProtonCppShim.NAME: \
+                         qpid_interop_test.qit_shim.ProtonCppShim(proton_cpp_snd_shim, proton_cpp_rcv_shim),
+                         qpid_interop_test.qit_shim.ProtonPython2Shim.NAME: \
+                         qpid_interop_test.qit_shim.ProtonPython2Shim(proton_python_snd_shim, proton_python_rcv_shim),
+                         qpid_interop_test.qit_shim.ProtonPython3Shim.NAME: \
+                         qpid_interop_test.qit_shim.ProtonPython3Shim(proton_python_snd_shim, proton_python_rcv_shim),
                         }
 
         # Add shims that need detection during installation only if the necessary bits are present
@@ -291,8 +291,8 @@ class QitTest(object):
         rhea_rcv_shim = path.join(QIT_TEST_SHIM_HOME, 'rhea-js', self.TEST_NAME, 'Receiver.js')
         rhea_snd_shim = path.join(QIT_TEST_SHIM_HOME, 'rhea-js', self.TEST_NAME, 'Sender.js')
         if path.isfile(rhea_rcv_shim) and path.isfile(rhea_snd_shim):
-            self.shim_map[qpid_interop_test.shims.RheaJsShim.NAME] = \
-                qpid_interop_test.shims.RheaJsShim(rhea_snd_shim, rhea_rcv_shim)
+            self.shim_map[qpid_interop_test.qit_shim.RheaJsShim.NAME] = \
+                qpid_interop_test.qit_shim.RheaJsShim(rhea_snd_shim, rhea_rcv_shim)
         else:
             print('WARNING: Rhea Javascript shims not found')
 
@@ -300,8 +300,8 @@ class QitTest(object):
         amqpnetlite_rcv_shim = path.join(QIT_TEST_SHIM_HOME, 'amqpnetlite', self.TEST_NAME, 'Receiver.exe')
         amqpnetlite_snd_shim = path.join(QIT_TEST_SHIM_HOME, 'amqpnetlite', self.TEST_NAME, 'Sender.exe')
         if path.isfile(amqpnetlite_rcv_shim) and path.isfile(amqpnetlite_snd_shim):
-            self.shim_map[qpid_interop_test.shims.AmqpNetLiteShim.NAME] = \
-                qpid_interop_test.shims.AmqpNetLiteShim(amqpnetlite_snd_shim, amqpnetlite_rcv_shim)
+            self.shim_map[qpid_interop_test.qit_shim.AmqpNetLiteShim.NAME] = \
+                qpid_interop_test.qit_shim.AmqpNetLiteShim(amqpnetlite_snd_shim, amqpnetlite_rcv_shim)
         else:
             print('WARNING: AMQP DotNetLite shims not found')
 
@@ -334,7 +334,7 @@ class QitTest(object):
             else:
                 self.broker = self.broker.broker_type
         else:
-            connection_props = qpid_interop_test.broker_properties.get_broker_properties(self.args.sender)
+            connection_props = qpid_interop_test.qit_broker_props.get_broker_properties(self.args.sender)
             if connection_props is None:
                 print('WARNING: Unable to get connection properties - unknown broker')
                 self.broker = 'unknown'
@@ -372,5 +372,5 @@ class QitJmsTest(QitTest):
             classpath = path.join(QIT_TEST_SHIM_HOME, 'qpid-jms',
                                   'qpid-interop-test-jms-shim-%s-jar-with-dependencies.jar' % QPID_JMS_SHIM_VER)
 
-        self.shim_map[qpid_interop_test.shims.QpidJmsShim.NAME] = \
-            qpid_interop_test.shims.QpidJmsShim(classpath, qpid_jms_snd_shim, qpid_jms_rcv_shim)
+        self.shim_map[qpid_interop_test.qit_shim.QpidJmsShim.NAME] = \
+            qpid_interop_test.qit_shim.QpidJmsShim(classpath, qpid_jms_snd_shim, qpid_jms_rcv_shim)

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/qit_errors.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/qit_errors.py b/src/python/qpid_interop_test/qit_errors.py
new file mode 100644
index 0000000..8f03ba1
--- /dev/null
+++ b/src/python/qpid_interop_test/qit_errors.py
@@ -0,0 +1,34 @@
+"""
+Module containing Error classes for interop testing
+"""
+
+#
+# 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.
+#
+
+class InteropTestError(Exception):
+    """
+    Generic simple error class for use in interop tests
+    """
+    pass
+
+class InteropTestTimeout(InteropTestError):
+    """
+    Test timeout error
+    """
+    pass

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/qit_jms_types.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/qit_jms_types.py b/src/python/qpid_interop_test/qit_jms_types.py
new file mode 100644
index 0000000..32745da
--- /dev/null
+++ b/src/python/qpid_interop_test/qit_jms_types.py
@@ -0,0 +1,39 @@
+"""
+Common JMS types and definitions as implemented by QpidJMS
+"""
+
+#
+# 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.
+#
+
+from proton import byte, symbol
+
+QPID_JMS_TYPE_ANNOTATION_NAME = symbol(u'x-opt-jms-msg-type')
+
+QPID_JMS_TYPE_ANNOTATIONS = {
+    'JMS_MESSAGE_TYPE': byte(0),
+    'JMS_BYTESMESSAGE_TYPE': byte(3),
+    'JMS_MAPMESSAGE_TYPE': byte(2),
+    'JMS_OBJECTMESSAGE_TYPE': byte(1),
+    'JMS_STREAMMESSAGE_TYPE': byte(4),
+    'JMS_TEXTMESSAGE_TYPE': byte(5)
+    }
+
+def create_annotation(jms_msg_type):
+    """Function which creates a message annotation for JMS message type as used by the Qpid JMS client"""
+    return {QPID_JMS_TYPE_ANNOTATION_NAME: QPID_JMS_TYPE_ANNOTATIONS[jms_msg_type]}

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/qit_shim.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/qit_shim.py b/src/python/qpid_interop_test/qit_shim.py
new file mode 100644
index 0000000..938976b
--- /dev/null
+++ b/src/python/qpid_interop_test/qit_shim.py
@@ -0,0 +1,176 @@
+"""
+Module containing worker thread classes and shims
+"""
+#
+# 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.
+#
+
+import copy
+import json
+import os
+import signal
+import subprocess
+import threading
+
+from qpid_interop_test.qit_errors import InteropTestTimeout
+
+
+class ShimProcess(subprocess.Popen):
+    """Abstract parent class for Sender and Receiver shim process"""
+    def __init__(self, args, python3_flag, proc_name):
+        self.proc_name = proc_name
+        self.killed_flag = False
+        self.env = copy.deepcopy(os.environ)
+        if python3_flag:
+            self.env['PYTHONPATH'] = self.env['PYTHON3PATH']
+        super(ShimProcess, self).__init__(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid,
+                                          env=self.env)
+
+    def wait_for_completion(self, timeout):
+        """Wait for process to end and return tuple containing (stdout, stderr) from process"""
+        timer = threading.Timer(timeout, self._kill, [timeout])
+        try:
+            timer.start()
+            (stdoutdata, stderrdata) = self.communicate()
+            if self.killed_flag:
+                raise InteropTestTimeout('%s: Timeout after %d seconds' % (self.proc_name, timeout))
+            if stderrdata: # length > 0
+                # Workaround for Amqp.NetLite which on some OSs produces a spurious error message on stderr
+                # which should be ignored:
+                if not stderrdata.startswith('Got a bad hardware address length for an AF_PACKET'):
+                    return stderrdata # ERROR: return stderr string
+            if not stdoutdata: # zero length
+                return None
+            type_value_list = stdoutdata.split('\n')[0:-1] # remove trailing '\n', split by only remaining '\n'
+            if len(type_value_list) == 2:
+                try:
+                    return (type_value_list[0], json.loads(type_value_list[1])) # Return tuple
+                except ValueError:
+                    return stdoutdata # ERROR: return single string
+            return stdoutdata # ERROR: return single string
+        except (KeyboardInterrupt) as err:
+            self.send_signal(signal.SIGINT)
+            raise err
+        finally:
+            timer.cancel()
+
+    def _kill(self, timeout):
+        """Method called when timer expires"""
+        self.kill()
+        self.killed_flag = True
+
+
+class Sender(ShimProcess):
+    """Sender shim process"""
+    def __init__(self, params, python3_flag, proc_name='Sender'):
+        #print('\n>>>SNDR>>> %s python3_flag=%s' % (params, python3_flag))
+        super(Sender, self).__init__(params, python3_flag, proc_name)
+
+class Receiver(ShimProcess):
+    """Receiver shim process"""
+    def __init__(self, params, python3_flag, proc_name='Receiver'):
+        #print('\n>>>RCVR>>> %s python3_flag=%s' % (params, python3_flag))
+        super(Receiver, self).__init__(params, python3_flag, proc_name)
+
+class Shim(object):
+    """Abstract shim class, parent of all shims."""
+    NAME = ''
+    JMS_CLIENT = False # Enables certain JMS-specific message checks
+    def __init__(self, sender_shim, receiver_shim):
+        self.sender_shim = sender_shim
+        self.receiver_shim = receiver_shim
+        self.send_params = None
+        self.receive_params = None
+        self.use_shell_flag = False
+
+    def create_sender(self, broker_addr, queue_name, test_key, json_test_str):
+        """Create a new sender instance"""
+        args = []
+        args.extend(self.send_params)
+        args.extend([broker_addr, queue_name, test_key, json_test_str])
+        return Sender(args, 'Python3' in self.NAME)
+
+    def create_receiver(self, broker_addr, queue_name, test_key, json_test_str):
+        """Create a new receiver instance"""
+        args = []
+        args.extend(self.receive_params)
+        args.extend([broker_addr, queue_name, test_key, json_test_str])
+        return Receiver(args, 'Python3' in self.NAME)
+
+
+class ProtonPython2Shim(Shim):
+    """Shim for qpid-proton Python client"""
+    NAME = 'ProtonPython2'
+    def __init__(self, sender_shim, receiver_shim):
+        super(ProtonPython2Shim, self).__init__(sender_shim, receiver_shim)
+        self.send_params = ['python', self.sender_shim]
+        self.receive_params = ['python', self.receiver_shim]
+
+
+class ProtonPython3Shim(Shim):
+    """Shim for qpid-proton Python client"""
+    NAME = 'ProtonPython3'
+    def __init__(self, sender_shim, receiver_shim):
+        super(ProtonPython3Shim, self).__init__(sender_shim, receiver_shim)
+        self.send_params = ['python3', self.sender_shim]
+        self.receive_params = ['python3', self.receiver_shim]
+
+
+class ProtonCppShim(Shim):
+    """Shim for qpid-proton C++ client"""
+    NAME = 'ProtonCpp'
+    def __init__(self, sender_shim, receiver_shim):
+        super(ProtonCppShim, self).__init__(sender_shim, receiver_shim)
+        self.send_params = [self.sender_shim]
+        self.receive_params = [self.receiver_shim]
+
+
+class RheaJsShim(Shim):
+    """Shim for Rhea Javascript client"""
+    NAME = 'RheaJs'
+    def __init__(self, sender_shim, receiver_shim):
+        super(RheaJsShim, self).__init__(sender_shim, receiver_shim)
+        self.send_params = [self.sender_shim]
+        self.receive_params = [self.receiver_shim]
+
+
+class QpidJmsShim(Shim):
+    """Shim for qpid-jms JMS client"""
+    NAME = 'QpidJms'
+    JMS_CLIENT = True
+
+    JAVA_HOME = os.getenv('JAVA_HOME', '/usr/bin') # Default only works in Linux
+    JAVA_EXEC = os.path.join(JAVA_HOME, 'java')
+
+    def __init__(self, dependency_class_path, sender_shim, receiver_shim):
+        super(QpidJmsShim, self).__init__(sender_shim, receiver_shim)
+        self.dependency_class_path = dependency_class_path
+        self.send_params = [self.JAVA_EXEC, '-cp', self.get_java_class_path(), self.sender_shim]
+        self.receive_params = [self.JAVA_EXEC, '-cp', self.get_java_class_path(), self.receiver_shim]
+
+    def get_java_class_path(self):
+        """Method to construct and return the Java class path necessary to run the shim"""
+        return self.dependency_class_path
+
+class AmqpNetLiteShim(Shim):
+    """Shim for AMQP.Net Lite client"""
+    NAME = 'AmqpNetLite'
+    def __init__(self, sender_shim, receiver_shim):
+        super(AmqpNetLiteShim, self).__init__(sender_shim, receiver_shim)
+        self.send_params = ['mono', self.sender_shim]
+        self.receive_params = ['mono', self.receiver_shim]

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/qit_xunit_log.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/qit_xunit_log.py b/src/python/qpid_interop_test/qit_xunit_log.py
new file mode 100644
index 0000000..b22ea1e
--- /dev/null
+++ b/src/python/qpid_interop_test/qit_xunit_log.py
@@ -0,0 +1,116 @@
+"""
+Module providing xUnit logging functionality
+"""
+
+#
+# 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.
+#
+
+import datetime
+import os.path
+import xml.dom.minidom
+import xml.etree.cElementTree
+
+from qpid_interop_test.qit_errors import InteropTestError
+
+class Xunit(object):
+    """Class that provides test reporting in xUnit format"""
+    def __init__(self, enable_flag, test_name, xunit_log_dir, test_suite, test_result, duration):
+        self.root = None
+        if enable_flag:
+            self.date_time_str = datetime.datetime.now().strftime('%Y-%m-%dT%H-%M-%S')
+            self._check_make_dir(xunit_log_dir)
+            self.log_file = self._open(test_name, xunit_log_dir)
+            self.process_result(test_name, test_suite, test_result, duration)
+            self.write_log()
+
+    @staticmethod
+    def _check_make_dir(path):
+        """
+        Check if path exists as a directory. If not, create it (or raise exception if it exists as a non-directory)
+        """
+        if os.path.exists(path):
+            if not os.path.isdir(path):
+                raise InteropTestError('%s exists, but is not a directory' % path)
+        else:
+            os.makedirs(path)
+
+    def _open(self, test_name, path):
+        """Open file for writing"""
+        file_name = '%s.%s.xml' % (test_name, self.date_time_str)
+        try:
+            return open(os.path.join(path, file_name), 'w')
+        except IOError as err:
+            raise InteropTestError('Unable to open xUnit log file: %s' % err)
+
+    @staticmethod
+    def _prettify(element):
+        """Return a pretty-printed XML string for element"""
+        rough_string = xml.etree.ElementTree.tostring(element, 'utf-8')
+        reparsed = xml.dom.minidom.parseString(rough_string)
+        return reparsed.toprettyxml(indent='  ', encoding='utf-8')
+
+    def process_result(self, test_name, test_suite, test_result, duration):
+        """Create the xUnit XML tree"""
+        self.root = xml.etree.cElementTree.Element('testsuite')
+        self.root.set('timestamp', self.date_time_str)
+        self.root.set('hostname', 'localhost')
+        self.root.set('name', test_name)
+        self.root.set('tests', str(test_result.testsRun))
+        self.root.set('errors', str(len(test_result.errors)))
+        self.root.set('failures', str(len(test_result.failures)))
+        self.root.set('skipped', str(len(test_result.skipped)))
+        self.root.set('time', '%.3f' % duration)
+
+        errors = {}
+        for error_tup in test_result.errors:
+            errors[error_tup[0]] = error_tup[1]
+
+        failures = {}
+        for failure_tup in test_result.failures:
+            failures[failure_tup[0]] = failure_tup[1]
+
+        skips = {}
+        for skip_tup in test_result.skipped:
+            skips[skip_tup[0]] = skip_tup[1]
+
+        for type_test_suite in test_suite:
+            for test_case in type_test_suite:
+                test_case_child = xml.etree.ElementTree.SubElement(self.root, 'testcase')
+                test_case_child.set('class', test_case.id())
+                test_case_child.set('name', test_case.name())
+                test_case_child.set('time', '%.3f' % test_case.duration)
+
+                # Handle errors, failures and skipped tests
+                if test_case in errors:
+                    error_child = xml.etree.ElementTree.SubElement(test_case_child, 'error')
+                    error_child.set('type', '')
+                    error_child.text = errors[test_case]
+                elif test_case in failures:
+                    failure_child = xml.etree.ElementTree.SubElement(test_case_child, 'failure')
+                    failure_child.set('type', '')
+                    failure_child.text = failures[test_case]
+                elif test_case in skips:
+                    skip_child = xml.etree.ElementTree.SubElement(test_case_child, 'skipped')
+                    skip_child.set('type', '')
+                    skip_child.text = skips[test_case]
+
+    def write_log(self):
+        """Write the xUnit log file"""
+        if self.log_file is not None and self.root is not None:
+            self.log_file.write(self._prettify(self.root))

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/shims.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/shims.py b/src/python/qpid_interop_test/shims.py
deleted file mode 100644
index c5cc9e3..0000000
--- a/src/python/qpid_interop_test/shims.py
+++ /dev/null
@@ -1,176 +0,0 @@
-"""
-Module containing worker thread classes and shims
-"""
-#
-# 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.
-#
-
-import copy
-import json
-import os
-import signal
-import subprocess
-import threading
-
-from qpid_interop_test.interop_test_errors import InteropTestTimeout
-
-
-class ShimProcess(subprocess.Popen):
-    """Abstract parent class for Sender and Receiver shim process"""
-    def __init__(self, args, python3_flag, proc_name):
-        self.proc_name = proc_name
-        self.killed_flag = False
-        self.env = copy.deepcopy(os.environ)
-        if python3_flag:
-            self.env['PYTHONPATH'] = self.env['PYTHON3PATH']
-        super(ShimProcess, self).__init__(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid,
-                                          env=self.env)
-
-    def wait_for_completion(self, timeout):
-        """Wait for process to end and return tuple containing (stdout, stderr) from process"""
-        timer = threading.Timer(timeout, self._kill, [timeout])
-        try:
-            timer.start()
-            (stdoutdata, stderrdata) = self.communicate()
-            if self.killed_flag:
-                raise InteropTestTimeout('%s: Timeout after %d seconds' % (self.proc_name, timeout))
-            if stderrdata: # length > 0
-                # Workaround for Amqp.NetLite which on some OSs produces a spurious error message on stderr
-                # which should be ignored:
-                if not stderrdata.startswith('Got a bad hardware address length for an AF_PACKET'):
-                    return stderrdata # ERROR: return stderr string
-            if not stdoutdata: # zero length
-                return None
-            type_value_list = stdoutdata.split('\n')[0:-1] # remove trailing '\n', split by only remaining '\n'
-            if len(type_value_list) == 2:
-                try:
-                    return (type_value_list[0], json.loads(type_value_list[1])) # Return tuple
-                except ValueError:
-                    return stdoutdata # ERROR: return single string
-            return stdoutdata # ERROR: return single string
-        except (KeyboardInterrupt) as err:
-            self.send_signal(signal.SIGINT)
-            raise err
-        finally:
-            timer.cancel()
-
-    def _kill(self, timeout):
-        """Method called when timer expires"""
-        self.kill()
-        self.killed_flag = True
-
-
-class Sender(ShimProcess):
-    """Sender shim process"""
-    def __init__(self, params, python3_flag, proc_name='Sender'):
-        #print('\n>>>SNDR>>> %s python3_flag=%s' % (params, python3_flag))
-        super(Sender, self).__init__(params, python3_flag, proc_name)
-
-class Receiver(ShimProcess):
-    """Receiver shim process"""
-    def __init__(self, params, python3_flag, proc_name='Receiver'):
-        #print('\n>>>RCVR>>> %s python3_flag=%s' % (params, python3_flag))
-        super(Receiver, self).__init__(params, python3_flag, proc_name)
-
-class Shim(object):
-    """Abstract shim class, parent of all shims."""
-    NAME = ''
-    JMS_CLIENT = False # Enables certain JMS-specific message checks
-    def __init__(self, sender_shim, receiver_shim):
-        self.sender_shim = sender_shim
-        self.receiver_shim = receiver_shim
-        self.send_params = None
-        self.receive_params = None
-        self.use_shell_flag = False
-
-    def create_sender(self, broker_addr, queue_name, test_key, json_test_str):
-        """Create a new sender instance"""
-        args = []
-        args.extend(self.send_params)
-        args.extend([broker_addr, queue_name, test_key, json_test_str])
-        return Sender(args, 'Python3' in self.NAME)
-
-    def create_receiver(self, broker_addr, queue_name, test_key, json_test_str):
-        """Create a new receiver instance"""
-        args = []
-        args.extend(self.receive_params)
-        args.extend([broker_addr, queue_name, test_key, json_test_str])
-        return Receiver(args, 'Python3' in self.NAME)
-
-
-class ProtonPython2Shim(Shim):
-    """Shim for qpid-proton Python client"""
-    NAME = 'ProtonPython2'
-    def __init__(self, sender_shim, receiver_shim):
-        super(ProtonPython2Shim, self).__init__(sender_shim, receiver_shim)
-        self.send_params = ['python', self.sender_shim]
-        self.receive_params = ['python', self.receiver_shim]
-
-
-class ProtonPython3Shim(Shim):
-    """Shim for qpid-proton Python client"""
-    NAME = 'ProtonPython3'
-    def __init__(self, sender_shim, receiver_shim):
-        super(ProtonPython3Shim, self).__init__(sender_shim, receiver_shim)
-        self.send_params = ['python3', self.sender_shim]
-        self.receive_params = ['python3', self.receiver_shim]
-
-
-class ProtonCppShim(Shim):
-    """Shim for qpid-proton C++ client"""
-    NAME = 'ProtonCpp'
-    def __init__(self, sender_shim, receiver_shim):
-        super(ProtonCppShim, self).__init__(sender_shim, receiver_shim)
-        self.send_params = [self.sender_shim]
-        self.receive_params = [self.receiver_shim]
-
-
-class RheaJsShim(Shim):
-    """Shim for Rhea Javascript client"""
-    NAME = 'RheaJs'
-    def __init__(self, sender_shim, receiver_shim):
-        super(RheaJsShim, self).__init__(sender_shim, receiver_shim)
-        self.send_params = [self.sender_shim]
-        self.receive_params = [self.receiver_shim]
-
-
-class QpidJmsShim(Shim):
-    """Shim for qpid-jms JMS client"""
-    NAME = 'QpidJms'
-    JMS_CLIENT = True
-
-    JAVA_HOME = os.getenv('JAVA_HOME', '/usr/bin') # Default only works in Linux
-    JAVA_EXEC = os.path.join(JAVA_HOME, 'java')
-
-    def __init__(self, dependency_class_path, sender_shim, receiver_shim):
-        super(QpidJmsShim, self).__init__(sender_shim, receiver_shim)
-        self.dependency_class_path = dependency_class_path
-        self.send_params = [self.JAVA_EXEC, '-cp', self.get_java_class_path(), self.sender_shim]
-        self.receive_params = [self.JAVA_EXEC, '-cp', self.get_java_class_path(), self.receiver_shim]
-
-    def get_java_class_path(self):
-        """Method to construct and return the Java class path necessary to run the shim"""
-        return self.dependency_class_path
-
-class AmqpNetLiteShim(Shim):
-    """Shim for AMQP.Net Lite client"""
-    NAME = 'AmqpNetLite'
-    def __init__(self, sender_shim, receiver_shim):
-        super(AmqpNetLiteShim, self).__init__(sender_shim, receiver_shim)
-        self.send_params = ['mono', self.sender_shim]
-        self.receive_params = ['mono', self.receiver_shim]

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/4b1c194a/src/python/qpid_interop_test/xunit_log.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/xunit_log.py b/src/python/qpid_interop_test/xunit_log.py
deleted file mode 100644
index 0d54631..0000000
--- a/src/python/qpid_interop_test/xunit_log.py
+++ /dev/null
@@ -1,116 +0,0 @@
-"""
-Module providing xUnit logging functionality
-"""
-
-#
-# 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.
-#
-
-import datetime
-import os.path
-import xml.dom.minidom
-import xml.etree.cElementTree
-
-from qpid_interop_test.interop_test_errors import InteropTestError
-
-class Xunit(object):
-    """Class that provides test reporting in xUnit format"""
-    def __init__(self, enable_flag, test_name, xunit_log_dir, test_suite, test_result, duration):
-        self.root = None
-        if enable_flag:
-            self.date_time_str = datetime.datetime.now().strftime('%Y-%m-%dT%H-%M-%S')
-            self._check_make_dir(xunit_log_dir)
-            self.log_file = self._open(test_name, xunit_log_dir)
-            self.process_result(test_name, test_suite, test_result, duration)
-            self.write_log()
-
-    @staticmethod
-    def _check_make_dir(path):
-        """
-        Check if path exists as a directory. If not, create it (or raise exception if it exists as a non-directory)
-        """
-        if os.path.exists(path):
-            if not os.path.isdir(path):
-                raise InteropTestError('%s exists, but is not a directory' % path)
-        else:
-            os.makedirs(path)
-
-    def _open(self, test_name, path):
-        """Open file for writing"""
-        file_name = '%s.%s.xml' % (test_name, self.date_time_str)
-        try:
-            return open(os.path.join(path, file_name), 'w')
-        except IOError as err:
-            raise InteropTestError('Unable to open xUnit log file: %s' % err)
-
-    @staticmethod
-    def _prettify(element):
-        """Return a pretty-printed XML string for element"""
-        rough_string = xml.etree.ElementTree.tostring(element, 'utf-8')
-        reparsed = xml.dom.minidom.parseString(rough_string)
-        return reparsed.toprettyxml(indent='  ', encoding='utf-8')
-
-    def process_result(self, test_name, test_suite, test_result, duration):
-        """Create the xUnit XML tree"""
-        self.root = xml.etree.cElementTree.Element('testsuite')
-        self.root.set('timestamp', self.date_time_str)
-        self.root.set('hostname', 'localhost')
-        self.root.set('name', test_name)
-        self.root.set('tests', str(test_result.testsRun))
-        self.root.set('errors', str(len(test_result.errors)))
-        self.root.set('failures', str(len(test_result.failures)))
-        self.root.set('skipped', str(len(test_result.skipped)))
-        self.root.set('time', '%.3f' % duration)
-
-        errors = {}
-        for error_tup in test_result.errors:
-            errors[error_tup[0]] = error_tup[1]
-
-        failures = {}
-        for failure_tup in test_result.failures:
-            failures[failure_tup[0]] = failure_tup[1]
-
-        skips = {}
-        for skip_tup in test_result.skipped:
-            skips[skip_tup[0]] = skip_tup[1]
-
-        for type_test_suite in test_suite:
-            for test_case in type_test_suite:
-                test_case_child = xml.etree.ElementTree.SubElement(self.root, 'testcase')
-                test_case_child.set('class', test_case.id())
-                test_case_child.set('name', test_case.name())
-                test_case_child.set('time', '%.3f' % test_case.duration)
-
-                # Handle errors, failures and skipped tests
-                if test_case in errors:
-                    error_child = xml.etree.ElementTree.SubElement(test_case_child, 'error')
-                    error_child.set('type', '')
-                    error_child.text = errors[test_case]
-                elif test_case in failures:
-                    failure_child = xml.etree.ElementTree.SubElement(test_case_child, 'failure')
-                    failure_child.set('type', '')
-                    failure_child.text = failures[test_case]
-                elif test_case in skips:
-                    skip_child = xml.etree.ElementTree.SubElement(test_case_child, 'skipped')
-                    skip_child.set('type', '')
-                    skip_child.text = skips[test_case]
-
-    def write_log(self):
-        """Write the xUnit log file"""
-        if self.log_file is not None and self.root is not None:
-            self.log_file.write(self._prettify(self.root))


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