public void ChannelFlow_SetsIfTheChannelIsActive(bool value)
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            // Act
            model.ChannelFlow(value);

            // Assert
            Assert.That(model.IsChannelFlowActive,Is.EqualTo(value));
        }
        public void CreateStreamProperties_ReturnsStreamProperties()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            // Act
            var result = model.CreateStreamProperties();

            // Assert
            Assert.That(result, Is.Not.Null);
        }
Exemplo n.º 3
0
        private void ConfigureQueueBinding(RabbitServer rabbitServer, string exchangeName, string queueName)
        {
            var connectionFactory = new FakeConnectionFactory(rabbitServer);
            using (var connection = connectionFactory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue:queueName,durable:false,exclusive:false,autoDelete:false,arguments:null);
                channel.ExchangeDeclare(exchange: exchangeName, type: ExchangeType.Direct);

                channel.QueueBind(queueName,exchangeName,null);
            }
        }
        public void WithRabbitServer_SetsServer()
        {
            // Arrange
            var factory = new FakeConnectionFactory();
            var otherServer = new RabbitServer();
            factory.WithRabbitServer(otherServer);

            // Act
            var result = factory.Server;

            // Assert
            Assert.That(result, Is.SameAs(otherServer));
        }
Exemplo n.º 5
0
        public void SendToExchangeOnly()
        {
            var rabbitServer = new RabbitServer();
            var connectionFactory = new FakeConnectionFactory(rabbitServer);

            using (var connection = connectionFactory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                const string message = "hello world!";
                var messageBody = Encoding.ASCII.GetBytes(message);
                channel.BasicPublish(exchange:"my_exchange",routingKey:null,mandatory:false,basicProperties:null,body:messageBody);
            }

            Assert.That(rabbitServer.Exchanges["my_exchange"].Messages.Count,Is.EqualTo(1));
        }
        public void ExchangeDeclare_AllArguments_CreatesExchange()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            const string exchangeName = "someExchange";
            const string exchangeType = "someType";
            const bool isDurable = true;
            const bool isAutoDelete = false;
            var arguments = new Hashtable();

            // Act
            model.ExchangeDeclare(exchange:exchangeName,type:exchangeType,durable:isDurable,autoDelete:isAutoDelete,arguments:arguments);
        
            // Assert
            Assert.That(node.Exchanges,Has.Count.EqualTo(1));

            var exchange = node.Exchanges.First();
            AssertExchangeDetails(exchange, exchangeName, isAutoDelete, arguments, isDurable, exchangeType);
        }
Exemplo n.º 7
0
        public void QueuePurge_RemovesAllMessagesFromQueue()
        {
            // Arrange
            var node  = new RabbitServer();
            var model = new FakeModel(node);

            model.QueueDeclarePassive("my_other_queue");
            node.Queues["my_other_queue"].Messages.Enqueue(new RabbitMessage());
            node.Queues["my_other_queue"].Messages.Enqueue(new RabbitMessage());

            model.QueueDeclarePassive("my_queue");
            node.Queues["my_queue"].Messages.Enqueue(new RabbitMessage());
            node.Queues["my_queue"].Messages.Enqueue(new RabbitMessage());
            node.Queues["my_queue"].Messages.Enqueue(new RabbitMessage());
            node.Queues["my_queue"].Messages.Enqueue(new RabbitMessage());

            // Act
            model.QueuePurge("my_queue");

            // Assert
            Assert.That(node.Queues["my_queue"].Messages, Is.Empty);
            Assert.That(node.Queues["my_other_queue"].Messages, Is.Not.Empty);
        }
        public void ReceiveMessagesOnQueue()
        {
            var rabbitServer = new RabbitServer();

            ConfigureQueueBinding(rabbitServer, "my_exchange", "my_queue");
            SendMessage(rabbitServer, "my_exchange", "hello_world");

            var connectionFactory = new FakeConnectionFactory(rabbitServer);

            using (var connection = connectionFactory.CreateConnection())
                using (var channel = connection.CreateModel())
                {
                    // First message
                    var message = channel.BasicGet("my_queue", noAck: false);

                    Assert.That(message, Is.Not.Null);
                    var messageBody = Encoding.ASCII.GetString(message.Body);

                    Assert.That(messageBody, Is.EqualTo("hello_world"));

                    channel.BasicAck(message.DeliveryTag, multiple: false);
                }
        }
        public void BasicAck()
        {
            var node  = new RabbitServer();
            var model = new FakeModel(node);

            model.ExchangeDeclare("my_exchange", ExchangeType.Direct);
            model.QueueDeclarePassive("my_queue");
            model.ExchangeBind("my_queue", "my_exchange", null);

            var message        = "hello world!";
            var encodedMessage = Encoding.ASCII.GetBytes(message);

            model.BasicPublish("my_exchange", null, new BasicProperties(), encodedMessage);
            model.BasicConsume("my_queue", false, new EventingBasicConsumer(model));

            // Act
            var deliveryTag = model._workingMessages.First().Key;

            model.BasicAck(deliveryTag, false);

            // Assert
            Assert.That(node.Queues["my_queue"].Messages.Count, Is.EqualTo(0));
        }
        public void QueueDeclare_WithExclusive_DifferentModel_CreatesQueue()
        {
            // Arrange
            var node   = new RabbitServer();
            var model  = new FakeModel(node);
            var model2 = new FakeModel(node);

            const string queueName    = "someQueue";
            const bool   isDurable    = true;
            const bool   isExclusive  = true;
            const bool   isAutoDelete = true;
            var          arguments    = new Dictionary <string, object>();

            // Act
            model.QueueDeclare(queue: queueName, durable: isDurable, exclusive: isExclusive, autoDelete: isAutoDelete, arguments: arguments);
            var ex = Assert.Throws <OperationInterruptedException>(
                delegate { model2.QueueDeclare(queue: queueName, durable: isDurable, exclusive: isExclusive, autoDelete: isAutoDelete, arguments: arguments); });

            // Assert
            Assert.That(ex.ShutdownReason.ReplyCode, Is.EqualTo(405));
            Assert.That(ex.ShutdownReason.Initiator, Is.EqualTo(ShutdownInitiator.Peer));
            StringAssert.StartsWith($"RESOURCE_LOCKED - cannot obtain exclusive access to locked queue '{queueName}'", ex.ShutdownReason.ReplyText);
        }
        public void QueueDeclare_WithExclusive_SameModel_CreatesQueue()
        {
            // Arrange
            var node  = new RabbitServer();
            var model = new FakeModel(node);

            const string queueName    = "someQueue";
            const bool   isDurable    = true;
            const bool   isExclusive  = true;
            const bool   isAutoDelete = true;
            var          arguments    = new Dictionary <string, object>();

            // Act
            model.QueueDeclare(queue: queueName, durable: isDurable, exclusive: isExclusive, autoDelete: isAutoDelete, arguments: arguments);
            model.QueueDeclare(queue: queueName, durable: isDurable, exclusive: isExclusive, autoDelete: isAutoDelete, arguments: arguments);

            // Assert
            Assert.That(node.Queues, Has.Count.EqualTo(1));

            var queue = node.Queues.First();

            AssertQueueDetails(queue, queueName, isAutoDelete, arguments, isDurable, isExclusive);
        }
