public void RedeemClaimTokenThrowsWhenUnexpectedToken() { using (var tokenStream = MessageFactory.CreateClaimCheckIn("d59cd2ea045744f4a085b18be678e4f0").AsStream()) { MessageMock.Object.BodyPart.Data = tokenStream; Assert.That( () => ClaimStore.Instance.Redeem(MessageMock.Object, ResourceTrackerMock.Object), Throws.InvalidOperationException.With.Message.EqualTo("Invalid token message, CheckIn token is not expected to be redeemed.")); } }
/// <summary> /// Replace the message body's payload stream with either a <see cref="Schemas.Xml.Claim.Check"/> or a <see /// cref="Schemas.Xml.Claim.CheckIn"/> token message if its content has been assessed to be saved to disk while /// being tracked (see <see cref="SetupMessageBodyCapture"/>). Leave the message body's payload stream unaltered /// otherwise. /// </summary> /// <param name="message"> /// The <see cref="IBaseMessage"/> whose message body's payload stream is going to be claimed and replace by a /// token message. /// </param> /// <param name="resourceTracker"> /// Pipeline's <see cref="IResourceTracker"/> to which to report the newly created message token stream. /// </param> /// <remarks> /// The <see cref="IBaseMessage"/>'s <see cref="IBaseMessageContext"/> is also updated with the message type of /// the token message that is put in place of the actual message body's payload. /// </remarks> public virtual void Claim(IBaseMessage message, IResourceTracker resourceTracker) { var trackingStream = message.BodyPart.GetOriginalDataStream() as TrackingStream; if (trackingStream == null) { if (_logger.IsDebugEnabled) { _logger.Debug("Skipping claim of message body stream's payload; BodyPart's OriginalDataStream is not a TrackingStream."); } } else if (trackingStream.CaptureDescriptor.CaptureMode != MessageBodyCaptureMode.Claimed) { if (_logger.IsDebugEnabled) { _logger.Debug("Skipping claim of message body stream's payload; CaptureDescriptor.CaptureMode is not MessageBodyCaptureMode.Claimed."); } } else { if (_logger.IsDebugEnabled) { _logger.DebugFormat("Performing claim of message body stream's payload '{0}'.", trackingStream.CaptureDescriptor.Data); } var claimedMessageType = message.GetProperty(BtsProperties.MessageType); DocumentSpec documentSpec; Stream tokenMessageStream; if (RequiresCheckInAndOut) { documentSpec = typeof(Claim.CheckIn).GetMetadata().DocumentSpec; tokenMessageStream = MessageFactory.CreateClaimCheckIn(claimedMessageType, trackingStream.CaptureDescriptor.Data).AsStream(); } else { documentSpec = typeof(Claim.Check).GetMetadata().DocumentSpec; tokenMessageStream = MessageFactory.CreateClaimCheck(claimedMessageType, trackingStream.CaptureDescriptor.Data).AsStream(); } // fix the message type before capturing the body stream so that it get captured while tracking MessagingStep message.Promote(BtsProperties.MessageType, documentSpec.DocType); message.Promote(BtsProperties.SchemaStrongName, documentSpec.DocSpecStrongName); // drain and capture body stream trackingStream.Capture(); // replace message body's payload with the token message stream message.BodyPart.SetDataStream(tokenMessageStream, resourceTracker); } }
public void ClaimMessageBody() { SsoSettingsReaderMock .Setup(ssr => ssr.ReadString(BizTalkFactorySettings.APPLICATION_NAME, BizTalkFactorySettings.CLAIM_STORE_CHECK_IN_DIRECTORY_PROPERTY_NAME)) .Returns(Path.GetTempPath()); SsoSettingsReaderMock .Setup(ssr => ssr.ReadString(BizTalkFactorySettings.APPLICATION_NAME, BizTalkFactorySettings.CLAIM_STORE_CHECK_OUT_DIRECTORY_PROPERTY_NAME)) .Returns(@"\\network\share"); using (var contentStream = FakeTextStream.Create(1024 * 1024)) using (var trackingStream = new TrackingStream(contentStream)) { MessageMock.Object.BodyPart.Data = trackingStream; ClaimStore.Instance.SetupMessageBodyCapture(trackingStream, ActivityTrackingModes.Claim, null); ClaimStore.Instance.Claim(MessageMock.Object, ResourceTrackerMock.Object); // message's actual body stream has been exhausted (i.e. saved to disk) Assert.That(contentStream.Position, Is.EqualTo(contentStream.Length)); // message's body stream is replaced by a token message using (var reader = new StreamReader(MessageMock.Object.BodyPart.Data)) { Assert.That(reader.ReadToEnd(), Is.EqualTo(MessageFactory.CreateClaimCheckIn(trackingStream.CaptureDescriptor.Data).OuterXml)); } // MessageType of token message is promoted in message context var schemaMetadata = typeof(Claim.CheckIn).GetMetadata(); MessageMock.Verify(m => m.Promote(BtsProperties.MessageType, schemaMetadata.MessageType), Times.Once()); MessageMock.Verify(m => m.Promote(BtsProperties.SchemaStrongName, schemaMetadata.DocumentSpec.DocSpecStrongName), Times.Once()); // payload is claimed to disk and file extension is .chk var captureDescriptor = trackingStream.CaptureDescriptor; Assert.That(captureDescriptor.CaptureMode, Is.EqualTo(MessageBodyCaptureMode.Claimed)); Assert.That(captureDescriptor.Data, Does.StartWith(DateTime.Today.ToString(@"yyyyMMdd\\"))); Assert.That(File.Exists(Path.Combine(Path.GetTempPath(), captureDescriptor.Data.Replace("\\", "") + ".chk")), Is.True); } }