/* * 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. */ namespace Apache.Qpid.Test.Channel.Functional { using System; using System.Collections.Generic; using System.Reflection; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Channels; using Apache.Qpid.AmqpTypes; using NUnit.Framework; [TestFixture] public class MessagePropertiesTest { private const string RoutingKey = "routing_key"; private const string SendToUri = "amqp:amq.direct?routingkey=" + RoutingKey; [Test] public void DefaultAmqpProperties() { const string TestString = "Test Message"; AmqpProperties messageProperties = new AmqpProperties(); this.SendMessage(TestString, messageProperties); this.ReceiveMessage(TestString, messageProperties); } [Test] public void NonDefaultAmqpProperties() { const string TestString = "Test Message"; AmqpProperties messageProperties = this.CreateMessageProperties(); this.SendMessage(TestString, messageProperties); this.ReceiveMessage(TestString, messageProperties); } private AmqpProperties CreateMessageProperties() { Dictionary messageProperties = Util.GetProperties("..\\..\\MessageProperties.txt"); AmqpProperties amqpProperties = new AmqpProperties(); amqpProperties.ContentType = (string)messageProperties["ContentType"]; amqpProperties.Durable = Convert.ToBoolean((string)messageProperties["Durable"]); amqpProperties.RoutingKey = (string)messageProperties["RoutingKey"]; amqpProperties.TimeToLive = TimeSpan.Parse((string)messageProperties["TimeToLive"]); return amqpProperties; } private void SendMessage(object objectToSend, AmqpProperties propertiesToSend) { ChannelFactory channelFactory = new ChannelFactory(Util.GetBinding(), SendToUri); IOutputChannel proxy = channelFactory.CreateChannel(); proxy.Open(); Message toSend = Message.CreateMessage(MessageVersion.Default, string.Empty, objectToSend); toSend.Properties["AmqpProperties"] = propertiesToSend; proxy.Send(toSend); toSend.Close(); proxy.Close(); channelFactory.Close(); } private void ReceiveMessage(TObjectType objectToMatch, AmqpProperties expectedProperties) { Uri receiveFromUri = new Uri("amqp:message_queue"); IChannelListener listener = Util.GetBinding().BuildChannelListener(receiveFromUri, new BindingParameterCollection()); listener.Open(); IInputChannel service = listener.AcceptChannel(TimeSpan.FromSeconds(10)); service.Open(); Message receivedMessage = service.Receive(TimeSpan.FromSeconds(10)); try { TObjectType receivedObject = receivedMessage.GetBody(); Assert.True(receivedObject.Equals(objectToMatch), "Original and deserialized objects do not match"); AmqpProperties receivedProperties = (AmqpProperties)receivedMessage.Properties["AmqpProperties"]; PropertyInfo[] propInfo = typeof(AmqpProperties).GetProperties(); for (int i = 0; i < propInfo.Length; i++) { string propertyName = propInfo[i].Name; if (propertyName.Equals("RoutingKey", StringComparison.InvariantCultureIgnoreCase)) { Assert.AreEqual(RoutingKey, Convert.ToString(propInfo[i].GetValue(receivedProperties, null))); } else { Assert.AreEqual(Convert.ToString(propInfo[i].GetValue(expectedProperties, null)), Convert.ToString(propInfo[i].GetValue(receivedProperties, null))); } } } catch (NullReferenceException) { Assert.Fail("Message not received"); } catch (SerializationException) { Assert.Fail("Deserialized object not of correct type"); } finally { receivedMessage.Close(); service.Close(); listener.Close(); } } } }