Exemplo n.º 12
0
        public void RabbitMQ_ReceiveMessage()
        {
            var rabbitServer = new RabbitServer();

            var connectionFactory = new FakeConnectionFactory(rabbitServer);

            using (var connection = connectionFactory.CreateConnection())
            {
                var helper = new RabbitMQHelper(connection, "test_exchange");

                var message = Encoding.UTF8.GetBytes("bob");

                helper.PushMessageIntoQueue(message, "my_queue");

                // First message
                var response = helper.ReadMessageFromQueue("my_queue");

                response.Should().NotBeNull();

                var messageBody = Encoding.UTF8.GetString(message);

                messageBody.Should().Be("bob");
            }
        }
Exemplo n.º 13
0
        public void SendingAndGettingMultipleMessages()
        {
            var rabbitServer      = new RabbitServer();
            var connectionFactory = new FakeConnectionFactory(rabbitServer);

            ConfigureQueueBinding(rabbitServer, "my_exchange", "some_queue");

            using (var connection = connectionFactory.CreateConnection())
                using (var channel = connection.CreateModel())
                {
                    const string message     = "hello world!";
                    var          messageBody = Encoding.ASCII.GetBytes(message);
                    channel.BasicPublish("my_exchange", null, false, channel.CreateBasicProperties(), messageBody);
                    channel.BasicPublish("my_exchange", null, false, channel.CreateBasicProperties(), messageBody);
                    var result = channel.BasicGet("some_queue", false);
                    Assert.That(rabbitServer.Queues["some_queue"].Messages.Count, Is.EqualTo(2));
                    channel.BasicAck(result.DeliveryTag, false);
                    Assert.That(rabbitServer.Queues["some_queue"].Messages.Count, Is.EqualTo(1));
                    result = channel.BasicGet("some_queue", false);
                    Assert.That(rabbitServer.Queues["some_queue"].Messages.Count, Is.EqualTo(1));
                    channel.BasicAck(result.DeliveryTag, false);
                    Assert.That(rabbitServer.Queues["some_queue"].Messages.Count, Is.EqualTo(0));
                }
        }
Exemplo n.º 14
0
        public void Nacking_Message_Should_Not_Reenqueue_Brand_New_Message(bool requeue, int expectedMessageCount)
        {
            // arrange
            var node     = new RabbitServer();
            var model    = new FakeModel(node);
            var consumer = new QueueingBasicConsumer();

            model.ExchangeDeclare("my_exchange", ExchangeType.Direct);
            model.QueueDeclare("my_queue");
            model.ExchangeBind("my_queue", "my_exchange", null);

            var encodedMessage = Encoding.ASCII.GetBytes("hello world!");

            model.BasicPublish("my_exchange", null, new BasicProperties(), encodedMessage);
            model.BasicConsume("my_queue", false, consumer);

            // act
            consumer.Queue.TryDequeue(out var message);
            model.BasicNack(message.DeliveryTag, false, requeue);

            // assert
            Assert.That(consumer.Queue.Count, Is.EqualTo(expectedMessageCount));
            Assert.That(model.WorkingMessages.Count, Is.EqualTo(expectedMessageCount));
        }
