You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kp...@apache.org on 2016/10/25 00:22:30 UTC

qpid-interop-test git commit: QPIDIT-43 QPIDIT-44: Complete Large Content test for AMQP, some fixes to other shims and test fixtures

Repository: qpid-interop-test
Updated Branches:
  refs/heads/master 62ff8f4c9 -> 188fb098c


QPIDIT-43 QPIDIT-44: Complete Large Content test for AMQP, some fixes to other shims and test fixtures


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

Branch: refs/heads/master
Commit: 188fb098c5b16764a746b2dac9c160ce9eab2190
Parents: 62ff8f4
Author: Kim van der Riet <kp...@apache.org>
Authored: Mon Oct 24 20:22:14 2016 -0400
Committer: Kim van der Riet <kp...@apache.org>
Committed: Mon Oct 24 20:22:14 2016 -0400

----------------------------------------------------------------------
 shims/qpid-proton-cpp/src/CMakeLists.txt        |  56 ++++----
 .../src/qpidit/AmqpReceiverBase.cpp             |  45 +++++++
 .../src/qpidit/AmqpReceiverBase.hpp             |  44 ++++++
 .../src/qpidit/AmqpSenderBase.cpp               |  60 +++++++++
 .../src/qpidit/AmqpSenderBase.hpp               |  52 +++++++
 .../qpid-proton-cpp/src/qpidit/AmqpTestBase.cpp |  63 +++++++++
 .../qpid-proton-cpp/src/qpidit/AmqpTestBase.hpp |  53 ++++++++
 .../qpid-proton-cpp/src/qpidit/JmsTestBase.cpp  |   5 +-
 .../qpid-proton-cpp/src/qpidit/JmsTestBase.hpp  |  14 +-
 .../src/qpidit/amqp_features_test/Sender.hpp    |   1 +
 .../qpidit/amqp_large_content_test/Receiver.cpp | 132 +++++++++++++++++-
 .../qpidit/amqp_large_content_test/Receiver.hpp |  23 +++-
 .../qpidit/amqp_large_content_test/Sender.cpp   | 133 +++++++++++++++++-
 .../qpidit/amqp_large_content_test/Sender.hpp   |  31 ++++-
 .../src/qpidit/amqp_types_test/Receiver.cpp     |  11 +-
 .../src/qpidit/amqp_types_test/Receiver.hpp     |   3 +-
 .../src/qpidit/amqp_types_test/Sender.cpp       |  50 +------
 .../src/qpidit/amqp_types_test/Sender.hpp       |  22 +--
 .../src/amqp_dtx_test/Receiver.py               |  10 +-
 .../src/amqp_features_test/Receiver.py          |  10 +-
 .../src/amqp_large_content_test/Receiver.py     |  76 +++++++++--
 .../src/amqp_large_content_test/Sender.py       |  71 ++++++++--
 .../src/amqp_types_test/Receiver.py             |   8 +-
 .../src/jms_dtx_test/Receiver.py                |  10 +-
 .../src/jms_hdrs_props_test/Receiver.py         |   8 +-
 .../src/jms_large_content_test/Receiver.py      |  10 +-
 .../src/jms_messages_test/Receiver.py           |   8 +-
 src/python/qpid_interop_test/amqp_dtx_test.py   |   0
 .../amqp_large_content_test.py                  | 135 ++++++++++++++++---
 src/python/qpid_interop_test/shims.py           |   2 +-
 30 files changed, 960 insertions(+), 186 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-cpp/src/CMakeLists.txt b/shims/qpid-proton-cpp/src/CMakeLists.txt
index efd5549..7b72c4a 100644
--- a/shims/qpid-proton-cpp/src/CMakeLists.txt
+++ b/shims/qpid-proton-cpp/src/CMakeLists.txt
@@ -26,17 +26,18 @@ link_directories(${PROTON_INSTALL_DIR}/lib64)
 
 
 
-function(addTest testName)
+# === FUNCTION addAmqpTest ===
+
+function(addAmqpTest testName)
 # --- Sender ---
 
 set(${testName}_Sender_SOURCES
-    ${Common_SOURCES}
     qpidit/${testName}/Sender.hpp
     qpidit/${testName}/Sender.cpp
 )
 
 add_executable(${testName}_Sender ${${testName}_Sender_SOURCES})
