示例#1
0
        public void PublishAsync_Where_Connection_Is_Disconnected_Results_In_A_Non_Published_Result()
        {
            var _busConfigurationBuilder = new BusConfigurationBuilder();

            _busConfigurationBuilder.ConnectionUris.Add(TestingConfiguration.LocalConnectionUri);
            _busConfigurationBuilder
            .RegisterPublication <MyEvent>(
                TestingConfiguration.ExchangeName,
                typeof(MyEvent).Name);
            var _busConfirguration = _busConfigurationBuilder.Build();

            var _connectionManager = Substitute.For <IConnectionManager>();
            var _connection        = Substitute.For <IConnection>();
            var _channel           = Substitute.For <IModel>();
            var _context           = Substitute.For <IBusContext>();

            _connectionManager.Connection.Returns(_connection);
            _connection.CreateModel().Returns(_channel);

            var _SUT = new Connected(
                _busConfirguration,
                _connectionManager,
                _context);

            _context.State.Returns(callInfo => _SUT);
            _connectionManager.Disconnected += Raise.Event <EventHandler <ConnectionDisconnectedEventArgs> >(_connection, new ConnectionDisconnectedEventArgs(1, "."));

            var _theEvent          = new MyEvent(Guid.NewGuid(), null, "Some detail", 1);
            var _publicationResult = _SUT.PublishAsync(_theEvent);

            _publicationResult.Wait();

            Assert.AreEqual(PMCG.Messaging.PublicationResultStatus.NotPublished, _publicationResult.Result.Status);
        }
示例#2
0
        public void State_Changed_Where_Connection_Is_Disconnected_And_A_Pending_Publication_Results_In_Pending_Publication_Task_Completion()
        {
            var _busConfigurationBuilder = new BusConfigurationBuilder();

            _busConfigurationBuilder.ConnectionUris.Add(TestingConfiguration.LocalConnectionUri);
            _busConfigurationBuilder.NumberOfPublishers = 1;                    // Only one publisher
            _busConfigurationBuilder
            .RegisterPublication <MyEvent>(
                TestingConfiguration.ExchangeName,
                typeof(MyEvent).Name);
            var _busConfirguration = _busConfigurationBuilder.Build();

            var _connectionManager = Substitute.For <IConnectionManager>();
            var _connection        = Substitute.For <IConnection>();
            var _channel           = Substitute.For <IModel>();
            var _context           = Substitute.For <IBusContext>();

            _connectionManager.Connection.Returns(_connection);
            _connection.CreateModel().Returns(_channel);
            _channel.NextPublishSeqNo.Returns(1UL, 2UL);
            _channel
            .When(channel => channel.BasicPublish(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <IBasicProperties>(), Arg.Any <byte[]>()))
            .Do(callInfo => { Thread.Sleep(1000); });                                   // Slow down so second publication will not get a chance to be published as we have only one publisher - therefore only one queue consumer

            var _SUT = new Connected(
                _busConfirguration,
                _connectionManager,
                _context);

            var _theEvent           = new MyEvent(Guid.NewGuid(), null, "Some detail", 1);
            var _publicationResult1 = _SUT.PublishAsync(_theEvent);
            var _publicationResult2 = _SUT.PublishAsync(_theEvent);

            _context.State.Returns(callInfo => _SUT);
            State _capturedState = null;

            _context.When(context => context.State = Arg.Any <State>()).Do(callInfo => _capturedState = callInfo[0] as State);
            _connectionManager.Disconnected       += Raise.Event <EventHandler <ConnectionDisconnectedEventArgs> >(_connection, new ConnectionDisconnectedEventArgs(1, "."));

            Assert.IsNotNull(_publicationResult1);
            Assert.IsNotNull(_capturedState);

            _publicationResult2.Wait();                         // Second never gets pulled from queue due to slow BasicPublish on first message
            Assert.AreEqual(PMCG.Messaging.PublicationResultStatus.NotPublished, _publicationResult2.Result.Status);
        }