Exemplo n.º 15
0
        public async Task TopicPatternTest()
        {
            Dictionary <string, int> dict         = new Dictionary <string, int>(); //接收的消息数量
            Dictionary <string, int> expectedDict = new Dictionary <string, int>(); //发送的消息数量

            string[] queues      = new string[] { $"{queue1}.topic", $"{queue2}.topic" };
            var      routeQueues = queues.Select(f => new RouteQueue()
            {
                Arguments = null,
                Queue     = f,
                Route     = $"#.{f}.#",
                Options   = new QueueOptions()
                {
                    AutoDelete = true,
                    Durable    = true,
                    Arguments  = arguments
                }
            }).ToArray();

            RabbitServer rabbitServer = new RabbitServer();

            rabbitServer.Register(services =>
            {
                services.AddRabbitProducer(options =>
                {
                    options.Hosts       = hosts;
                    options.Port        = port;
                    options.UserName    = userName;
                    options.Password    = password;
                    options.VirtualHost = virtualHost;

                    options.Arguments   = arguments;
                    options.AutoDelete  = true;
                    options.Durable     = true;
                    options.Queues      = null;
                    options.Type        = RabbitExchangeType.Topic;
                    options.RouteQueues = routeQueues;
                    options.Exchange    = topic;

                    options.InitializeCount = 10;
                });

                var builder = services.AddRabbitConsumer(options =>
                {
                    options.Hosts       = hosts;
                    options.Port        = port;
                    options.UserName    = userName;
                    options.Password    = password;
                    options.VirtualHost = virtualHost;

                    options.Arguments   = arguments;
                    options.AutoDelete  = true;
                    options.Durable     = true;
                    options.Type        = RabbitExchangeType.Topic;
                    options.RouteQueues = routeQueues;

                    options.FetchCount = 1;
                    options.AutoAck    = false;
                });
                foreach (var queue in queues)
                {
                    dict[queue]         = 0;
                    expectedDict[queue] = 0;
                    builder.AddListener(topic, queue, result =>
                    {
                        Output.WriteLine($"{queue}:" + JsonSerializer.Serialize(result));
                        dict[queue]++;
                        result.Commit();
                    });
                }
            });
            await rabbitServer.StartAsync();

            Thread.Sleep(1000);//等待运行1秒

            var serviceProvider = rabbitServer.ServiceProvider;
            var factory         = serviceProvider.GetService <IRabbitProducerFactory>();
            var producer        = factory.Create();

            for (var i = 0; i < 10; i++)
            {
                var routeQueue = routeQueues[new Random().Next(0, routeQueues.Length)];
                await producer.PublishAsync($"{nameof(RabbitMqServiceTest)}.{routeQueue.Queue}.{i}", "direct" + i);

                expectedDict[routeQueue.Queue] += 1;
            }

            BlockUntil(() => dict.Sum(f => f.Value) >= 10, 3000);

            foreach (var queue in queues)
            {
                Output.WriteLine($"{queue}:{expectedDict[queue]}-{dict[queue]}");
                Assert.Equal(expectedDict[queue], dict[queue]);
            }

            await rabbitServer.StopAsync();
        }
Exemplo n.º 16
0
        public void QueuePurge_RemovesAllMessagesFromQueue()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            model.QueueDeclarePassive("my_other_queue");
            node.Queues["my_other_queue"].Messages.Enqueue(new RabbitMessage());
            node.Queues["my_other_queue"].Messages.Enqueue(new RabbitMessage());

            model.QueueDeclarePassive("my_queue");
            node.Queues["my_queue"].Messages.Enqueue(new RabbitMessage());
            node.Queues["my_queue"].Messages.Enqueue(new RabbitMessage());
            node.Queues["my_queue"].Messages.Enqueue(new RabbitMessage());
            node.Queues["my_queue"].Messages.Enqueue(new RabbitMessage());

            // Act
            model.QueuePurge("my_queue");

            // Assert
            Assert.That(node.Queues["my_queue"].Messages, Is.Empty);
            Assert.That(node.Queues["my_other_queue"].Messages, Is.Not.Empty);
        }
Exemplo n.º 17
0
 public RabbitMQHelperTests()
 {
     server     = new RabbitServer();
     connection = new FakeConnection(server);
 }
