/*
 * 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 Apache.NMS.Util;
using NUnit.Framework;

namespace Apache.NMS.Test
{
	//[TestFixture]
	public class MessageTransformerTest : NMSTest
	{
		private string propertyName = "ADDITIONAL-PROPERTY";
		private string propertyValue = "ADDITIONAL-PROPERTY-VALUE";

		protected MessageTransformerTest(NMSTestSupport testSupport)
			: base(testSupport)
		{
		}

		//[Test]
		public virtual void TestProducerTransformer(
			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
			MsgDeliveryMode deliveryMode)
		{
			using(IConnection connection = CreateConnection())
			{
				connection.Start();
				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
				{
					IDestination destination = session.CreateTemporaryTopic();
					using(IMessageConsumer consumer = session.CreateConsumer(destination))
					using(IMessageProducer producer = session.CreateProducer(destination))
					{
						producer.DeliveryMode = deliveryMode;
						producer.ProducerTransformer = DoProducerTransform;

                        IMessage message = session.CreateMessage();

                        message.Properties["Test"] = "Value";

                        producer.Send(message);

                        message = consumer.Receive(TimeSpan.FromMilliseconds(5000));

                        Assert.IsNotNull(message);
                        Assert.IsTrue(message.Properties.Count == 2);

                        Assert.AreEqual("Value", message.Properties["Test"]);
                        Assert.AreEqual(propertyValue, message.Properties[propertyName]);
					}
				}
			}
		}
		
		//[Test]
		public virtual void TestConsumerTransformer(
			//[Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
			MsgDeliveryMode deliveryMode)
		{
			using(IConnection connection = CreateConnection())
			{
				connection.Start();
				using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
				{
					IDestination destination = session.CreateTemporaryTopic();
					using(IMessageConsumer consumer = session.CreateConsumer(destination))
					using(IMessageProducer producer = session.CreateProducer(destination))
					{
						producer.DeliveryMode = deliveryMode;

						consumer.ConsumerTransformer = DoConsumerTransform;

                        IMessage message = session.CreateMessage();

                        message.Properties["Test"] = "Value";

                        producer.Send(message);

                        message = consumer.Receive(TimeSpan.FromMilliseconds(5000));

                        Assert.IsNotNull(message);
                        Assert.IsTrue(message.Properties.Count == 2, "Property Count should be 2");

                        Assert.AreEqual("Value", message.Properties["Test"], "Property 'Value' was incorrect");
                        Assert.AreEqual(propertyValue, message.Properties[propertyName], "Property not inserted");
                    }
				}
			}
		}
		
		private IMessage DoProducerTransform(ISession session, IMessageProducer producer, IMessage message)
		{
			message.Properties[propertyName] = propertyValue;
			
			return message;
		}

		private IMessage DoConsumerTransform(ISession session, IMessageConsumer consumer, IMessage message)
		{
            IMessage newMessage = session.CreateMessage();

            MessageTransformation.CopyNMSMessageProperties(message, newMessage);

			newMessage.Properties[propertyName] = propertyValue;

			return newMessage;
		}
	}
}

