You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by cm...@apache.org on 2021/03/31 00:06:29 UTC

[qpid-interop-test] branch main created (now c8725ed)

This is an automated email from the ASF dual-hosted git repository.

cml pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git.


      at c8725ed  Fix for bad vesion problem using maven to search the pom file

This branch includes the following new commits:

     new 309071e  QPIDIT-125: Added Apache license text to each .gitignore file, updated doc files
     new 11eb478  QPIDIT-125: Changed version number in the pom.xml file
     new 4cd85c2  QPIDIT-125: Fix for two .pom files with incorrect version and dependecy version information
     new 21bd232  QPIDIT-125: Updated QUICKSTART to give some details on installing Amqp.Net Lite, changed Maven pom files on master to be release 0.3.0-SNAPSHOT
     new 28dffad  QPIDIT-127: Updated parent apache pom to v19
     new 7af2e6d  QPIDIT-129: Updated hard-coded shim version number in qit_common.py.
     new fcca689  QPIDIT-125: Minor updates to QUICKSTART.md
     new 5f8ef99  QPIDIT-125: More minor updates to QUICKSTART.md
     new 451f21a  QPIDIT-125: correct component title/intro in README.md, link to website and trim redundant details
     new 2cf9bbf  QPIDIT-125: focus on details that works rather than what doesnt, correct duplicate numbering in headings
     new 6e623b6  QPIDIT-125: some more quickstart tweaks - Dont describe development tags as releases as they aren't. - Move developer repo details down as they are not a primary entry point for regular users.
     new 0dee2b3  QPIDIT-125: try adding a sub-heading for visibility and separation
     new 3e79769  QPIDIT-127: also override up to surefire 2.21.0 to resolve Java 10 compatibility issue
     new 0c12806  QPIDIT-133: Removed float test values 'inf', '-inf' from amqp-complex-types-test becasue of Proton bug
     new 774f256  QPIDIT-128: Changed construction of JAVA_HOME to be compliant with Java norms, also added warning when shim jar file is not found at start of JMS tests.
     new 5007672  QPIDIT-125: Minor addition to QUICKSTART.md file
     new d2eea54  QPIDIT-135: Added check for Python3 availability, disable Python3 shims when not present
     new 6d748f8  QPIDIT-136: Fix python2.7 site package path in PYTHON3PATH issue
     new 153441f  NO-JIRA: update repo location links/metadata
     new d6434c6  NO-JIRA: update years in NOTICE file
     new ee9eeea  QPIDIT-137: Change broker properties connection to use retries - 25 retries are now attmepted before the test fails.
     new 8407454  NO-JIRA: add .asf.yaml file with github repo metadata
     new 6313c68  NO-JIRA: fixup for last commit
     new bb122f3  bump year in NOTICE file
     new 9a39c6b  QPIDIT-138: Changed amqp.netlite shims to use dotnet rather than mono
     new daf14bd  NO_JIRA: Minor improvement to error reporting from cmake file when complex_data_test fails generation
     new 2db1a16  NO_JIRA: Minor improvement to error reporting from cmake file when complex_data_test fails generation
     new 8596299  NO_JIRA: Minor improvement to error reporting from cmake file when complex_data_test fails generation
     new 2cf31b5  NO_JIRA: Minor improvement to error reporting from cmake file when complex_data_test fails generation
     new b22e477  QPIDIT-138: Corrected wrong dotnet version: 3.1 changed to 2.1
     new 402fb98  QPIDIT-139: Improving install's detection of Python 2 and Python 3, preparing for swith to Python 3 tests. QPIDIT-135: Minor improvements to handling of Python 2 and Python 3 shims. The presence of PYTHON2PATH and PYTHON3PATH in env controls the running of the shims. QPIDIT-138: Minor improvements to messages during cmake run.
     new 2f64059  QPIDIT-139: Replacing workaround for for RHEL/CentOS 7 bug where Java_FOUND not being set correctly which was removed in last checkin.
     new 693b60e  QPIDIT-139: Further refinements and removing ugly stuff in the install, fixed python error around checking env vars
     new 1115372  QPIDIT-139: Added separate install for python 3 rather than using symbolic links
     new 0693a8a  QPIDIT-140: Fix for python pointing to Python 3.x in Fedora 31. Changed all references to python to python2.
     new 0ee6a0a  QPIDIT-139: Updated tests for Python3. Updated shims to receive and send base64-encoded binary, as JSON cannot send binary. Other tidy-ups and small optimizations.
     new 9b2fde3  QPIDIT-139: Added header <cstring> to amqp_large_content_test sender cpp shim
     new 6157dd1  QPIDIT-139: Added header <cstring> to other sender cpp shims
     new f106e0f  QPIDIT-139: Added header <cstring> to other receiver cpp shims
     new 073db2f  Update to remove dependency on perl-XML-XPath, use mvn query instead to extract version from pom.xml
     new c8725ed  Fix for bad vesion problem using maven to search the pom file

The 41 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


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


[qpid-interop-test] 07/41: QPIDIT-125: Minor updates to QUICKSTART.md

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit fcca6895b45bfea76258327ebad2ea735066a337
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Wed Jul 11 12:10:56 2018 -0400

    QPIDIT-125: Minor updates to QUICKSTART.md
---
 QUICKSTART.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/QUICKSTART.md b/QUICKSTART.md
index 09bddcc..e56fd25 100644
--- a/QUICKSTART.md
+++ b/QUICKSTART.md
@@ -230,6 +230,7 @@ or
 Assuming the source tree is located in directory qpid-interop-test:
 
 ````
+git checkout <tagname> # tagname is the release, for example 0.2.0-rc3
 cd qpid-interop-test
 mkdir build
 cd build

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


[qpid-interop-test] 19/41: NO-JIRA: update repo location links/metadata

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 153441f9af7215502c4af0fd379bb489c559d363
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Fri Dec 14 11:17:59 2018 +0000

    NO-JIRA: update repo location links/metadata
---
 QUICKSTART.md | 2 +-
 pom.xml       | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/QUICKSTART.md b/QUICKSTART.md
index 4143754..95e9e18 100644
--- a/QUICKSTART.md
+++ b/QUICKSTART.md
@@ -248,7 +248,7 @@ sudo make install
 If you are a developer working on changes to qpid-interop-test itself, the
 source repository can be cloned from git as follows:
 
-    git clone https://git-wip-us.apache.org/repos/asf/qpid-interop-test.git
+    git clone https://gitbox.apache.org/repos/asf/qpid-interop-test.git
     
 or
     
diff --git a/pom.xml b/pom.xml
index beac4a9..b3ef087 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,9 +40,9 @@
   </issueManagement>
 
   <scm>
-    <connection>scm:git:http://git-wip-us.apache.org/repos/asf/qpid-interop-test.git</connection>
-    <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/qpid-interop-test.git</developerConnection>
-    <url>https://git-wip-us.apache.org/repos/asf?p=qpid-interop-test.git</url>
+    <connection>scm:git:http://gitbox.apache.org/repos/asf/qpid-interop-test.git</connection>
+    <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/qpid-interop-test.git</developerConnection>
+    <url>https://gitbox.apache.org/repos/asf?p=qpid-interop-test.git</url>
   </scm>
 
   <properties>

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


[qpid-interop-test] 40/41: Update to remove dependency on perl-XML-XPath, use mvn query instead to extract version from pom.xml

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 073db2f3a7cd35a6fcaa8ee23d0cb114141dfc7a
Author: Kim van der Riet <ki...@vanderriet.com>
AuthorDate: Fri Jan 15 12:54:08 2021 -0500

    Update to remove dependency on perl-XML-XPath, use mvn query instead to extract version from pom.xml
---
 CMakeLists.txt                | 10 ----------
 get-proj-ver                  | 25 -------------------------
 shims/qpid-jms/CMakeLists.txt |  5 ++---
 3 files changed, 2 insertions(+), 38 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8baa4ee..6b8720f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -89,16 +89,6 @@ else ()
     message (STATUS "Maven found: ${Maven}")
 endif ()
 
-# Find xpath
-
-find_program(Xpath xpath)
-if (Xpath STREQUAL "Xpath-NOTFOUND")
-    message(STATUS "ERROR: xpath not found, but is required")
-    set (ErrorFlag TRUE)
-else ()
-    message(STATUS "xpath found: ${Xpath}")
-endif ()
-
 # Find Proton components
 
 find_package(Proton 0.30)
diff --git a/get-proj-ver b/get-proj-ver
deleted file mode 100755
index 478a7e1..0000000
--- a/get-proj-ver
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/perl
-
-#  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.
-
-use strict;
-use warnings;
-use XML::XPath;
-
-my $root = XML::XPath->new(filename => $ARGV[0]);
-for my $node ($root->find('//project/version/text()')->get_nodelist) {
-  print($node->getData, "\n");
-}
diff --git a/shims/qpid-jms/CMakeLists.txt b/shims/qpid-jms/CMakeLists.txt
index bda737b..588ad41 100644
--- a/shims/qpid-jms/CMakeLists.txt
+++ b/shims/qpid-jms/CMakeLists.txt
@@ -27,9 +27,8 @@ add_custom_target(jms-shims ALL ${Maven} -DskipTests package
 set(JMS_INSTALL_ROOT ${CMAKE_INSTALL_PREFIX}/libexec/qpid_interop_test/shims/qpid-jms)
 
 # Find the version string from the pom.xml file (as this in included in the jar file name)
-execute_process(COMMAND ${CMAKE_SOURCE_DIR}/get-proj-ver ${CMAKE_SOURCE_DIR}/pom.xml
-                OUTPUT_VARIABLE QPID_JMS_SHIM_VERSION
-                OUTPUT_STRIP_TRAILING_WHITESPACE)
+execute_process(COMMAND mvn org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.version -q -DforceStdout
+                OUTPUT_VARIABLE QPID_JMS_SHIM_VERSION)
 message(STATUS "Qpid JMS shim version: ${QPID_JMS_SHIM_VERSION}")
 
 install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/target/qpid-interop-test-jms-shim-${QPID_JMS_SHIM_VERSION}-jar-with-dependencies.jar"

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


[qpid-interop-test] 05/41: QPIDIT-127: Updated parent apache pom to v19

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 28dffad8596b26b552d6b50dd99d6be8b2b9397b
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Mon Jul 9 12:59:37 2018 -0400

    QPIDIT-127: Updated parent apache pom to v19
---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 90b35cb..d240d07 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,7 +31,7 @@
   <parent>
     <groupId>org.apache</groupId>
     <artifactId>apache</artifactId>
-    <version>18</version>
+    <version>19</version>
   </parent>
 
   <issueManagement>

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


[qpid-interop-test] 02/41: QPIDIT-125: Changed version number in the pom.xml file

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 11eb478731f1a839f6c20d1dc41a98bb8756c0bd
Author: Kim van der Riet <kv...@localhost.localdomain>
AuthorDate: Fri Jun 29 12:08:27 2018 -0400

    QPIDIT-125: Changed version number in the pom.xml file
---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index f80cc0c..822b9c4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
   <groupId>org.apache.qpid</groupId>
   <artifactId>qpid-interop-test-parent</artifactId>
   <packaging>pom</packaging>
-  <version>0.1.0</version>
+  <version>0.2.0-rc1</version>
   <url>https://qpid.apache.org</url>
   <name>Qpid Interop Test</name>
   <description>Qpid client interoperability test suite for AMQP 1.0 clients</description>

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


[qpid-interop-test] 15/41: QPIDIT-128: Changed construction of JAVA_HOME to be compliant with Java norms, also added warning when shim jar file is not found at start of JMS tests.

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 774f2564d084ed018f452ca60c4d7f612f0baa33
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Mon Jul 16 11:06:55 2018 -0400

    QPIDIT-128: Changed construction of JAVA_HOME to be compliant with Java norms, also added warning when shim jar file is not found at start of JMS tests.
---
 src/python/qpid_interop_test/qit_common.py | 2 ++
 src/python/qpid_interop_test/qit_shim.py   | 4 ++--
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/python/qpid_interop_test/qit_common.py b/src/python/qpid_interop_test/qit_common.py
index 8131237..94f5fcc 100644
--- a/src/python/qpid_interop_test/qit_common.py
+++ b/src/python/qpid_interop_test/qit_common.py
@@ -418,6 +418,8 @@ class QitJmsTest(QitTest):
         else:
             classpath = path.join(QIT_TEST_SHIM_HOME, 'qpid-jms',
                                   'qpid-interop-test-jms-shim-%s-jar-with-dependencies.jar' % QPID_JMS_SHIM_VER)
+            if not path.isfile(classpath):
+                print('WARNING: Jar not found: %s' % classpath)
 
         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)
diff --git a/src/python/qpid_interop_test/qit_shim.py b/src/python/qpid_interop_test/qit_shim.py
index fe9aafd..916337a 100644
--- a/src/python/qpid_interop_test/qit_shim.py
+++ b/src/python/qpid_interop_test/qit_shim.py
@@ -156,8 +156,8 @@ class QpidJmsShim(Shim):
     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')
+    JAVA_HOME = os.getenv('JAVA_HOME', '/usr')
+    JAVA_EXEC = os.path.join(JAVA_HOME, 'bin', 'java')
 
     def __init__(self, dependency_class_path, sender_shim, receiver_shim):
         super(QpidJmsShim, self).__init__(sender_shim, receiver_shim)

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


[qpid-interop-test] 24/41: bump year in NOTICE file

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit bb122f32c8b9e89f854b29c244f405cc7c6ef77a
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Thu Jan 9 13:01:04 2020 +0000

    bump year in NOTICE file
---
 NOTICE | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/NOTICE b/NOTICE
index 7872010..b4c1091 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
 Apache Qpid Interop Test
-Copyright 2015-2019 The Apache Software Foundation
+Copyright 2015-2020 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).

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


[qpid-interop-test] 20/41: NO-JIRA: update years in NOTICE file

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit d6434c645637e3ecf2adab10baef7d1c51486746
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Tue Jan 29 11:41:49 2019 +0000

    NO-JIRA: update years in NOTICE file
---
 NOTICE | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/NOTICE b/NOTICE
index 9b86a27..7872010 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
 Apache Qpid Interop Test
-Copyright 2015-2018 The Apache Software Foundation
+Copyright 2015-2019 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).

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


[qpid-interop-test] 23/41: NO-JIRA: fixup for last commit

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 6313c68612f56d3527c630730ed468cc89a81b83
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Tue Oct 1 11:28:24 2019 +0100

    NO-JIRA: fixup for last commit
---
 .asf.yaml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/.asf.yaml b/.asf.yaml
index 8119dea..c672c00 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -24,7 +24,6 @@ github:
     - messaging
     - interop
     - amqp10
-    - amqps
     - cpp
     - dotnet
     - java

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


[qpid-interop-test] 34/41: QPIDIT-139: Added separate install for python 3 rather than using symbolic links

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 111537291e52b7c8ef437bcbfccb4afa2c939f43
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Sat Jan 18 13:40:54 2020 -0500

    QPIDIT-139: Added separate install for python 3 rather than using symbolic links
---
 CMakeLists.txt | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9084cd1..c1a445a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -165,8 +165,11 @@ endif()
 configure_file(config.sh.in config.sh @ONLY)
 
 # Install files using python setup.py
-install(CODE "MESSAGE(STATUS \"Python install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/\")")
+install(CODE "MESSAGE(STATUS \"Python 2 install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/\")")
 install(CODE "execute_process(COMMAND python setup.py install --prefix ${CMAKE_INSTALL_PREFIX}
                               WORKING_DIRECTORY ../)")
+install(CODE "MESSAGE(STATUS \"Python 3 install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/\")")
+install(CODE "execute_process(COMMAND python3 setup.py install --prefix ${CMAKE_INSTALL_PREFIX}
+                              WORKING_DIRECTORY ../)")
 install(FILES build/config.sh
-        DESTINATION ${CMAKE_INSTALL_PREFIX}/libexec/qpid_interop_test/)
\ No newline at end of file
+        DESTINATION ${CMAKE_INSTALL_PREFIX}/libexec/qpid_interop_test/)

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


[qpid-interop-test] 28/41: NO_JIRA: Minor improvement to error reporting from cmake file when complex_data_test fails generation

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 859629927c66f6ad0b58b73650c4304d37f06a47
Author: Kim van der Riet <kv...@europa.lan>
AuthorDate: Wed Jan 15 17:14:50 2020 -0500

    NO_JIRA: Minor improvement to error reporting from cmake file when complex_data_test fails generation
---
 CMakeLists.txt | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 86cc635..c909095 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -98,8 +98,10 @@ execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_
                               RESULT_VARIABLE retcode
                               OUTPUT_VARIABLE stdouttext
                               ERROR_VARIABLE stderrtext
+                              COMMAND_ECHO STDOUT
 )
 if(NOT "${retcode}" STREQUAL "0")
+    message(STATUS "retcode=${retcode}")
     message(STATUS "stdouttext=${stdouttext}")
     message(STATUS "stderrtext=${stderrtext}")
     message(FATAL_ERROR "Data code file generation for C++ failed")

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


[qpid-interop-test] 37/41: QPIDIT-139: Added header to amqp_large_content_test sender cpp shim

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 9b2fde34007179eb933670c48f2e5728310eaf06
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Mon Jul 13 14:17:43 2020 -0400

    QPIDIT-139: Added header <cstring> to amqp_large_content_test sender cpp shim
---
 shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.cpp b/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.cpp
index 3b13493..c68cb2e 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.cpp
@@ -21,6 +21,7 @@
 
 #include "qpidit/amqp_large_content_test/Sender.hpp"
 
+#include <cstring>
 #include <iomanip>
 #include <iostream>
 #include <json/json.h>

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


[qpid-interop-test] 17/41: QPIDIT-135: Added check for Python3 availability, disable Python3 shims when not present

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit d2eea54c62fba703577422fc78c6efbdf5efd0c0
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Fri Aug 3 12:00:57 2018 -0400

    QPIDIT-135: Added check for Python3 availability, disable Python3 shims when not present
---
 CMakeLists.txt                             | 13 ++++++++-----
 config.sh.in                               | 11 ++++++++---
 get-python-dir-name                        | 14 ++++++++++++--
 src/python/qpid_interop_test/qit_common.py |  8 ++++++--
 4 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9e3c33b..790d7d7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -36,9 +36,12 @@ endif ()
 # Find Python 2.7.x install path
 
 find_package( PythonInterp 2.7 REQUIRED )
-execute_process(COMMAND ${CMAKE_SOURCE_DIR}/get-python-dir-name
-                OUTPUT_VARIABLE PYTHON_DIR_NAME)
-message(STATUS "Python install directory name: ${PYTHON_DIR_NAME}")
+execute_process(COMMAND ${CMAKE_SOURCE_DIR}/get-python-dir-name 2
+                OUTPUT_VARIABLE PYTHON2_DIR_NAME)
+message(STATUS "Python 2 install directory name: ${PYTHON2_DIR_NAME}")
+execute_process(COMMAND ${CMAKE_SOURCE_DIR}/get-python-dir-name 3
+                OUTPUT_VARIABLE PYTHON3_DIR_NAME)
+message(STATUS "Python 3 install directory name: ${PYTHON3_DIR_NAME}")
 
 # Find Java
 
@@ -126,7 +129,7 @@ add_subdirectory(shims/rhea-js)
 add_subdirectory(docs)
 
 # Install files using python setup.py
-install(CODE "MESSAGE(STATUS \"Python install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON_DIR_NAME}/site-packages/qpid_interop_test/\")")
+install(CODE "MESSAGE(STATUS \"Python install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/\")")
 install(CODE "execute_process(COMMAND python setup.py install --prefix ${CMAKE_INSTALL_PREFIX}
                               WORKING_DIRECTORY ../)")
 
@@ -134,6 +137,6 @@ install(CODE "execute_process(COMMAND python setup.py install --prefix ${CMAKE_I
 # Find a way to handle this as part of the Python install process instead
 # Set the following Python scripts to executable:
 install(CODE "execute_process(COMMAND bash -c \"chmod +x *_test.py\"
-                              WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON_DIR_NAME}/site-packages/qpid_interop_test/)")
+                              WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/)")
 
 configure_file(config.sh.in config.sh)
diff --git a/config.sh.in b/config.sh.in
index dff4634..f7bd3c2 100644
--- a/config.sh.in
+++ b/config.sh.in
@@ -19,8 +19,13 @@
 export QPID_INTEROP_TEST_HOME=@CMAKE_SOURCE_DIR@
 export QIT_INSTALL_PREFIX=@CMAKE_INSTALL_PREFIX@
 CURRENT_PYTHONPATH=$PYTHONPATH
-export PYTHONPATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python:$CURRENT_PYTHONPATH
-CURRENT_PYTHON3PATH=$PYTHON3PATH
-export PYTHON3PATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python3:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python:$CURRENT_PYTHON3PATH
+export PYTHONPATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON2_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python:$CURRENT_PYTHONPATH
+if [[ "@PYTHON3_DIR_NAME@" == "NOT_FOUND" ]]; then
+    unset PYTHON3PATH
+    echo "No Python 3.x found, Python 3 shims disabled"
+else
+    CURRENT_PYTHON3PATH=$PYTHON3PATH
+    export PYTHON3PATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python3:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON3_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python:$CURRENT_PYTHON3PATH
+fi
 export LD_LIBRARY_PATH=@CMAKE_INSTALL_PREFIX@/lib64:$LD_LIBRARY_PATH
 export PATH=@CMAKE_INSTALL_PREFIX@/lib/@PYTHON_DIR_NAME@/site-packages/qpid_interop_test:$PATH
diff --git a/get-python-dir-name b/get-python-dir-name
index e7515e6..8d971d8 100755
--- a/get-python-dir-name
+++ b/get-python-dir-name
@@ -15,5 +15,15 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
 
-PYTHON_DIR=`ls -d /usr/lib/python2*`
-echo -n ${PYTHON_DIR##*/}
+# $1: Python major version, either 2 or 3
+
+if [[ $# != 1 ]]; then
+    echo "Python major ver required as parameter"
+    exit 1
+fi
+PYTHON_DIR=`ls -d /usr/lib/python${1}* 2> /dev/null`
+if [[ $? == 0 ]]; then
+    echo -n ${PYTHON_DIR##*/}
+else
+    echo -n "NOT_FOUND"
+fi
diff --git a/src/python/qpid_interop_test/qit_common.py b/src/python/qpid_interop_test/qit_common.py
index 94f5fcc..f79ad48 100644
--- a/src/python/qpid_interop_test/qit_common.py
+++ b/src/python/qpid_interop_test/qit_common.py
@@ -37,6 +37,7 @@ QIT_INSTALL_PREFIX = getenv('QIT_INSTALL_PREFIX')
 if QIT_INSTALL_PREFIX is None:
     print('ERROR: Environment variable QIT_INSTALL_PREFIX is not set')
     sys.exit(1)
+QIT_ENABLE_PYTHON3_SHIM = getenv('PYTHON3PATH') is not None
 QIT_TEST_SHIM_HOME = path.join(QIT_INSTALL_PREFIX, 'libexec', 'qpid_interop_test', 'shims')
 
 QPID_JMS_SHIM_VER = '0.3.0-SNAPSHOT'
@@ -320,9 +321,12 @@ class QitTest(object):
                          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),
+#                         qpid_interop_test.qit_shim.ProtonPython3Shim.NAME: \
+#                         qpid_interop_test.qit_shim.ProtonPython3Shim(proton_python_snd_shim, proton_python_rcv_shim),
                         }
+        if QIT_ENABLE_PYTHON3_SHIM:
+            self.shim_map[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
         # Rhea Javascript client

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


[qpid-interop-test] 21/41: QPIDIT-137: Change broker properties connection to use retries - 25 retries are now attmepted before the test fails.

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit ee9eeea6db2190ea2d807be0cc3a82ca92f99d71
Author: Kim van der Riet <kv...@localhost.localdomain>
AuthorDate: Tue Sep 3 17:24:15 2019 -0400

    QPIDIT-137: Change broker properties connection to use retries - 25 retries are now attmepted before the test fails.
---
 src/python/qpid_interop_test/qit_broker_props.py | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/python/qpid_interop_test/qit_broker_props.py b/src/python/qpid_interop_test/qit_broker_props.py
index 144f2a0..1553744 100644
--- a/src/python/qpid_interop_test/qit_broker_props.py
+++ b/src/python/qpid_interop_test/qit_broker_props.py
@@ -22,6 +22,7 @@ gets the broker connection properties so as to identify the broker.
 # under the License.
 #
 
+import sys
 import proton.handlers
 import proton.reactor
 from qpid_interop_test.qit_errors import InteropTestError
@@ -30,17 +31,21 @@ class Client(proton.handlers.MessagingHandler):
     """
     Client to connect to broker and collect connection properties, used to identify the test broker
     """
-    def __init__(self, url):
+    def __init__(self, url, max_num_retries):
         super(Client, self).__init__()
         self.url = url
+        self.max_num_retries = max_num_retries;
+        self.num_retries = 0
         self.remote_properties = None
 
     def on_start(self, event):
         """Event loop start"""
-        event.container.connect(url=self.url, sasl_enabled=False, reconnect=False)
+        event.container.connect(url=self.url, sasl_enabled=False)
 
     def on_connection_remote_open(self, event):
         """Callback for remote connection open"""
+        if self.num_retries > 0:
+            print(' broker found.')
         self.remote_properties = event.connection.remote_properties
         event.connection.close()
 
@@ -49,10 +54,19 @@ class Client(proton.handlers.MessagingHandler):
         return self.remote_properties
 
     def on_transport_error(self, event):
-        raise InteropTestError('ERROR: broker not found at %s' % self.url)
+        self.num_retries += 1
+        if (self.num_retries == 1):
+            sys.stdout.write('WARNING: broker not found at %s, retrying *' % self.url)
+            sys.stdout.flush()
+        elif (self.num_retries <= self.max_num_retries):
+            sys.stdout.write(' *')
+            sys.stdout.flush()
+        else:
+            print('')
+            raise InteropTestError('ERROR: broker not found at %s after %d retries' % (self.url, self.max_num_retries))
 
 def get_broker_properties(broker_url):
     """Start client, then return its connection properties"""
-    msg_handler = Client(broker_url)
+    msg_handler = Client(broker_url, 25)
     proton.reactor.Container(msg_handler).run()
     return msg_handler.get_connection_properties()

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


[qpid-interop-test] 41/41: Fix for bad vesion problem using maven to search the pom file

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit c8725eda6bdb8ca84b68fdc22caac97ed68d2b7b
Author: Kim van der Riet <ki...@vanderriet.com>
AuthorDate: Thu Feb 4 10:25:56 2021 -0500

    Fix for bad vesion problem using maven to search the pom file
---
 shims/qpid-jms/CMakeLists.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/shims/qpid-jms/CMakeLists.txt b/shims/qpid-jms/CMakeLists.txt
index 588ad41..b17b4ee 100644
--- a/shims/qpid-jms/CMakeLists.txt
+++ b/shims/qpid-jms/CMakeLists.txt
@@ -28,6 +28,7 @@ set(JMS_INSTALL_ROOT ${CMAKE_INSTALL_PREFIX}/libexec/qpid_interop_test/shims/qpi
 
 # Find the version string from the pom.xml file (as this in included in the jar file name)
 execute_process(COMMAND mvn org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.version -q -DforceStdout
+                WORKING_DIRECTORY ../
                 OUTPUT_VARIABLE QPID_JMS_SHIM_VERSION)
 message(STATUS "Qpid JMS shim version: ${QPID_JMS_SHIM_VERSION}")
 

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


[qpid-interop-test] 14/41: QPIDIT-133: Removed float test values 'inf', '-inf' from amqp-complex-types-test becasue of Proton bug

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 0c128063ec46ffc7e64244f4487cdfa64ae15656
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Mon Jul 16 10:17:03 2018 -0400

    QPIDIT-133: Removed float test values 'inf', '-inf' from amqp-complex-types-test becasue of Proton bug
---
 src/python/qpid_interop_test/amqp_complex_types_test.array.json | 2 --
 src/python/qpid_interop_test/amqp_complex_types_test.list.json  | 2 --
 src/python/qpid_interop_test/amqp_complex_types_test.map.json   | 2 --
 3 files changed, 6 deletions(-)

diff --git a/src/python/qpid_interop_test/amqp_complex_types_test.array.json b/src/python/qpid_interop_test/amqp_complex_types_test.array.json
index 22c02de..d2d5833 100644
--- a/src/python/qpid_interop_test/amqp_complex_types_test.array.json
+++ b/src/python/qpid_interop_test/amqp_complex_types_test.array.json
@@ -48,8 +48,6 @@
             ["float", -2.71828],
             ["float", "1.2345e+38"],
             ["float", "-1.2345e-38"],
-            ["float", "inf"],
-            ["float", "-inf"],
             ["float", "NaN"]]],
  ["array", [["double", 0.0],
             ["double", 3.141592653589793],
diff --git a/src/python/qpid_interop_test/amqp_complex_types_test.list.json b/src/python/qpid_interop_test/amqp_complex_types_test.list.json
index 4c97c9b..12f0958 100644
--- a/src/python/qpid_interop_test/amqp_complex_types_test.list.json
+++ b/src/python/qpid_interop_test/amqp_complex_types_test.list.json
@@ -48,8 +48,6 @@
            ["float", -2.71828],
            ["float", "1.2345e+38"],
            ["float", "-1.2345e-38"],
-           ["float", "inf"],
-           ["float", "-inf"],
            ["float", "NaN"]]],
  ["list", [["double", 0.0],
            ["double", 3.141592653589793],
diff --git a/src/python/qpid_interop_test/amqp_complex_types_test.map.json b/src/python/qpid_interop_test/amqp_complex_types_test.map.json
index 63dff06..c242b6b 100644
--- a/src/python/qpid_interop_test/amqp_complex_types_test.map.json
+++ b/src/python/qpid_interop_test/amqp_complex_types_test.map.json
@@ -47,8 +47,6 @@
           ["float", -2.71828], ["float", -2.71828],
           ["float", "1.2345e+38"], ["float", "1.2345e+38"],
           ["float", "-1.2345e-38"], ["float", "-1.2345e-38"],
-          ["float", "inf"], ["float", "inf"],
-          ["float", "-inf"], ["float", "-inf"],
           ["float", "NaN"], ["float", "NaN"]]],
  ["map", [["double", 0.0], ["double", 0.0],
           ["double", 3.141592653589793], ["double", 3.141592653589793],

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


[qpid-interop-test] 38/41: QPIDIT-139: Added header to other sender cpp shims

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 6157dd13760c3a1dd8f5af07ff1dcb7e96bb424e
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Mon Jul 13 14:21:31 2020 -0400

    QPIDIT-139: Added header <cstring> to other sender cpp shims
---
 shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.cpp     | 1 +
 shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.cpp | 1 +
 shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.cpp   | 1 +
 3 files changed, 3 insertions(+)

diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.cpp b/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.cpp
index abefb5d..2ff0883 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.cpp
@@ -23,6 +23,7 @@
 #include "qpidit/Base64.hpp"
 
 #include <cstdlib>
+#include <cstring>
 #include <iomanip>
 #include <iostream>
 #include <json/json.h>
diff --git a/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.cpp b/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.cpp
index 2ef0d07..92069b3 100644
--- a/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.cpp
@@ -23,6 +23,7 @@
 #include "qpidit/Base64.hpp"
 
 #include <cerrno>
+#include <cstring>
 #include <iomanip>
 #include <iostream>
 #include <json/json.h>
diff --git a/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.cpp b/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.cpp
index 5a61be5..d280e94 100644
--- a/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.cpp
@@ -23,6 +23,7 @@
 #include "qpidit/Base64.hpp"
 
 #include <cerrno>
+#include <cstring>
 #include <iomanip>
 #include <iostream>
 #include <json/json.h>

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


[qpid-interop-test] 08/41: QPIDIT-125: More minor updates to QUICKSTART.md

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 5f8ef9974efb6c19d0229a4d6a25c55c03344346
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Wed Jul 11 12:19:44 2018 -0400

    QPIDIT-125: More minor updates to QUICKSTART.md
---
 QUICKSTART.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/QUICKSTART.md b/QUICKSTART.md
index e56fd25..a9675eb 100644
--- a/QUICKSTART.md
+++ b/QUICKSTART.md
@@ -230,8 +230,9 @@ or
 Assuming the source tree is located in directory qpid-interop-test:
 
 ````
-git checkout <tagname> # tagname is the release, for example 0.2.0-rc3
 cd qpid-interop-test
+git tag -l # See list of tags
+git checkout tags/<tagname> # tagname is the release, for example 0.2.0-rc3
 mkdir build
 cd build
 ````

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


[qpid-interop-test] 29/41: NO_JIRA: Minor improvement to error reporting from cmake file when complex_data_test fails generation

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 2cf31b57029caca95a78c96957fc030bbbf797cd
Author: Kim van der Riet <kv...@europa.lan>
AuthorDate: Thu Jan 16 07:35:49 2020 -0500

    NO_JIRA: Minor improvement to error reporting from cmake file when complex_data_test fails generation
---
 CMakeLists.txt | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c909095..48506a8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -96,15 +96,9 @@ endif ()
 execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen cpp --src-dir src/python/qpid_interop_test --gen-dir shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test
                               WORKING_DIRECTORY ../
                               RESULT_VARIABLE retcode
-                              OUTPUT_VARIABLE stdouttext
-                              ERROR_VARIABLE stderrtext
-                              COMMAND_ECHO STDOUT
 )
 if(NOT "${retcode}" STREQUAL "0")
-    message(STATUS "retcode=${retcode}")
-    message(STATUS "stdouttext=${stdouttext}")
-    message(STATUS "stderrtext=${stderrtext}")
-    message(FATAL_ERROR "Data code file generation for C++ failed")
+    message(FATAL_ERROR "Data code file generation for C++ failed: ${retcode}")
 endif()
 
 execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen python --src-dir src/python/qpid_interop_test --gen-dir shims/qpid-proton-python/src/amqp_complex_types_test
@@ -112,7 +106,7 @@ execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_
                               RESULT_VARIABLE retcode
 )
 if(NOT "${retcode}" STREQUAL "0")
-    message(FATAL_ERROR "Data code file generation for Python failed")
+    message(FATAL_ERROR "Data code file generation for Python failed: ${retcode}")
 endif()
 
 execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen javascript --src-dir src/python/qpid_interop_test --gen-dir shims/rhea-js/amqp_complex_types_test
@@ -120,7 +114,7 @@ execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_
                               RESULT_VARIABLE retcode
 )
 if(NOT "${retcode}" STREQUAL "0")
-    message(FATAL_ERROR "Data code file generation for JavaScript failed")
+    message(FATAL_ERROR "Data code file generation for JavaScript failed: ${retcode}")
 endif()
 
 execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen dotnet --src-dir src/python/qpid_interop_test --gen-dir shims/amqpnetlite/src/amqp_complex_types_test
@@ -128,7 +122,7 @@ execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_
                               RESULT_VARIABLE retcode
 )
 if(NOT "${retcode}" STREQUAL "0")
-    message(FATAL_ERROR "Data code file generation for .Net failed")
+    message(FATAL_ERROR "Data code file generation for .Net failed: ${retcode}")
 endif()
 
 add_subdirectory(shims/qpid-proton-cpp/src)

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


[qpid-interop-test] 27/41: NO_JIRA: Minor improvement to error reporting from cmake file when complex_data_test fails generation

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 2db1a16ef378ca01c3ce391d35d53f078cb4d933
Author: Kim van der Riet <kv...@europa.lan>
AuthorDate: Wed Jan 15 17:11:20 2020 -0500

    NO_JIRA: Minor improvement to error reporting from cmake file when complex_data_test fails generation
---
 CMakeLists.txt | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 41b2ae8..86cc635 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -96,10 +96,12 @@ endif ()
 execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen cpp --src-dir src/python/qpid_interop_test --gen-dir shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test
                               WORKING_DIRECTORY ../
                               RESULT_VARIABLE retcode
+                              OUTPUT_VARIABLE stdouttext
                               ERROR_VARIABLE stderrtext
 )
 if(NOT "${retcode}" STREQUAL "0")
-    message("${stderrtext}")
+    message(STATUS "stdouttext=${stdouttext}")
+    message(STATUS "stderrtext=${stderrtext}")
     message(FATAL_ERROR "Data code file generation for C++ failed")
 endif()
 

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


[qpid-interop-test] 39/41: QPIDIT-139: Added header to other receiver cpp shims

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit f106e0f64ff371aa37a7cebf30415b5976547e44
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Mon Jul 13 14:25:16 2020 -0400

    QPIDIT-139: Added header <cstring> to other receiver cpp shims
---
 shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Receiver.cpp | 1 +
 shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Receiver.cpp   | 1 +
 2 files changed, 2 insertions(+)

diff --git a/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Receiver.cpp b/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Receiver.cpp
index cb275a6..bcaaede 100644
--- a/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Receiver.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Receiver.cpp
@@ -22,6 +22,7 @@
 #include "qpidit/jms_hdrs_props_test/Receiver.hpp"
 #include "qpidit/Base64.hpp"
 
+#include <cstring>
 #include <ctime>
 #include <iostream>
 #include <json/json.h>
diff --git a/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Receiver.cpp b/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Receiver.cpp
index 0682225..39de811 100644
--- a/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Receiver.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Receiver.cpp
@@ -22,6 +22,7 @@
 #include "qpidit/jms_messages_test/Receiver.hpp"
 #include "qpidit/Base64.hpp"
 
+#include <cstring>
 #include <iostream>
 #include <json/json.h>
 #include <proton/connection.hpp>

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


[qpid-interop-test] 25/41: QPIDIT-138: Changed amqp.netlite shims to use dotnet rather than mono

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 9a39c6b10b3cadd70d80fc2be2c984bb73094bcc
Author: Kim van der Riet <kv...@europa.lan>
AuthorDate: Wed Jan 15 16:07:49 2020 -0500

    QPIDIT-138: Changed amqp.netlite shims to use dotnet rather than mono
---
 shims/amqpnetlite/src/CMakeLists.txt               | 161 +++++++++------------
 .../amqp_large_content_test/Receiver/App.config    |  24 ---
 .../Receiver/Properties/AssemblyInfo.cs            |  57 --------
 .../amqp_large_content_test/Receiver/Receiver.cs   |   2 -
 .../Receiver/Receiver.csproj.in                    |  75 +---------
 .../Receiver/packages.config                       |  21 ---
 .../src/amqp_large_content_test/Sender/App.config  |  24 ---
 .../Sender/Properties/AssemblyInfo.cs              |  57 --------
 .../src/amqp_large_content_test/Sender/Sender.cs   |   5 +-
 .../Sender/Sender.csproj.in                        |  74 +---------
 .../amqp_large_content_test/Sender/packages.config |  21 ---
 .../src/amqp_types_test/Receiver/App.config        |  24 ---
 .../Receiver/Properties/AssemblyInfo.cs            |  57 --------
 .../src/amqp_types_test/Receiver/Receiver.cs       |   2 -
 .../amqp_types_test/Receiver/Receiver.csproj.in    |  75 +---------
 .../src/amqp_types_test/Receiver/packages.config   |  21 ---
 .../src/amqp_types_test/Sender/App.config          |  24 ---
 .../Sender/Properties/AssemblyInfo.cs              |  57 --------
 .../src/amqp_types_test/Sender/Sender.cs           |   7 +-
 .../src/amqp_types_test/Sender/Sender.csproj.in    |  74 +---------
 .../src/amqp_types_test/Sender/packages.config     |  21 ---
 shims/rhea-js/amqp_types_test/README               |   2 +-
 src/python/qpid_interop_test/qit_common.py         |   4 +-
 src/python/qpid_interop_test/qit_shim.py           |   8 +-
 24 files changed, 97 insertions(+), 800 deletions(-)

diff --git a/shims/amqpnetlite/src/CMakeLists.txt b/shims/amqpnetlite/src/CMakeLists.txt
index 26bc2d5..58a2678 100644
--- a/shims/amqpnetlite/src/CMakeLists.txt
+++ b/shims/amqpnetlite/src/CMakeLists.txt
@@ -18,9 +18,7 @@
 #
 
 # Building AMQP.Net Lite shim requires
-# * Mono version 4.2.4 or later
-# * AMQPNETLITE_LIB_DIR names directory that holds Ampq.Net.dll
-#   and optionally .pdb and .xml files.
+# * DotNet version 2.1
 #
 # Define -DBUILD_AMQPNETLITE=ON (or OFF) at the cmake command line
 # to force a build or not.
@@ -29,55 +27,38 @@ project (qpid-interop-test-amqpnetlite-shims)
 
 cmake_minimum_required(VERSION 2.8.7 FATAL_ERROR)
 
-# Set BUILD_AMQPNETLITE control variable based on sensed environment
-set(lite_default ON)
 
-find_program(PROG_MONO mono)
+# Check for presence of dotnet assembly
+MACRO (check_dotnet_assembly
+       env_var               # Environment variable name to be checked containing path to directory
+       file_name             # Name of file in directory to be checked
+       found_flag)           # Variable which will contain ON or OFF if successfully found
+  if ("${${env_var}}" STREQUAL "")
+    message(STATUS "AMQP.Net Lite shim requires '${file_name}' to be in folder located in '${env_var}' environment variable, but '${env_var}' is not defined.")
+    set(${found_flag} OFF)
+  else()
+    if (NOT EXISTS ${${env_var}})
+      # Env var "env_var" is set, check if its value is a directory
+      message(STATUS "AMQP.Net Lite shim requires '${file_name}' to be in folder located in '${env_var}' environment variable")
+      message(STATUS "AMQP.Net Lite library directory '${${env_var}}' does not exist.")
+      set(${found_flag} OFF)
+    else()
+      # Check file "file_name" exists in directory contained in env var "env_var"
+      if (EXISTS ${${env_var}}/${file_name})
+        message(STATUS "Required dll found: ${${env_var}}/${file_name}")
+      else()
+        message(STATUS "AMQP.Net Lite shim requires '${file_name}' to be in folder located in '${env_var}' environment variable, but was not found")
+        set(${found_flag} OFF)
+      endif()
+    endif()
+  endif()
+ENDMACRO(check_dotnet_assembly)
 
-if (PROG_MONO STREQUAL "PROG_MONO-NOTFOUND")
-  message(STATUS "Program 'mono' is not found. AMQP.Net Lite shim requires mono.")
-  set(lite_default OFF)
-else ()
-  # mono found. Check version
-  execute_process(COMMAND mono --version OUTPUT_VARIABLE ov)
-  if("${ov}" STREQUAL "")
-    message(STATUS "Mono appears to be installed but the version is not detected. AMQP.Net Lite requires mono minimum version 4.2.4.")
-    set(lite_default OFF)
-  else ()
-    string(REPLACE " " ";" ov_list ${ov})
-    list(GET ov_list 4 mono_ver)
-    if (mono_ver VERSION_LESS "4.2.4")
-      message(STATUS "Mono version ${mono_ver} detected. AMQP.Net Lite requires mono minimum version 4.2.4.")
-      set(lite_default OFF)
-    else ()
-      # check for DLL source directory
-      if ("${AMQPNETLITE_LIB_DIR}" STREQUAL "")
-        message(STATUS "AMQP.Net Lite shim requires Amqp.Net.dll to be in folder located with AMQPNETLITE_LIB_DIR environment variable and AMQPNETLITE_LIB_DIR is not defined.")
-        set(lite_default OFF)
-      else ()
-        if (NOT EXISTS ${AMQPNETLITE_LIB_DIR})
-          message(STATUS "AMQP.Net Lite shim requires Amqp.Net.dll to be in folder located with AMQPNETLITE_LIB_DIR environment variable")
-          message(STATUS "AMQP.Net Lite library directory '${AMQPNETLITE_LIB_DIR}' does not exist.")
-          set(lite_default OFF)
-        else ()
-          if (NOT EXISTS ${AMQPNETLITE_LIB_DIR}/Amqp.Net.dll)
-            message(STATUS "AMQP.Net Lite shim requires Amqp.Net.dll to be in folder located with AMQPNETLITE_LIB_DIR environment variable")
-            message(STATUS "AMQP.Net Lite DLL does not exist in library directory '${AMQPNETLITE_LIB_DIR}'")
-            set(lite_default OFF)
-          endif ()
-        endif ()
-      endif ()
-    endif ()
-  endif ()
-endif ()
-
-# Set option that controls the build process
-option(BUILD_AMQPNETLITE "Build AMQP.Net Lite shim under mono" ${lite_default})
-
-message(STATUS "BUILD_AMQPNETLITE = ${BUILD_AMQPNETLITE}")
 
 # Configure/build/install a single test
-MACRO (define_lite_test testname)
+MACRO (define_lite_test
+       testname)             # Name of test
+
   # Configure the csproj files
   configure_file(               ${testname}/Receiver/Receiver.csproj.in
     ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Receiver/Receiver.csproj
@@ -90,13 +71,13 @@ MACRO (define_lite_test testname)
   add_custom_target(
     amqpnetlite_${testname}_Sender
     ALL
-    COMMAND xbuild Sender.csproj > xbuild.log
+    COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/${testname}/Sender/Sender.cs ${CMAKE_BINARY_DIR}/shims/amqpnetlite/src/${testname}/Sender/
+    COMMAND dotnet add package AMQPNetLite
+    COMMAND dotnet add package Newtonsoft.Json
+    COMMAND dotnet publish --output ${LITE_INSTALL_ROOT}/${testname}/Sender/ --verbosity minimal
     DEPENDS
       ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Sender/Sender.csproj
       ${CMAKE_CURRENT_SOURCE_DIR}/${testname}/Sender/Sender.cs
-      ${CMAKE_CURRENT_SOURCE_DIR}/${testname}/Sender/Properties/AssemblyInfo.cs
-      ${CMAKE_CURRENT_SOURCE_DIR}/${testname}/Sender/App.config
-      ${CMAKE_CURRENT_SOURCE_DIR}/${testname}/Sender/packages.config
     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Sender
     COMMENT Cross compiling amqpnetlite ${testname}/Sender
   )
@@ -104,53 +85,55 @@ MACRO (define_lite_test testname)
   add_custom_target(
     amqpnetlite_${testname}_Receiver
     ALL
-    COMMAND xbuild Receiver.csproj > xbuild.log
+    COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/${testname}/Receiver/Receiver.cs ${CMAKE_BINARY_DIR}/shims/amqpnetlite/src/${testname}/Receiver/
+    COMMAND dotnet add package AMQPNetLite
+    COMMAND dotnet publish --output ${LITE_INSTALL_ROOT}/${testname}/Receiver/ --verbosity minimal
     DEPENDS
       ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Receiver/Receiver.csproj
       ${CMAKE_CURRENT_SOURCE_DIR}/${testname}/Receiver/Receiver.cs
-      ${CMAKE_CURRENT_SOURCE_DIR}/${testname}/Receiver/Properties/AssemblyInfo.cs
-      ${CMAKE_CURRENT_SOURCE_DIR}/${testname}/Receiver/App.config
-      ${CMAKE_CURRENT_SOURCE_DIR}/${testname}/Receiver/packages.config
     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Receiver
     COMMENT Cross compiling amqpnetlite ${testname}/Receiver
   )
 
-  # Install
-  
-  install(
-    FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Receiver/bin/Amqp.Net.dll
-    DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
-  
-  install(
-    FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Receiver/bin/Receiver.exe
-    DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
-
-  install(
-    FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Receiver/bin/Receiver.exe.config
-    DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
-
-  install(
-    FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Receiver/bin/Receiver.exe.mdb
-    DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
-
-  install(
-    FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Sender/bin/Sender.exe
-    DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
-
-  install(
-    FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Sender/bin/Sender.exe.config
-    DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
-
-  install(
-    FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Sender/bin/Sender.exe.mdb
-    DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
 ENDMACRO (define_lite_test)
 
-# Stage the build
+
+
+
+set(build_amqpnetlite_default ON)  # Set BUILD_AMQPNETLITE control variable based on prerequisites being present
+set(REQUIRED_DOTNET_VERSION 3.1)
+set(BUILD_CONFIG Release) # Debug or Release
+
+# --- Check prerequisites ---
+# 1. Find dotnet
+find_program(DOTNET dotnet)
+if (DOTNET STREQUAL "DOTNET-NOTFOUND")
+  message(STATUS "Program 'dotnet' not found.")
+  set(build_amqpnetlite_default OFF)
+else()
+  # 2. dotnet found. Check required version exists
+  execute_process(COMMAND dotnet --version OUTPUT_VARIABLE ov)
+  if("${ov}" STREQUAL "")
+    message(STATUS "'dotnet' appears to be installed but version is not detected. 'dotnet' version ${REQUIRED_DOTNET_VERSION} required.")
+    set(build_amqpnetlite_default OFF)
+  else()
+    # 3. dotnet version string obtained, isolate version number as string, check version requirement
+    string(REGEX MATCH "[0-9]+(\\.[0-9]+)" dotnet_ver "${ov}")
+    if (${dotnet_ver} VERSION_EQUAL "${REQUIRED_DOTNET_VERSION}")
+      message(STATUS  "'dotnet' version ${dotnet_ver} found.")
+    else()
+      message(STATUS "'dotnet' version ${dotnet_ver} found. 'dotnet' version ${REQUIRED_DOTNET_VERSION} required.")
+      set(build_amqpnetlite_default OFF)
+    endif()
+  endif()
+endif()
+
+# Set option that controls the build process
+option(BUILD_AMQPNETLITE "Build AMQP.Net Lite shim under dotnet v.${REQUIRED_DOTNET_VERSION}" ${build_amqpnetlite_default})
+message(STATUS "BUILD_AMQPNETLITE = ${BUILD_AMQPNETLITE}")
+
+# --- Stage the build ---
 if (BUILD_AMQPNETLITE)
-  # Drop lite dll into build/packages
-  file(GLOB LITE_LIBS "${AMQPNETLITE_LIB_DIR}/Amqp.Net.*")
-  file(COPY ${LITE_LIBS} DESTINATION ${CMAKE_BINARY_DIR}/shims/amqpnetlite/packages/amqpnetlite/lib/net45/)
 
   # define lite install root
   set(LITE_INSTALL_ROOT ${CMAKE_INSTALL_PREFIX}/libexec/qpid_interop_test/shims/amqpnetlite)
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/App.config b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/App.config
deleted file mode 100644
index c60d743..0000000
--- a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/App.config
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
-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.
--->
-<configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
-    </startup>
-</configuration>
\ No newline at end of file
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Properties/AssemblyInfo.cs b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Properties/AssemblyInfo.cs
deleted file mode 100644
index aa2ca21..0000000
--- a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,57 +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.
- *
- */
-
- using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Receiver")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Receiver")]
-[assembly: AssemblyCopyright("Copyright ©  2016")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("57860fb2-59c1-4302-b48c-982a82585116")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers 
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.cs b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.cs
index eda4e9c..9773906 100644
--- a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.cs
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.cs
@@ -27,8 +27,6 @@ using System.Threading;
 using Amqp;
 using Amqp.Framing;
 using Amqp.Types;
-using System.Web.Script.Serialization;
-//using Newtonsoft.Json;
 
 namespace Qpidit
 {
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.csproj.in b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.csproj.in
index 94b60a4..685a04e 100644
--- a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.csproj.in
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.csproj.in
@@ -1,77 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-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
+<Project Sdk="Microsoft.NET.Sdk">
 
-  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.
--->
-<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{57860FB2-59C1-4302-B48C-982A82585116}</ProjectGuid>
     <OutputType>Exe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>Receiver</RootNamespace>
-    <AssemblyName>Receiver</AssemblyName>
-    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
+    <TargetFramework>netcoreapp@REQUIRED_DOTNET_VERSION@</TargetFramework>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="Amqp.Net, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\..\packages\amqpnetlite\lib\net45\Amqp.Net.dll</HintPath>
-    </Reference>
-    <Reference Include="System" />
-    <Reference Include="System.Core" />
-    <Reference Include="System.Runtime.Serialization" />
-    <Reference Include="System.Web" />
-    <Reference Include="System.Web.Extensions" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Net.Http" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_large_content_test/Receiver/Receiver.cs" />
-    <Compile Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_large_content_test/Receiver/Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_large_content_test/Receiver/App.config" />
-    <None Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_large_content_test/Receiver/packages.config" />
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+
 </Project>
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/packages.config b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/packages.config
deleted file mode 100644
index 7496c87..0000000
--- a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/packages.config
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-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.
--->
-<packages>
-</packages>
\ No newline at end of file
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Sender/App.config b/shims/amqpnetlite/src/amqp_large_content_test/Sender/App.config
deleted file mode 100644
index c60d743..0000000
--- a/shims/amqpnetlite/src/amqp_large_content_test/Sender/App.config
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
-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.
--->
-<configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
-    </startup>
-</configuration>
\ No newline at end of file
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Sender/Properties/AssemblyInfo.cs b/shims/amqpnetlite/src/amqp_large_content_test/Sender/Properties/AssemblyInfo.cs
deleted file mode 100644
index bc5c247..0000000
--- a/shims/amqpnetlite/src/amqp_large_content_test/Sender/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,57 +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.
- *
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Sender")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Sender")]
-[assembly: AssemblyCopyright("Copyright ©  2016")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("ab0b793a-c64c-4370-9f3e-75f80cdbdbd6")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers 
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.cs b/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.cs
index 8d0cbc7..86812a2 100644
--- a/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.cs
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.cs
@@ -26,10 +26,10 @@ using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading;
-using System.Web.Script.Serialization;
 using Amqp;
 using Amqp.Framing;
 using Amqp.Types;
+using Newtonsoft.Json;
 
 // Large_content_test is driven by a list like this:
 //
@@ -632,8 +632,7 @@ namespace Qpidit
                 String.Equals(amqpType, "symbol", StringComparison.OrdinalIgnoreCase))
             {
                 // Deserialize the count spec list
-                JavaScriptSerializer csl = new JavaScriptSerializer();
-                var itMsgs = csl.Deserialize<dynamic>(countSpec);
+                var itMsgs = JsonConvert.DeserializeObject<dynamic>(countSpec);
                 //if (!(itMsgs is Array))
                 //    throw new ApplicationException(String.Format(
                 //        "Messages are not formatted as a json list: {0}, but as type: {1}", countSpec, itMsgs.GetType().Name));
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.csproj.in b/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.csproj.in
index ca59361..685a04e 100644
--- a/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.csproj.in
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.csproj.in
@@ -1,76 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-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
+<Project Sdk="Microsoft.NET.Sdk">
 
-  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.
--->
-<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{AB0B793A-C64C-4370-9F3E-75F80CDBDBD6}</ProjectGuid>
     <OutputType>Exe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>Sender</RootNamespace>
-    <AssemblyName>Sender</AssemblyName>
-    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
+    <TargetFramework>netcoreapp@REQUIRED_DOTNET_VERSION@</TargetFramework>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="Amqp.Net, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\..\packages\amqpnetlite\lib\net45\Amqp.Net.dll</HintPath>
-    </Reference>
-    <Reference Include="System" />
-    <Reference Include="System.Core" />
-    <Reference Include="System.Runtime.Serialization" />
-    <Reference Include="System.Web.Extensions" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Net.Http" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_large_content_test/Sender/Sender.cs" />
-    <Compile Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_large_content_test/Sender/Properties/AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_large_content_test/Sender/App.config" />
-    <None Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_large_content_test/Sender/packages.config" />
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+
 </Project>
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Sender/packages.config b/shims/amqpnetlite/src/amqp_large_content_test/Sender/packages.config
deleted file mode 100644
index 7496c87..0000000
--- a/shims/amqpnetlite/src/amqp_large_content_test/Sender/packages.config
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-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.
--->
-<packages>
-</packages>
\ No newline at end of file
diff --git a/shims/amqpnetlite/src/amqp_types_test/Receiver/App.config b/shims/amqpnetlite/src/amqp_types_test/Receiver/App.config
deleted file mode 100644
index c60d743..0000000
--- a/shims/amqpnetlite/src/amqp_types_test/Receiver/App.config
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
-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.
--->
-<configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
-    </startup>
-</configuration>
\ No newline at end of file
diff --git a/shims/amqpnetlite/src/amqp_types_test/Receiver/Properties/AssemblyInfo.cs b/shims/amqpnetlite/src/amqp_types_test/Receiver/Properties/AssemblyInfo.cs
deleted file mode 100644
index aa2ca21..0000000
--- a/shims/amqpnetlite/src/amqp_types_test/Receiver/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,57 +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.
- *
- */
-
- using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Receiver")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Receiver")]
-[assembly: AssemblyCopyright("Copyright ©  2016")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("57860fb2-59c1-4302-b48c-982a82585116")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers 
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs b/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs
index 78c9e88..0443606 100644
--- a/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs
+++ b/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs
@@ -27,8 +27,6 @@ using System.Threading;
 using Amqp;
 using Amqp.Framing;
 using Amqp.Types;
-using System.Web.Script.Serialization;
-//using Newtonsoft.Json;
 
 namespace Qpidit
 {
diff --git a/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.csproj.in b/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.csproj.in
index bc5875c..685a04e 100644
--- a/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.csproj.in
+++ b/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.csproj.in
@@ -1,77 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-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
+<Project Sdk="Microsoft.NET.Sdk">
 
-  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.
--->
-<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{57860FB2-59C1-4302-B48C-982A82585116}</ProjectGuid>
     <OutputType>Exe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>Receiver</RootNamespace>
-    <AssemblyName>Receiver</AssemblyName>
-    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
+    <TargetFramework>netcoreapp@REQUIRED_DOTNET_VERSION@</TargetFramework>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="Amqp.Net, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\..\packages\amqpnetlite\lib\net45\Amqp.Net.dll</HintPath>
-    </Reference>
-    <Reference Include="System" />
-    <Reference Include="System.Core" />
-    <Reference Include="System.Runtime.Serialization" />
-    <Reference Include="System.Web" />
-    <Reference Include="System.Web.Extensions" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Net.Http" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_types_test/Receiver/Receiver.cs" />
-    <Compile Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_types_test/Receiver/Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_types_test/Receiver/App.config" />
-    <None Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_types_test/Receiver/packages.config" />
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+
 </Project>
diff --git a/shims/amqpnetlite/src/amqp_types_test/Receiver/packages.config b/shims/amqpnetlite/src/amqp_types_test/Receiver/packages.config
deleted file mode 100644
index 7496c87..0000000
--- a/shims/amqpnetlite/src/amqp_types_test/Receiver/packages.config
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-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.
--->
-<packages>
-</packages>
\ No newline at end of file
diff --git a/shims/amqpnetlite/src/amqp_types_test/Sender/App.config b/shims/amqpnetlite/src/amqp_types_test/Sender/App.config
deleted file mode 100644
index c60d743..0000000
--- a/shims/amqpnetlite/src/amqp_types_test/Sender/App.config
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
-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.
--->
-<configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
-    </startup>
-</configuration>
\ No newline at end of file
diff --git a/shims/amqpnetlite/src/amqp_types_test/Sender/Properties/AssemblyInfo.cs b/shims/amqpnetlite/src/amqp_types_test/Sender/Properties/AssemblyInfo.cs
deleted file mode 100644
index bc5c247..0000000
--- a/shims/amqpnetlite/src/amqp_types_test/Sender/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,57 +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.
- *
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Sender")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Sender")]
-[assembly: AssemblyCopyright("Copyright ©  2016")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("ab0b793a-c64c-4370-9f3e-75f80cdbdbd6")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers 
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.cs b/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.cs
index ff76732..979900f 100644
--- a/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.cs
+++ b/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.cs
@@ -25,10 +25,10 @@ using System.Collections.Generic;
 using System.IO;
 using System.Text;
 using System.Threading;
-using System.Web.Script.Serialization;
 using Amqp;
 using Amqp.Framing;
 using Amqp.Types;
+using Newtonsoft.Json;
 
 namespace Qpidit
 {
@@ -431,8 +431,7 @@ namespace Qpidit
             List<Message> messagesToSend = new List<Message>();
 
             // Deserialize the json message list
-            JavaScriptSerializer jss = new JavaScriptSerializer();
-            var itMsgs = jss.Deserialize<dynamic>(jsonMessages);
+            var itMsgs = JsonConvert.DeserializeObject<dynamic>(jsonMessages);
             //if (!(itMsgs is Array))
             //    throw new ApplicationException(String.Format(
             //        "Messages are not formatted as a json list: {0}, but as type: {1}", jsonMessages, itMsgs.GetType().Name));
@@ -440,7 +439,7 @@ namespace Qpidit
             // Generate messages
             foreach (object itMsg in itMsgs)
             {
-                MessageValue mv = new MessageValue(amqpType, itMsg);
+                MessageValue mv = new MessageValue(amqpType, itMsg.ToString());
                 mv.Encode();
                 messagesToSend.Add(mv.ToMessage());
             }
diff --git a/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.csproj.in b/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.csproj.in
index 6da7e8d..685a04e 100644
--- a/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.csproj.in
+++ b/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.csproj.in
@@ -1,76 +1,8 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-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
+<Project Sdk="Microsoft.NET.Sdk">
 
-  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.
--->
-<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{AB0B793A-C64C-4370-9F3E-75F80CDBDBD6}</ProjectGuid>
     <OutputType>Exe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>Sender</RootNamespace>
-    <AssemblyName>Sender</AssemblyName>
-    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
+    <TargetFramework>netcoreapp@REQUIRED_DOTNET_VERSION@</TargetFramework>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="Amqp.Net, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\..\..\packages\amqpnetlite\lib\net45\Amqp.Net.dll</HintPath>
-    </Reference>
-    <Reference Include="System" />
-    <Reference Include="System.Core" />
-    <Reference Include="System.Runtime.Serialization" />
-    <Reference Include="System.Web.Extensions" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Net.Http" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_types_test/Sender/Sender.cs" />
-    <Compile Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_types_test/Sender/Properties/AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_types_test/Sender/App.config" />
-    <None Include="@CMAKE_CURRENT_SOURCE_DIR@/amqp_types_test/Sender/packages.config" />
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+
 </Project>
diff --git a/shims/amqpnetlite/src/amqp_types_test/Sender/packages.config b/shims/amqpnetlite/src/amqp_types_test/Sender/packages.config
deleted file mode 100644
index 7496c87..0000000
--- a/shims/amqpnetlite/src/amqp_types_test/Sender/packages.config
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-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.
--->
-<packages>
-</packages>
\ No newline at end of file
diff --git a/shims/rhea-js/amqp_types_test/README b/shims/rhea-js/amqp_types_test/README
index feb8f79..97752a7 100644
--- a/shims/rhea-js/amqp_types_test/README
+++ b/shims/rhea-js/amqp_types_test/README
@@ -30,6 +30,6 @@ The AMQP types and test values are all set within the top-level test program.
 
 Required modules
 ----------------
- rhea (https://github.com/grs/rhea.git)
+ rhea (https://github.com/amqp/rhea.git)
  node-uuid (via npm)
 
diff --git a/src/python/qpid_interop_test/qit_common.py b/src/python/qpid_interop_test/qit_common.py
index f79ad48..bd066da 100644
--- a/src/python/qpid_interop_test/qit_common.py
+++ b/src/python/qpid_interop_test/qit_common.py
@@ -339,8 +339,8 @@ class QitTest(object):
             print('WARNING: Rhea Javascript shims not found')
 
         # AMQP DotNetLite client
-        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')
+        amqpnetlite_rcv_shim = path.join(QIT_TEST_SHIM_HOME, 'amqpnetlite', self.TEST_NAME, 'Receiver', 'Receiver.dll')
+        amqpnetlite_snd_shim = path.join(QIT_TEST_SHIM_HOME, 'amqpnetlite', self.TEST_NAME, 'Sender', 'Sender.dll')
         if path.isfile(amqpnetlite_rcv_shim) and path.isfile(amqpnetlite_snd_shim):
             self.shim_map[qpid_interop_test.qit_shim.AmqpNetLiteShim.NAME] = \
                 qpid_interop_test.qit_shim.AmqpNetLiteShim(amqpnetlite_snd_shim, amqpnetlite_rcv_shim)
diff --git a/src/python/qpid_interop_test/qit_shim.py b/src/python/qpid_interop_test/qit_shim.py
index 916337a..4cdb639 100644
--- a/src/python/qpid_interop_test/qit_shim.py
+++ b/src/python/qpid_interop_test/qit_shim.py
@@ -54,7 +54,9 @@ class ShimProcess(subprocess.Popen):
             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'):
+                # Workaround for deprecation warning on stderr:
+                if not stderrdata.startswith('Got a bad hardware address length for an AF_PACKET') and \
+                not "[DEP0005]" in stderrdata:
                     return 'stderr: %s\nstdout: %s' % (stderrdata, stdoutdata)
             if not stdoutdata: # zero length
                 return None
@@ -174,5 +176,5 @@ class AmqpNetLiteShim(Shim):
     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]
+        self.send_params = ['dotnet', self.sender_shim]
+        self.receive_params = ['dotnet', self.receiver_shim]

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


[qpid-interop-test] 04/41: QPIDIT-125: Updated QUICKSTART to give some details on installing Amqp.Net Lite, changed Maven pom files on master to be release 0.3.0-SNAPSHOT

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 21bd232bdc9fd66715a94bd331e1e3c47d8ffb45
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Mon Jul 9 12:26:17 2018 -0400

    QPIDIT-125: Updated QUICKSTART to give some details on installing Amqp.Net Lite, changed Maven pom files on master to be release 0.3.0-SNAPSHOT
---
 QUICKSTART.md          | 30 ++++++++++++++++++++++++++----
 pom.xml                |  2 +-
 shims/qpid-jms/pom.xml |  2 +-
 utils/pom.xml          |  2 +-
 4 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/QUICKSTART.md b/QUICKSTART.md
index 6f33dba..09bddcc 100644
--- a/QUICKSTART.md
+++ b/QUICKSTART.md
@@ -319,16 +319,38 @@ errors in the test on CentOS7 (which does not yet auto-detect but assumes the av
 
 ### 5.1 AMQP.Net Lite Client
 
-(TODO: import details to this document)
-
 A detailed description of how to install and run the AMQP.Net Lite client on Fedora may be found at Apache
 JIRA [QPIDIT-105](https://issues.apache.org/jira/browse/QPIDIT-105), and can easily be adapted to other
 Linux operating systems. The following packages need to be installed:
 
  * Mono
- * Pre-compiled AMQP.Net Lite library
+ * Pre-compiled AMQP.Net Lite library (available from https://www.nuget.org/api/v2/package/AMQPNetLite/)
+
+See the above JIRA for detailed instructions. Here is a summary:
+
+Download/install the Amqp.Net Lite dlls. They are initially zipped, unzip them into a well-known location.
+Make sure you can find the path to the required .dll file for the version you are using, for example:
+
+```
+/abs/path/to/amqp.netlite/lib/net45
+```
+
+When building qpid-interop-test (section 3 above), add the following environment variable to the cmake parameters:
+`-DAMQPNETLITE_LIB_DIR=<abs/path/to/amqp.netlite/lib/net45>`. When cmake completes, look for the following:
+
+```
+-- BUILD_AMQPNETLITE = ON
+```
+
+which shows that the dll was found and the .netlite tests will be enabled. If you see the following,
+then the required dll was not found:
+
+```
+-- BUILD_AMQPNETLITE = OFF
+```
 
-See the above JIRA for detailed instructions.
+The messages immediately preceding this will give a clue as to why it was not found, one of `AMQPNETLITE_LIB_DIR`
+not defined or `Amqp.Net.dll` was not found in the path.
 
 ### 5.2 Rhea JavaScript Client
 
diff --git a/pom.xml b/pom.xml
index e61069a..90b35cb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
   <groupId>org.apache.qpid</groupId>
   <artifactId>qpid-interop-test-parent</artifactId>
   <packaging>pom</packaging>
-  <version>0.2.0</version>
+  <version>0.3.0-SNAPSHOT</version>
   <url>https://qpid.apache.org</url>
   <name>Qpid Interop Test</name>
   <description>Qpid client interoperability test suite for AMQP 1.0 clients</description>
diff --git a/shims/qpid-jms/pom.xml b/shims/qpid-jms/pom.xml
index d50cabd..1f4d778 100644
--- a/shims/qpid-jms/pom.xml
+++ b/shims/qpid-jms/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.apache.qpid</groupId>
     <artifactId>qpid-interop-test-parent</artifactId>
-    <version>0.2.0</version>
+    <version>0.3.0-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
diff --git a/utils/pom.xml b/utils/pom.xml
index e3f86a0..02361ee 100644
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.apache.qpid</groupId>
     <artifactId>qpid-interop-test-parent</artifactId>
-    <version>0.1.0</version>
+    <version>0.3.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 

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


[qpid-interop-test] 03/41: QPIDIT-125: Fix for two .pom files with incorrect version and dependecy version information

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 4cd85c248634beaf176dabbeef76d87cb0fe2a7f
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Sat Jun 30 11:36:54 2018 -0400

    QPIDIT-125: Fix for two .pom files with incorrect version and dependecy version information
---
 pom.xml                | 4 ++--
 shims/qpid-jms/pom.xml | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/pom.xml b/pom.xml
index 822b9c4..e61069a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
   <groupId>org.apache.qpid</groupId>
   <artifactId>qpid-interop-test-parent</artifactId>
   <packaging>pom</packaging>
-  <version>0.2.0-rc1</version>
+  <version>0.2.0</version>
   <url>https://qpid.apache.org</url>
   <name>Qpid Interop Test</name>
   <description>Qpid client interoperability test suite for AMQP 1.0 clients</description>
@@ -53,7 +53,7 @@
     <!-- Dependency versions -->
     <geronimo.jms.2.spec-version>1.0-alpha-2</geronimo.jms.2.spec-version>
     <json-version>1.1</json-version>
-    <qpid-jms-client-version>0.25.0</qpid-jms-client-version>
+    <qpid-jms-client-version>0.34.0</qpid-jms-client-version>
     <slf4j-version>1.7.25</slf4j-version>
     
   </properties>
diff --git a/shims/qpid-jms/pom.xml b/shims/qpid-jms/pom.xml
index c42972f..d50cabd 100644
--- a/shims/qpid-jms/pom.xml
+++ b/shims/qpid-jms/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.apache.qpid</groupId>
     <artifactId>qpid-interop-test-parent</artifactId>
-    <version>0.1.0</version>
+    <version>0.2.0</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>

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


[qpid-interop-test] 12/41: QPIDIT-125: try adding a sub-heading for visibility and separation

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 0dee2b3c7cfb6fa8d113c8ec960bbd4926f7d904
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Thu Jul 12 13:26:54 2018 +0100

    QPIDIT-125: try adding a sub-heading for visibility and separation
---
 QUICKSTART.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/QUICKSTART.md b/QUICKSTART.md
index 957c4ac..9bcfcc3 100644
--- a/QUICKSTART.md
+++ b/QUICKSTART.md
@@ -242,6 +242,8 @@ sudo make install
 
 ````
 
+### 4.1 Source repository
+
 If you are a developer working on changes to qpid-interop-test itself, the
 source repository can be cloned from git as follows:
 

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


[qpid-interop-test] 22/41: NO-JIRA: add .asf.yaml file with github repo metadata

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 840745408b307b14f12515888526d9217ff3ff75
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Tue Oct 1 11:25:36 2019 +0100

    NO-JIRA: add .asf.yaml file with github repo metadata
---
 .asf.yaml | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 0000000..8119dea
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,32 @@
+#
+# 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.
+#
+github:
+  description: "Mirror of Apache Qpid Interop Test"
+  homepage: https://qpid.apache.org/components/interop-test
+  labels:
+    - qpid
+    - apache
+    - amqp
+    - messaging
+    - interop
+    - amqp10
+    - amqps
+    - cpp
+    - dotnet
+    - java
+    - javascript
+    - python

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


[qpid-interop-test] 30/41: QPIDIT-138: Corrected wrong dotnet version: 3.1 changed to 2.1

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit b22e477020c775f4062f363bc3186eb7cc61b538
Author: Kim van der Riet <kv...@europa.lan>
AuthorDate: Thu Jan 16 12:29:23 2020 -0500

    QPIDIT-138: Corrected wrong dotnet version: 3.1 changed to 2.1
---
 shims/amqpnetlite/src/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/shims/amqpnetlite/src/CMakeLists.txt b/shims/amqpnetlite/src/CMakeLists.txt
index 58a2678..c01b8dd 100644
--- a/shims/amqpnetlite/src/CMakeLists.txt
+++ b/shims/amqpnetlite/src/CMakeLists.txt
@@ -101,7 +101,7 @@ ENDMACRO (define_lite_test)
 
 
 set(build_amqpnetlite_default ON)  # Set BUILD_AMQPNETLITE control variable based on prerequisites being present
-set(REQUIRED_DOTNET_VERSION 3.1)
+set(REQUIRED_DOTNET_VERSION 2.1)
 set(BUILD_CONFIG Release) # Debug or Release
 
 # --- Check prerequisites ---

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


[qpid-interop-test] 13/41: QPIDIT-127: also override up to surefire 2.21.0 to resolve Java 10 compatibility issue

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 3e797692d36b1091f8c188896ef74821742e5d3f
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Thu Jul 12 13:30:11 2018 +0100

    QPIDIT-127: also override up to surefire 2.21.0 to resolve Java 10 compatibility issue
---
 pom.xml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index d240d07..beac4a9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -49,7 +49,8 @@
     <maven.compiler.source>1.7</maven.compiler.source>
     <maven.compiler.target>1.7</maven.compiler.target>
     <maven-assembly-plugin-version>2.6</maven-assembly-plugin-version>
-    
+    <surefire.version>2.21.0</surefire.version>
+
     <!-- Dependency versions -->
     <geronimo.jms.2.spec-version>1.0-alpha-2</geronimo.jms.2.spec-version>
     <json-version>1.1</json-version>

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


[qpid-interop-test] 26/41: NO_JIRA: Minor improvement to error reporting from cmake file when complex_data_test fails generation

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit daf14bd8334ce3bea5c1aedb11e37147704ca65f
Author: Kim van der Riet <kv...@europa.lan>
AuthorDate: Wed Jan 15 17:07:13 2020 -0500

    NO_JIRA: Minor improvement to error reporting from cmake file when complex_data_test fails generation
---
 CMakeLists.txt | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0fffdd0..41b2ae8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -96,30 +96,35 @@ endif ()
 execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen cpp --src-dir src/python/qpid_interop_test --gen-dir shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test
                               WORKING_DIRECTORY ../
                               RESULT_VARIABLE retcode
+                              ERROR_VARIABLE stderrtext
 )
 if(NOT "${retcode}" STREQUAL "0")
-    message(FATAL_ERROR "C++ generation failed")
+    message("${stderrtext}")
+    message(FATAL_ERROR "Data code file generation for C++ failed")
 endif()
+
 execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen python --src-dir src/python/qpid_interop_test --gen-dir shims/qpid-proton-python/src/amqp_complex_types_test
                               WORKING_DIRECTORY ../
                               RESULT_VARIABLE retcode
 )
 if(NOT "${retcode}" STREQUAL "0")
-    message(FATAL_ERROR "Python generation failed")
+    message(FATAL_ERROR "Data code file generation for Python failed")
 endif()
+
 execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen javascript --src-dir src/python/qpid_interop_test --gen-dir shims/rhea-js/amqp_complex_types_test
                               WORKING_DIRECTORY ../
                               RESULT_VARIABLE retcode
 )
 if(NOT "${retcode}" STREQUAL "0")
-    message(FATAL_ERROR "JavaScript generation failed")
+    message(FATAL_ERROR "Data code file generation for JavaScript failed")
 endif()
+
 execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen dotnet --src-dir src/python/qpid_interop_test --gen-dir shims/amqpnetlite/src/amqp_complex_types_test
                               WORKING_DIRECTORY ../
                               RESULT_VARIABLE retcode
 )
 if(NOT "${retcode}" STREQUAL "0")
-    message(FATAL_ERROR ".Net generation failed")
+    message(FATAL_ERROR "Data code file generation for .Net failed")
 endif()
 
 add_subdirectory(shims/qpid-proton-cpp/src)

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


[qpid-interop-test] 10/41: QPIDIT-125: focus on details that works rather than what doesnt, correct duplicate numbering in headings

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 2cf9bbf877c1c1da72ea17ade782fdbcb99d8780
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Thu Jul 12 13:07:34 2018 +0100

    QPIDIT-125: focus on details that works rather than what doesnt, correct duplicate numbering in headings
---
 QUICKSTART.md | 43 +++++++++++++++++++++----------------------
 1 file changed, 21 insertions(+), 22 deletions(-)

diff --git a/QUICKSTART.md b/QUICKSTART.md
index a9675eb..7613713 100644
--- a/QUICKSTART.md
+++ b/QUICKSTART.md
@@ -79,12 +79,9 @@ These are the install steps:
 
 ## 2. Install prerequisites
 
-### 2.1 RHEL6
+If installing prerequisites from packages, the following are some suggestions
 
-Currently **RHEL6 is not supported** because it uses Python 2.6.x, and the test code uses
-features of Python 2.7.x. This may be supported in a future release.
-
-### 2.2 RHEL7
+### 2.1 RHEL7
 
 From a clean install:
 
@@ -106,7 +103,9 @@ then install the following packages:
 yum -y install jsoncpp-devel nodejs-rhea qpid-proton-cpp-devel python-qpid-proton qpid-proton-cpp-devel python2-qpid-proton
 ````
 
-### 2.3 Fedora 28
+Note that RHEL6 is not supported because it uses Python 2.6.x, and the test code uses features of Python 2.7.x.
+
+### 2.2 Fedora 28
 
 All packages are available directly from the Fedora repositories:
 
@@ -114,7 +113,7 @@ All packages are available directly from the Fedora repositories:
 dnf -y install gcc-c++ cmake maven java-1.8.0-openjdk-devel perl-XML-XPath jsoncpp-devel nodejs-rhea qpid-proton-cpp-devel python-qpid-proton qpid-proton-cpp-devel python2-qpid-proton python3-qpid-proton
 ````
 
-### 2.4 CentOS7 Docker image
+### 2.3 CentOS7 Docker image
 
 Docker images come with only the bare essentials, so there is more to install than a standard bare-metal install:
 
@@ -138,19 +137,19 @@ yum -y install mono-devel python34-devel jsoncpp-devel nodejs-rhea qpid-proton-c
 
 Note that at the time of release, there is no python3-qpid-proton package available for CentOS7, but this should be available soon.
 
-### 2.5 Fedora 28 Docker image
+### 2.4 Fedora 28 Docker image
 
 ````
 dnf -y install vim unzip wget procps-ng git gcc-c++ make cmake maven swig java-1.8.0-openjdk-devel perl-XML-XPath python-devel mono-devel python3-devel jsoncpp-devel nodejs-rhea python-qpid-proton qpid-proton-cpp-devel python2-qpid-proton python3-qpid-proton
 ````
 
-## 2. Obtaining a broker
+## 3. Obtaining a broker
 
 Qpid-interop-test requires a running broker to be available. This
 may be on localhost as a local install or build, or on another machine, in which case its
 IP addresss must be known. Some local broker install options are:
 
-### 2.1 ActiveMQ 5
+### 3.1 ActiveMQ 5
 
 Download from [Apache](http://activemq.apache.org/download.html).
 
@@ -162,11 +161,11 @@ Make the following changes to the `activemq.xml` config file: For XML element
 <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=1048576000&amp;wireFormat.allowNonSaslConnections=true"/>
 ````
 
-### 2.2 Artemis
+### 3.2 Artemis
 
 Download from [Apache](https://activemq.apache.org/artemis/download.html).
 
-### 2.3 Qpid cpp broker
+### 3.3 Qpid cpp broker
 
     yum -y install qpid-cpp-server # CentOS7/RHEL
 
@@ -189,7 +188,7 @@ and can be stopped with
 
     /sbin/qpidd -q
 
-### 2.4 Qpid Dispatch Router
+### 3.4 Qpid Dispatch Router
 
     yum install qpid-dispatch-router
 
@@ -213,7 +212,7 @@ and can be stopped with
 
     pkill qdrouterd # Needs procps-ng package installed in Docker containers
 
-## 3. Install qpid-interop-test
+## 4. Install qpid-interop-test
 
 Qpid-interop-test may be installed locally (preferred for local builds) or to the system
 (which requires root privileges). For a local install, use the `-DCMAKE_INSTALL_PREFIX`
@@ -252,9 +251,9 @@ sudo make install
 
 ````
 
-## 4. Run the tests
+## 5. Run the tests
 
-### 4.1 Set the environment
+### 5.1 Set the environment
 
 The config.sh script is in the qpid-interop-test build directory: 
 
@@ -262,14 +261,14 @@ The config.sh script is in the qpid-interop-test build directory:
 source build/config.sh
 ````
 
-### 4.2 Start the test broker
+### 5.2 Start the test broker
 
 If the broker is at a remote location rather than localhost, the IP address must be known.  In tests using
 the Qpid Dispatch Router, then the entire broker network must be running before the tests are run. The IP
 addresses of the sender (the broker to which messages are being sent) and receiver (the broker from which
 messages will be received) must be known.
 
-### 4.3 Run chosen tests
+### 5.3 Run chosen tests
 
 The available tests are:
 
@@ -317,9 +316,9 @@ errors in the test on CentOS7 (which does not yet auto-detect but assumes the av
 `--exclude-shim ProtonPython3` command-line parameter to disable this shim. See
 [QPIDIT-126](https://issues.apache.org/jira/browse/QPIDIT-126) for progress and further details on this issue.
 
-## 5. Optional Components
+## 6. Optional Components
 
-### 5.1 AMQP.Net Lite Client
+### 6.1 AMQP.Net Lite Client
 
 A detailed description of how to install and run the AMQP.Net Lite client on Fedora may be found at Apache
 JIRA [QPIDIT-105](https://issues.apache.org/jira/browse/QPIDIT-105), and can easily be adapted to other
@@ -354,7 +353,7 @@ then the required dll was not found:
 The messages immediately preceding this will give a clue as to why it was not found, one of `AMQPNETLITE_LIB_DIR`
 not defined or `Amqp.Net.dll` was not found in the path.
 
-### 5.2 Rhea JavaScript Client
+### 6.2 Rhea JavaScript Client
 
 The following packages need to be installed:
  
@@ -367,4 +366,4 @@ The Rhea source may be cloned from github:
 
 If the `rhea` directory is discovered when qpid-interop-test runs `cmake`, then the Rhea client tests
 will be enabled. If the directory is not found, it may be set through the `RHEA_DIR` variable
-when running `cmake`.
\ No newline at end of file
+when running `cmake`.

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


[qpid-interop-test] 18/41: QPIDIT-136: Fix python2.7 site package path in PYTHON3PATH issue

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 6d748f860714f8d1633d8ca61fc90705fca0c819
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Fri Aug 10 11:19:02 2018 -0400

    QPIDIT-136: Fix python2.7 site package path in PYTHON3PATH issue
---
 CMakeLists.txt                                     | 10 +++++++
 setup.py                                           |  5 ++--
 .../src/jms_hdrs_props_test/Sender.py              | 34 +++++++++++++---------
 3 files changed, 34 insertions(+), 15 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 790d7d7..0fffdd0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -133,6 +133,16 @@ install(CODE "MESSAGE(STATUS \"Python install dir: ${CMAKE_INSTALL_PREFIX}/lib/$
 install(CODE "execute_process(COMMAND python setup.py install --prefix ${CMAKE_INSTALL_PREFIX}
                               WORKING_DIRECTORY ../)")
 
+# This section is temporary - make links from python3.x site-packages dir to python2.7 files needed by shims
+# when running under Python 3.x.
+install(CODE "MESSAGE(STATUS \"Python install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/\")")
+install(CODE "execute_process(COMMAND mkdir -p ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/
+                              WORKING_DIRECTORY ../)")
+install(CODE "execute_process(COMMAND ln -s ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/qit_errors.py
+                                            ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/qit_errors.py)")
+install(CODE "execute_process(COMMAND ln -s ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/qit_jms_types.py
+                                            ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/qit_jms_types.py)")
+
 # TODO: THIS IS UGLY!
 # Find a way to handle this as part of the Python install process instead
 # Set the following Python scripts to executable:
diff --git a/setup.py b/setup.py
index 6310d34..e11bea9 100644
--- a/setup.py
+++ b/setup.py
@@ -24,7 +24,7 @@ LIBEXEC_DIR = 'libexec/qpid_interop_test'
 SHIM_DIR = '%s/shims' % LIBEXEC_DIR
 
 setup(name='qpid-interop-test',
-      version='0.1',
+      version='0.2',
       description='Test suite for testing interoperability between Qpid AMQP clients',
       author='Apache Qpid',
       author_email='users@qpid.apache.org',
@@ -34,7 +34,8 @@ setup(name='qpid-interop-test',
       
       # Shims, installed into {INSTALL_PREFIX}/libexec/qpid_interop_test/shims/
      data_files=[ ('%s/qpid-proton-python' % SHIM_DIR,
-                      ['shims/qpid-proton-python/src/_compat.py']
+                      ['shims/qpid-proton-python/src/_compat.py',
+                      ]
                   ),
                   ('%s/qpid-proton-python/amqp_types_test' % SHIM_DIR,
                      ['shims/qpid-proton-python/src/amqp_types_test/Receiver.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 08a8e98..076920c 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,7 +34,7 @@ import json
 import proton
 import proton.handlers
 import proton.reactor
-from qpid_interop_test.qit_common import QitTestTypeMap
+#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
@@ -125,6 +125,14 @@ class JmsHdrsPropsTestSender(proton.handlers.MessagingHandler):
                     return True
         return False
 
+    @staticmethod
+    def merge_dicts(*dict_args):
+        """Merge two or more dictionaries"""
+        res = {}
+        for this_dict in dict_args:
+            res.update(this_dict)
+        return res
+
     # TODO: Change this to return a list of messages. That way each test can return more than one message
     def _create_message(self, test_value_type, test_value, value_num, hdr_kwargs, hdr_annotations):
         """Create a single message of the appropriate JMS message type"""
@@ -154,8 +162,8 @@ class JmsHdrsPropsTestSender(proton.handlers.MessagingHandler):
                                    (test_value, test_value_type))
         return proton.Message(id=(self.sent+1),
                               content_type='application/octet-stream',
-                              annotations=QitTestTypeMap.merge_dicts(create_annotation('JMS_MESSAGE_TYPE'),
-                                                                     hdr_annotations),
+                              annotations=JmsHdrsPropsTestSender.merge_dicts(create_annotation('JMS_MESSAGE_TYPE'),
+                                                                             hdr_annotations),
                               **hdr_kwargs)
 
     def _create_jms_bytesmessage(self, test_value_type, test_value, hdr_kwargs, hdr_annotations):
@@ -190,8 +198,8 @@ class JmsHdrsPropsTestSender(proton.handlers.MessagingHandler):
                               body=body_bytes,
                               inferred=True,
                               content_type='application/octet-stream',
-                              annotations=QitTestTypeMap.merge_dicts(create_annotation('JMS_BYTESMESSAGE_TYPE'),
-                                                                     hdr_annotations),
+                              annotations=JmsHdrsPropsTestSender.merge_dicts(create_annotation('JMS_BYTESMESSAGE_TYPE'),
+                                                                             hdr_annotations),
                               **hdr_kwargs)
 
     def _create_jms_mapmessage(self, test_value_type, test_value, name, hdr_kwargs, hdr_annotations):
@@ -222,8 +230,8 @@ class JmsHdrsPropsTestSender(proton.handlers.MessagingHandler):
         return proton.Message(id=(self.sent+1),
                               body={name: value},
                               inferred=False,
-                              annotations=QitTestTypeMap.merge_dicts(create_annotation('JMS_MAPMESSAGE_TYPE'),
-                                                                     hdr_annotations),
+                              annotations=JmsHdrsPropsTestSender.merge_dicts(create_annotation('JMS_MAPMESSAGE_TYPE'),
+                                                                             hdr_annotations),
                               **hdr_kwargs)
 
     def _create_jms_objectmessage(self, test_value, hdr_kwargs, hdr_annotations):
@@ -233,8 +241,8 @@ class JmsHdrsPropsTestSender(proton.handlers.MessagingHandler):
                               body=java_binary,
                               inferred=True,
                               content_type='application/x-java-serialized-object',
-                              annotations=QitTestTypeMap.merge_dicts(create_annotation('JMS_MAPMESSAGE_TYPE'),
-                                                                     hdr_annotations),
+                              annotations=JmsHdrsPropsTestSender.merge_dicts(create_annotation('JMS_MAPMESSAGE_TYPE'),
+                                                                             hdr_annotations),
                               **hdr_kwargs)
 
     @staticmethod
@@ -279,16 +287,16 @@ class JmsHdrsPropsTestSender(proton.handlers.MessagingHandler):
         return proton.Message(id=(self.sent+1),
                               body=body_list,
                               inferred=True,
-                              annotations=QitTestTypeMap.merge_dicts(create_annotation('JMS_STREAMMESSAGE_TYPE'),
-                                                                     hdr_annotations),
+                              annotations=JmsHdrsPropsTestSender.merge_dicts(create_annotation('JMS_STREAMMESSAGE_TYPE'),
+                                                                             hdr_annotations),
                               **hdr_kwargs)
 
     def _create_jms_textmessage(self, test_value_text, hdr_kwargs, hdr_annotations):
         """Create a JMS text message"""
         return proton.Message(id=(self.sent+1),
                               body=_compat.unicode(test_value_text),
-                              annotations=QitTestTypeMap.merge_dicts(create_annotation('JMS_TEXTMESSAGE_TYPE'),
-                                                                     hdr_annotations),
+                              annotations=JmsHdrsPropsTestSender.merge_dicts(create_annotation('JMS_TEXTMESSAGE_TYPE'),
+                                                                             hdr_annotations),
                               **hdr_kwargs)
 
     def _get_jms_message_header_kwargs(self):

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


[qpid-interop-test] 09/41: QPIDIT-125: correct component title/intro in README.md, link to website and trim redundant details

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 451f21a504701fd4a488a335fc153f3edece56ad
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Thu Jul 12 13:04:18 2018 +0100

    QPIDIT-125: correct component title/intro in README.md, link to website and trim redundant details
---
 README.md | 12 ++----------
 1 file changed, 2 insertions(+), 10 deletions(-)

diff --git a/README.md b/README.md
index e275e19..c9eb0fe 100644
--- a/README.md
+++ b/README.md
@@ -19,17 +19,9 @@ under the License.
 
 -->
 
-# Qpid Client Interoperability Test Suite
+# Qpid Interop Test Suite
 
-This directory contains the Qpid Proton Client API test suite.
-
-All files in this directory are under the Apache License - see [LICENSE](file:LICENSE) for
-details.
-
-## Source Code
-
-Source code may be obtained from Apache git server
-[https://git-wip-us.apache.org/repos/asf/qpid-interop-test.git](https://git-wip-us.apache.org/repos/asf/qpid-interop-test.git)
+This directory contains the [Qpid Interop Test](http://qpid.apache.org/components/interop-test/index.html) suite.
 
 ## Documentation
 

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


[qpid-interop-test] 32/41: QPIDIT-139: Replacing workaround for for RHEL/CentOS 7 bug where Java_FOUND not being set correctly which was removed in last checkin.

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 2f64059af5258d8b358bd07acfd4b1def15dfbe6
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Fri Jan 17 15:19:44 2020 -0500

    QPIDIT-139: Replacing workaround for for RHEL/CentOS 7 bug where Java_FOUND not being set correctly which was removed in last checkin.
---
 CMakeLists.txt | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8cb607b..0622f31 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -71,9 +71,9 @@ find_python(python3 "PYTHON3_FOUND" "PYTHON3_VER" "PYTHON3_SITE_DIR_NAME")
 # Find Java
 
 find_package(Java 1.8 COMPONENTS Development)
+# if (NOT Java_FOUND)
 # RHEL7 bug: Java_FOUND is not being set, so workaround:
-#if (NOT DEFINED Java_JAVA_EXECUTABLE OR NOT DEFINED Java_JAVAC_EXECUTABLE OR NOT DEFINED Java_JAR_EXECUTABLE)
-if (NOT Java_FOUND)
+if (NOT DEFINED Java_JAVA_EXECUTABLE OR NOT DEFINED Java_JAVAC_EXECUTABLE OR NOT DEFINED Java_JAR_EXECUTABLE)
     message(STATUS "ERROR: Java compiler not found, but is required")
     set (ErrorFlag TRUE)
 endif ()

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


[qpid-interop-test] 33/41: QPIDIT-139: Further refinements and removing ugly stuff in the install, fixed python error around checking env vars

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 693b60ea69f53f6635a28d1654aaf97792270e9f
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Fri Jan 17 18:06:03 2020 -0500

    QPIDIT-139: Further refinements and removing ugly stuff in the install, fixed python error around checking env vars
---
 CMakeLists.txt                           | 22 ++++------------------
 config.sh.in                             |  1 -
 src/python/qpid_interop_test/qit_shim.py |  6 ++++--
 3 files changed, 8 insertions(+), 21 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0622f31..9084cd1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -162,25 +162,11 @@ if(NOT "${retcode}" STREQUAL "0")
     message(FATAL_ERROR "Data code file generation for .Net failed: ${retcode}")
 endif()
 
+configure_file(config.sh.in config.sh @ONLY)
+
 # Install files using python setup.py
 install(CODE "MESSAGE(STATUS \"Python install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/\")")
 install(CODE "execute_process(COMMAND python setup.py install --prefix ${CMAKE_INSTALL_PREFIX}
                               WORKING_DIRECTORY ../)")
-
-# This section is temporary - make links from python3.x site-packages dir to python2.7 files needed by shims
-# when running under Python 3.x.
-install(CODE "MESSAGE(STATUS \"Python install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/\")")
-install(CODE "execute_process(COMMAND mkdir -p ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/
-                              WORKING_DIRECTORY ../)")
-install(CODE "execute_process(COMMAND ln -s ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/qit_errors.py
-                                            ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/qit_errors.py)")
-install(CODE "execute_process(COMMAND ln -s ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/qit_jms_types.py
-                                            ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/qit_jms_types.py)")
-
-# TODO: THIS IS UGLY!
-# Find a way to handle this as part of the Python install process instead
-# Set the following Python scripts to executable:
-install(CODE "execute_process(COMMAND bash -c \"chmod +x *_test.py\"
-                              WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/)")
-
-configure_file(config.sh.in config.sh @ONLY)
+install(FILES build/config.sh
+        DESTINATION ${CMAKE_INSTALL_PREFIX}/libexec/qpid_interop_test/)
\ No newline at end of file
diff --git a/config.sh.in b/config.sh.in
index a159a50..18b34a7 100644
--- a/config.sh.in
+++ b/config.sh.in
@@ -18,7 +18,6 @@
 
 # Source this file to set up environment variables for the Qpid interop tests.
 
-export QPID_INTEROP_TEST_HOME=@CMAKE_SOURCE_DIR@
 export QIT_INSTALL_PREFIX=@CMAKE_INSTALL_PREFIX@
 
 # Set PYTHON2PATH and PYTHON3PATH for respective python shims
diff --git a/src/python/qpid_interop_test/qit_shim.py b/src/python/qpid_interop_test/qit_shim.py
index 1a4ea97..c1ade1d 100644
--- a/src/python/qpid_interop_test/qit_shim.py
+++ b/src/python/qpid_interop_test/qit_shim.py
@@ -37,9 +37,11 @@ class ShimProcess(subprocess.Popen):
         self.killed_flag = False
         self.env = copy.deepcopy(os.environ)
         if python3_flag:
-            self.env['PYTHONPATH'] = self.env['PYTHON3PATH']
+            if 'PYTHON3PATH' in self.env:
+                self.env['PYTHONPATH'] = self.env['PYTHON3PATH']
         else:
-            self.env['PYTHONPATH'] = self.env['PYTHON2PATH']
+            if 'PYTHON2PATH' in self.env:
+                self.env['PYTHONPATH'] = self.env['PYTHON2PATH']
         super(ShimProcess, self).__init__(params, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid,
                                           env=self.env)
 

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


[qpid-interop-test] 11/41: QPIDIT-125: some more quickstart tweaks - Dont describe development tags as releases as they aren't. - Move developer repo details down as they are not a primary entry point for regular users.

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 6e623b61d7fc457c584669f135b45be38c8a43b3
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Thu Jul 12 13:20:12 2018 +0100

    QPIDIT-125: some more quickstart tweaks
    - Dont describe development tags as releases as they aren't.
    - Move developer repo details down as they are not a primary entry point for regular users.
---
 QUICKSTART.md | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/QUICKSTART.md b/QUICKSTART.md
index 7613713..957c4ac 100644
--- a/QUICKSTART.md
+++ b/QUICKSTART.md
@@ -217,21 +217,12 @@ and can be stopped with
 Qpid-interop-test may be installed locally (preferred for local builds) or to the system
 (which requires root privileges). For a local install, use the `-DCMAKE_INSTALL_PREFIX`
 option to the `cmake` command. If it is omitted, then qpid-interop-test will be installed
-into the default system directories.  The source may be unpacked, or (if you need to use the
-latest and greatest), cloned from git:
-
-    git clone https://git-wip-us.apache.org/repos/asf/qpid-interop-test.git
-    
-or
-    
-    git clone https://github.com/apache/qpid-interop-test.git
+into the default system directories.
 
 Assuming the source tree is located in directory qpid-interop-test:
 
 ````
 cd qpid-interop-test
-git tag -l # See list of tags
-git checkout tags/<tagname> # tagname is the release, for example 0.2.0-rc3
 mkdir build
 cd build
 ````
@@ -251,6 +242,16 @@ sudo make install
 
 ````
 
+If you are a developer working on changes to qpid-interop-test itself, the
+source repository can be cloned from git as follows:
+
+    git clone https://git-wip-us.apache.org/repos/asf/qpid-interop-test.git
+    
+or
+    
+    git clone https://github.com/apache/qpid-interop-test.git
+
+
 ## 5. Run the tests
 
 ### 5.1 Set the environment

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


[qpid-interop-test] 35/41: QPIDIT-140: Fix for python pointing to Python 3.x in Fedora 31. Changed all references to python to python2.

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 0693a8a8d985bbeb9897d19a3e5d4aabe4aa4216
Author: Kim van der Riet <kv...@redhat.com>
AuthorDate: Wed Feb 5 08:58:29 2020 +0100

    QPIDIT-140: Fix for python pointing to Python 3.x in Fedora 31. Changed all references to python to python2.
---
 CMakeLists.txt                           | 8 ++++----
 src/python/qpid_interop_test/qit_shim.py | 4 ++--
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c1a445a..8baa4ee 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -60,7 +60,7 @@ MACRO (find_python
     endif ()
 ENDMACRO ()
 
-find_python(python "PYTHON2_FOUND" "PYTHON2_VER" "PYTHON2_SITE_DIR_NAME")
+find_python(python2 "PYTHON2_FOUND" "PYTHON2_VER" "PYTHON2_SITE_DIR_NAME")
 # Python2 is required to run main QIT program
 if (NOT PYTHON2_FOUND)
     message(STATUS "ERROR: Python 2.x not found, but is required")
@@ -165,10 +165,10 @@ endif()
 configure_file(config.sh.in config.sh @ONLY)
 
 # Install files using python setup.py
-install(CODE "MESSAGE(STATUS \"Python 2 install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/\")")
-install(CODE "execute_process(COMMAND python setup.py install --prefix ${CMAKE_INSTALL_PREFIX}
+install(CODE "MESSAGE(STATUS \"Python 2 install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_SITE_DIR_NAME}/site-packages/qpid_interop_test/\")")
+install(CODE "execute_process(COMMAND python2 setup.py install --prefix ${CMAKE_INSTALL_PREFIX}
                               WORKING_DIRECTORY ../)")
-install(CODE "MESSAGE(STATUS \"Python 3 install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_DIR_NAME}/site-packages/qpid_interop_test/\")")
+install(CODE "MESSAGE(STATUS \"Python 3 install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON3_SITE_DIR_NAME}/site-packages/qpid_interop_test/\")")
 install(CODE "execute_process(COMMAND python3 setup.py install --prefix ${CMAKE_INSTALL_PREFIX}
                               WORKING_DIRECTORY ../)")
 install(FILES build/config.sh
diff --git a/src/python/qpid_interop_test/qit_shim.py b/src/python/qpid_interop_test/qit_shim.py
index c1ade1d..52f5674 100644
--- a/src/python/qpid_interop_test/qit_shim.py
+++ b/src/python/qpid_interop_test/qit_shim.py
@@ -126,8 +126,8 @@ class ProtonPython2Shim(Shim):
     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]
+        self.send_params = ['python2', self.sender_shim]
+        self.receive_params = ['python2', self.receiver_shim]
 
 
 class ProtonPython3Shim(Shim):

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


[qpid-interop-test] 31/41: QPIDIT-139: Improving install's detection of Python 2 and Python 3, preparing for swith to Python 3 tests. QPIDIT-135: Minor improvements to handling of Python 2 and Python 3 shims. The presence of PYTHON2PATH and PYTHON3PATH in env controls the running of the shims. QPIDIT-138: Minor improvements to messages during cmake run.

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 402fb98659e8244eddfac938ecc0db4f40edbbcc
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Fri Jan 17 12:17:33 2020 -0500

    QPIDIT-139: Improving install's detection of Python 2 and Python 3, preparing for swith to Python 3 tests. QPIDIT-135: Minor improvements to handling of Python 2 and Python 3 shims. The presence of PYTHON2PATH and PYTHON3PATH in env controls the running of the shims. QPIDIT-138: Minor improvements to messages during cmake run.
---
 CMakeLists.txt                             | 105 +++++++++++++++++++----------
 config.sh.in                               |  26 +++++--
 shims/amqpnetlite/src/CMakeLists.txt       |   8 +--
 src/python/qpid_interop_test/qit_common.py |  22 +++---
 src/python/qpid_interop_test/qit_shim.py   |   2 +
 5 files changed, 108 insertions(+), 55 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 48506a8..8cb607b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -23,37 +23,58 @@ cmake_minimum_required(VERSION 2.8.7 FATAL_ERROR)
 
 set (ErrorFlag FALSE)
 
-# Find xpath
-
-find_program(Xpath xpath)
-if (Xpath STREQUAL "Xpath-NOTFOUND")
-    message(WARNING "xpath not found")
+# Find Python
+# Older cmakes (2.8.x used on RHEL/CentOS 7) don't do Python2
+# vs Python3 cleanly. So we must improvise...
+MACRO (find_python
+       py_exec            # Python executable (eg python, python3)
+       found_var_name     # Variable name indicating python executable found
+       version_var_name   # Variable name containing python version
+       site_dir_var_name) # Variable name containing site_packages dir name
+    execute_process (COMMAND ${py_exec} --version
+                     RESULT_VARIABLE res
+                     OUTPUT_VARIABLE ov
+                     OUTPUT_STRIP_TRAILING_WHITESPACE
+                     ERROR_VARIABLE ev
+                     ERROR_STRIP_TRAILING_WHITESPACE)
+    if (res STREQUAL "0")
+        set (${found_var_name} ON)
+        # Some versions of Python print version info to stdout, others to stderr
+        if (ov STREQUAL "")
+            if (ev STREQUAL "")
+              message (WARNING "Unable to obtain python version string")
+            else ()
+              set(ov ${ev})
+            endif ()
+        endif ()
+        message (STATUS "${ov} found")
+        string (REGEX MATCH "[0-9]+(\\.[0-9]+)" ver_str "${ov}")
+        set (${version_var_name} ${ver_str})
+        string (REGEX MATCH "[0-9]+" maj_ver_str ${ver_str})
+        execute_process (COMMAND ${CMAKE_SOURCE_DIR}/get-python-dir-name ${maj_ver_str}
+                         OUTPUT_VARIABLE dir_name)
+        set (${site_dir_var_name} ${dir_name})
+    else ()
+        message (STATUS "${py_exec} not found")
+        set (${found_var_name} ${py_exec}-NOTFOUND)
+    endif ()
+ENDMACRO ()
+
+find_python(python "PYTHON2_FOUND" "PYTHON2_VER" "PYTHON2_SITE_DIR_NAME")
+# Python2 is required to run main QIT program
+if (NOT PYTHON2_FOUND)
+    message(STATUS "ERROR: Python 2.x not found, but is required")
     set (ErrorFlag TRUE)
-else ()
-    message(STATUS "xpath found: ${Xpath}")
 endif ()
-
-# Find Python 2.7.x install path
-
-find_package( PythonInterp 2.7 REQUIRED )
-execute_process(COMMAND ${CMAKE_SOURCE_DIR}/get-python-dir-name 2
-                OUTPUT_VARIABLE PYTHON2_DIR_NAME)
-message(STATUS "Python 2 install directory name: ${PYTHON2_DIR_NAME}")
-execute_process(COMMAND ${CMAKE_SOURCE_DIR}/get-python-dir-name 3
-                OUTPUT_VARIABLE PYTHON3_DIR_NAME)
-message(STATUS "Python 3 install directory name: ${PYTHON3_DIR_NAME}")
+find_python(python3 "PYTHON3_FOUND" "PYTHON3_VER" "PYTHON3_SITE_DIR_NAME")
 
 # Find Java
 
 find_package(Java 1.8 COMPONENTS Development)
 # RHEL7 bug: Java_FOUND is not being set, so workaround:
-if (DEFINED Java_JAVA_EXECUTABLE AND DEFINED Java_JAVAC_EXECUTABLE AND DEFINED Java_JAR_EXECUTABLE)
-    message(STATUS "Java ${Java_VERSION_STRING} found")
-    message(STATUS "Java executable: ${Java_JAVA_EXECUTABLE}")
-    message(STATUS "Java compiler: ${Java_JAVAC_EXECUTABLE}")
-    message(STATUS "Java archiver: ${Java_JAR_EXECUTABLE}")
-else ()
-    message(WARNING "Java compiler not found")
+#if (NOT DEFINED Java_JAVA_EXECUTABLE OR NOT DEFINED Java_JAVAC_EXECUTABLE OR NOT DEFINED Java_JAR_EXECUTABLE)
+if (NOT Java_FOUND)
+    message(STATUS "ERROR: Java compiler not found, but is required")
     set (ErrorFlag TRUE)
 endif ()
 
@@ -62,36 +83,52 @@ endif ()
 find_program(Maven mvn
              HINT /usr/local/maven/bin) # common location for local install
 if (Maven STREQUAL "Maven-NOTFOUND")
-    message (WARNING "Maven not found")
+    message (STATUS "ERROR: Maven not found, but is required")
     set (ErrorFlag TRUE)
 else ()
     message (STATUS "Maven found: ${Maven}")
 endif ()
 
+# Find xpath
+
+find_program(Xpath xpath)
+if (Xpath STREQUAL "Xpath-NOTFOUND")
+    message(STATUS "ERROR: xpath not found, but is required")
+    set (ErrorFlag TRUE)
+else ()
+    message(STATUS "xpath found: ${Xpath}")
+endif ()
+
 # Find Proton components
 
-find_package(Proton 0.17)
+find_package(Proton 0.30)
 if (Proton_FOUND)
     get_filename_component(PROTON_INSTALL_DIR ${Proton_INCLUDE_DIRS} PATH CACHE PATH "Proton install directory")
     message(STATUS "Qpid proton found. Version ${Proton_VERSION} at ${Proton_INCLUDE_DIRS}")
 else ()
-    message(WARNING "Qpid proton not found.")
+    message(STATUS "ERROR: Qpid proton not found, but is required")
     set (ErrorFlag TRUE)
 endif ()
 
-find_package(ProtonCpp 0.17)
+find_package(ProtonCpp 0.30)
 if (ProtonCpp_FOUND)
     get_filename_component(PROTON_CPP_INSTALL_DIR ${ProtonCpp_INCLUDE_DIRS} PATH CACHE PATH "ProtonCpp install directory")
     message(STATUS "Qpid proton c++ binding found. Version ${ProtonCpp_VERSION} at ${ProtonCpp_INCLUDE_DIRS}")
 else()
-    message(WARNING "Qpid proton c++ binding not found.")
+    message(STATUS "ERROR: Qpid proton c++ binding not found, but is required")
     set (ErrorFlag TRUE)
 endif ()
 
 if (ErrorFlag)
-    message(FATAL_ERROR "Required component(s) missing, aborting configuration.")
+    message(FATAL_ERROR "Required component(s) missing, aborting configuration. See above for errors.")
 endif ()
 
+add_subdirectory(shims/qpid-proton-cpp/src)
+add_subdirectory(shims/qpid-jms)
+add_subdirectory(shims/amqpnetlite/src)
+add_subdirectory(shims/rhea-js)
+add_subdirectory(docs)
+
 # Generate data code files for amqp_complex_types_test
 execute_process(COMMAND python3 src/python/qpid_interop_test/amqp_complex_types_test_generator.py --gen cpp --src-dir src/python/qpid_interop_test --gen-dir shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test
                               WORKING_DIRECTORY ../
@@ -125,12 +162,6 @@ if(NOT "${retcode}" STREQUAL "0")
     message(FATAL_ERROR "Data code file generation for .Net failed: ${retcode}")
 endif()
 
-add_subdirectory(shims/qpid-proton-cpp/src)
-add_subdirectory(shims/qpid-jms)
-add_subdirectory(shims/amqpnetlite/src)
-add_subdirectory(shims/rhea-js)
-add_subdirectory(docs)
-
 # Install files using python setup.py
 install(CODE "MESSAGE(STATUS \"Python install dir: ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/\")")
 install(CODE "execute_process(COMMAND python setup.py install --prefix ${CMAKE_INSTALL_PREFIX}
@@ -152,4 +183,4 @@ install(CODE "execute_process(COMMAND ln -s ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON
 install(CODE "execute_process(COMMAND bash -c \"chmod +x *_test.py\"
                               WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/lib/${PYTHON2_DIR_NAME}/site-packages/qpid_interop_test/)")
 
-configure_file(config.sh.in config.sh)
+configure_file(config.sh.in config.sh @ONLY)
diff --git a/config.sh.in b/config.sh.in
index f7bd3c2..a159a50 100644
--- a/config.sh.in
+++ b/config.sh.in
@@ -1,3 +1,5 @@
+#! /bin/bash
+
 #  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.
@@ -18,14 +20,26 @@
 
 export QPID_INTEROP_TEST_HOME=@CMAKE_SOURCE_DIR@
 export QIT_INSTALL_PREFIX=@CMAKE_INSTALL_PREFIX@
-CURRENT_PYTHONPATH=$PYTHONPATH
-export PYTHONPATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON2_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python:$CURRENT_PYTHONPATH
-if [[ "@PYTHON3_DIR_NAME@" == "NOT_FOUND" ]]; then
-    unset PYTHON3PATH
+
+# Set PYTHON2PATH and PYTHON3PATH for respective python shims
+
+unset PYTHON2PATH
+py2_found_str="@PYTHON2_FOUND@"
+if [[ "${py2_found_str#*-}" == "NOTFOUND" ]]; then
+    echo "No Python 2.x found, Python 2 shims disabled"
+else
+    export PYTHON2PATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON2_SITE_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python
+fi
+
+unset PYTHON3PATH
+py3_found_str="@PYTHON3_FOUND@"
+if [[ "${py3_found_str#*-}" == "NOTFOUND" ]]; then
     echo "No Python 3.x found, Python 3 shims disabled"
 else
-    CURRENT_PYTHON3PATH=$PYTHON3PATH
-    export PYTHON3PATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python3:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON3_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python:$CURRENT_PYTHON3PATH
+    export PYTHON3PATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python3:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON3_SITE_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python
 fi
+# To run the main program use python 2
+export PYTHONPATH=$PYTHON2PATH
+
 export LD_LIBRARY_PATH=@CMAKE_INSTALL_PREFIX@/lib64:$LD_LIBRARY_PATH
 export PATH=@CMAKE_INSTALL_PREFIX@/lib/@PYTHON_DIR_NAME@/site-packages/qpid_interop_test:$PATH
diff --git a/shims/amqpnetlite/src/CMakeLists.txt b/shims/amqpnetlite/src/CMakeLists.txt
index c01b8dd..49db295 100644
--- a/shims/amqpnetlite/src/CMakeLists.txt
+++ b/shims/amqpnetlite/src/CMakeLists.txt
@@ -108,21 +108,21 @@ set(BUILD_CONFIG Release) # Debug or Release
 # 1. Find dotnet
 find_program(DOTNET dotnet)
 if (DOTNET STREQUAL "DOTNET-NOTFOUND")
-  message(STATUS "Program 'dotnet' not found.")
+  message(STATUS "dotnet not found.")
   set(build_amqpnetlite_default OFF)
 else()
   # 2. dotnet found. Check required version exists
   execute_process(COMMAND dotnet --version OUTPUT_VARIABLE ov)
   if("${ov}" STREQUAL "")
-    message(STATUS "'dotnet' appears to be installed but version is not detected. 'dotnet' version ${REQUIRED_DOTNET_VERSION} required.")
+    message(STATUS "dotnet appears to be installed but version is not detected. dotnet version ${REQUIRED_DOTNET_VERSION} required.")
     set(build_amqpnetlite_default OFF)
   else()
     # 3. dotnet version string obtained, isolate version number as string, check version requirement
     string(REGEX MATCH "[0-9]+(\\.[0-9]+)" dotnet_ver "${ov}")
     if (${dotnet_ver} VERSION_EQUAL "${REQUIRED_DOTNET_VERSION}")
-      message(STATUS  "'dotnet' version ${dotnet_ver} found.")
+      message(STATUS  "dotnet version ${dotnet_ver} found.")
     else()
-      message(STATUS "'dotnet' version ${dotnet_ver} found. 'dotnet' version ${REQUIRED_DOTNET_VERSION} required.")
+      message(STATUS "dotnet version ${dotnet_ver} found. dotnet version ${REQUIRED_DOTNET_VERSION} required.")
       set(build_amqpnetlite_default OFF)
     endif()
   endif()
diff --git a/src/python/qpid_interop_test/qit_common.py b/src/python/qpid_interop_test/qit_common.py
index bd066da..675bcd0 100644
--- a/src/python/qpid_interop_test/qit_common.py
+++ b/src/python/qpid_interop_test/qit_common.py
@@ -37,6 +37,7 @@ QIT_INSTALL_PREFIX = getenv('QIT_INSTALL_PREFIX')
 if QIT_INSTALL_PREFIX is None:
     print('ERROR: Environment variable QIT_INSTALL_PREFIX is not set')
     sys.exit(1)
+QIT_ENABLE_PYTHON2_SHIM = getenv('PYTHON2PATH') is not None
 QIT_ENABLE_PYTHON3_SHIM = getenv('PYTHON3PATH') is not None
 QIT_TEST_SHIM_HOME = path.join(QIT_INSTALL_PREFIX, 'libexec', 'qpid_interop_test', 'shims')
 
@@ -312,21 +313,26 @@ class QitTest(object):
 
     def _create_shim_map(self):
         """Create a shim map {'shim_name': <shim_instance>}"""
+        # Proton C++ shim
         proton_cpp_rcv_shim = path.join(QIT_TEST_SHIM_HOME, 'qpid-proton-cpp', self.TEST_NAME, 'Receiver')
         proton_cpp_snd_shim = path.join(QIT_TEST_SHIM_HOME, 'qpid-proton-cpp', self.TEST_NAME, 'Sender')
-        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.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),
                         }
+
+        # Python shims
+        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')
+        if QIT_ENABLE_PYTHON2_SHIM:
+            self.shim_map[qpid_interop_test.qit_shim.ProtonPython2Shim.NAME] = \
+                qpid_interop_test.qit_shim.ProtonPython2Shim(proton_python_snd_shim, proton_python_rcv_shim)
+        else:
+            print('Python 2 shim disabled: no PYTHON2PATH in environment')
         if QIT_ENABLE_PYTHON3_SHIM:
             self.shim_map[qpid_interop_test.qit_shim.ProtonPython3Shim.NAME] = \
                 qpid_interop_test.qit_shim.ProtonPython3Shim(proton_python_snd_shim, proton_python_rcv_shim)
+        else:
+            print('Python 3 shim disabled: no PYTHON3PATH in environment')
 
         # Add shims that need detection during installation only if the necessary bits are present
         # Rhea Javascript client
@@ -348,7 +354,7 @@ class QitTest(object):
             print('WARNING: AMQP DotNetLite shims not found')
 
     def _modify_shim_map(self):
-        """Modify shim_map based on args"""
+        """Modify shim_map based on command-line args --include-shim or --exclude-shim"""
         # Use only shims included from the command-line
         if self.args.include_shim is not None:
             temp_shim_map = {}
diff --git a/src/python/qpid_interop_test/qit_shim.py b/src/python/qpid_interop_test/qit_shim.py
index 4cdb639..1a4ea97 100644
--- a/src/python/qpid_interop_test/qit_shim.py
+++ b/src/python/qpid_interop_test/qit_shim.py
@@ -38,6 +38,8 @@ class ShimProcess(subprocess.Popen):
         self.env = copy.deepcopy(os.environ)
         if python3_flag:
             self.env['PYTHONPATH'] = self.env['PYTHON3PATH']
+        else:
+            self.env['PYTHONPATH'] = self.env['PYTHON2PATH']
         super(ShimProcess, self).__init__(params, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid,
                                           env=self.env)
 

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


[qpid-interop-test] 36/41: QPIDIT-139: Updated tests for Python3. Updated shims to receive and send base64-encoded binary, as JSON cannot send binary. Other tidy-ups and small optimizations.

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 0ee6a0ab67c15e350a23bde1b3212f3f6ce48426
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Mon Jul 13 13:58:22 2020 -0400

    QPIDIT-139: Updated tests for Python3. Updated shims to receive and send base64-encoded binary, as JSON cannot send binary. Other tidy-ups and small optimizations.
---
 .gitignore                                         |   1 +
 config.sh.in                                       |   4 +-
 .../src/amqp_types_test/Receiver/Receiver.cs       | 262 ++++---
 .../src/amqp_types_test/Sender/Sender.cs           |  12 +-
 .../interop_test/jms_hdrs_props_test/Receiver.java |  17 +-
 .../interop_test/jms_hdrs_props_test/Sender.java   |  37 +-
 .../interop_test/jms_messages_test/Receiver.java   |  20 +-
 .../interop_test/jms_messages_test/Sender.java     |  41 +-
 shims/qpid-proton-cpp/src/CMakeLists.txt           |   2 +
 shims/qpid-proton-cpp/src/qpidit/Base64.cpp        | 125 ++++
 shims/qpid-proton-cpp/src/qpidit/Base64.hpp        |  32 +
 shims/qpid-proton-cpp/src/qpidit/QpidItErrors.cpp  |   4 +-
 shims/qpid-proton-cpp/src/qpidit/QpidItErrors.hpp  |   2 +-
 .../src/qpidit/amqp_complex_types_test/Common.cpp  |   3 -
 .../src/qpidit/amqp_complex_types_test/Common.hpp  |   1 -
 .../qpidit/amqp_large_content_test/Receiver.cpp    |   9 +-
 .../src/qpidit/amqp_large_content_test/Sender.cpp  |  18 +-
 .../src/qpidit/amqp_types_test/Receiver.cpp        | 127 ++--
 .../src/qpidit/amqp_types_test/Receiver.hpp        |   3 -
 .../src/qpidit/amqp_types_test/Sender.cpp          | 152 +---
 .../src/qpidit/amqp_types_test/Sender.hpp          |   9 -
 .../src/qpidit/jms_hdrs_props_test/Receiver.cpp    |  41 +-
 .../src/qpidit/jms_hdrs_props_test/Sender.cpp      |  50 +-
 .../src/qpidit/jms_hdrs_props_test/Sender.hpp      |   2 +-
 .../src/qpidit/jms_messages_test/Receiver.cpp      |  35 +-
 .../src/qpidit/jms_messages_test/Sender.cpp        |  45 +-
 .../src/qpidit/jms_messages_test/Sender.hpp        |   2 +-
 .../src/amqp_complex_types_test/Common.py          |   9 +-
 .../src/amqp_complex_types_test/Receiver.py        |  27 +-
 .../src/amqp_types_test/Receiver.py                |  46 +-
 .../src/amqp_types_test/Sender.py                  |  70 +-
 .../src/jms_hdrs_props_test/Receiver.py            |  32 +-
 .../src/jms_hdrs_props_test/Sender.py              |  15 +-
 .../src/jms_messages_test/Receiver.py              |  29 +-
 .../src/jms_messages_test/Sender.py                |  13 +-
 shims/rhea-js/amqp_types_test/Receiver.js          |  21 +-
 shims/rhea-js/amqp_types_test/Sender.js            |  28 +-
 .../amqp_complex_types_test.array.json             |   2 +-
 .../qpid_interop_test/amqp_complex_types_test.py   |  17 +-
 .../amqp_complex_types_test_generator.py           | 771 +++++++++++----------
 .../qpid_interop_test/amqp_large_content_test.py   |   9 +-
 src/python/qpid_interop_test/amqp_types_test.py    | 149 +---
 .../qpid_interop_test/jms_hdrs_props_test.py       |  52 +-
 src/python/qpid_interop_test/jms_messages_test.py  |  40 +-
 src/python/qpid_interop_test/qit_broker_props.py   |  20 +-
 src/python/qpid_interop_test/qit_common.py         |  15 +-
 src/python/qpid_interop_test/qit_errors.py         |   2 -
 src/python/qpid_interop_test/qit_jms_types.py      |   2 +-
 src/python/qpid_interop_test/qit_shim.py           |  23 +-
 src/python/qpid_interop_test/qit_xunit_log.py      |   5 +-
 src/python/qpid_interop_test/run_all.py            |   2 +-
 51 files changed, 1165 insertions(+), 1290 deletions(-)

diff --git a/.gitignore b/.gitignore
index c52634a..cac0800 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,6 +19,7 @@
 /target/
 /build/
 /docs/users-guide.html
+/src/python/qpid_interop_test/amqp_complex_types_test_data.*
 .project
 .cproject
 .pydevproject
diff --git a/config.sh.in b/config.sh.in
index 18b34a7..3ab336c 100644
--- a/config.sh.in
+++ b/config.sh.in
@@ -37,8 +37,8 @@ if [[ "${py3_found_str#*-}" == "NOTFOUND" ]]; then
 else
     export PYTHON3PATH=@CMAKE_INSTALL_PREFIX@/lib64/proton/bindings/python3:@CMAKE_INSTALL_PREFIX@/lib/@PYTHON3_SITE_DIR_NAME@/site-packages:@CMAKE_INSTALL_PREFIX@/libexec/qpid_interop_test/shims/qpid-proton-python
 fi
-# To run the main program use python 2
-export PYTHONPATH=$PYTHON2PATH
+# To run the main program use python 3
+export PYTHONPATH=$PYTHON3PATH
 
 export LD_LIBRARY_PATH=@CMAKE_INSTALL_PREFIX@/lib64:$LD_LIBRARY_PATH
 export PATH=@CMAKE_INSTALL_PREFIX@/lib/@PYTHON_DIR_NAME@/site-packages/qpid_interop_test:$PATH
diff --git a/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs b/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs
index 0443606..abfb269 100644
--- a/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs
+++ b/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs
@@ -216,152 +216,126 @@ namespace Qpidit
             }
 
             liteType = messageValue.GetType().Name;
-            if (liteType == "List")
-            {
-                qpiditType = "list";
-                valueList = new List<MessageValue>();
-                List list = (List)messageValue;
-                foreach (var item in list)
-                {
-                    MessageValue itemValue = new Qpidit.MessageValue(item);
-                    itemValue.Decode();
-                    valueList.Add(itemValue);
-                }
-            }
-            else if (liteType == "Map")
-            {
-                qpiditType = "map";
-                valueMapKeys = new List<MessageValue>();
-                valueMapValues = new List<MessageValue>();
-                Map map = (Map)messageValue;
-                foreach (var key in map.Keys)
-                {
-                    MessageValue valueKey = new Qpidit.MessageValue(key);
-                    valueKey.Decode();
-                    MessageValue valueValue = new Qpidit.MessageValue(map[key]);
-                    valueValue.Decode();
-                    valueMapKeys.Add(valueKey);
-                    valueMapValues.Add(valueValue);
-                }
+            if (liteType == "List" || liteType == "Map") {
+                        throw new ApplicationException(String.Format(
+                            "Unsupported complex AMQP type {0}", liteType));
             }
-            else
+
+            //Console.WriteLine("MessageValue singleton type : {0}", liteType);
+            switch (liteType)
             {
-                //Console.WriteLine("MessageValue singleton type : {0}", liteType);
-                switch (liteType)
-                {
-                    case "Boolean":
-                        qpiditType = "boolean";
-                        valueString = (Boolean)messageValue ? "True" : "False";
-                        break;
-                    case "Byte":
-                        qpiditType = "ubyte";
-                        valueString = String.Format("0x{0:x}", (Byte)messageValue);
-                        break;
-                    case "UInt16":
-                        qpiditType = "ushort";
-                        valueString = String.Format("0x{0:x}", (UInt16)messageValue);
-                        break;
-                    case "UInt32":
-                        qpiditType = "uint";
-                        valueString = String.Format("0x{0:x}", (UInt32)messageValue);
-                        break;
-                    case "UInt64":
-                        qpiditType = "ulong";
-                        valueString = String.Format("0x{0:x}", (UInt64)messageValue);
-                        break;
-                    case "SByte":
-                        qpiditType = "byte";
-                        SByte mySbyte = (SByte)messageValue;
-                        if (mySbyte >= 0)
-                        {
-                            valueString = String.Format("0x{0:x}", mySbyte);
-                        }
-                        else
-                        {
-                            mySbyte = (SByte) (-mySbyte);
-                            valueString = String.Format("-0x{0:x}", mySbyte);
-                        }
-                        break;
-                    case "Int16":
-                        qpiditType = "short";
-                        Int16 myInt16 = (Int16)messageValue;
-                        if (myInt16 >= 0)
-                        {
-                            valueString = String.Format("0x{0:x}", myInt16);
-                        }
-                        else
-                        {
-                            myInt16 = (Int16)(-myInt16);
-                            valueString = String.Format("-0x{0:x}", myInt16);
-                        }
-                        break;
-                    case "Int32":
-                        qpiditType = "int";
-                        Int32 myInt32 = (Int32)messageValue;
-                        if (myInt32 >= 0)
-                        {
-                            valueString = String.Format("0x{0:x}", myInt32);
-                        }
-                        else
-                        {
-                            myInt32 = (Int32)(-myInt32);
-                            valueString = String.Format("-0x{0:x}", myInt32);
-                        }
-                        break;
-                    case "Int64":
-                        qpiditType = "long";
-                        Int64 myInt64 = (Int64)messageValue;
-                        if (myInt64 >= 0)
-                        {
-                            valueString = String.Format("0x{0:x}", myInt64);
-                        }
-                        else
-                        {
-                            myInt64 = (Int64)(-myInt64);
-                            valueString = String.Format("-0x{0:x}", myInt64);
-                        }
-                        break;
-                    case "Single":
-                        byte[] sbytes = BitConverter.GetBytes((Single)messageValue);
-                        qpiditType = "float";
-                        valueString = "0x" + BytesReversedToString(sbytes);
-                        break;
-                    case "Double":
-                        byte[] dbytes = BitConverter.GetBytes((Double)messageValue);
-                        qpiditType = "double";
-                        valueString = "0x" + BytesReversedToString(dbytes);
-                        break;
-                    case "DateTime":
-                        // epochTicks is the number of 100uSec ticks between 01/01/0001
-                        // and 01/01/1970. Used to adjust between DateTime and unix epoch.
-                        const long epochTicks = 621355968000000000;
-                        byte[] dtbytes = BitConverter.GetBytes(
-                            (((DateTime)messageValue).Ticks - epochTicks) / TimeSpan.TicksPerMillisecond);
-                        qpiditType = "timestamp";
-                        valueString = "0x" + BytesReversedToString(dtbytes, true);
-                        break;
-                    case "Guid":
-                        qpiditType = "uuid";
-                        valueString = messageValue.ToString();
-                        break;
-                    case "Byte[]":
-                        qpiditType = "binary";
-                        byte[] binstr = (byte[])messageValue;
-                        valueString = SerializeBytes(binstr);
-                        break;
-                    case "String":
-                        qpiditType = "string";
-                        valueString = SerializeString(messageValue);
-                        break;
-                    case "Symbol":
-                        qpiditType = "symbol";
-                        valueString = SerializeString(messageValue);
-                        break;
-                    default:
-                        qpiditType = "unknown";
-                        valueString = String.Format("Unknown AMQP type: {0}", liteType);
-                        throw new ApplicationException(valueString);
-                }
+                case "Boolean":
+                    qpiditType = "boolean";
+                    valueString = (Boolean)messageValue ? "True" : "False";
+                    break;
+                case "Byte":
+                    qpiditType = "ubyte";
+                    valueString = String.Format("0x{0:x}", (Byte)messageValue);
+                    break;
+                case "UInt16":
+                    qpiditType = "ushort";
+                    valueString = String.Format("0x{0:x}", (UInt16)messageValue);
+                    break;
+                case "UInt32":
+                    qpiditType = "uint";
+                    valueString = String.Format("0x{0:x}", (UInt32)messageValue);
+                    break;
+                case "UInt64":
+                    qpiditType = "ulong";
+                    valueString = String.Format("0x{0:x}", (UInt64)messageValue);
+                    break;
+                case "SByte":
+                    qpiditType = "byte";
+                    SByte mySbyte = (SByte)messageValue;
+                    if (mySbyte >= 0)
+                    {
+                        valueString = String.Format("0x{0:x}", mySbyte);
+                    }
+                    else
+                    {
+                        mySbyte = (SByte) (-mySbyte);
+                        valueString = String.Format("-0x{0:x}", mySbyte);
+                    }
+                    break;
+                case "Int16":
+                    qpiditType = "short";
+                    Int16 myInt16 = (Int16)messageValue;
+                    if (myInt16 >= 0)
+                    {
+                        valueString = String.Format("0x{0:x}", myInt16);
+                    }
+                    else
+                    {
+                        myInt16 = (Int16)(-myInt16);
+                        valueString = String.Format("-0x{0:x}", myInt16);
+                    }
+                    break;
+                case "Int32":
+                    qpiditType = "int";
+                    Int32 myInt32 = (Int32)messageValue;
+                    if (myInt32 >= 0)
+                    {
+                        valueString = String.Format("0x{0:x}", myInt32);
+                    }
+                    else
+                    {
+                        myInt32 = (Int32)(-myInt32);
+                        valueString = String.Format("-0x{0:x}", myInt32);
+                    }
+                    break;
+                case "Int64":
+                    qpiditType = "long";
+                    Int64 myInt64 = (Int64)messageValue;
+                    if (myInt64 >= 0)
+                    {
+                        valueString = String.Format("0x{0:x}", myInt64);
+                    }
+                    else
+                    {
+                        myInt64 = (Int64)(-myInt64);
+                        valueString = String.Format("-0x{0:x}", myInt64);
+                    }
+                    break;
+                case "Single":
+                    byte[] sbytes = BitConverter.GetBytes((Single)messageValue);
+                    qpiditType = "float";
+                    valueString = "0x" + BytesReversedToString(sbytes);
+                    break;
+                case "Double":
+                    byte[] dbytes = BitConverter.GetBytes((Double)messageValue);
+                    qpiditType = "double";
+                    valueString = "0x" + BytesReversedToString(dbytes);
+                    break;
+                case "DateTime":
+                    // epochTicks is the number of 100uSec ticks between 01/01/0001
+                    // and 01/01/1970. Used to adjust between DateTime and unix epoch.
+                    const long epochTicks = 621355968000000000;
+                    byte[] dtbytes = BitConverter.GetBytes(
+                        (((DateTime)messageValue).Ticks - epochTicks) / TimeSpan.TicksPerMillisecond);
+                    qpiditType = "timestamp";
+                    valueString = "0x" + BytesReversedToString(dtbytes, true);
+                    break;
+                case "Guid":
+                    qpiditType = "uuid";
+                    valueString = messageValue.ToString();
+                    break;
+                case "Byte[]":
+                    qpiditType = "binary";
+                    byte[] binstr = (byte[])messageValue;
+                    valueString = Convert.ToBase64String(binstr);
+                    break;
+                case "String":
+                    qpiditType = "string";
+                    valueString = SerializeString(messageValue);
+                    break;
+                case "Symbol":
+                    qpiditType = "symbol";
+                    valueString = SerializeString(messageValue);
+                    break;
+                default:
+                    qpiditType = "unknown";
+                    valueString = String.Format("Unknown AMQP type: {0}", liteType);
+                    throw new ApplicationException(valueString);
             }
         }
     }
diff --git a/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.cs b/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.cs
index 979900f..0545c66 100644
--- a/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.cs
+++ b/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.cs
@@ -172,17 +172,11 @@ namespace Qpidit
                         qpiditType = "symbol";
                         break;
                     case "Array":
-                        qpiditType = "list";
-                        break;
                     case "ArrayList":
-                        qpiditType = "list";
-                        break;
                     case "Dictionary":
-                        qpiditType = "map";
-                        break;
                     case "Dictionary`2":
-                        qpiditType = "map";
-                        break;
+                         throw new ApplicationException(String.Format(
+                            "Unsupported complex AMQP type {0}", typename));
                     default:
                         throw new ApplicationException(String.Format(
                             "Can not translate system type {0} to a QpidIT type", typename));
@@ -372,7 +366,7 @@ namespace Qpidit
                     case "binary":
                         // TODO: fix this
                         value = (string)baseValue;
-                        byte[] binval = Encoding.ASCII.GetBytes(value);
+                        byte[] binval = Convert.FromBase64String(value);
                         valueDirect = binval;
                         break;
                     case "string":
diff --git a/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_hdrs_props_test/Receiver.java b/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_hdrs_props_test/Receiver.java
index 00d2e4c..1b06df7 100644
--- a/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_hdrs_props_test/Receiver.java
+++ b/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_hdrs_props_test/Receiver.java
@@ -24,6 +24,7 @@ import java.io.StringWriter;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Base64;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
@@ -210,15 +211,15 @@ public class Receiver {
                 byte[] bytesBuff = new byte[65536];
                 int numBytesRead = ((BytesMessage)message).readBytes(bytesBuff);
                 if (numBytesRead >= 0) {
-                    jasonTestValuesArrayBuilder.add(new String(Arrays.copyOfRange(bytesBuff, 0, numBytesRead)));
+                    jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString(Arrays.copyOfRange(bytesBuff, 0, numBytesRead)));
                 } else {
                     // NOTE: For this case, an empty byte array has nothing to return
-                    jasonTestValuesArrayBuilder.add(new String());
+                    jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString("".getBytes()));
                 }
             }
             break;
         case "char":
-            jasonTestValuesArrayBuilder.add(formatChar(((BytesMessage)message).readChar()));
+            jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString(formatChar(((BytesMessage)message).readChar()).getBytes()));
             break;
         case "double":
             long l = Double.doubleToRawLongBits(((BytesMessage)message).readDouble());
@@ -269,10 +270,10 @@ public class Receiver {
             jasonTestValuesArrayBuilder.add(formatByte(((MapMessage)message).getByte(name)));
             break;
         case "bytes":
-            jasonTestValuesArrayBuilder.add(new String(((MapMessage)message).getBytes(name)));
+            jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString((((MapMessage)message).getBytes(name))));
             break;
         case "char":
-            jasonTestValuesArrayBuilder.add(formatChar(((MapMessage)message).getChar(name)));
+            jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString(formatChar(((MapMessage)message).getChar(name)).getBytes()));
             break;
         case "double":
             long l = Double.doubleToRawLongBits(((MapMessage)message).getDouble(name));
@@ -319,14 +320,14 @@ public class Receiver {
             byte[] bytesBuff = new byte[65536];
             int numBytesRead = ((StreamMessage)message).readBytes(bytesBuff);
             if (numBytesRead >= 0) {
-                jasonTestValuesArrayBuilder.add(new String(Arrays.copyOfRange(bytesBuff, 0, numBytesRead)));
+                jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString(Arrays.copyOfRange(bytesBuff, 0, numBytesRead)));
             } else {
                 System.out.println("StreamMessage.readBytes() returned " + numBytesRead);
                 jasonTestValuesArrayBuilder.add("<bytes error>");
             }
             break;
         case "char":
-            jasonTestValuesArrayBuilder.add(formatChar(((StreamMessage)message).readChar()));
+            jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString(formatChar(((StreamMessage)message).readChar()).getBytes()));
             break;
         case "double":
             long l = Double.doubleToRawLongBits(((StreamMessage)message).readDouble());
@@ -423,7 +424,7 @@ public class Receiver {
     protected void addMessageHeaderByteArray(String headerName, byte[] value) {
         if (value != null) {
             JsonObjectBuilder valueMap = Json.createObjectBuilder();
-            valueMap.add("bytes", new String(value));
+            valueMap.add("bytes", Base64.getEncoder().encodeToString(value));
             _jsonMessageHeaderMapBuilder.add(headerName, valueMap);
         }        
     }
diff --git a/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_hdrs_props_test/Sender.java b/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_hdrs_props_test/Sender.java
index 2f38991..15d14f5 100644
--- a/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_hdrs_props_test/Sender.java
+++ b/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_hdrs_props_test/Sender.java
@@ -20,7 +20,9 @@ import java.io.Serializable;
 import java.io.StringReader;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Base64;
 import java.util.Collections;
 import java.util.List;
 import javax.jms.BytesMessage;
@@ -185,7 +187,7 @@ public class Sender {
                 if (subMapKey.compareTo("string") == 0) {
                     msg.setJMSCorrelationID(subMapVal);
                 } else if (subMapKey.compareTo("bytes") == 0) {
-                    msg.setJMSCorrelationIDAsBytes(subMapVal.getBytes());
+                    msg.setJMSCorrelationIDAsBytes(Base64.getDecoder().decode(subMapVal.getBytes()));
                 } else {
                     throw new Exception("Internal exception: Invalid message header type \"" + subMapKey + "\" for message header \"" + key + "\"");
                 }
@@ -275,13 +277,14 @@ public class Sender {
             message.writeByte(Byte.decode(testValue));
             break;
         case "bytes":
-            message.writeBytes(testValue.getBytes());
+            message.writeBytes(Base64.getDecoder().decode(testValue));
             break;
         case "char":
-            if (testValue.length() == 1) { // Char format: "X" or "\xNN"
-                message.writeChar(testValue.charAt(0));
+            byte[] decodedValue = Base64.getDecoder().decode(testValue);
+            if (decodedValue.length == 1) { // Char format: "X" or "\xNN"
+                message.writeChar((char)decodedValue[0]);
             } else {
-                throw new Exception("JmsSenderShim.createJMSBytesMessage() Malformed char string: \"" + testValue + "\" of length " + testValue.length());
+                throw new Exception("JmsSenderShim.createJMSBytesMessage() Malformed char string: \"" + decodedValue + "\" of length " + decodedValue.length);
             }
             break;
         case "double":
@@ -326,15 +329,16 @@ public class Sender {
             message.setByte(name, Byte.decode(testValue));
             break;
         case "bytes":
-            message.setBytes(name, testValue.getBytes());
+            message.setBytes(name, Base64.getDecoder().decode(testValue));
             break;
         case "char":
-            if (testValue.length() == 1) { // Char format: "X"
-                message.setChar(name, testValue.charAt(0));
-            } else if (testValue.length() == 6) { // Char format: "\xNNNN"
-                message.setChar(name, (char)Integer.parseInt(testValue.substring(2), 16));
+            byte[] decodedValue = Base64.getDecoder().decode(testValue);
+            if (decodedValue.length == 1) { // Char format: "X" or "\xNN"
+                message.setChar(name, (char)decodedValue[0]);
+            } else if (decodedValue.length == 6) { // Char format: "\xNNNN"
+                message.setChar(name, ByteBuffer.wrap(decodedValue).getChar());
             } else {
-                throw new Exception("JmsSenderShim.createJMSMapMessage() Malformed char string: \"" + testValue + "\"");
+                throw new Exception("JmsSenderShim.createJMSMapMessage() Malformed char string: \"" + decodedValue + "\"");
             }
             break;
         case "double":
@@ -390,15 +394,16 @@ public class Sender {
             message.writeByte(Byte.decode(testValue));
             break;
         case "bytes":
-            message.writeBytes(testValue.getBytes());
+            message.writeBytes(Base64.getDecoder().decode(testValue.getBytes()));
             break;
         case "char":
-            if (testValue.length() == 1) { // Char format: "X"
-                message.writeChar(testValue.charAt(0));
+            byte[] decodedValue = Base64.getDecoder().decode(testValue);
+            if (decodedValue.length == 1) { // Char format: "X"
+                message.writeChar((char)decodedValue[0]);
             } else if (testValue.length() == 6) { // Char format: "\xNNNN"
-                message.writeChar((char)Integer.parseInt(testValue.substring(2), 16));
+                message.writeChar(ByteBuffer.wrap(decodedValue).getChar());
             } else {
-                throw new Exception("JmsSenderShim.createJMSStreamMessage() Malformed char string: \"" + testValue + "\"");
+                throw new Exception("JmsSenderShim.createJMSStreamMessage() Malformed char string: \"" + decodedValue + "\"");
             }
             break;
         case "double":
diff --git a/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_messages_test/Receiver.java b/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_messages_test/Receiver.java
index 07d1f06..3d7c074 100644
--- a/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_messages_test/Receiver.java
+++ b/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_messages_test/Receiver.java
@@ -23,13 +23,12 @@ import java.io.StringReader;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Base64;
 import java.util.Collections;
-import java.util.Enumeration;
 import java.util.List;
 import javax.jms.BytesMessage;
 import javax.jms.Connection;
 import javax.jms.ConnectionFactory;
-import javax.jms.Destination;
 import javax.jms.ExceptionListener;
 import javax.jms.JMSException;
 import javax.jms.MapMessage;
@@ -40,9 +39,7 @@ import javax.jms.Queue;
 import javax.jms.Session;
 import javax.jms.StreamMessage;
 import javax.jms.TextMessage;
-import javax.jms.Topic;
 import javax.json.Json;
-import javax.json.JsonArray;
 import javax.json.JsonArrayBuilder;
 import javax.json.JsonObject;
 import javax.json.JsonObjectBuilder;
@@ -60,7 +57,6 @@ public class Receiver {
                                                                  "JMS_OBJECTMESSAGE_TYPE",
                                                                  "JMS_STREAMMESSAGE_TYPE",
                                                                  "JMS_TEXTMESSAGE_TYPE"};
-    private static enum JMS_DESTINATION_TYPE {JMS_QUEUE, JMS_TEMPORARY_QUEUE, JMS_TOPIC, JMS_TEMPORARY_TOPIC};
     
     Connection _connection;
     Session _session;
@@ -189,15 +185,15 @@ public class Receiver {
                 byte[] bytesBuff = new byte[65536];
                 int numBytesRead = ((BytesMessage)message).readBytes(bytesBuff);
                 if (numBytesRead >= 0) {
-                    jasonTestValuesArrayBuilder.add(new String(Arrays.copyOfRange(bytesBuff, 0, numBytesRead)));
+                    jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString(Arrays.copyOfRange(bytesBuff, 0, numBytesRead)));
                 } else {
                     // NOTE: For this case, an empty byte array has nothing to return
-                    jasonTestValuesArrayBuilder.add(new String());
+                    jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString("".getBytes()));
                 }
             }
             break;
         case "char":
-            jasonTestValuesArrayBuilder.add(formatChar(((BytesMessage)message).readChar()));
+            jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString(formatChar(((BytesMessage)message).readChar()).getBytes()));
             break;
         case "double":
             long l = Double.doubleToRawLongBits(((BytesMessage)message).readDouble());
@@ -248,10 +244,10 @@ public class Receiver {
             jasonTestValuesArrayBuilder.add(formatByte(((MapMessage)message).getByte(name)));
             break;
         case "bytes":
-            jasonTestValuesArrayBuilder.add(new String(((MapMessage)message).getBytes(name)));
+            jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString((((MapMessage)message).getBytes(name))));
             break;
         case "char":
-            jasonTestValuesArrayBuilder.add(formatChar(((MapMessage)message).getChar(name)));
+            jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString(formatChar(((MapMessage)message).getChar(name)).getBytes()));
             break;
         case "double":
             long l = Double.doubleToRawLongBits(((MapMessage)message).getDouble(name));
@@ -298,14 +294,14 @@ public class Receiver {
             byte[] bytesBuff = new byte[65536];
             int numBytesRead = ((StreamMessage)message).readBytes(bytesBuff);
             if (numBytesRead >= 0) {
-                jasonTestValuesArrayBuilder.add(new String(Arrays.copyOfRange(bytesBuff, 0, numBytesRead)));
+                jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString(Arrays.copyOfRange(bytesBuff, 0, numBytesRead)));
             } else {
                 System.out.println("StreamMessage.readBytes() returned " + numBytesRead);
                 jasonTestValuesArrayBuilder.add("<bytes error>");
             }
             break;
         case "char":
-            jasonTestValuesArrayBuilder.add(formatChar(((StreamMessage)message).readChar()));
+            jasonTestValuesArrayBuilder.add(Base64.getEncoder().encodeToString(formatChar(((StreamMessage)message).readChar()).getBytes()));
             break;
         case "double":
             long l = Double.doubleToRawLongBits(((StreamMessage)message).readDouble());
diff --git a/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_messages_test/Sender.java b/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_messages_test/Sender.java
index 0cccc97..c77d36d 100644
--- a/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_messages_test/Sender.java
+++ b/shims/qpid-jms/src/main/java/org/apache/qpid/interop_test/jms_messages_test/Sender.java
@@ -20,7 +20,9 @@ import java.io.Serializable;
 import java.io.StringReader;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Base64;
 import java.util.Collections;
 import java.util.List;
 import javax.jms.BytesMessage;
@@ -44,8 +46,6 @@ import javax.json.JsonReader;
 import org.apache.qpid.jms.JmsConnectionFactory;
 
 public class Sender {
-    private static final String USER = "guest";
-    private static final String PASSWORD = "guest";
     private static final String[] SUPPORTED_JMS_MESSAGE_TYPES = {"JMS_MESSAGE_TYPE",
                                                                  "JMS_BYTESMESSAGE_TYPE",
                                                                  "JMS_MAPMESSAGE_TYPE",
@@ -174,13 +174,14 @@ public class Sender {
             message.writeByte(Byte.decode(testValue));
             break;
         case "bytes":
-            message.writeBytes(testValue.getBytes());
+            message.writeBytes(Base64.getDecoder().decode(testValue));
             break;
         case "char":
-            if (testValue.length() == 1) { // Char format: "X" or "\xNN"
-                message.writeChar(testValue.charAt(0));
+            byte[] decodedValue = Base64.getDecoder().decode(testValue);
+            if (decodedValue.length == 1) { // Char format: "X" or "\xNN"
+                message.writeChar((char)decodedValue[0]);
             } else {
-                throw new Exception("JmsSenderShim.createJMSBytesMessage() Malformed char string: \"" + testValue + "\" of length " + testValue.length());
+                throw new Exception("JmsSenderShim.createJMSBytesMessage() Malformed char string: \"" + decodedValue + "\" of length " + decodedValue.length);
             }
             break;
         case "double":
@@ -225,15 +226,16 @@ public class Sender {
             message.setByte(name, Byte.decode(testValue));
             break;
         case "bytes":
-            message.setBytes(name, testValue.getBytes());
+            message.setBytes(name, Base64.getDecoder().decode(testValue));
             break;
         case "char":
-            if (testValue.length() == 1) { // Char format: "X"
-                message.setChar(name, testValue.charAt(0));
-            } else if (testValue.length() == 6) { // Char format: "\xNNNN"
-                message.setChar(name, (char)Integer.parseInt(testValue.substring(2), 16));
+            byte[] decodedValue = Base64.getDecoder().decode(testValue);
+            if (decodedValue.length == 1) { // Char format: "X" or "\xNN"
+                message.setChar(name, (char)decodedValue[0]);
+            } else if (decodedValue.length == 6) { // Char format: "\xNNNN"
+                message.setChar(name, ByteBuffer.wrap(decodedValue).getChar());
             } else {
-                throw new Exception("JmsSenderShim.createJMSMapMessage() Malformed char string: \"" + testValue + "\"");
+                throw new Exception("JmsSenderShim.createJMSMapMessage() Malformed char string: \"" + decodedValue + "\"");
             }
             break;
         case "double":
@@ -289,15 +291,16 @@ public class Sender {
             message.writeByte(Byte.decode(testValue));
             break;
         case "bytes":
-            message.writeBytes(testValue.getBytes());
+            message.writeBytes(Base64.getDecoder().decode(testValue.getBytes()));
             break;
         case "char":
-            if (testValue.length() == 1) { // Char format: "X"
-                message.writeChar(testValue.charAt(0));
+            byte[] decodedValue = Base64.getDecoder().decode(testValue);
+            if (decodedValue.length == 1) { // Char format: "X"
+                message.writeChar((char)decodedValue[0]);
             } else if (testValue.length() == 6) { // Char format: "\xNNNN"
-                message.writeChar((char)Integer.parseInt(testValue.substring(2), 16));
+                message.writeChar(ByteBuffer.wrap(decodedValue).getChar());
             } else {
-                throw new Exception("JmsSenderShim.createJMSStreamMessage() Malformed char string: \"" + testValue + "\"");
+                throw new Exception("JmsSenderShim.createJMSStreamMessage() Malformed char string: \"" + decodedValue + "\"");
             }
             break;
         case "double":
@@ -336,7 +339,7 @@ public class Sender {
         try {
             Class<?> c = Class.forName(className);
             if (className.compareTo("java.lang.Character") == 0) {
-                Constructor ctor = c.getConstructor(char.class);
+                Constructor<?> ctor = c.getConstructor(char.class);
                 if (testValue.length() == 1) {
                     // Use first character of string
                     obj = (Serializable)ctor.newInstance(testValue.charAt(0));
@@ -348,7 +351,7 @@ public class Sender {
                 }
             } else {
                 // Use string constructor
-                Constructor ctor = c.getConstructor(String.class);
+                Constructor<?> ctor = c.getConstructor(String.class);
                 obj = (Serializable)ctor.newInstance(testValue);
             }
         }
diff --git a/shims/qpid-proton-cpp/src/CMakeLists.txt b/shims/qpid-proton-cpp/src/CMakeLists.txt
index 221b912..6bcc310 100644
--- a/shims/qpid-proton-cpp/src/CMakeLists.txt
+++ b/shims/qpid-proton-cpp/src/CMakeLists.txt
@@ -116,6 +116,8 @@ endfunction(addJmsTest testName)
 # --- Common files and libs ---
 
 set(Common_SOURCES
+    qpidit/Base64.hpp
+    qpidit/Base64.cpp
     qpidit/QpidItErrors.hpp
     qpidit/QpidItErrors.cpp
 )
diff --git a/shims/qpid-proton-cpp/src/qpidit/Base64.cpp b/shims/qpid-proton-cpp/src/qpidit/Base64.cpp
new file mode 100644
index 0000000..18dc6d8
--- /dev/null
+++ b/shims/qpid-proton-cpp/src/qpidit/Base64.cpp
@@ -0,0 +1,125 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+/*
+ * Based on René Nyffenegger rene.nyffenegger@adp-gmbh.ch
+ * https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/
+ */
+#include "Base64.hpp"
+#include <iostream>
+
+static const std::string b64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+static inline bool is_base64(uint8_t c) {
+	return (isalnum(c) || (c == '+') || (c == '/'));
+}
+
+std::string b64_encode(proton::binary const& str_buf) {
+	uint8_t const* buf = &str_buf[0];
+	uint16_t bufLen = str_buf.size();
+	std::string ret;
+	int i = 0;
+	int j = 0;
+	uint8_t char_array_3[3];
+	uint8_t char_array_4[4];
+
+	while (bufLen--) {
+		char_array_3[i++] = *(buf++);
+		if (i == 3) {
+			char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+			char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+			char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+			char_array_4[3] = char_array_3[2] & 0x3f;
+
+			for(i = 0; (i <4) ; i++) {
+				ret += b64_chars[char_array_4[i]];
+			}
+			i = 0;
+		}
+	}
+
+	if (i) {
+		for(j = i; j < 3; j++) {
+			char_array_3[j] = '\0';
+		}
+
+		char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+		char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+		char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+		char_array_4[3] = char_array_3[2] & 0x3f;
+
+		for (j = 0; (j < i + 1); j++) {
+			ret += b64_chars[char_array_4[j]];
+		}
+
+		while((i++ < 3))
+			ret += '=';
+	}
+
+	return ret;
+}
+
+proton::binary b64_decode(std::string const& encoded_string) {
+	int in_len = encoded_string.size();
+	int i = 0;
+	int j = 0;
+	int in_ = 0;
+	uint8_t char_array_4[4], char_array_3[3];
+	proton::binary ret;
+
+	while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
+		char_array_4[i++] = encoded_string[in_]; in_++;
+		if (i ==4) {
+			for (i = 0; i <4; i++) {
+				char_array_4[i] = b64_chars.find(char_array_4[i]);
+			}
+
+			char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+			char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+			char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
+
+			for (i = 0; (i < 3); i++) {
+				ret.push_back(char_array_3[i]);
+			}
+			i = 0;
+		}
+	}
+
+	if (i) {
+		for (j = i; j <4; j++) {
+			char_array_4[j] = 0;
+		}
+
+		for (j = 0; j <4; j++) {
+			char_array_4[j] = b64_chars.find(char_array_4[j]);
+		}
+
+		char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+		char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+		char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
+
+		for (j = 0; (j < i - 1); j++) {
+			ret.push_back(char_array_3[j]);
+		}
+	}
+
+	return ret;
+}
diff --git a/shims/qpid-proton-cpp/src/qpidit/Base64.hpp b/shims/qpid-proton-cpp/src/qpidit/Base64.hpp
new file mode 100644
index 0000000..d4a80bd
--- /dev/null
+++ b/shims/qpid-proton-cpp/src/qpidit/Base64.hpp
@@ -0,0 +1,32 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+#ifndef SRC_QPIDIT_BASE64_HPP_
+#define SRC_QPIDIT_BASE64_HPP_
+
+#include <vector>
+#include <string>
+#include <proton/binary.hpp>
+
+std::string b64_encode(proton::binary const&);
+proton::binary b64_decode(std::string const&);
+
+#endif /* SRC_QPIDIT_BASE64_HPP_ */
diff --git a/shims/qpid-proton-cpp/src/qpidit/QpidItErrors.cpp b/shims/qpid-proton-cpp/src/qpidit/QpidItErrors.cpp
index 76936e6..1e76dcc 100644
--- a/shims/qpid-proton-cpp/src/qpidit/QpidItErrors.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/QpidItErrors.cpp
@@ -163,8 +163,8 @@ namespace qpidit
 
     // --- JsonParserError ---
 
-    JsonParserError::JsonParserError(const Json::Reader& jsonReader) :
-                    std::runtime_error(MSG("JSON test values failed to parse: " << jsonReader.getFormattedErrorMessages()))
+    JsonParserError::JsonParserError(const std::string& parseErrors) :
+                    std::runtime_error(MSG("JSON test values failed to parse: " << parseErrors))
     {}
 
     JsonParserError::~JsonParserError() throw() {}
diff --git a/shims/qpid-proton-cpp/src/qpidit/QpidItErrors.hpp b/shims/qpid-proton-cpp/src/qpidit/QpidItErrors.hpp
index f34b26b..d6ad864 100644
--- a/shims/qpid-proton-cpp/src/qpidit/QpidItErrors.hpp
+++ b/shims/qpid-proton-cpp/src/qpidit/QpidItErrors.hpp
@@ -129,7 +129,7 @@ namespace qpidit
     class JsonParserError: public std::runtime_error
     {
     public:
-        explicit JsonParserError(const Json::Reader& jsonReader);
+        explicit JsonParserError(const std::string& parseErrors);
         virtual ~JsonParserError() throw();
     };
 
diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test/Common.cpp b/shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test/Common.cpp
index 34bb33c..eeeab48 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test/Common.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test/Common.cpp
@@ -70,9 +70,6 @@ namespace qpidit
             return _testDataMap.size();
         }
 
-        const TestDataList_t& Common::testDataList() const {
-
-        }
         bool Common::isAmqpSubType(const proton::value& protonValue) const {
             TestDataList_t valueList;
             proton::get(protonValue, valueList);
diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test/Common.hpp b/shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test/Common.hpp
index 4c65e19..53d1648 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test/Common.hpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test/Common.hpp
@@ -51,7 +51,6 @@ namespace qpidit
             void initializeDataMap(); // Generated function
             static void setUuid(proton::uuid& val, const std::string& uuidStr);
             std::size_t size() const;
-            const TestDataList_t& testDataList() const;
 
             template<size_t N> static void hexStringToBytearray(proton::byte_array<N>& ba, const std::string& s, size_t fromArrayIndex = 0, size_t arrayLen = N) {
                 size_t len = (s.size()/2 > arrayLen) ? arrayLen : s.size()/2;
diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Receiver.cpp b/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Receiver.cpp
index c28ad07..ee24985 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Receiver.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Receiver.cpp
@@ -134,6 +134,7 @@ namespace qpidit
             if (_amqpType.compare("symbol") == 0) {
                 return proton::get<proton::symbol>(testString).size() / 1024 / 1024;
             }
+            return 0;
         }
 
         void Receiver::appendListMapSize(Json::Value& numEltsList, std::pair<uint32_t, uint32_t> val) {
@@ -172,8 +173,12 @@ int main(int argc, char** argv) {
         proton::container(receiver).run();
 
         std::cout << argv[3] << std::endl;
-        Json::FastWriter fw;
-        std::cout << fw.write(receiver.getReceivedValueList());
+        Json::StreamWriterBuilder wbuilder;
+        wbuilder["indentation"] = "";
+        std::unique_ptr<Json::StreamWriter> writer(wbuilder.newStreamWriter());
+        std::ostringstream oss;
+        writer->write(receiver.getReceivedValueList(), &oss);
+        std::cout << oss.str() << std::endl;
     } catch (const std::exception& e) {
         std::cerr << "amqp_large_content_test receiver error: " << e.what() << std::endl;
         exit(-1);
diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.cpp b/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.cpp
index cf871f1..3b13493 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.cpp
@@ -150,16 +150,18 @@ namespace qpidit
  */
 
 int main(int argc, char** argv) {
-    // TODO: improve arg management a little...
-    if (argc != 5) {
-        throw qpidit::ArgumentError("Incorrect number of arguments");
-    }
-
     try {
+        // TODO: improve arg management a little...
+        if (argc != 5) {
+            throw qpidit::ArgumentError("Incorrect number of arguments");
+        }
+
         Json::Value testValues;
-        Json::Reader jsonReader;
-        if (not jsonReader.parse(argv[4], testValues, false)) {
-            throw qpidit::JsonParserError(jsonReader);
+        Json::CharReaderBuilder builder;
+        Json::CharReader* jsonReader = builder.newCharReader();
+        std::string parseErrors;
+        if (not jsonReader->parse(argv[4], argv[4] + ::strlen(argv[4]), &testValues, &parseErrors)) {
+            throw qpidit::JsonParserError(parseErrors);
         }
 
         qpidit::amqp_large_content_test::Sender sender(argv[1], argv[2], argv[3], testValues);
diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Receiver.cpp b/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Receiver.cpp
index 6b6f2ba..5755ad3 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Receiver.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Receiver.cpp
@@ -20,6 +20,7 @@
  */
 
 #include <qpidit/amqp_types_test/Receiver.hpp>
+#include "qpidit/Base64.hpp"
 
 #include <iostream>
 #include <json/json.h>
@@ -111,79 +112,32 @@ namespace qpidit
         //static
         std::string Receiver::getAmqpType(const proton::value& val) {
             switch(val.type()) {
-            case proton::NULL_TYPE: return "null";
-            case proton::BOOLEAN: return "boolean";
-            case proton::UBYTE: return "ubyte";
-            case proton::USHORT: return "ushort";
-            case proton::UINT: return "uint";
-            case proton::ULONG: return "ulong";
-            case proton::BYTE: return "byte";
-            case proton::SHORT: return "short";
-            case proton::INT: return "int";
-            case proton::LONG: return "long";
-            case proton::FLOAT: return "float";
-            case proton::DOUBLE: return "double";
-            case proton::DECIMAL32: return "decimal32";
-            case proton::DECIMAL64: return "decimal64";
-            case proton::DECIMAL128: return "decimal128";
-            case proton::CHAR: return "char";
-            case proton::TIMESTAMP: return "timestamp";
-            case proton::UUID: return "uuid";
-            case proton::BINARY: return "binary";
-            case proton::STRING: return "string";
-            case proton::SYMBOL: return "symbol";
-            case proton::LIST: return "list";
-            case proton::MAP: return "map";
-            case proton::ARRAY: return "array";
-            //default: throw qpidit::UnknownAmqpTypeError(val);
+                case proton::NULL_TYPE: return "null";
+                case proton::BOOLEAN: return "boolean";
+                case proton::UBYTE: return "ubyte";
+                case proton::USHORT: return "ushort";
+                case proton::UINT: return "uint";
+                case proton::ULONG: return "ulong";
+                case proton::BYTE: return "byte";
+                case proton::SHORT: return "short";
+                case proton::INT: return "int";
+                case proton::LONG: return "long";
+                case proton::FLOAT: return "float";
+                case proton::DOUBLE: return "double";
+                case proton::DECIMAL32: return "decimal32";
+                case proton::DECIMAL64: return "decimal64";
+                case proton::DECIMAL128: return "decimal128";
+                case proton::CHAR: return "char";
+                case proton::TIMESTAMP: return "timestamp";
+                case proton::UUID: return "uuid";
+                case proton::BINARY: return "binary";
+                case proton::STRING: return "string";
+                case proton::SYMBOL: return "symbol";
+                case proton::LIST: return "list";
+                case proton::MAP: return "map";
+                case proton::ARRAY: return "array";
             }
-        }
-
-        //static
-        Json::Value& Receiver::getMap(Json::Value& jsonMap, const proton::value& val) {
-            std::map<proton::value, proton::value> msgMap;
-            proton::get(val, msgMap);
-            for (std::map<proton::value, proton::value>::const_iterator i = msgMap.begin(); i != msgMap.end(); ++i) {
-
-                // Process key
-                Json::Value mapKey;
-                if (i->first.type() == proton::LIST || i->first.type() == proton::MAP || i->first.type() == proton::ARRAY) {
-                    mapKey = getValue(i->first);
-                } else {
-                    std::ostringstream oss;
-                    oss << getAmqpType(i->first) << ":" << getValue(i->first).asString();
-                    mapKey = oss.str();
-                }
-
-                // Process value
-                Json::Value mapValue;
-                if (i->second.type() == proton::LIST || i->second.type() == proton::MAP || i->second.type() == proton::ARRAY) {
-                    mapValue = getValue(i->second);
-                } else {
-                    std::ostringstream oss;
-                    oss << getAmqpType(i->second) << ":" << getValue(i->second).asString();
-                    mapValue = oss.str();
-                }
-
-                jsonMap[mapKey.asString()] = mapValue;
-            }
-            return jsonMap;
-        }
-
-        //static
-        Json::Value& Receiver::getSequence(Json::Value& jsonList, const proton::value& val) {
-            std::vector<proton::value> msgList;
-            proton::get(val, msgList);
-            for (std::vector<proton::value>::const_iterator i=msgList.begin(); i!=msgList.end(); ++i) {
-                if (i->type() == proton::LIST || i->type() == proton::MAP || i->type() == proton::ARRAY) {
-                    jsonList.append(getValue(*i));
-                } else {
-                    std::ostringstream oss;
-                    oss << getAmqpType(*i) << ":" << getValue(*i).asString();
-                    jsonList.append(oss.str());
-                }
-            }
-            return jsonList;
+            return "unknown";
         }
 
         //static
@@ -280,7 +234,8 @@ namespace qpidit
             }
             if (amqpType.compare("binary") == 0) {
                 checkMessageType(val, proton::BINARY);
-                return std::string(proton::get<proton::binary>(val));
+                // Encode binary to base64 before returning value as string
+                return b64_encode(proton::get<proton::binary>(val));
             }
             if (amqpType.compare("string") == 0) {
                 checkMessageType(val, proton::STRING);
@@ -291,14 +246,10 @@ namespace qpidit
                 return proton::get<proton::symbol>(val);
             }
             if (amqpType.compare("list") == 0) {
-                checkMessageType(val, proton::LIST);
-                Json::Value jsonList(Json::arrayValue);
-                return getSequence(jsonList, val);
+                throw qpidit::UnsupportedAmqpTypeError(amqpType);
             }
             if (amqpType.compare("map") == 0) {
-                checkMessageType(val, proton::MAP);
-                Json::Value jsonMap(Json::objectValue);
-                return getMap(jsonMap, val);
+                throw qpidit::UnsupportedAmqpTypeError(amqpType);
             }
             if (amqpType.compare("array") == 0) {
                 throw qpidit::UnsupportedAmqpTypeError(amqpType);
@@ -319,18 +270,22 @@ namespace qpidit
  */
 
 int main(int argc, char** argv) {
-    // TODO: improve arg management a little...
-    if (argc != 5) {
-        throw qpidit::ArgumentError("Incorrect number of arguments");
-    }
-
     try {
+        // TODO: improve arg management a little...
+        if (argc != 5) {
+            throw qpidit::ArgumentError("Incorrect number of arguments");
+        }
+
         qpidit::amqp_types_test::Receiver receiver(argv[1], argv[2], argv[3], std::strtoul(argv[4], NULL, 0));
         proton::container(receiver).run();
 
         std::cout << argv[3] << std::endl;
-        Json::FastWriter fw;
-        std::cout << fw.write(receiver.getReceivedValueList());
+        Json::StreamWriterBuilder wbuilder;
+        wbuilder["indentation"] = "";
+        std::unique_ptr<Json::StreamWriter> writer(wbuilder.newStreamWriter());
+        std::ostringstream oss;
+        writer->write(receiver.getReceivedValueList(), &oss);
+        std::cout << oss.str() << std::endl;
     } catch (const std::exception& e) {
         std::cerr << "AmqpReceiver error: " << e.what() << std::endl;
         exit(-1);
diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Receiver.hpp b/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Receiver.hpp
index 8b5b32d..157fc8a 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Receiver.hpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Receiver.hpp
@@ -55,11 +55,8 @@ namespace qpidit
             void on_transport_error(proton::transport &t);
             void on_error(const proton::error_condition &c);
         protected:
-            //static void checkMessageType(const proton::message& msg, const proton::type_id amqpType);
             static void checkMessageType(const proton::value& val, const proton::type_id amqpType);
             static std::string getAmqpType(const proton::value& val);
-            static Json::Value& getMap(Json::Value& jsonMap, const proton::value& val);
-            static Json::Value& getSequence(Json::Value& jsonList, const proton::value& val);
             static Json::Value getValue(const proton::value& val);
             static Json::Value getValue(const std::string& amqpType, const proton::value& val);
 
diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.cpp b/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.cpp
index 7b47827..abefb5d 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "qpidit/amqp_types_test/Sender.hpp"
+#include "qpidit/Base64.hpp"
 
 #include <cstdlib>
 #include <iomanip>
@@ -71,16 +72,6 @@ namespace qpidit
         }
 
         //static
-        std::string Sender::bytearrayToHexStr(const char* src, int len) {
-            std::ostringstream oss;
-            oss << "0x" << std::hex;
-            for (int i=0; i<len; ++i) {
-                oss <<  std::setw(2) << std::setfill('0') << ((int)src[i] & 0xff);
-            }
-            return oss.str();
-        }
-
-        //static
         proton::value Sender::convertAmqpValue(const std::string& amqpType, const Json::Value& testValue) {
             if (amqpType.compare("null") == 0) {
                 std::string testValueStr(testValue.asString());
@@ -184,7 +175,8 @@ namespace qpidit
                 return val;
             }
             if (amqpType.compare("binary") == 0) {
-                return proton::binary(testValue.asString());
+                // Base64 decode to binary string
+                return b64_decode(testValue.asString());
             }
             if (amqpType.compare("string") == 0) {
                 return std::string(testValue.asString());
@@ -193,129 +185,17 @@ namespace qpidit
                 return proton::symbol(testValue.asString());
             }
             if (amqpType.compare("list") == 0) {
-                std::vector<proton::value> list;
-                processList(list, testValue);
-                return list;
-            } else if (amqpType.compare("map") == 0) {
-                std::map<proton::value, proton::value> map;
-                processMap(map, testValue);
-                return map;
+                throw qpidit::UnsupportedAmqpTypeError(amqpType);
+            }
+            if (amqpType.compare("map") == 0) {
+                throw qpidit::UnsupportedAmqpTypeError(amqpType);
             }
             if (amqpType.compare("array") == 0) {
-/*
-                std::vector<proton::value> array;
-                processArray(array, testValue);
-                return proton::as<proton::ARRAY>(array);
-*/
                 throw qpidit::UnsupportedAmqpTypeError(amqpType);
             }
             throw qpidit::UnknownAmqpTypeError(amqpType);
         }
 
-//        //static
-//        Json::Value::ValueType getArrayType(const Json::Value& val) {
-//            if (val.size()) > 0) {
-//                return val[0].type();
-//            } else {
-//                return Json::Value::nullValue; // TODO: find a way to represent empty array
-//            }
-//        }
-
-        //static
-        void Sender::processArray(std::vector<proton::value>& array, const Json::Value& testValues) {
-            for (Json::Value::const_iterator i = testValues.begin(); i != testValues.end(); ++i) {
-                if ((*i).isArray()) {
-                    std::vector<proton::value> subArray;
-                    processArray(subArray, *i);
-                    array.push_back(proton::value(subArray));
-                } else if ((*i).isObject()) {
-                    std::map<proton::value, proton::value> subMap;
-                    processMap(subMap, *i);
-                    array.push_back(proton::value(subMap));
-                } else {
-                    proton::value v;
-                    if ((*i).isNull())
-                        ;
-                    else if ((*i).isBool())
-                        v = (*i).asBool();
-                    else if ((*i).isInt())
-                        v = (*i).asInt();
-                    else if ((*i).isUInt())
-                        v = (*i).asUInt();
-                    else if ((*i).isDouble())
-                        v = (*i).asDouble();
-                    else if ((*i).isString())
-                        v = (*i).asString();
-                    else
-                        ; // TODO handle this case
-                    array.push_back(v);
-                }
-            }
-        }
-
-        //static
-        proton::value Sender::processElement(const Json::Value& testValue) {
-            const std::string testValueStr(testValue.asString());
-            // testValue has the format amqp-type:amqp-str-value
-            const std::size_t splitIndex = testValueStr.find_first_of(':');
-            if (splitIndex == std::string::npos) {
-                throw qpidit::InvalidTestValueError(testValueStr);
-            }
-            const std::string amqpType = testValueStr.substr(0, splitIndex);
-            const std::string amqpValueAsStr = testValueStr.substr(splitIndex + 1);
-            return convertAmqpValue(amqpType, amqpValueAsStr);
-        }
-
-        //static
-        void Sender::processList(std::vector<proton::value>& list, const Json::Value& testValues) {
-            for (Json::Value::const_iterator i = testValues.begin(); i != testValues.end(); ++i) {
-                if ((*i).isArray()) {
-                    std::vector<proton::value> subList;
-                    processList(subList, *i);
-                    list.push_back(proton::value(subList));
-                } else if ((*i).isObject()) {
-                    std::map<proton::value, proton::value> subMap;
-                    processMap(subMap, *i);
-                    list.push_back(proton::value(subMap));
-                } else {
-                    list.push_back(processElement(*i));
-                }
-            }
-        }
-
-        //static
-        void Sender::processMap(std::map<proton::value, proton::value>& map, const Json::Value& testValues) {
-            Json::Value::Members keys = testValues.getMemberNames();
-            for (std::vector<std::string>::const_iterator i=keys.begin(); i!=keys.end(); ++i) {
-                proton::value key = processElement(*i);
-                Json::Value mapVal = testValues[*i];
-                if (mapVal.isArray()) {
-                    std::vector<proton::value> subList;
-                    processList(subList, mapVal);
-                    map[key] = subList;
-                } else if (mapVal.isObject()) {
-                    std::map<proton::value, proton::value> subMap;
-                    processMap(subMap, mapVal);
-                    map[key] = subMap;
-                } else {
-                    map[key] = processElement(mapVal);
-                }
-            }
-        }
-
-        //static
-        void Sender::revMemcpy(char* dest, const char* src, int n) {
-            for (int i = 0; i < n; ++i) {
-                *(dest + i) = *(src + n - i - 1);
-            }
-        }
-
-        //static
-        void Sender::uint64ToChar16(char* dest, uint64_t upper, uint64_t lower) {
-            revMemcpy(dest, (const char*)&upper, sizeof(uint64_t));
-            revMemcpy(dest + 8, (const char*)&lower, sizeof(uint64_t));
-        }
-
     } /* namespace amqp_types_test */
 } /* namespace qpidit */
 
@@ -329,16 +209,18 @@ namespace qpidit
  */
 
 int main(int argc, char** argv) {
-    // TODO: improve arg management a little...
-    if (argc != 5) {
-        throw qpidit::ArgumentError("Incorrect number of arguments");
-    }
-
     try {
+        // TODO: improve arg management a little...
+        if (argc != 5) {
+            throw qpidit::ArgumentError("Incorrect number of arguments");
+        }
+
         Json::Value testValues;
-        Json::Reader jsonReader;
-        if (not jsonReader.parse(argv[4], testValues, false)) {
-            throw qpidit::JsonParserError(jsonReader);
+        Json::CharReaderBuilder rbuilder;
+        Json::CharReader* jsonReader = rbuilder.newCharReader();
+        std::string parseErrors;
+        if (not jsonReader->parse(argv[4], argv[4] + ::strlen(argv[4]), &testValues, &parseErrors)) {
+            throw qpidit::JsonParserError(parseErrors);
         }
 
         qpidit::amqp_types_test::Sender sender(argv[1], argv[2], argv[3], testValues);
diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.hpp b/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.hpp
index 88b81df..da9e721 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.hpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.hpp
@@ -47,16 +47,7 @@ namespace qpidit
         protected:
             proton::message& setMessage(proton::message& msg, const Json::Value& testValue);
 
-            static std::string bytearrayToHexStr(const char* src, int len);
-            static void revMemcpy(char* dest, const char* src, int n);
-            static void uint64ToChar16(char* dest, uint64_t upper, uint64_t lower);
-
             static proton::value convertAmqpValue(const std::string& amqpType, const Json::Value& testValue);
-            //static Json::Value::ValueType getArrayType(const Json::Value& val);
-            static void processArray(std::vector<proton::value>& array, const Json::Value& testValues);
-            static proton::value processElement(const Json::Value& testValue);
-            static void processList(std::vector<proton::value>& list, const Json::Value& testValues);
-            static void processMap(std::map<proton::value, proton::value>& map, const Json::Value& testValues);
 
             template<size_t N> static void hexStringToBytearray(proton::byte_array<N>& ba, const std::string s, size_t fromArrayIndex = 0, size_t arrayLen = N) {
                 for (size_t i=0; i<arrayLen; ++i) {
diff --git a/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Receiver.cpp b/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Receiver.cpp
index c1093e5..cb275a6 100644
--- a/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Receiver.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Receiver.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "qpidit/jms_hdrs_props_test/Receiver.hpp"
+#include "qpidit/Base64.hpp"
 
 #include <ctime>
 #include <iostream>
@@ -174,11 +175,11 @@ namespace qpidit
                 } else if (subType.compare("byte") == 0) {
                     _receivedSubTypeList.append(Json::Value(toHexStr<int8_t>(proton::get<int8_t>(val))));
                 } else if (subType.compare("bytes") == 0) {
-                    _receivedSubTypeList.append(Json::Value(std::string(proton::get<proton::binary>(val))));
+                    _receivedSubTypeList.append(Json::Value(b64_encode(proton::get<proton::binary>(val))));
                 } else if (subType.compare("char") == 0) {
                     std::ostringstream oss;
                     oss << (char)proton::get<wchar_t>(val);
-                    _receivedSubTypeList.append(Json::Value(oss.str()));
+                    _receivedSubTypeList.append(Json::Value(b64_encode(proton::binary(oss.str()))));
                 } else if (subType.compare("double") == 0) {
                     double d = proton::get<double>(val);
                     _receivedSubTypeList.append(Json::Value(toHexStr<int64_t>(*((int64_t*)&d), true, false)));
@@ -213,14 +214,14 @@ namespace qpidit
                 int8_t val = *((int8_t*)body.data());
                 _receivedSubTypeList.append(Json::Value(toHexStr<int8_t>(val)));
             } else if (subType.compare("bytes") == 0) {
-                _receivedSubTypeList.append(Json::Value(std::string(body)));
+                _receivedSubTypeList.append(Json::Value(b64_encode(body)));
             } else if (subType.compare("char") == 0) {
                 if (body.size() != sizeof(uint16_t)) throw IncorrectMessageBodyLengthError("JmsReceiver::receiveJmsBytesMessage, subType=char", sizeof(uint16_t), body.size());
                 // TODO: This is ugly: ignoring first byte - handle UTF-16 correctly
                 char c = body[1];
                 std::ostringstream oss;
                 oss << c;
-                _receivedSubTypeList.append(Json::Value(oss.str()));
+                _receivedSubTypeList.append(Json::Value(b64_encode(proton::binary(oss.str()))));
             } else if (subType.compare("double") == 0) {
                 if (body.size() != sizeof(int64_t)) throw IncorrectMessageBodyLengthError("JmsReceiver::receiveJmsBytesMessage, subType=double", sizeof(int64_t), body.size());
                 int64_t val = be64toh(*((int64_t*)body.data()));
@@ -262,11 +263,11 @@ namespace qpidit
                 } else if (subType.compare("byte") == 0) {
                     _receivedSubTypeList.append(Json::Value(toHexStr<int8_t>(proton::get<int8_t>(*i))));
                 } else if (subType.compare("bytes") == 0) {
-                    _receivedSubTypeList.append(Json::Value(std::string(proton::get<proton::binary>(*i))));
+                    _receivedSubTypeList.append(Json::Value(b64_encode(proton::get<proton::binary>(*i))));
                 } else if (subType.compare("char") == 0) {
                     std::ostringstream oss;
                     oss << (char)proton::get<wchar_t>(*i);
-                    _receivedSubTypeList.append(Json::Value(oss.str()));
+                    _receivedSubTypeList.append(Json::Value(b64_encode(proton::binary(oss.str()))));
                 } else if (subType.compare("double") == 0) {
                     double d = proton::get<double>(*i);
                     _receivedSubTypeList.append(Json::Value(toHexStr<int64_t>(*((int64_t*)&d), true, false)));
@@ -381,7 +382,7 @@ namespace qpidit
         void Receiver::addMessageHeaderByteArray(const std::string& headerName, const proton::binary ba) {
             if (!ba.empty()) { // TODO: Remove this test when PROTON-1288 is fixed as empty binaries are allowed in headers
                 Json::Value valueMap(Json::objectValue);
-                valueMap["bytes"] = std::string(ba);
+                valueMap["bytes"] = b64_encode(ba);
                 _receivedHeadersMap[headerName] = valueMap;
             }
         }
@@ -467,28 +468,34 @@ namespace qpidit
  *       4: JSON Test parameters containing 2 maps: [testValuesMap, flagMap]
  */
 int main(int argc, char** argv) {
-    // TODO: improve arg management a little...
-    if (argc != 5) {
-        throw qpidit::ArgumentError("Incorrect number of arguments");
-    }
-
     try {
+        // TODO: improve arg management a little...
+        if (argc != 5) {
+            throw qpidit::ArgumentError("Incorrect number of arguments");
+        }
+
         Json::Value testParams;
-        Json::Reader jsonReader;
-        if (not jsonReader.parse(argv[4], testParams, false)) {
-            throw qpidit::JsonParserError(jsonReader);
+        Json::CharReaderBuilder rbuilder;
+        Json::CharReader* jsonReader = rbuilder.newCharReader();
+        std::string parseErrors;
+        if (not jsonReader->parse(argv[4], argv[4] + ::strlen(argv[4]), &testParams, &parseErrors)) {
+            throw qpidit::JsonParserError(parseErrors);
         }
 
         qpidit::jms_hdrs_props_test::Receiver receiver(argv[1], argv[2], argv[3], testParams[0], testParams[1]);
         proton::container(receiver).run();
 
-        Json::FastWriter fw;
         std::cout << argv[3] << std::endl;
         Json::Value returnList(Json::arrayValue);
         returnList.append(receiver.getReceivedValueMap());
         returnList.append(receiver.getReceivedHeadersMap());
         returnList.append(receiver.getReceivedPropertiesMap());
-        std::cout << fw.write(returnList);
+        Json::StreamWriterBuilder wbuilder;
+        wbuilder["indentation"] = "";
+        std::unique_ptr<Json::StreamWriter> writer(wbuilder.newStreamWriter());
+        std::ostringstream oss;
+        writer->write(returnList, &oss);
+        std::cout << oss.str() << std::endl;
     } catch (const std::exception& e) {
         std::cout << "JmsReceiver error: " << e.what() << std::endl;
     }
diff --git a/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.cpp b/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.cpp
index ec8b024..2ef0d07 100644
--- a/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "qpidit/jms_hdrs_props_test/Sender.hpp"
+#include "qpidit/Base64.hpp"
 
 #include <cerrno>
 #include <iomanip>
@@ -136,13 +137,14 @@ namespace qpidit
                 uint8_t val = getIntegralValue<int8_t>(testValueStr);
                 bin.push_back(char(val));
             } else if (subType.compare("bytes") == 0) {
-                bin.assign(testValueStr.begin(), testValueStr.end());
+                bin = b64_decode(testValueStr);
             } else if (subType.compare("char") == 0) {
+                std::string decodedStr = b64_decode(testValueStr);
                 bin.push_back(char(0));
                 if (testValueStr[0] == '\\') { // Format: '\xNN'
-                    bin.push_back(getIntegralValue<char>(testValueStr.substr(2)));
+                    bin.push_back(getIntegralValue<char>(decodedStr.substr(2)));
                 } else { // Format: 'c'
-                    bin.push_back(testValueStr[0]);
+                    bin.push_back(decodedStr[0]);
                 }
             } else if (subType.compare("double") == 0) {
                 uint64_t val;
@@ -203,13 +205,14 @@ namespace qpidit
             } else if (subType.compare("byte") == 0) {
                 m[mapKey] = int8_t(getIntegralValue<int8_t>(testValueStr));
             } else if (subType.compare("bytes") == 0) {
-                m[mapKey] = proton::binary(testValueStr);
+                m[mapKey] = b64_decode(testValueStr);
             } else if (subType.compare("char") == 0) {
+                std::string decodedStr = b64_decode(testValueStr);
                 wchar_t val;
-                if (testValueStr[0] == '\\') { // Format: '\xNN'
-                    val = (wchar_t)getIntegralValue<wchar_t>(testValueStr.substr(2));
+                if (decodedStr[0] == '\\') { // Format: '\xNN'
+                    val = (wchar_t)getIntegralValue<wchar_t>(decodedStr.substr(2));
                 } else { // Format: 'c'
-                    val = testValueStr[0];
+                    val = decodedStr[0];
                 }
                 m[mapKey] = val;
             } else if (subType.compare("double") == 0) {
@@ -250,13 +253,14 @@ namespace qpidit
             } else if (subType.compare("byte") == 0) {
                 l.push_back(int8_t(getIntegralValue<int8_t>(testValueStr)));
             } else if (subType.compare("bytes") == 0) {
-                l.push_back(proton::binary(testValueStr));
+                l.push_back(b64_decode(testValueStr));
             } else if (subType.compare("char") == 0) {
+                std::string decodedStr = b64_decode(testValueStr);
                 wchar_t val;
-                if (testValueStr[0] == '\\') { // Format: '\xNN'
-                    val = (wchar_t)getIntegralValue<wchar_t>(testValueStr.substr(2));
+                if (decodedStr[0] == '\\') { // Format: '\xNN'
+                    val = (wchar_t)getIntegralValue<wchar_t>(decodedStr.substr(2));
                 } else { // Format: 'c'
-                    val = testValueStr[0];
+                    val = decodedStr[0];
                 }
                 l.push_back(val);
             } else if (subType.compare("double") == 0) {
@@ -297,7 +301,7 @@ namespace qpidit
                     setJmsTypeHeader(msg, val);
                 } else if (i->compare("JMS_CORRELATIONID_HEADER") == 0) {
                     if (headerValueType.compare("bytes") == 0) {
-                        setJmsCorrelationId(msg, proton::binary(val));
+                        setJmsCorrelationId(msg, b64_decode(val));
                     } else {
                         setJmsCorrelationId(msg, val);
                     }
@@ -424,19 +428,21 @@ namespace qpidit
  */
 
 int main(int argc, char** argv) {
-    // TODO: improve arg management a little...
-    if (argc != 5) {
-        throw qpidit::ArgumentError("Incorrect number of arguments");
-    }
+    try {
+        // TODO: improve arg management a little...
+        if (argc != 5) {
+            throw qpidit::ArgumentError("Incorrect number of arguments");
+        }
 
-    std::ostringstream oss;
-    oss << argv[1] << "/" << argv[2];
+        std::ostringstream oss;
+        oss << argv[1] << "/" << argv[2];
 
-    try {
         Json::Value testParams;
-        Json::Reader jsonReader;
-        if (not jsonReader.parse(argv[4], testParams, false)) {
-            throw qpidit::JsonParserError(jsonReader);
+        Json::CharReaderBuilder builder;
+        Json::CharReader* jsonReader = builder.newCharReader();
+        std::string parseErrors;
+        if (not jsonReader->parse(argv[4], argv[4] + ::strlen(argv[4]), &testParams, &parseErrors)) {
+            throw qpidit::JsonParserError(parseErrors);
         }
 
         qpidit::jms_hdrs_props_test::Sender sender(oss.str(), argv[3], testParams);
diff --git a/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.hpp b/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.hpp
index 4b5d6e7..ebeba48 100644
--- a/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.hpp
+++ b/shims/qpid-proton-cpp/src/qpidit/jms_hdrs_props_test/Sender.hpp
@@ -76,7 +76,7 @@ namespace qpidit
             static proton::binary getJavaObjectBinary(const std::string& javaClassName, const std::string& valAsString);
             static uint32_t getTotalNumMessages(const Json::Value& testValueMap);
 
-            template<typename T> static T numToBinary(T n, proton::binary& b) {
+            template<typename T> static void numToBinary(T n, proton::binary& b) {
                 for (int i=0; i<sizeof(n); ++i) {
                     b.push_back(* ((char*)&n + i));
                 }
diff --git a/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Receiver.cpp b/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Receiver.cpp
index ebbdfe4..0682225 100644
--- a/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Receiver.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Receiver.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "qpidit/jms_messages_test/Receiver.hpp"
+#include "qpidit/Base64.hpp"
 
 #include <iostream>
 #include <json/json.h>
@@ -156,11 +157,11 @@ namespace qpidit
                 } else if (subType.compare("byte") == 0) {
                     _receivedSubTypeList.append(Json::Value(toHexStr<int8_t>(proton::get<int8_t>(val))));
                 } else if (subType.compare("bytes") == 0) {
-                    _receivedSubTypeList.append(Json::Value(std::string(proton::get<proton::binary>(val))));
+                    _receivedSubTypeList.append(Json::Value(b64_encode(proton::get<proton::binary>(val))));
                 } else if (subType.compare("char") == 0) {
                     std::ostringstream oss;
                     oss << (char)proton::get<wchar_t>(val);
-                    _receivedSubTypeList.append(Json::Value(oss.str()));
+                    _receivedSubTypeList.append(Json::Value(b64_encode(proton::binary(oss.str()))));
                 } else if (subType.compare("double") == 0) {
                     double d = proton::get<double>(val);
                     _receivedSubTypeList.append(Json::Value(toHexStr<int64_t>(*((int64_t*)&d), true, false)));
@@ -195,14 +196,14 @@ namespace qpidit
                 int8_t val = *((int8_t*)body.data());
                 _receivedSubTypeList.append(Json::Value(toHexStr<int8_t>(val)));
             } else if (subType.compare("bytes") == 0) {
-                _receivedSubTypeList.append(Json::Value(std::string(body)));
+                _receivedSubTypeList.append(Json::Value(b64_encode(body)));
             } else if (subType.compare("char") == 0) {
                 if (body.size() != sizeof(uint16_t)) throw IncorrectMessageBodyLengthError("JmsReceiver::receiveJmsBytesMessage, subType=char", sizeof(uint16_t), body.size());
                 // TODO: This is ugly: ignoring first byte - handle UTF-16 correctly
                 char c = body[1];
                 std::ostringstream oss;
                 oss << c;
-                _receivedSubTypeList.append(Json::Value(oss.str()));
+                _receivedSubTypeList.append(Json::Value(b64_encode(proton::binary(oss.str()))));
             } else if (subType.compare("double") == 0) {
                 if (body.size() != sizeof(int64_t)) throw IncorrectMessageBodyLengthError("JmsReceiver::receiveJmsBytesMessage, subType=double", sizeof(int64_t), body.size());
                 int64_t val = be64toh(*((int64_t*)body.data()));
@@ -244,11 +245,11 @@ namespace qpidit
                 } else if (subType.compare("byte") == 0) {
                     _receivedSubTypeList.append(Json::Value(toHexStr<int8_t>(proton::get<int8_t>(*i))));
                 } else if (subType.compare("bytes") == 0) {
-                    _receivedSubTypeList.append(Json::Value(std::string(proton::get<proton::binary>(*i))));
+                    _receivedSubTypeList.append(Json::Value(b64_encode(proton::get<proton::binary>(*i))));
                 } else if (subType.compare("char") == 0) {
                     std::ostringstream oss;
                     oss << (char)proton::get<wchar_t>(*i);
-                    _receivedSubTypeList.append(Json::Value(oss.str()));
+                    _receivedSubTypeList.append(Json::Value(b64_encode(proton::binary(oss.str()))));
                 } else if (subType.compare("double") == 0) {
                     double d = proton::get<double>(*i);
                     _receivedSubTypeList.append(Json::Value(toHexStr<int64_t>(*((int64_t*)&d), true, false)));
@@ -293,21 +294,27 @@ int main(int argc, char** argv) {
             throw qpidit::ArgumentError("Incorrect number of arguments (expected 4):\n\t1. Broker TCP address(ip-addr:port)\n\t2. Queue name\n\t3. JMS message type\n\t4. JSON data string\n");
         }
 
-        std::ostringstream oss;
-        oss << argv[1] << "/" << argv[2];
+        std::ostringstream oss1;
+        oss1 << argv[1] << "/" << argv[2];
 
         Json::Value testParams;
-        Json::Reader jsonReader;
-        if (not jsonReader.parse(argv[4], testParams, false)) {
-            throw qpidit::JsonParserError(jsonReader);
+        Json::CharReaderBuilder rbuilder;
+        Json::CharReader* jsonReader = rbuilder.newCharReader();
+        std::string parseErrors;
+        if (not jsonReader->parse(argv[4], argv[4] + ::strlen(argv[4]), &testParams, &parseErrors)) {
+            throw qpidit::JsonParserError(parseErrors);
         }
 
-        qpidit::jms_messages_test::Receiver receiver(oss.str(), argv[3], testParams);
+        qpidit::jms_messages_test::Receiver receiver(oss1.str(), argv[3], testParams);
         proton::container(receiver).run();
 
-        Json::FastWriter fw;
         std::cout << argv[3] << std::endl;
-        std::cout << fw.write(receiver.getReceivedValueMap());
+        Json::StreamWriterBuilder wbuilder;
+        wbuilder["indentation"] = "";
+        std::unique_ptr<Json::StreamWriter> writer(wbuilder.newStreamWriter());
+        std::ostringstream oss2;
+        writer->write(receiver.getReceivedValueMap(), &oss2);
+        std::cout << oss2.str() << std::endl;
     } catch (const std::exception& e) {
         std::cout << "JmsReceiver error: " << e.what() << std::endl;
     }
diff --git a/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.cpp b/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.cpp
index 5266dcf..5a61be5 100644
--- a/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "qpidit/jms_messages_test/Sender.hpp"
+#include "qpidit/Base64.hpp"
 
 #include <cerrno>
 #include <iomanip>
@@ -132,13 +133,14 @@ namespace qpidit
                 uint8_t val = getIntegralValue<int8_t>(testValueStr);
                 bin.push_back(char(val));
             } else if (subType.compare("bytes") == 0) {
-                bin.assign(testValueStr.begin(), testValueStr.end());
+                bin = b64_decode(testValueStr);
             } else if (subType.compare("char") == 0) {
+                std::string decodedStr = b64_decode(testValueStr);
                 bin.push_back(char(0));
-                if (testValueStr[0] == '\\') { // Format: '\xNN'
-                    bin.push_back(getIntegralValue<char>(testValueStr.substr(2)));
+                if (decodedStr[0] == '\\') { // Format: '\xNN'
+                    bin.push_back(getIntegralValue<char>(decodedStr.substr(2)));
                 } else { // Format: 'c'
-                    bin.push_back(testValueStr[0]);
+                    bin.push_back(decodedStr[0]);
                 }
             } else if (subType.compare("double") == 0) {
                 uint64_t val;
@@ -146,30 +148,21 @@ namespace qpidit
                     val = htobe64(std::strtoul(testValueStr.data(), NULL, 16));
                 } catch (const std::exception& e) { throw qpidit::InvalidTestValueError("double", testValueStr); }
                 numToBinary(val, bin);
-               //for (int i=0; i<sizeof(val); ++i) {
-               //     bin.push_back(* ((char*)&val + i));
-               // }
             } else if (subType.compare("float") == 0) {
                 uint32_t val;
                 try {
                     val = htobe32((uint32_t)std::strtoul(testValueStr.data(), NULL, 16));
                 } catch (const std::exception& e) { throw qpidit::InvalidTestValueError("float", testValueStr); }
                 numToBinary(val, bin);
-                //for (int i=0; i<sizeof(val); ++i) {
-                //    bin.push_back(* ((char*)&val + i));
-                //}
             } else if (subType.compare("long") == 0) {
                 uint64_t val = htobe64(getIntegralValue<uint64_t>(testValueStr));
                 numToBinary(val, bin);
-                //bin.assign(sizeof(val), val);
             } else if (subType.compare("int") == 0) {
                 uint32_t val = htobe32(getIntegralValue<uint32_t>(testValueStr));
                 numToBinary(val, bin);
-                //bin.assign(sizeof(val), val);
             } else if (subType.compare("short") == 0) {
                 uint16_t val = htobe16(getIntegralValue<int16_t>(testValueStr));
                 numToBinary(val, bin);
-                //bin.assign(sizeof(val), val);
             } else if (subType.compare("string") == 0) {
                 std::ostringstream oss;
                 uint16_t strlen = htobe16((uint16_t)testValueStr.size());
@@ -199,13 +192,14 @@ namespace qpidit
             } else if (subType.compare("byte") == 0) {
                 m[mapKey] = int8_t(getIntegralValue<int8_t>(testValueStr));
             } else if (subType.compare("bytes") == 0) {
-                m[mapKey] = proton::binary(testValueStr);
+                m[mapKey] = b64_decode(testValueStr);
             } else if (subType.compare("char") == 0) {
+                std::string decodedStr = b64_decode(testValueStr);
                 wchar_t val;
-                if (testValueStr[0] == '\\') { // Format: '\xNN'
-                    val = (wchar_t)getIntegralValue<wchar_t>(testValueStr.substr(2));
+                if (decodedStr[0] == '\\') { // Format: '\xNN'
+                    val = (wchar_t)getIntegralValue<wchar_t>(decodedStr.substr(2));
                 } else { // Format: 'c'
-                    val = testValueStr[0];
+                    val = decodedStr[0];
                 }
                 m[mapKey] = val;
             } else if (subType.compare("double") == 0) {
@@ -246,13 +240,14 @@ namespace qpidit
             } else if (subType.compare("byte") == 0) {
                 l.push_back(int8_t(getIntegralValue<int8_t>(testValueStr)));
             } else if (subType.compare("bytes") == 0) {
-                l.push_back(proton::binary(testValueStr));
+                l.push_back(b64_decode(testValueStr));
             } else if (subType.compare("char") == 0) {
+                std::string decodedStr = b64_decode(testValueStr);
                 wchar_t val;
-                if (testValueStr[0] == '\\') { // Format: '\xNN'
-                    val = (wchar_t)getIntegralValue<wchar_t>(testValueStr.substr(2));
+                if (decodedStr[0] == '\\') { // Format: '\xNN'
+                    val = (wchar_t)getIntegralValue<wchar_t>(decodedStr.substr(2));
                 } else { // Format: 'c'
-                    val = testValueStr[0];
+                    val = decodedStr[0];
                 }
                 l.push_back(val);
             } else if (subType.compare("double") == 0) {
@@ -334,9 +329,11 @@ int main(int argc, char** argv) {
         oss << argv[1] << "/" << argv[2];
 
         Json::Value testParams;
-        Json::Reader jsonReader;
-        if (not jsonReader.parse(argv[4], testParams, false)) {
-            throw qpidit::JsonParserError(jsonReader);
+        Json::CharReaderBuilder builder;
+        Json::CharReader* jsonReader = builder.newCharReader();
+        std::string parseErrors;
+        if (not jsonReader->parse(argv[4], argv[4] + ::strlen(argv[4]), &testParams, &parseErrors)) {
+            throw qpidit::JsonParserError(parseErrors);
         }
 
         qpidit::jms_messages_test::Sender sender(oss.str(), argv[3], testParams);
diff --git a/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.hpp b/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.hpp
index b808aec..cb47b1f 100644
--- a/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.hpp
+++ b/shims/qpid-proton-cpp/src/qpidit/jms_messages_test/Sender.hpp
@@ -66,7 +66,7 @@ namespace qpidit
             static proton::binary getJavaObjectBinary(const std::string& javaClassName, const std::string& valAsString);
             static uint32_t getTotalNumMessages(const Json::Value& testValueMap);
 
-            template<typename T> static T numToBinary(T n, proton::binary& b) {
+            template<typename T> static void numToBinary(T n, proton::binary& b) {
                 for (int i=0; i<sizeof(n); ++i) {
                     b.push_back(* ((char*)&n + i));
                 }
diff --git a/shims/qpid-proton-python/src/amqp_complex_types_test/Common.py b/shims/qpid-proton-python/src/amqp_complex_types_test/Common.py
index 6b8103a..e297f10 100644
--- a/shims/qpid-proton-python/src/amqp_complex_types_test/Common.py
+++ b/shims/qpid-proton-python/src/amqp_complex_types_test/Common.py
@@ -50,7 +50,12 @@ class AmqpComplexTypesTestShim(proton.handlers.MessagingHandler):
     def get_array(self, array_data):
         """Get AMQP array from array_data"""
         for array in array_data:
-            if array.type == self.proton_type(self.amqp_subtype):
+            # Empty arrays are of type proton.Data.NULL, but have no elements
+            if self.amqp_subtype == 'None' and array.type == self.proton_type(self.amqp_subtype) and not array.elements:
+                return array
+            if self.amqp_subtype == 'null' and array.type == self.proton_type(self.amqp_subtype) and array.elements:
+                return array
+            if self.amqp_subtype not in ['None', 'null'] and array.type == self.proton_type(self.amqp_subtype):
                 return array
         print('%s: get_array(): Unable to find array subtype "%s" in array test data' %
               (self.role, self.amqp_subtype), file=sys.stderr)
@@ -142,7 +147,7 @@ class AmqpComplexTypesTestShim(proton.handlers.MessagingHandler):
             print('%s: get_class(): Unknown subtype "%s"' % (self.role, amqp_subtype), file=sys.stderr)
             sys.exit(1)
 
-    PROTON_TYPE_MAP = {'None': None,
+    PROTON_TYPE_MAP = {'None': proton.Data.NULL,
                        'null': proton.Data.NULL,
                        'boolean': proton.Data.BOOL,
                        'ubyte': proton.Data.UBYTE,
diff --git a/shims/qpid-proton-python/src/amqp_complex_types_test/Receiver.py b/shims/qpid-proton-python/src/amqp_complex_types_test/Receiver.py
index 331a5a1..fbeea3e 100644
--- a/shims/qpid-proton-python/src/amqp_complex_types_test/Receiver.py
+++ b/shims/qpid-proton-python/src/amqp_complex_types_test/Receiver.py
@@ -107,19 +107,20 @@ class AmqpComplexTypesTestReceiver(amqp_complex_types_test.Common.AmqpComplexTyp
         if len(arr1.elements) != len(arr2.elements):
             return False
         # Check each element is the same value
-        for elt1, elt2 in zip(arr1.elements, arr2.elements):
-            if arr1.type == proton.Data.ARRAY and isinstance(elt1, proton.Array):
-                if not AmqpComplexTypesTestReceiver.check_arrays_equal(elt1, elt2):
-                    return False
-            elif arr1.type == proton.Data.LIST and isinstance(elt1, list):
-                if not AmqpComplexTypesTestReceiver.check_lists_equal(elt1, elt2):
-                    return False
-            elif arr1.type == proton.Data.MAP and isinstance(elt1, dict):
-                if not AmqpComplexTypesTestReceiver.check_maps_equal(elt1, elt2):
-                    return False
-            else:
-                if not AmqpComplexTypesTestReceiver.check_simple_values_equal(elt1, elt2):
-                    return False
+        if len(arr1.elements) > 0:
+            for elt1, elt2 in zip(arr1.elements, arr2.elements):
+                if arr1.type == proton.Data.ARRAY and isinstance(elt1, proton.Array):
+                    if not AmqpComplexTypesTestReceiver.check_arrays_equal(elt1, elt2):
+                        return False
+                elif arr1.type == proton.Data.LIST and isinstance(elt1, list):
+                    if not AmqpComplexTypesTestReceiver.check_lists_equal(elt1, elt2):
+                        return False
+                elif arr1.type == proton.Data.MAP and isinstance(elt1, dict):
+                    if not AmqpComplexTypesTestReceiver.check_maps_equal(elt1, elt2):
+                        return False
+                else:
+                    if not AmqpComplexTypesTestReceiver.check_simple_values_equal(elt1, elt2):
+                        return False
         return True
 
     @staticmethod
diff --git a/shims/qpid-proton-python/src/amqp_types_test/Receiver.py b/shims/qpid-proton-python/src/amqp_types_test/Receiver.py
index 5067de2..b4f50dd 100755
--- a/shims/qpid-proton-python/src/amqp_types_test/Receiver.py
+++ b/shims/qpid-proton-python/src/amqp_types_test/Receiver.py
@@ -23,6 +23,7 @@ AMQP type test receiver shim for qpid-interop-test
 # under the License.
 #
 
+import base64
 import json
 import os.path
 import signal
@@ -32,7 +33,6 @@ import sys
 import traceback
 import uuid
 
-import proton
 import proton.handlers
 import proton.reactor
 import _compat
@@ -126,18 +126,13 @@ class AmqpTypesTestReceiver(proton.handlers.MessagingHandler):
         if amqp_type == 'uuid':
             return str(amqp_value)
         if amqp_type == 'binary':
-            return amqp_value.decode('utf-8')
+            return base64.b64encode(amqp_value).decode('utf-8')
         if amqp_type == 'string':
             return amqp_value
         if amqp_type == 'symbol':
             return amqp_value
-        if amqp_type == 'list':
-            return AmqpTypesTestReceiver.decode_amqp_list(amqp_value)
-        if amqp_type == 'map':
-            return AmqpTypesTestReceiver.decode_amqp_map(amqp_value)
-        if amqp_type == 'array':
-            #return AmqpTypesTestReceiver.decode_amqp_array(amqp_value)
-            print('receive: Unsupported AMQP type "%s"' % amqp_type)
+        if amqp_type in ['array', 'list', 'map']:
+            print('receive: Complex AMQP type "%s" unsupported, see amqp_complex_types_test' % amqp_type)
             return None
         print('receive: Unknown AMQP type "%s"' % amqp_type)
         return None
@@ -206,39 +201,6 @@ class AmqpTypesTestReceiver(proton.handlers.MessagingHandler):
 
         print('receive: Unmapped AMQP type: %s:%s' % (type(amqp_value), amqp_value))
 
-    @staticmethod
-    def decode_complex_amqp_element(amqp_value):
-        """Decode an element from a complex AMQP type from its Python value"""
-        amqp_type = AmqpTypesTestReceiver.get_amqp_type(amqp_value)
-        if amqp_type == "list":
-            return AmqpTypesTestReceiver.decode_amqp_list(amqp_value)
-        if amqp_type == "map":
-            return AmqpTypesTestReceiver.decode_amqp_map(amqp_value)
-        return "%s:%s" % (amqp_type, AmqpTypesTestReceiver.decode_amqp_type(amqp_type, amqp_value))
-
-    @staticmethod
-    def decode_amqp_list(amqp_value):
-        """Decode amqp list type"""
-#        print('LIST:%s' % amqp_value)
-        amqp_list = []
-        for list_item in amqp_value:
-            amqp_list.append(AmqpTypesTestReceiver.decode_complex_amqp_element(list_item))
-        return amqp_list
-
-    @staticmethod
-    def decode_amqp_map(amqp_value):
-        """Decode amqp map type"""
-        amqp_map = {}
-        for key, value in amqp_value.items():
-            amqp_map[AmqpTypesTestReceiver.decode_complex_amqp_element(key)] = \
-                    AmqpTypesTestReceiver.decode_complex_amqp_element(value)
-        return amqp_map
-
-    @staticmethod
-    def decode_amqp_array(amqp_value):
-        """Decode amqp array type"""
-        return amqp_value
-
     def on_transport_error(self, event):
         print('Receiver: Broker not found at %s' % self.broker_url)
 
diff --git a/shims/qpid-proton-python/src/amqp_types_test/Sender.py b/shims/qpid-proton-python/src/amqp_types_test/Sender.py
index 034cfc5..7e7f800 100755
--- a/shims/qpid-proton-python/src/amqp_types_test/Sender.py
+++ b/shims/qpid-proton-python/src/amqp_types_test/Sender.py
@@ -23,6 +23,7 @@ AMQP type test sender shim for qpid-interop-test
 # under the License.
 #
 
+import base64
 import json
 import os.path
 import signal
@@ -31,7 +32,6 @@ import sys
 import traceback
 import uuid
 
-import proton
 import proton.handlers
 import proton.reactor
 import _compat
@@ -121,77 +121,19 @@ class AmqpTypesTestSender(proton.handlers.MessagingHandler):
         if amqp_type == 'uuid':
             return uuid.UUID(test_value)
         if amqp_type == 'binary':
-            return test_value.encode('utf-8')
+            return base64.b64decode(test_value)
+        if amqp_type == 'binarystr':
+            return _compat.unicode(test_value)
         if amqp_type == 'string':
             return _compat.unicode(test_value)
         if amqp_type == 'symbol':
             return proton.symbol(test_value)
-        if amqp_type == 'list':
-            return AmqpTypesTestSender.encode_amqp_list(test_value)
-        if amqp_type == 'map':
-            return AmqpTypesTestSender.encode_amqp_map(test_value)
-        if amqp_type == 'array':
-            #return AmqpTypesTestSender.encode_amqp_array(test_value)
-            print('send: Unsupported AMQP type "%s"' % amqp_type)
+        if amqp_type in ['array', 'list', 'map']:
+            print('send: Complex AMQP type "%s" unsupported, see amqp_complex_types_test' % amqp_type)
             return None
         print('send: Unknown AMQP type "%s"' % amqp_type)
         return None
 
-    @staticmethod
-    def encode_complex_amqp_element(test_element, make_hashable=False):
-        """
-        Encode a single complex AMQP element (ie list or array member, map key or value)
-        A complex element may be one of:
-        str/unicode: 'amqp_type:amqp_value'
-        list: [...]
-        dict: {...}
-        """
-        if _compat.IS_PY3:
-            is_string = isinstance(test_element, str)
-        else:
-            is_string = isinstance(test_element, unicode)
-        if is_string:
-            split_list = test_element.split(':', 1)
-            return AmqpTypesTestSender.encode_amqp_type(split_list[0], split_list[1])
-        if isinstance(test_element, list):
-            enc_list = AmqpTypesTestSender.encode_amqp_list(test_element)
-            if make_hashable:
-                return tuple(enc_list) # Convert list to tuple
-            return enc_list
-        if isinstance(test_element, dict):
-            enc_dict = AmqpTypesTestSender.encode_amqp_map(test_element)
-            if make_hashable:
-                return tuple(enc_dict.items()) # Convert to tuple of k,v pairs
-            return enc_dict
-        else:
-            print('Unexpected complex amqp element type: %s, value=%s' % (type(test_element), str(test_element)))
-
-    @staticmethod
-    def encode_amqp_list(test_value):
-        """
-        Encode an AMQP list from the format [val1, val2, ...]
-        Each val is in the string format amqp_type:amqp_val_as_str
-        """
-        val_list = []
-        for val in test_value:
-            val_list.append(AmqpTypesTestSender.encode_complex_amqp_element(val))
-        return val_list
-
-    @staticmethod
-    def encode_amqp_map(test_value):
-        """Encode an AMQP map from the format {key1:val1, key2:val2, ...}"""
-        val_map = {}
-        for key, val in test_value.items():
-            encoded_key = AmqpTypesTestSender.encode_complex_amqp_element(key, True) # make keys hashable
-            encoded_val = AmqpTypesTestSender.encode_complex_amqp_element(val)
-            val_map[encoded_key] = encoded_val
-        return val_map
-
-    @staticmethod
-    def encode_amqp_array(test_value):
-        """Encode an AMQP array"""
-        return test_value
-
     def on_accepted(self, event):
         """Event callback for when a sent message is accepted by the broker"""
         self.confirmed += 1
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 2cabf10..3642149 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
@@ -23,6 +23,7 @@ JMS message headers and properties test receiver shim for qpid-interop-test
 # under the License.
 #
 
+import base64
 import json
 import signal
 import struct
@@ -31,11 +32,12 @@ import sys
 import time
 import traceback
 
+from qpid_interop_test.qit_errors import InteropTestError
+from qpid_interop_test.qit_jms_types import QPID_JMS_TYPE_ANNOTATION_NAME
+
 import proton
 import proton.handlers
 import proton.reactor
-from qpid_interop_test.qit_errors import InteropTestError
-from qpid_interop_test.qit_jms_types import QPID_JMS_TYPE_ANNOTATION_NAME
 import _compat
 
 
@@ -160,12 +162,12 @@ class JmsHdrsPropsTestReceiver(proton.handlers.MessagingHandler):
         if self.current_subtype == 'byte':
             return hex(struct.unpack('b', message.body)[0])
         if self.current_subtype == 'bytes':
-            return message.body.decode('utf-8')
+            return base64.b64encode(message.body).decode('utf-8')
         if self.current_subtype == 'char':
             if len(message.body) == 2: # format 'a' or '\xNN'
                 if _compat.IS_PY3:
-                    return chr(message.body[1]) # strip leading '\x00' char
-                return str(message.body[1]) # strip leading '\x00' char
+                    return base64.b64encode(bytes([message.body[1]])).decode('utf-8') # strip leading '\x00' char
+                return base64.b64encode(bytes(message.body[1])).decode('utf-8') # strip leading '\x00' char
             raise InteropTestError('Unexpected strring length for type char: %d' % len(message.body))
         if self.current_subtype == 'double':
             return '0x%016x' % struct.unpack('!Q', message.body)[0]
@@ -186,9 +188,8 @@ class JmsHdrsPropsTestReceiver(proton.handlers.MessagingHandler):
                     raise InteropTestError('String length mismatch: size=%d, but len(\'%s\')=%d' %
                                            (str_len, str_body, len(str_body)))
                 return str_body
-            else:
-                raise InteropTestError('Malformed string binary: len(\'%s\')=%d' %
-                                       (repr(message.body), len(message.body)))
+            raise InteropTestError('Malformed string binary: len(\'%s\')=%d' %
+                                   (repr(message.body), len(message.body)))
         raise InteropTestError('JMS message type %s: Unknown or unsupported subtype \'%s\'' %
                                (self.jms_msg_type, self.current_subtype))
 
@@ -203,9 +204,11 @@ class JmsHdrsPropsTestReceiver(proton.handlers.MessagingHandler):
         if self.current_subtype == 'byte':
             return hex(value)
         if self.current_subtype == 'bytes':
-            return value.decode('utf-8')
+            return base64.b64encode(value).decode('utf-8')
         if self.current_subtype == 'char':
-            return str(value)
+            if _compat.IS_PY3:
+                return base64.b64encode(bytes(value, 'utf-8')).decode('utf-8')
+            return base64.b64encode(bytes(value)).decode('utf-8')
         if self.current_subtype == 'double':
             return '0x%016x' % struct.unpack('!Q', struct.pack('!d', value))[0]
         if self.current_subtype == 'float':
@@ -266,9 +269,11 @@ class JmsHdrsPropsTestReceiver(proton.handlers.MessagingHandler):
         if self.current_subtype == 'byte':
             return hex(value)
         if self.current_subtype == 'bytes':
-            return value.decode('utf-8')
+            return base64.b64encode(value).decode('utf-8')
         if self.current_subtype == 'char':
-            return str(value)
+            if _compat.IS_PY3:
+                return base64.b64encode(bytes(value, 'utf-8')).decode('utf-8')
+            return base64.b64encode(bytes(value)).decode('utf-8')
         if self.current_subtype == 'double':
             return '0x%016x' % struct.unpack('!Q', struct.pack('!d', value))[0]
         if self.current_subtype == 'float':
@@ -302,7 +307,8 @@ class JmsHdrsPropsTestReceiver(proton.handlers.MessagingHandler):
         correlation_id = message.correlation_id
         if correlation_id is not None:
             if 'JMS_CORRELATIONID_AS_BYTES' in self.flag_map and self.flag_map['JMS_CORRELATIONID_AS_BYTES']:
-                self.jms_header_map['JMS_CORRELATIONID_HEADER'] = {'bytes': correlation_id.decode('utf-8')}
+                bytes_val = base64.b64encode(correlation_id).decode('utf-8')
+                self.jms_header_map['JMS_CORRELATIONID_HEADER'] = {'bytes': bytes_val}
             else:
                 self.jms_header_map['JMS_CORRELATIONID_HEADER'] = {'string': correlation_id}
 
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 076920c..e19949d 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
@@ -23,6 +23,7 @@ JMS message headers and properties test sender shim for qpid-interop-test
 # under the License.
 #
 
+import base64
 import os.path
 import signal
 import struct
@@ -175,10 +176,10 @@ class JmsHdrsPropsTestSender(proton.handlers.MessagingHandler):
         elif test_value_type == 'byte':
             body_bytes = struct.pack('b', int(test_value, 16))
         elif test_value_type == 'bytes':
-            body_bytes = test_value.encode('utf-8')
+            body_bytes = base64.b64decode(test_value)
         elif test_value_type == 'char':
             # JMS expects two-byte chars, ASCII chars can be prefixed with '\x00'
-            body_bytes = b'\x00' + test_value.encode('utf-8')
+            body_bytes = b'\x00' + base64.b64decode(test_value)
         elif test_value_type == 'double' or test_value_type == 'float':
             body_bytes = test_value[2:].decode('hex')
         elif test_value_type == 'int':
@@ -209,9 +210,9 @@ class JmsHdrsPropsTestSender(proton.handlers.MessagingHandler):
         elif test_value_type == 'byte':
             value = proton.byte(int(test_value, 16))
         elif test_value_type == 'bytes':
-            value = test_value.encode('utf-8')
+            value = base64.b64decode(test_value)
         elif test_value_type == 'char':
-            value = proton.char(test_value)
+            value = proton.char(base64.b64decode(test_value).decode('utf-8'))
         elif test_value_type == 'double':
             value = struct.unpack('!d', test_value[2:].decode('hex'))[0]
         elif test_value_type == 'float':
@@ -266,9 +267,9 @@ class JmsHdrsPropsTestSender(proton.handlers.MessagingHandler):
         elif test_value_type == 'byte':
             body_list = [proton.byte(int(test_value, 16))]
         elif test_value_type == 'bytes':
-            body_list = [test_value.encode('utf-8')]
+            body_list = [base64.b64decode(test_value)]
         elif test_value_type == 'char':
-            body_list = [proton.char(test_value)]
+            body_list = [proton.char(base64.b64decode(test_value).decode('utf-8'))]
         elif test_value_type == 'double':
             body_list = [struct.unpack('!d', test_value[2:].decode('hex'))[0]]
         elif test_value_type == 'float':
@@ -317,7 +318,7 @@ class JmsHdrsPropsTestSender(proton.handlers.MessagingHandler):
                 if value_type == 'string':
                     hdr_kwargs['correlation_id'] = value
                 elif value_type == 'bytes':
-                    hdr_kwargs['correlation_id'] = value.encode('utf-8')
+                    hdr_kwargs['correlation_id'] = base64.b64decode(value)
                 else:
                     raise InteropTestError('JmsSenderShim._get_jms_message_header_kwargs(): ' +
                                            'JMS_CORRELATIONID_HEADER requires value type "string" or "bytes", ' +
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 c2d27bf..b457369 100755
--- a/shims/qpid-proton-python/src/jms_messages_test/Receiver.py
+++ b/shims/qpid-proton-python/src/jms_messages_test/Receiver.py
@@ -23,6 +23,7 @@ JMS receiver shim for qpid-interop-test
 # under the License.
 #
 
+import base64
 import json
 import signal
 import struct
@@ -30,11 +31,12 @@ import subprocess
 import sys
 import traceback
 
+from qpid_interop_test.qit_errors import InteropTestError
+from qpid_interop_test.qit_jms_types import QPID_JMS_TYPE_ANNOTATION_NAME
+
 import proton
 import proton.handlers
 import proton.reactor
-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):
@@ -145,12 +147,12 @@ class JmsMessagesTestReceiver(proton.handlers.MessagingHandler):
         if self.current_subtype == 'byte':
             return hex(struct.unpack('b', message.body)[0])
         if self.current_subtype == 'bytes':
-            return message.body.decode('utf-8')
+            return base64.b64encode(message.body).decode('utf-8')
         if self.current_subtype == 'char':
             if len(message.body) == 2: # format 'a' or '\xNN'
                 if _compat.IS_PY3:
-                    return chr(message.body[1]) # strip leading '\x00' char
-                return str(message.body[1]) # strip leading '\x00' char
+                    return base64.b64encode(bytes([message.body[1]])).decode('utf-8') # strip leading '\x00' char
+                return base64.b64encode(bytes(message.body[1])).decode('utf-8') # strip leading '\x00' char
             raise InteropTestError('Unexpected string length for type char: %d' % len(message.body))
         if self.current_subtype == 'double':
             return '0x%016x' % struct.unpack('!Q', message.body)[0]
@@ -171,9 +173,8 @@ class JmsMessagesTestReceiver(proton.handlers.MessagingHandler):
                     raise InteropTestError('String length mismatch: size=%d, but len(\'%s\')=%d' %
                                            (str_len, str_body, len(str_body)))
                 return str_body
-            else:
-                raise InteropTestError('Malformed string binary: len(\'%s\')=%d' %
-                                       (repr(message.body), len(message.body)))
+            raise InteropTestError('Malformed string binary: len(\'%s\')=%d' %
+                                   (repr(message.body), len(message.body)))
         raise InteropTestError('JMS message type %s: Unknown or unsupported subtype \'%s\'' %
                                (self.jms_msg_type, self.current_subtype))
 
@@ -188,9 +189,11 @@ class JmsMessagesTestReceiver(proton.handlers.MessagingHandler):
         if self.current_subtype == 'byte':
             return hex(value)
         if self.current_subtype == 'bytes':
-            return value.decode('utf-8')
+            return base64.b64encode(value).decode('utf-8')
         if self.current_subtype == 'char':
-            return str(value)
+            if _compat.IS_PY3:
+                return base64.b64encode(bytes(value, 'utf-8')).decode('utf-8')
+            return base64.b64encode(bytes(value)).decode('utf-8')
         if self.current_subtype == 'double':
             return '0x%016x' % struct.unpack('!Q', struct.pack('!d', value))[0]
         if self.current_subtype == 'float':
@@ -251,9 +254,11 @@ class JmsMessagesTestReceiver(proton.handlers.MessagingHandler):
         if self.current_subtype == 'byte':
             return hex(value)
         if self.current_subtype == 'bytes':
-            return value.decode('utf-8')
+            return base64.b64encode(value).decode('utf-8')
         if self.current_subtype == 'char':
-            return str(value)
+            if _compat.IS_PY3:
+                return base64.b64encode(bytes(value, 'utf-8')).decode('utf-8')
+            return base64.b64encode(bytes(value)).decode('utf-8')
         if self.current_subtype == 'double':
             return '0x%016x' % struct.unpack('!Q', struct.pack('!d', value))[0]
         if self.current_subtype == 'float':
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 931da10..3707707 100755
--- a/shims/qpid-proton-python/src/jms_messages_test/Sender.py
+++ b/shims/qpid-proton-python/src/jms_messages_test/Sender.py
@@ -23,6 +23,7 @@ JMS sender shim for qpid-interop-test
 # under the License.
 #
 
+import base64
 import json
 import signal
 import subprocess
@@ -156,10 +157,10 @@ class JmsMessagesTestSender(proton.handlers.MessagingHandler):
         elif test_value_type == 'byte':
             body_bytes = struct.pack('b', int(test_value, 16))
         elif test_value_type == 'bytes':
-            body_bytes = test_value.encode('utf-8')
+            body_bytes = base64.b64decode(test_value)
         elif test_value_type == 'char':
             # JMS expects two-byte chars, ASCII chars can be prefixed with '\x00'
-            body_bytes = b'\x00' + test_value.encode('utf-8')
+            body_bytes = b'\x00' + base64.b64decode(test_value)
         elif test_value_type == 'double' or test_value_type == 'float':
             body_bytes = _compat.decode_hex(test_value[2:])
         elif test_value_type == 'int':
@@ -189,9 +190,9 @@ class JmsMessagesTestSender(proton.handlers.MessagingHandler):
         elif test_value_type == 'byte':
             value = proton.byte(int(test_value, 16))
         elif test_value_type == 'bytes':
-            value = test_value.encode('utf-8')
+            value = base64.b64decode(test_value)
         elif test_value_type == 'char':
-            value = proton.char(test_value)
+            value = proton.char(base64.b64decode(test_value).decode('utf-8'))
         elif test_value_type == 'double':
             value = struct.unpack('!d', _compat.decode_hex(test_value[2:]))[0]
         elif test_value_type == 'float':
@@ -242,9 +243,9 @@ class JmsMessagesTestSender(proton.handlers.MessagingHandler):
         elif test_value_type == 'byte':
             body_list = [proton.byte(int(test_value, 16))]
         elif test_value_type == 'bytes':
-            body_list = [test_value.encode('utf-8')]
+            body_list = [base64.b64decode(test_value)]
         elif test_value_type == 'char':
-            body_list = [proton.char(test_value)]
+            body_list = [proton.char(base64.b64decode(test_value).decode('utf-8'))]
         elif test_value_type == 'double':
             body_list = [struct.unpack('!d', _compat.decode_hex(test_value[2:]))[0]]
         elif test_value_type == 'float':
diff --git a/shims/rhea-js/amqp_types_test/Receiver.js b/shims/rhea-js/amqp_types_test/Receiver.js
index 94f886d..b445f73 100755
--- a/shims/rhea-js/amqp_types_test/Receiver.js
+++ b/shims/rhea-js/amqp_types_test/Receiver.js
@@ -72,9 +72,9 @@ function Receiver(brokerAddr, brokerPort, queueName, amqpType, numTestValues) {
         case "binary": this.receivedValueList.push(this.decodeBinary(msgBody)); break;
         case "string": this.receivedValueList.push(this.decodeString(msgBody)); break;
         case "symbol": this.receivedValueList.push(this.decodeSymbol(msgBody)); break;
-        case "list": this.receivedValueList.push(this.decodeList(msgBody)); break;
-        case "map": this.receivedValueList.push(this.decodeMap(msgBody)); break;
-        case "array": this.receivedValueList.push(this.decodeArray(msgBody)); break;
+        case "list":
+        case "map":
+        case "array": throw "Unsupported complex AMQP type: \"" + this.amqpType + "\"";
         default: throw "Unknown AMQP type: " + this.amqpType;
         }
     };
@@ -136,7 +136,8 @@ function Receiver(brokerAddr, brokerPort, queueName, amqpType, numTestValues) {
     };
 
     this.decodeBinary = function(msgBody) {
-        return msgBody.toString();
+        var buff = new Buffer(msgBody)
+        return buff.toString('base64');
     };
 
     this.decodeString = function(msgBody) {
@@ -147,18 +148,6 @@ function Receiver(brokerAddr, brokerPort, queueName, amqpType, numTestValues) {
         return msgBody;
     };
 
-    this.decodeList = function(msgBody) {
-        return msgBody; // TODO: decode list
-    };
-
-    this.decodeMap = function(msgBody) {
-        return msgBody; // TODO: decode map
-    };
-
-    this.decodeArray = function(msgBody) {
-        return msgBody; // TODO: decode array
-    };
-
     this.buffer2HexString = function(buff, pad) {
         var hexStr = "";
         var first = true;
diff --git a/shims/rhea-js/amqp_types_test/Sender.js b/shims/rhea-js/amqp_types_test/Sender.js
index f663365..2293747 100755
--- a/shims/rhea-js/amqp_types_test/Sender.js
+++ b/shims/rhea-js/amqp_types_test/Sender.js
@@ -98,9 +98,9 @@ function Sender(brokerAddr, brokerPort, queueName, amqpType, testValues) {
         case "binary": return {body: amqp_types.wrap_binary(this.encodeBinary(testValue))};
         case "string": return {body: amqp_types.wrap_string(this.encodeString(testValue))};
         case "symbol": return {body: amqp_types.wrap_symbol(this.encodeSymbol(testValue))};
-        case "list": return {body: amqp_types.wrap_list(this.encodeList(testValue))};
-        case "map": return {body: amqp_types.wrap_map(this.encodeMap(testValue))};
-        case "array": return {body: amqp_types.wrap_array(this.encodeArray(testValue.slice(1), AmqpArrayTypes[testValue[0]]))};
+        case "list":
+        case "map":
+        case "array": throw "Unsupported complex AMQP type: \"" + this.amqpType + "\"";
         default: throw "Unknown AMQP type: \"" + this.amqpType + "\"";
         }
     };
@@ -129,9 +129,9 @@ function Sender(brokerAddr, brokerPort, queueName, amqpType, testValues) {
         case "binary": return this.encodeBinary(testValue);
         case "string": return this.encodeString(testValue);
         case "symbol": return this.encodeSymbol(testValue);
-        case "list": return this.encodeList(testValue);
-        case "map": return this.encodeMap(testValue);
-        case "array": return this.encodeArray(testValue);
+        case "list":
+        case "map":
+        case "array": throw "Unsupported complex AMQP type: \"" + this.amqpType + "\"";
         default: throw "Unknown AMQP type: \"" + this.amqpType + "\"";
         }
     };
@@ -256,7 +256,8 @@ function Sender(brokerAddr, brokerPort, queueName, amqpType, testValues) {
     };
 
     this.encodeBinary = function(testValue) {
-        return testValue;
+        var buff = new Buffer(testValue, 'base64')
+        return buff;
     };
 
     this.encodeString = function(testValue) {
@@ -267,19 +268,6 @@ function Sender(brokerAddr, brokerPort, queueName, amqpType, testValues) {
         return testValue;
     };
 
-    this.encodeList = function(testValue) {
-        return testValue; // TODO: encode list
-    };
-
-    this.encodeMap = function(testValue) {
-        return testValue; // TODO: encode map
-    };
-
-    // testValue format for arrays: ['type', 'val1', 'val2', ... ]
-    this.encodeArray = function(testValue) {
-        return testValue.slice(1); // TODO: encode array
-    };
-
     this.handleEncodeError = function(amqpType, testValue, err) {
         var errStr = "Invalid string value for type " + amqpType + ": \"" + testValue + "\"";
         if (err) {
diff --git a/src/python/qpid_interop_test/amqp_complex_types_test.array.json b/src/python/qpid_interop_test/amqp_complex_types_test.array.json
index d2d5833..3573321 100644
--- a/src/python/qpid_interop_test/amqp_complex_types_test.array.json
+++ b/src/python/qpid_interop_test/amqp_complex_types_test.array.json
@@ -28,7 +28,7 @@
  ["array", [["byte", -128],
             ["byte", -1],
             ["byte", 0],
-            ["byte", 255]]],
+            ["byte", 127]]],
  ["array", [["short", "-0x8000"],
             ["short", -1],
             ["short", 0],
diff --git a/src/python/qpid_interop_test/amqp_complex_types_test.py b/src/python/qpid_interop_test/amqp_complex_types_test.py
index a63e581..e68667a 100755
--- a/src/python/qpid_interop_test/amqp_complex_types_test.py
+++ b/src/python/qpid_interop_test/amqp_complex_types_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 """
 Module to test AMQP complex types across different clients
@@ -33,7 +33,7 @@ import itertools
 import qpid_interop_test.qit_common
 from qpid_interop_test.qit_errors import InteropTestError, InteropTestTimeout
 
-DEFAULT_TEST_TIMEOUT = 10 # seconds
+DEFAULT_TEST_TIMEOUT = 20 # seconds
 
 class AmqpComplexTypes(qpid_interop_test.qit_common.QitTestTypeMap):
     """
@@ -89,6 +89,7 @@ class AmqpComplexTypes(qpid_interop_test.qit_common.QitTestTypeMap):
 
     client_skip = {}
 
+    #pylint: disable=too-many-branches
     def get_types(self, args):
         """Return the list of types"""
         if "include_type" in args and args.include_type is not None:
@@ -139,6 +140,8 @@ class AmqpComplexTypes(qpid_interop_test.qit_common.QitTestTypeMap):
 class AmqpComplexTypeTestCase(qpid_interop_test.qit_common.QitTestCase):
     """Abstract base class for AMQP Complex Type test cases"""
 
+    #pylint: disable=too-many-arguments
+    #pylint: disable=too-many-locals
     def run_test(self, sender_addr, receiver_addr, amqp_type, amqp_subtype, send_shim, receive_shim, timeout):
         """
         Runs this test by invoking the shim send method to send the test values, followed by the shim receive method
@@ -219,8 +222,10 @@ class AmqpComplexTypesTest(qpid_interop_test.qit_common.QitTest):
             if self.args.exclude_type is None or amqp_type not in self.args.exclude_type:
                 for amqp_subtype in self.types.get_subtype_list():
                     if amqp_type != 'array' or amqp_subtype != '*': # array type does not support mixed types (*)
-                        test_case_class = self.create_testcase_class(amqp_type, amqp_subtype,
-                                                                     itertools.product(self.shim_map.values(), repeat=2),
+                        test_case_class = self.create_testcase_class(amqp_type,
+                                                                     amqp_subtype,
+                                                                     itertools.product(self.shim_map.values(),
+                                                                                       repeat=2),
                                                                      int(self.args.timeout))
                         self.test_suite.addTest(unittest.makeSuite(test_case_class))
 
@@ -237,9 +242,9 @@ class AmqpComplexTypesTest(qpid_interop_test.qit_common.QitTest):
             @unittest.skipIf(self.types.skip_test(amqp_subtype, self.broker),
                              self.types.skip_test_message(amqp_subtype, self.broker))
             @unittest.skipIf(self.types.skip_client_test(amqp_subtype, send_shim.NAME),
-                             self.types.skip_client_test_message(amqp_subtype, send_shim.NAME, u'SENDER'))
+                             self.types.skip_client_test_message(amqp_subtype, send_shim.NAME, 'SENDER'))
             @unittest.skipIf(self.types.skip_client_test(amqp_subtype, receive_shim.NAME),
-                             self.types.skip_client_test_message(amqp_subtype, receive_shim.NAME, u'RECEIVER'))
+                             self.types.skip_client_test_message(amqp_subtype, receive_shim.NAME, 'RECEIVER'))
             def inner_test_method(self):
                 self.run_test(self.sender_addr,
                               self.receiver_addr,
diff --git a/src/python/qpid_interop_test/amqp_complex_types_test_generator.py b/src/python/qpid_interop_test/amqp_complex_types_test_generator.py
index 21de6df..4e66e34 100755
--- a/src/python/qpid_interop_test/amqp_complex_types_test_generator.py
+++ b/src/python/qpid_interop_test/amqp_complex_types_test_generator.py
@@ -30,7 +30,7 @@ import sys
 import time
 from abc import abstractmethod
 
-COPYRIGHT_TEXT = u"""Licensed to the Apache Software Foundation (ASF) under one
+COPYRIGHT_TEXT = """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
@@ -48,19 +48,20 @@ specific language governing permissions and limitations
 under the License."""
 
 DEFAULT_PATH = os.path.dirname(os.path.realpath(__file__))
-DEFAULT_JSON_BASE_NAME = u'amqp_complex_types_test'
-GENERATOR_TARGETS = [u'python', u'cpp', u'javascript', u'dotnet', u'ALL']
-AMQP_COMPEX_TYPES = [u'array', u'list', u'map', u'ALL']
+DEFAULT_JSON_BASE_NAME = 'amqp_complex_types_test'
+GENERATOR_TARGETS = ['python', 'cpp', 'javascript', 'dotnet', 'ALL']
+AMQP_COMPEX_TYPES = ['array', 'list', 'map', 'ALL']
 INDENT_LEVEL_SIZE = 4
 
-class JsonReader(object):
+#pylint: disable=too-few-public-methods
+class JsonReader:
     """Class to read the JSON data file"""
     def __init__(self, args):
         self.args = args
 
     def generate(self):
         """Generate the output files based on command-line argument choices"""
-        if self.args.gen == u'ALL':
+        if self.args.gen == 'ALL':
             gen_targets = GENERATOR_TARGETS[:-1]
         else:
             gen_targets = [self.args.gen]
@@ -68,35 +69,35 @@ class JsonReader(object):
         for target in gen_targets:
             target_file_name = None
             if target == GENERATOR_TARGETS[0]: # Python
-                target_file_name = os.path.join(gen_path, u'%s_data.py' % self.args.json_base_name)
+                target_file_name = os.path.join(gen_path, '%s_data.py' % self.args.json_base_name)
                 with PythonGenerator(target_file_name) as generator:
                     self._generate_target(target, generator)
             elif target == GENERATOR_TARGETS[1]: # C++
-                target_file_name = os.path.join(gen_path, u'%s_data.cpp' % self.args.json_base_name)
+                target_file_name = os.path.join(gen_path, '%s_data.cpp' % self.args.json_base_name)
                 with CppGenerator(target_file_name) as generator:
                     self._generate_target(target, generator)
             elif target == GENERATOR_TARGETS[2]: # JavaScript
-                target_file_name = os.path.join(gen_path, u'%s_data.js' % self.args.json_base_name)
+                target_file_name = os.path.join(gen_path, '%s_data.js' % self.args.json_base_name)
                 with JavaScriptGenerator(target_file_name) as generator:
                     self._generate_target(target, generator)
             elif target == GENERATOR_TARGETS[3]: # DotNet
-                target_file_name = os.path.join(gen_path, u'%s_data.cs' % self.args.json_base_name)
+                target_file_name = os.path.join(gen_path, '%s_data.cs' % self.args.json_base_name)
                 with DotNetGenerator(target_file_name) as generator:
                     self._generate_target(target, generator)
             else:
-                raise RuntimeError(u'Unknown target %s' % target)
+                raise RuntimeError('Unknown target %s' % target)
 
     def _generate_target(self, target, generator):
         """Generate the output file for target type"""
-        print(u'amqp_complex_types_test_generator: target=%s generator=%s' % (target, generator.__class__.__name__))
+        print('amqp_complex_types_test_generator: target=%s generator=%s' % (target, generator.__class__.__name__))
         generator.write_prefix()
-        if self.args.type == u'ALL':
+        if self.args.type == 'ALL':
             amqp_test_types = AMQP_COMPEX_TYPES[:-1]
         else:
             amqp_test_types = [self.args.type]
         # First parse
         for amqp_test_type in amqp_test_types:
-            json_file_name = os.path.join(os.path.abspath(self.args.src_dir), u'%s.%s.json' %
+            json_file_name = os.path.join(os.path.abspath(self.args.src_dir), '%s.%s.json' %
                                           (self.args.json_base_name, amqp_test_type))
             generator.write_code(amqp_test_type, JsonReader._read_file(json_file_name))
         generator.write_postfix()
@@ -104,31 +105,30 @@ class JsonReader(object):
     @staticmethod
     def _read_file(json_file_name):
         """Read the file into a Python data structure"""
-        #print(u'reading file %s' % os.path.basename(json_file_name))
         try:
-            json_file = open(json_file_name, u'r')
+            json_file = open(json_file_name, 'r')
             json_file_data = json_file.read()
             json_file.close()
             return json.loads(json_file_data)
         except IOError:
-            print(u'ERROR: Unable to read JSON source file "%s"' % json_file_name)
+            print('ERROR: Unable to read JSON source file "%s"' % json_file_name)
             sys.exit(1)
 
     @staticmethod
     def _target_file_extension(target):
-        file_extension_map = {u'python': u'py',
-                              u'cpp': u'cpp',
-                              u'javascript': u'js',
-                              u'dotnet': u'cs'}
+        file_extension_map = {'python': 'py',
+                              'cpp': 'cpp',
+                              'javascript': 'js',
+                              'dotnet': 'cs'}
         if target in file_extension_map:
             return file_extension_map[target]
-        raise RuntimeError(u'Unknown target: %s' % target)
+        raise RuntimeError('Unknown target: %s' % target)
 
 
-class Generator(object):
+class Generator:
     """Abstract code generator class"""
     def __init__(self, target_file_name):
-        self.target_file = open(target_file_name, u'w')
+        self.target_file = open(target_file_name, 'w')
 
     def __enter__(self):
         return self
@@ -156,211 +156,221 @@ class PythonGenerator(Generator):
 
     def write_prefix(self):
         """Write comments, copyright, etc at top of Python source file"""
-        self.target_file.write(u'#!/usr/bin/env python\n\n')
-        self.target_file.write(u'"""Data used for qpid_interop_test.amqp_complex_types_test"""\n\n')
+        self.target_file.write('#!/usr/bin/env python3\n\n')
+        self.target_file.write('"""Data used for qpid_interop_test.amqp_complex_types_test"""\n\n')
         for line in iter(COPYRIGHT_TEXT.splitlines()):
-            self.target_file.write(u'# %s\n' % line)
-        self.target_file.write(u'\n# *** THIS IS A GENERATED FILE, DO NOT EDIT DIRECTLY ***\n')
-        self.target_file.write(u'# Generated by building qpid_interop_test\n')
-        self.target_file.write(u'# Generated: %s\n\n' % time.strftime(u'%Y-%m-%d %H:%M:%S', time.gmtime()))
-        self.target_file.write(u'import uuid\nimport proton\nimport _compat\n\n')
-        self.target_file.write(u'TEST_DATA = {\n')
+            if line:
+                self.target_file.write('# %s\n' % line)
+            else:
+                self.target_file.write('#')
+        self.target_file.write('\n# *** THIS IS A GENERATED FILE, DO NOT EDIT DIRECTLY ***\n')
+        self.target_file.write('# Generated by building qpid_interop_test\n')
+        self.target_file.write('# Generated: %s\n\n' % time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime()))
+        self.target_file.write('import uuid\nimport proton\nimport _compat\n\n')
+        self.target_file.write('TEST_DATA = {\n')
 
     def write_code(self, amqp_test_type, json_data):
         """Write Python code from json_data"""
-        hdr_line = u'=' * (19 + len(amqp_test_type))
-        self.target_file.write(u'\n    # %s\n' % hdr_line)
-        self.target_file.write(u'    # *** AMQP type: %s ***\n' % amqp_test_type)
-        self.target_file.write(u'    # %s\n\n' % hdr_line)
-        self.target_file.write(u'    \'%s\': [\n' % amqp_test_type)
+        hdr_line = '=' * (19 + len(amqp_test_type))
+        self.target_file.write('\n    # %s\n' % hdr_line)
+        self.target_file.write('    # *** AMQP type: %s ***\n' % amqp_test_type)
+        self.target_file.write('    # %s\n\n' % hdr_line)
+        self.target_file.write('    \'%s\': [\n' % amqp_test_type)
         for data_pair in json_data:
             self._write_data_pair(2, data_pair)
-        self.target_file.write(u'    ], # end: AMQP type %s\n' % amqp_test_type)
+        self.target_file.write('    ], # end: AMQP type %s\n' % amqp_test_type)
 
     #pylint: disable=too-many-branches
     #pylint: disable=too-many-statements
-    def _write_data_pair(self, indent_level, data_pair, separator=u',', eol=True, indent=True):
+    #pylint: disable=too-many-arguments
+    def _write_data_pair(self, indent_level, data_pair, separator=',', eol=True, indent=True):
         """Write a JOSN pair ['amqp_type', value]"""
-        indent_str = u' ' * (indent_level * INDENT_LEVEL_SIZE) if indent else u''
-        post_indent_str = u' ' * (indent_level * INDENT_LEVEL_SIZE)
-        eol_char = u'\n' if eol else u''
+        indent_str = ' ' * (indent_level * INDENT_LEVEL_SIZE) if indent else ''
+        post_indent_str = ' ' * (indent_level * INDENT_LEVEL_SIZE)
+        eol_char = '\n' if eol else ''
         amqp_type, value = data_pair
-        if amqp_type == u'null':
-            self.target_file.write(u'%sNone%s%s' % (indent_str, separator, eol_char))
-        elif amqp_type == u'boolean':
-            self.target_file.write(u'%s%s%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'ubyte':
-            self.target_file.write(u'%sproton.ubyte(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'byte':
-            self.target_file.write(u'%sproton.byte(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'ushort':
-            self.target_file.write(u'%sproton.ushort(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'short':
-            self.target_file.write(u'%sproton.short(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'uint':
-            self.target_file.write(u'%sproton.uint(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'int':
-            self.target_file.write(u'%sproton.int32(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'ulong':
-            self.target_file.write(u'%sproton.ulong(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'long':
+        if amqp_type == 'null':
+            self.target_file.write('%sNone%s%s' % (indent_str, separator, eol_char))
+        elif amqp_type == 'boolean':
+            self.target_file.write('%s%s%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'ubyte':
+            self.target_file.write('%sproton.ubyte(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'byte':
+            self.target_file.write('%sproton.byte(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'ushort':
+            self.target_file.write('%sproton.ushort(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'short':
+            self.target_file.write('%sproton.short(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'uint':
+            self.target_file.write('%sproton.uint(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'int':
+            self.target_file.write('%sproton.int32(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'ulong':
+            self.target_file.write('%sproton.ulong(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'long':
             if isinstance(value, str):
-                if (len(value) > 2 and value[:2] == u'0x') or (len(value) > 3 and value[:3] == u'-0x'):
-                    self.target_file.write(u'%s_compat.str2long(u\'%s\', 16)%s%s' %
+                if (len(value) > 2 and value[:2] == '0x') or (len(value) > 3 and value[:3] == '-0x'):
+                    self.target_file.write('%s_compat.str2long(u\'%s\', 16)%s%s' %
                                            (indent_str, value, separator, eol_char))
                 else:
-                    self.target_file.write(u'%s_compat.str2long(u\'%s\', 10)%s%s' %
+                    self.target_file.write('%s_compat.str2long(u\'%s\', 10)%s%s' %
                                            (indent_str, value, separator, eol_char))
             else:
-                self.target_file.write(u'%s_compat.long(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'float':
-            if isinstance(value, str) and (value[-3:] == u'inf' or value[-3:] == u'NaN'):
-                self.target_file.write(u'%sproton.float32(u\'%s\')%s%s' % (indent_str, value, separator, eol_char))
+                self.target_file.write('%s_compat.long(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'float':
+            if isinstance(value, str) and (value[-3:] == 'inf' or value[-3:] == 'NaN'):
+                self.target_file.write('%sproton.float32(u\'%s\')%s%s' % (indent_str, value, separator, eol_char))
             else:
-                self.target_file.write(u'%sproton.float32(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'double':
-            if isinstance(value, str) and (value[-3:] == u'inf' or value[-3:] == u'NaN'):
-                self.target_file.write(u'%sfloat(u\'%s\')%s%s' % (indent_str, value, separator, eol_char))
+                self.target_file.write('%sproton.float32(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'double':
+            if isinstance(value, str) and (value[-3:] == 'inf' or value[-3:] == 'NaN'):
+                self.target_file.write('%sfloat(u\'%s\')%s%s' % (indent_str, value, separator, eol_char))
             else:
-                self.target_file.write(u'%sfloat(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'decimal32':
-            self.target_file.write(u'%sproton.decimal32(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'decimal64':
-            self.target_file.write(u'%sproton.decimal64(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'decimal128':
+                self.target_file.write('%sfloat(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'decimal32':
+            self.target_file.write('%sproton.decimal32(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'decimal64':
+            self.target_file.write('%sproton.decimal64(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'decimal128':
             byte_itr = iter(value[2:])
-            self.target_file.write(u'%sproton.decimal128(b\'' % indent_str)
+            self.target_file.write('%sproton.decimal128(b\'' % indent_str)
             for char_ in byte_itr:
-                self.target_file.write(u'\\x%c%c' % (char_, next(byte_itr)))
-            self.target_file.write(u'\')%s%s' % (separator, eol_char))
-        elif amqp_type == u'char':
-            self.target_file.write(u'%sproton.char(' % indent_str)
+                self.target_file.write('\\x%c%c' % (char_, next(byte_itr)))
+            self.target_file.write('\')%s%s' % (separator, eol_char))
+        elif amqp_type == 'char':
+            self.target_file.write('%sproton.char(' % indent_str)
             if len(value) == 1: # single char
-                self.target_file.write(u'u\'%s\'' % value)
+                self.target_file.write('u\'%s\'' % value)
             else:
-                self.target_file.write(u'_compat.unichr(int(u\'%s\', 16))' % value)
-            self.target_file.write(u')%s%s' % (separator, eol_char))
-        elif amqp_type == u'timestamp':
-            self.target_file.write(u'%sproton.timestamp(%s)%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'uuid':
-            self.target_file.write(u'%suuid.UUID(' % indent_str)
-            if value[:2] == u'0x':
-                self.target_file.write(u'int=%s' % value)
+                self.target_file.write('_compat.unichr(int(u\'%s\', 16))' % value)
+            self.target_file.write(')%s%s' % (separator, eol_char))
+        elif amqp_type == 'timestamp':
+            self.target_file.write('%sproton.timestamp(%s)%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'uuid':
+            self.target_file.write('%suuid.UUID(' % indent_str)
+            if value[:2] == '0x':
+                self.target_file.write('int=%s' % value)
             else:
-                self.target_file.write(u'u\'{%s}\'' % value)
-            self.target_file.write(u')%s%s' % (separator, eol_char))
-        elif amqp_type == u'binary':
+                self.target_file.write('u\'{%s}\'' % value)
+            self.target_file.write(')%s%s' % (separator, eol_char))
+        elif amqp_type == 'binary':
             if isinstance(value, int):
                 value = hex(value)
             if isinstance(value, str):
-                self.target_file.write(u'%sb\'' % indent_str)
-                if value[:2] == u'0x':
+                self.target_file.write('%sb\'' % indent_str)
+                if value[:2] == '0x':
                     value = value[2:]
                     if len(value) % 2 > 0:
                         value = '0' + value
                     byte_itr = iter(value)
                     for char_ in byte_itr:
-                        self.target_file.write(u'\\x%c%c' % (char_, next(byte_itr)))
+                        self.target_file.write('\\x%c%c' % (char_, next(byte_itr)))
                 else:
                     for char_ in value:
-                        if char_ == u'\'':
-                            self.target_file.write(u'\\')
+                        if char_ == '\'':
+                            self.target_file.write('\\')
                         self.target_file.write(char_)
-                self.target_file.write(u'\'%s%s' % (separator, eol_char))
+                self.target_file.write('\'%s%s' % (separator, eol_char))
             else:
-                self.target_file.write(u'%s%d%s%s' % (indent_str, value, separator, eol_char))
-        elif amqp_type == u'string':
-            self.target_file.write(u'%su\'' % indent_str)
+                self.target_file.write('%s%d%s%s' % (indent_str, value, separator, eol_char))
+        elif amqp_type == 'string':
+            self.target_file.write('%su\'' % indent_str)
             for char_ in value:
-                if char_ == u'\'':
-                    self.target_file.write(u'\\')
+                if char_ == '\'':
+                    self.target_file.write('\\')
                 self.target_file.write(char_)
-            self.target_file.write(u'\'%s%s' % (separator, eol_char))
-        elif amqp_type == u'symbol':
-            self.target_file.write(u'%sproton.symbol(u\'' % indent_str)
+            self.target_file.write('\'%s%s' % (separator, eol_char))
+        elif amqp_type == 'symbol':
+            self.target_file.write('%sproton.symbol(u\'' % indent_str)
             for char_ in value:
-                if char_ == u'\'':
-                    self.target_file.write(u'\\')
+                if char_ == '\'':
+                    self.target_file.write('\\')
                 self.target_file.write(char_)
-            self.target_file.write(u'\')%s%s' % (separator, eol_char))
-        elif amqp_type == u'array':
+            self.target_file.write('\')%s%s' % (separator, eol_char))
+        elif amqp_type == 'array':
             if not isinstance(value, list):
-                raise RuntimeError(u'AMQP array value not a list, found %s' % type(value))
+                raise RuntimeError('AMQP array value not a list, found %s' % type(value))
             amqp_type = None
             if value:
                 amqp_type = value[0][0]
-            self.target_file.write(u'%sproton.Array(proton.UNDESCRIBED, %s, [\n' %
+            self.target_file.write('%sproton.Array(proton.UNDESCRIBED, %s' %
                                    (indent_str, PythonGenerator._proton_type_code(amqp_type)))
+            if amqp_type:
+                self.target_file.write(', \n')
             for value_data_pair in value:
                 if value_data_pair[0] != amqp_type:
-                    raise RuntimeError(u'AMQP array of type %s has element of type %s' %
+                    raise RuntimeError('AMQP array of type %s has element of type %s' %
                                        (amqp_type, value_data_pair[0]))
                 self._write_data_pair(indent_level+1, value_data_pair)
-            self.target_file.write(u'%s]),%s' % (post_indent_str, eol_char))
-        elif amqp_type == u'list':
+            if amqp_type:
+                self.target_file.write('%s),%s' % (post_indent_str, eol_char))
+            else:
+                self.target_file.write('),%s' % eol_char)
+        elif amqp_type == 'list':
             if not isinstance(value, list):
-                raise RuntimeError(u'AMQP list value not a list, found %s' % type(value))
-            self.target_file.write(u'%s[\n' % indent_str)
+                raise RuntimeError('AMQP list value not a list, found %s' % type(value))
+            self.target_file.write('%s[\n' % indent_str)
             for value_data_pair in value:
                 self._write_data_pair(indent_level+1, value_data_pair)
-            self.target_file.write(u'%s],%s' % (post_indent_str, eol_char))
-        elif amqp_type == u'map':
+            self.target_file.write('%s],%s' % (post_indent_str, eol_char))
+        elif amqp_type == 'map':
             if not isinstance(value, list):
-                raise RuntimeError(u'AMQP map value not a list, found %s' % type(value))
+                raise RuntimeError('AMQP map value not a list, found %s' % type(value))
             if len(value) % 2 != 0:
-                raise RuntimeError(u'AMQP map value list not even, contains %d items' % len(value))
-            self.target_file.write(u'%s{\n' % indent_str)
+                raise RuntimeError('AMQP map value list not even, contains %d items' % len(value))
+            self.target_file.write('%s{\n' % indent_str)
             # consume list in pairs (key, value)
             value_iter = iter(value)
             for value_data_pair in value_iter:
-                self._write_data_pair(indent_level+1, value_data_pair, separator=u': ', eol=False)
+                self._write_data_pair(indent_level+1, value_data_pair, separator=': ', eol=False)
                 value_data_pair = next(value_iter)
                 self._write_data_pair(indent_level+1, value_data_pair, indent=False)
-            self.target_file.write(u'%s},%s' % (post_indent_str, eol_char))
+            self.target_file.write('%s},%s' % (post_indent_str, eol_char))
         else:
-            raise RuntimeError(u'Unknown AMQP type \'%s\'' % amqp_type)
+            raise RuntimeError('Unknown AMQP type \'%s\'' % amqp_type)
 
     @staticmethod
     def _proton_type_code(amqp_type):
         amqp_types = {
-            None: None,
-            u'null': u'proton.Data.NULL',
-            u'boolean': u'proton.Data.BOOL',
-            u'byte': u'proton.Data.BYTE',
-            u'ubyte': u'proton.Data.UBYTE',
-            u'short': u'proton.Data.SHORT',
-            u'ushort': u'proton.Data.USHORT',
-            u'int': u'proton.Data.INT',
-            u'uint': u'proton.Data.UINT',
-            u'char': u'proton.Data.CHAR',
-            u'long': u'proton.Data.LONG',
-            u'ulong': u'proton.Data.ULONG',
-            u'timestamp': u'proton.Data.TIMESTAMP',
-            u'float': u'proton.Data.FLOAT',
-            u'double': u'proton.Data.DOUBLE',
-            u'decimal32': u'proton.Data.DECIMAL32',
-            u'decimal64': u'proton.Data.DECIMAL64',
-            u'decimal128': u'proton.Data.DECIMAL128',
-            u'uuid': u'proton.Data.UUID',
-            u'binary': u'proton.Data.BINARY',
-            u'string': u'proton.Data.STRING',
-            u'symbol': u'proton.Data.SYMBOL',
-            u'described': u'proton.Data.DESCRIBED',
-            u'array': u'proton.Data.ARRAY',
-            u'list': u'proton.Data.LIST',
-            u'map': u'proton.Data.MAP'
+            None: 'proton.Data.NULL',
+            'null': 'proton.Data.NULL',
+            'boolean': 'proton.Data.BOOL',
+            'byte': 'proton.Data.BYTE',
+            'ubyte': 'proton.Data.UBYTE',
+            'short': 'proton.Data.SHORT',
+            'ushort': 'proton.Data.USHORT',
+            'int': 'proton.Data.INT',
+            'uint': 'proton.Data.UINT',
+            'char': 'proton.Data.CHAR',
+            'long': 'proton.Data.LONG',
+            'ulong': 'proton.Data.ULONG',
+            'timestamp': 'proton.Data.TIMESTAMP',
+            'float': 'proton.Data.FLOAT',
+            'double': 'proton.Data.DOUBLE',
+            'decimal32': 'proton.Data.DECIMAL32',
+            'decimal64': 'proton.Data.DECIMAL64',
+            'decimal128': 'proton.Data.DECIMAL128',
+            'uuid': 'proton.Data.UUID',
+            'binary': 'proton.Data.BINARY',
+            'string': 'proton.Data.STRING',
+            'symbol': 'proton.Data.SYMBOL',
+            'described': 'proton.Data.DESCRIBED',
+            'array': 'proton.Data.ARRAY',
+            'list': 'proton.Data.LIST',
+            'map': 'proton.Data.MAP'
             }
         return amqp_types[amqp_type]
 
     def write_postfix(self):
         """Write postfix at bottom of Python source file"""
-        self.target_file.write(u'}\n\n# <eof>\n')
+        self.target_file.write('}\n\n# <eof>\n')
 
 
+#pylint: disable=too-many-instance-attributes
 class CppGenerator(Generator):
     """C++ code generator"""
 
-    CODE_SEGMET_A = u'''#include <iostream>
+    CODE_SEGMET_A = '''#include <iostream>
 #include <qpidit/amqp_complex_types_test/Common.hpp>
 
 namespace qpidit {
@@ -371,7 +381,7 @@ namespace qpidit {
                 try {
 '''
 
-    CODE_SEGMENT_B = u'''                } catch (const std::exception& e) {
+    CODE_SEGMENT_B = '''                } catch (const std::exception& e) {
                     std::cerr << e.what() << std::endl;
                 }
             } // if (_dataMap.empty())
@@ -381,8 +391,8 @@ namespace qpidit {
 } // namespace qpidit
 '''
 
-    PROTON_TYPES = [u'decimal32', u'decimal64', u'decimal128', u'timestamp', u'uuid', u'binary', u'symbol']
-    COMPLEX_TYPES = [u'array', u'list', u'map']
+    PROTON_TYPES = ['decimal32', 'decimal64', 'decimal128', 'timestamp', 'uuid', 'binary', 'symbol']
+    COMPLEX_TYPES = ['array', 'list', 'map']
 
     class ComplexInstanceContext:
         """Context used for writing complex type instances"""
@@ -424,37 +434,37 @@ namespace qpidit {
 
     def write_prefix(self):
         """Write comments, copyright, etc. at top of C++ source file"""
-        self.target_file.write(u'/*\n')
+        self.target_file.write('/*\n')
         for line in iter(COPYRIGHT_TEXT.splitlines()):
-            self.target_file.write(u' * %s\n' % line)
-        self.target_file.write(u' */\n\n')
-        self.target_file.write(u'/*\n')
-        self.target_file.write(u' * THIS IS A GENERATED FILE, DO NOT EDIT DIRECTLY\n')
-        self.target_file.write(u' * Generated by building qpid_interop_test\n')
-        self.target_file.write(u' * Generated: %s\n' % time.strftime(u'%Y-%m-%d %H:%M:%S', time.gmtime()))
-        self.target_file.write(u' */\n\n')
-        self.target_file.write(u'/**\n * Data used for qpid_interop_test.amqp_complex_types_test\n */\n\n')
+            self.target_file.write(' * %s\n' % line)
+        self.target_file.write(' */\n\n')
+        self.target_file.write('/*\n')
+        self.target_file.write(' * THIS IS A GENERATED FILE, DO NOT EDIT DIRECTLY\n')
+        self.target_file.write(' * Generated by building qpid_interop_test\n')
+        self.target_file.write(' * Generated: %s\n' % time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime()))
+        self.target_file.write(' */\n\n')
+        self.target_file.write('/**\n * Data used for qpid_interop_test.amqp_complex_types_test\n */\n\n')
         self.target_file.write(CppGenerator.CODE_SEGMET_A)
 
     def write_code(self, amqp_test_type, json_data):
         """Write C++ code from json_data"""
         indent_level = 5
-        indent_str = u' ' * (indent_level * INDENT_LEVEL_SIZE)
-        container_name = u'%s_list' % amqp_test_type
-        container_type = u'std::vector<proton::value>'
-        hdr_line = u'*' * (17 + len(amqp_test_type))
-        self.target_file.write(u'\n%s/*%s\n' % (indent_str, hdr_line))
-        self.target_file.write(u'%s*** AMQP type: %s ***\n' % (indent_str, amqp_test_type))
-        self.target_file.write(u'%s%s*/\n\n' % (indent_str, hdr_line))
-        self.target_file.write(u'%s%s %s;\n\n' % (indent_str, container_type, container_name))
+        indent_str = ' ' * (indent_level * INDENT_LEVEL_SIZE)
+        container_name = '%s_list' % amqp_test_type
+        container_type = 'std::vector<proton::value>'
+        hdr_line = '*' * (17 + len(amqp_test_type))
+        self.target_file.write('\n%s/*%s\n' % (indent_str, hdr_line))
+        self.target_file.write('%s*** AMQP type: %s ***\n' % (indent_str, amqp_test_type))
+        self.target_file.write('%s%s*/\n\n' % (indent_str, hdr_line))
+        self.target_file.write('%s%s %s;\n\n' % (indent_str, container_type, container_name))
         self._pre_write_list(indent_level, container_name, json_data, True)
-        self.target_file.write(u'%s_testDataMap.insert(std::pair<const std::string, %s >("%s", %s));\n\n' %
+        self.target_file.write('%s_testDataMap.insert(std::pair<const std::string, %s >("%s", %s));\n\n' %
                                (indent_str, container_type, amqp_test_type, container_name))
 
     def write_postfix(self):
         """Write postfix at bottom of C++ source file"""
         self.target_file.write(CppGenerator.CODE_SEGMENT_B)
-        self.target_file.write(u'// <eof>\n')
+        self.target_file.write('// <eof>\n')
 
     def _pre_write_list(self, indent_level, container_name, value, push_flag=False):
         """If a value in a list is a complex or proton type, write instances before the list itself is written"""
@@ -471,73 +481,73 @@ namespace qpidit {
         """Generate c++ code for a complex instance"""
         amqp_type, value = data_pair
         if amqp_type not in CppGenerator.COMPLEX_TYPES:
-            raise RuntimeError(u'AMQP type %s is not complex (one of %s)' % (amqp_type, CppGenerator.COMPLEX_TYPES))
+            raise RuntimeError('AMQP type %s is not complex (one of %s)' % (amqp_type, CppGenerator.COMPLEX_TYPES))
         if not isinstance(value, list):
-            raise RuntimeError(u'AMQP %s value not a list, found %s' % (amqp_type, type(value)))
+            raise RuntimeError('AMQP %s value not a list, found %s' % (amqp_type, type(value)))
         CppGenerator.INSTANCE_GENERATE_FN[amqp_type](self, value, context)
 
     def _write_array_instance(self, value, context):
         """Generate c++ code for an array instance"""
-        indent_str = u' ' * (context.indent_level() * INDENT_LEVEL_SIZE)
+        indent_str = ' ' * (context.indent_level() * INDENT_LEVEL_SIZE)
         inner_instance_name_list = self._pre_write_list(context.indent_level(), context.container_name(), value)
         self.arr_count += 1
         array_cpp_type = CppGenerator._array_cpp_type(value)
-        self.target_file.write(u'%s%s array_%d = {' %
-                               (indent_str, CppGenerator._cpp_type(u'array', array_cpp_type), self.arr_count))
-        context.instance_name_list().append(u'pv_array_%d' % self.arr_count)
+        self.target_file.write('%s%s array_%d = {' %
+                               (indent_str, CppGenerator._cpp_type('array', array_cpp_type), self.arr_count))
+        context.instance_name_list().append('pv_array_%d' % self.arr_count)
         for value_data_pair in value:
             self._write_data_pair(value_data_pair, inner_instance_name_list)
         if value and value[0][0] in CppGenerator.COMPLEX_TYPES:
-            self.target_file.write(u'};\n%sproton::value pv_array_%d;\n' % (indent_str, self.arr_count))
-            self.target_file.write(u'%sproton::codec::encoder(pv_array_%d) << '
-                                   u'proton::codec::encoder::array(array_%d, %s);\n' %
+            self.target_file.write('};\n%sproton::value pv_array_%d;\n' % (indent_str, self.arr_count))
+            self.target_file.write('%sproton::codec::encoder(pv_array_%d) << '
+                                   'proton::codec::encoder::array(array_%d, %s);\n' %
                                    (indent_str, self.arr_count, self.arr_count,
                                     CppGenerator._array_proton_type(value)))
         else:
-            self.target_file.write(u'};\n%sproton::value pv_array_%d = array_%d;\n' %
+            self.target_file.write('};\n%sproton::value pv_array_%d = array_%d;\n' %
                                    (indent_str, self.arr_count, self.arr_count))
         if context.push_flag():
-            self.target_file.write(u'%s%s.push_back(pv_array_%d);\n\n' %
+            self.target_file.write('%s%s.push_back(pv_array_%d);\n\n' %
                                    (indent_str, context.container_name(), self.arr_count))
 
     def _write_list_instance(self, value, context):
         """Generate c++ code for a list instance"""
-        indent_str = u' ' * (context.indent_level() * INDENT_LEVEL_SIZE)
+        indent_str = ' ' * (context.indent_level() * INDENT_LEVEL_SIZE)
         inner_instance_name_list = self._pre_write_list(context.indent_level(), context.container_name(), value)
         self.list_count += 1
-        self.target_file.write(u'%sstd::vector<proton::value> list_%d = {' % (indent_str, self.list_count))
-        context.instance_name_list().append(u'pv_list_%d' % self.list_count)
+        self.target_file.write('%sstd::vector<proton::value> list_%d = {' % (indent_str, self.list_count))
+        context.instance_name_list().append('pv_list_%d' % self.list_count)
         for value_data_pair in value:
             self._write_data_pair(value_data_pair, inner_instance_name_list)
-        self.target_file.write(u'};\n%sproton::value pv_list_%d = list_%d;\n' %
+        self.target_file.write('};\n%sproton::value pv_list_%d = list_%d;\n' %
                                (indent_str, self.list_count, self.list_count))
         if context.push_flag():
-            self.target_file.write(u'%s%s.push_back(list_%d);\n\n' %
+            self.target_file.write('%s%s.push_back(list_%d);\n\n' %
                                    (indent_str, context.container_name(), self.list_count))
 
     def _write_map_instance(self, value, context):
         """Generate c++ code for a map instance"""
-        indent_str = u' ' * (context.indent_level() * INDENT_LEVEL_SIZE)
+        indent_str = ' ' * (context.indent_level() * INDENT_LEVEL_SIZE)
         if len(value) % 2 != 0:
-            raise RuntimeError(u'AMQP map value list not even, contains %d items' % len(value))
+            raise RuntimeError('AMQP map value list not even, contains %d items' % len(value))
         inner_instance_name_list = self._pre_write_list(context.indent_level(), context.container_name(), value)
         self.map_count += 1
-        self.target_file.write(u'%sstd::vector<std::pair<proton::value, proton::value> > map_%d = {' %
+        self.target_file.write('%sstd::vector<std::pair<proton::value, proton::value> > map_%d = {' %
                                (indent_str, self.map_count))
-        context.instance_name_list().append(u'pv_map_%d' % self.map_count)
+        context.instance_name_list().append('pv_map_%d' % self.map_count)
         # consume list in pairs (key, value)
         value_iter = iter(value)
         for value_data_pair in value_iter:
-            self.target_file.write(u'std::pair<proton::value, proton::value>(')
+            self.target_file.write('std::pair<proton::value, proton::value>(')
             self._write_data_pair(value_data_pair, inner_instance_name_list)
             value_data_pair = next(value_iter)
             self._write_data_pair(value_data_pair, inner_instance_name_list, False)
-            self.target_file.write(u'), ')
-        self.target_file.write(u'};\n%sproton::value pv_map_%d;\n' % (indent_str, self.map_count))
-        self.target_file.write(u'%sproton::codec::encoder(pv_map_%d) << proton::codec::encoder::map(map_%d);\n' %
+            self.target_file.write('), ')
+        self.target_file.write('};\n%sproton::value pv_map_%d;\n' % (indent_str, self.map_count))
+        self.target_file.write('%sproton::codec::encoder(pv_map_%d) << proton::codec::encoder::map(map_%d);\n' %
                                (indent_str, self.map_count, self.map_count))
         if context.push_flag():
-            self.target_file.write(u'%s%s.push_back(map_%d);\n\n' %
+            self.target_file.write('%s%s.push_back(map_%d);\n\n' %
                                    (indent_str, context.container_name(), self.map_count))
 
     @staticmethod
@@ -545,22 +555,22 @@ namespace qpidit {
         """Return a cpp type string for use in array type encoding"""
         if data_list: # List not empty
             if data_list[0][0] in CppGenerator.COMPLEX_TYPES:
-                return u'proton::value'
+                return 'proton::value'
             # The type of the first element is assumed to be the type of the array
             return CppGenerator._cpp_type(data_list[0][0])
-        return u'std::nullptr_t'
+        return 'std::nullptr_t'
 
     @staticmethod
     def _array_proton_type(data_list):
         """Return a Proton cpp type string used in the proton::codec::encoder::array() function"""
         if data_list:
             data_list_type = data_list[0][0]
-            if data_list_type == u'array':
-                return u'proton::ARRAY'
-            if data_list_type == u'list':
-                return u'proton::LIST'
-            if data_list_type == u'map':
-                return u'proton::MAP'
+            if data_list_type == 'array':
+                return 'proton::ARRAY'
+            if data_list_type == 'list':
+                return 'proton::LIST'
+            if data_list_type == 'map':
+                return 'proton::MAP'
         return None
 
     def _write_proton_instance(self, indent_level, data_pair, instance_name_list):
@@ -568,58 +578,58 @@ namespace qpidit {
         Proton types do not yet support literals. Write proton values as instances, place assigned variable name
         onto instance_name_list so they can be placed into the AMQP complex type container.
         """
-        indent_str = u' ' * (indent_level * INDENT_LEVEL_SIZE)
+        indent_str = ' ' * (indent_level * INDENT_LEVEL_SIZE)
         amqp_type, value = data_pair
         CppGenerator.INSTANCE_GENERATE_FN[amqp_type](self, indent_str, value, instance_name_list)
 
     def _write_decimal32_instance(self, indent_str, value, instance_name_list):
         """Write proton::decimal32 instance"""
         self.d32_count += 1
-        self.target_file.write(u'%sproton::decimal32 d32_%d;\n' % (indent_str, self.d32_count))
-        self.target_file.write(u'%shexStringToBytearray(d32_%d, "%s");\n' %
+        self.target_file.write('%sproton::decimal32 d32_%d;\n' % (indent_str, self.d32_count))
+        self.target_file.write('%shexStringToBytearray(d32_%d, "%s");\n' %
                                (indent_str, self.d32_count, value[2:]))
-        instance_name_list.append(u'd32_%d' % self.d32_count)
+        instance_name_list.append('d32_%d' % self.d32_count)
 
     def _write_decimal64_instance(self, indent_str, value, instance_name_list):
         """Write proton::decimal64 instance"""
         self.d64_count += 1
-        self.target_file.write(u'%sproton::decimal64 d64_%d;\n' % (indent_str, self.d64_count))
-        self.target_file.write(u'%shexStringToBytearray(d64_%d, "%s");\n' %
+        self.target_file.write('%sproton::decimal64 d64_%d;\n' % (indent_str, self.d64_count))
+        self.target_file.write('%shexStringToBytearray(d64_%d, "%s");\n' %
                                (indent_str, self.d64_count, value[2:]))
-        instance_name_list.append(u'd64_%d' % self.d64_count)
+        instance_name_list.append('d64_%d' % self.d64_count)
 
     def _write_decimal128_instance(self, indent_str, value, instance_name_list):
         """Write proton::decimal128 instance"""
         self.d128_count += 1
-        self.target_file.write(u'%sproton::decimal128 d128_%d;\n' % (indent_str, self.d128_count))
-        self.target_file.write(u'%shexStringToBytearray(d128_%d, "%s");\n' %
+        self.target_file.write('%sproton::decimal128 d128_%d;\n' % (indent_str, self.d128_count))
+        self.target_file.write('%shexStringToBytearray(d128_%d, "%s");\n' %
                                (indent_str, self.d128_count, value[2:]))
-        instance_name_list.append(u'd128_%d' % self.d128_count)
+        instance_name_list.append('d128_%d' % self.d128_count)
 
     def _write_timestamp_instance(self, indent_str, value, instance_name_list):
         """Write proton::timestamp instance"""
         self.ts_count += 1
-        radix = 16 if isinstance(value, str) and len(value) > 2 and value[:2] == u'0x' else 10
+        radix = 16 if isinstance(value, str) and len(value) > 2 and value[:2] == '0x' else 10
         if radix == 16: # hex string
-            self.target_file.write(u'%sproton::timestamp ts_%d(std::strtoul(' % (indent_str, self.ts_count) +
-                                   u'std::string("%s").data(), nullptr, 16));\n' % value[2:])
+            self.target_file.write('%sproton::timestamp ts_%d(std::strtoul(' % (indent_str, self.ts_count) +
+                                   'std::string("%s").data(), nullptr, 16));\n' % value[2:])
         else:
-            self.target_file.write(u'%sproton::timestamp ts_%d(%s);\n' % (indent_str, self.ts_count, value))
-        instance_name_list.append(u'ts_%d' % self.ts_count)
+            self.target_file.write('%sproton::timestamp ts_%d(%s);\n' % (indent_str, self.ts_count, value))
+        instance_name_list.append('ts_%d' % self.ts_count)
 
     def _write_uuid_instance(self, indent_str, value, instance_name_list):
         """Write proton::uuid instance"""
         self.uuid_count += 1
-        self.target_file.write(u'%sproton::uuid uuid_%d;\n' % (indent_str, self.uuid_count))
-        if isinstance(value, str) and len(value) > 2 and value[:2] == u'0x': # Hex string "0x..."
+        self.target_file.write('%sproton::uuid uuid_%d;\n' % (indent_str, self.uuid_count))
+        if isinstance(value, str) and len(value) > 2 and value[:2] == '0x': # Hex string "0x..."
             # prefix hex strings < 32 chars (16 bytes) with 0s to make exactly 32 chars long
             fill_size = 32 - len(value[2:])
-            uuid_hex_str = u'%s%s' % (u'0' * fill_size, value[2:])
-            self.target_file.write(u'%shexStringToBytearray(uuid_%d, "%s");\n' %
+            uuid_hex_str = '%s%s' % ('0' * fill_size, value[2:])
+            self.target_file.write('%shexStringToBytearray(uuid_%d, "%s");\n' %
                                    (indent_str, self.uuid_count, uuid_hex_str))
         else: # UUID format "00000000-0000-0000-0000-000000000000"
-            self.target_file.write(u'%ssetUuid(uuid_%d, "%s");\n' % (indent_str, self.uuid_count, value))
-        instance_name_list.append(u'uuid_%d' % self.uuid_count)
+            self.target_file.write('%ssetUuid(uuid_%d, "%s");\n' % (indent_str, self.uuid_count, value))
+        instance_name_list.append('uuid_%d' % self.uuid_count)
 
     @staticmethod
     def _get_delimited_string_length(mixed_string):
@@ -653,27 +663,28 @@ namespace qpidit {
     def _write_binary_instance(self, indent_str, value, instance_name_list):
         """Write proton::binary instance"""
         self.bin_count += 1
-        if isinstance(value, int) or ((isinstance(value, str) and len(value) > 2 and value[:2] == u'0x')): # numeric
-            hex_str = u'{:02x}'.format(value) if isinstance(value, int) else value[2:]
+        if isinstance(value, int) or ((isinstance(value, str) and len(value) > 2 and value[:2] == '0x')): # numeric
+            hex_str = '{:02x}'.format(value) if isinstance(value, int) else value[2:]
             if len(hex_str) % 2 > 0: # make string even no. of hex chars, prefix with '0' if needed
-                hex_str = u'0%s' % hex_str
-            self.target_file.write(u'%sproton::binary bin_%d(std::string("' % (indent_str, self.bin_count))
+                hex_str = '0%s' % hex_str
+            self.target_file.write('%sproton::binary bin_%d(std::string("' % (indent_str, self.bin_count))
+            #pylint: disable=consider-using-enumerate
             for i in range(len(hex_str)):
                 if not i % 2:
-                    self.target_file.write(u'\\x')
+                    self.target_file.write('\\x')
                 self.target_file.write(hex_str[i])
-            self.target_file.write(u'", %d));\n' % (len(hex_str)/2))
+            self.target_file.write('", %d));\n' % (len(hex_str)/2))
         else: # string
-            self.target_file.write(u'%sproton::binary bin_%d(std::string("%s", %d));\n' %
+            self.target_file.write('%sproton::binary bin_%d(std::string("%s", %d));\n' %
                                    (indent_str, self.bin_count, value,
                                     CppGenerator._get_delimited_string_length(value)))
-        instance_name_list.append(u'bin_%d' % self.bin_count)
+        instance_name_list.append('bin_%d' % self.bin_count)
 
     def _write_symbol_instance(self, indent_str, value, instance_name_list):
         """Write proton::symbol instance"""
         self.sym_count += 1
-        self.target_file.write(u'%sproton::symbol sym_%d("%s");\n' % (indent_str, self.sym_count, value))
-        instance_name_list.append(u'sym_%d' % self.sym_count)
+        self.target_file.write('%sproton::symbol sym_%d("%s");\n' % (indent_str, self.sym_count, value))
+        instance_name_list.append('sym_%d' % self.sym_count)
 
     #pylint: disable=too-many-branches
     #pylint: disable=too-many-statements
@@ -682,137 +693,137 @@ namespace qpidit {
         Write a JOSN pair ['amqp_type', value]. If amqp_type is complex or a proton type, pop instance name from
         intance_name_list (which has been previously declared).
         """
-        trailing_comma_string = u', ' if trailing_comma_flag else u''
+        trailing_comma_string = ', ' if trailing_comma_flag else ''
         amqp_type, value = data_pair
-        if amqp_type == u'null':
-            self.target_file.write(u'nullptr%s' % trailing_comma_string)
-        elif amqp_type == u'boolean':
-            self.target_file.write(u'%s%s' % (str(value).lower(), trailing_comma_string))
-        elif amqp_type == u'ubyte':
-            self.target_file.write(u'uint8_t(%s)%s' % (value, trailing_comma_string))
-        elif amqp_type == u'byte':
-            self.target_file.write(u'int8_t(%s)%s' % (value, trailing_comma_string))
-        elif amqp_type == u'ushort':
-            self.target_file.write(u'uint16_t(%s)%s' % (value, trailing_comma_string))
-        elif amqp_type == u'short':
-            self.target_file.write(u'int16_t(%s)%s' % (value, trailing_comma_string))
-        elif amqp_type == u'uint':
-            self.target_file.write(u'uint32_t(%s)%s' % (value, trailing_comma_string))
-        elif amqp_type == u'int':
-            self.target_file.write(u'int32_t(%s)%s' % (value, trailing_comma_string))
-        elif amqp_type == u'ulong':
-            self.target_file.write(u'uint64_t(%s)%s' % (value, trailing_comma_string))
-        elif amqp_type == u'long':
-            self.target_file.write(u'int64_t(%s)%s' % (value, trailing_comma_string))
-        elif amqp_type == u'float':
+        if amqp_type == 'null':
+            self.target_file.write('nullptr%s' % trailing_comma_string)
+        elif amqp_type == 'boolean':
+            self.target_file.write('%s%s' % (str(value).lower(), trailing_comma_string))
+        elif amqp_type == 'ubyte':
+            self.target_file.write('uint8_t(%s)%s' % (value, trailing_comma_string))
+        elif amqp_type == 'byte':
+            self.target_file.write('int8_t(%s)%s' % (value, trailing_comma_string))
+        elif amqp_type == 'ushort':
+            self.target_file.write('uint16_t(%s)%s' % (value, trailing_comma_string))
+        elif amqp_type == 'short':
+            self.target_file.write('int16_t(%s)%s' % (value, trailing_comma_string))
+        elif amqp_type == 'uint':
+            self.target_file.write('uint32_t(%s)%s' % (value, trailing_comma_string))
+        elif amqp_type == 'int':
+            self.target_file.write('int32_t(%s)%s' % (value, trailing_comma_string))
+        elif amqp_type == 'ulong':
+            self.target_file.write('uint64_t(%s)%s' % (value, trailing_comma_string))
+        elif amqp_type == 'long':
+            self.target_file.write('int64_t(%s)%s' % (value, trailing_comma_string))
+        elif amqp_type == 'float':
             if isinstance(value, str):
-                if value == u'inf':
-                    self.target_file.write(u'std::numeric_limits<float>::infinity()%s' % trailing_comma_string)
-                elif value == u'-inf':
-                    self.target_file.write(u'-std::numeric_limits<float>::infinity()%s' % trailing_comma_string)
-                elif value == u'NaN':
-                    self.target_file.write(u'std::numeric_limits<float>::quiet_NaN()%s' % trailing_comma_string)
+                if value == 'inf':
+                    self.target_file.write('std::numeric_limits<float>::infinity()%s' % trailing_comma_string)
+                elif value == '-inf':
+                    self.target_file.write('-std::numeric_limits<float>::infinity()%s' % trailing_comma_string)
+                elif value == 'NaN':
+                    self.target_file.write('std::numeric_limits<float>::quiet_NaN()%s' % trailing_comma_string)
                 else:
-                    self.target_file.write(u'float(%s)%s' % (value, trailing_comma_string))
+                    self.target_file.write('float(%s)%s' % (value, trailing_comma_string))
             else:
-                self.target_file.write(u'float(%s)%s' % (str(value), trailing_comma_string))
-        elif amqp_type == u'double':
+                self.target_file.write('float(%s)%s' % (str(value), trailing_comma_string))
+        elif amqp_type == 'double':
             if isinstance(value, str):
-                if value == u'inf':
-                    self.target_file.write(u'std::numeric_limits<double>::infinity()%s' % trailing_comma_string)
-                elif value == u'-inf':
-                    self.target_file.write(u'-std::numeric_limits<double>::infinity()%s' % trailing_comma_string)
-                elif value == u'NaN':
-                    self.target_file.write(u'std::numeric_limits<double>::quiet_NaN()%s' % trailing_comma_string)
+                if value == 'inf':
+                    self.target_file.write('std::numeric_limits<double>::infinity()%s' % trailing_comma_string)
+                elif value == '-inf':
+                    self.target_file.write('-std::numeric_limits<double>::infinity()%s' % trailing_comma_string)
+                elif value == 'NaN':
+                    self.target_file.write('std::numeric_limits<double>::quiet_NaN()%s' % trailing_comma_string)
                 else:
-                    self.target_file.write(u'double(%s)%s' % (value, trailing_comma_string))
+                    self.target_file.write('double(%s)%s' % (value, trailing_comma_string))
             else:
-                self.target_file.write(u'double(%s)%s' % (str(value), trailing_comma_string))
-        elif amqp_type == u'decimal32':
+                self.target_file.write('double(%s)%s' % (str(value), trailing_comma_string))
+        elif amqp_type == 'decimal32':
             if instance_name_list is not None:
-                self.target_file.write(u'%s%s' % (instance_name_list.pop(0), trailing_comma_string))
-        elif amqp_type == u'decimal64':
+                self.target_file.write('%s%s' % (instance_name_list.pop(0), trailing_comma_string))
+        elif amqp_type == 'decimal64':
             if instance_name_list is not None:
-                self.target_file.write(u'%s%s' % (instance_name_list.pop(0), trailing_comma_string))
-        elif amqp_type == u'decimal128':
+                self.target_file.write('%s%s' % (instance_name_list.pop(0), trailing_comma_string))
+        elif amqp_type == 'decimal128':
             if instance_name_list is not None:
-                self.target_file.write(u'%s%s' % (instance_name_list.pop(0), trailing_comma_string))
-        elif amqp_type == u'char':
+                self.target_file.write('%s%s' % (instance_name_list.pop(0), trailing_comma_string))
+        elif amqp_type == 'char':
             if len(value) == 1: # single char
-                self.target_file.write(u'wchar_t(\'%s\')%s' % (value, trailing_comma_string))
+                self.target_file.write('wchar_t(\'%s\')%s' % (value, trailing_comma_string))
             else:
-                self.target_file.write(u'wchar_t(%s)%s' % (value, trailing_comma_string))
-        elif amqp_type == u'timestamp':
+                self.target_file.write('wchar_t(%s)%s' % (value, trailing_comma_string))
+        elif amqp_type == 'timestamp':
             if instance_name_list is not None:
-                self.target_file.write(u'%s%s' % (instance_name_list.pop(0), trailing_comma_string))
-        elif amqp_type == u'uuid':
+                self.target_file.write('%s%s' % (instance_name_list.pop(0), trailing_comma_string))
+        elif amqp_type == 'uuid':
             if instance_name_list is not None:
-                self.target_file.write(u'%s%s' % (instance_name_list.pop(0), trailing_comma_string))
-        elif amqp_type == u'binary':
+                self.target_file.write('%s%s' % (instance_name_list.pop(0), trailing_comma_string))
+        elif amqp_type == 'binary':
             if instance_name_list is not None:
-                self.target_file.write(u'%s%s' % (instance_name_list.pop(0), trailing_comma_string))
-        elif amqp_type == u'string':
-            self.target_file.write(u'std::string("')
+                self.target_file.write('%s%s' % (instance_name_list.pop(0), trailing_comma_string))
+        elif amqp_type == 'string':
+            self.target_file.write('std::string("')
             for char_ in value:
-                if char_ == u'\'' or char_ == u'"':
-                    self.target_file.write(u'\\')
+                if char_ in ('\'', '"'):
+                    self.target_file.write('\\')
                 self.target_file.write(char_)
-            self.target_file.write(u'")%s' % trailing_comma_string)
-        elif amqp_type == u'symbol':
+            self.target_file.write('")%s' % trailing_comma_string)
+        elif amqp_type == 'symbol':
             if instance_name_list is not None:
-                self.target_file.write(u'%s%s' % (instance_name_list.pop(0), trailing_comma_string))
-        elif amqp_type == u'array':
+                self.target_file.write('%s%s' % (instance_name_list.pop(0), trailing_comma_string))
+        elif amqp_type == 'array':
             if instance_name_list is not None and instance_name_list:
-                self.target_file.write(u'%s%s' % (instance_name_list.pop(0), trailing_comma_string))
-        elif amqp_type == u'list':
+                self.target_file.write('%s%s' % (instance_name_list.pop(0), trailing_comma_string))
+        elif amqp_type == 'list':
             if instance_name_list is not None and instance_name_list:
-                self.target_file.write(u'%s%s' % (instance_name_list.pop(0), trailing_comma_string))
-        elif amqp_type == u'map':
+                self.target_file.write('%s%s' % (instance_name_list.pop(0), trailing_comma_string))
+        elif amqp_type == 'map':
             if instance_name_list is not None and instance_name_list:
-                self.target_file.write(u'%s%s' % (instance_name_list.pop(0), trailing_comma_string))
+                self.target_file.write('%s%s' % (instance_name_list.pop(0), trailing_comma_string))
 
     @staticmethod
     def _cpp_type(amqp_type, amqp_sub_type=None):
         cpp_types = {
-            None: u'NULL',
-            u'null': u'std::nullptr_t',
-            u'boolean': u'bool',
-            u'byte': u'int8_t',
-            u'ubyte': u'uint8_t',
-            u'short': u'int16_t',
-            u'ushort': u'uint16_t',
-            u'int': u'int32_t',
-            u'uint': u'uint32_t',
-            u'char': u'wchar_t',
-            u'long': u'int64_t',
-            u'ulong': u'uint64_t',
-            u'timestamp': u'proton::timestamp',
-            u'float': u'float',
-            u'double': u'double',
-            u'decimal32': u'proton::decimal32',
-            u'decimal64': u'proton::decimal64',
-            u'decimal128': u'proton::decimal128',
-            u'uuid': u'proton::uuid',
-            u'binary': u'proton::binary',
-            u'string': u'std::string',
-            u'symbol': u'proton::symbol',
-            u'described': u'proton::described',
-            u'array': u'std::vector<%s> ' % amqp_sub_type,
-            u'list': u'std::vector<proton::value> ',
-            u'map': u'std::map<proton::value, proton::value> '
+            None: 'NULL',
+            'null': 'std::nullptr_t',
+            'boolean': 'bool',
+            'byte': 'int8_t',
+            'ubyte': 'uint8_t',
+            'short': 'int16_t',
+            'ushort': 'uint16_t',
+            'int': 'int32_t',
+            'uint': 'uint32_t',
+            'char': 'wchar_t',
+            'long': 'int64_t',
+            'ulong': 'uint64_t',
+            'timestamp': 'proton::timestamp',
+            'float': 'float',
+            'double': 'double',
+            'decimal32': 'proton::decimal32',
+            'decimal64': 'proton::decimal64',
+            'decimal128': 'proton::decimal128',
+            'uuid': 'proton::uuid',
+            'binary': 'proton::binary',
+            'string': 'std::string',
+            'symbol': 'proton::symbol',
+            'described': 'proton::described',
+            'array': 'std::vector<%s> ' % amqp_sub_type,
+            'list': 'std::vector<proton::value> ',
+            'map': 'std::map<proton::value, proton::value> '
             }
         return cpp_types[amqp_type]
 
-    INSTANCE_GENERATE_FN = {u'decimal32': _write_decimal32_instance,
-                            u'decimal64': _write_decimal64_instance,
-                            u'decimal128': _write_decimal128_instance,
-                            u'timestamp': _write_timestamp_instance,
-                            u'uuid': _write_uuid_instance,
-                            u'binary': _write_binary_instance,
-                            u'symbol': _write_symbol_instance,
-                            u'array': _write_array_instance,
-                            u'list': _write_list_instance,
-                            u'map': _write_map_instance,
+    INSTANCE_GENERATE_FN = {'decimal32': _write_decimal32_instance,
+                            'decimal64': _write_decimal64_instance,
+                            'decimal128': _write_decimal128_instance,
+                            'timestamp': _write_timestamp_instance,
+                            'uuid': _write_uuid_instance,
+                            'binary': _write_binary_instance,
+                            'symbol': _write_symbol_instance,
+                            'array': _write_array_instance,
+                            'list': _write_list_instance,
+                            'map': _write_map_instance,
                            }
 
 
@@ -821,25 +832,24 @@ class JavaScriptGenerator(Generator):
 
     def write_prefix(self):
         """Write comments, copyright, etc at top of JavaScript source file"""
-        self.target_file.write(u'#!/usr/bin/env node\n\n')
-        self.target_file.write(u'/*\n * Data used for qpid_interop_test.amqp_complex_types_test\n */\n\n')
-        self.target_file.write(u'/*\n')
+        self.target_file.write('#!/usr/bin/env node\n\n')
+        self.target_file.write('/*\n * Data used for qpid_interop_test.amqp_complex_types_test\n */\n\n')
+        self.target_file.write('/*\n')
         for line in iter(COPYRIGHT_TEXT.splitlines()):
-            self.target_file.write(u' * %s\n' % line)
-        self.target_file.write(u' */\n\n')
-        self.target_file.write(u'/*\n')
-        self.target_file.write(u' * THIS IS A GENERATED FILE, DO NOT EDIT DIRECTLY\n')
-        self.target_file.write(u' * Generated by building qpid_interop_test\n')
-        self.target_file.write(u' * Generated: %s\n'% time.strftime(u'%Y-%m-%d %H:%M:%S', time.gmtime()))
-        self.target_file.write(u' */\n\n')
+            self.target_file.write(' * %s\n' % line)
+        self.target_file.write(' */\n\n')
+        self.target_file.write('/*\n')
+        self.target_file.write(' * THIS IS A GENERATED FILE, DO NOT EDIT DIRECTLY\n')
+        self.target_file.write(' * Generated by building qpid_interop_test\n')
+        self.target_file.write(' * Generated: %s\n'% time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime()))
+        self.target_file.write(' */\n\n')
 
     def write_code(self, amqp_test_type, json_data):
         """Write JavaScript code from json_data"""
-        pass
 
     def write_postfix(self):
         """Write postfix at bottom of JavaScript source file"""
-        self.target_file.write(u'// <eof>\n')
+        self.target_file.write('// <eof>\n')
 
 
 class DotNetGenerator(Generator):
@@ -847,41 +857,40 @@ class DotNetGenerator(Generator):
 
     def write_prefix(self):
         """Write comments, copyright, etc at top of DotNet source file"""
-        self.target_file.write(u'/*\n * Data used for qpid_interop_test.amqp_complex_types_test\n */\n\n')
-        self.target_file.write(u'/*\n')
+        self.target_file.write('/*\n * Data used for qpid_interop_test.amqp_complex_types_test\n */\n\n')
+        self.target_file.write('/*\n')
         for line in iter(COPYRIGHT_TEXT.splitlines()):
-            self.target_file.write(u' * %s\n' % line)
-        self.target_file.write(u' */\n\n')
-        self.target_file.write(u'/*\n')
-        self.target_file.write(u' * THIS IS A GENERATED FILE, DO NOT EDIT DIRECTLY\n')
-        self.target_file.write(u' * Generated by building qpid_interop_test\n')
-        self.target_file.write(u' * Generated: %s\n'% time.strftime(u'%Y-%m-%d %H:%M:%S', time.gmtime()))
-        self.target_file.write(u' */\n\n')
+            self.target_file.write(' * %s\n' % line)
+        self.target_file.write(' */\n\n')
+        self.target_file.write('/*\n')
+        self.target_file.write(' * THIS IS A GENERATED FILE, DO NOT EDIT DIRECTLY\n')
+        self.target_file.write(' * Generated by building qpid_interop_test\n')
+        self.target_file.write(' * Generated: %s\n'% time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime()))
+        self.target_file.write(' */\n\n')
 
     def write_code(self, amqp_test_type, json_data):
         """Write DotNet code from json_data"""
-        pass
 
     def write_postfix(self):
         """Write postfix at bottom of DotNet source file"""
-        self.target_file.write(u'// <eof>\n')
+        self.target_file.write('// <eof>\n')
 
 
-class GeneratorOptions(object):
+class GeneratorOptions:
     """Class to handle generator options"""
     def __init__(self):
-        self._parser = argparse.ArgumentParser(description=u'AMQP Complex Types Test: test data generator')
-        self._parser.add_argument(u'--type', choices=AMQP_COMPEX_TYPES, default=u'ALL', metavar=u'TYPE',
-                                  help=u'AMQP complex type to test %s' % AMQP_COMPEX_TYPES)
-        self._parser.add_argument(u'--json-base-name', action=u'store', default=DEFAULT_JSON_BASE_NAME,
-                                  metavar=u'BASENAME',
-                                  help=u'JSON data file base name [%s]' % DEFAULT_JSON_BASE_NAME)
-        self._parser.add_argument(u'--gen', choices=GENERATOR_TARGETS, default=u'ALL', metavar=u'TARGET',
-                                  help=u'Generate for target %s' % GENERATOR_TARGETS)
-        self._parser.add_argument(u'--gen-dir', action=u'store', default=u'.', metavar=u'DIR',
-                                  help=u'Directory in which to generate source files [.]')
-        self._parser.add_argument(u'--src-dir', action=u'store', default=u'.', metavar=u'DIR',
-                                  help=u'Directory containing JSON data files [.]')
+        self._parser = argparse.ArgumentParser(description='AMQP Complex Types Test: test data generator')
+        self._parser.add_argument('--type', choices=AMQP_COMPEX_TYPES, default='ALL', metavar='TYPE',
+                                  help='AMQP complex type to test %s' % AMQP_COMPEX_TYPES)
+        self._parser.add_argument('--json-base-name', action='store', default=DEFAULT_JSON_BASE_NAME,
+                                  metavar='BASENAME',
+                                  help='JSON data file base name [%s]' % DEFAULT_JSON_BASE_NAME)
+        self._parser.add_argument('--gen', choices=GENERATOR_TARGETS, default='ALL', metavar='TARGET',
+                                  help='Generate for target %s' % GENERATOR_TARGETS)
+        self._parser.add_argument('--gen-dir', action='store', default='.', metavar='DIR',
+                                  help='Directory in which to generate source files [.]')
+        self._parser.add_argument('--src-dir', action='store', default='.', metavar='DIR',
+                                  help='Directory containing JSON data files [.]')
 
     def args(self):
         """Return the parsed args"""
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 cb55e6a..e9a9eda 100755
--- a/src/python/qpid_interop_test/amqp_large_content_test.py
+++ b/src/python/qpid_interop_test/amqp_large_content_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 """
 Module to test AMQP messages with large content (bodies and headers/properties) across different clients
@@ -33,7 +33,7 @@ from json import dumps
 import qpid_interop_test.qit_common
 from qpid_interop_test.qit_errors import InteropTestError, InteropTestTimeout
 
-DEFAULT_TEST_TIMEOUT = 180 # seconds
+DEFAULT_TEST_TIMEOUT = 300 # seconds
 
 
 class AmqpVariableSizeTypes(qpid_interop_test.qit_common.QitTestTypeMap):
@@ -74,6 +74,7 @@ class AmqpVariableSizeTypes(qpid_interop_test.qit_common.QitTestTypeMap):
 class AmqpLargeContentTestCase(qpid_interop_test.qit_common.QitTestCase):
     """Abstract base class for AMQP large content tests"""
 
+    #pylint: disable=too-many-arguments
     def run_test(self, sender_addr, receiver_addr, amqp_type, test_value_list, send_shim, receive_shim, timeout):
         """
         Run this test by invoking the shim send method to send the test values, followed by the shim receive method
@@ -124,9 +125,9 @@ class AmqpLargeContentTestCase(qpid_interop_test.qit_common.QitTestCase):
     @staticmethod
     def get_num_messages(amqp_type, test_value_list):
         """Find the total number of messages to be sent for this test"""
-        if amqp_type == 'binary' or amqp_type == 'string' or amqp_type == 'symbol':
+        if amqp_type in ('binary', 'string', 'symbol'):
             return len(test_value_list)
-        if amqp_type == 'list' or amqp_type == 'map':
+        if amqp_type in ('list', 'map'):
             tot_len = 0
             for test_item in test_value_list:
                 tot_len += len(test_item[1])
diff --git a/src/python/qpid_interop_test/amqp_types_test.py b/src/python/qpid_interop_test/amqp_types_test.py
index 2404757..b0e316f 100755
--- a/src/python/qpid_interop_test/amqp_types_test.py
+++ b/src/python/qpid_interop_test/amqp_types_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 """
 Module to test AMQP primitive types across different clients
@@ -27,6 +27,7 @@ import signal
 import sys
 import unittest
 
+from base64 import b64encode
 from itertools import product
 from json import dumps
 from time import mktime, time
@@ -35,7 +36,7 @@ from uuid import UUID, uuid4
 import qpid_interop_test.qit_common
 from qpid_interop_test.qit_errors import InteropTestError, InteropTestTimeout
 
-DEFAULT_TEST_TIMEOUT = 10 # seconds
+DEFAULT_TEST_TIMEOUT = 20 # seconds
 
 class AmqpPrimitiveTypes(qpid_interop_test.qit_common.QitTestTypeMap):
     """
@@ -137,21 +138,21 @@ class AmqpPrimitiveTypes(qpid_interop_test.qit_common.QitTestTypeMap):
                       '0xffefffffffffffff'],
         'decimal128': ['0x00000000000000000000000000000000',
                        '0xff0102030405060708090a0b0c0d0e0f'],
-        'char': [u' ', # single ASCII chars
-                 u'A',
-                 u'z',
-                 u'0',
-                 u'9',
-                 u'}',
-                 u'0x0', # Hex representation
-                 u'0x1',
-                 u'0x7f',
-                 u'0x80',
-                 u'0xff',
-                 u'0x16b5', # Rune 'G'
-                 u'0x10203',
-                 u'0x10ffff',
-                 #u'0x12345678' # 32-bit number, not real char # Disabled until Python can handle it
+        'char': [' ', # single ASCII chars
+                 'A',
+                 'z',
+                 '0',
+                 '9',
+                 '}',
+                 '0x0', # Hex representation
+                 '0x1',
+                 '0x7f',
+                 '0x80',
+                 '0xff',
+                 '0x16b5', # Rune 'G'
+                 '0x10203',
+                 '0x10ffff',
+                 #'0x12345678' # 32-bit number, not real char # Disabled until Python can handle it
                 ],
         # timestamp: Must be in milliseconds since the Unix epoch
         'timestamp': ['0x0',
@@ -162,96 +163,23 @@ class AmqpPrimitiveTypes(qpid_interop_test.qit_common.QitTestTypeMap):
                  str(UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')),
                  str(uuid4())],
         'binary': [bytes(),
-                   bytes(12345),
+                   bytes([1, 2, 3, 4, 5]),
                    b'Hello, world',
-                   b'\\x01\\x02\\x03\\x04\\x05abcde\\x80\\x81\\xfe\\xff',
-                   b'The quick brown fox jumped over the lazy dog 0123456789.' * 100
+                   b'\x01\x02\x03\x04\x05abcde\x80\x81\xfe\xff',
+                   b'The quick brown fox jumped over the lazy dog 0123456789.' * 10#0
                   ],
-        # strings must be unicode to comply with AMQP spec
-        'string': [u'',
-                   u'Hello, world',
-                   u'"Hello, world"',
-                   u"Charlie's peach",
-                   u'The quick brown fox jumped over the lazy dog 0123456789.' * 100
+        'string': ['',
+                   '12345'
+                   'Hello, world',
+                   '"Hello, world"', # Embedded quotes
+                   "Charlie's peach", # Embedded apostrophe
+                   'The quick brown fox jumped over the lazy dog 0123456789.' * 100
                   ],
         'symbol': ['',
+                   '12345'
                    'myDomain.123',
                    'domain.0123456789.' * 100,
                   ],
-        'list': [[],
-                 ['ubyte:0x1', 'int:-0x2', 'float:0x40490fdb'],
-                 ['string:a', 'string:hello', 'string:world!', 'binary:\x01\x02\x03\x04\x05abcde'],
-                 ['long:0x102030405',
-                  'timestamp:0x%x' % int(time()*1000),
-                  'short:-0x8000',
-                  'uuid:%s' % str(uuid4()),
-                  'symbol:a.b.c',
-                  'null:None',
-                  'ulong:0x400921fb54442eea',
-                  #'decimal64:0x400921fb54442eea' # Decimal byte reversal issue: PROTON-1160
-                 ],
-                 [[],
-                  'null:None',
-                  ['ubyte:0x1', 'ubyte:0x2', 'ubyte:0x3'],
-                  'boolean:True',
-                  'boolean:False',
-                  {},
-                  {'string:hello': 'long:-0x1234', 'string:goodbye': 'boolean:True'}
-                 ],
-                 [[], [[], [[], [], []], []], []],
-                 ['short:0x0',
-                  'short:0x1',
-                  'short:0x2',
-                  'short:0x3',
-                  'short:0x4',
-                  'short:0x5',
-                  'short:0x6',
-                  'short:0x7',
-                  'short:0x8',
-                  'short:0x9'] * 10
-                ],
-        'map': [{}, # Enpty map
-                # Map with string keys
-                {'string:one': 'ubyte:0x1',
-                 'string:two': 'ushort:0x2'},
-                # Map with other AMQP simple types as keys
-                {'null:None': 'string:None',
-                 'string:None': 'null:None',
-                 'string:One': 'long:-0x102030405',
-                 'short:0x2': 'int:0x2',
-                 'boolean:True': 'string:True',
-                 'string:False': 'boolean:False',
-                 #['string:AAA', 'ushort:0x5951']: 'string:list value',
-                 #{'byte:-55': 'ubyte:200',
-                 # 'boolean:True': 'string:Hello, world'}: 'symbol:map.value',
-                 'string:list': ['byte:0x12', 'ushort:0x234', 'uuid:%s' % str(uuid4()), ],
-                 'string:map': {'char:A': 'int:0x1',
-                                'char:B': 'int:0x2'}
-                },
-               ],
-        # array: Each array is constructed from the test values in this map. This list contains
-        # the keys to the array value types to be included in the test. See function create_test_arrays()
-        # for the top-level function that performs the array creation.
-        #'array': ['boolean',
-        #          'ubyte',
-        #          'ushort',
-        #          'uint',
-        #          'ulong',
-        #          'byte',
-        #          'short',
-        #          'int',
-        #          'long',
-        #          'float',
-        #          'double',
-        #          'decimal32',
-        #          'decimal64',
-        #          'decimal128',
-        #          'char',
-        #          'uuid',
-        #          'binary',
-        #          'string',
-        #          'symbol',
-        #         ],
         }
 
     # This section contains tests that should be skipped because of known issues that would cause the test to fail.
@@ -296,27 +224,26 @@ class AmqpPrimitiveTypes(qpid_interop_test.qit_common.QitTestTypeMap):
                 test_array.append(val)
         return test_array
 
-    def create_test_arrays(self):
-        """ Method to synthesize the test arrays from the values used in the previous type tests """
-        test_arrays = []
-        for array_amqp_type in self.type_map['array']:
-            test_arrays.append(self.create_array(array_amqp_type, 1))
-        print(test_arrays)
-        return test_arrays
-
     def get_test_values(self, test_type):
         """
-        Overload the parent method so that arrays can be synthesized rather than read directly.
+        Overload the parent method so that binary types can be base64 encoded for use in json.
         The test_type parameter is the AMQP type in this case
         """
-        if test_type == 'array':
-            return self.create_test_arrays()
+        if test_type == 'binary':
+            # Convert all binary to base64 strings, as bytes are not JSON serializable
+            test_values = []
+            bytes_test_values = super(AmqpPrimitiveTypes, self).get_test_values(test_type)
+            for bytes_test_value in bytes_test_values:
+                test_values.append(b64encode(bytes_test_value).decode('ascii'))
+            return test_values
         return super(AmqpPrimitiveTypes, self).get_test_values(test_type)
 
 
 class AmqpTypeTestCase(qpid_interop_test.qit_common.QitTestCase):
     """Abstract base class for AMQP Type test cases"""
 
+    #pylint: disable=too-many-arguments
+    #pylint: disable=too-many-locals
     def run_test(self, sender_addr, receiver_addr, amqp_type, test_value_list, send_shim, receive_shim, timeout):
         """
         Run this test by invoking the shim send method to send the test values, followed by the shim receive method
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 ae13d5f..f9a8872 100755
--- a/src/python/qpid_interop_test/jms_hdrs_props_test.py
+++ b/src/python/qpid_interop_test/jms_hdrs_props_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 """
 Module to test JMS headers and properties on messages accross different clients
@@ -27,13 +27,15 @@ import signal
 import sys
 import unittest
 
+from base64 import b64encode
 from itertools import combinations, product
 from json import dumps
 
 import qpid_interop_test.qit_common
 from qpid_interop_test.qit_errors import InteropTestError, InteropTestTimeout
+from encodings.base64_codec import base64_encode
 
-DEFAULT_TEST_TIMEOUT = 10 # seconds
+DEFAULT_TEST_TIMEOUT = 20 # seconds
 
 
 class JmsHdrPropTypes(qpid_interop_test.qit_common.QitTestTypeMap):
@@ -176,8 +178,8 @@ class JmsHdrPropTypes(qpid_interop_test.qit_common.QitTestTypeMap):
         #    'java.lang.Byte': ['-128',
         #                       '0',
         #                       '127'],
-        #    'java.lang.Character': [u'a',
-        #                            u'Z'],
+        #    'java.lang.Character': ['a',
+        #                            'Z'],
         #    'java.lang.Double': ['0.0',
         #                         '3.141592654',
         #                         '-2.71828182846'],
@@ -208,11 +210,11 @@ class JmsHdrPropTypes(qpid_interop_test.qit_common.QitTestTypeMap):
         #                        '127',
         #                        '128',
         #                        '32767'],
-        #    'java.lang.String': [u'',
-        #                         u'Hello, world',
-        #                         u'"Hello, world"',
-        #                         u"Charlie's \"peach\"",
-        #                         u'Charlie\'s "peach"']
+        #    'java.lang.String': ['',
+        #                         'Hello, world',
+        #                         '"Hello, world"',
+        #                         "Charlie's \"peach\"",
+        #                         'Charlie\'s "peach"']
         #    },
         }
 
@@ -222,6 +224,7 @@ class JmsHdrPropTypes(qpid_interop_test.qit_common.QitTestTypeMap):
 
     client_skip = {}
 
+    #pylint: disable=too-many-branches
     def get_types(self, args):
         if 'include_hdr' in args and args.include_hdr is not None:
             new_hdrs_map = {}
@@ -267,10 +270,12 @@ class JmsHdrPropTypes(qpid_interop_test.qit_common.QitTestTypeMap):
 
         return self
 
-
 class JmsMessageHdrsPropsTestCase(qpid_interop_test.qit_common.QitTestCase):
     """Abstract base class for JMS message headers and properties tests"""
 
+    #pylint: disable=too-many-arguments
+    #pylint: disable=too-many-locals
+    #pylint: disable=too-many-branches
     def run_test(self, sender_addr, receiver_addr, queue_name_fragment, jms_message_type, test_values, msg_hdrs,
                  msg_props, send_shim, receive_shim, timeout):
         """
@@ -401,6 +406,7 @@ class JmsHdrsPropsTest(qpid_interop_test.qit_common.QitJmsTest):
         test_case_class_d = self._generate_part_d(timeout)
         self.test_suite.addTest(unittest.makeSuite(test_case_class_d))
 
+    #pylint: disable=too-many-locals
     def _generate_part_a(self, timeout):
         """
         Class factory function which creates new subclasses to JmsMessageTypeTestCase. Creates a test case class for
@@ -411,6 +417,7 @@ class JmsHdrsPropsTest(qpid_interop_test.qit_common.QitJmsTest):
             """Print the class name"""
             return self.__class__.__name__
 
+        #pylint: disable=too-many-arguments
         def add_test_method(cls, queue_name_fragment, hdrs, props, send_shim, receive_shim, timeout):
             """Function which creates a new test method in class cls"""
 
@@ -443,11 +450,13 @@ class JmsHdrsPropsTest(qpid_interop_test.qit_common.QitJmsTest):
         new_class = type(class_name, (JmsMessageHdrsPropsTestCase,), class_dict)
 
         for send_shim, receive_shim in product(self.shim_map.values(), repeat=2):
-            for msg_header in self.types.headers_map.iterkeys():
-                for header_type, header_val_list in self.types.headers_map[msg_header].iteritems():
+            for msg_header in self.types.headers_map.keys():
+                for header_type, header_val_list in iter(self.types.headers_map[msg_header].items()):
                     header_val_cnt = 0
                     for header_val in header_val_list:
                         header_val_cnt += 1
+                        if header_type == 'bytes':
+                            header_val = b64encode(header_val).decode('utf-8')
                         method_subname = '%s.%s-%02d' % (msg_header, header_type, header_val_cnt)
                         add_test_method(new_class,
                                         method_subname,
@@ -469,6 +478,7 @@ class JmsHdrsPropsTest(qpid_interop_test.qit_common.QitJmsTest):
             """Print the class name"""
             return self.__class__.__name__
 
+        #pylint: disable=too-many-arguments
         def add_test_method(cls, queue_name_fragment, hdrs, props, send_shim, receive_shim, timeout):
             """Function which creates a new test method in class cls"""
 
@@ -500,9 +510,10 @@ class JmsHdrsPropsTest(qpid_interop_test.qit_common.QitJmsTest):
                       'test_values': self.types.get_test_values(jms_message_type)}
         new_class = type(class_name, (JmsMessageHdrsPropsTestCase,), class_dict)
 
+        #pylint: disable=too-many-nested-blocks
         for send_shim, receive_shim in product(self.shim_map.values(), repeat=2):
             for jms_hdrs_combo_index in range(0, len(self.types.headers_map.keys())+1):
-                for jms_hdrs_combo in combinations(self.types.headers_map.iterkeys(), jms_hdrs_combo_index):
+                for jms_hdrs_combo in combinations(self.types.headers_map.keys(), jms_hdrs_combo_index):
                     jms_hdr_list = []
                     for jms_header in jms_hdrs_combo:
                         data_type_list = []
@@ -519,6 +530,11 @@ class JmsHdrsPropsTest(qpid_interop_test.qit_common.QitJmsTest):
                                 method_subname += '%s:%s' % combo_item
                                 header_type_map = self.types.headers_map[combo_item[0]]
                                 header_val_list = header_type_map[combo_item[1]]
+                                if combo_item[1] == 'bytes':
+                                    encoded_list = []
+                                    for header_val in header_val_list:
+                                        encoded_list.append(b64encode(header_val).decode('utf-8'))
+                                    header_val_list = encoded_list
                                 header_map[combo_item[0]] = {combo_item[1]: header_val_list[0]}
                             add_test_method(new_class,
                                             method_subname,
@@ -540,6 +556,7 @@ class JmsHdrsPropsTest(qpid_interop_test.qit_common.QitJmsTest):
             """Print the class name"""
             return self.__class__.__name__
 
+        #pylint: disable=too-many-arguments
         def add_test_method(cls, queue_name_fragment, hdrs, props, send_shim, receive_shim, timeout):
             """Function which creates a new test method in class cls"""
 
@@ -572,7 +589,7 @@ class JmsHdrsPropsTest(qpid_interop_test.qit_common.QitJmsTest):
         new_class = type(class_name, (JmsMessageHdrsPropsTestCase,), class_dict)
 
         for send_shim, receive_shim in product(self.shim_map.values(), repeat=2):
-            for prop_type, prop_val_list in self.types.properties_map.iteritems():
+            for prop_type, prop_val_list in iter(self.types.properties_map.items()):
                 prop_val_cnt = 0
                 for prop_val in prop_val_list:
                     prop_val_cnt += 1
@@ -597,6 +614,7 @@ class JmsHdrsPropsTest(qpid_interop_test.qit_common.QitJmsTest):
             """Print the class name"""
             return self.__class__.__name__
 
+        #pylint: disable=too-many-arguments
         def add_test_method(cls, queue_name_fragment, hdrs, props, send_shim, receive_shim, timeout):
             """Function which creates a new test method in class cls"""
 
@@ -629,14 +647,14 @@ class JmsHdrsPropsTest(qpid_interop_test.qit_common.QitJmsTest):
         new_class = type(class_name, (JmsMessageHdrsPropsTestCase,), class_dict)
 
         all_hdrs = {}
-        for msg_header in self.types.headers_map.iterkeys():
+        for msg_header in self.types.headers_map.keys():
             header_type_dict = self.types.headers_map[msg_header]
-            header_type, header_val_list = header_type_dict.iteritems().next()
+            header_type, header_val_list = next(iter(header_type_dict.items()))
             header_val = header_val_list[0]
             all_hdrs[msg_header] = {header_type: header_val}
 
         all_props = {}
-        for prop_type, prop_val_list in self.types.properties_map.iteritems():
+        for prop_type, prop_val_list in iter(self.types.properties_map.items()):
             prop_val_cnt = 0
             for prop_val in prop_val_list:
                 prop_val_cnt += 1
diff --git a/src/python/qpid_interop_test/jms_messages_test.py b/src/python/qpid_interop_test/jms_messages_test.py
index dcee572..033632c 100755
--- a/src/python/qpid_interop_test/jms_messages_test.py
+++ b/src/python/qpid_interop_test/jms_messages_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 """
 Module to test JMS message types across different clients
@@ -27,13 +27,14 @@ import signal
 import sys
 import unittest
 
+from base64 import b64encode
 from itertools import product
 from json import dumps
 
 import qpid_interop_test.qit_common
 from qpid_interop_test.qit_errors import InteropTestError, InteropTestTimeout
 
-DEFAULT_TEST_TIMEOUT = 10 # seconds
+DEFAULT_TEST_TIMEOUT = 20 # seconds
 
 
 class JmsMessageTypes(qpid_interop_test.qit_common.QitTestTypeMap):
@@ -109,7 +110,7 @@ class JmsMessageTypes(qpid_interop_test.qit_common.QitTestTypeMap):
         'bytes': [b'',
                   b'12345',
                   b'Hello, world',
-                  b'\\x01\\x02\\x03\\x04\\x05abcde\\x80\\x81\\xfe\\xff',
+                  b'\x01\x02\x03\x04\x05abcde\x80\x81\xfe\xff',
                   b'The quick brown fox jumped over the lazy dog 0123456789.' #* 100],
                  ],
         'char': [b'a',
@@ -144,8 +145,8 @@ class JmsMessageTypes(qpid_interop_test.qit_common.QitTestTypeMap):
         #    'java.lang.Byte': ['-128',
         #                       '0',
         #                       '127'],
-        #    'java.lang.Character': [u'a',
-        #                            u'Z'],
+        #    'java.lang.Character': [a',
+        #                            Z'],
         #    'java.lang.Double': ['0.0',
         #                         '3.141592654',
         #                         '-2.71828182846'],
@@ -176,11 +177,11 @@ class JmsMessageTypes(qpid_interop_test.qit_common.QitTestTypeMap):
         #                        '127',
         #                        '128',
         #                        '32767'],
-        #    'java.lang.String': [u'',
-        #                         u'Hello, world',
-        #                         u'"Hello, world"',
-        #                         u"Charlie's \"peach\"",
-        #                         u'Charlie\'s "peach"']
+        #    'java.lang.String': [',
+        #                         Hello, world',
+        #                         "Hello, world"',
+        #                         "Charlie's \"peach\"",
+        #                         Charlie\'s "peach"']
         #    },
         }
 
@@ -190,10 +191,29 @@ class JmsMessageTypes(qpid_interop_test.qit_common.QitTestTypeMap):
 
     client_skip = {}
 
+    def get_test_values(self, test_type):
+        """
+        Overload the parent method so that binary types can be base64 encoded for use in json.
+        The test_type parameter is the JMS message type in this case
+        """
+        type_map = super(JmsMessageTypes, self).get_test_values(test_type)
+        for key in type_map:
+            if key in ['bytes', 'char']:
+                new_vals = []
+                for val in type_map[key]:
+                    if isinstance(val, bytes):
+                        new_vals.append(b64encode(val).decode('utf-8'))
+                    else:
+                        new_vals.append(val)
+                type_map[key] = new_vals
+        return type_map
+
 
 class JmsMessageTypeTestCase(qpid_interop_test.qit_common.QitTestCase):
     """Abstract base class for JMS message type tests"""
 
+    #pylint: disable=too-many-arguments
+    #pylint: disable=too-many-locals
     def run_test(self, sender_addr, receiver_addr, jms_message_type, test_values, send_shim, receive_shim, timeout):
         """
         Run this test by invoking the shim send method to send the test values, followed by the shim receive method
diff --git a/src/python/qpid_interop_test/qit_broker_props.py b/src/python/qpid_interop_test/qit_broker_props.py
old mode 100644
new mode 100755
index 1553744..f983c8c
--- a/src/python/qpid_interop_test/qit_broker_props.py
+++ b/src/python/qpid_interop_test/qit_broker_props.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
 """
 Module containing a small client which connects to the broker and
 gets the broker connection properties so as to identify the broker.
@@ -34,7 +35,7 @@ class Client(proton.handlers.MessagingHandler):
     def __init__(self, url, max_num_retries):
         super(Client, self).__init__()
         self.url = url
-        self.max_num_retries = max_num_retries;
+        self.max_num_retries = max_num_retries
         self.num_retries = 0
         self.remote_properties = None
 
@@ -55,10 +56,10 @@ class Client(proton.handlers.MessagingHandler):
 
     def on_transport_error(self, event):
         self.num_retries += 1
-        if (self.num_retries == 1):
+        if self.num_retries == 1:
             sys.stdout.write('WARNING: broker not found at %s, retrying *' % self.url)
             sys.stdout.flush()
-        elif (self.num_retries <= self.max_num_retries):
+        elif self.num_retries <= self.max_num_retries:
             sys.stdout.write(' *')
             sys.stdout.flush()
         else:
@@ -70,3 +71,16 @@ def get_broker_properties(broker_url):
     msg_handler = Client(broker_url, 25)
     proton.reactor.Container(msg_handler).run()
     return msg_handler.get_connection_properties()
+
+
+#--- Main program start ---
+
+if __name__ == '__main__':
+    if (len(sys.argv)) != 2:
+        print('Incorrect number of arguments')
+        print('Usage: %s <broker-url>'%sys.argv[0])
+        sys.exit(1)
+    try:
+        print(get_broker_properties(sys.argv[1]))
+    except KeyboardInterrupt:
+        print()
diff --git a/src/python/qpid_interop_test/qit_common.py b/src/python/qpid_interop_test/qit_common.py
index 675bcd0..88dcad4 100644
--- a/src/python/qpid_interop_test/qit_common.py
+++ b/src/python/qpid_interop_test/qit_common.py
@@ -44,7 +44,7 @@ QIT_TEST_SHIM_HOME = path.join(QIT_INSTALL_PREFIX, 'libexec', 'qpid_interop_test
 QPID_JMS_SHIM_VER = '0.3.0-SNAPSHOT'
 
 
-class QitTestTypeMap(object):
+class QitTestTypeMap:
     """
     Class which contains all the described types and the test values to be used in testing against those types.
     """
@@ -165,7 +165,7 @@ class QitTestTypeMap(object):
         return res
 
 
-class QitCommonTestOptions(object):
+class QitCommonTestOptions:
     """
     Class controlling common command-line arguments used to control tests.
     """
@@ -246,12 +246,13 @@ class QitTestCase(unittest.TestCase):
 #        test(result)
 
 
-class QitTest(object):
+#pylint: disable=too-many-instance-attributes
+class QitTest:
     """
     Top-level test class with test entry-point
     """
 
-    class TestTime(object):
+    class TestTime:
         """Class for measuring elapsed time of a test"""
         def __init__(self):
             self.start_time = time.time()
@@ -398,11 +399,11 @@ class QitTest(object):
         if connection_props is None:
             print('WARNING: Unable to get %s connection properties - unknown broker' % broker_role)
             return None
-        broker_name = connection_props[symbol(u'product')] if symbol(u'product') in connection_props \
+        broker_name = connection_props[symbol('product')] if symbol('product') in connection_props \
                       else '<product not found>'
-        broker_version = connection_props[symbol(u'version')] if symbol(u'version') in connection_props \
+        broker_version = connection_props[symbol('version')] if symbol('version') in connection_props \
                          else '<version not found>'
-        broker_platform = connection_props[symbol(u'platform')] if symbol(u'platform') in connection_props \
+        broker_platform = connection_props[symbol('platform')] if symbol('platform') in connection_props \
                           else '<platform not found>'
         print('%s broker: %s v.%s on %s' % (broker_role.title(), broker_name, broker_version, broker_platform))
         return (broker_name, broker_version, broker_platform)
diff --git a/src/python/qpid_interop_test/qit_errors.py b/src/python/qpid_interop_test/qit_errors.py
index 8f03ba1..b07ae93 100644
--- a/src/python/qpid_interop_test/qit_errors.py
+++ b/src/python/qpid_interop_test/qit_errors.py
@@ -25,10 +25,8 @@ class InteropTestError(Exception):
     """
     Generic simple error class for use in interop tests
     """
-    pass
 
 class InteropTestTimeout(InteropTestError):
     """
     Test timeout error
     """
-    pass
diff --git a/src/python/qpid_interop_test/qit_jms_types.py b/src/python/qpid_interop_test/qit_jms_types.py
index 32745da..4db17d7 100644
--- a/src/python/qpid_interop_test/qit_jms_types.py
+++ b/src/python/qpid_interop_test/qit_jms_types.py
@@ -23,7 +23,7 @@ Common JMS types and definitions as implemented by QpidJMS
 
 from proton import byte, symbol
 
-QPID_JMS_TYPE_ANNOTATION_NAME = symbol(u'x-opt-jms-msg-type')
+QPID_JMS_TYPE_ANNOTATION_NAME = symbol('x-opt-jms-msg-type')
 
 QPID_JMS_TYPE_ANNOTATIONS = {
     'JMS_MESSAGE_TYPE': byte(0),
diff --git a/src/python/qpid_interop_test/qit_shim.py b/src/python/qpid_interop_test/qit_shim.py
index 52f5674..53b31bc 100644
--- a/src/python/qpid_interop_test/qit_shim.py
+++ b/src/python/qpid_interop_test/qit_shim.py
@@ -51,26 +51,28 @@ class ShimProcess(subprocess.Popen):
         try:
             timer.start()
             (stdoutdata, stderrdata) = self.communicate()
+            stdoutstr =  stdoutdata.decode('ascii')
+            stderrstr = stderrdata.decode('ascii')
             if self.killed_flag:
                 raise InteropTestTimeout('%s: Timeout after %d seconds' % (self.proc_name, timeout))
             if self.returncode != 0:
-                return 'Return code %d\nstderr=%s\nstdout=%s' % (self.returncode, stderrdata, stdoutdata)
-            if stderrdata: # length > 0
+                return 'Return code %d\nstderr=%s\nstdout=%s' % (self.returncode, stderrstr, stdoutstr)
+            if stderrstr: # length > 0
                 # Workaround for Amqp.NetLite which on some OSs produces a spurious error message on stderr
                 # which should be ignored:
                 # Workaround for deprecation warning on stderr:
-                if not stderrdata.startswith('Got a bad hardware address length for an AF_PACKET') and \
-                not "[DEP0005]" in stderrdata:
-                    return 'stderr: %s\nstdout: %s' % (stderrdata, stdoutdata)
-            if not stdoutdata: # zero length
+                if not stderrstr.startswith('Got a bad hardware address length for an AF_PACKET') and \
+                "[DEP0005]" not in stderrstr:
+                    return 'stderr: %s\nstdout: %s' % (stderrstr, stdoutstr)
+            if not stdoutstr: # zero length
                 return None
-            type_value_list = stdoutdata.split('\n')[0:-1] # remove trailing '\n', split by only remaining '\n'
+            type_value_list = stdoutstr.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
+                    return stdoutstr # ERROR: return single string
+            return stdoutstr # ERROR: return single string
         except (KeyboardInterrupt) as err:
             self.send_signal(signal.SIGINT)
             raise err
@@ -79,6 +81,7 @@ class ShimProcess(subprocess.Popen):
 
     def _kill(self, timeout):
         """Method called when timer expires"""
+        del timeout # unused
         self.kill()
         self.killed_flag = True
 
@@ -95,7 +98,7 @@ class Receiver(ShimProcess):
         #print('\n>>>RCVR>>> %s python3_flag=%s' % (params, python3_flag))
         super(Receiver, self).__init__(params, python3_flag, proc_name)
 
-class Shim(object):
+class Shim:
     """Abstract shim class, parent of all shims."""
     NAME = ''
     JMS_CLIENT = False # Enables certain JMS-specific message checks
diff --git a/src/python/qpid_interop_test/qit_xunit_log.py b/src/python/qpid_interop_test/qit_xunit_log.py
index 8ce67ba..c512fd3 100644
--- a/src/python/qpid_interop_test/qit_xunit_log.py
+++ b/src/python/qpid_interop_test/qit_xunit_log.py
@@ -21,7 +21,6 @@ Module providing xUnit logging functionality
 # under the License.
 #
 
-import os
 import os.path
 import sys
 import time
@@ -32,8 +31,10 @@ from qpid_interop_test.qit_errors import InteropTestError
 
 DEFUALT_XUNIT_LOG_DIR = os.path.join(os.getcwd(), 'xunit_logs')
 
-class Xunit(object):
+#pylint: disable= too-many-instance-attributes
+class Xunit:
     """Class that provides test reporting in xUnit format"""
+    #pylint: disable=too-many-arguments
     def __init__(self, test_name, test_args, test_suite, test_result, test_duration, broker_connection_props):
         self.test_name = test_name
         self.test_args = test_args
diff --git a/src/python/qpid_interop_test/run_all.py b/src/python/qpid_interop_test/run_all.py
old mode 100644
new mode 100755
index 56e4ffe..e371ac2
--- a/src/python/qpid_interop_test/run_all.py
+++ b/src/python/qpid_interop_test/run_all.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 """
 Script to run all available tests

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


[qpid-interop-test] 16/41: QPIDIT-125: Minor addition to QUICKSTART.md file

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 50076724ab96214148c4dbc89d4290583ccb6949
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Mon Jul 16 11:08:15 2018 -0400

    QPIDIT-125: Minor addition to QUICKSTART.md file
---
 QUICKSTART.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/QUICKSTART.md b/QUICKSTART.md
index 9bcfcc3..4143754 100644
--- a/QUICKSTART.md
+++ b/QUICKSTART.md
@@ -135,7 +135,8 @@ then install the following packages:
 yum -y install mono-devel python34-devel jsoncpp-devel nodejs-rhea qpid-proton-cpp-devel python-qpid-proton qpid-proton-cpp-devel python2-qpid-proton
 ````
 
-Note that at the time of release, there is no python3-qpid-proton package available for CentOS7, but this should be available soon.
+Note that at the time of release, there is no python3-qpid-proton package available for CentOS7, but this should be available soon. Tests should be run with
+the --exclude-shim ProtonPython3 flag to avoid errors.
 
 ### 2.4 Fedora 28 Docker image
 

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


[qpid-interop-test] 06/41: QPIDIT-129: Updated hard-coded shim version number in qit_common.py.

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 7af2e6db6299ebd4b656b404791160153caebe26
Author: Kim van der Riet <kp...@apache.org>
AuthorDate: Tue Jul 10 13:01:14 2018 -0400

    QPIDIT-129: Updated hard-coded shim version number in qit_common.py.
---
 src/python/qpid_interop_test/qit_common.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/python/qpid_interop_test/qit_common.py b/src/python/qpid_interop_test/qit_common.py
index d1a2421..8131237 100644
--- a/src/python/qpid_interop_test/qit_common.py
+++ b/src/python/qpid_interop_test/qit_common.py
@@ -39,7 +39,7 @@ if QIT_INSTALL_PREFIX is None:
     sys.exit(1)
 QIT_TEST_SHIM_HOME = path.join(QIT_INSTALL_PREFIX, 'libexec', 'qpid_interop_test', 'shims')
 
-QPID_JMS_SHIM_VER = '0.1.0'
+QPID_JMS_SHIM_VER = '0.3.0-SNAPSHOT'
 
 
 class QitTestTypeMap(object):

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


[qpid-interop-test] 01/41: QPIDIT-125: Added Apache license text to each .gitignore file, updated doc files

Posted by cm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cml pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-interop-test.git

commit 309071ef2793433dd8621964331277856cf6481c
Author: Kim van der Riet <kv...@localhost.localdomain>
AuthorDate: Fri Jun 29 11:50:26 2018 -0400

    QPIDIT-125: Added Apache license text to each .gitignore file, updated doc files
---
 .gitignore                                         |  18 ++
 QUICKSTART.md                                      | 231 ++++++++++-----------
 docs/users-guide.txt                               | 109 ++++++----
 .../src/amqp_complex_types_test/.gitignore         |  18 ++
 shims/qpid-jms/.gitignore                          |  18 ++
 shims/qpid-jms/src/.gitignore                      |  18 ++
 shims/qpid-proton-cpp/.gitignore                   |  18 ++
 .../src/qpidit/amqp_complex_types_test/.gitignore  |  18 ++
 .../src/amqp_complex_types_test/.gitignore         |  18 ++
 shims/rhea-js/amqp_complex_types_test/.gitignore   |  18 ++
 shims/rhea-js/amqp_types_test/.gitignore           |  18 ++
 src/python/qpid_interop_test/.gitignore            |  18 ++
 utils/.gitignore                                   |  18 ++
 13 files changed, 374 insertions(+), 164 deletions(-)

diff --git a/.gitignore b/.gitignore
index 7bd2757..c52634a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,21 @@
+#
+# 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.
+#
 /target/
 /build/
 /docs/users-guide.html
diff --git a/QUICKSTART.md b/QUICKSTART.md
index 789650c..6f33dba 100644
--- a/QUICKSTART.md
+++ b/QUICKSTART.md
@@ -21,17 +21,21 @@ under the License.
 
 # QUICKSTART GUIDE
 
+## 1. Overview
+
 You must build *and install* qpid-interop-test before you can run the tests.
 
-By default, qpid-interop-test will install to /usr/local, but you can set any
-non-priviedged directory as the install prefix using the CMAKE_INSTALL_PREFIX
-environment variable, for example $HOME/install.
+By default, qpid-interop-test will install to `/usr/local` (and will thus also
+require root privileges), but you can set any non-privileged directory as the
+install prefix using the `CMAKE_INSTALL_PREFIX` environment variable, for
+example `$HOME/install`.
 
 The following tools are needed to build qpid-interop-test:
 
  * git
  * gcc-c++
  * Python 2.7.x
+ * Python 3.x
  * cmake
  * Java JDK
  * Maven
@@ -40,32 +44,47 @@ The following tools are needed to build qpid-interop-test:
 The following Qpid components must be installed *before* you build and install
 qpid-interop-test:
 
- * Qpid Proton (including C++ Proton API)
+ * Qpid Proton C++ development
  * Qpid Python
+ * Python2 Qpid Proton
+ * Python3 Qpid Proton
 
 The following are not required, but if installed and present, will be tested:
 
- * Rhea (a Javascript client, also requires npm and nodejs)
+ * Rhea (a JavaScript client, also requires npm and nodejs)
  * AMQP.Net Lite (requires mono)
-
-Pre-requisites can be installed using the standard system package manager (yum,
-dnf, apt-get etc.) OR built from source and installed.
+ 
+In addition, if you wish to run the tests against a broker on the build machine,
+it will be necessary to have a running broker. One of the following may be
+installed and started against which to run the interop tests as a local broker:
+ 
+ * Artemis Java broker
+ * ActiveMQ Java broker
+ * Qpid C++ broker
+ * Qpid Dispatch router (which may be used as a single node, or as part of a
+ routed configuration)
+
+Any AMQP 1.0 broker should work. Tests can also be run against a
+remote broker provided the broker IP address is known.
+
+These pre-requisites can be installed using the standard system package manager
+(yum, dnf, apt-get etc.) OR built from source and installed.
 
 These are the install steps:
 
 1. Install prerequisites, from packages or source
-2. Install or download / build AMQP brokers to test against (or set up networked brokers)
+2. Install or download / build AMQP brokers to test against
 3. Build qpid-interop-test
 4. Run the tests
 
-## 1. Install prerequisites
+## 2. Install prerequisites
 
-### 1.1 RHEL6
+### 2.1 RHEL6
 
-Currently RHEL6 is not supported because it uses Python 2.6.x, and the test code uses
+Currently **RHEL6 is not supported** because it uses Python 2.6.x, and the test code uses
 features of Python 2.7.x. This may be supported in a future release.
 
-### 1.2 RHEL7
+### 2.2 RHEL7
 
 From a clean install:
 
@@ -84,23 +103,23 @@ yum install epel-release-latest-7.noarch.rpm
 then install the following packages:
 
 ````
-yum install jsoncpp-devel nodejs-rhea qpid-proton-cpp-devel python-qpid-proton
+yum -y install jsoncpp-devel nodejs-rhea qpid-proton-cpp-devel python-qpid-proton qpid-proton-cpp-devel python2-qpid-proton
 ````
 
-### 1.3 Fedora 27
+### 2.3 Fedora 28
 
 All packages are available directly from the Fedora repositories:
 
 ````
-dnf install gcc-c++ cmake maven java-1.8.0-openjdk-devel perl-XML-XPath jsoncpp-devel nodejs-rhea qpid-proton-cpp-devel python-qpid-proton
+dnf -y install gcc-c++ cmake maven java-1.8.0-openjdk-devel perl-XML-XPath jsoncpp-devel nodejs-rhea qpid-proton-cpp-devel python-qpid-proton qpid-proton-cpp-devel python2-qpid-proton python3-qpid-proton
 ````
 
-### 1.4 CentOS7 Docker image
+### 2.4 CentOS7 Docker image
 
 Docker images come with only the bare essentials, so there is more to install than a standard bare-metal install:
 
 ````
-yum -y install vim unzip wget git gcc-c++ make cmake maven swig java-1.8.0-openjdk-devel perl-XML-XPath python-devel
+yum -y install vim unzip wget git gcc-c++ make cmake maven swig java-1.8.0-openjdk-devel perl-XML-XPath python-devel procps-ng
 ````
 
 Some packages will need to be downloaded from [EPEL](https://fedoraproject.org/wiki/EPEL).
@@ -114,12 +133,16 @@ yum -y install epel-release-latest-7.noarch.rpm
 then install the following packages:
 
 ````
-yum -y install mono-devel python34-devel jsoncpp-devel nodejs-rhea qpid-proton-cpp-devel python-qpid-proton
+yum -y install mono-devel python34-devel jsoncpp-devel nodejs-rhea qpid-proton-cpp-devel python-qpid-proton qpid-proton-cpp-devel python2-qpid-proton
 ````
 
-### 1.5 Fedora 27 Docker image
+Note that at the time of release, there is no python3-qpid-proton package available for CentOS7, but this should be available soon.
 
-(TODO)
+### 2.5 Fedora 28 Docker image
+
+````
+dnf -y install vim unzip wget procps-ng git gcc-c++ make cmake maven swig java-1.8.0-openjdk-devel perl-XML-XPath python-devel mono-devel python3-devel jsoncpp-devel nodejs-rhea python-qpid-proton qpid-proton-cpp-devel python2-qpid-proton python3-qpid-proton
+````
 
 ## 2. Obtaining a broker
 
@@ -145,7 +168,11 @@ Download from [Apache](https://activemq.apache.org/artemis/download.html).
 
 ### 2.3 Qpid cpp broker
 
-    yum install qpid-cpp-server
+    yum -y install qpid-cpp-server # CentOS7/RHEL
+
+or
+
+    dnf -y install qpid-cpp-server # Fedora 28
 
 and set the configuration file in /etc/qpid/qpidd.conf as follows:
 
@@ -154,6 +181,14 @@ auth=no
 queue-patterns=qit
 ````
 
+The broker may be started via service, but if running in a Docker container, this may not work. In this case, start the broker directly:
+
+    /sbin/qpidd -d
+
+and can be stopped with
+
+    /sbin/qpidd -q
+
 ### 2.4 Qpid Dispatch Router
 
     yum install qpid-dispatch-router
@@ -170,98 +205,13 @@ listener {
 
 ````
 
-## 2. Build and install Qpid Proton
-
-Qpid Proton is available as a package. However, this can only contain either Python2
-_OR_ Python3 bindings.  Because QIT tests the Python2 and Python3 bindings against each
-other as separate clients, we need both clients at the same time. Currently, there is
-no "official" install method to do this.
-
-To work around this, QIT relies on the following installation locations for the Python
-client bindings:
-
-Python2:
-````
-${CMAKE_INSTALL_PREFIX}/lib64/proton/bindings/python
-````
-
-and Python3:
-````
-${CMAKE_INSTALL_PREFIX}/lib64/proton/bindings/python3
-````
-
-To build for both clients, the follow the following steps:
-
-### 2.1 Clone Qpid Proton git repo
-
-````
-git clone https://git-wip-us.apache.org/repos/asf/qpid-proton.git
-````
-
-### 2.2 Create a build script to automate the build
-
-Use the following script to build Qpid Proton into a local install directory:
-
-````
-#!/bin/bash
-
-PWD=`pwd`
-
-REDHAT_DIR=${HOME}
-BUILD_DIR=${REDHAT_DIR}/qpid-proton/build
-INSTALL_DIR=${REDHAT_DIR}/install
-
-PY2_INSTALL_DIR=${INSTALL_DIR}/lib64/proton/bindings/python
-CMAKE_PY2_EXECUTABLE=/usr/bin/python
-CMAKE_PY2_INCLUDE_DIR=/usr/include/python2.7
-CMAKE_PY2_LIBRARY=/usr/lib64/libpython2.7.so
-
-PY3_INSTALL_DIR=${INSTALL_DIR}/lib64/proton/bindings/python3
-CMAKE_PY3_EXECUTABLE=/usr/bin/python3.6m
-CMAKE_PY3_INCLUDE_DIR=/usr/include/python3.6m
-CMAKE_PY3_LIBRARY=/usr/lib64/libpython3.6m.so
-
-rm -rf ${PY2_INSTALL_DIR} ${PY3_INSTALL_DIR}
-mkdir -p ${BUILD_DIR}
-cd ${BUILD_DIR}
-
-# First build under Python 3
-cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_PYTHON="ON" -DPYTHON_EXECUTABLE=${CMAKE_PY3_EXECUTABLE} -DPYTHON_INCLUDE_DIR=${CMAKE_PY3_INCLUDE_DIR} -DPYTHON_LIBRARY=${CMAKE_PY3_LIBRARY} ..
-make install
-mv ${PY2_INSTALL_DIR} ${PY3_INSTALL_DIR}
-
-# Now build under Python 2
-cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_PYTHON="ON" -DPYTHON_EXECUTABLE=${CMAKE_PY2_EXECUTABLE} -DPYTHON_INCLUDE_DIR=${CMAKE_PY2_INCLUDE_DIR} -DPYTHON_LIBRARY=${CMAKE_PY2_LIBRARY} ..
-make install
-
-cd ${PWD}
-echo
-echo "Checking Python libs built:"
-ls -l --color=auto ${INSTALL_DIR}/lib64/proton/bindings/python*/_cproton.so
-echo "done"
-````
-
-NOTE:
-* Adjust REDHAT_DIR if you are not building in your home directory. This is the
-  location where Qpid Proton was cloned in the previous step. This script needs
-  to be located in ${REDHAT_DIR} directory.
-* Check the CMAKE_PY3_* details for your system. For example, on CentOS7, the
-  following changes need to be made:
+The broker may be started via service, but if running in a Docker container, this may not work. In this case, start the broker directly:
 
-````
-CMAKE_PY3_EXECUTABLE=/usr/bin/python3.4m
-CMAKE_PY3_INCLUDE_DIR=/usr/include/python3.4m
-CMAKE_PY3_LIBRARY=/usr/lib64/libpython3.4m.so
-````
+    /sbin/qdrouterd -d
 
-If the script builds and installs successfully, you should see the following at the end:
+and can be stopped with
 
-````
-Checking Python libs built:
--rwxr-xr-x. 1 kvdr kvdr 1608536 Feb 27 21:00 /home/kvdr/RedHat/install/lib64/proton/bindings/python/_cproton.so
--rwxr-xr-x. 1 kvdr kvdr 1609328 Feb 27 21:00 /home/kvdr/RedHat/install/lib64/proton/bindings/python3/_cproton.so
-done
-````
+    pkill qdrouterd # Needs procps-ng package installed in Docker containers
 
 ## 3. Install qpid-interop-test
 
@@ -271,9 +221,11 @@ option to the `cmake` command. If it is omitted, then qpid-interop-test will be
 into the default system directories.  The source may be unpacked, or (if you need to use the
 latest and greatest), cloned from git:
 
-````
-git clone https://git-wip-us.apache.org/repos/asf/qpid-interop-test.git
-````
+    git clone https://git-wip-us.apache.org/repos/asf/qpid-interop-test.git
+    
+or
+    
+    git clone https://github.com/apache/qpid-interop-test.git
 
 Assuming the source tree is located in directory qpid-interop-test:
 
@@ -289,7 +241,7 @@ cmake -DCMAKE_INSTALL_PREFIX=<abs-path-to-local-install-dir> ..
 make install
 ````
 
-For a system install, root privileges are required:
+For a system install (root privileges are required):
 
 ````
 cmake ..
@@ -321,10 +273,14 @@ The available tests are:
 
 | Module | Description | Clients |
 | ------ | ----------- | ------- |
-| amqp_large_content_test | Tests implementation of large messages up to 10MB | C++ Python AMQP.NetLite |
-| amqp_types_test | Tests the implementation of AMQP 1.0 types | C++ Python Rhea AMQP.NetLite |
-| jms_hdrs_props_test | Tests JMS headers and properties | C++ JMS Python |
-| jms_messages_test | Tests all JMS message types (except ObjectMessage) | C++ JMS Python |
+| amqp_complex_types_test | Tests complex AMQP 1.0 types | C++ Python2 Python3 |
+| amqp_large_content_test | Tests implementation of large messages up to 10MB | C++ Python2 Python3 AMQP.NetLite |
+| amqp_types_test | Tests the implementation of AMQP 1.0 types | C++ Python2 Python3 Rhea AMQP.NetLite |
+| jms_hdrs_props_test | Tests JMS headers and properties | C++ JMS Python2 Python3 |
+| jms_messages_test | Tests all JMS message types (except ObjectMessage) | C++ JMS Python2 Python3 |
+
+Each test has command-line options which can be used to limit or modify the test, use the `--help` option to see
+these options.
 
 The preferred method to run the tests is using the Python module option as follows:
 
@@ -351,3 +307,40 @@ python -m qpid_interop_test.amqp_types_test --sender <broker-ip-addr-A> --receiv
 python -m qpid_interop_test.jms_messages_test --sender <broker-ip-addr-A> --receiver <broker-ip-addr-B>
 ...
 ````
+
+**CentOS7 Note:**
+
+CentOS7 does not have the `python3-qpid-proton` package available at the time of the 0.2.0 release. To avoid
+errors in the test on CentOS7 (which does not yet auto-detect but assumes the availability of this package), use the
+`--exclude-shim ProtonPython3` command-line parameter to disable this shim. See
+[QPIDIT-126](https://issues.apache.org/jira/browse/QPIDIT-126) for progress and further details on this issue.
+
+## 5. Optional Components
+
+### 5.1 AMQP.Net Lite Client
+
+(TODO: import details to this document)
+
+A detailed description of how to install and run the AMQP.Net Lite client on Fedora may be found at Apache
+JIRA [QPIDIT-105](https://issues.apache.org/jira/browse/QPIDIT-105), and can easily be adapted to other
+Linux operating systems. The following packages need to be installed:
+
+ * Mono
+ * Pre-compiled AMQP.Net Lite library
+
+See the above JIRA for detailed instructions.
+
+### 5.2 Rhea JavaScript Client
+
+The following packages need to be installed:
+ 
+ * nodejs
+ * npm
+
+The Rhea source may be cloned from github:
+
+    git clone https://github.com/amqp/rhea.git
+
+If the `rhea` directory is discovered when qpid-interop-test runs `cmake`, then the Rhea client tests
+will be enabled. If the directory is not found, it may be set through the `RHEA_DIR` variable
+when running `cmake`.
\ No newline at end of file
diff --git a/docs/users-guide.txt b/docs/users-guide.txt
index 2524afc..85269a0 100644
--- a/docs/users-guide.txt
+++ b/docs/users-guide.txt
@@ -33,7 +33,8 @@ under test. For example, the amqp_types test has shims for the following
 clients:
 * AmqpNetLite
 * ProtonCpp
-* ProtonPython
+* ProtonPython2
+* ProtonPython3
 * RheaJS
 
 To obtain both self- and interoperability testing, each test program will
@@ -46,23 +47,32 @@ following combinations of shims being used:
 
 |1 |AmqpNetLite | AmqpNetLite
 |2 |AmqpNetLite | ProtonCpp
-|3 |AmqpNetLite | ProtonPython
-|4 |AmqpNetLite | RheaJS
-|5 |ProtonCpp | AmqpNetLite
-|6 |ProtonCpp | ProtonCpp
-|7 |ProtonCpp | ProtonPython
-|8 |ProtonCpp | RheaJS
-|9 |ProtonPython | AmqpNetLite
-|10 |ProtonPython | ProtonCpp
-|11 |ProtonPython | ProtonPython
-|12 |ProtonPython | RheaJS
-|13 |RheaJS | AmqpNetLite
-|14 |RheaJS | ProtonCpp
-|15 |RheaJS | ProtonPython
-|16 |RheaJS | RheaJS
+|3 |AmqpNetLite | ProtonPython2
+|4 |AmqpNetLite | ProtonPython3
+|5 |AmqpNetLite | RheaJS
+|6 |ProtonCpp | AmqpNetLite
+|7 |ProtonCpp | ProtonCpp
+|8 |ProtonCpp | ProtonPython2
+|9 |ProtonCpp | ProtonPython3
+|10 |ProtonCpp | RheaJS
+|11 |ProtonPython2 | AmqpNetLite
+|12 |ProtonPython2 | ProtonCpp
+|13 |ProtonPython2 | ProtonPython2
+|14 |ProtonPython2 | ProtonPython3
+|15 |ProtonPython2 | RheaJS
+|16 |ProtonPython3 | AmqpNetLite
+|17 |ProtonPython3 | ProtonCpp
+|18 |ProtonPython3 | ProtonPython2
+|19 |ProtonPython3 | ProtonPython3
+|20 |ProtonPython3 | RheaJS
+|21 |RheaJS | AmqpNetLite
+|22 |RheaJS | ProtonCpp
+|23 |RheaJS | ProtonPython2
+|24 |RheaJS | ProtonPython3
+|25 |RheaJS | RheaJS
 |===
 
-so that for each test case, 16 individual tests are run. The test program
+so that for each test case, 25 individual tests are run. The test program
 will by default run all the available shims against each other in this way,
 but it is possible to control which shims are used using the --include-shim
 or --exclude-shim arguments (see below).
@@ -70,15 +80,17 @@ or --exclude-shim arguments (see below).
 == 2. Obtaining
 qpid-interop-test is an Apache Qpid project.
 
-Web page: xxx
+Web page: https://qpid.apache.org/components/interop-test/index.html
 
-Download soruce: xxx
+Download soruce: https://qpid.apache.org/download.html
+
+Git: https://github.com/apache/qpid-interop-test.git
 
 == 3. Building
 
 === a. Install dependencies:
-   * Build tools: git, gcc, cmake
-   * Qpid Proton: qpid-proton-c-devel
+   * Build tools: git, gcc-c++, cmake, maven, json-cpp
+   * Qpid Proton: qpid-proton-cpp-devel, python2-qpid-proton, python3-qpid-proton
 
 === b. Decide on local vs system install
 ==== Local install:
@@ -94,27 +106,7 @@ Installs the files into traditional system locations. This type of install
 requires root privileges. As the files are located in expected locations, no
 environment settings need be made.
 
-=== c. Build qpid-proton
-*System install:*
-----
- $ cd qpid-proton
- $ mkdir build
- $ cd build
- $ cmake ..
- $ make
- $ sudo make install
-----
-
-*Local install:*
-----
- $ cd qpid-proton
- $ mkdir build
- $ cd build
- $ cmake ..
- $ make install
-----
-
-=== d. Build qpid-interop-test
+=== c. Build qpid-interop-test
 *System install:*
 ----
  $ cd qpid-interop-test
@@ -130,14 +122,14 @@ environment settings need be made.
  $ cd qpid-interop-test
  $ mkdir build
  $ cd build
- $ cmake ..
+ $ cmake -DCMAKE_INSTALL_PREFIX=<path/to/local/install/dir> ..
  $ make install
 ----
 
 == 4. Running
 
-The tests assume a broker is available and running. The assumed default is at
-`localhost:5672`. For other broker location(s), use the `--sender` and `--receiver`
+The tests by default assume a broker is available and running. The assumed default
+is at `localhost:5672`. For other broker location(s), use the `--sender` and `--receiver`
 arguments to specify where the clients should interact, see below.
 
 The tests do not start or stop brokers.
@@ -177,10 +169,17 @@ Each test is executed directly.
                Format: For our current brokers: one of: "ActiveMQ", "qpid-cpp",
                "qpid-dispatch-router". Artemis does not currently pass its name
                in connection properties, and is equivalent to "None".
+|`--timeout' |Timeout for the test in seconds (default: 10 seconds, may vary with test). If the
+              test does not complete within this time, it will be terminated and marked as a
+              failure.
 |`--include-shim` |Name of shim to include. Cannot be used together with `--exclude-shim`. May
                be used multiple times to include more than one shim.
 |`--exclude-shim` |Name of shim to exclude. Cannot be used together with `--include-shim`. May
                be used multiple times to exclude more that one shim.
+|`--xunit-log` |Enable the generation of xUnit log files at the conclusion of the tests. |
+|`--xunit-log-dir` |Path where xUnit log files are written.
+|`--description` |Description of test used in xUnit log file.
+|`--broker-topology` | Description of broker and broker topology (where needed) used in xUnit log file.
 |===
 
 .amqp-types-test
@@ -192,6 +191,22 @@ Each test is executed directly.
                    May be used multiple times to exclude more than one type.
 |===
 
+.amqp-complex-types-test
+[cols="20%,80%"]
+|===
+|`--include-type` |Name of AMQP complex type to include. Cannot be used together with `--exclude-type`.
+                   May be used multiple times to include more than one type.
+|`--exclude-type` |Name of AMQP complex type to exclude. Cannot be used together with `--include-type`.
+                   May be used multiple times to exclude more than one type.
+|`--include-subtype` |Name of AMQP subtype to include. This is the AMQP type used within a primary complex
+                      type (for example, the types used within an AMQP list). Cannot be used together with
+                      `--exclude-subtype`. May be used multiple times to include more than one subtype.
+                      NOTE: There is a special `*` wildcard that can be used for this, and will allow
+                      all valid types to be used together in the same test.
+|`--exclude-subtype` |Name of AMQP subtype to exclude.  Cannot be used together with
+                      `--include-subtype`. May be used multiple times to exclude more than one subtype.
+|===
+
 .amqp-large-content-test
 |===
 |No other parameters. There is currently no way to select/limit the message size, but there
@@ -259,5 +274,9 @@ the test.
  AssertionError: JmsReceiver error: Unexpected JMS message header: JMS_PRIORITY: Expected default priority (4), found priority 0
 ----
 
-Currently, the tests do not produce log files.
+Currently, the tests do not produce text log files. However, by using the `--xunit-log` command-line option, xunit log files
+will be generated at the conclusion of the test in the `xunit_logs` directory. The directory may be changed by
+using the `--xunit-log-dir` command-line option. Log file management is the responsibility of the user, and if
+xunit logging is used regularly, these files will accumulate, possibly exhausting the available disk space. NOTE
+that if a test is interrupted (by using ctl+c, for example), then the log files will not be generated.)
 
diff --git a/shims/amqpnetlite/src/amqp_complex_types_test/.gitignore b/shims/amqpnetlite/src/amqp_complex_types_test/.gitignore
index 918f79c..ac974fc 100644
--- a/shims/amqpnetlite/src/amqp_complex_types_test/.gitignore
+++ b/shims/amqpnetlite/src/amqp_complex_types_test/.gitignore
@@ -1 +1,19 @@
+#
+# 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.
+#
 /amqp_complex_types_test_data.cs
diff --git a/shims/qpid-jms/.gitignore b/shims/qpid-jms/.gitignore
index c0fa915..54b3db8 100644
--- a/shims/qpid-jms/.gitignore
+++ b/shims/qpid-jms/.gitignore
@@ -1,2 +1,20 @@
+#
+# 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.
+#
 /cp.txt
 /target/
diff --git a/shims/qpid-jms/src/.gitignore b/shims/qpid-jms/src/.gitignore
index ae3c172..242b90c 100644
--- a/shims/qpid-jms/src/.gitignore
+++ b/shims/qpid-jms/src/.gitignore
@@ -1 +1,19 @@
+#
+# 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.
+#
 /bin/
diff --git a/shims/qpid-proton-cpp/.gitignore b/shims/qpid-proton-cpp/.gitignore
index 84c048a..6ef552f 100644
--- a/shims/qpid-proton-cpp/.gitignore
+++ b/shims/qpid-proton-cpp/.gitignore
@@ -1 +1,19 @@
+#
+# 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.
+#
 /build/
diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test/.gitignore b/shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test/.gitignore
index ce0dc65..2ee6fa2 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test/.gitignore
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_complex_types_test/.gitignore
@@ -1 +1,19 @@
+#
+# 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.
+#
 /amqp_complex_types_test_data.cpp
diff --git a/shims/qpid-proton-python/src/amqp_complex_types_test/.gitignore b/shims/qpid-proton-python/src/amqp_complex_types_test/.gitignore
index 3917f7f..d1207b1 100644
--- a/shims/qpid-proton-python/src/amqp_complex_types_test/.gitignore
+++ b/shims/qpid-proton-python/src/amqp_complex_types_test/.gitignore
@@ -1 +1,19 @@
+#
+# 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.
+#
 /amqp_complex_types_test_data.py
diff --git a/shims/rhea-js/amqp_complex_types_test/.gitignore b/shims/rhea-js/amqp_complex_types_test/.gitignore
index 1ddf6e7..388d296 100644
--- a/shims/rhea-js/amqp_complex_types_test/.gitignore
+++ b/shims/rhea-js/amqp_complex_types_test/.gitignore
@@ -1 +1,19 @@
+#
+# 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.
+#
 /amqp_complex_types_test_data.js
diff --git a/shims/rhea-js/amqp_types_test/.gitignore b/shims/rhea-js/amqp_types_test/.gitignore
index 2ccbe46..8b03cc7 100644
--- a/shims/rhea-js/amqp_types_test/.gitignore
+++ b/shims/rhea-js/amqp_types_test/.gitignore
@@ -1 +1,19 @@
+#
+# 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.
+#
 /node_modules/
diff --git a/src/python/qpid_interop_test/.gitignore b/src/python/qpid_interop_test/.gitignore
index a42f904..0881af2 100644
--- a/src/python/qpid_interop_test/.gitignore
+++ b/src/python/qpid_interop_test/.gitignore
@@ -1,3 +1,21 @@
+#
+# 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.
+#
 /qit_errors.pyc
 /shim_utils.pyc
 /qit_broker_props.pyc
diff --git a/utils/.gitignore b/utils/.gitignore
index b83d222..27220f2 100644
--- a/utils/.gitignore
+++ b/utils/.gitignore
@@ -1 +1,19 @@
+#
+# 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.
+#
 /target/

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