示例#3
0
        public void PublishAsync_Where_Multiple_Publication_Configurations_One_Of_Which_Is_Nacked_Results_In_Unsuccessfull_Publication()
        {
            var _busConfigurationBuilder = new BusConfigurationBuilder();

            _busConfigurationBuilder.ConnectionUris.Add(TestingConfiguration.LocalConnectionUri);
            _busConfigurationBuilder
            .RegisterPublication <MyEvent>(
                TestingConfiguration.ExchangeName,
                typeof(MyEvent).Name)
            .RegisterPublication <MyEvent>(
                TestingConfiguration.ExchangeName,
                typeof(MyEvent).Name)
            .RegisterPublication <MyEvent>(
                TestingConfiguration.ExchangeName,
                typeof(MyEvent).Name);
            var _busConfirguration = _busConfigurationBuilder.Build();

            var _connectionManager = Substitute.For <IConnectionManager>();
            var _connection        = Substitute.For <IConnection>();
            var _channel           = Substitute.For <IModel>();
            var _context           = Substitute.For <IBusContext>();
            var _waitHandle        = new CountdownEvent(3);

            _connectionManager.Connection.Returns(_connection);
            _connection.CreateModel().Returns(_channel);
            var _nextPublishSeqNo = 1UL;

            _channel.NextPublishSeqNo.Returns(callInfo => _nextPublishSeqNo++);                         // Would not work when I used .Returns(1Ul, 2UL, 3UL); Not sure why this works !
            _channel
            .When(channel => channel.BasicPublish(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <IBasicProperties>(), Arg.Any <byte[]>()))
            .Do(callInfo => _waitHandle.Signal());

            var _SUT = new Connected(
                _busConfirguration,
                _connectionManager,
                _context);

            var _theEvent          = new MyEvent(Guid.NewGuid(), null, "Some detail", 1);
            var _publicationResult = _SUT.PublishAsync(_theEvent);

            _waitHandle.Wait();                                 // Wait for publications to complete
            _channel.BasicAcks += Raise.Event <BasicAckEventHandler>(_channel, new BasicAckEventArgs {
                Multiple = true, DeliveryTag = 2
            });
            _channel.BasicNacks += Raise.Event <BasicNackEventHandler>(_channel, new BasicNackEventArgs {
                Multiple = false, DeliveryTag = 3
            });
            _publicationResult.Wait();

            Assert.AreEqual(PMCG.Messaging.PublicationResultStatus.NotPublished, _publicationResult.Result.Status);
        }
示例#4
0
		public void PublishAsync_Where_No_Publication_Configurations_Which_Results_In_A_NoConfigurationFound_Result()
		{
			var _busConfigurationBuilder = new BusConfigurationBuilder();
			_busConfigurationBuilder.ConnectionUris.Add(TestingConfiguration.LocalConnectionUri);
			var _busConfirguration = _busConfigurationBuilder.Build();

			var _connectionManager = Substitute.For<IConnectionManager>();
			var _context = Substitute.For<IBusContext>();

			var _SUT = new Connected(
				_busConfirguration,
				_connectionManager,
				_context);

			var _theEvent = new MyEvent(Guid.NewGuid(), null, "Some detail", 1);
			var _publicationResult = _SUT.PublishAsync(_theEvent);
			_publicationResult.Wait();

			Assert.AreEqual(PMCG.Messaging.PublicationResultStatus.NoConfigurationFound, _publicationResult.Result.Status);
		}
示例#5
0
        public void PublishAsync_Where_A_Single_Publication_Configuration_Which_Results_In_A_Successfull_Publication()
        {
            var _busConfigurationBuilder = new BusConfigurationBuilder();

            _busConfigurationBuilder.ConnectionUris.Add(TestingConfiguration.LocalConnectionUri);
            _busConfigurationBuilder
            .RegisterPublication <MyEvent>(
                TestingConfiguration.ExchangeName,
                typeof(MyEvent).Name);
            var _busConfirguration = _busConfigurationBuilder.Build();

            var _connectionManager = Substitute.For <IConnectionManager>();
            var _connection        = Substitute.For <IConnection>();
            var _channel           = Substitute.For <IModel>();
            var _context           = Substitute.For <IBusContext>();
            var _waitHandle        = new AutoResetEvent(false);

            _connectionManager.Connection.Returns(_connection);
            _connection.CreateModel().Returns(_channel);
            _channel.NextPublishSeqNo.Returns(1UL);
            _channel
            .When(channel => channel.BasicPublish(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <IBasicProperties>(), Arg.Any <byte[]>()))
            .Do(callInfo => _waitHandle.Set());

            var _SUT = new Connected(
                _busConfirguration,
                _connectionManager,
                _context);

            var _theEvent          = new MyEvent(Guid.NewGuid(), null, "Some detail", 1);
            var _publicationResult = _SUT.PublishAsync(_theEvent);

            _waitHandle.WaitOne();              // Allow publication to complete
            _channel.BasicAcks += Raise.Event <BasicAckEventHandler>(_channel, new BasicAckEventArgs {
                Multiple = true, DeliveryTag = 10
            });
            _publicationResult.Wait();

            Assert.AreEqual(PMCG.Messaging.PublicationResultStatus.Published, _publicationResult.Result.Status);
        }
