Ejemplo n.º 1
0
        public async Task OutMessageIsCreatedForToBeForwardedMessage()
        {
            // Arrange
            const string messageId  = "message-id";
            var          as4Message = AS4Message.Create(CreateForwardPushUserMessage(messageId));

            // Act
            InsertToBeForwardedInMessage(
                pmodeId: "Forward_Push",
                mep: MessageExchangePattern.Push,
                tobeForwarded: as4Message);

            // Assert: if an OutMessage is created with the correct status and operation.
            InMessage inMessage = await PollUntilPresent(
                () => _databaseSpy.GetInMessageFor(
                    m => m.EbmsMessageId == messageId &&
                    m.Operation == Operation.Forwarded),
                TimeSpan.FromSeconds(15));

            Assert.NotNull(AS4XmlSerializer.FromString <ReceivingProcessingMode>(inMessage.PMode));

            OutMessage outMessage = await PollUntilPresent(
                () => _databaseSpy.GetOutMessageFor(m => m.EbmsMessageId == messageId),
                timeout : TimeSpan.FromSeconds(5));

            Assert.True(outMessage.Intermediary);
            Assert.Equal(Operation.ToBeProcessed, outMessage.Operation);
            Assert.NotNull(AS4XmlSerializer.FromString <SendingProcessingMode>(outMessage.PMode));
        }
Ejemplo n.º 2
0
        public async Task PiggyBack_PullRequest_With_Receipt_Operation_Becomes_DeadLettered_When_Retries_Are_Exhausted()
        {
            // Arrange
            string pullSendUrl = RetrievePullingUrlFromConfig();

            var user    = new UserMessage($"user-{Guid.NewGuid()}", PullRequestMpc);
            var receipt = new Receipt($"receipt-{Guid.NewGuid()}", user.MessageId);

            InsertUserMessage(user);
            long id = InsertReceipt(receipt, pullSendUrl, Operation.ToBePiggyBacked);

            // Act
            InsertRetryReliability(id, maxRetryCount: 1);

            // Assert
            await PollUntilPresent(
                () => _databaseSpy.GetOutMessageFor(
                    m => m.EbmsMessageId == receipt.MessageId &&
                    m.Operation == Operation.DeadLettered),
                timeout : TimeSpan.FromSeconds(40));

            RetryReliability reliability = await PollUntilPresent(
                () => _databaseSpy.GetRetryReliabilityFor(
                    r => r.RefToOutMessageId == id &&
                    r.Status == RetryStatus.Completed),
                timeout : TimeSpan.FromSeconds(5));

            Assert.True(
                reliability.CurrentRetryCount > 0,
                "RetryReliability.CurrentRetryCount should be greater then zero");
        }
Ejemplo n.º 3
0
            public async Task ThenAgentStoresOutMessageFoReceivedSubmitMessage()
            {
                // Arrange
                string fixture       = SubmitMessageFixture;
                var    submitMessage = AS4XmlSerializer.FromString <SubmitMessage>(fixture);

                Assert.True(submitMessage?.MessageInfo?.MessageId != null, "Send SubmitMessage hasn't got a MessageInfo.MessageId element");
                Assert.True(submitMessage?.Collaboration?.AgreementRef != null, "Send SubmitMessage hasn't got a Collaboration.AgreementRef element");

                // Act
                using (HttpResponseMessage response = await StubSender.SendRequest(HttpSubmitAgentUrl, Encoding.UTF8.GetBytes(fixture), "application/xml"))
                {
                    Assert.Equal(HttpStatusCode.Accepted, response.StatusCode);
                    Assert.True(String.IsNullOrWhiteSpace(response.Content.Headers.ContentType?.ToString()));
                }

                // Assert
                IConfig config  = _as4Msh.GetConfiguration();
                string  pmodeId = submitMessage.Collaboration.AgreementRef.PModeId;
                SendingProcessingMode usedSendingPMode = config.GetSendingPMode(pmodeId);

                Assert.True(usedSendingPMode.PushConfiguration?.Protocol != null, "SendingPMode for SubmitMessage hasn't got PushConfiguration.Protocol element");

                var        databaseSpy = new DatabaseSpy(config);
                OutMessage outMessage  = databaseSpy.GetOutMessageFor(
                    m => m.EbmsMessageId == submitMessage.MessageInfo.MessageId);

                Assert.True(outMessage != null, "No OutMessage was stored for send SubmitMessage");
                Assert.Equal(usedSendingPMode.PushConfiguration.Protocol.Url, outMessage.Url);
            }
