public async Task SimpleMessageListener()
        {
            var queues = new List <IQueue>()
            {
                QueueBuilder.Durable("testQueue").Build(),
                QueueBuilder.Durable("secondQueue").Build()
            };
            var provider = await Config.CreateAndStartServices(null, queues, typeof(SimpleMessageListenerTestBean));

            var context = provider.GetService <IApplicationContext>();
            var factory = context.GetService <IRabbitListenerContainerFactory>() as RabbitListenerContainerTestFactory;

            Assert.Single(factory.GetListenerContainers());
            var container = factory.GetListenerContainers()[0] as MessageListenerTestContainer;

            var endpoint = container.Endpoint;

            Assert.IsType <MethodRabbitListenerEndpoint>(endpoint);
            var methodEndpoint = endpoint as MethodRabbitListenerEndpoint;

            Assert.NotNull(methodEndpoint.Instance);
            Assert.NotNull(methodEndpoint.Method);

            var listenerContainer = new DirectMessageListenerContainer(context);

            methodEndpoint.SetupListenerContainer(listenerContainer);
            Assert.NotNull(listenerContainer.MessageListener);
            Assert.True(container.IsStarted);
            provider.Dispose();
            Assert.True(container.IsStopped);
        }
        public async Task MixedQueuesAndQueueNamesTestBeanTest()
        {
            var queue1 = QueueBuilder.Durable("metaTestQueue").Build();

            queue1.ServiceName = "queue1";
            var queue2 = QueueBuilder.Durable("metaTestQueue2").Build();

            var queues = new List <IQueue>()
            {
                queue1, queue2
            };
            var provider = await Config.CreateAndStartServices(null, queues, typeof(MixedQueuesAndQueueNamesTestBean));

            var context = provider.GetService <IApplicationContext>();
            var factory = context.GetService <IRabbitListenerContainerFactory>() as RabbitListenerContainerTestFactory;

            Assert.Single(factory.GetListenerContainers());
            var container = factory.GetListenerContainers()[0] as MessageListenerTestContainer;

            var endpoint = container.Endpoint as AbstractRabbitListenerEndpoint;

            Assert.NotNull(endpoint);

            Assert.Equal(2, endpoint.QueueNames.Count);
            Assert.Contains("metaTestQueue", endpoint.QueueNames);
            Assert.Contains("metaTestQueue2", endpoint.QueueNames);
        }
        public async Task InvalidValueInAnnotationTestBeanTest()
        {
            var queue1 = QueueBuilder.Durable("metaTestQueue").Build();

            queue1.ServiceName = "queue1";
            var queue2 = QueueBuilder.Durable("metaTestQueue2").Build();

            queue2.ServiceName = "queue2";

            var queues = new List <IQueue>()
            {
                queue1, queue2
            };
            var excep = await Assert.ThrowsAsync <ExpressionException>(() => Config.CreateAndStartServices(null, queues, typeof(InvalidValueInAnnotationTestBean)));
        }
            public static async Task <ServiceProvider> CreateAndStartServices()
            {
                var mockConnectionFactory = new Mock <IConnectionFactory>();
                var mockConnection        = new Mock <IConnection>();
                var mockChannel           = new Mock <R.IModel>();

                mockConnectionFactory.Setup(f => f.CreateConnection()).Returns(mockConnection.Object);
                mockConnection.Setup(c => c.CreateChannel(It.IsAny <bool>())).Returns(mockChannel.Object);
                mockChannel.Setup((c) => c.CreateBasicProperties()).Returns(new MockRabbitBasicProperties());
                mockConnection.Setup((c) => c.IsOpen).Returns(true);
                mockChannel.Setup((c) => c.IsOpen).Returns(true);
                var queueName = new AtomicReference <string>();

                mockChannel.Setup(c => c.QueueDeclarePassive(It.IsAny <string>())).Returns(() => new R.QueueDeclareOk(queueName.Value, 0, 0))
                .Callback <string>((name) => queueName.Value = name);

                var services = new ServiceCollection();
                var config   = new ConfigurationBuilder().Build();

                services.AddSingleton <IConfiguration>(config);
                services.AddRabbitHostingServices();
                services.AddRabbitMessageHandlerMethodFactory();
                services.AddRabbitListenerAttributeProcessor();
                services.AddRabbitDefaultMessageConverter();
                services.AddRabbitListenerEndpointRegistry();
                services.AddRabbitListenerEndpointRegistrar();

                services.AddSingleton <IConnectionFactory>(mockConnectionFactory.Object);
                services.AddRabbitListenerContainerFactory <TestDirectRabbitListenerContainerFactory>("rabbitListenerContainerFactory");
                services.AddRabbitAdmin();

                var myQueue      = QueueBuilder.Durable("myQueue").Build();
                var anotherQueue = QueueBuilder.Durable("anotherQueue").Build();
                var class1       = QueueBuilder.Durable("class1").Build();
                var class2       = QueueBuilder.Durable("class2").Build();

                services.AddRabbitQueues(myQueue, anotherQueue, class1, class2);
                services.AddSingleton <RabbitListenersBean>();
                services.AddSingleton <ClassLevelListenersBean>();
                services.AddRabbitListeners(config, typeof(RabbitListenersBean), typeof(ClassLevelListenersBean));

                var container = services.BuildServiceProvider();
                await container.GetRequiredService <IHostedService>().StartAsync(default);
        public async Task SimpleMessageListenerWithMixedAnnotations()
        {
            var configBuilder = new ConfigurationBuilder();

            configBuilder.AddInMemoryCollection(new Dictionary <string, string>()
            {
                { "rabbit:myQueue", "secondQueue" }
            });
            var config = configBuilder.Build();
            var queues = new List <IQueue>()
            {
                QueueBuilder.Durable("testQueue").Build(),
                QueueBuilder.Durable("secondQueue").Build()
            };
            var provider = await Config.CreateAndStartServices(config, queues, typeof(SimpleMessageListenerWithMixedAnnotationsTestBean));

            var context = provider.GetService <IApplicationContext>();
            var factory = context.GetService <IRabbitListenerContainerFactory>() as RabbitListenerContainerTestFactory;

            Assert.Single(factory.GetListenerContainers());
            var container = factory.GetListenerContainers()[0];

            var endpoint = container.Endpoint;

            Assert.IsType <MethodRabbitListenerEndpoint>(endpoint);
            var methodEndpoint = endpoint as MethodRabbitListenerEndpoint;

            Assert.NotNull(methodEndpoint.Instance);
            Assert.NotNull(methodEndpoint.Method);

            Assert.Equal(2, methodEndpoint.QueueNames.Count);
            Assert.Contains("testQueue", methodEndpoint.QueueNames);
            Assert.Contains("secondQueue", methodEndpoint.QueueNames);

            var listenerContainer = new DirectMessageListenerContainer(context);

            methodEndpoint.SetupListenerContainer(listenerContainer);
            Assert.NotNull(listenerContainer.MessageListener);
            Assert.True(container.IsStarted);
            provider.Dispose();
            Assert.True(container.IsStopped);
        }
        public async Task PropertyPlaceholderResolvingToQueueTestBeanTest()
        {
            var configBuilder = new ConfigurationBuilder();

            configBuilder.AddInMemoryCollection(new Dictionary <string, string>()
            {
                { "rabbit:myQueue", "#{@queue1}" }
            });
            var config = configBuilder.Build();

            var queue1 = QueueBuilder.Durable("metaTestQueue").Build();

            queue1.ServiceName = "queue1";
            var queue2 = QueueBuilder.Durable("metaTestQueue2").Build();

            queue2.ServiceName = "queue2";

            var queues = new List <IQueue>()
            {
                queue1, queue2
            };
            var provider = await Config.CreateAndStartServices(config, queues, typeof(PropertyPlaceholderResolvingToQueueTestBean));

            var context = provider.GetService <IApplicationContext>();
            var factory = context.GetService <IRabbitListenerContainerFactory>() as RabbitListenerContainerTestFactory;

            Assert.Single(factory.GetListenerContainers());
            var container = factory.GetListenerContainers()[0] as MessageListenerTestContainer;

            var endpoint = container.Endpoint as AbstractRabbitListenerEndpoint;

            Assert.NotNull(endpoint);

            Assert.Equal(2, endpoint.QueueNames.Count);
            Assert.Contains("metaTestQueue", endpoint.QueueNames);
            Assert.Contains("metaTestQueue2", endpoint.QueueNames);
        }