示例#6
0
        public void PublishAsync_Where_No_Publication_Configurations_Which_Results_In_A_NoConfigurationFound_Result()
        {
            var _busConfigurationBuilder = new BusConfigurationBuilder();

            _busConfigurationBuilder.ConnectionUris.Add(TestingConfiguration.LocalConnectionUri);
            var _busConfirguration = _busConfigurationBuilder.Build();

            var _connectionManager = Substitute.For <IConnectionManager>();
            var _context           = Substitute.For <IBusContext>();

            var _SUT = new Connected(
                _busConfirguration,
                _connectionManager,
                _context);

            var _theEvent          = new MyEvent(Guid.NewGuid(), null, "Some detail", 1);
            var _publicationResult = _SUT.PublishAsync(_theEvent);

            _publicationResult.Wait();

            Assert.AreEqual(PMCG.Messaging.PublicationResultStatus.NoConfigurationFound, _publicationResult.Result.Status);
        }
示例#7
0
		public void PublishAsync_Where_A_Single_Publication_Configuration_Which_Results_In_A_Successfull_Publication()
		{
			var _busConfigurationBuilder = new BusConfigurationBuilder();
			_busConfigurationBuilder.ConnectionUris.Add(TestingConfiguration.LocalConnectionUri);
			_busConfigurationBuilder
				.RegisterPublication<MyEvent>(
					TestingConfiguration.ExchangeName,
					typeof(MyEvent).Name);
			var _busConfirguration = _busConfigurationBuilder.Build();

			var _connectionManager = Substitute.For<IConnectionManager>();
			var _connection = Substitute.For<IConnection>();
			var _channel = Substitute.For<IModel>();
			var _context = Substitute.For<IBusContext>();
			var _waitHandle = new AutoResetEvent(false);

			_connectionManager.Connection.Returns(_connection);
			_connection.CreateModel().Returns(_channel);
			_channel.NextPublishSeqNo.Returns(1UL);
			_channel
				.When(channel => channel.BasicPublish(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IBasicProperties>(), Arg.Any<byte[]>()))
				.Do(callInfo => _waitHandle.Set());

			var _SUT = new Connected(
				_busConfirguration,
				_connectionManager,
				_context);

			var _theEvent = new MyEvent(Guid.NewGuid(), null, "Some detail", 1);
			var _publicationResult = _SUT.PublishAsync(_theEvent);

			_waitHandle.WaitOne();	// Allow publication to complete
			_channel.BasicAcks += Raise.Event<BasicAckEventHandler>(_channel, new BasicAckEventArgs { Multiple = true, DeliveryTag = 10 });
			_publicationResult.Wait();

			Assert.AreEqual(PMCG.Messaging.PublicationResultStatus.Published, _publicationResult.Result.Status);
		}
示例#8
0
		public void State_Changed_Where_Connection_Is_Disconnected_And_A_Pending_Publication_Results_In_Pending_Publication_Task_Completion()
		{
			var _busConfigurationBuilder = new BusConfigurationBuilder();
			_busConfigurationBuilder.ConnectionUris.Add(TestingConfiguration.LocalConnectionUri);
			_busConfigurationBuilder.NumberOfPublishers = 1;	// Only one publisher
			_busConfigurationBuilder
				.RegisterPublication<MyEvent>(
					TestingConfiguration.ExchangeName,
					typeof(MyEvent).Name);
			var _busConfirguration = _busConfigurationBuilder.Build();

			var _connectionManager = Substitute.For<IConnectionManager>();
			var _connection = Substitute.For<IConnection>();
			var _channel = Substitute.For<IModel>();
			var _context = Substitute.For<IBusContext>();

			_connectionManager.Connection.Returns(_connection);
			_connection.CreateModel().Returns(_channel);
			_channel.NextPublishSeqNo.Returns(1UL, 2UL);
			_channel
				.When(channel => channel.BasicPublish(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IBasicProperties>(), Arg.Any<byte[]>()))
				.Do(callInfo => { Thread.Sleep(1000); });		// Slow down so second publication will not get a chance to be published as we have only one publisher - therefore only one queue consumer

			var _SUT = new Connected(
				_busConfirguration,
				_connectionManager,
				_context);

			var _theEvent = new MyEvent(Guid.NewGuid(), null, "Some detail", 1);
			var _publicationResult1 = _SUT.PublishAsync(_theEvent);
			var _publicationResult2 = _SUT.PublishAsync(_theEvent);

			_context.State.Returns(callInfo => _SUT);
			State _capturedState = null;
			_context.When(context => context.State = Arg.Any<State>()).Do(callInfo => _capturedState = callInfo[0] as State);
			_connectionManager.Disconnected += Raise.Event<EventHandler<ConnectionDisconnectedEventArgs>>(_connection, new ConnectionDisconnectedEventArgs(1, "."));

			Assert.IsNotNull(_publicationResult1);
			Assert.IsNotNull(_capturedState);
			
			_publicationResult2.Wait();		// Second never gets pulled from queue due to slow BasicPublish on first message
			Assert.AreEqual(PMCG.Messaging.PublicationResultStatus.NotPublished, _publicationResult2.Result.Status);
		}
