﻿/*
 * 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 TempDestinationTests : NMSTestSupport
    {
        protected const string QUEUE_DESTINATION_NAME = "queue://TEST.AutoDeleteQueue";
        protected const string TOPIC_DESTINATION_NAME = "topic://TEST.AutoDeleteTopic";
        protected const string TEMP_QUEUE_DESTINATION_NAME = "temp-queue://TEST.AutoDeleteTempQueue";
        protected const string TEMP_TOPIC_DESTINATION_NAME = "temp-topic://TEST.AutoDeleteTempTopic";

        [Test]
        public void TempDestinationDeletionTest(
            [Values(MsgDeliveryMode.Persistent, MsgDeliveryMode.NonPersistent)]
            MsgDeliveryMode deliveryMode,
            [Values(QUEUE_DESTINATION_NAME, TOPIC_DESTINATION_NAME, TEMP_QUEUE_DESTINATION_NAME,
                TEMP_TOPIC_DESTINATION_NAME)]
            string destinationName)
        {
            using (IConnection connection1 = CreateConnection(GetTestClientId()))
            {
                connection1.Start();
                using (ISession session = connection1.CreateSession(AcknowledgementMode.AutoAcknowledge))
                {
                    const int MaxNumDestinations = 100;

                    for (int index = 1; index <= MaxNumDestinations; index++)
                    {
                        IDestination destination = CreateDestination(session, destinationName);

                        using (IMessageProducer producer = session.CreateProducer(destination))
                        using (IMessageConsumer consumer = session.CreateConsumer(destination))
                        {
                            producer.DeliveryMode = deliveryMode;

                            IMessage request = session.CreateTextMessage("Hello World, Just Passing Through!");

                            request.NMSType = "TEMP_MSG";
                            producer.Send(request);
                            IMessage receivedMsg = consumer.Receive(TimeSpan.FromMilliseconds(5000));
                            Assert.IsNotNull(receivedMsg);
                            Assert.AreEqual(receivedMsg.NMSType, "TEMP_MSG");

                            // Ensures that Consumer closes out its subscription
                            consumer.Close();
                        }

                        try
                        {
                            session.DeleteDestination(destination);
                        }
                        catch (NotSupportedException)
                        {
                            // Might as well not try this again.
                            break;
                        }
                    }
                }
            }
        }
    }
}