Exemplo n.º 18
0
        private static void RegisterBaseClasses(IUnityContainer container, ISdkConfiguration config)
        {
            container.RegisterInstance(config, new ContainerControlledLifetimeManager());

            //register common types
            container.RegisterType <HttpClient, HttpClient>(
                new ContainerControlledLifetimeManager(),
                new InjectionConstructor());

            var seed  = (int)DateTime.Now.Ticks;
            var rand  = new Random(seed);
            var value = rand.Next();

            Log.Info($"Initializing sequence generator with MinValue={value}, MaxValue={long.MaxValue}");
            container.RegisterType <ISequenceGenerator, IncrementalSequenceGenerator>(
                new ContainerControlledLifetimeManager(),
                new InjectionConstructor(
                    (long)value,
                    long.MaxValue));

            container.RegisterType <HttpDataFetcher, HttpDataFetcher>("Base",
                                                                      new ContainerControlledLifetimeManager(),
                                                                      new InjectionConstructor(
                                                                          new ResolvedParameter <HttpClient>(),
                                                                          config.AccessToken ?? string.Empty,
                                                                          RestConnectionFailureLimit,
                                                                          RestConnectionFailureTimeoutInSec));

            container.RegisterType <LogHttpDataFetcher, LogHttpDataFetcher>("Base",
                                                                            new ContainerControlledLifetimeManager(),
                                                                            new InjectionConstructor(
                                                                                new ResolvedParameter <HttpClient>(),
                                                                                config.AccessToken ?? string.Empty,
                                                                                new ResolvedParameter <ISequenceGenerator>(),
                                                                                RestConnectionFailureLimit,
                                                                                RestConnectionFailureTimeoutInSec));

            var logFetcher = container.Resolve <LogHttpDataFetcher>("Base");

            container.RegisterInstance <IDataFetcher>("Base", logFetcher, new ContainerControlledLifetimeManager());
            container.RegisterInstance <IDataPoster>("Base", logFetcher, new ContainerControlledLifetimeManager());

            container.RegisterType <ISdkConfigurationInternal, SdkConfigurationInternal>(new ContainerControlledLifetimeManager());
            var configInternal = new SdkConfigurationInternal(config, logFetcher);

            container.RegisterInstance(configInternal);

            if (configInternal.Host.Contains("mtsgate-t1"))
            {
                _environment = "PROD";
            }
            else if (configInternal.Host.Contains("mtsgate-ci"))
            {
                _environment = "CI";
            }
            else
            {
                _environment = "CUSTOM";
            }

            container.RegisterType <IRabbitServer>(new ContainerControlledLifetimeManager());
            var rabbitServer = new RabbitServer(configInternal);

            container.RegisterInstance <IRabbitServer>(rabbitServer);

            container.RegisterType <ConnectionValidator, ConnectionValidator>(new ContainerControlledLifetimeManager());

            container.RegisterType <IConnectionFactory, ConfiguredConnectionFactory>(new ContainerControlledLifetimeManager());

            container.RegisterType <IChannelFactory, ChannelFactory>(new ContainerControlledLifetimeManager());

            container.RegisterInstance <ISequenceGenerator>(new IncrementalSequenceGenerator(), new ContainerControlledLifetimeManager());

            container.RegisterInstance <IConnectionStatus>(new ConnectionStatus(), new ContainerControlledLifetimeManager());
        }
Exemplo n.º 19
0
        public void BasicGet_MessageOnQueue_GetsMessage()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            model.ExchangeDeclare("my_exchange", ExchangeType.Direct);
            model.QueueDeclarePassive("my_queue");
            model.ExchangeBind("my_queue", "my_exchange", null);

            var message = "hello world!";
            var encodedMessage = Encoding.ASCII.GetBytes(message);
            model.BasicPublish("my_exchange", null, new BasicProperties(), encodedMessage);

            // Act
            var response = model.BasicGet("my_queue",false);

            // Assert
            Assert.That(response.Body, Is.EqualTo(encodedMessage));
            Assert.That(response.DeliveryTag, Is.GreaterThan(0));
        }
Exemplo n.º 20
0
        public ConsumerService(ILogger <ConsumerService> logger, ConsumerConfiguration consumerConfigurations, LogFormat logFormat, RabbitServer rabbitServer, IConfiguration iConfig, IDatabaseObjects databaseObjects)
        {
            _consumerConfigurations = consumerConfigurations;
            _logger          = logger;
            _iConfig         = iConfig;
            _logFormat       = logFormat;
            _rabbitServer    = rabbitServer;
            _instances       = new Dictionary <IParser, string>();
            _databaseObjects = databaseObjects;
            var usedDevices = _databaseObjects._usedDevice.Get();

            foreach (var item in usedDevices)
            {
                var targetType = Type.GetType("MLConsumer.DeviceAndParserServices." + item.DeviceClassName);
                _instances.Add(Activator.CreateInstance((targetType), _databaseObjects._errorLogService, _iConfig) as IParser, item.DeviceBrand);
            }
        }
 public void TestInitialize()
 {
     _rabbitServer      = new RabbitServer();
     _connectionFactory = new FakeConnectionFactory(_rabbitServer);
     _rabbitMqHistory   = new RabbitMqHistory(_connectionFactory);
 }
Exemplo n.º 22
0
        public void BasicPublish_PublishesMessage()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            model.ExchangeDeclare("my_exchange",ExchangeType.Direct);
            model.QueueDeclarePassive("my_queue");
            model.ExchangeBind("my_queue", "my_exchange", null);

            var message = "hello world!";
            var encodedMessage = Encoding.ASCII.GetBytes(message);

            // Act
            model.BasicPublish("my_exchange", null, new BasicProperties(), encodedMessage);

            // Assert
            Assert.That(node.Queues["my_queue"].Messages.Count,Is.EqualTo(1));
            Assert.That(node.Queues["my_queue"].Messages.First().Body, Is.EqualTo(encodedMessage));
        }