示例#9
0
		public void PublishAsync_Where_Connection_Is_Disconnected_Results_In_A_Non_Published_Result()
		{
			var _busConfigurationBuilder = new BusConfigurationBuilder();
			_busConfigurationBuilder.ConnectionUris.Add(TestingConfiguration.LocalConnectionUri);
			_busConfigurationBuilder
				.RegisterPublication<MyEvent>(
					TestingConfiguration.ExchangeName,
					typeof(MyEvent).Name);
			var _busConfirguration = _busConfigurationBuilder.Build();

			var _connectionManager = Substitute.For<IConnectionManager>();
			var _connection = Substitute.For<IConnection>();
			var _channel = Substitute.For<IModel>();
			var _context = Substitute.For<IBusContext>();

			_connectionManager.Connection.Returns(_connection);
			_connection.CreateModel().Returns(_channel);

			var _SUT = new Connected(
				_busConfirguration,
				_connectionManager,
				_context);

			_context.State.Returns(callInfo => _SUT);
			_connectionManager.Disconnected += Raise.Event<EventHandler<ConnectionDisconnectedEventArgs>>(_connection, new ConnectionDisconnectedEventArgs(1, "."));

			var _theEvent = new MyEvent(Guid.NewGuid(), null, "Some detail", 1);
			var _publicationResult = _SUT.PublishAsync(_theEvent);
			_publicationResult.Wait();

			Assert.AreEqual(PMCG.Messaging.PublicationResultStatus.NotPublished, _publicationResult.Result.Status);
		}
示例#10
0
		public void PublishAsync_Where_Multiple_Publication_Configurations_One_Of_Which_Is_Nacked_Results_In_Unsuccessfull_Publication()
		{
			var _busConfigurationBuilder = new BusConfigurationBuilder();
			_busConfigurationBuilder.ConnectionUris.Add(TestingConfiguration.LocalConnectionUri);
			_busConfigurationBuilder
				.RegisterPublication<MyEvent>(
					TestingConfiguration.ExchangeName,
					typeof(MyEvent).Name)
				.RegisterPublication<MyEvent>(
					TestingConfiguration.ExchangeName,
					typeof(MyEvent).Name)
				.RegisterPublication<MyEvent>(
					TestingConfiguration.ExchangeName,
					typeof(MyEvent).Name);
			var _busConfirguration = _busConfigurationBuilder.Build();

			var _connectionManager = Substitute.For<IConnectionManager>();
			var _connection = Substitute.For<IConnection>();
			var _channel = Substitute.For<IModel>();
			var _context = Substitute.For<IBusContext>();
			var _waitHandle = new CountdownEvent(3);

			_connectionManager.Connection.Returns(_connection);
			_connection.CreateModel().Returns(_channel);
			var _nextPublishSeqNo = 1UL;
			_channel.NextPublishSeqNo.Returns(callInfo => _nextPublishSeqNo++);		// Would not work when I used .Returns(1Ul, 2UL, 3UL); Not sure why this works !
			_channel
				.When(channel => channel.BasicPublish(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<IBasicProperties>(), Arg.Any<byte[]>()))
				.Do(callInfo => _waitHandle.Signal());

			var _SUT = new Connected(
				_busConfirguration,
				_connectionManager,
				_context);

			var _theEvent = new MyEvent(Guid.NewGuid(), null, "Some detail", 1);
			var _publicationResult = _SUT.PublishAsync(_theEvent);

			_waitHandle.Wait();			// Wait for publications to complete
			_channel.BasicAcks += Raise.Event<BasicAckEventHandler>(_channel, new BasicAckEventArgs { Multiple = true, DeliveryTag = 2 });
			_channel.BasicNacks += Raise.Event<BasicNackEventHandler>(_channel, new BasicNackEventArgs { Multiple = false, DeliveryTag = 3 });
			_publicationResult.Wait();

			Assert.AreEqual(PMCG.Messaging.PublicationResultStatus.NotPublished, _publicationResult.Result.Status);
		}