﻿/*
 * 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.Test;
using Apache.NMS.Util;
using NUnit.Framework;

namespace Apache.NMS.ActiveMQ.Test
{
	[TestFixture]
	public class PrefetchSizeZeroTest : NMSTestSupport
	{	
        protected static string DESTINATION_NAME = "TestPrefetchSizeZero";
			
		[Test]
		public void TestZeroPrefetchSize()
		{
			using(IConnection connection = CreateConnection())
			{
				connection.Start();
				using(Session session = (Session)connection.CreateSession(AcknowledgementMode.AutoAcknowledge))
				{
					IDestination destination = SessionUtil.GetDestination(session, DESTINATION_NAME);
                    session.PrefetchSize = 0;
					using(IMessageConsumer consumer = session.CreateConsumer(destination))
					using(IMessageProducer producer = session.CreateProducer(destination))
					{
						SendMessage(producer);
                        SendMessage(producer);

						IMessage receivedMsg = consumer.Receive(TimeSpan.FromSeconds(5));
                        Assert.IsNotNull(receivedMsg);
                        receivedMsg = consumer.Receive(TimeSpan.FromSeconds(5));
                        Assert.IsNotNull(receivedMsg);
						receivedMsg = consumer.Receive(TimeSpan.FromSeconds(5));
                        Assert.IsNull(receivedMsg);

						// Send another message.
						SendMessage(producer);
                        receivedMsg = consumer.Receive(TimeSpan.FromSeconds(5));
						Assert.IsNotNull(receivedMsg);
                   
					}
				}
			}
		}
	
		protected void SendMessage(IMessageProducer producer)
		{
			IMessage request = producer.CreateMessage();
			request.NMSType = "Test";
			producer.Send(request);
		}
	}
}