Exemplo n.º 23
0
        public void QueueBind_BindsAnExchangeToAQueue()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            const string queueName = "someQueue";
            const string exchangeName = "someExchange";
            const string routingKey = "someRoutingKey";
            var arguments = new Hashtable();

            model.ExchangeDeclare(exchangeName, "direct");
            model.QueueDeclarePassive(queueName);

            // Act
            model.QueueBind(queueName, exchangeName, routingKey, arguments);

            // Assert
            AssertBinding(node, exchangeName, routingKey, queueName);
        }
Exemplo n.º 24
0
 private static void AssertBinding(RabbitServer server, string exchangeName, string routingKey, string queueName)
 {
     Assert.That(server.Exchanges[exchangeName].Bindings, Has.Count.EqualTo(1));
     Assert.That(server.Exchanges[exchangeName].Bindings.First().Value.RoutingKey, Is.EqualTo(routingKey));
     Assert.That(server.Exchanges[exchangeName].Bindings.First().Value.Queue.Name, Is.EqualTo(queueName));
 }
Exemplo n.º 25
0
        public void ExchangeDelete_ExchangeDoesNotExists_DoesNothing()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            const string exchangeName = "someExchange";
            model.ExchangeDeclare(exchangeName, "someType");

            // Act
            model.ExchangeDelete(exchange: "someOtherExchange");

            // Assert
            Assert.That(node.Exchanges, Has.Count.EqualTo(1));

        }
Exemplo n.º 26
0
        public void ExchangeDeleteNoWait_ExchangeExists_RemovesTheExchange(bool ifUnused)
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            const string exchangeName = "someExchange";
            model.ExchangeDeclare(exchangeName, "someType");

            // Act
            model.ExchangeDeleteNoWait(exchange: exchangeName, ifUnused: ifUnused);

            // Assert
            Assert.That(node.Exchanges, Has.Count.EqualTo(0));
        }
Exemplo n.º 27
0
        public void ExchangeDeclarePassive_WithName_CreatesExchange()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            const string exchangeName = "someExchange";

            // Act
            model.ExchangeDeclarePassive(exchange: exchangeName);

            // Assert
            Assert.That(node.Exchanges, Has.Count.EqualTo(1));

            var exchange = node.Exchanges.First();
            AssertExchangeDetails(exchange, exchangeName, false, null, false, null);
        }
Exemplo n.º 28
0
        public void Close_ClosesTheChannel()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            
            // Act
            model.Close();

            // Assert
            Assert.That(model.IsClosed,Is.True);
            Assert.That(model.IsOpen,Is.False);
            Assert.That(model.CloseReason,Is.Not.Null);
        }
Exemplo n.º 29
0
        public async Task SimplePatternTest()
        {
            int    counter = 0;
            string queue   = $"{queue1}.simple";

            RabbitServer rabbitServer = new RabbitServer();

            rabbitServer.Register(services =>
            {
                services.AddRabbitProducer(options =>
                {
                    options.Hosts       = hosts;
                    options.Port        = port;
                    options.UserName    = userName;
                    options.Password    = password;
                    options.VirtualHost = virtualHost;

                    options.Arguments   = arguments;
                    options.AutoDelete  = true;
                    options.Durable     = true;
                    options.Queues      = new string[] { queue };
                    options.Type        = RabbitExchangeType.None;
                    options.RouteQueues = null;
                    options.Exchange    = string.Empty;

                    options.InitializeCount = 10;
                });

                services.AddRabbitConsumer(options =>
                {
                    options.Hosts       = hosts;
                    options.Port        = port;
                    options.UserName    = userName;
                    options.Password    = password;
                    options.VirtualHost = virtualHost;

                    options.Arguments   = arguments;
                    options.AutoDelete  = true;
                    options.Durable     = true;
                    options.Type        = RabbitExchangeType.None;
                    options.RouteQueues = null;

                    options.FetchCount = 10;
                    options.AutoAck    = true;
                }).AddListener(queue, result =>
                {
                    Output.WriteLine(JsonSerializer.Serialize(result));
                    counter++;
                });
            });
            await rabbitServer.StartAsync();

            Thread.Sleep(1000);//等待运行1秒

            var serviceProvider = rabbitServer.ServiceProvider;
            var factory         = serviceProvider.GetService <IRabbitProducerFactory>();
            var producer        = factory.Create();
            await producer.PublishAsync("hello simple");

            await producer.PublishAsync("hello simple again");

            BlockUntil(() => counter >= 2, 3000);

            Assert.Equal(2, counter);

            await rabbitServer.StopAsync();
        }
Exemplo n.º 30
0
        public void Abort_WithArguments_ClosesTheChannel()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);


            // Act
            model.Abort(5, "some message");

            // Assert
            Assert.That(model.IsClosed, Is.True);
            Assert.That(model.IsOpen, Is.False);
            Assert.That(model.CloseReason, Is.Not.Null);
        }
Exemplo n.º 31
0
        public void QueueDeclarePassive_WithName_CreatesQueue()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            const string queueName = "myQueue";

            // Act
            model.QueueDeclarePassive(queueName);

            // Assert
            Assert.That(node.Queues, Has.Count.EqualTo(1));
            Assert.That(node.Queues.First().Key, Is.EqualTo(queueName));
            Assert.That(node.Queues.First().Value.Name, Is.EqualTo(queueName));
        }
