You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ch...@apache.org on 2017/08/31 20:38:13 UTC
[1/2] qpid-interop-test git commit: QPIDIT-91: Add AmqpNetLite
large_content shim.
Repository: qpid-interop-test
Updated Branches:
refs/heads/master f920bdf76 -> 8bf7bfe4c
QPIDIT-91: Add AmqpNetLite large_content shim.
This commit requires late (v2.0.0 as yet unreleased) libraries:
* a version of AMQP.Net Lite after 2017-06-15 to support RecieverLink.Receive
TimeSpan interface.
* a version of Amqp.Net Lite after 2017-07-21 in order to work with
Qpid Dispatch Router (max-frame-size issue).
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/63243b69
Tree: http://git-wip-us.apache.org/repos/asf/qpid-interop-test/tree/63243b69
Diff: http://git-wip-us.apache.org/repos/asf/qpid-interop-test/diff/63243b69
Branch: refs/heads/master
Commit: 63243b69c4f99707e1475823bfc092eeb15629cb
Parents: f920bdf
Author: Chuck Rolke <cr...@redhat.com>
Authored: Thu Aug 31 16:23:54 2017 -0400
Committer: Chuck Rolke <cr...@redhat.com>
Committed: Thu Aug 31 16:23:54 2017 -0400
----------------------------------------------------------------------
shims/amqpnetlite/src/CMakeLists.txt | 92 ++-
.../amqp_large_content_test/Receiver/App.config | 24 +
.../Receiver/Properties/AssemblyInfo.cs | 57 ++
.../Receiver/Receiver.cs | 586 ++++++++++++++
.../Receiver/Receiver.csproj.in | 77 ++
.../Receiver/packages.config | 21 +
.../amqp_large_content_test/Sender/App.config | 24 +
.../Sender/Properties/AssemblyInfo.cs | 57 ++
.../amqp_large_content_test/Sender/Sender.cs | 782 +++++++++++++++++++
.../Sender/Sender.csproj.in | 76 ++
.../Sender/packages.config | 21 +
.../amqp_large_content_test.py | 9 +
12 files changed, 1785 insertions(+), 41 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/63243b69/shims/amqpnetlite/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/CMakeLists.txt b/shims/amqpnetlite/src/CMakeLists.txt
index d096158..26bc2d5 100644
--- a/shims/amqpnetlite/src/CMakeLists.txt
+++ b/shims/amqpnetlite/src/CMakeLists.txt
@@ -76,77 +76,87 @@ option(BUILD_AMQPNETLITE "Build AMQP.Net Lite shim under mono" ${lite_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/)
-
+# Configure/build/install a single test
+MACRO (define_lite_test testname)
# Configure the csproj files
- configure_file( amqp_types_test/Receiver/Receiver.csproj.in
- ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Receiver/Receiver.csproj
+ configure_file( ${testname}/Receiver/Receiver.csproj.in
+ ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Receiver/Receiver.csproj
@ONLY)
- configure_file( amqp_types_test/Sender/Sender.csproj.in
- ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Sender/Sender.csproj
+ configure_file( ${testname}/Sender/Sender.csproj.in
+ ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Sender/Sender.csproj
@ONLY)
# Emit the custom build commands
add_custom_target(
- amqpnetlite_amqp_types_test_Sender
+ amqpnetlite_${testname}_Sender
ALL
COMMAND xbuild Sender.csproj > xbuild.log
DEPENDS
- ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Sender/Sender.csproj
- ${CMAKE_CURRENT_SOURCE_DIR}/amqp_types_test/Sender/Sender.cs
- ${CMAKE_CURRENT_SOURCE_DIR}/amqp_types_test/Sender/Properties/AssemblyInfo.cs
- ${CMAKE_CURRENT_SOURCE_DIR}/amqp_types_test/Sender/App.config
- ${CMAKE_CURRENT_SOURCE_DIR}/amqp_types_test/Sender/packages.config
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Sender
- COMMENT Cross compiling amqpnetlite amqp_types_test/Sender
+ ${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
)
add_custom_target(
- amqpnetlite_amqp_types_test_Receiver
+ amqpnetlite_${testname}_Receiver
ALL
COMMAND xbuild Receiver.csproj > xbuild.log
DEPENDS
- ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Receiver/Receiver.csproj
- ${CMAKE_CURRENT_SOURCE_DIR}/amqp_types_test/Receiver/Receiver.cs
- ${CMAKE_CURRENT_SOURCE_DIR}/amqp_types_test/Receiver/Properties/AssemblyInfo.cs
- ${CMAKE_CURRENT_SOURCE_DIR}/amqp_types_test/Receiver/App.config
- ${CMAKE_CURRENT_SOURCE_DIR}/amqp_types_test/Receiver/packages.config
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Receiver
- COMMENT Cross compiling amqpnetlite amqp_types_test/Receiver
+ ${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
- set(LITE_INSTALL_ROOT ${CMAKE_INSTALL_PREFIX}/libexec/qpid_interop_test/shims/amqpnetlite)
install(
- FILES ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Receiver/bin/Amqp.Net.dll
- DESTINATION ${LITE_INSTALL_ROOT}/amqp_types_test/)
+ FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Receiver/bin/Amqp.Net.dll
+ DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
install(
- FILES ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Receiver/bin/Receiver.exe
- DESTINATION ${LITE_INSTALL_ROOT}/amqp_types_test/)
+ FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Receiver/bin/Receiver.exe
+ DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
install(
- FILES ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Receiver/bin/Receiver.exe.config
- DESTINATION ${LITE_INSTALL_ROOT}/amqp_types_test/)
+ FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Receiver/bin/Receiver.exe.config
+ DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
install(
- FILES ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Receiver/bin/Receiver.exe.mdb
- DESTINATION ${LITE_INSTALL_ROOT}/amqp_types_test/)
+ FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Receiver/bin/Receiver.exe.mdb
+ DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
install(
- FILES ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Sender/bin/Sender.exe
- DESTINATION ${LITE_INSTALL_ROOT}/amqp_types_test/)
+ FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Sender/bin/Sender.exe
+ DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
install(
- FILES ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Sender/bin/Sender.exe.config
- DESTINATION ${LITE_INSTALL_ROOT}/amqp_types_test/)
+ FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Sender/bin/Sender.exe.config
+ DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
install(
- FILES ${CMAKE_CURRENT_BINARY_DIR}/amqp_types_test/Sender/bin/Sender.exe.mdb
- DESTINATION ${LITE_INSTALL_ROOT}/amqp_types_test/)
+ FILES ${CMAKE_CURRENT_BINARY_DIR}/${testname}/Sender/bin/Sender.exe.mdb
+ DESTINATION ${LITE_INSTALL_ROOT}/${testname}/)
+ENDMACRO (define_lite_test)
+
+# 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)
+
+ # define tests
+ define_lite_test (amqp_types_test)
+ define_lite_test (amqp_large_content_test)
+
endif ()
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/63243b69/shims/amqpnetlite/src/amqp_large_content_test/Receiver/App.config
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/App.config b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/App.config
new file mode 100644
index 0000000..c60d743
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/App.config
@@ -0,0 +1,24 @@
+<?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
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/63243b69/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..aa2ca21
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Properties/AssemblyInfo.cs
@@ -0,0 +1,57 @@
+/*
+ *
+ * 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")]
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/63243b69/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.cs
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.cs b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.cs
new file mode 100644
index 0000000..eda4e9c
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.cs
@@ -0,0 +1,586 @@
+/*
+ *
+ * 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;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Threading;
+using Amqp;
+using Amqp.Framing;
+using Amqp.Types;
+using System.Web.Script.Serialization;
+//using Newtonsoft.Json;
+
+namespace Qpidit
+{
+
+ /// <summary>
+ /// MessageValue holds a typed AMQP.Net Lite message body AmqpValue,
+ /// decodes it, and returns the QpidIT string that represents the message.
+ /// Complex values List and Map are constructed recursively.
+ /// Remaining singleton values like int or long are held directly as strings.
+ /// </summary>
+ class MessageValue
+ {
+ // Original message body object
+ private object messageValue;
+
+ // Computed object type names
+ private string liteType;
+ private string qpiditType;
+
+ // Singleton decoded value in QpidIt format
+ private string valueString;
+
+ // Storage for List
+ private List<MessageValue> valueList;
+
+ // Storage for Map
+ // Kept as lists to avoid dictionary reordering complications.
+ private List<MessageValue> valueMapKeys;
+ private List<MessageValue> valueMapValues;
+
+ // Computed large_content object size
+ private int payloadSize;
+ private int payloadChunks;
+
+ /// <summary>
+ /// Constructor.
+ /// User must call Decode to parse values.
+ /// </summary>
+ /// <param name="messageValue">Lite AmqpValue</param>
+ public MessageValue(object messageValue)
+ {
+ this.messageValue = messageValue;
+ liteType = "";
+ qpiditType = "";
+ valueString = null;
+ valueList = null;
+ valueMapKeys = null;
+ valueMapValues = null;
+ payloadSize = 0; // total bytes received
+ payloadChunks = 0; // count of elements in list or map
+ }
+
+ /// <summary>
+ /// Lite type name property
+ /// </summary>
+ public string LiteTypeName { get { return liteType; } }
+
+ /// <summary>
+ /// QpidIt type name property
+ /// </summary>
+ public string QpiditTypeName { get { return qpiditType; } }
+
+ /// <summary>
+ /// Large_content test object size
+ /// </summary>
+ public int PayloadSize { get { return payloadSize; } }
+
+ /// <summary>
+ /// Large_content test object number of parts
+ /// </summary>
+ public int PayloadChunks { get { return payloadChunks; } }
+
+ /// <summary>
+ /// Decode the value and contained sub-values.
+ /// </summary>
+ /// <returns></returns>
+ public override string ToString()
+ {
+ if (valueString != null)
+ {
+ return "\"" + valueString + "\"";
+ }
+ else if (valueList != null)
+ {
+ StringBuilder sb = new StringBuilder();
+ bool leading = false;
+ sb.Append("[");
+ foreach (var item in valueList)
+ {
+ if (leading) sb.Append(", ");
+ leading = true;
+ sb.Append(item.ToString());
+ }
+ sb.Append("]");
+ return sb.ToString();
+ }
+ else if (valueMapKeys != null)
+ {
+ StringBuilder msb = new StringBuilder();
+ msb.Append("{");
+ for (int i = 0; i < valueMapKeys.Count; i++)
+ {
+ if (i > 0) msb.Append(", ");
+ msb.Append(valueMapKeys[i].ToString());
+ msb.Append(":");
+ msb.Append(valueMapValues[i].ToString());
+ }
+ msb.Append("}");
+ return msb.ToString();
+ }
+ else
+ {
+ throw new ApplicationException("printing undecoded MessageValue");
+ }
+ }
+
+ /// <summary>
+ /// Compute contents of byte array in reverse order.
+ /// </summary>
+ /// <param name="input">The byte array.</param>
+ /// <param name="suppressLeading0s">Flag controls suppression of leading zeros.</param>
+ /// <returns>Hexadecimal string</returns>
+ public string BytesReversedToString(byte[] input, bool suppressLeading0s = false)
+ {
+ if (!BitConverter.IsLittleEndian)
+ {
+ throw new ApplicationException("This code requires a little endian host.");
+ }
+ string result = "";
+ for (int i = input.Length - 1; i >= 0; i--)
+ {
+ result += String.Format("{0:x2}", input[i]);
+ }
+ if (suppressLeading0s)
+ {
+ result = result.TrimStart('0');
+ }
+ if (String.IsNullOrEmpty(result))
+ {
+ result = "0";
+ }
+ return result;
+ }
+
+
+ /// <summary>
+ /// Json-encode an array of bytes assumed to be plain ascii text.
+ /// </summary>
+ /// <param name="theBytes">The byte array.</param>
+ /// <returns>Serialized string</returns>
+ public string SerializeBytes(byte[] theBytes)
+ {
+ StringBuilder builder = new StringBuilder();
+ byte asciiSlash = Encoding.Default.GetBytes("\\")[0];
+ byte asciiDoubleQuote = Encoding.Default.GetBytes("\"")[0];
+ foreach (byte b in theBytes)
+ {
+ if (b == asciiSlash) {
+ // backslash needs backslash escape
+ builder.Append((char)asciiSlash);
+ builder.Append((char)asciiSlash);
+ }
+ else if (b == asciiDoubleQuote) {
+ // doublequote needs backslash escape
+ builder.Append((char)asciiSlash);
+ builder.Append((char)asciiDoubleQuote);
+ }
+ else if (b >= 32 && b <= 127)
+ // printable ascii passed through
+ builder.Append((char)b);
+ else
+ // non-printable ascii as escaped hex bytes
+ builder.Append(String.Format("\\x{0:x2}", b));
+ }
+ return builder.ToString();
+ }
+
+
+ /// <summary>
+ /// Json-encode an object whose string value is assumed to be plain ascii text.
+ /// </summary>
+ /// <param name="theObject">The object.</param>
+ /// <returns>Serialized string</returns>
+ public string SerializeString(object theObject)
+ {
+ byte[] bytes = Encoding.ASCII.GetBytes(theObject.ToString());
+ return SerializeBytes(bytes);
+ }
+
+
+ /// <summary>
+ /// Decode message body's object type names and QpidIt display details.
+ /// Recursively process maps and lists.
+ /// </summary>
+ public void Decode()
+ {
+ if (messageValue == null)
+ {
+ liteType = "null";
+ qpiditType = "null";
+ valueString = "None";
+ return;
+ }
+
+ 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);
+ if (!itemValue.QpiditTypeName.Equals("string"))
+ {
+ throw new ApplicationException(String.Format(
+ "List content expects strings but received: {0}", itemValue.GetType().Name));
+ }
+ payloadSize += itemValue.PayloadSize;
+ payloadChunks += 1;
+ }
+ }
+ 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);
+ payloadSize += valueValue.PayloadSize;
+ payloadChunks += 1;
+ }
+ }
+ else
+ {
+ //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);
+ payloadSize = binstr.Length;
+ break;
+ case "String":
+ qpiditType = "string";
+ valueString = SerializeString(messageValue);
+ payloadSize = valueString.Length;
+ break;
+ case "Symbol":
+ qpiditType = "symbol";
+ valueString = SerializeString(messageValue);
+ payloadSize = valueString.Length;
+ break;
+ default:
+ qpiditType = "unknown";
+ valueString = String.Format("Unknown AMQP type: {0}", liteType);
+ throw new ApplicationException(valueString);
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Receive and categorize some number of messages.
+ /// </summary>
+ class Receiver
+ {
+ private string brokerUrl;
+ private string queueName;
+ private string amqpType;
+ private Int32 nExpected;
+ private Int32 nReceived;
+ private List<Int32> receivedMByteSize;
+ private List<Int32> receivedChunks;
+ private Int32 mbFactor;
+
+ public Receiver(string brokerUrl_, string queueName_, string amqpType_, Int32 expected_, Int32 mbFactor_)
+ {
+ brokerUrl = brokerUrl_;
+ queueName = queueName_;
+ amqpType = amqpType_;
+ nExpected = expected_;
+ nReceived = 0;
+ receivedMByteSize = new List<Int32>();
+ receivedChunks = new List<Int32>();
+ mbFactor = mbFactor_;
+ }
+
+ ~Receiver()
+ { }
+
+ public string ReceivedValueListSimple
+ {
+ get
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.Append("[");
+ for (int i = 0; i < receivedMByteSize.Count; i++)
+ {
+ if (i > 0) sb.Append(", ");
+ sb.Append(receivedMByteSize[i].ToString());
+ }
+ sb.Append("]");
+ return sb.ToString();
+ }
+ }
+
+
+ public string ReceivedValueListComplex
+ {
+ get
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.Append("["); // start whole list
+
+ int curMb = 0;
+ bool subsequentChunk = false;
+ for (int i = 0; i < receivedMByteSize.Count; i++)
+ {
+ // start new MB series?
+ if (receivedMByteSize[i] != curMb)
+ {
+ // start new series. Close old series?
+ if (curMb != 0)
+ {
+ sb.Append("]],");
+ }
+ curMb = receivedMByteSize[i];
+ sb.Append(String.Format("[{0},[", curMb.ToString()));
+ subsequentChunk = false;
+ }
+ // leading chunk gets no comma, subsequent chunks do
+ if (subsequentChunk)
+ {
+ sb.Append(",");
+ }
+ subsequentChunk = true;
+ // the chunk size
+ sb.Append(String.Format("{0}", receivedChunks[i].ToString()));
+ }
+
+ sb.Append("]]]"); // end current chunk list, mb size list, and whole list
+ return sb.ToString();
+ }
+ }
+
+
+ public string ReceivedValueList
+ {
+ get
+ {
+ return (String.Equals(amqpType, "list", StringComparison.OrdinalIgnoreCase) ||
+ String.Equals(amqpType, "map", StringComparison.OrdinalIgnoreCase))
+ ? ReceivedValueListComplex : ReceivedValueListSimple;
+ }
+ }
+
+
+ public void run()
+ {
+ ManualResetEvent receiverAttached = new ManualResetEvent(false);
+ OnAttached onReceiverAttached = (l, a) => { receiverAttached.Set(); };
+ Address address = new Address(string.Format("amqp://{0}", brokerUrl));
+ Connection connection = new Connection(address);
+ Session session = new Session(connection);
+ ReceiverLink receiverlink = new ReceiverLink(session,
+ "Lite-amqp-types-test-receiver",
+ new Source() { Address = queueName },
+ onReceiverAttached);
+ if (receiverAttached.WaitOne(10000))
+ {
+ while (nReceived < nExpected)
+ {
+ Message message = receiverlink.Receive(System.TimeSpan.FromSeconds(800));
+ if (message != null)
+ {
+ nReceived += 1;
+ receiverlink.Accept(message);
+ MessageValue mv = new MessageValue(message.Body);
+ mv.Decode();
+
+ if (mv.QpiditTypeName != amqpType)
+ {
+ throw new ApplicationException(string.Format
+ ("Incorrect AMQP type found in message body: expected: {0}; found: {1}",
+ amqpType, mv.QpiditTypeName));
+ }
+ receivedMByteSize.Add(mv.PayloadSize / mbFactor);
+ receivedChunks.Add(mv.PayloadChunks);
+ }
+ else
+ {
+ throw new ApplicationException(string.Format(
+ "Time out receiving message {0} of {1}", nReceived+1, nExpected));
+ }
+ }
+ }
+ else
+ {
+ throw new ApplicationException(string.Format(
+ "Time out attaching to test broker {0} queue {1}", brokerUrl, queueName));
+ }
+
+ receiverlink.Close();
+ session.Close();
+ connection.Close();
+ }
+ }
+
+ class MainProgram
+ {
+ static int Main(string[] args)
+ {
+ /*
+ * --- main ---
+ * Args: 1: Broker address (ip-addr:port)
+ * 2: Queue name
+ * 3: QPIDIT AMQP type name of expected message body values
+ * 4: Expected number of test values to receive
+ */
+ int exitCode = 0;
+ const Int32 mbFactor = 1024 * 1024; // command line specifies small(ish) numbers of megabytes. Adjust size of a megabyte here.
+ try
+ {
+ if (args.Length != 4)
+ {
+ throw new ApplicationException(
+ "program requires four arguments: brokerAddr queueName amqpType nValues");
+ }
+ //Trace.TraceLevel = TraceLevel.Frame | TraceLevel.Verbose;
+ //Trace.TraceListener = (f, a) => Console.WriteLine(DateTime.Now.ToString("[hh:mm:ss.fff]") + " " + string.Format(f, a));
+
+ Receiver receiver = new Qpidit.Receiver(
+ args[0], args[1], args[2], Int32.Parse(args[3]), mbFactor);
+ receiver.run();
+
+ Console.WriteLine(args[2]);
+ Console.WriteLine("{0}", receiver.ReceivedValueList);
+ }
+ catch (Exception e)
+ {
+ string firstline = new StringReader(e.ToString()).ReadLine();
+ Console.Error.WriteLine("AmqpReceiver error: {0}.", firstline);
+ exitCode = 1;
+ }
+
+ return exitCode;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/63243b69/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.csproj.in
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..94b60a4
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/Receiver.csproj.in
@@ -0,0 +1,77 @@
+<?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.
+-->
+<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>
+ </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>
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/63243b69/shims/amqpnetlite/src/amqp_large_content_test/Receiver/packages.config
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Receiver/packages.config b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/packages.config
new file mode 100644
index 0000000..7496c87
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Receiver/packages.config
@@ -0,0 +1,21 @@
+<?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
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/63243b69/shims/amqpnetlite/src/amqp_large_content_test/Sender/App.config
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Sender/App.config b/shims/amqpnetlite/src/amqp_large_content_test/Sender/App.config
new file mode 100644
index 0000000..c60d743
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Sender/App.config
@@ -0,0 +1,24 @@
+<?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
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/63243b69/shims/amqpnetlite/src/amqp_large_content_test/Sender/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..bc5c247
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Sender/Properties/AssemblyInfo.cs
@@ -0,0 +1,57 @@
+/*
+ *
+ * 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")]
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/63243b69/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.cs
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.cs b/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.cs
new file mode 100644
index 0000000..8d0cbc7
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.cs
@@ -0,0 +1,782 @@
+/*
+ *
+ * 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;
+using System.Collections;
+using System.Collections.Generic;
+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;
+
+// Large_content_test is driven by a list like this:
+//
+// 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]]]
+// }
+//
+// Sender receives command line args from this map:
+// Sender host queuename binary '[1, 10, 100]'
+// Sender host queuename list '[[1, [1, 16, 256, 4096]], [10, [1, 16, 256, 4096]], [100, [1, 16, 256, 4096]]]'
+//
+// Sender
+// 1) generates actual .NET objects as specified
+// 2) uses the AMQP Lite client to generate messages holding the object
+// 3) sends the message(s) to the host/queuename.
+//
+namespace Qpidit
+{
+ /// <summary>
+ /// MessageValue holds a QpidIT type name and a json object created from the
+ /// CLI string argument, encodes it, and returns the object to be used as the
+ /// constructor for a message to be sent.
+ /// Complex values List and Map are constructed recursively.
+ /// Remaining singleton values like int or long are held directly as objects.
+ /// </summary>
+ class MessageValue
+ {
+ // Original type and json object
+ private string baseType;
+ private object baseValue;
+
+ // has Encode been called?
+ private Boolean encoded;
+
+ // Simple objects completely encoded
+ // List and Map defined recursively
+ private object valueDirect;
+
+ /// <summary>
+ /// Constructor
+ /// </summary>
+ /// <param name="type">qpidit type name</param>
+ /// <param name="value">json encoded object</param>
+ public MessageValue(string type, object value)
+ {
+ baseType = type;
+ baseValue = value;
+ encoded = false;
+ valueDirect = null;
+ }
+
+
+ /// <summary>
+ /// Create a MessageValue without knowing beforehand what
+ /// type of system object is being handled.
+ /// * Objects created in the list from the command line have a
+ /// known type and are created via the constructor.
+ /// * Objects created inside List and Map have only string
+ /// type externally but need an actual type to be figured out.
+ /// </summary>
+ /// <param name="obj"></param>
+ /// <returns></returns>
+ public static MessageValue CreateAutoType(object obj)
+ {
+ return new Qpidit.MessageValue(QpiditTypeOf(obj), obj);
+ }
+
+
+ /// <summary>
+ /// Return the native object that represents the encoded
+ /// Amqp value.
+ /// </summary>
+ /// <returns></returns>
+ public Object ToObject()
+ {
+ if (!encoded)
+ Encode();
+
+ return valueDirect;
+ }
+
+
+ /// <summary>
+ /// Return the Amqp Message that holds this value.
+ /// </summary>
+ /// <returns></returns>
+ public Message ToMessage()
+ {
+ return new Message(this.ToObject());
+ }
+
+
+ /// <summary>
+ /// Get an object's QPIDIT type
+ /// </summary>
+ /// <param name="obj">a .NET object</param>
+ /// <returns>QpidIT type name</returns>
+ public static string QpiditTypeOf(object obj)
+ {
+ string typename = obj.GetType().Name;
+ string qpiditType = null;
+ if (obj == null)
+ {
+ qpiditType = "null";
+ }
+ else
+ {
+ switch (typename)
+ {
+ case "Boolean":
+ qpiditType = "boolean";
+ break;
+ case "Byte":
+ qpiditType = "ubyte";
+ break;
+ case "UInt16":
+ qpiditType = "ushort";
+ break;
+ case "UInt32":
+ qpiditType = "uint";
+ break;
+ case "UInt64":
+ qpiditType = "ulong";
+ break;
+ case "SByte":
+ qpiditType = "byte";
+ break;
+ case "Int16":
+ qpiditType = "short";
+ break;
+ case "Int32":
+ qpiditType = "int";
+ break;
+ case "Int64":
+ qpiditType = "long";
+ break;
+ case "Single":
+ qpiditType = "float";
+ break;
+ case "Double":
+ qpiditType = "double";
+ break;
+ case "DateTime":
+ qpiditType = "timestamp";
+ break;
+ case "Guid":
+ qpiditType = "uuid";
+ break;
+ case "Byte[]":
+ qpiditType = "binary";
+ break;
+ case "String":
+ qpiditType = "string";
+ break;
+ case "Symbol":
+ qpiditType = "symbol";
+ break;
+ case "Array":
+ qpiditType = "list";
+ break;
+ case "ArrayList":
+ qpiditType = "list";
+ break;
+ case "Dictionary":
+ qpiditType = "map";
+ break;
+ case "Dictionary`2":
+ qpiditType = "map";
+ break;
+ default:
+ throw new ApplicationException(String.Format(
+ "Can not translate system type {0} to a QpidIT type", typename));
+ }
+ }
+ return qpiditType;
+ }
+
+
+ public string StripLeading0x(string value)
+ {
+ if (!value.StartsWith("0x"))
+ throw new ApplicationException(String.Format(
+ "EncodeUInt string does not start with '0x' : {0}", value));
+ return value.Substring(2);
+ }
+
+ public UInt64 EncodeUInt(string value)
+ {
+ UInt64 result = 0;
+ value = StripLeading0x(value);
+ result = UInt64.Parse(value, System.Globalization.NumberStyles.HexNumber);
+ return result;
+ }
+
+
+ public Int64 EncodeInt(string value)
+ {
+ Int64 result = 0;
+ bool isNegated = value.StartsWith("-");
+ if (isNegated)
+ value = value.Substring(1);
+ value = StripLeading0x(value);
+ result = Int64.Parse(value, System.Globalization.NumberStyles.HexNumber);
+ if (isNegated)
+ result = -result;
+ return result;
+ }
+
+
+ /// <summary>
+ /// Generate the object used to create a message
+ /// </summary>
+ public void Encode()
+ {
+ if (encoded)
+ return;
+
+ if (baseValue is Array)
+ {
+ // List
+ if (! String.Equals(baseType, "list", StringComparison.OrdinalIgnoreCase))
+ {
+ throw new ApplicationException(String.Format(
+ "Sender asked to encode a {0} but received a list: {1}", baseType, baseValue.ToString()));
+ }
+ valueDirect = new Amqp.Types.List();
+ foreach (object item in (Array)baseValue)
+ {
+ MessageValue itemValue = MessageValue.CreateAutoType(item);
+ itemValue.Encode();
+ ((Amqp.Types.List)valueDirect).Add(itemValue.ToObject());
+ }
+ }
+ else if (baseValue is ArrayList)
+ {
+ // List
+ if (! String.Equals(baseType, "list", StringComparison.OrdinalIgnoreCase))
+ {
+ throw new ApplicationException(String.Format(
+ "Sender asked to encode a {0} but received a list: {1}", baseType, baseValue.ToString()));
+ }
+ valueDirect = new Amqp.Types.List();
+ foreach (object item in (ArrayList)baseValue)
+ {
+ MessageValue itemValue = MessageValue.CreateAutoType(item);
+ itemValue.Encode();
+ ((Amqp.Types.List)valueDirect).Add(itemValue.ToObject());
+ }
+ }
+ else if (baseValue is Dictionary<string, object>)
+ {
+ // Map
+ if (!String.Equals(baseType, "map", StringComparison.OrdinalIgnoreCase))
+ {
+ throw new ApplicationException(String.Format(
+ "Sender asked to encode a {0} but received a map: {1}", baseType, baseValue.ToString()));
+ }
+ valueDirect = new Amqp.Types.Map();
+ Dictionary<string, object> myDict = new Dictionary<string, object>();
+ myDict = (Dictionary<string, object>)baseValue;
+ foreach (var key in myDict.Keys)
+ {
+ MessageValue itemValue = MessageValue.CreateAutoType(myDict[key]);
+ ((Amqp.Types.Map)valueDirect)[key] = itemValue.ToObject();
+ }
+ }
+ else if (baseValue is String)
+ {
+ string value;
+ UInt64 valueUInt64;
+ Int64 valueInt64;
+
+ switch (baseType)
+ {
+ case "null":
+ valueDirect = null;
+ break;
+ case "boolean":
+ value = (string)baseValue;
+ bool mybool = String.Equals(value, "true", StringComparison.OrdinalIgnoreCase);
+ valueDirect = mybool;
+ break;
+ case "ubyte":
+ value = (string)baseValue;
+ valueUInt64 = EncodeUInt(value);
+ Byte mybyte = (Byte)(valueUInt64 & 0xff);
+ valueDirect = mybyte;
+ break;
+ case "ushort":
+ value = (string)baseValue;
+ valueUInt64 = EncodeUInt(value);
+ UInt16 myuint16 = (UInt16)(valueUInt64 & 0xffff);
+ valueDirect = myuint16;
+ break;
+ case "uint":
+ value = (string)baseValue;
+ valueUInt64 = EncodeUInt(value);
+ UInt32 myuint32 = (UInt32)(valueUInt64 & 0xffffffff);
+ valueDirect = myuint32;
+ break;
+ case "ulong":
+ value = (string)baseValue;
+ valueUInt64 = EncodeUInt(value);
+ valueDirect = valueUInt64;
+ break;
+ case "byte":
+ value = (string)baseValue;
+ valueInt64 = EncodeInt(value);
+ SByte mysbyte = (SByte)(valueInt64 & 0xff);
+ valueDirect = mysbyte;
+ break;
+ case "short":
+ value = (string)baseValue;
+ valueInt64 = EncodeInt(value);
+ Int16 myint16 = (Int16)(valueInt64 & 0xffff);
+ valueDirect = myint16;
+ break;
+ case "int":
+ value = (string)baseValue;
+ valueInt64 = EncodeInt(value);
+ Int32 myint32 = (Int32)(valueInt64 & 0xffffffff);
+ valueDirect = myint32;
+ break;
+ case "long":
+ value = (string)baseValue;
+ valueInt64 = EncodeInt(value);
+ valueDirect = valueInt64;
+ break;
+ case "float":
+ value = StripLeading0x((string)baseValue);
+ UInt32 num32 = UInt32.Parse(value, System.Globalization.NumberStyles.AllowHexSpecifier);
+ byte[] floatVals = BitConverter.GetBytes(num32);
+ float flt = BitConverter.ToSingle(floatVals, 0);
+ valueDirect = flt;
+ break;
+ case "double":
+ value = StripLeading0x((string)baseValue);
+ UInt64 num64 = UInt64.Parse(value, System.Globalization.NumberStyles.AllowHexSpecifier);
+ byte[] doubleVals = BitConverter.GetBytes(num64);
+ double dbl = BitConverter.ToDouble(doubleVals, 0);
+ valueDirect = dbl;
+ break;
+ case "timestamp":
+ // 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;
+ value = StripLeading0x((string)baseValue);
+ Int64 dtticks = Int64.Parse(value, System.Globalization.NumberStyles.AllowHexSpecifier);
+ dtticks *= TimeSpan.TicksPerMillisecond;
+ dtticks += epochTicks;
+ DateTime dt = new DateTime(dtticks, DateTimeKind.Utc);
+ valueDirect = dt;
+ break;
+ case "uuid":
+ value = (string)baseValue;
+ Guid guid = new Guid(value);
+ valueDirect = guid;
+ break;
+ case "binary":
+ // TODO: fix this
+ value = (string)baseValue;
+ byte[] binval = Encoding.ASCII.GetBytes(value);
+ valueDirect = binval;
+ break;
+ case "string":
+ valueDirect = (string)baseValue;
+ break;
+ case "symbol":
+ Symbol sym = new Symbol((string)baseValue);
+ valueDirect = sym;
+ break;
+ case "list":
+ throw new ApplicationException(String.Format(
+ "Sender asked to encode a list but received a string: {0}", baseValue));
+ case "map":
+ throw new ApplicationException(String.Format(
+ "Sender asked to encode a map but received a string: {0}", baseValue));
+ case "decimal32":
+ case "decimal64":
+ case "decimal128":
+ throw new ApplicationException(String.Format(
+ "AMQP.Net Lite does not support AMQP decimal type: {0}", baseType));
+ default:
+ throw new ApplicationException(String.Format(
+ "Sender can not encode base type: {0}", baseType));
+ }
+ }
+ else
+ {
+ throw new ApplicationException(String.Format(
+ "Sender can not encode object type {0}", baseValue.GetType().Name));
+ }
+ encoded = true;
+ }
+ }
+
+
+ /// <summary>
+ /// Classes to parse JSON size arg for map and list types
+ /// </summary>
+ class MbBlock
+ {
+ public Int32 mBytes { get; set; }
+ public List<Int32> nChunks { get; set; }
+ }
+ class MbSpec
+ {
+ public List<MbBlock> MbBlocks { get; set; }
+
+ enum ParseState
+ {
+ START,
+ NEW_MBBLOCK,
+ M_BYTES,
+ NEW_NCHUNKS,
+ NCHUNK,
+ END_NCHUNK,
+ END_MBBLOCK,
+ END
+ }
+
+ public MbSpec(string sizeSpec)
+ {
+ MbBlock curMbBlock = new MbBlock();
+ Int32 curInt = 0; ;
+
+ ParseState ps = ParseState.START;
+
+ int pos = -1;
+ foreach (char ch in sizeSpec)
+ {
+ pos += 1;
+ //Console.WriteLine("ch = '{0}', position = {1}", ch, pos);
+ string err = "";
+ switch (ps)
+ {
+ case ParseState.START:
+ if (ch == '[')
+ {
+ MbBlocks = new List<MbBlock>();
+ ps = ParseState.NEW_MBBLOCK;
+ }
+ else
+ err = "no leading '['";
+ break;
+ case ParseState.NEW_MBBLOCK:
+ if (ch == ']')
+ {
+ MbBlocks.Add(curMbBlock);
+ ps = ParseState.END;
+ }
+ else if (ch == '[')
+ {
+ curMbBlock = new MbBlock();
+ ps = ParseState.M_BYTES;
+ curInt = 0;
+ }
+ else if (Char.IsWhiteSpace(ch))
+ {
+ // ignore whitespace
+ }
+ else
+ err = "NEW_MBBLOCK expects '[' or ']'";
+ break;
+ case ParseState.M_BYTES:
+ if (Char.IsDigit(ch))
+ {
+ curInt *= 10;
+ curInt += (int)(ch - '0');
+ }
+ else if (ch == ',')
+ {
+ curMbBlock.mBytes = curInt;
+ curInt = 0;
+ ps = ParseState.NEW_NCHUNKS;
+ }
+ else if (Char.IsWhiteSpace(ch))
+ {
+ // ignore whitespace
+ }
+ else
+ err = "M_BYTES expects digit or ','";
+ break;
+ case ParseState.NEW_NCHUNKS:
+ if (ch == '[')
+ {
+ curMbBlock.nChunks = new List<Int32>();
+ ps = ParseState.NCHUNK;
+ }
+ else if (Char.IsWhiteSpace(ch))
+ {
+ // ignore whitespace
+ }
+ else
+ err = "NEW_NCHUNKS expects digit or '['";
+ break;
+ case ParseState.NCHUNK:
+ if (Char.IsDigit(ch))
+ {
+ curInt *= 10;
+ curInt += (int)(ch - '0');
+ }
+ else if (ch == ',')
+ {
+ curMbBlock.nChunks.Add(curInt);
+ curInt = 0;
+ }
+ else if (Char.IsWhiteSpace(ch))
+ {
+ // ignore whitespace
+ }
+ else if (ch == ']')
+ {
+ curMbBlock.nChunks.Add(curInt);
+ curInt = 0;
+ ps = ParseState.END_NCHUNK;
+ }
+ else
+ err = "NCHUNK expects digit, ',', or ']'";
+ break;
+ case ParseState.END_NCHUNK:
+ if (Char.IsWhiteSpace(ch))
+ {
+ // ignore whitespace
+ }
+ else if (ch == ']')
+ {
+ MbBlocks.Add(curMbBlock);
+ curMbBlock = new MbBlock();
+ ps = ParseState.END_MBBLOCK;
+ }
+ else
+ err = "END_MBBLOCK expects ']'";
+ break;
+ case ParseState.END_MBBLOCK:
+ if (Char.IsWhiteSpace(ch))
+ {
+ // ignore whitespace
+ }
+ else if (ch == ',')
+ {
+ ps = ParseState.NEW_MBBLOCK;
+ }
+ else if (ch == ']')
+ {
+ ps = ParseState.END;
+ }
+ else
+ err = "END_MBBLOCK expects ',', ']', or '['";
+ break;
+ case ParseState.END:
+ err = "illegal characters after JSON end of object";
+ break;
+ }
+
+ if (err != "")
+ {
+ throw new ApplicationException(String.Format("Size spec parse error at position {0}, state {1}: {2}", pos, ps, err));
+ }
+ }
+ }
+ }
+
+
+
+ class Sender
+ {
+ private string brokerUrl;
+ private string queueName;
+ private string amqpType;
+ private string countSpec;
+ private Int32 mbFactor;
+ private MbSpec mbSpec;
+
+ public Sender(string brokerUrl_, string queueName_, string amqpType_, string countSpec_, Int32 mbFactor_)
+ {
+ brokerUrl = brokerUrl_;
+ queueName = queueName_;
+ amqpType = amqpType_;
+ countSpec = countSpec_;
+ mbFactor = mbFactor_;
+ }
+
+ ~Sender()
+ { }
+
+
+ public IEnumerable<Message> AllMessages()
+ {
+ if (String.Equals(amqpType, "binary", StringComparison.OrdinalIgnoreCase) ||
+ String.Equals(amqpType, "string", StringComparison.OrdinalIgnoreCase) ||
+ String.Equals(amqpType, "symbol", StringComparison.OrdinalIgnoreCase))
+ {
+ // Deserialize the count spec list
+ JavaScriptSerializer csl = new JavaScriptSerializer();
+ var itMsgs = csl.Deserialize<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));
+
+ // Generate messages
+ if (String.Equals(amqpType, "binary", StringComparison.OrdinalIgnoreCase))
+ {
+ foreach (Int32 mbSize in itMsgs)
+ {
+ string binStr = new string(Convert.ToChar(0), mbSize * mbFactor);
+ MessageValue mv = new MessageValue(amqpType, binStr);
+ yield return mv.ToMessage();
+ }
+ }
+ else if (String.Equals(amqpType, "string", StringComparison.OrdinalIgnoreCase))
+ {
+ foreach (Int32 mbSize in itMsgs)
+ {
+ string binStr = new string('s', mbSize * mbFactor);
+ MessageValue mv = new MessageValue(amqpType, binStr);
+ yield return mv.ToMessage();
+ }
+ }
+ else if (String.Equals(amqpType, "symbol", StringComparison.OrdinalIgnoreCase))
+ {
+ foreach (Int32 mbSize in itMsgs)
+ {
+ string binStr = new string('b', mbSize * mbFactor);
+ MessageValue mv = new MessageValue(amqpType, binStr);
+ yield return mv.ToMessage();
+ }
+ }
+ }
+ else if (String.Equals(amqpType, "list", StringComparison.OrdinalIgnoreCase))
+ {
+ mbSpec = new MbSpec(countSpec);
+ foreach (MbBlock mbBlock in mbSpec.MbBlocks)
+ {
+ foreach (Int32 eCount in mbBlock.nChunks)
+ {
+ Int32 sizePerEltBytes = (mbBlock.mBytes * mbFactor) / eCount;
+ string[] testList = new string[eCount];
+ for (int i = 0; i < eCount; i++)
+ {
+ testList[i] = new string('L', sizePerEltBytes);
+ }
+ MessageValue mv = new MessageValue(amqpType, testList);
+ yield return mv.ToMessage();
+ }
+ }
+ }
+ else if (String.Equals(amqpType, "map", StringComparison.OrdinalIgnoreCase))
+ {
+ mbSpec = new MbSpec(countSpec);
+ foreach (MbBlock mbBlock in mbSpec.MbBlocks)
+ {
+ foreach (Int32 eCount in mbBlock.nChunks)
+ {
+ Int32 sizePerEltBytes = (mbBlock.mBytes * mbFactor) / eCount;
+ Dictionary<string, object> testMap = new Dictionary<string, object>();
+ for (int i = 0; i < eCount; i++)
+ {
+ testMap[i.ToString("000000")] = new string('M', sizePerEltBytes);
+ }
+ MessageValue mv = new MessageValue(amqpType, testMap);
+ yield return mv.ToMessage();
+ }
+ }
+ }
+ // else if (String.Equals(amqpType, "array", StringComparison.OrdinalIgnoreCase))
+ //{ /* TODO */ }
+ else
+ {
+ throw new ApplicationException(String.Format(
+ "unsupported amqp type: {0}", amqpType));
+ }
+ }
+
+ public void run()
+ {
+ // Send the messages
+ ManualResetEvent senderAttached = new ManualResetEvent(false);
+ OnAttached onSenderAttached = (l, a) => { senderAttached.Set(); };
+ Address address = new Address(string.Format("amqp://{0}", brokerUrl));
+ Connection connection = new Connection(address);
+ Session session = new Session(connection);
+ SenderLink sender = new SenderLink(session,
+ "Lite-amqp-large-content-test-sender",
+ new Target() { Address = queueName },
+ onSenderAttached);
+ if (senderAttached.WaitOne(10000))
+ {
+ foreach (Message message in AllMessages())
+ {
+ sender.Send(message);
+ }
+ }
+ else
+ {
+ throw new ApplicationException(string.Format(
+ "Time out attaching to test broker {0} queue {1}", brokerUrl, queueName));
+ }
+
+ sender.Close();
+ session.Close();
+ connection.Close();
+ }
+ }
+
+ class MainProgram
+ {
+ static int Main(string[] args)
+ {
+ /*
+ * --- main ---
+ * Args: 1: Broker address (ip-addr:port)
+ * 2: Queue name
+ * 3: AMQP type
+ * 4: Test value(s) as JSON string
+ */
+ int exitCode = 0;
+ const Int32 mbFactor = 1024 * 1024; // command line specifies small(ish) numbers of megabytes. Adjust size of a megabyte here.
+ try
+ {
+ if (args.Length != 4)
+ {
+ throw new ApplicationException(
+ "program requires four arguments: brokerAddr queueName amqpType jsonValuesToSend");
+ }
+ //Trace.TraceLevel = TraceLevel.Frame | TraceLevel.Verbose;
+ //Trace.TraceListener = (f, a) => Console.WriteLine(DateTime.Now.ToString("[hh:mm:ss.fff]") + " " + string.Format(f, a));
+
+ Sender sender = new Qpidit.Sender(args[0], args[1], args[2], args[3], mbFactor);
+ sender.run();
+ }
+ catch (Exception e)
+ {
+ string firstline = new StringReader(e.ToString()).ReadLine();
+ Console.Error.WriteLine("AmqpSender error: {0}.", firstline);
+ exitCode = 1;
+ }
+
+ return exitCode;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/63243b69/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.csproj.in
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..ca59361
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Sender/Sender.csproj.in
@@ -0,0 +1,76 @@
+<?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.
+-->
+<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>
+ </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>
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/63243b69/shims/amqpnetlite/src/amqp_large_content_test/Sender/packages.config
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_large_content_test/Sender/packages.config b/shims/amqpnetlite/src/amqp_large_content_test/Sender/packages.config
new file mode 100644
index 0000000..7496c87
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_large_content_test/Sender/packages.config
@@ -0,0 +1,21 @@
+<?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
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/63243b69/src/python/qpid_interop_test/amqp_large_content_test.py
----------------------------------------------------------------------
diff --git a/src/python/qpid_interop_test/amqp_large_content_test.py b/src/python/qpid_interop_test/amqp_large_content_test.py
index 7bc97cf..3b0688f 100755
--- a/src/python/qpid_interop_test/amqp_large_content_test.py
+++ b/src/python/qpid_interop_test/amqp_large_content_test.py
@@ -218,12 +218,21 @@ if __name__ == '__main__':
'Receiver.py')
PROTON_PYTHON_SENDER_SHIM = path.join(QIT_TEST_SHIM_HOME, 'qpid-proton-python', 'amqp_large_content_test',
'Sender.py')
+ AMQPNETLITE_RECEIVER_SHIM = path.join(QIT_TEST_SHIM_HOME, 'amqpnetlite', 'amqp_large_content_test', 'Receiver.exe')
+ AMQPNETLITE_SENDER_SHIM = path.join(QIT_TEST_SHIM_HOME, 'amqpnetlite', 'amqp_large_content_test', 'Sender.exe')
SHIM_MAP = {qpid_interop_test.shims.ProtonCppShim.NAME: \
qpid_interop_test.shims.ProtonCppShim(PROTON_CPP_SENDER_SHIM, PROTON_CPP_RECEIVER_SHIM),
qpid_interop_test.shims.ProtonPythonShim.NAME: \
qpid_interop_test.shims.ProtonPythonShim(PROTON_PYTHON_SENDER_SHIM, PROTON_PYTHON_RECEIVER_SHIM),
}
+ # Add shims that need detection during installation only if the necessary bits are present
+ # AMQP DotNetLite client
+ if path.isfile(AMQPNETLITE_RECEIVER_SHIM) and path.isfile(AMQPNETLITE_SENDER_SHIM):
+ SHIM_MAP[qpid_interop_test.shims.AmqpNetLiteShim.NAME] = \
+ qpid_interop_test.shims.AmqpNetLiteShim(AMQPNETLITE_SENDER_SHIM, AMQPNETLITE_RECEIVER_SHIM)
+ else:
+ print 'WARNING: AMQP DotNetLite shims not installed'
ARGS = TestOptions(SHIM_MAP).args
#print 'ARGS:', ARGS # debug
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[2/2] qpid-interop-test git commit: QPIDIT-92: Repair Lite v2.0.0 API
change
Posted by ch...@apache.org.
QPIDIT-92: Repair Lite v2.0.0 API change
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/8bf7bfe4
Tree: http://git-wip-us.apache.org/repos/asf/qpid-interop-test/tree/8bf7bfe4
Diff: http://git-wip-us.apache.org/repos/asf/qpid-interop-test/diff/8bf7bfe4
Branch: refs/heads/master
Commit: 8bf7bfe4c9e4f3415138ea3f8a65ca60c60ccee5
Parents: 63243b6
Author: Chuck Rolke <cr...@redhat.com>
Authored: Thu Aug 31 16:37:51 2017 -0400
Committer: Chuck Rolke <cr...@redhat.com>
Committed: Thu Aug 31 16:37:51 2017 -0400
----------------------------------------------------------------------
shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/8bf7bfe4/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs b/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs
index 818bfe3..78c9e88 100644
--- a/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs
+++ b/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs
@@ -425,7 +425,7 @@ namespace Qpidit
{
while (nReceived < nExpected)
{
- Message message = receiverlink.Receive(10000);
+ Message message = receiverlink.Receive(System.TimeSpan.FromSeconds(10));
if (message != null)
{
nReceived += 1;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org