Ejemplo n.º 4
0
        public async Task OutMessage_Is_To_Notified_When_Retry_Happen_Withing_Allowed_MaxRetry(
            HttpStatusCode secondAttemptStatusCode,
            Operation expected)
        {
            await TestComponentWithSettings(
                "outmessage_notify_reliability_settings.xml",
                async (settings, as4Msh) =>
            {
                // Arrange
                const string url     = "http://localhost:7071/business/outmessage/";
                string ebmsMessageId = $"error-{Guid.NewGuid()}";

                var store = new AS4MessageBodyFileStore();

                var om = new OutMessage(ebmsMessageId)
                {
                    ContentType     = Constants.ContentTypes.Soap,
                    MessageLocation = store.SaveAS4Message(
                        as4Msh.GetConfiguration().InMessageStoreLocation,
                        AS4Message.Create(
                            Error.FromErrorResult(
                                ebmsMessageId,
                                refToMessageId: $"user-{Guid.NewGuid()}",
                                result: new ErrorResult(
                                    "Invalid header example description failure",
                                    ErrorAlias.InvalidHeader))))
                };

                SendingProcessingMode pmode = NotifySendingPMode(url);
                Entities.RetryReliability CreateRetry(long id)
                => Entities.RetryReliability.CreateForOutMessage(
                    refToOutMessageId: id,
                    maxRetryCount: pmode.ErrorHandling.Reliability.RetryCount,
                    retryInterval: pmode.ErrorHandling.Reliability.RetryInterval.AsTimeSpan(),
                    type: RetryType.Notification);

                // Act
                InsertMessageEntityWithRetry(om, as4Msh.GetConfiguration(), pmode, CreateRetry);

                // Assert
                SimulateNotifyFailureOnFirstAttempt(url, secondAttemptStatusCode);

                var spy             = new DatabaseSpy(as4Msh.GetConfiguration());
                OutMessage notified = await PollUntilPresent(
                    () => spy.GetOutMessageFor(
                        m => m.Operation == expected),
                    timeout: TimeSpan.FromSeconds(10));
                Assert.Equal(ebmsMessageId, notified.EbmsMessageId);

                Entities.RetryReliability referenced = await PollUntilPresent(
                    () => spy.GetRetryReliabilityFor(r => r.RefToOutMessageId == notified.Id),
                    timeout: TimeSpan.FromSeconds(5));
                Assert.Equal(RetryStatus.Completed, referenced.Status);
            });
        }
Ejemplo n.º 5
0
        private async Task CorrectHandlingOnSynchronouslyReceivedMultiHopReceipt(
            bool actAsIntermediaryMsh,
            string receivePModeId,
            OutStatus expectedOutStatus,
            Operation expectedSignalOperation)
        {
            // Arrange
            SendingProcessingMode pmode             = CreateMultihopPMode(StubListenLocation);
            UserMessage           simpleUserMessage = CreateMultihopUserMessage(receivePModeId, pmode);

            AS4Message as4Message = AS4Message.Create(simpleUserMessage, pmode);

            var signal     = new ManualResetEvent(false);
            var serializer = new SoapEnvelopeSerializer();

            StubHttpServer.StartServer(
                StubListenLocation,
                res =>
            {
                res.StatusCode  = 200;
                res.ContentType = Constants.ContentTypes.Soap;

                var receipt = Receipt.CreateFor(
                    $"receipt-{Guid.NewGuid()}",
                    as4Message.FirstUserMessage,
                    userMessageSendViaMultiHop: true);

                serializer.Serialize(AS4Message.Create(receipt), res.OutputStream);
            },
                signal);

            // Act
            PutMessageToSend(as4Message, pmode, actAsIntermediaryMsh);

            // Assert
            signal.WaitOne();

            OutMessage sentMessage = await PollUntilPresent(
                () => _databaseSpy.GetOutMessageFor(m => m.EbmsMessageId == simpleUserMessage.MessageId),
                timeout : TimeSpan.FromSeconds(10));

            Assert.Equal(expectedOutStatus, sentMessage.Status.ToEnum <OutStatus>());

            InMessage receivedMessage = await PollUntilPresent(
                () => _databaseSpy.GetInMessageFor(m => m.EbmsRefToMessageId == simpleUserMessage.MessageId),
                timeout : TimeSpan.FromSeconds(10));

            Assert.Equal(MessageType.Receipt, receivedMessage.EbmsMessageType);
            Assert.Equal(expectedSignalOperation, receivedMessage.Operation);
        }