Exemplo n.º 32
0
        public async Task LoggerTopicTest()
        {
            Dictionary <string, int> dict         = new Dictionary <string, int>(); //接收的消息数量
            Dictionary <string, int> expectedDict = new Dictionary <string, int>(); //发送的消息数量

            string[] queues      = new string[] { $"{logger}.{queue1}.topic", $"{logger}.{queue2}.topic" };
            var      routeQueues = queues.Select(f => new RouteQueue()
            {
                Arguments = null,
                Queue     = f,
                Route     = $"#.{f}.#",
                Options   = new QueueOptions()
                {
                    AutoDelete = true,
                    Durable    = true,
                    Arguments  = arguments
                }
            }).ToArray();

            RabbitServer rabbitServer = new RabbitServer();

            rabbitServer.Register(services =>
            {
                services.AddLogging(builder =>
                {
                    builder.SetMinimumLevel(LogLevel.Trace);
                });

                services.AddRabbitLogger(options =>
                {
                    options.Hosts       = hosts;
                    options.Port        = port;
                    options.UserName    = userName;
                    options.Password    = password;
                    options.VirtualHost = virtualHost;

                    options.Arguments   = arguments;
                    options.AutoDelete  = true;
                    options.Durable     = true;
                    options.Queue       = string.Empty;
                    options.Type        = RabbitExchangeType.Topic;
                    options.RouteQueues = routeQueues;
                    options.Exchange    = topic;

                    options.ApplicationName = nameof(RabbitMqServiceTest.LoggerTopicTest);
                    options.Category        = nameof(RabbitMqServiceTest);
                    options.MinLevel        = LogLevel.Information;
                });

                var builder = services.AddRabbitConsumer(options =>
                {
                    options.Hosts       = hosts;
                    options.Port        = port;
                    options.UserName    = userName;
                    options.Password    = password;
                    options.VirtualHost = virtualHost;

                    options.Arguments   = arguments;
                    options.AutoDelete  = true;
                    options.Durable     = true;
                    options.Type        = RabbitExchangeType.Topic;
                    options.RouteQueues = routeQueues;

                    options.FetchCount = 10;
                    options.AutoAck    = true;
                });
                foreach (var queue in queues)
                {
                    dict[queue]         = 0;
                    expectedDict[queue] = 0;
                    builder.AddListener(topic, queue, result =>
                    {
                        WriteLogger(queue, result);
                        if (result.Body.Contains(nameof(RabbitMqServiceTest)))
                        {
                            dict[queue]++;
                        }
                    });
                }
            });
            await rabbitServer.StartAsync();

            Thread.Sleep(1000);//等待运行1秒

            var serviceProvider = rabbitServer.ServiceProvider;
            var loggerFactory   = serviceProvider.GetService <ILoggerFactory>();

            int per = 4, count = 10;

            for (var i = 0; i < count; i++)
            {
                var routeQueue = routeQueues[new Random().Next(0, routeQueues.Length)];
                var logger     = loggerFactory.CreateLogger($"{nameof(RabbitMqServiceTest)}.{routeQueue.Queue}.{i}");

                logger.LogTrace("LogTrace");
                logger.LogDebug("LogDebug");
                logger.LogInformation("LogInformation");
                logger.LogWarning("LogWarning");
                logger.LogError("LogError");
                logger.LogCritical("LogCritical");

                expectedDict[routeQueue.Queue] += per;
            }

            BlockUntil(() => dict.Sum(f => f.Value) >= per * count, 3000);

            Thread.Sleep(1000);//等待运行1秒
            foreach (var queue in queues)
            {
                Output.WriteLine($"{queue}:{expectedDict[queue]}-{dict[queue]}");
                Assert.Equal(expectedDict[queue], dict[queue]);
            }

            await rabbitServer.StopAsync();
        }
Exemplo n.º 33
0
        public void QueueDeclare_CreatesQueue()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            const string queueName = "someQueue";
            const bool isDurable = true;
            const bool isExclusive = true;
            const bool isAutoDelete = false;
            var arguments = new Hashtable();

            // Act
            model.QueueDeclare(queue:queueName,durable:isDurable,exclusive:isExclusive,autoDelete:isAutoDelete,arguments:arguments);

            // Assert
            Assert.That(node.Queues, Has.Count.EqualTo(1));

            var queue = node.Queues.First();
            AssertQueueDetails(queue, queueName, isAutoDelete, arguments, isDurable, isExclusive);
        }
Exemplo n.º 34
0
        public void BasicGet_NoQueue_ReturnsNull()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);


            // Act
            var response = model.BasicGet("my_queue", false);

            // Assert
            Assert.That(response, Is.Null);
        }