-target_link_libraries(${testName}_Sender ${Common_LIBS})
+target_link_libraries(${testName}_Sender Common Common_Amqp ${Common_Link_LIBS})
 set_target_properties(${testName}_Sender PROPERTIES
     RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${testName}"
     OUTPUT_NAME Sender
@@ -45,34 +46,33 @@ set_target_properties(${testName}_Sender PROPERTIES
 # --- Receiver ---
 
 set(${testName}_Receiver_SOURCES
-    ${Common_SOURCES}
     qpidit/${testName}/Receiver.hpp
     qpidit/${testName}/Receiver.cpp
 )
 
 add_executable(${testName}_Receiver ${${testName}_Receiver_SOURCES})
-target_link_libraries(${testName}_Receiver ${Common_LIBS})
+target_link_libraries(${testName}_Receiver Common Common_Amqp ${Common_Link_LIBS})
 set_target_properties(${testName}_Receiver PROPERTIES
     RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${testName}"
     OUTPUT_NAME Receiver
 )
 
-endfunction(addTest)
+endfunction(addAmqpTest testName)
+
 
 
+# === FUNCTION addJmsTest ===
 
-function(addJMSTest testName)
+function(addJmsTest testName)
 # --- Sender ---
 
 set(${testName}_Sender_SOURCES
-    ${Common_SOURCES}
-    ${Common_Jms_SOURCES}
     qpidit/${testName}/Sender.hpp
     qpidit/${testName}/Sender.cpp
 )
 
 add_executable(${testName}_Sender ${${testName}_Sender_SOURCES})
-target_link_libraries(${testName}_Sender ${Common_LIBS})
+target_link_libraries(${testName}_Sender Common Common_Jms ${Common_Link_LIBS})
 set_target_properties(${testName}_Sender PROPERTIES
     RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${testName}"
     OUTPUT_NAME Sender
@@ -81,20 +81,18 @@ set_target_properties(${testName}_Sender PROPERTIES
 # --- Receiver ---
 
 set(${testName}_Receiver_SOURCES
-    ${Common_SOURCES}
-    ${Common_Jms_SOURCES}
     qpidit/${testName}/Receiver.hpp
     qpidit/${testName}/Receiver.cpp
 )
 
 add_executable(${testName}_Receiver ${${testName}_Receiver_SOURCES})
-target_link_libraries(${testName}_Receiver ${Common_LIBS})
+target_link_libraries(${testName}_Receiver Common Common_Jms ${Common_Link_LIBS})
 set_target_properties(${testName}_Receiver PROPERTIES
     RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${testName}"
     OUTPUT_NAME Receiver
 )
 
-endfunction(addJMSTest)
+endfunction(addJmsTest testName)
 
 
 # --- Common files and libs ---
@@ -103,23 +101,35 @@ set(Common_SOURCES
     qpidit/QpidItErrors.hpp
     qpidit/QpidItErrors.cpp
 )
+add_library(Common ${Common_SOURCES})
+
+set(Common_Amqp_SOURCES
+    qpidit/AmqpTestBase.hpp
+    qpidit/AmqpTestBase.cpp
+    qpidit/AmqpReceiverBase.hpp
+    qpidit/AmqpReceiverBase.cpp
+    qpidit/AmqpSenderBase.hpp
+    qpidit/AmqpSenderBase.cpp
+)
+add_library(Common_Amqp ${Common_Amqp_SOURCES})
 
 set(Common_Jms_SOURCES
     qpidit/JmsTestBase.hpp
     qpidit/JmsTestBase.cpp
 )
+add_library(Common_Jms ${Common_Jms_SOURCES})
 
-set(Common_LIBS
+set(Common_Link_LIBS
     qpid-proton-cpp
     jsoncpp
 )
 
 
-addTest(amqp_types_test)
-addTest(amqp_features_test)
-addTest(amqp_large_content_test)
-addTest(amqp_dtx_test)
-addJMSTest(jms_messages_test)
-addJMSTest(jms_hdrs_props_test)
-addJMSTest(jms_large_content_test)
-addJMSTest(jms_dtx_test)
+addAmqpTest(amqp_types_test)
+addAmqpTest(amqp_features_test)
+addAmqpTest(amqp_large_content_test)
+addAmqpTest(amqp_dtx_test)
+addJmsTest(jms_messages_test)
+addJmsTest(jms_hdrs_props_test)
+addJmsTest(jms_large_content_test)
+addJmsTest(jms_dtx_test)

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/AmqpReceiverBase.cpp
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-cpp/src/qpidit/AmqpReceiverBase.cpp b/shims/qpid-proton-cpp/src/qpidit/AmqpReceiverBase.cpp
new file mode 100644
index 0000000..536a466
--- /dev/null
+++ b/shims/qpid-proton-cpp/src/qpidit/AmqpReceiverBase.cpp
@@ -0,0 +1,45 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+#include "qpidit/AmqpReceiverBase.hpp"
+
+#include <iostream> // debug
+#include <sstream>
+#include "proton/container.hpp"
+
+namespace qpidit
+{
+
+    AmqpReceiverBase::AmqpReceiverBase(const std::string& testName,
+                                       const std::string& brokerAddr,
+                                       const std::string& queueName):
+                    AmqpTestBase(testName, brokerAddr, queueName)
+    {}
+
+    AmqpReceiverBase::~AmqpReceiverBase() {}
+
+    void AmqpReceiverBase::on_container_start(proton::container &c) {
+        std::ostringstream oss;
+        oss << _brokerAddr << "/" << _queueName;
+        c.open_receiver(oss.str());
+    }
+
+} // namespace qpidit

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/AmqpReceiverBase.hpp
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-cpp/src/qpidit/AmqpReceiverBase.hpp b/shims/qpid-proton-cpp/src/qpidit/AmqpReceiverBase.hpp
new file mode 100644
index 0000000..fdc8d92
--- /dev/null
+++ b/shims/qpid-proton-cpp/src/qpidit/AmqpReceiverBase.hpp
@@ -0,0 +1,44 @@
+/*
+ *
+ * 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_AMQPRECEIVERBASE_HPP_
+#define SRC_QPIDIT_AMQPRECEIVERBASE_HPP_
+
+#include "proton/messaging_handler.hpp"
+#include "qpidit/AmqpTestBase.hpp"
+
+namespace qpidit
+{
+
+    class AmqpReceiverBase : public AmqpTestBase
+    {
+    public:
+        AmqpReceiverBase(const std::string& testName,
+                         const std::string& brokerAddr,
+                         const std::string& queueName);
+        virtual ~AmqpReceiverBase();
+
+        void on_container_start(proton::container &c);
+    };
+
+} // namespace qpidit
+
+#endif /* SRC_QPIDIT_AMQPRECEIVERBASE_HPP_ */

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/AmqpSenderBase.cpp
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-cpp/src/qpidit/AmqpSenderBase.cpp b/shims/qpid-proton-cpp/src/qpidit/AmqpSenderBase.cpp
new file mode 100644
index 0000000..9c35677
--- /dev/null
+++ b/shims/qpid-proton-cpp/src/qpidit/AmqpSenderBase.cpp
@@ -0,0 +1,60 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+#include "qpidit/AmqpSenderBase.hpp"
+
+#include <sstream>
+#include "proton/container.hpp"
+#include "proton/tracker.hpp"
+
+namespace qpidit
+{
+
+    AmqpSenderBase::AmqpSenderBase(const std::string& testName,
+                                   const std::string& brokerAddr,
+                                   const std::string& queueName,
+                                   uint32_t totalMsgs):
+                    AmqpTestBase(testName, brokerAddr, queueName),
+                    _totalMsgs(totalMsgs),
+                    _msgsSent(0),
+                    _msgsConfirmed(0)
+    {}
+
+    AmqpSenderBase::~AmqpSenderBase() {}
+
+    void AmqpSenderBase::on_container_start(proton::container &c) {
+        std::ostringstream oss;
+        oss << _brokerAddr << "/" << _queueName;
+        c.open_sender(oss.str());
+    }
+
+    void AmqpSenderBase::on_tracker_accept(proton::tracker &t) {
+        _msgsConfirmed++;
+        if (_msgsConfirmed >= _totalMsgs) {
+            t.connection().close();
+        }
+    }
+
+    void AmqpSenderBase::on_transport_close(proton::transport &t) {
+        _msgsSent = _msgsConfirmed;
+    }
+
+} // namespace qpidit

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/AmqpSenderBase.hpp
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-cpp/src/qpidit/AmqpSenderBase.hpp b/shims/qpid-proton-cpp/src/qpidit/AmqpSenderBase.hpp
new file mode 100644
index 0000000..5b5113b
--- /dev/null
+++ b/shims/qpid-proton-cpp/src/qpidit/AmqpSenderBase.hpp
@@ -0,0 +1,52 @@
+/*
+ *
+ * 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_AMQPSENDERBASE_HPP_
+#define SRC_QPIDIT_AMQPSENDERBASE_HPP_
+
+#include "proton/messaging_handler.hpp"
+#include "qpidit/AmqpTestBase.hpp"
+
+namespace qpidit
+{
+
+    class AmqpSenderBase : public AmqpTestBase
+    {
+    protected:
+        uint32_t _totalMsgs;
+        uint32_t _msgsSent;
+        uint32_t _msgsConfirmed;
+
+    public:
+        AmqpSenderBase(const std::string& testName,
+                       const std::string& brokerAddr,
+                       const std::string& queueName,
+                       uint32_t totalMsgs);
+        virtual ~AmqpSenderBase();
+
+        void on_container_start(proton::container &c);
+        void on_tracker_accept(proton::tracker &t);
+        void on_transport_close(proton::transport &t);
+    };
+
+} // namespace qpidit
+
+#endif /* SRC_QPIDIT_AMQPSENDERBASE_HPP_ */

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/AmqpTestBase.cpp
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-cpp/src/qpidit/AmqpTestBase.cpp b/shims/qpid-proton-cpp/src/qpidit/AmqpTestBase.cpp
new file mode 100644
index 0000000..9546734
--- /dev/null
+++ b/shims/qpid-proton-cpp/src/qpidit/AmqpTestBase.cpp
@@ -0,0 +1,63 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+#include "qpidit/AmqpTestBase.hpp"
+
+#include <iostream>
+#include "proton/connection.hpp"
+#include "proton/sender.hpp"
+#include "proton/session.hpp"
+#include "proton/transport.hpp"
+
+namespace qpidit
+{
+
+    AmqpTestBase::AmqpTestBase(const std::string& testName,
+                               const std::string& brokerAddr,
+                               const std::string& queueName):
+                    _testName(testName),
+                    _brokerAddr(brokerAddr),
+                    _queueName(queueName)
+    {}
+
+    AmqpTestBase::~AmqpTestBase() {}
+
+    void AmqpTestBase::on_connection_error(proton::connection& c) {
+        std::cerr << _testName << "::on_connection_error: " << c.error() << std::endl;
+    }
+
+    void AmqpTestBase::on_session_error(proton::session& s) {
+        std::cerr << _testName  << "::on_session_error: " << s.error() << std::endl;
+    }
+
+    void AmqpTestBase::on_sender_error(proton::sender& s) {
+        std::cerr << _testName << "::on_sender_error: " << s.error() << std::endl;
+    }
+
+    void AmqpTestBase::on_transport_error(proton::transport& t) {
+        std::cerr << _testName << "::on_transport_error: " << t.error() << std::endl;
+    }
+
+    void AmqpTestBase::on_error(const proton::error_condition& ec) {
+        std::cerr << _testName << "::on_error(): " << ec << std::endl;
+    }
+
+} // namespace qpidit

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/AmqpTestBase.hpp
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-cpp/src/qpidit/AmqpTestBase.hpp b/shims/qpid-proton-cpp/src/qpidit/AmqpTestBase.hpp
new file mode 100644
index 0000000..a790404
--- /dev/null
+++ b/shims/qpid-proton-cpp/src/qpidit/AmqpTestBase.hpp
@@ -0,0 +1,53 @@
+/*
+ *
+ * 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_AMQPTESTBASE_HPP_
+#define SRC_QPIDIT_AMQPTESTBASE_HPP_
+
+#include <string>
+#include "proton/messaging_handler.hpp"
+
+namespace qpidit
+{
+
+    class AmqpTestBase : public proton::messaging_handler
+    {
+    protected:
+        const std::string _testName;
+        const std::string _brokerAddr;
+        const std::string _queueName;
+
+    public:
+        AmqpTestBase(const std::string& testName,
+                     const std::string& brokerAddr,
+                     const std::string& queueName);
+        virtual ~AmqpTestBase();
+
+        void on_connection_error(proton::connection& c);
+        void on_session_error(proton::session& s);
+        void on_sender_error(proton::sender& s);
+        void on_transport_error(proton::transport& t);
+        void on_error(const proton::error_condition& c);
+    };
+
+} // namespace qpidit
+
+#endif /* SRC_QPIDIT_AMQPTESTBASE_HPP_ */

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/JmsTestBase.cpp
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-cpp/src/qpidit/JmsTestBase.cpp b/shims/qpid-proton-cpp/src/qpidit/JmsTestBase.cpp
index 010e8ba..0872fb4 100644
--- a/shims/qpid-proton-cpp/src/qpidit/JmsTestBase.cpp
+++ b/shims/qpid-proton-cpp/src/qpidit/JmsTestBase.cpp
@@ -30,9 +30,10 @@ namespace qpidit {
     proton::symbol JmsTestBase::s_jmsMessageTypeAnnotationKey("x-opt-jms-msg-type");
     std::map<std::string, int8_t>JmsTestBase::s_jmsMessageTypeAnnotationValues = initializeJmsMessageTypeAnnotationMap();
 
-    JmsTestBase::JmsTestBase() {
+    JmsTestBase::JmsTestBase() {}
 
-    }
+    //virtual
+    JmsTestBase::~JmsTestBase() {}
 
     void JmsTestBase::on_connection_error(proton::connection &c) {
         std::cerr << "JmsSender::on_connection_error(): " << c.error() << std::endl;

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/JmsTestBase.hpp
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-cpp/src/qpidit/JmsTestBase.hpp b/shims/qpid-proton-cpp/src/qpidit/JmsTestBase.hpp
index 7352ca2..264f3c6 100644
--- a/shims/qpid-proton-cpp/src/qpidit/JmsTestBase.hpp
+++ b/shims/qpid-proton-cpp/src/qpidit/JmsTestBase.hpp
@@ -19,8 +19,8 @@
  *
  */
 
-#ifndef SRC_QPIDIT_JMS_JMSDEFINTIONS_HPP_
-#define SRC_QPIDIT_JMS_JMSDEFINTIONS_HPP_
+#ifndef SRC_QPIDIT_JMSTESTBASE_HPP_
+#define SRC_QPIDIT_JMSTESTBASE_HPP_
 
 #include <map>
 #include "proton/messaging_handler.hpp"
@@ -29,6 +29,7 @@
 
 namespace qpidit
 {
+
     typedef enum {JMS_QUEUE = 0,
                   JMS_TOPIC,
                   JMS_TMEP_QUEUE,
@@ -47,18 +48,19 @@ namespace qpidit
     protected:
         static proton::symbol s_jmsMessageTypeAnnotationKey;
         static std::map<std::string, int8_t>s_jmsMessageTypeAnnotationValues;
+    public:
+        JmsTestBase();
+        virtual ~JmsTestBase();
 
         void on_connection_error(proton::connection &c);
         void on_session_error(proton::session &s);
         void on_sender_error(proton::sender& s);
         void on_transport_error(proton::transport &t);
         void on_error(const proton::error_condition &c);
-    public:
-        JmsTestBase();
     protected:
         static std::map<std::string, int8_t> initializeJmsMessageTypeAnnotationMap();
     };
 
-}
+} // namespace qpidit
 
-#endif /* SRC_QPIDIT_JMS_JMSDEFINTIONS_HPP_ */
+#endif /* SRC_QPIDIT_JMSTESTBASE_HPP_ */

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/amqp_features_test/Sender.hpp
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_features_test/Sender.hpp b/shims/qpid-proton-cpp/src/qpidit/amqp_features_test/Sender.hpp
index 58a1fb2..17cf8a7 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_features_test/Sender.hpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_features_test/Sender.hpp
@@ -22,6 +22,7 @@
 #ifndef SRC_QPIDIT_AMQP_DTX_TEST_SENDER_HPP_
 #define SRC_QPIDIT_AMQP_DTX_TEST_SENDER_HPP_
 
+#include <stdint.h>
 #include <json/value.h>
 #include "proton/messaging_handler.hpp"
 #include <string>

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Receiver.cpp
----------------------------------------------------------------------
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 f7d7a4b..f92cd96 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
@@ -21,12 +21,125 @@
 
 #include "qpidit/amqp_large_content_test/Receiver.hpp"
 
+#include <iostream>
+#include <json/json.h>
 #include <stdlib.h> // exit()
+#include "proton/default_container.hpp"
+#include "proton/delivery.hpp"
+#include "qpidit/QpidItErrors.hpp"
 
 namespace qpidit
 {
     namespace amqp_large_content_test
     {
+
+        Receiver::Receiver(const std::string& brokerAddr,
+                           const std::string& queueName,
+                           const std::string& amqpType,
+                           uint32_t expected) :
+                        AmqpReceiverBase("amqp_large_content_test::Receiver", brokerAddr, queueName),
+                        _amqpType(amqpType),
+                        _expected(expected),
+                        _received(0UL),
+                        _receivedValueList(Json::arrayValue)
+        {}
+
+        Receiver::~Receiver() {}
+
+        Json::Value& Receiver::getReceivedValueList() {
+            return _receivedValueList;
+        }
+
+        void Receiver::on_message(proton::delivery &d, proton::message &m) {
+            if (_received < _expected) {
+                if (_amqpType.compare("binary") == 0 || _amqpType.compare("string") == 0 || _amqpType.compare("symbol") == 0) {
+                    _receivedValueList.append(getTestStringSizeMb(m.body()));
+                } else {
+                    std::pair<uint32_t, uint32_t> ret;
+                    if (_amqpType.compare("list") == 0) {
+                        ret = getTestListSizeMb(m.body());
+                    } else {
+                        ret = getTestMapSizeMb(m.body());
+                    }
+                    if (_receivedValueList.empty()) {
+                        createNewListMapSize(ret);
+                    } else {
+                        bool found = false;
+                        for (Json::ValueIterator i = _receivedValueList.begin(); i != _receivedValueList.end(); ++i) {
+                            // JSON Array has exactly 2 elements: size and a JSON Array of number of elements found
+                            const uint32_t lastSize = (*i)[0].asInt(); // total size (sum of elements)
+                            if (ret.first == lastSize) {
+                                found = true;
+                                appendListMapSize((*i)[1], ret);
+                                break;
+                            }
+                        }
+                        if (!found) {
+                            createNewListMapSize(ret);
+                        }
+                    }
+                }
+            }
+            _received++;
+            if (_received >= _expected) {
+                d.receiver().close();
+                d.connection().close();
+            }
+        }
+
+        // protected
+
+        std::pair<uint32_t, uint32_t> Receiver::getTestListSizeMb(const proton::value& pvTestList) {
+            // Uniform elt size assumed
+            const std::vector<proton::value>& testList(pvTestList.get<std::vector<proton::value> >());
+            if (testList.empty()) {
+                std::ostringstream oss;
+                oss << _testName << "::Receiver::getTestListSizeMb: List empty";
+                throw qpidit::ArgumentError(oss.str());
+            }
+            std::string elt = testList[0].get<std::string>();
+            uint32_t numElements = testList.size();
+            return std::pair<uint32_t, uint32_t>(numElements * elt.size() / 1024 / 1024, numElements);
+        }
+
+        std::pair<uint32_t, uint32_t> Receiver::getTestMapSizeMb(const proton::value& pvTestMap) {
+            // Uniform elt size assumed
+            const std::map<std::string, proton::value>& testMap(pvTestMap.get<std::map<std::string, proton::value> >());
+            if (testMap.empty()) {
+                std::ostringstream oss;
+                oss << _testName << "::Receiver::getTestMapSizeMb: Map empty";
+                throw qpidit::ArgumentError(oss.str());
+            }
+            std::string elt = testMap.begin()->second.get<std::string>();
+            uint32_t numElements = testMap.size();
+            return std::pair<uint32_t, uint32_t>(numElements * elt.size() / 1024 / 1024, numElements);
+        }
+
+        uint32_t Receiver::getTestStringSizeMb(const proton::value& testString) {
+            if (_amqpType.compare("binary") == 0) {
+                return testString.get<proton::binary>().size() / 1024 / 1024;
+            }
+            if (_amqpType.compare("string") == 0) {
+                return testString.get<std::string>().size() / 1024 / 1024;
+            }
+            if (_amqpType.compare("symbol") == 0) {
+                return testString.get<proton::symbol>().size() / 1024 / 1024;
+            }
+        }
+
+        void Receiver::appendListMapSize(Json::Value& numEltsList, std::pair<uint32_t, uint32_t> val) {
+            numEltsList.append(val.second);
+        }
+
+        void Receiver::createNewListMapSize(std::pair<uint32_t, uint32_t> val) {
+            Json::Value sizeVal(Json::arrayValue);
+            sizeVal.append(val.first);
+            Json::Value numEltsList(Json::arrayValue);
+            numEltsList.append(val.second);
+            sizeVal.append(numEltsList);
+            _receivedValueList.append(sizeVal);
+        }
+
     } /* namespace amqp_large_content_test */
 } /* namespace qpidit */
 
@@ -35,9 +148,26 @@ namespace qpidit
  * --- main ---
  * Args: 1: Broker address (ip-addr:port)
  *       2: Queue name
- *       ...
+ *       3: AMQP type
+ *       4: Expected number of test values to receive
  */
 
 int main(int argc, char** argv) {
+    // TODO: improve arg management a little...
+    if (argc != 5) {
+        throw qpidit::ArgumentError("Incorrect number of arguments");
+    }
+
+    try {
+        qpidit::amqp_large_content_test::Receiver receiver(argv[1], argv[2], argv[3], std::strtoul(argv[4], NULL, 0));
+        proton::default_container(receiver).run();
+
+        std::cout << argv[3] << std::endl;
+        Json::FastWriter fw;
+        std::cout << fw.write(receiver.getReceivedValueList());
+    } catch (const std::exception& e) {
+        std::cerr << "amqp_large_content_test receiver error: " << e.what() << std::endl;
+        exit(-1);
+    }
     exit(0);
 }

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Receiver.hpp
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Receiver.hpp b/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Receiver.hpp
index 1e56457..388fb26 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Receiver.hpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Receiver.hpp
@@ -22,15 +22,34 @@
 #ifndef SRC_QPIDIT_AMQP_LARGE_CONTENT_TEST_RECEIVER_HPP_
 #define SRC_QPIDIT_AMQP_LARGE_CONTENT_TEST_RECEIVER_HPP_
 
-#include "proton/messaging_handler.hpp"
+#include <json/value.h>
+#include "proton/value.hpp"
+#include "qpidit/AmqpReceiverBase.hpp"
 
 namespace qpidit
 {
     namespace amqp_large_content_test
     {
 
-        class Receiver : public proton::messaging_handler
+        class Receiver : public qpidit::AmqpReceiverBase
         {
+        protected:
+            const std::string _amqpType;
+            uint32_t _expected;
+            uint32_t _received;
+            Json::Value _receivedValueList;
+        public:
+            Receiver(const std::string& brokerAddr, const std::string& queueName, const std::string& amqpType, uint32_t exptected);
+            virtual ~Receiver();
+
+            Json::Value& getReceivedValueList();
+            void on_message(proton::delivery &d, proton::message &m);
+        protected:
+            std::pair<uint32_t, uint32_t> getTestListSizeMb(const proton::value& testList);
+            std::pair<uint32_t, uint32_t> getTestMapSizeMb(const proton::value& testMap);
+            uint32_t getTestStringSizeMb(const proton::value& testString);
+            void appendListMapSize(Json::Value& numEltsList, std::pair<uint32_t, uint32_t> val);
+            void createNewListMapSize(std::pair<uint32_t, uint32_t> val);
         };
 
     } /* namespace amqp_large_content_test */

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.cpp
----------------------------------------------------------------------
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 dd86497..eb4eb8a 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,13 +21,121 @@
 
 #include "qpidit/amqp_large_content_test/Sender.hpp"
 
-#include <stdlib.h> // exit()
+#include <iomanip>
+#include <iostream>
+#include <json/json.h>
+#include "proton/default_container.hpp"
+#include "proton/connection.hpp"
+#include "proton/sender.hpp"
+#include "qpidit/QpidItErrors.hpp"
 
 namespace qpidit
 {
     namespace amqp_large_content_test
     {
-    } /* namespace amqp_large_content_test */
+
+        Sender::Sender(const std::string& brokerAddr,
+                       const std::string& queueName,
+                       const std::string& amqpType,
+                       const Json::Value& testValues) :
+                        AmqpSenderBase("amqp_large_content_test::Sender", brokerAddr, queueName, testValues.size()),
+                        _amqpType(amqpType),
+                        _testValues(testValues)
+        {}
+
+        Sender::~Sender() {}
+
+        void Sender::on_sendable(proton::sender &s) {
+            if (_totalMsgs == 0) {
+                s.connection().close();
+            } else if (_msgsSent == 0) {
+                for (Json::Value::const_iterator i=_testValues.begin(); i!=_testValues.end(); ++i) {
+                    if (s.credit()) {
+                        uint32_t totSizeMb;
+                        Json::Value numElementsList = Json::arrayValue;
+                        if (i->isInt()) {
+                            totSizeMb = i->asInt();
+                            numElementsList.append(1);
+                        } else if (i->isArray()) {
+                            totSizeMb = (*i)[0].asInt();
+                            numElementsList = (*i)[1];
+                        } else {
+                            std::cerr << "on_sendable: Unexpected JSON type: " << i->type() << std::endl;
+                        }
+                        for (Json::Value::const_iterator numElementsAsStrItr=numElementsList.begin();
+                                                         numElementsAsStrItr!=numElementsList.end();
+                                                         ++numElementsAsStrItr) {
+                            proton::message msg;
+                            setMessage(msg, totSizeMb * 1024 * 1024, numElementsAsStrItr->asInt());
+                            s.send(msg);
+                            _msgsSent++;
+                        }
+                    }
+                }
+            } else {
+                // do nothing
+            }
+        }
+
+        // protected
+
+        proton::message& Sender::setMessage(proton::message& msg,
+                                            uint32_t totSizeBytes,
+                                            uint32_t numElements) {
+            if (_amqpType.compare("binary") == 0) {
+                proton::binary val(createTestString(totSizeBytes));
+                msg.body(val);
+            } else if (_amqpType.compare("string") == 0) {
+                msg.body(createTestString(totSizeBytes));
+            } else if (_amqpType.compare("symbol") == 0) {
+                proton::symbol val(createTestString(totSizeBytes));
+                msg.body(val);
+            } else if (_amqpType.compare("list") == 0) {
+                std::vector<proton::value> testList;
+                createTestList(testList, totSizeBytes, numElements);
+                msg.body(testList);
+            } else if (_amqpType.compare("map") == 0) {
+                std::map<std::string, proton::value> testMap;
+                createTestMap(testMap, totSizeBytes, numElements);
+                msg.body(testMap);
+            }
+           return msg;
+        }
+
+        // static
+        void Sender::createTestList(std::vector<proton::value>& testList,
+                                    uint32_t totSizeBytes,
+                                    uint32_t numElements) {
+
+            uint32_t sizePerEltBytes = totSizeBytes / numElements;
+            for (uint32_t i=0; i<numElements; ++i) {
+                testList.push_back(createTestString(sizePerEltBytes));
+            }
+        }
+
+        // static
+        void Sender::createTestMap(std::map<std::string, proton::value>& testMap,
+                                   uint32_t totSizeBytes,
+                                   uint32_t numElements) {
+
+            uint32_t sizePerEltBytes = totSizeBytes / numElements;
+            for (uint32_t i=0; i<numElements; ++i) {
+                std::ostringstream oss;
+                oss << "elt_" << std::setw(6) << std::setfill('0') << i;
+                testMap[oss.str()] = createTestString(sizePerEltBytes);
+            }
+        }
+
+        //static
+        std::string Sender::createTestString(uint32_t msgSizeBytes) {
+            std::ostringstream oss;
+            for (uint32_t i=0; i<msgSizeBytes; ++i) {
+                oss << char('a' + (i%26));
+            }
+            return oss.str();
+        }
+
+   } /* namespace amqp_large_content_test */
 } /* namespace qpidit */
 
 
@@ -35,9 +143,28 @@ namespace qpidit
  * --- main ---
  * Args: 1: Broker address (ip-addr:port)
  *       2: Queue name
- *       ...
+ *       3: AMQP type
+ *       4: Test value(s) as JSON string
  */
 
 int main(int argc, char** argv) {
+    // TODO: improve arg management a little...
+    if (argc != 5) {
+        throw qpidit::ArgumentError("Incorrect number of arguments");
+    }
+
+    try {
+        Json::Value testValues;
+        Json::Reader jsonReader;
+        if (not jsonReader.parse(argv[4], testValues, false)) {
+            throw qpidit::JsonParserError(jsonReader);
+        }
+
+        qpidit::amqp_large_content_test::Sender sender(argv[1], argv[2], argv[3], testValues);
+        proton::default_container(sender).run();
+    } catch (const std::exception& e) {
+        std::cerr << "amqp_large_content_test Sender error: " << e.what() << std::endl;
+        exit(1);
+    }
     exit(0);
 }

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.hpp
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.hpp b/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.hpp
index 887aec8..44c55ee 100644
--- a/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.hpp
+++ b/shims/qpid-proton-cpp/src/qpidit/amqp_large_content_test/Sender.hpp
@@ -22,16 +22,41 @@
 #ifndef SRC_QPIDIT_AMQP_LARGE_CONTENT_TEST_SENDER_HPP_
 #define SRC_QPIDIT_AMQP_LARGE_CONTENT_TEST_SENDER_HPP_
 
-#include "proton/messaging_handler.hpp"
-
+#include <json/value.h>
+#include <proton/value.hpp>
+#include "qpidit/AmqpSenderBase.hpp"
 
 namespace qpidit
 {
     namespace amqp_large_content_test
     {
 
-        class Sender : public proton::messaging_handler
+        class Sender : public qpidit::AmqpSenderBase
         {
+        protected:
+            const std::string _amqpType;
+            const Json::Value _testValues;
+
+        public:
+            Sender(const std::string& brokerAddr,
+                   const std::string& queueName,
+                   const std::string& amqpType,
+                   const Json::Value& testValues);
+            virtual ~Sender();
+
+            void on_sendable(proton::sender &s);
+
+        protected:
+            proton::message& setMessage(proton::message& msg,
+                                        uint32_t totSizeBytes,
+                                        uint32_t numElements);
+            static void createTestList(std::vector<proton::value>& testList,
+                                       uint32_t totSizeBytes,
+                                       uint32_t numElements);
+            static void createTestMap(std::map<std::string, proton::value>& testMap,
+                                      uint32_t totSizeBytes,
+                                      uint32_t numElements);
+            static std::string createTestString(uint32_t msgSizeBytes);
         };
 
     } /* namespace amqp_large_content_test */

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Receiver.cpp
----------------------------------------------------------------------
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 56242ad..22f4aed 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
@@ -36,9 +36,11 @@ namespace qpidit
     {
 
         Receiver::Receiver(const std::string& brokerUrl,
+                           const std::string& queueName,
                            const std::string& amqpType,
                            uint32_t expected) :
                         _brokerUrl(brokerUrl),
+                        _queueName(queueName),
                         _amqpType(amqpType),
                         _expected(expected),
                         _received(0UL),
@@ -52,7 +54,9 @@ namespace qpidit
         }
 
         void Receiver::on_container_start(proton::container &c) {
-            c.open_receiver(_brokerUrl);
+            std::ostringstream oss;
+            oss << _brokerUrl << "/" << _queueName;
+            c.open_receiver(oss.str());
         }
 
         void Receiver::on_message(proton::delivery &d, proton::message &m) {
@@ -272,11 +276,8 @@ int main(int argc, char** argv) {
         throw qpidit::ArgumentError("Incorrect number of arguments");
     }
 
-    std::ostringstream oss;
-    oss << argv[1] << "/" << argv[2];
-
     try {
-        qpidit::amqp_types_test::Receiver receiver(oss.str(), argv[3], std::strtoul(argv[4], NULL, 0));
+        qpidit::amqp_types_test::Receiver receiver(argv[1], argv[2], argv[3], std::strtoul(argv[4], NULL, 0));
         proton::default_container(receiver).run();
 
         std::cout << argv[3] << std::endl;

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Receiver.hpp
----------------------------------------------------------------------
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 5ed67be..3e180d3 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
@@ -37,12 +37,13 @@ namespace qpidit
         {
         protected:
             const std::string _brokerUrl;
+            const std::string _queueName;
             const std::string _amqpType;
             uint32_t _expected;
             uint32_t _received;
             Json::Value _receivedValueList;
         public:
-            Receiver(const std::string& brokerUrl, const std::string& amqpType, uint32_t exptected);
+            Receiver(const std::string& brokerUrl, const std::string& queueName, const std::string& amqpType, uint32_t exptected);
             virtual ~Receiver();
             Json::Value& getReceivedValueList();
             void on_container_start(proton::container &c);

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.cpp
----------------------------------------------------------------------
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 113f23f..1e6b80b 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
@@ -21,40 +21,29 @@
 
 #include "qpidit/amqp_types_test/Sender.hpp"
 
+#include <iomanip>
 #include <iostream>
 #include <json/json.h>
 #include "proton/connection.hpp"
 #include "proton/default_container.hpp"
 #include "proton/sender.hpp"
-#include "proton/tracker.hpp"
-#include "proton/transport.hpp"
 
 namespace qpidit
 {
     namespace amqp_types_test
     {
 
-        Sender::Sender(const std::string& brokerUrl,
+        Sender::Sender(const std::string& brokerAddr,
                        const std::string& queueName,
                        const std::string& amqpType,
                        const Json::Value& testValues) :
-                        _brokerUrl(brokerUrl),
-                        _queueName(queueName),
+                        AmqpSenderBase("amqp_types_test::Sender", brokerAddr, queueName, testValues.size()),
                         _amqpType(amqpType),
-                        _testValues(testValues),
-                        _msgsSent(0),
-                        _msgsConfirmed(0),
-                        _totalMsgs(testValues.size())
+                        _testValues(testValues)
         {}
 
         Sender::~Sender() {}
 
-        void Sender::on_container_start(proton::container &c) {
-            std::ostringstream oss;
-            oss << _brokerUrl << "/" << _queueName;
-            c.open_sender(oss.str());
-        }
-
         void Sender::on_sendable(proton::sender &s) {
             if (_totalMsgs == 0) {
                 s.connection().close();
@@ -71,37 +60,6 @@ namespace qpidit
             }
         }
 
-        void Sender::on_tracker_accept(proton::tracker &t) {
-            _msgsConfirmed++;
-            if (_msgsConfirmed == _totalMsgs) {
-                t.connection().close();
-            }
-        }
-
-        void Sender::on_transport_close(proton::transport &t) {
-            _msgsSent = _msgsConfirmed;
-        }
-
-        void Sender::on_connection_error(proton::connection &c) {
-            std::cerr << "AmqpSender::on_connection_error(): " << c.error() << std::endl;
-        }
-
-        void Sender::on_sender_error(proton::sender &s) {
-            std::cerr << "AmqpSender::on_sender_error(): " << s.error() << std::endl;
-        }
-
-        void Sender::on_session_error(proton::session &s) {
-            std::cerr << "AmqpSender::on_session_error(): " << s.error() << std::endl;
-        }
-
-        void Sender::on_transport_error(proton::transport &t) {
-            std::cerr << "AmqpSender::on_transport_error(): " << t.error() << std::endl;
-        }
-
-        void Sender::on_error(const proton::error_condition &ec) {
-            std::cerr << "AmqpSender::on_error(): " << ec << std::endl;
-        }
-
         // protected
 
         proton::message& Sender::setMessage(proton::message& msg, const Json::Value& testValue) {

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-cpp/src/qpidit/amqp_types_test/Sender.hpp
----------------------------------------------------------------------
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 2ccabaf..aed7469 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
@@ -22,10 +22,9 @@
 #ifndef SRC_QPIDIT_AMQP_TYPES_TEST_SENDER_HPP_
 #define SRC_QPIDIT_AMQP_TYPES_TEST_SENDER_HPP_
 
-#include <iomanip>
 #include <json/value.h>
-#include "proton/messaging_handler.hpp"
 #include "proton/message.hpp"
+#include "qpidit/AmqpSenderBase.hpp"
 #include "qpidit/QpidItErrors.hpp"
 
 namespace qpidit
@@ -33,29 +32,18 @@ namespace qpidit
     namespace amqp_types_test
     {
 
-        class Sender : public proton::messaging_handler
+        class Sender : public qpidit::AmqpSenderBase
         {
         protected:
-            const std::string _brokerUrl;
-            const std::string _queueName;
             const std::string _amqpType;
             const Json::Value _testValues;
-            uint32_t _msgsSent;
-            uint32_t _msgsConfirmed;
-            uint32_t _totalMsgs;
+
         public:
-            Sender(const std::string& brokerUrl, const std::string& queueName, const std::string& amqpType, const Json::Value& testValues);
+            Sender(const std::string& brokerAddr, const std::string& queueName, const std::string& amqpType, const Json::Value& testValues);
             virtual ~Sender();
-            void on_container_start(proton::container &c);
+
             void on_sendable(proton::sender &s);
-            void on_tracker_accept(proton::tracker &t);
-            void on_transport_close(proton::transport &t);
 
-            void on_connection_error(proton::connection &c);
-            void on_session_error(proton::session &s);
-            void on_sender_error(proton::sender& s);
-            void on_transport_error(proton::transport &t);
-            void on_error(const proton::error_condition &c);
         protected:
             proton::message& setMessage(proton::message& msg, const Json::Value& testValue);
 

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-python/src/amqp_dtx_test/Receiver.py
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-python/src/amqp_dtx_test/Receiver.py b/shims/qpid-proton-python/src/amqp_dtx_test/Receiver.py
index 0982511..ac662eb 100755
--- a/shims/qpid-proton-python/src/amqp_dtx_test/Receiver.py
+++ b/shims/qpid-proton-python/src/amqp_dtx_test/Receiver.py
@@ -55,11 +55,11 @@ class AmqpDtxTestReceiver(MessagingHandler):
         """Event callback when a message is received by the client"""
         if event.message.id and event.message.id < self.received:
             return # ignore duplicate message
-        if self.expected == 0 or self.received < self.expected:
-            # do something here
-            if self.received >= self.expected:
-                event.receiver.close()
-                event.connection.close()
+        if self.received < self.expected:
+            pass # do something here
+        if self.received >= self.expected:
+            event.receiver.close()
+            event.connection.close()
 
 # --- main ---
 # Args: 1: Broker address (ip-addr:port)

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-python/src/amqp_features_test/Receiver.py
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-python/src/amqp_features_test/Receiver.py b/shims/qpid-proton-python/src/amqp_features_test/Receiver.py
index 0b3edf8..392acb0 100755
--- a/shims/qpid-proton-python/src/amqp_features_test/Receiver.py
+++ b/shims/qpid-proton-python/src/amqp_features_test/Receiver.py
@@ -68,11 +68,11 @@ class AmqpFeaturesTestReceiver(MessagingHandler):
         """Event callback when a message is received by the client"""
         if event.message.id and event.message.id < self.received:
             return # ignore duplicate message
-        if self.expected == 0 or self.received < self.expected:
-            # do something here
-            if self.received == self.expected:
-                event.receiver.close()
-                event.connection.close()
+        if self.received < self.expected:
+            pass # do something here
+        if self.received >= self.expected:
+            event.receiver.close()
+            event.connection.close()
 
 # --- main ---
 # Args: 1: Broker address (ip-addr:port)

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-python/src/amqp_large_content_test/Receiver.py
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-python/src/amqp_large_content_test/Receiver.py b/shims/qpid-proton-python/src/amqp_large_content_test/Receiver.py
index d7407d3..362fffb 100755
--- a/shims/qpid-proton-python/src/amqp_large_content_test/Receiver.py
+++ b/shims/qpid-proton-python/src/amqp_large_content_test/Receiver.py
@@ -23,10 +23,12 @@ AMQP large content test receiver shim for qpid-interop-test
 # under the License.
 #
 
+from json import dumps
 import os.path
 import sys
 from traceback import format_exc
 
+from proton import symbol
 from proton.handlers import MessagingHandler
 from proton.reactor import Container
 
@@ -35,12 +37,13 @@ class AmqpLargeContentTestReceiver(MessagingHandler):
     Reciver shim for AMQP dtx test
     ...
     """
-    def __init__(self, broker_url, queue_name):
+    def __init__(self, broker_url, queue_name, amqp_type, num_expected_messages_str):
         super(AmqpLargeContentTestReceiver, self).__init__()
         self.broker_url = broker_url
         self.queue_name = queue_name
+        self.amqp_type = amqp_type
         self.received_value_list = []
-        self.expected = int('0')
+        self.expected = int(num_expected_messages_str)
         self.received = 0
 
     def get_received_value_list(self):
@@ -53,21 +56,72 @@ class AmqpLargeContentTestReceiver(MessagingHandler):
 
     def on_message(self, event):
         """Event callback when a message is received by the client"""
-        if event.message.id and event.message.id < self.received:
-            return # ignore duplicate message
-        if self.expected == 0 or self.received < self.expected:
-            # do something here
-            if self.received == self.expected:
-                event.receiver.close()
-                event.connection.close()
+        if self.received < self.expected:
+            if self.amqp_type == 'binary' or self.amqp_type == 'string' or self.amqp_type == 'symbol':
+                self.received_value_list.append(self.get_str_message_size(event.message.body))
+            else:
+                if self.amqp_type == 'list':
+                    size, num_elts = self.get_list_size(event.message.body)
+                else:
+                    size, num_elts = self.get_map_size(event.message.body)
+                if len(self.received_value_list) == 0: # list is empty
+                    self.received_value_list.append((size, [num_elts]))
+                else:
+                    found = False
+                    for last_size, last_num_elts_list in self.received_value_list:
+                        if size == last_size:
+                            last_num_elts_list.append(num_elts)
+                            found = True
+                            break
+                    if not found:
+                        self.received_value_list.append((size, [num_elts]))
+            self.received += 1
+        if self.received >= self.expected:
+            event.receiver.close()
+            event.connection.close()
+
+    @staticmethod
+    def get_str_message_size(message):
+        """Find the size of a bytes, unicode or symbol message in MB"""
+        if isinstance(message, bytes) or isinstance(message, unicode) or isinstance(message, symbol):
+            return len(str(message)) / 1024 / 1024 # in MB
+        return None
+
+    @staticmethod
+    def get_list_size(message):
+        """
+        Get total size and number of elements of a uniform (all elts same size) list. Return a tuple
+        (tot_size, num_elts) where tot_size = num_elts * elt_size
+        """
+        if isinstance(message, list):
+            num_elts = len(message)
+            elt_size = len(message[0])
+            return (elt_size * num_elts / 1024 / 1024, num_elts)
+        return None
+
+    @staticmethod
+    def get_map_size(message):
+        """
+        Get total size and number of elements of a uniform (all elts same size) map. Return a tuple
+        (tot_size, num_elts) where tot_size = num_elts * elt_size. Note that key size is excluded from size.
+        """
+        if isinstance(message, dict):
+            keys = message.keys()
+            num_elts = len(keys)
+            elt_size = len(message[keys[0]])
+            return (elt_size * num_elts / 1024 / 1024, num_elts)
+        return None
 
 # --- main ---
 # Args: 1: Broker address (ip-addr:port)
 #       2: Queue name
-#       ...
+#       3: AMQP type
+#       4: Expected number of test values to receive
 try:
-    RECEIVER = AmqpLargeContentTestReceiver(sys.argv[1], sys.argv[2])
+    RECEIVER = AmqpLargeContentTestReceiver(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])
     Container(RECEIVER).run()
+    print sys.argv[3]
+    print dumps(RECEIVER.get_received_value_list())
 except KeyboardInterrupt:
     pass
 except Exception as exc:

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-python/src/amqp_large_content_test/Sender.py
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-python/src/amqp_large_content_test/Sender.py b/shims/qpid-proton-python/src/amqp_large_content_test/Sender.py
index 0d09336..8037330 100755
--- a/shims/qpid-proton-python/src/amqp_large_content_test/Sender.py
+++ b/shims/qpid-proton-python/src/amqp_large_content_test/Sender.py
@@ -23,10 +23,12 @@ AMQP large content test sender shim for qpid-interop-test
 # under the License.
 #
 
+from json import loads
 import os.path
 import sys
 from traceback import format_exc
 
+from proton import Message, symbol
 from proton.handlers import MessagingHandler
 from proton.reactor import Container
 
@@ -35,11 +37,12 @@ class AmqpLargeContentTestSender(MessagingHandler):
     Sender shim for AMQP dtx test
     ...
     """
-    def __init__(self, broker_url, queue_name):
+    def __init__(self, broker_url, queue_name, amqp_type, test_value_list):
         super(AmqpLargeContentTestSender, self).__init__()
         self.broker_url = broker_url
         self.queue_name = queue_name
-        self.test_value_list = []
+        self.amqp_type = amqp_type
+        self.test_value_list = test_value_list
         self.sent = 0
         self.confirmed = 0
         self.total = len(self.test_value_list)
@@ -53,21 +56,64 @@ class AmqpLargeContentTestSender(MessagingHandler):
         if self.sent == 0:
             for test_value in self.test_value_list:
                 if event.sender.credit:
-                    message = self.create_message(test_value)
-                    if message is not None:
-                        event.sender.send(message)
-                        self.sent += 1
+                    if isinstance(test_value, list):
+                        tot_size_str, num_elts_str_list = test_value
                     else:
-                        event.connection.close()
-                        return
+                        tot_size_str = test_value
+                        num_elts_str_list = ['1']
+                    for num_elts_str in num_elts_str_list:
+                        message = self.create_message(1024 * 1024 * int(tot_size_str), int(num_elts_str))
+                        if message is not None:
+                            event.sender.send(message)
+                            self.sent += 1
+                        else:
+                            event.connection.close()
+                            return
 
-    def create_message(self, test_value):
+    def create_message(self, tot_size_bytes, num_elts):
         """
         Creates a single message with the test value translated from its string representation to the appropriate
-        AMQP value (set in self.amqp_type).
+        AMQP value.
         """
+        if self.amqp_type == 'binary':
+            return Message(body=bytes(AmqpLargeContentTestSender.create_test_string(tot_size_bytes)))
+        if self.amqp_type == 'string':
+            return Message(body=unicode(AmqpLargeContentTestSender.create_test_string(tot_size_bytes)))
+        if self.amqp_type == 'symbol':
+            return Message(body=symbol(AmqpLargeContentTestSender.create_test_string(tot_size_bytes)))
+        if self.amqp_type == 'list':
+            return Message(body=AmqpLargeContentTestSender.create_test_list(tot_size_bytes, num_elts))
+        if self.amqp_type == 'map':
+            return Message(body=AmqpLargeContentTestSender.create_test_map(tot_size_bytes, num_elts))
         return None
 
+    @staticmethod
+    def create_test_string(size_bytes):
+        """Create a string "abcdef..." (repeating lowercase only) of size bytes"""
+        test_str = ''
+        for num in range(size_bytes):
+            test_str += chr(ord('a') + (num%26))
+        return test_str
+
+    @staticmethod
+    def create_test_list(tot_size_bytes, num_elts):
+        """Create a list containing num_elts with a sum of all elements being tot_size_bytes"""
+        size_per_elt_bytes = tot_size_bytes / num_elts
+        test_list = []
+        for _ in range(num_elts):
+            test_list.append(unicode(AmqpLargeContentTestSender.create_test_string(size_per_elt_bytes)))
+        return test_list
+
+    @staticmethod
+    def create_test_map(tot_size_bytes, num_elts):
+        """Create a map containing num_elts with a sum of all elements being tot_size_bytes (excluding keys)"""
+        size_per_elt_bytes = tot_size_bytes / num_elts
+        test_map = {}
+        for elt_no in range(num_elts):
+            test_map[unicode('elt_%06d' % elt_no)] = \
+                unicode(AmqpLargeContentTestSender.create_test_string(size_per_elt_bytes))
+        return test_map
+
     def on_accepted(self, event):
         """Event callback for when a sent message is accepted by the broker"""
         self.confirmed += 1
@@ -82,9 +128,10 @@ class AmqpLargeContentTestSender(MessagingHandler):
 # --- main ---
 # Args: 1: Broker address (ip-addr:port)
 #       2: Queue name
-#       ...
+#       3: AMQP type
+#       4: Test value(s) as JSON string
 try:
-    SENDER = AmqpLargeContentTestSender(sys.argv[1], sys.argv[2])
+    SENDER = AmqpLargeContentTestSender(sys.argv[1], sys.argv[2], sys.argv[3], loads(sys.argv[4]))
     Container(SENDER).run()
 except KeyboardInterrupt:
     pass

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-python/src/amqp_types_test/Receiver.py
----------------------------------------------------------------------
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 d26d404..f075977 100755
--- a/shims/qpid-proton-python/src/amqp_types_test/Receiver.py
+++ b/shims/qpid-proton-python/src/amqp_types_test/Receiver.py
@@ -63,7 +63,7 @@ class AmqpTypesTestReceiver(MessagingHandler):
         """Event callback when a message is received by the client"""
         if event.message.id and event.message.id < self.received:
             return # ignore duplicate message
-        if self.expected == 0 or self.received < self.expected:
+        if self.received < self.expected:
             if self.amqp_type == 'null' or \
                self.amqp_type == 'boolean' or \
                self.amqp_type == 'uuid':
@@ -109,9 +109,9 @@ class AmqpTypesTestReceiver(MessagingHandler):
                 print 'receive: Unsupported AMQP type "%s"' % self.amqp_type
                 return
             self.received += 1
-            if self.received == self.expected:
-                event.receiver.close()
-                event.connection.close()
+        if self.received >= self.expected:
+            event.receiver.close()
+            event.connection.close()
 
 # --- main ---
 # Args: 1: Broker address (ip-addr:port)

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-python/src/jms_dtx_test/Receiver.py
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-python/src/jms_dtx_test/Receiver.py b/shims/qpid-proton-python/src/jms_dtx_test/Receiver.py
index 88a1046..8c8c18f 100755
--- a/shims/qpid-proton-python/src/jms_dtx_test/Receiver.py
+++ b/shims/qpid-proton-python/src/jms_dtx_test/Receiver.py
@@ -55,11 +55,11 @@ class JmsDtxTestReceiver(MessagingHandler):
         """Event callback when a message is received by the client"""
         if event.message.id and event.message.id < self.received:
             return # ignore duplicate message
-        if self.expected == 0 or self.received < self.expected:
-            # do something here
-            if self.received >= self.expected:
-                event.receiver.close()
-                event.connection.close()
+        if self.received < self.expected:
+            pass # do something here
+        if self.received >= self.expected:
+            event.receiver.close()
+            event.connection.close()
 
 
 # --- main ---

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-python/src/jms_hdrs_props_test/Receiver.py
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-python/src/jms_hdrs_props_test/Receiver.py b/shims/qpid-proton-python/src/jms_hdrs_props_test/Receiver.py
index b581906..fb83aad 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
@@ -80,7 +80,7 @@ class JmsHdrsPropsTestReceiver(MessagingHandler):
         """Event callback when a message is received by the client"""
         if event.message.id and event.message.id < self.received:
             return # ignore duplicate message
-        if self.expected == 0 or self.received < self.expected:
+        if self.received < self.expected:
             if self.current_subtype is None:
                 self.current_subtype = self.subtype_itr.next()
                 self.current_subtype_msg_list = []
@@ -92,9 +92,9 @@ class JmsHdrsPropsTestReceiver(MessagingHandler):
                 self.current_subtype = None
                 self.current_subtype_msg_list = []
             self.received += 1
-            if self.received == self.expected:
-                event.receiver.close()
-                event.connection.close()
+        if self.received >= self.expected:
+            event.receiver.close()
+            event.connection.close()
 
     def on_connection_error(self, event):
         print 'JmsReceiverShim.on_connection_error'

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-python/src/jms_large_content_test/Receiver.py
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-python/src/jms_large_content_test/Receiver.py b/shims/qpid-proton-python/src/jms_large_content_test/Receiver.py
index f673500..d4da1bc 100755
--- a/shims/qpid-proton-python/src/jms_large_content_test/Receiver.py
+++ b/shims/qpid-proton-python/src/jms_large_content_test/Receiver.py
@@ -55,11 +55,11 @@ class JmsLargeContentTestReceiver(MessagingHandler):
         """Event callback when a message is received by the client"""
         if event.message.id and event.message.id < self.received:
             return # ignore duplicate message
-        if self.expected == 0 or self.received < self.expected:
-            # do something here
-            if self.received >= self.expected:
-                event.receiver.close()
-                event.connection.close()
+        if self.received < self.expected:
+            pass # do something here
+        if self.received >= self.expected:
+            event.receiver.close()
+            event.connection.close()
 
 
 # --- main ---

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/shims/qpid-proton-python/src/jms_messages_test/Receiver.py
----------------------------------------------------------------------
diff --git a/shims/qpid-proton-python/src/jms_messages_test/Receiver.py b/shims/qpid-proton-python/src/jms_messages_test/Receiver.py
index 220ddb9..e2a1f55 100755
--- a/shims/qpid-proton-python/src/jms_messages_test/Receiver.py
+++ b/shims/qpid-proton-python/src/jms_messages_test/Receiver.py
@@ -67,7 +67,7 @@ class JmsMessagesTestReceiver(MessagingHandler):
         """Event callback when a message is received by the client"""
         if event.message.id and event.message.id < self.received:
             return # ignore duplicate message
-        if self.expected == 0 or self.received < self.expected:
+        if self.received < self.expected:
             if self.current_subtype is None:
                 self.current_subtype = self.subtype_itr.next()
                 self.current_subtype_msg_list = []
@@ -77,9 +77,9 @@ class JmsMessagesTestReceiver(MessagingHandler):
                 self.current_subtype = None
                 self.current_subtype_msg_list = []
             self.received += 1
-            if self.received == self.expected:
-                event.receiver.close()
-                event.connection.close()
+        if self.received >= self.expected:
+            event.receiver.close()
+            event.connection.close()
 
     def on_connection_error(self, event):
         print 'JmsMessagesTestReceiver.on_connection_error'

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/src/python/qpid_interop_test/amqp_dtx_test.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/amqp_dtx_test.py b/src/python/qpid_interop_test/amqp_dtx_test.py
old mode 100644
new mode 100755

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/src/python/qpid_interop_test/amqp_large_content_test.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/amqp_large_content_test.py b/src/python/qpid_interop_test/amqp_large_content_test.py
old mode 100644
new mode 100755
index 497e8d5..0bf97a4
--- a/src/python/qpid_interop_test/amqp_large_content_test.py
+++ b/src/python/qpid_interop_test/amqp_large_content_test.py
@@ -27,16 +27,14 @@ import argparse
 import sys
 import unittest
 
-#from itertools import product
-#from json import dumps
+from itertools import product
+from json import dumps
 from os import getenv, path
-#from time import mktime, time
-#from uuid import UUID, uuid4
 
 from proton import symbol
-#import qpid_interop_test.broker_properties
+import qpid_interop_test.broker_properties
 import qpid_interop_test.shims
-#from qpid_interop_test.test_type_map import TestTypeMap
+from qpid_interop_test.test_type_map import TestTypeMap
 
 # TODO: propose a sensible default when installation details are worked out
 QPID_INTEROP_TEST_HOME = getenv('QPID_INTEROP_TEST_HOME')
@@ -44,20 +42,21 @@ if QPID_INTEROP_TEST_HOME is None:
     print 'ERROR: Environment variable QPID_INTEROP_TEST_HOME is not set'
     sys.exit(1)
 
-
-
 class AmqpVariableSizeTypes(TestTypeMap):
     """
-    Class which contains all the described AMQP primitive types and the test values to be used in testing.
+    Class which contains all the described AMQP variable-size types and the test values to be used in testing.
     """
 
-    VARIABLE_SIZE_TYPE_MAP = {
-        'binary': b'abcdefghijklmnopqrstuvwxyz0123456789',
-        'string': u'abcdefghijklmnopqrstuvwxyz0123456789',
-        'symbol': 'abcdefghijklmnopqrstuvwxyz0123456789',
-        'list': [],
-        'map': {},
-        'array': [],
+    TYPE_MAP = {
+        # List of sizes in Mb
+        'binary': [1, 10, 100],
+        'string': [1, 10, 100],
+        'symbol': [1, 10, 100],
+        # Tuple of two elements: (tot size of list/map in MB, List of no elements in list)
+        # The num elements lists are powers of 2 so that they divide evenly into the size in MB (1024 * 1024 bytes)
+        'list': [[1, [1, 16, 256, 4096]], [10, [1, 16, 256, 4096]], [100, [1, 16, 256, 4096]]],
+        'map': [[1, [1, 16, 256, 4096]], [10, [1, 16, 256, 4096]], [100, [1, 16, 256, 4096]]],
+        #'array': [[1, [1, 16, 256, 4096]], [10, [1, 16, 256, 4096]], [100, [1, 16, 256, 4096]]]
         }
 
     # This section contains tests that should be skipped because of know issues that would cause the test to fail.
@@ -70,12 +69,101 @@ class AmqpLargeContentTestCase(unittest.TestCase):
     Abstract base class for AMQP large content test cases
     """
 
-    def run_test(self):
+    def run_test(self, broker_addr, amqp_type, test_value_list, send_shim, receive_shim):
         """
         Run this test by invoking the shim send method to send the test values, followed by the shim receive method
         to receive the values. Finally, compare the sent values with the received values.
         """
-        pass
+        if len(test_value_list) > 0:
+            # TODO: When Artemis can support it (in the next release), revert the queue name back to 'qpid-interop...'
+            # Currently, Artemis only supports auto-create queues for JMS, and the queue name must be prefixed by
+            # 'jms.queue.'
+            #queue_name = 'qpid-interop.simple_type_tests.%s.%s.%s' % (amqp_type, send_shim.NAME, receive_shim.NAME)
+            queue_name = 'jms.queue.qpid-interop.amqp_large_content_test.%s.%s.%s' % \
+                         (amqp_type, send_shim.NAME, receive_shim.NAME)
+
+            # Start the receive shim first (for queueless brokers/dispatch)
+            receiver = receive_shim.create_receiver(broker_addr, queue_name, amqp_type,
+                                                    str(self.get_num_messages(amqp_type, test_value_list)))
+            receiver.start()
+
+            # Start the send shim
+            sender = send_shim.create_sender(broker_addr, queue_name, amqp_type,
+                                             dumps(test_value_list))
+            sender.start()
+
+            # Wait for both shims to finish
+            sender.join_or_kill(qpid_interop_test.shims.THREAD_TIMEOUT)
+            receiver.join_or_kill(qpid_interop_test.shims.THREAD_TIMEOUT)
+
+            # Process return string from sender
+            send_obj = sender.get_return_object()
+            if send_obj is not None:
+                if isinstance(send_obj, str):
+                    if len(send_obj) > 0:
+                        self.fail('Send shim \'%s\':\n%s' % (send_shim.NAME, send_obj))
+                else:
+                    self.fail('Sender error: %s' % str(send_obj))
+
+            # Process return string from receiver
+            receive_obj = receiver.get_return_object()
+            if isinstance(receive_obj, tuple):
+                if len(receive_obj) == 2:
+                    return_amqp_type, return_test_value_list = receive_obj
+                    self.assertEqual(return_amqp_type, amqp_type,
+                                     msg='AMQP type error:\n\n    sent:%s\n\n    received:%s' % \
+                                     (amqp_type, return_amqp_type))
+                    self.assertEqual(return_test_value_list, test_value_list, msg='\n    sent:%s\nreceived:%s' % \
+                                     (test_value_list, return_test_value_list))
+                else:
+                    self.fail('Received incorrect tuple format: %s' % str(receive_obj))
+            else:
+                self.fail('Received non-tuple: %s' % str(receive_obj))
+
+    @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':
+            return len(test_value_list)
+        if amqp_type == 'list' or amqp_type == 'map':
+            tot_len = 0
+            for test_item in test_value_list:
+                tot_len += len(test_item[1])
+            return tot_len
+        return None
+
+def create_testcase_class(broker_name, types, broker_addr, amqp_type, shim_product):
+    """
+    Class factory function which creates new subclasses to AmqpTypeTestCase.
+    """
+
+    def __repr__(self):
+        """Print the class name"""
+        return self.__class__.__name__
+
+    def add_test_method(cls, send_shim, receive_shim):
+        """Function which creates a new test method in class cls"""
+
+        @unittest.skipIf(types.skip_test(amqp_type, broker_name),
+                         types.skip_test_message(amqp_type, broker_name))
+        def inner_test_method(self):
+            self.run_test(self.broker_addr, self.amqp_type, self.test_value_list, send_shim, receive_shim)
+
+        inner_test_method.__name__ = 'test_%s_%s->%s' % (amqp_type, send_shim.NAME, receive_shim.NAME)
+        setattr(cls, inner_test_method.__name__, inner_test_method)
+
+    class_name = amqp_type.title() + 'TestCase'
+    class_dict = {'__name__': class_name,
+                  '__repr__': __repr__,
+                  '__doc__': 'Test case for AMQP 1.0 simple type \'%s\'' % amqp_type,
+                  'amqp_type': amqp_type,
+                  'broker_addr': broker_addr,
+                  'test_value_list': types.get_test_values(amqp_type)}
+    new_class = type(class_name, (AmqpLargeContentTestCase,), class_dict)
+    for send_shim, receive_shim in shim_product:
+        add_test_method(new_class, send_shim, receive_shim)
+    return new_class
+
 
 
 # SHIM_MAP contains an instance of each client language shim that is to be tested as a part of this test. For
@@ -136,9 +224,7 @@ if __name__ == '__main__':
         print
         sys.stdout.flush()
 
-    # TEST_CASE_CLASSES is a list that collects all the test classes that are constructed. One class is constructed
-    # per AMQP type used as the key in map AmqpPrimitiveTypes.TYPE_MAP.
-    TEST_CASE_CLASSES = []
+    TYPES = AmqpVariableSizeTypes()
 
     # TEST_SUITE is the final suite of tests that will be run and which contains all the dynamically created
     # type classes, each of which contains a test for the combinations of client shims
@@ -149,6 +235,13 @@ if __name__ == '__main__':
         for shim in ARGS.exclude_shim:
             SHIM_MAP.pop(shim)
     # Create test classes dynamically
+    for at in sorted(TYPES.get_type_list()):
+        test_case_class = create_testcase_class(BROKER,
+                                                TYPES,
+                                                ARGS.broker,
+                                                at,
+                                                product(SHIM_MAP.values(), repeat=2))
+        TEST_SUITE.addTest(unittest.makeSuite(test_case_class))
 
     # Finally, run all the dynamically created tests
     RES = unittest.TextTestRunner(verbosity=2).run(TEST_SUITE)

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/188fb098/src/python/qpid_interop_test/shims.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/shims.py b/src/python/qpid_interop_test/shims.py
index 7835fa8..5d824ad 100644
--- a/src/python/qpid_interop_test/shims.py
+++ b/src/python/qpid_interop_test/shims.py
@@ -29,7 +29,7 @@ from threading import Thread
 from time import sleep
 
 
-THREAD_TIMEOUT = 10.0 # seconds to complete before join is forced
+THREAD_TIMEOUT = 800.0 # seconds to complete before join is forced
 
 
 class ShimWorkerThread(Thread):


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