public void AcknowledgeMessageCallsBasicAckTest()
        {
            var connFactory = Substitute.For<IConnectionFactory>();
            var conn = Substitute.For<IConnection>();
            var model = Substitute.For<IModel>();

            connFactory.CreateConnection().Returns(conn);
            connFactory.CreateConnection(string.Empty).ReturnsForAnyArgs(conn);
            conn.CreateModel().Returns(model);
            model.QueueDeclare(null, false, false, false, null).ReturnsForAnyArgs(new QueueDeclareOk(string.Empty, 0, 0));

            var setup = new RabbitMQReaderSetup
            {
                ConnectionFactory = connFactory,
                Exchange = null,
                QueueName = null,
                IsDurable = false,
                DeleteQueueOnClose = true,
                QueueTimeToLive = TimeSpan.FromMinutes(20),
                Options = new RabbitMQReaderOptions(),
            };
            using (var rdr = new RabbitMQReader(setup, false))
            {
                rdr.AcknowledgeMessage(5, TimeSpan.FromSeconds(90), CancellationToken.None);
                model.Received().BasicAck(5, false);
            }
        }
 public RabbitMessageQueueReaderTests(ITestOutputHelper outputHelper)
     : base(outputHelper)
 {
     var setup = new RabbitMQReaderSetup
     {
         ConnectionFactory = TestConnectionFactory.Instance,
         Exchange = "amq.direct",
         QueueName = Guid.NewGuid().ToString(),
         IsDurable = false,
         DeleteQueueOnClose = true,
         QueueTimeToLive = TimeSpan.FromMinutes(20),
         Options = new RabbitMQReaderOptions(),
     };
     Reader = new RabbitMQReader(setup, false);
 }
        protected override void OnOpen(TimeSpan timeout)
        {
            MethodInvocationTrace.Write();
            var timeoutTimer = TimeoutTimer.StartNew(timeout);
            base.OnOpen(timeoutTimer.RemainingTime);

            var connFactory = Binding.CreateConnectionFactory(RemoteAddress.Uri.Host, RemoteAddress.Uri.Port);
            var localAddress = new RabbitMQTaskQueueUri(LocalAddress.Uri.ToString());
            var setup = new RabbitMQReaderSetup
            {
                CancelToken = ConcurrentOperationManager.Token,
                ConnectionFactory = connFactory,
                DeleteQueueOnClose = true,
                Exchange = Binding.Exchange,
                IsDurable = Binding.IsDurable,
                MaxPriority = Binding.MaxPriority,
                Options = Binding.ReaderOptions,
                QueueName = localAddress.QueueName,
                QueueTimeToLive = Binding.ReplyQueueTimeToLive,
                Timeout = timeoutTimer.RemainingTime,
            };
            setup.QueueArguments = new Dictionary<string, object>();
            setup.QueueArguments.Add(TaskQueueReaderQueueArguments.IsTaskInputQueue, false);
            setup.QueueArguments.Add(TaskQueueReaderQueueArguments.Scheme, Constants.Scheme);
            _queueReader = Binding.QueueReaderWriterFactory.CreateReader(setup);
        }
        public void DequeueReturnsMessageTest()
        {
            var connFactory = Substitute.For<IConnectionFactory>();
            var conn = Substitute.For<IConnection>();
            var model = Substitute.For<IModel>();

            var queueName = Guid.NewGuid().ToString();

            connFactory.CreateConnection().Returns(conn);
            connFactory.CreateConnection(string.Empty).ReturnsForAnyArgs(conn);
            conn.CreateModel().Returns(model);
            conn.IsOpen.Returns(true);
            model.IsClosed.Returns(false);
            model.QueueDeclare(null, false, false, false, null).ReturnsForAnyArgs(new QueueDeclareOk(queueName, 1, 0));
            model.QueueDeclarePassive(null).ReturnsForAnyArgs(new QueueDeclareOk(string.Empty, 1, 0));
            model.MessageCount(null).ReturnsForAnyArgs(x => 1u);

            var payload = Guid.NewGuid().ToByteArray();
            var result = new BasicGetResult(0, false, null, null, 0, null, payload);
            model.BasicGet(queueName, false).Returns(result);

            var setup = new RabbitMQReaderSetup
            {
                ConnectionFactory = connFactory,
                Exchange = Constants.DefaultExchange,
                QueueName = queueName,
                IsDurable = false,
                DeleteQueueOnClose = true,
                QueueTimeToLive = TimeSpan.FromMinutes(20),
                Options = new RabbitMQReaderOptions(),
            };
            using (var rdr = new RabbitMQReader(setup, false))
            {
                var msg = rdr.Dequeue(TimeSpan.FromSeconds(30), CancellationToken.None);
                Assert.Equal(payload, msg.Body.CopyToByteArray());
            }
        }
        public void WaitForMessageReturnsTrueWhenMessageIsAvailableTest()
        {
            var delay = TimeSpan.FromSeconds(15);

            var queueName = Guid.NewGuid().ToString();

            var setup = new RabbitMQReaderSetup
            {
                ConnectionFactory = new ConnectionFactory(),
                QueueName = queueName,
                Exchange= PredeclaredExchangeNames.Direct,
                IsDurable = false,
                DeleteQueueOnClose = true,
                QueueTimeToLive = TimeSpan.FromMinutes(20),
                Options = new RabbitMQReaderOptions(),
            };
            using (var rdr = new RabbitMQReader(setup, false))
            using (var writer = new RabbitMQWriter(new RabbitMQWriterSetup { ConnectionFactory = new ConnectionFactory() }, false))
            using (var timer = new Timer(state => writer.Publish(PredeclaredExchangeNames.Direct, queueName, new MemoryStream(), TimeSpan.MaxValue, CancellationToken.None), null, delay, TimeSpan.Zero))
            {
                var stopwatch = Stopwatch.StartNew();
                var gotMsg = rdr.WaitForMessage(TimeSpan.FromSeconds(90), CancellationToken.None);
                stopwatch.Stop();
                Assert.True(gotMsg);
                Assert.True(stopwatch.Elapsed >= delay);
            }
        }
        public void DequeueThrowsWhenDisposedTest()
        {
            var connFactory = Substitute.For<IConnectionFactory>();
            var conn = Substitute.For<IConnection>();
            var model = Substitute.For<IModel>();
            var throttler = Substitute.For<IDequeueThrottler>();
            var throttlerFactory = Substitute.For<IDequeueThrottlerFactory>();
            throttlerFactory.Create(null, null).ReturnsForAnyArgs(throttler);

            connFactory.CreateConnection().Returns(conn);
            connFactory.CreateConnection(string.Empty).ReturnsForAnyArgs(conn);
            conn.CreateModel().Returns(model);
            model.QueueDeclare(null, false, false, false, null).ReturnsForAnyArgs(new QueueDeclareOk(string.Empty, 0, 0));
            model.QueueDeclarePassive(null).ReturnsForAnyArgs(new QueueDeclareOk(string.Empty, 1, 0));

            var setup = new RabbitMQReaderSetup
            {
                ConnectionFactory = connFactory,
                Exchange = null,
                QueueName = null,
                IsDurable = false,
                DeleteQueueOnClose = true,
                QueueTimeToLive = TimeSpan.FromMinutes(20),
                Options = new RabbitMQReaderOptions { DequeueThrottlerFactory = throttlerFactory },
            };
            using (var rdr = new RabbitMQReader(setup, false))
            {
                throttler.WhenForAnyArgs(x => x.Throttle(0, 0, CancellationToken.None)).Do(x =>
                {
                    ThreadPool.QueueUserWorkItem(state =>
                    {
                        try
                        {
                            rdr.Dispose();
                        }
                        catch { }
                    });
                });
                Exception error = null;
                try
                {
                    rdr.Dequeue(TimeSpan.FromSeconds(90), CancellationToken.None);
                }
                catch (ObjectDisposedException e)
                {
                    error = e;
                }
                Assert.NotNull(error);
            }
        }