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 2016/12/21 22:33:19 UTC

qpid-interop-test git commit: QPIDIT-62: Add AMQP.Net Lite client shims

Repository: qpid-interop-test
Updated Branches:
  refs/heads/master 73d7b9c08 -> 0569f2bae


QPIDIT-62: Add AMQP.Net Lite client shims

This commit creates amqp_types_test Sender and Receiver.
TODO:
* Work out a way to find or build amqpnetlite library dll files.
* Integrate running these tests with the rest of the system.


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/0569f2ba
Tree: http://git-wip-us.apache.org/repos/asf/qpid-interop-test/tree/0569f2ba
Diff: http://git-wip-us.apache.org/repos/asf/qpid-interop-test/diff/0569f2ba

Branch: refs/heads/master
Commit: 0569f2baef8b341c5440c616612e45055f6e480c
Parents: 73d7b9c
Author: Chuck Rolke <cr...@redhat.com>
Authored: Wed Dec 21 17:31:44 2016 -0500
Committer: Chuck Rolke <cr...@redhat.com>
Committed: Wed Dec 21 17:31:44 2016 -0500

----------------------------------------------------------------------
 .../src/amqp_types_test/Receiver/App.config     |  24 +
 .../Receiver/Properties/AssemblyInfo.cs         |  57 +++
 .../src/amqp_types_test/Receiver/Receiver.cs    | 459 ++++++++++++++++++
 .../amqp_types_test/Receiver/Receiver.csproj    |  87 ++++
 .../amqp_types_test/Receiver/packages.config    |  21 +
 .../src/amqp_types_test/Sender/App.config       |  24 +
 .../Sender/Properties/AssemblyInfo.cs           |  57 +++
 .../src/amqp_types_test/Sender/Sender.cs        | 477 +++++++++++++++++++
 .../src/amqp_types_test/Sender/Sender.csproj    |  86 ++++
 .../src/amqp_types_test/Sender/packages.config  |  21 +
 10 files changed, 1313 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/0569f2ba/shims/amqpnetlite/src/amqp_types_test/Receiver/App.config
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_types_test/Receiver/App.config b/shims/amqpnetlite/src/amqp_types_test/Receiver/App.config
new file mode 100644
index 0000000..c60d743
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_types_test/Receiver/App.config
@@ -0,0 +1,24 @@
+\ufeff<?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/0569f2ba/shims/amqpnetlite/src/amqp_types_test/Receiver/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_types_test/Receiver/Properties/AssemblyInfo.cs b/shims/amqpnetlite/src/amqp_types_test/Receiver/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..aa2ca21
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_types_test/Receiver/Properties/AssemblyInfo.cs
@@ -0,0 +1,57 @@
+\ufeff/*
+ *
+ * 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/0569f2ba/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
new file mode 100644
index 0000000..d008ce0
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.cs
@@ -0,0 +1,459 @@
+\ufeff/*
+ *
+ * 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.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;
+
+        /// <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;
+        }
+
+        /// <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>
+        /// 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--)
+            {
+                if (!suppressLeading0s || input[i] != 0)
+                {
+                    suppressLeading0s = false;
+                    result += String.Format("{0:x2}", input[i]);
+                }
+            }
+            return result;
+        }
+
+
+        /// <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 = "null";
+                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);
+                }
+            }
+            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);
+                }
+            }
+            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 = BytesReversedToString(sbytes);
+                        break;
+                    case "Double":
+                        byte[] dbytes = BitConverter.GetBytes((Double)messageValue);
+                        qpiditType = "double";
+                        valueString = 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 = BytesReversedToString(dtbytes, true);
+                        break;
+                    case "Guid":
+                        qpiditType = "uuid";
+                        valueString = messageValue.ToString();
+                        break;
+                    case "Byte[]":
+                        qpiditType = "binary";
+                        byte[] binstr = (byte[])messageValue;
+                        StringBuilder builder = new StringBuilder();
+                        foreach (byte b in binstr)
+                            if (b >= 32 && b <= 127)
+                                builder.Append((char)b);
+                            else
+                                builder.Append(String.Format("\\{0:x2}", b));
+                        valueString = builder.ToString();
+                        break;
+                    case "String":
+                        qpiditType = "string";
+                        valueString = messageValue.ToString();
+                        break;
+                    case "Symbol":
+                        qpiditType = "symbol";
+                        valueString = messageValue.ToString();
+                        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<MessageValue> receivedMessageValues;
+
+        public Receiver(string brokerUrl_, string queueName_, string amqpType_, Int32 expected_)
+        {
+            brokerUrl = brokerUrl_;
+            queueName = queueName_;
+            amqpType = amqpType_;
+            nExpected = expected_;
+            nReceived = 0;
+            receivedMessageValues = new List<MessageValue>();
+        }
+
+        ~Receiver()
+        { }
+
+        public string ReceivedValueList
+        {
+            get
+            {
+                StringBuilder sb = new StringBuilder();
+                sb.Append("[");
+                for (int i = 0; i < receivedMessageValues.Count; i++)
+                {
+                    if (i > 0) sb.Append(", ");
+                    sb.Append(receivedMessageValues[i].ToString());
+                }
+                sb.Append("]");
+                return sb.ToString();
+            }
+        }
+
+
+        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(10000);
+                    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));
+                        }
+                        //Console.WriteLine("{0} [{1}]", mv.QpiditTypeName, mv.ToString());
+                        receivedMessageValues.Add(mv);
+                    }
+                    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
+             */
+            if (args.Length != 4)
+            {
+                throw new System.ArgumentException(
+                    "Required argument count must be 4: brokerAddr queueName amqpType nValues");
+            }
+            int exitCode = 0;
+
+            //Trace.TraceLevel = TraceLevel.Frame | TraceLevel.Verbose;
+            //Trace.TraceListener = (f, a) => Console.WriteLine(DateTime.Now.ToString("[hh:mm:ss.fff]") + " " + string.Format(f, a));
+
+            try
+            {
+                Receiver receiver = new Qpidit.Receiver(
+                    args[0], args[1], args[2], Int32.Parse(args[3]));
+                receiver.run();
+
+                Console.WriteLine(args[2]);
+                Console.WriteLine("{0}", receiver.ReceivedValueList);
+            }
+            catch (Exception e)
+            {
+                Console.Error.WriteLine("AmqpReceiver error: {0}.", e);
+                exitCode = 1;
+            }
+
+            return exitCode;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/0569f2ba/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.csproj
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.csproj b/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.csproj
new file mode 100644
index 0000000..360b89b
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_types_test/Receiver/Receiver.csproj
@@ -0,0 +1,87 @@
+\ufeff<?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\Debug\</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\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <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="Receiver.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\src\Amqp.Net.csproj">
+      <Project>{92153715-1d99-43b1-b291-470cf91a156d}</Project>
+      <Name>Amqp.Net</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/0569f2ba/shims/amqpnetlite/src/amqp_types_test/Receiver/packages.config
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_types_test/Receiver/packages.config b/shims/amqpnetlite/src/amqp_types_test/Receiver/packages.config
new file mode 100644
index 0000000..7496c87
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_types_test/Receiver/packages.config
@@ -0,0 +1,21 @@
+\ufeff<?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/0569f2ba/shims/amqpnetlite/src/amqp_types_test/Sender/App.config
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_types_test/Sender/App.config b/shims/amqpnetlite/src/amqp_types_test/Sender/App.config
new file mode 100644
index 0000000..c60d743
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_types_test/Sender/App.config
@@ -0,0 +1,24 @@
+\ufeff<?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/0569f2ba/shims/amqpnetlite/src/amqp_types_test/Sender/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_types_test/Sender/Properties/AssemblyInfo.cs b/shims/amqpnetlite/src/amqp_types_test/Sender/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..bc5c247
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_types_test/Sender/Properties/AssemblyInfo.cs
@@ -0,0 +1,57 @@
+\ufeff/*
+ *
+ * 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/0569f2ba/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.cs
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.cs b/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.cs
new file mode 100644
index 0000000..785016e
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.cs
@@ -0,0 +1,477 @@
+\ufeff/*
+ *
+ * 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.Text;
+using System.Threading;
+using System.Web.Script.Serialization;
+using Amqp;
+using Amqp.Framing;
+using Amqp.Types;
+
+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();
+
+            if (valueDirect != null)
+            {
+                return valueDirect;
+            }
+            throw new ApplicationException("Sender.MessageValue.ToObject: Message not encoded properly");
+        }
+
+
+        /// <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;
+            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 "Dictionary":
+                    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 (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 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 "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));
+                    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;
+        }
+    }
+
+    class Sender
+    {
+        private string brokerUrl;
+        private string queueName;
+        private string amqpType;
+        private string jsonMessages;
+
+        public Sender(string brokerUrl_, string queueName_, string amqpType_, string jsonMessages_)
+        {
+            brokerUrl = brokerUrl_;
+            queueName = queueName_;
+            amqpType = amqpType_;
+            jsonMessages = jsonMessages_;
+        }
+
+        ~Sender()
+        { }
+
+
+        public void run()
+        {
+            List<Message> messagesToSend = new List<Message>();
+
+            // Deserialize the json message list
+            JavaScriptSerializer jss = new JavaScriptSerializer();
+            var itMsgs = jss.Deserialize<dynamic>(jsonMessages);
+            if (!(itMsgs is Array))
+                throw new ApplicationException(String.Format(
+                    "Messages are not formatted as a json list: {0}", jsonMessages));
+
+            // Generate messages
+            foreach (object itMsg in (Array)itMsgs)
+            {
+                MessageValue mv = new MessageValue(amqpType, itMsg);
+                mv.Encode();
+                messagesToSend.Add(mv.ToMessage());
+            }
+
+            // 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-types-test-sender",
+                                               new Target() { Address = queueName },
+                                               onSenderAttached);
+            if (senderAttached.WaitOne(10000))
+            {
+                foreach (Message message in messagesToSend)
+                {
+                    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
+             */
+            if (args.Length != 4)
+            {
+                throw new System.ArgumentException(
+                    "Required argument count must be 4: brokerAddr queueName amqpType jsonValuesToSend");
+            }
+            int exitCode = 0;
+
+            //Trace.TraceLevel = TraceLevel.Frame | TraceLevel.Verbose;
+            //Trace.TraceListener = (f, a) => Console.WriteLine(DateTime.Now.ToString("[hh:mm:ss.fff]") + " " + string.Format(f, a));
+
+            try
+            {
+                Sender sender = new Qpidit.Sender(args[0], args[1], args[2], args[3]);
+                sender.run();
+            }
+            catch (Exception e)
+            {
+                Console.Error.WriteLine("AmqpSender error: {0}.", e);
+                exitCode = 1;
+            }
+
+            return exitCode;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/0569f2ba/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.csproj
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.csproj b/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.csproj
new file mode 100644
index 0000000..3b70a36
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_types_test/Sender/Sender.csproj
@@ -0,0 +1,86 @@
+\ufeff<?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\Debug\</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\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <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="Sender.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\src\Amqp.Net.csproj">
+      <Project>{92153715-1d99-43b1-b291-470cf91a156d}</Project>
+      <Name>Amqp.Net</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-interop-test/blob/0569f2ba/shims/amqpnetlite/src/amqp_types_test/Sender/packages.config
----------------------------------------------------------------------
diff --git a/shims/amqpnetlite/src/amqp_types_test/Sender/packages.config b/shims/amqpnetlite/src/amqp_types_test/Sender/packages.config
new file mode 100644
index 0000000..7496c87
--- /dev/null
+++ b/shims/amqpnetlite/src/amqp_types_test/Sender/packages.config
@@ -0,0 +1,21 @@
+\ufeff<?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


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