Exemplo n.º 35
0
        public async Task LoggerQueueTest()
        {
            int    counter = 0;
            string queue   = $"{logger}.queue";

            RabbitServer rabbitServer = new RabbitServer();

            rabbitServer.Register(services =>
            {
                services.AddLogging(builder =>
                {
                    builder.SetMinimumLevel(LogLevel.Trace);
                });
                services.AddRabbitLogger(options =>
                {
                    options.Hosts       = hosts;
                    options.Port        = port;
                    options.UserName    = userName;
                    options.Password    = password;
                    options.VirtualHost = virtualHost;

                    options.Arguments   = arguments;
                    options.AutoDelete  = true;
                    options.Durable     = true;
                    options.Queue       = queue;
                    options.Type        = RabbitExchangeType.None;
                    options.RouteQueues = null;
                    options.Exchange    = string.Empty;

                    options.ApplicationName = nameof(RabbitMqServiceTest.LoggerQueueTest);
                    options.Category        = nameof(RabbitMqServiceTest);
                    options.MinLevel        = LogLevel.Trace;
                });

                services.AddRabbitConsumer(options =>
                {
                    options.Hosts       = hosts;
                    options.Port        = port;
                    options.UserName    = userName;
                    options.Password    = password;
                    options.VirtualHost = virtualHost;

                    options.Arguments   = arguments;
                    options.AutoDelete  = true;
                    options.Durable     = true;
                    options.Type        = RabbitExchangeType.None;
                    options.RouteQueues = null;

                    options.FetchCount = 10;
                    options.AutoAck    = true;
                }).AddListener(queue, result =>
                {
                    WriteLogger(queue, result);
                    if (result.Body.Contains(nameof(RabbitMqServiceTest)))
                    {
                        counter++;
                    }
                });
            });
            await rabbitServer.StartAsync();

            Thread.Sleep(1000);//等待运行1秒

            var serviceProvider = rabbitServer.ServiceProvider;
            var loggerFactory   = serviceProvider.GetService <ILoggerFactory>();
            var _logger         = loggerFactory.CreateLogger <RabbitMqServiceTest>();

            _logger.LogTrace("LogTrace");
            _logger.LogDebug("LogDebug");
            _logger.LogInformation("LogInformation");
            _logger.LogWarning("LogWarning");
            _logger.LogError("LogError");
            _logger.LogCritical("LogCritical");

            BlockUntil(() => counter >= 6, 3000);

            Thread.Sleep(1000);//等待运行1秒
            Assert.Equal(6, counter);

            await rabbitServer.StopAsync();
        }
Exemplo n.º 36
0
        public void ExchangeDeclare_WithNameTypeAndDurable_CreatesExchange()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            const string exchangeName = "someExchange";
            const string exchangeType = "someType";
            const bool isDurable = true;

            // Act
            model.ExchangeDeclare(exchange: exchangeName, type: exchangeType, durable: isDurable);

            // Assert
            Assert.That(node.Exchanges, Has.Count.EqualTo(1));

            var exchange = node.Exchanges.First();
            AssertExchangeDetails(exchange, exchangeName, false, null, isDurable, exchangeType);
        }
Exemplo n.º 37
0
        public void QueueDeleteNoWait_WithArguments_DeletesTheQueue()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            const string queueName = "someName";
            model.QueueDeclare(queueName, true, true, true, null);

            // Act
            model.QueueDeleteNoWait(queueName, true, true);

            // Assert
            Assert.That(node.Queues, Is.Empty);
        }
Exemplo n.º 38
0
 public void TearDown()
 {
     RabbitClient.Close();
     RabbitServer.Close();
 }
Exemplo n.º 39
0
        public void QueueDelete_NonExistentQueue_DoesNothing()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            // Act
            model.QueueDelete("someQueue");

            // Assert
            Assert.That(node.Queues, Is.Empty);
        }
Exemplo n.º 40
0
 private static void AssertBinding(RabbitServer server, string exchangeName, string routingKey, string queueName)
 {
     Assert.That(server.Exchanges[exchangeName].Bindings, Has.Count.EqualTo(1));
     Assert.That(server.Exchanges[exchangeName].Bindings.First().Value.RoutingKey, Is.EqualTo(routingKey));
     Assert.That(server.Exchanges[exchangeName].Bindings.First().Value.Queue.Name, Is.EqualTo(queueName));
 }
Exemplo n.º 41
0
        public async Task WorkerPatternTest()
        {
            int    counter1 = 0, counter2 = 0;
            string queue = $"{queue1}.worker";

            RabbitServer rabbitServer = new RabbitServer();

            rabbitServer.Register(services =>
            {
                services.AddRabbitProducer(options =>
                {
                    options.Hosts       = hosts;
                    options.Port        = port;
                    options.UserName    = userName;
                    options.Password    = password;
                    options.VirtualHost = virtualHost;

                    options.Arguments   = arguments;
                    options.AutoDelete  = true;
                    options.Durable     = true;
                    options.Queues      = new string[] { queue };
                    options.Type        = RabbitExchangeType.None;
                    options.RouteQueues = null;
                    options.Exchange    = string.Empty;

                    options.InitializeCount = 10;
                });

                services.AddRabbitConsumer(options =>
                {
                    options.Hosts       = hosts;
                    options.Port        = port;
                    options.UserName    = userName;
                    options.Password    = password;
                    options.VirtualHost = virtualHost;

                    options.Arguments   = arguments;
                    options.AutoDelete  = true;
                    options.Durable     = true;
                    options.Type        = RabbitExchangeType.None;
                    options.RouteQueues = null;

                    options.FetchCount = 1;
                    options.AutoAck    = false;
                }).AddListener(queue, result =>
                {
                    Output.WriteLine($"worker1:" + JsonSerializer.Serialize(result));
                    counter1++;
                    result.Commit();
                });

                services.AddRabbitConsumer(options =>
                {
                    options.Hosts       = hosts;
                    options.Port        = port;
                    options.UserName    = userName;
                    options.Password    = password;
                    options.VirtualHost = virtualHost;

                    options.Arguments   = arguments;
                    options.AutoDelete  = true;
                    options.Durable     = true;
                    options.Type        = RabbitExchangeType.None;
                    options.RouteQueues = null;

                    options.FetchCount = 2;
                    options.AutoAck    = false;
                }).AddListener(queue, result =>
                {
                    Output.WriteLine($"worker2:" + JsonSerializer.Serialize(result));
                    counter2++;
                    result.Commit();
                });
            });
            await rabbitServer.StartAsync();

            Thread.Sleep(1000);//等待运行1秒

            var serviceProvider = rabbitServer.ServiceProvider;
            var factory         = serviceProvider.GetService <IRabbitProducerFactory>();
            var producer        = factory.Create();

            for (var i = 0; i < 10; i++)
            {
                await producer.PublishAsync("worker" + i);
            }

            BlockUntil(() => counter1 + counter2 >= 10, 3000);

            //单元测试状态下QOS貌似不生效
            Output.WriteLine($"worker1:{counter1}   worker2:{counter2}");
            Assert.True(counter1 <= counter2);

            await rabbitServer.StopAsync();
        }