Ejemplo n.º 6
0
        private async Task <HttpResponseMessage> PiggyBacked_PullRequest_With_Bundled_Signal(
            Func <string, SignalMessage> createSignal,
            OutStatus expStatus)
        {
            // Arrange
            OverridePullAuthorizationMap(
                @".\config\componenttest-settings\security\pull_authorizationmap_allowed_facts.xml");

            string userMessageId = $"user-{Guid.NewGuid()}";

            StoreToBeAckOutMessage(userMessageId, CreateSendingPMode());

            AS4Message    pullRequest        = CreateAllowedPullRequest();
            SignalMessage extraSignalMessage = createSignal(userMessageId);

            pullRequest.AddMessageUnit(extraSignalMessage);

            AS4Message signedBundled = SignAS4MessageWithPullRequestCert(pullRequest);

            // Act
            HttpResponseMessage response = await StubSender.SendAS4Message(PullSendUrl, signedBundled);

            // Assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            OutMessage storedUserMesage =
                _databaseSpy.GetOutMessageFor(m => m.EbmsMessageId == userMessageId);

            Assert.Equal(expStatus, storedUserMesage.Status.ToEnum <OutStatus>());

            InMessage storedSignalMessage =
                _databaseSpy.GetInMessageFor(m => m.EbmsMessageId == extraSignalMessage.MessageId);

            Assert.Equal(InStatus.Received, storedSignalMessage.Status.ToEnum <InStatus>());

            return(response);
        }
Ejemplo n.º 7
0
        public async Task PiggyBack_Receipt_On_Next_PullRequest_Result_In_Acked_UserMessage()
        {
            // Arrange
            OverrideServiceSettings("piggyback_service_settings.xml");

            _windowsService.EnsureServiceIsStarted();

            // Act
            await SubmitMessageToSubmitAgent(pullsendagent_piggyback);

            // Assert
            var       spy     = new DatabaseSpy(_consoleHost.GetConfiguration());
            InMessage receipt = await PollUntilPresent(
                () => spy.GetInMessageFor(
                    m => m.EbmsMessageType == MessageType.Receipt),
                timeout : TimeSpan.FromSeconds(30));

            await PollUntilPresent(
                () => spy.GetOutMessageFor(
                    m => m.EbmsMessageType == MessageType.UserMessage &&
                    m.EbmsMessageId == receipt.EbmsRefToMessageId &&
                    m.Status.ToEnum(OutStatus.NotApplicable) == OutStatus.Ack),
                timeout : TimeSpan.FromSeconds(10));
        }
Ejemplo n.º 8
0
        public async Task ThenInMessageSignalIsStoredWithPModeUrl()
        {
            // Arrange
            var userMessage = new UserMessage(
                $"user-{Guid.NewGuid()}",
                new CollaborationInfo(
                    new AgreementReference(
                        "http://eu.europe.agreements",
                        "callback-pmode")));

            // Act
            await StubSender.SendAS4Message(_receiveAgentUrl, AS4Message.Create(userMessage));

            // Assert
            OutMessage storedReceipt =
                await PollUntilPresent(
                    () => _databaseSpy.GetOutMessageFor(m => m.EbmsRefToMessageId == userMessage.MessageId &&
                                                        m.EbmsMessageType == MessageType.Receipt),
                    timeout : TimeSpan.FromSeconds(20));

            ReceivingProcessingMode pmode = _as4Msh.GetConfiguration().GetReceivingPModes().First(p => p.Id == "callback-pmode");

            Assert.Equal(pmode.ReplyHandling.ResponseConfiguration.Protocol.Url, storedReceipt.Url);
        }