public async Task InExceptionPModeInformationIsCorrectlyPersisted()
        {
            long savedId;

            const string pmodeId      = "pmode-id1";
            const string pmodeContent = "<pmode></pmode>";

            using (var db = GetDataStoreContext())
            {
                var inException = InException.ForEbmsMessageId("message-id", "some-error-happened");
                inException.SetPModeInformation(pmodeId, pmodeContent);

                db.InExceptions.Add(inException);

                await db.SaveChangesAsync();

                savedId = inException.Id;

                Assert.NotEqual(default(long), savedId);
            }

            using (var db = GetDataStoreContext())
            {
                var inException = db.InExceptions.FirstOrDefault(i => i.Id == savedId);

                Assert.NotNull(inException);
                Assert.Equal(pmodeId, inException.PModeId);
                Assert.Equal(pmodeContent, inException.PMode);
            }
        }
        public async Task ExceptionOperationIsCorrectlyPersisted()
        {
            long savedId;

            using (var db = GetDataStoreContext())
            {
                var inException = InException.ForEbmsMessageId("message-id", "some-error-happened");
                inException.Operation = Operation.Sent;

                db.InExceptions.Add(inException);

                await db.SaveChangesAsync();

                savedId = inException.Id;

                Assert.NotEqual(default(long), savedId);
            }

            using (var db = GetDataStoreContext())
            {
                var inMessage = db.InExceptions.FirstOrDefault(i => i.Id == savedId);

                Assert.NotNull(inMessage);
                Assert.Equal(Operation.Sent, inMessage.Operation);
            }
        }
示例#3
0
        private static InException CreateInException(string ebmsMessageId, DateTimeOffset insertionTime)
        {
            InException ex = InException.ForEbmsMessageId(ebmsMessageId, exception: string.Empty);

            ex.InsertionTime = insertionTime;

            return(ex);
        }
        public async void ThenInExceptionIsTransformedToNotifyEnvelope()
        {
            // Arrange
            ReceivedEntityMessage receivedMessage = CreateReceivedExceptionMessage(InException.ForEbmsMessageId("id", "error"), Operation.ToBeNotified);
            var transformer = new NotifyMessageTransformer();
            var result      = await transformer.TransformAsync(receivedMessage);

            Assert.NotNull(result.NotifyMessage);
            Assert.Equal(
                ((ExceptionEntity)receivedMessage.Entity).EbmsRefToMessageId,
                result.NotifyMessage.MessageInfo.RefToMessageId);
        }