Exemplo n.º 42
0
        public void QueueUnbind_RemovesBinding()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            const string queueName = "someQueue";
            const string exchangeName = "someExchange";
            const string routingKey = "someRoutingKey";
            var arguments = new Hashtable();

            model.ExchangeDeclare(exchangeName, "direct");
            model.QueueDeclarePassive(queueName);
            model.ExchangeBind(exchangeName, queueName, routingKey, arguments);

            // Act
            model.QueueUnbind(queueName, exchangeName, routingKey, arguments);

            // Assert
            Assert.That(node.Exchanges[exchangeName].Bindings, Is.Empty);
            Assert.That(node.Queues[queueName].Bindings, Is.Empty);
        }
Exemplo n.º 43
0
        public void QueueDeclare_NoArguments_CreatesQueue()
        {
            // Arrange
            var node = new RabbitServer();
            var model = new FakeModel(node);

            // Act
            model.QueueDeclare();

            // Assert
            Assert.That(node.Queues,Has.Count.EqualTo(1));
        }
Exemplo n.º 44
0
        public static void Main(string[] args)
        {
            Console.Write("请输入角色【0、生产者,1、消费者】:");
            var           _cmd    = Convert.ToInt32(Console.ReadLine());
            var           _option = 0;
            List <string> Route   = new List <string>();
            string        _text;

            switch (_cmd)
            {
            case 0:
                Console.Write("请选择发布者类型:0、简单队列,1、发布订阅,2、路由模式,3、通配符匹配:");
                _option = Convert.ToInt32(Console.ReadLine());
                switch (_option)
                {
                case 0:
                    RabbitServer.Productor();
                    break;

                case 1:
                    RabbitServer.Fanout();
                    break;

                case 2:
                    //Fast
                    Console.Write("请输入路由名称:");
                    _text = Console.ReadLine();
                    RabbitServer.Direct(_text);
                    break;

                case 3:
                    //fast.1[,fast.1.2]
                    Console.Write("请输入路由名称:");
                    _text = Console.ReadLine();
                    RabbitServer.Topic(_text);
                    break;
                }
                break;

            case 1:
                Console.Write("请选择消费者类型:0、简单队列,1、发布订阅,2、路由模式,3、通配符匹配:");
                _option = Convert.ToInt32(Console.ReadLine());
                string[] _arr;
                switch (_option)
                {
                case 0:
                    Console.Write("请输入是否延迟订阅【0、否,1、是】:");
                    var _bRst = Convert.ToBoolean(Console.ReadLine());
                    RabbitClient.Consumer(_bRst);
                    break;

                case 1:
                    //Fast
                    Console.Write("请输入队列名称:");
                    _text = Console.ReadLine();
                    RabbitClient.Fanout(false, _text);
                    break;

                case 2:
                    //fast、Fast
                    Console.Write("请输入队列名称、路由名称【队列与路由用、分隔,多个路由用,分隔】:");
                    _text = Console.ReadLine();
                    _arr  = _text.Split('、');
                    RabbitClient.Direct(false, _arr[0], _arr[1].Split(','));
                    break;

                case 3:
                    //TopicEx、fast、fast.*[,fast.#]=>可以默认一个
                    Console.Write("请输入交换机名称、队列名称、路由名称【(交换机、队列、路由)用、分隔,多个路由用,分隔】:");
                    _text = Console.ReadLine();
                    _arr  = _text.Split('、');
                    RabbitClient.Topic(false, _arr[0], _arr[1], _arr[2].Split(','));
                    break;
                }

                break;
            }
            //CreateHostBuilder(args).Build().Run();
        }
Exemplo n.º 45
0
 public void Setup()
 {
     // rabbitmq
     this._rabbitServer      = new RabbitServer();
     this._connectionfactory = new FakeConnectionFactory(this._rabbitServer);
 }