bool ValidateAccessPointTamperingMessage(NotificationMessageHolderType notification, MessageCheckSettings settings, StringBuilder logger) { MessageDescription messageInfo = new MessageDescription(); messageInfo.IsProperty = true; messageInfo.AddSimpleItem("State", "boolean", XSNAMESPACE); messageInfo.AddSimpleItem("Reason", "string", XSNAMESPACE); return(ValidateAccessPointMessage(notification, settings, logger, messageInfo)); }
bool ValidateAccessPointMessage(NotificationMessageHolderType notification, MessageCheckSettings settings, StringBuilder logger, MessageDescription messageInfo) { XmlElement messageElement = notification.Message; XmlElement messageRawElement = settings.RawMessageElements[notification]; TopicInfo topicInfo = settings.ExpectedTopic; XmlNamespaceManager manager = settings.NamespaceManager; // Init StringBuilder dump = new StringBuilder(); bool ok = true; ok = ValidateMessageCommonElements( notification, messageRawElement, topicInfo, settings.ExpectedPropertyOperation, manager, dump); if (messageElement != null) { // check message source and data // source bool localOk = ValidateAccessPointEventSource(messageElement, manager, settings.Data, dump); ok = ok && localOk; XmlElement messageInnerElement = messageRawElement.GetMessageContentElement(); XmlElement dataElement = messageInnerElement.GetMessageData(); localOk = ValidateMessageDataSimpleItems(dataElement, messageInfo, dump); ok = ok && localOk; } if (!ok) { logger.Append(dump.ToString()); } return(ok); }
/// <summary> /// Validates resulting message /// </summary> /// <param name="notify">Notify packet</param> /// <param name="message">Selected message</param> /// <param name="rawData">Raw notification data</param> /// <param name="resultTopic">Resulting event topic</param> /// <param name="validateResultMessageFunction">Message validation method</param> /// <param name="accessPointToken">Expected access point token</param> /// <param name="credentialsToken">Expected credentials token</param> /// <param name="credentialsHolderName">Expected credentials holder name</param> void ValidateResultMessage(Notify notify, NotificationMessageHolderType message, byte[] rawData, TopicInfo resultTopic, ValidateMessageFunction validateResultMessageFunction, string accessPointToken, string credentialsToken, string credentialsHolderName) { BeginStep("Validate message"); XmlDocument doc = new XmlDocument(); string soapRawPacket = System.Text.Encoding.UTF8.GetString(rawData); doc.LoadXml(soapRawPacket); XmlNamespaceManager manager = CreateNamespaceManager(doc); Dictionary <NotificationMessageHolderType, XmlElement> rawElements = GetRawElements(notify.NotificationMessage, doc, manager, true); StringBuilder logger = new StringBuilder(); bool ok = true; MessageCheckSettings settings = new MessageCheckSettings(); settings.NamespaceManager = manager; settings.ExpectedPropertyOperation = null; settings.ExpectedTopic = resultTopic; settings.RawMessageElements = rawElements; settings.Data = accessPointToken; ok = validateResultMessageFunction(message, settings, logger); if (ok) { Dictionary <string, string> dataSimpleItems = message.Message.GetMessageDataSimpleItems(); if (dataSimpleItems.ContainsKey(CREDENTIALSTOKENSIMPLEITEM)) { string actualCredentialsToken = dataSimpleItems[CREDENTIALSTOKENSIMPLEITEM]; if (credentialsToken != actualCredentialsToken) { ok = false; logger.Append(string.Format("CredentialToken is incorrect: expected '{0}', actual '{1}'{2}", credentialsToken, actualCredentialsToken, Environment.NewLine)); } } if (!string.IsNullOrEmpty(credentialsHolderName)) { if (dataSimpleItems.ContainsKey(CREDENTIALSHOLDERNAMESIMPLEITEM)) { string actualCredentialsHolderName = dataSimpleItems[CREDENTIALSHOLDERNAMESIMPLEITEM]; if (!string.IsNullOrEmpty(actualCredentialsHolderName)) { if (credentialsHolderName != actualCredentialsHolderName) { ok = false; logger.Append( string.Format("CredentialHolderName is incorrect: expected '{0}', actual '{1}'{2}", credentialsHolderName, actualCredentialsHolderName, Environment.NewLine)); } } } } } if (!ok) { throw new AssertException(logger.ToStringTrimNewLine()); } StepPassed(); }
/// <summary> /// Receives and validates request message /// </summary> /// <param name="server">Notification listening server</param> /// <param name="timeout">Waiting timeout</param> /// <param name="accessRequestTopic">Topic for request message</param> /// <param name="validateRequestMessageFunction">Validation method for request message</param> /// <param name="fullAccessPointsList">Full list of access points</param> /// <param name="accessPointsList">Filtered list of access points</param> /// <param name="credentialsToken">[out parameter]CredentialToken, if such SimpleItem is present /// (if not present and this item is mandatory, validation will fail)</param> /// <param name="credentialsHolderName">[out parameter]CredentialHolderName, if /// such SimpleItem is present</param> /// <returns></returns> string GetAccessRequestMessage(Utils.NotifyServer server, int timeout, TopicInfo accessRequestTopic, ValidateMessageFunction validateRequestMessageFunction, List <AccessPointInfo> fullAccessPointsList, List <AccessPointInfo> accessPointsList, ref string credentialsToken, ref string credentialsHolderName) { credentialsToken = string.Empty; string accessPointToken = null; string message = string.Format("{0} event is expected!", accessRequestTopic.GetDescription()); Action eventInitiationAction = new Action(() => { StepPassed(); _operator.ShowMessage(message); }); // receive request event { BeginStep("Start listening"); Notify notify = null; try { notify = server.WaitForNotify(eventInitiationAction, timeout * 1000, _semaphore.StopEvent); } finally { _operator.HideMessage(); } ValidateNotificationsPacket(server.RawData); ValidateNotifyNotEmpty(notify); if (notify.NotificationMessage.Length > 1) { LogTestEvent("DUT sent more than one notification. Test will be performed for token from the first notification"); } NotificationMessageHolderType notification = notify.NotificationMessage[0]; BeginStep("Validate message"); XmlDocument doc = new XmlDocument(); string soapRawPacket = System.Text.Encoding.UTF8.GetString(server.RawData); doc.LoadXml(soapRawPacket); XmlNamespaceManager manager = CreateNamespaceManager(doc); Dictionary <NotificationMessageHolderType, XmlElement> rawElements = GetRawElements(notify.NotificationMessage, doc, manager, true); MessageCheckSettings settings = new MessageCheckSettings(); settings.NamespaceManager = manager; settings.ExpectedPropertyOperation = null; settings.ExpectedTopic = accessRequestTopic; settings.RawMessageElements = rawElements; EntityListInfo <AccessPointInfo> info = new EntityListInfo <AccessPointInfo>(); info.FilteredList = accessPointsList; info.FullList = fullAccessPointsList; settings.Data = info; StringBuilder logger = new StringBuilder(); bool ok = true; ok = validateRequestMessageFunction(notification, settings, logger); XmlElement messageElement = notification.Message; if (ok) { // if names are duplicated, OK will be false by this moment Dictionary <string, string> sourceSimpleItems = messageElement.GetMessageSourceSimpleItems(); accessPointToken = sourceSimpleItems[ACCESSPOINTTOKENSIMPLEITEM]; } if (!ok) { throw new AssertException(logger.ToStringTrimNewLine()); } StepPassed(); // simple items must be OK by that moment Dictionary <string, string> dataSimpleItems = messageElement.GetMessageDataSimpleItems(); if (dataSimpleItems.ContainsKey(CREDENTIALSTOKENSIMPLEITEM)) { credentialsToken = dataSimpleItems[CREDENTIALSTOKENSIMPLEITEM]; } if (dataSimpleItems.ContainsKey(CREDENTIALSHOLDERNAMESIMPLEITEM)) { credentialsHolderName = dataSimpleItems[CREDENTIALSHOLDERNAMESIMPLEITEM]; } } return(accessPointToken); }