示例#5
0
        /// <summary>
        /// Insert an <see cref="InException"/> based on an exception that occured during the incoming processing of an <see cref="AS4Message"/>.
        /// </summary>
        /// <param name="exception">The exception which message will be inserted.</param>
        /// <param name="ebmsMessageId">The primary message id of the <see cref="AS4Message"/> that caused the exception.</param>
        /// <param name="pmode">The PMode that was being used during the processing.</param>
        public async Task <InException> InsertIncomingAS4MessageExceptionAsync(Exception exception, string ebmsMessageId, ReceivingProcessingMode pmode)
        {
            InException entity =
                InException
                .ForEbmsMessageId(ebmsMessageId, exception)
                .SetOperationFor(pmode?.ExceptionHandling);

            await entity.SetPModeInformationAsync(pmode);

            _repository.InsertInException(entity);
            _repository.UpdateInMessage(ebmsMessageId, m => m.SetStatus(InStatus.Exception));

            return(entity);
        }
        public async void ThenTransformSucceedsWithValidInExceptionForErrorProperties()
        {
            // Arrange
            ReceivedEntityMessage receivedMessage = CreateReceivedExceptionMessage(InException.ForEbmsMessageId("id", "error"), Operation.ToBeNotified);
            var transformer = new NotifyMessageTransformer();

            // Act
            MessagingContext messagingContext =
                await transformer.TransformAsync(receivedMessage);

            // Assert
            Assert.Equal(Status.Exception, messagingContext.NotifyMessage.StatusCode);
            Assert.Equal(((InException)receivedMessage.Entity).EbmsRefToMessageId, messagingContext.NotifyMessage.MessageInfo.RefToMessageId);
        }
        private async Task <MessagingContext> HandleNotifyException(Exception exception, MessagingContext context)
        {
            Logger.Error(exception.Message);

            using (var dbContext = _createContext())
            {
                var repository = new DatastoreRepository(dbContext);

                if (context.NotifyMessage.EntityType == typeof(InMessage) ||
                    context.NotifyMessage.EntityType == typeof(InException))
                {
                    var inException = InException.ForEbmsMessageId(context.EbmsMessageId, exception);
                    repository.InsertInException(inException);

                    if (context.NotifyMessage.EntityType == typeof(InMessage))
                    {
                        Logger.Debug("Fatal fail in notification, set InMessage(s).Status=Exception");
                        repository.UpdateInMessage(context.EbmsMessageId, i => i.SetStatus(InStatus.Exception));
                    }
                }
                else if (context.NotifyMessage.EntityType != typeof(OutMessage) ||
                         context.NotifyMessage.EntityType == typeof(OutException))
                {
                    var outException = OutException.ForEbmsMessageId(context.EbmsMessageId, exception);
                    repository.InsertOutException(outException);

                    if (context.NotifyMessage.EntityType == typeof(OutMessage) &&
                        context.MessageEntityId != null)
                    {
                        Logger.Debug("Fatal fail in notification, set OutMessage.Status=Exception");
                        repository.UpdateOutMessage(
                            context.MessageEntityId.Value,
                            o => o.SetStatus(OutStatus.Exception));
                    }
                }

                if (context.MessageEntityId != null)
                {
                    Logger.Debug("Abort retry operation due to fatal notification exception, set Status=Completed");
                    repository.UpdateRetryReliability(
                        context.MessageEntityId.Value,
                        r => r.Status = RetryStatus.Completed);
                }

                await dbContext.SaveChangesAsync();
            }

            return(new MessagingContext(exception));
        }
        private async Task InsertReferencedInException(
            MessagingContext messagingContext,
            CancellationToken cancellation)
        {
            using (DatastoreContext context = _createContext())
            {
                var repository = new DatastoreRepository(context);
                var exception  = InException.ForEbmsMessageId(
                    messagingContext.AS4Message?.FirstSignalMessage?.RefToMessageId,
                    new Exception(messagingContext.ErrorResult.Description));

                repository.InsertInException(exception);
                await context.SaveChangesAsync(cancellation).ConfigureAwait(false);
            }
        }
            public async Task ThenInsertInExceptionSucceeds()
            {
                // Arrange
                var inException = InException.ForEbmsMessageId($"inex-{Guid.NewGuid()}", "error");

                // Act
                using (DatastoreContext context = GetDataStoreContext())
                {
                    new DatastoreRepository(context).InsertInException(inException);

                    await context.SaveChangesAsync();
                }

                GetDataStoreContext.AssertInException(inException.EbmsRefToMessageId, Assert.NotNull);
            }
示例#10
0
        private async Task InsertInExceptionsForNowExceptionedInMessageAsync(
            IEnumerable <SignalMessage> signalMessages,
            ErrorResult occurredError,
            ReceivingProcessingMode receivePMode)
        {
            if (signalMessages.Any() == false)
            {
                return;
            }

            using (DatastoreContext dbContext = _createDatastoreContext())
            {
                var repository = new DatastoreRepository(dbContext);

                foreach (SignalMessage signal in signalMessages.Where(s => !(s is PullRequest)))
                {
                    var ex = InException.ForEbmsMessageId(signal.MessageId, occurredError.Description);
                    await ex.SetPModeInformationAsync(receivePMode);

                    Logger.Debug(
                        $"Insert InException for {signal.GetType().Name} {signal.MessageId} with {{Exception={occurredError.Description}}}");

                    repository.InsertInException(ex);
                }

                IEnumerable <string> ebmsMessageIds = signalMessages.Select(s => s.MessageId).ToArray();
                repository.UpdateInMessages(
                    m => ebmsMessageIds.Contains(m.EbmsMessageId),
                    m =>
                {
                    Logger.Debug($"Update {m.EbmsMessageType} InMessage {m.EbmsMessageId} Status=Exception");
                    m.SetStatus(InStatus.Exception);
                });

                await dbContext.SaveChangesAsync();
            }
        }