public void Test_ServiceBusQueueMessenger_UpdateReceiverChangesSubscription()
        {
            // Arrange
            var topicOne = GetTopicMessenger("updatereceiverreceiverone", "subone");
            var topicTwo = GetTopicMessenger("updatereceiverreceivertwo", "subtwo");

            ((ServiceBusManager)topicOne.EntityManager).EntityFullPurge("updatereceiverreceiverone", true).GetAwaiter().GetResult();
            ((ServiceBusManager)topicTwo.EntityManager).EntityFullPurge("updatereceiverreceivertwo", true).GetAwaiter().GetResult();

            var testMessageOne = "Message One";
            var testMessageTwo = "Message Two";

            // Act/Assert
            // Send the message to initiate receive.
            topicOne.Send(testMessageOne).GetAwaiter().GetResult();
            topicTwo.Send(testMessageTwo).GetAwaiter().GetResult();

            Thread.Sleep(2000);

            var config        = new ConfigurationBuilder().AddJsonFile("appSettings.json").Build();
            var testMessenger = new ServiceBusMessenger(new ConnectionConfig()
            {
                ConnectionString = config.GetValue <string>("ConnectionString"),
                Receiver         = new ReceiverSetup()
                {
                    EntityType             = EntityType.Topic,
                    EntityName             = "updatereceiverreceiverone",
                    EntitySubscriptionName = "subone"
                }
            });

            var receivedMessageOne = testMessenger.ReceiveOne <string>();

            var count = 0;

            while (receivedMessageOne == null && count < 10)
            {
                receivedMessageOne = testMessenger.ReceiveOne <string>();
                count++;
            }

            Assert.Equal(receivedMessageOne, testMessageOne);
            testMessenger.Complete(receivedMessageOne).GetAwaiter().GetResult();

            //Update receiver to listen to the second subscription
            testMessenger.UpdateReceiver("updatereceiverreceivertwo", "subtwo").GetAwaiter().GetResult();

            var receivedMessageTwo = testMessenger.ReceiveOne <string>();

            count = 0;
            while (receivedMessageTwo == null && count < 10)
            {
                receivedMessageTwo = testMessenger.ReceiveOne <string>();
                count++;
            }

            Assert.Equal(receivedMessageTwo, testMessageTwo);
            testMessenger.Complete(receivedMessageTwo).GetAwaiter().GetResult();
        }
        private async Task CreateStringTestMessages(ServiceBusMessenger messenger, int numberToCreate)
        {
            var messages = new List <string>();

            for (int i = 0; i < numberToCreate; i++)
            {
                messages.Add(Lorem.GetSentence());
            }
            await messenger.SendBatch(messages);
        }
Example #3
0
        /// <summary>
        /// Adds the service bus singleton.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="services">The services.</param>
        /// <param name="config">The configuration.</param>
        /// <returns>IServiceCollection.</returns>
        public static IServiceCollection AddServiceBusSingleton <T>(this IServiceCollection services, ServicePrincipleConfig config)
            where T : IMessageOperations
        {
            var serviceBusInstance = new ServiceBusMessenger(config);

            services.AddSingleton(typeof(T), serviceBusInstance);
            services.AddFactoryIfNotAdded <IMessenger>();
            services.AddFactoryIfNotAdded <IReactiveMessenger>();
            return(services);
        }
        public async Task ServiceBusTopicMessenger_ReceiveSetupError()
        {
            // Arrange
            var config        = new ConfigurationBuilder().AddJsonFile("appSettings.json").Build();
            var testMessenger = new ServiceBusMessenger(new ConnectionConfig()
            {
                ConnectionString = config.GetValue <string>("ConnectionString"),
            });

            // Act/Assert
            Assert.Throws <InvalidOperationException>(() => testMessenger.Receive <string>((msg) => { }, (err) => { }));
            Assert.Null(testMessenger.ReceiveOne <string>());
            await Assert.ThrowsAsync <NullReferenceException>(() => testMessenger.Send("test"));
        }
