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