blob: 8e192e90f18829ee36952b8d2a8761ec484f35bc [file] [log] [blame]
/*
* 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<string>(TestString, messageProperties);
}
[Test]
public void NonDefaultAmqpProperties()
{
const string TestString = "Test Message";
AmqpProperties messageProperties = this.CreateMessageProperties();
this.SendMessage(TestString, messageProperties);
this.ReceiveMessage<string>(TestString, messageProperties);
}
private AmqpProperties CreateMessageProperties()
{
Dictionary<string, string> 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<IOutputChannel> channelFactory =
new ChannelFactory<IOutputChannel>(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>(TObjectType objectToMatch, AmqpProperties expectedProperties)
{
Uri receiveFromUri = new Uri("amqp:message_queue");
IChannelListener<IInputChannel> listener = Util.GetBinding().BuildChannelListener<IInputChannel>(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<TObjectType>();
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();
}
}
}
}