public void CanRegisterConsumer()
        {
            var mockRepository = new MockRepository();
            var rabbitModel = mockRepository.DynamicMock<IModel>();
            var messageSerializer = mockRepository.DynamicMock<IMessageSerializer>();
            var registeredConsumer = mockRepository.DynamicMock<IRegisteredConsumer>();
            var config = mockRepository.DynamicMock<IBrokerConfiguration>();

            using (mockRepository.Record())
            {
                SetupResult.For(registeredConsumer.Queue).Return("q");

                Expect.Call(rabbitModel.BasicConsume(null, false, null))
                    .IgnoreArguments()
                    .WhenCalled(mi =>
                                    {
                                        Assert.Equal("q", mi.Arguments[0] as string);
                                        Assert.Equal(false, (bool)mi.Arguments[1]);
                                        Assert.IsType(typeof(QueueActivityConsumer), mi.Arguments[2]);
                                    }).Return("token");
            }

            using (mockRepository.Playback())
            {
                var callbackConsumer = new GroupedCallbackConsumer(rabbitModel, messageSerializer, config);
                callbackConsumer.ConsumeQueue(registeredConsumer);

                Assert.Equal(1, callbackConsumer.QueueConsumers.Count);
                Assert.Equal(1, callbackConsumer.QueueConsumers.Values.Count);
                Assert.Equal("token", callbackConsumer.QueueConsumers.Values.First().ConsumeToken.ConsumerTag);

                callbackConsumer.Close();
                callbackConsumer.Dispose();
            }
        }
        public void AcksOnDelivery()
        {
            var mockRepository = new MockRepository();
            var rabbitModel = mockRepository.DynamicMock<IModel>();
            var messageSerializer = mockRepository.DynamicMock<IMessageSerializer>();
            var registeredConsumer = mockRepository.DynamicMock<IRegisteredConsumer>();
            var properties = mockRepository.Stub<IBasicProperties>();
            var config = mockRepository.DynamicMock<IBrokerConfiguration>();

            using (mockRepository.Record())
            {
                SetupResult.For(registeredConsumer.MessageType).Return(typeof (TestMessage));
                SetupResult.For(registeredConsumer.Queue).Return("q");
                SetupResult.For(registeredConsumer.ConsumerType).Return(typeof (TestConsumer));
                SetupResult.For(messageSerializer.DeserializeMessage(null)).IgnoreArguments().Return(
                    mockRepository.Stub<IMessageEnvelope<TestMessage>>());
                SetupResult.For(config.PipelineEvents).Return(new PipelineEvents());
                Expect.Call(() => rabbitModel.BasicAck(1, false));
            }

            using (mockRepository.Playback())
            {
                var callbackConsumer = new GroupedCallbackConsumer(rabbitModel, messageSerializer, config);
                callbackConsumer.ConsumeQueue(registeredConsumer);
                callbackConsumer.QueueConsumers["q"].Consumer.HandleBasicDeliver("ct1", 1, false, "ex", typeof(TestMessage).ToRoutingKey(), properties, new byte[0]);

                callbackConsumer.Close();
                callbackConsumer.Dispose();
            }
        }
        public void ClosesRegisteredConsumerTokensOnClose()
        {
            var mockRepository = new MockRepository();
            var rabbitModel = mockRepository.DynamicMock<IModel>();
            var messageSerializer = mockRepository.DynamicMock<IMessageSerializer>();
            var registeredConsumer = mockRepository.DynamicMock<IRegisteredConsumer>();
            var config = mockRepository.DynamicMock<IBrokerConfiguration>();

            using (mockRepository.Record())
            {
                SetupResult.For(registeredConsumer.Queue).Return("q");
            }

            using (mockRepository.Playback())
            {
                var callbackConsumer = new GroupedCallbackConsumer(rabbitModel, messageSerializer, config);
                callbackConsumer.ConsumeQueue(registeredConsumer);

                GroupedCallbackConsumer.QueueConsumer queueConsumer = callbackConsumer.QueueConsumers.Single().Value;

                Assert.False(queueConsumer.ConsumeToken.IsClosed);

                callbackConsumer.Close();

                Assert.True(queueConsumer.ConsumeToken.IsClosed);
            }
        }
        public void SetsPrincipalOnDelivery()
        {
            var mockRepository = new MockRepository();
            var rabbitModel = mockRepository.DynamicMock<IModel>();
            var messageSerializer = mockRepository.DynamicMock<IMessageSerializer>();
            var registeredConsumer = mockRepository.DynamicMock<IRegisteredConsumer>();
            var properties = mockRepository.Stub<IBasicProperties>();
            var envelope = mockRepository.DynamicMock<IMessageEnvelope<TestMessage>>();
            var message = new TestMessage();
            var config = mockRepository.DynamicMock<IBrokerConfiguration>();
            var pipelineEvents = new PipelineEvents();
            pipelineEvents.ResolvePrincipal +=
                (sender, args) => args.Principal = new GenericPrincipal(new GenericIdentity(args.MessageEnvelope.UserName + "set"), new string[0]);

            using (mockRepository.Record())
            {
                SetupResult.For(envelope.UserName).Return("user1");
                SetupResult.For(registeredConsumer.MessageType).Return(typeof(TestMessage));
                SetupResult.For(registeredConsumer.Queue).Return("q");
                SetupResult.For(registeredConsumer.ConsumerType).Return(typeof(TestConsumer));
                SetupResult.For(envelope.Message).Return(message);
                SetupResult.For(messageSerializer.DeserializeMessage(null)).IgnoreArguments().Return(envelope);
                SetupResult.For(config.PipelineEvents).Return(pipelineEvents);

                Expect.Call(() => registeredConsumer.Invoke(message)).WhenCalled(mi => Assert.Equal("user1set", Thread.CurrentPrincipal.Identity.Name));
            }

            using (mockRepository.Playback())
            {
                var callbackConsumer = new GroupedCallbackConsumer(rabbitModel, messageSerializer, config);
                callbackConsumer.ConsumeQueue(registeredConsumer);
                callbackConsumer.QueueConsumers["q"].Consumer.HandleBasicDeliver("ct1", 1, false, "ex", typeof(TestMessage).ToRoutingKey(), properties, new byte[0]);

                callbackConsumer.Close();
                callbackConsumer.Dispose();
            }
        }
        public void IsRunningAtCreation()
        {
            var mockRepository = new MockRepository();
            var rabbitModel = mockRepository.DynamicMock<IModel>();
            var messageSerializer = mockRepository.DynamicMock<IMessageSerializer>();
            var config = mockRepository.DynamicMock<IBrokerConfiguration>();

            var callbackConsumer = new GroupedCallbackConsumer(rabbitModel, messageSerializer, config);
            Assert.True(callbackConsumer.IsRunning);

            callbackConsumer.Close();
            callbackConsumer.Dispose();
        }
        public void DeserializesOnDelivery()
        {
            var mockRepository = new MockRepository();
            var rabbitModel = mockRepository.DynamicMock<IModel>();
            var messageSerializer = mockRepository.DynamicMock<IMessageSerializer>();
            var registeredConsumer = mockRepository.DynamicMock<IRegisteredConsumer>();
            var properties = mockRepository.Stub<IBasicProperties>();
            var envelope = mockRepository.DynamicMock<IMessageEnvelope<TestMessage>>();
            var config = mockRepository.DynamicMock<IBrokerConfiguration>();

            using (mockRepository.Record())
            {
                SetupResult.For(registeredConsumer.MessageType).Return(typeof(TestMessage));
                SetupResult.For(registeredConsumer.Queue).Return("q");
                Expect.Call(messageSerializer.DeserializeMessage(null))
                    .IgnoreArguments()
                    .WhenCalled(mi =>

                        {
                            var args = mi.Arguments[0] as QueueActivityConsumer.DeliverEventArgs;

                            Assert.Equal(new byte[0], args.Body);
                            Assert.Equal("ct1", args.ConsumerTag);
                            Assert.Equal(1, (long)args.DeliveryTag);
                            Assert.Equal("ex", args.Exchange);
                            Assert.Same(properties, args.Properties);
                            Assert.Equal("q", args.Queue);
                            Assert.Equal(false, args.Redelivered);
                            Assert.Equal(typeof(TestMessage).ToRoutingKey(), args.RoutingKey);
                        })
                    .Return(envelope);
            }

            using (mockRepository.Playback())
            {
                var callbackConsumer = new GroupedCallbackConsumer(rabbitModel, messageSerializer, config);
                callbackConsumer.ConsumeQueue(registeredConsumer);
                callbackConsumer.QueueConsumers["q"].Consumer.HandleBasicDeliver("ct1", 1, false, "ex", typeof(TestMessage).ToRoutingKey(), properties, new byte[0]);

                callbackConsumer.Close();
                callbackConsumer.Dispose();
            }
        }