Example #5
0
        /// <summary>
        /// Add service bus singleton of type T, using connection string configuration.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="services">Service collection to extend</param>
        /// <param name="key">Key to identify the named instance of the service bus singleton.</param>
        /// <param name="config">The connection string configuration</param>
        /// <returns>Modified service collection with the IReactiveMessenger, IMessenger and NamedInstanceFactory{T} configured.</returns>
        public static IServiceCollection AddServiceBusSingletonNamed <T>(this IServiceCollection services, string key, ConnectionConfig config) where T : IMessageOperations
        {
            var serviceBusInstance = new ServiceBusMessenger(config);

            if (!key.IsNullOrEmpty())
            {
                serviceBusInstance.Name = key;
            }

            services.AddSingleton(typeof(T), serviceBusInstance);
            services.AddFactoryIfNotAdded <IMessenger>();
            services.AddFactoryIfNotAdded <IReactiveMessenger>();
            return(services);
        }
Example #6
0
        public void Test_ServiceBusMessenger_GetAccessTokenUrlNotImplemented()
        {
            // Arrange/Act
            var msiConfig = new MsiConfig()
            {
                SharedAccessPolicyName = ""
            };
            var connectionConfig = new ConnectionConfig();
            var spConfig         = new ServicePrincipleConfig()
            {
                SharedAccessPolicyName = "TestPolicy", InstanceName = "testSBInstance", AppId = "TestAppId", AppSecret = "TestAppSecret", TenantId = "TestTenantId", SubscriptionId = "FakeSubscriptionId"
            };
            var serviceBus = new ServiceBusMessenger(spConfig);

            // Assert
            serviceBus.ToString().Should().NotBeNullOrEmpty();
            serviceBus.Name.Should().Be("testSBInstance");
            (serviceBus.Config as ServicePrincipleConfig).Should().NotBeNull();
        }
Example #7
0
        public void Test_ServiceBusConnector_ServiceDispose()
        {
            // Assert
            var messenger = new ServiceBusMessenger(new ConnectionConfig {
                ConnectionString = "test.test"
            });
            var connector = new ServiceBusConnector <object>(new ServiceBusManager("", new ConnectionConfig()), new Subject <object>(), null);

            // Act - call dispose.
            messenger.Dispose();
            connector.Dispose();

            // Called a second time to test branch.
            messenger.Dispose();
            connector.Dispose();

            // Assert - disposed as expected.
            messenger.Disposed.Should().BeTrue();
            connector.Disposed.Should().BeTrue();
        }
Example #8
0
        /// <summary>
        /// Add service bus singleton of type T, using named properties (as opposed to passing MsiConfig/ServicePrincipleConfig etc).
        /// Will automatically use MsiConfiguration.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="services">Service collection to extend</param>
        /// <param name="key">Key to identify the named instance of the service bus singleton.</param>
        /// <param name="instanceName">Instance name of service bus.</param>
        /// <param name="tenantId">Tenant Id where service bus exists.</param>
        /// <param name="subscriptionId">Subscription within the tenancy to use for the service bus instance.</param>
        /// <param name="receiver">Receiver configuration (if any).</param>
        /// <param name="sender">Sender configuration (if any).</param>
        /// <param name="enableAutoBackoff">Backoff mechanism enabled (only works when both sender and receiver is configured).</param>
        /// <returns>Modified service collection with the IReactiveMessenger, IMessenger and NamedInstanceFactory{T} configured.</returns>
        public static IServiceCollection AddServiceBusSingletonNamed <T>(this IServiceCollection services, string key, string instanceName, string tenantId, string subscriptionId, ReceiverSetup receiver = null, SenderSetup sender = null, bool enableAutoBackoff = false)
            where T : IMessageOperations
        {
            var serviceBusInstance = new ServiceBusMessenger(new MsiConfig
            {
                InstanceName      = instanceName,
                TenantId          = tenantId,
                SubscriptionId    = subscriptionId,
                Receiver          = receiver,
                Sender            = sender,
                EnableAutobackOff = enableAutoBackoff
            });

            if (!key.IsNullOrEmpty())
            {
                serviceBusInstance.Name = key;
            }

            services.AddSingleton(typeof(T), serviceBusInstance);
            services.AddFactoryIfNotAdded <IMessenger>();
            services.AddFactoryIfNotAdded <IReactiveMessenger>();
            return(services);
        }
        public void Test_ServiceBusQueueMessenger_UpdateReceiverChangesSubscriptionWithDifferentType()
        {
            // Arrange
            var topicOne = GetTopicMessenger("updatereceiverreceiverone1", "subone1");
            var topicTwo = GetTopicMessenger("updatereceiverreceivertwo2", "subtwo2");

            ((ServiceBusManager)topicOne.EntityManager).EntityFullPurge("updatereceiverreceiverone1", true).GetAwaiter().GetResult();
            ((ServiceBusManager)topicTwo.EntityManager).EntityFullPurge("updatereceiverreceivertwo2", true).GetAwaiter().GetResult();

            var testMessageOne = "Message One";
            var testMessageTwo = new TestProps()
            {
                Test1 = 2, Test2 = true, Version = "new"
            };

            // Act/Assert
            // Send the message to initiate receive.
            topicOne.Send(testMessageOne).GetAwaiter().GetResult();
            topicTwo.Send(testMessageTwo).GetAwaiter().GetResult();

            Thread.Sleep(2000);

            var config        = new ConfigurationBuilder().AddJsonFile("appSettings.json").Build();
            var testMessenger = new ServiceBusMessenger(new ConnectionConfig()
            {
                ConnectionString = config.GetValue <string>("ConnectionString"),
                Receiver         = new ReceiverSetup()
                {
                    EntityType             = EntityType.Topic,
                    EntityName             = "updatereceiverreceiverone1",
                    EntitySubscriptionName = "subone1"
                }
            });

            var receivedMessageOne = testMessenger.ReceiveOne <string>();

            var count = 0;

            while (receivedMessageOne == null && count < 10)
            {
                receivedMessageOne = testMessenger.ReceiveOne <string>();
                Task.Delay(500);
                count++;
            }

            receivedMessageOne.Should().BeEquivalentTo(testMessageOne);
            testMessenger.Complete(receivedMessageOne).GetAwaiter().GetResult();

            //Update receiver to listen to the second subscription
            testMessenger.UpdateReceiver("updatereceiverreceivertwo2", "subtwo2").GetAwaiter().GetResult();

            var receivedMessageTwo = testMessenger.ReceiveOne <TestProps>();

            count = 0;
            while (receivedMessageTwo == null && count < 10)
            {
                receivedMessageTwo = testMessenger.ReceiveOne <TestProps>();
                Task.Delay(500);
                count++;
            }
            testMessenger.Complete(receivedMessageTwo).GetAwaiter().GetResult();

            Assert.NotNull(receivedMessageTwo);
            receivedMessageTwo.Should().BeEquivalentTo(testMessageTwo);

            topicOne.CompleteAllMessages().GetAwaiter().GetResult();
            topicTwo.CompleteAllMessages().GetAwaiter().GetResult();
        }
Example #10
0
        private static IServiceCollection AddNamedInstance <T>(IServiceCollection services, string key, ServiceBusMessenger instance)
            where T : INamedInstance
        {
            if (!key.IsNullOrEmpty())
            {
                instance.Name = key;
            }

            services.AddSingleton(typeof(T), instance);

            // Ensure there's a NamedInstance factory to allow named collections of the messenger.
            services.AddFactoryIfNotAdded <T>();

            return(services);
        }