/// <summary> /// Clear all rules of the inbox folder. /// </summary> protected void ClearAllRules() { // Call RopGetRulesTable with valid TableFlags. RopGetRulesTableResponse ropGetRulesTableResponse; uint ruleTableHandle = this.OxoruleAdapter.RopGetRulesTable(this.InboxFolderHandle, TableFlags.Normal, out ropGetRulesTableResponse); if (ropGetRulesTableResponse.ReturnValue == 0) { // Get rule ID if rules exist. PropertyTag ruleIDTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleId, PropertyType = (ushort)PropertyType.PtypInteger64 }; RopQueryRowsResponse queryRowsResponse = this.OxoruleAdapter.QueryPropertiesInTable(ruleTableHandle, new PropertyTag[1] { ruleIDTag }); Site.Assert.AreEqual <uint>(0, queryRowsResponse.ReturnValue, "Retrieving rows from the rule table should succeed."); // Delete all rules if exist. if (queryRowsResponse.RowCount > 0) { RuleData[] ruleDatas = new RuleData[queryRowsResponse.RowCount]; for (int i = 0; i < queryRowsResponse.RowCount; i++) { ulong ruleId = BitConverter.ToUInt64(queryRowsResponse.RowData.PropertyRows[i].PropertyValues[0].Value, 0); RuleProperties ruleProperties = new RuleProperties(); ruleDatas[i] = AdapterHelper.GenerateValidRuleData(ActionType.OP_MARK_AS_READ, TestRuleDataType.ForRemove, 0, RuleState.ST_ENABLED, null, ruleProperties, ruleId); } RopModifyRulesResponse modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(this.InboxFolderHandle, ModifyRuleFlag.Modify_OnExisting, ruleDatas); Site.Assert.AreEqual <uint>(0, modifyRulesResponse.ReturnValue, "Deleting rule should be success"); // Wait the rule to be deleted Thread.Sleep(this.WaitForTheRuleToTakeEffect); } } }
public void MSOXORULE_S04_TC01_AddModifyDeleteStandardRule_OnPublicFolder() { this.CheckMAPIHTTPTransportSupported(); #region TestUser1 logs on to the public folder. RopOpenFolderResponse openFolderResponse; RopLogonResponse logonResponse; bool ret = this.OxoruleAdapter.Connect(ConnectionType.PublicFolderServer, this.User1Name, this.User1ESSDN, this.User1Password); Site.Assert.IsTrue(ret, "connect to public folder server should be successful"); uint publicFolderLogonHandler = this.OxoruleAdapter.RopLogon(LogonType.PublicFolder, this.User1ESSDN, out logonResponse); // Assert the client to log on to the public folder successfully. Site.Assert.AreEqual <uint>(0, logonResponse.ReturnValue, "Logon the public folder should be successful."); // Folder index 1 is the Interpersonal Messages subtree, and this is defined in MS-OXCSTOR. uint publicfolderHandler = this.OxoruleAdapter.RopOpenFolder(publicFolderLogonHandler, logonResponse.FolderIds[1], out openFolderResponse); // Get the store object's entry ID. this.GetStoreObjectEntryID(StoreObjectType.PublicFolder, this.Server, this.User1ESSDN); RopCreateFolderResponse createFolderResponse; string newFolderName = Common.GenerateResourceName(this.Site, Constants.FolderDisplayName); uint newFolderHandle = this.OxoruleAdapter.RopCreateFolder(publicfolderHandler, newFolderName, Constants.FolderComment, out createFolderResponse); Site.Assert.AreEqual <uint>(0, createFolderResponse.ReturnValue, "Creating folder operation should succeed."); #endregion #region TestUser1 prepares value for rule properties variable. RuleProperties ruleProperties = AdapterHelper.GenerateRuleProperties(this.Site, Constants.RuleNameDelete); RuleData ruleForDelete = AdapterHelper.GenerateValidRuleData(ActionType.OP_DELETE, TestRuleDataType.ForAdd, 1, RuleState.ST_ENABLED, new DeleteMarkReadActionData(), ruleProperties, null); #endregion #region TestUser1 adds rule OP_Delelte. RopModifyRulesResponse modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(newFolderHandle, ModifyRuleFlag.Modify_ReplaceAll, new RuleData[] { ruleForDelete }); Site.Assert.AreEqual <uint>(0, modifyRulesResponse.ReturnValue, "Adding Delete rule should succeed."); #endregion #region TestUser1 gets rule ID of the created rule. RopGetRulesTableResponse ropGetRulesTableResponse; uint ruleTableHandle = this.OxoruleAdapter.RopGetRulesTable(newFolderHandle, TableFlags.Normal, out ropGetRulesTableResponse); Site.Assert.AreEqual <uint>(0, ropGetRulesTableResponse.ReturnValue, "Getting rule table should succeed."); PropertyTag ruleIDTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleId, PropertyType = (ushort)PropertyType.PtypInteger64 }; RopQueryRowsResponse queryRowsResponse = this.OxoruleAdapter.QueryPropertiesInTable(ruleTableHandle, new PropertyTag[1] { ruleIDTag }); Site.Assert.AreEqual <uint>(0, queryRowsResponse.ReturnValue, "Retrieving rows from the rule table should succeed."); // Only one rule added in this folder, so the row count in the rule table should be 1. Site.Assert.AreEqual <uint>(1, queryRowsResponse.RowCount, "The rule number in the rule table is {0}", queryRowsResponse.RowCount); this.VerifyRuleTable(); ulong ruleId = BitConverter.ToUInt64(queryRowsResponse.RowData.PropertyRows[0].PropertyValues[0].Value, 0); #endregion #region TestUser1 modifies the created rule. ruleProperties.Name = Common.GenerateResourceName(this.Site, "RuleNameForModify"); ruleForDelete = AdapterHelper.GenerateValidRuleData(ActionType.OP_DELETE, TestRuleDataType.ForModify, 1, RuleState.ST_ENABLED, new DeleteMarkReadActionData(), ruleProperties, ruleId); modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(newFolderHandle, ModifyRuleFlag.Modify_OnExisting, new RuleData[] { ruleForDelete }); Site.Assert.AreEqual <uint>(0, modifyRulesResponse.ReturnValue, "Modifying the OP_DELETE rule should be success"); #endregion #region TestUser1 calls RopGetRulesTable with valid TableFlags. ruleTableHandle = this.OxoruleAdapter.RopGetRulesTable(newFolderHandle, TableFlags.Normal, out ropGetRulesTableResponse); #endregion #region TestUser1 retrieves rule information for the modified rule. PropertyTag ruleNameTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleName, PropertyType = (ushort)PropertyType.PtypString }; // Retrieves rows from the rule table. queryRowsResponse = this.OxoruleAdapter.QueryPropertiesInTable(ruleTableHandle, new PropertyTag[2] { ruleIDTag, ruleNameTag }); Site.Assert.AreEqual <uint>(0, queryRowsResponse.ReturnValue, "Retrieving rows from the rule table should succeed."); // Only one rule added in this folder, so the row count in the rule table should be 1. Site.Assert.AreEqual <uint>(1, queryRowsResponse.RowCount, "The rule number in the rule table is {0}", queryRowsResponse.RowCount); this.VerifyRuleTable(); ulong ruleIdModified = BitConverter.ToUInt64(queryRowsResponse.RowData.PropertyRows[0].PropertyValues[0].Value, 0); bool isSameRuleId = ruleId == ruleIdModified; Site.Assert.IsTrue(isSameRuleId, "The original rule Id is {0} and the modified rule Id is {1}", ruleId, ruleIdModified); string modifiedRuleName = AdapterHelper.PropertyValueConvertToString(queryRowsResponse.RowData.PropertyRows.ToArray()[0].PropertyValues[1].Value); Site.Assert.AreEqual <string>(ruleProperties.Name, modifiedRuleName, "The actual rule name {0} should be equal to the expected rule name {1}.", modifiedRuleName, ruleProperties.Name); #endregion #region TestUser1 deletes the created rule. ruleForDelete = AdapterHelper.GenerateValidRuleData(ActionType.OP_DELETE, TestRuleDataType.ForRemove, 1, RuleState.ST_ENABLED, null, ruleProperties, ruleId); modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(newFolderHandle, ModifyRuleFlag.Modify_OnExisting, new RuleData[] { ruleForDelete }); Site.Assert.AreEqual <uint>(0, modifyRulesResponse.ReturnValue, "Deleting the OP_DELETE rule should succeed."); RopDeleteFolderResponse deleteFolder = this.OxoruleAdapter.RopDeleteFolder(publicfolderHandler, createFolderResponse.FolderId); Site.Assert.AreEqual <uint>(0, deleteFolder.ReturnValue, "Deleting folder should succeed."); #endregion }
public void MSOXORULE_S04_TC04_AddNotSupportedRule_OnPublicFolder() { this.CheckMAPIHTTPTransportSupported(); #region TestUser2 logs on to the public folder. RopOpenFolderResponse openFolderResponse; RopLogonResponse logonResponse; bool ret = this.OxoruleAdapter.Connect(ConnectionType.PublicFolderServer, this.User2Name, this.User2ESSDN, this.User2Password); Site.Assert.IsTrue(ret, "connect to public folder server should be successful"); uint publicFolderLogonHandler = this.OxoruleAdapter.RopLogon(LogonType.PublicFolder, this.User2ESSDN, out logonResponse); // Assert the client to log on to the public folder successfully. Site.Assert.AreEqual <uint>(0, logonResponse.ReturnValue, "Logon the public folder should be successful."); // Folder index 1 is the Interpersonal Messages subtree, and this is defined in MS-OXCSTOR. uint publicfolderHandler = this.OxoruleAdapter.RopOpenFolder(publicFolderLogonHandler, logonResponse.FolderIds[1], out openFolderResponse); ulong publicFolderID = logonResponse.FolderIds[1]; #endregion #region TestUser2 tests the unsupported rules in public folder. #region TestUser2 prepares value for ruleProperties variable. RuleProperties ruleProperties = AdapterHelper.GenerateRuleProperties(this.Site, Constants.RuleNameDeferredAction); #endregion #region TestUser2 adds a Rule set Action Type to OP_DEFER_ACTION. DeferredActionData deferredActionData = new DeferredActionData { Data = Common.GetBytesFromBinaryHexString(Constants.DeferredActionBufferData) }; RuleData deferredActionRuleData = AdapterHelper.GenerateValidRuleData(ActionType.OP_DEFER_ACTION, TestRuleDataType.ForAdd, 5, RuleState.ST_ENABLED, deferredActionData, ruleProperties, null); RopModifyRulesResponse ropModifyRulesResponse = this.OxoruleAdapter.RopModifyRules(publicfolderHandler, ModifyRuleFlag.Modify_ReplaceAll, new RuleData[] { deferredActionRuleData }); #endregion // Add the debug information. Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXORULE_R258: server returned value is {0}", ropModifyRulesResponse.ReturnValue); // Verify MS-OXORULE requirement: MS-OXORULE_R258. // If the ReturnValue is not 0x00000000, it means the server failed to add a public folder rule with this OP_DEFER_ACTION Type action. // So it is not used in a public folder rule. bool isVerifyR258 = ropModifyRulesResponse.ReturnValue != 0x00000000; Site.CaptureRequirementIfIsTrue( isVerifyR258, 258, @"[In ActionBlock Structure] The meaning of action type OP_DEFER_ACTION: MUST NOT be used in a public folder rule (4)."); #region TestUser2 prepares rules' data. MoveCopyActionData moveCopyActionData = new MoveCopyActionData(); // Get the Inbox folder entry ID. byte[] folderEId = this.OxoruleAdapter.GetFolderEntryId(StoreObjectType.PublicFolder, publicfolderHandler, publicFolderID); // Get the store object's entry ID. byte[] storeEId = this.GetStoreObjectEntryID(StoreObjectType.PublicFolder, this.Server, this.User1ESSDN); moveCopyActionData.FolderEID = folderEId; moveCopyActionData.StoreEID = storeEId; moveCopyActionData.FolderEIDSize = (ushort)folderEId.Length; moveCopyActionData.StoreEIDSize = (ushort)storeEId.Length; #endregion #region TestUser2 prepares value for ruleProperties variable. ruleProperties = AdapterHelper.GenerateRuleProperties(this.Site, Constants.RuleNameMoveOne); #endregion #region TestUser2 adds OP_MOVE rule to the public folder. ruleProperties.Name = Common.GenerateResourceName(this.Site, Constants.RuleNameMoveOne); RuleData ruleForMove = AdapterHelper.GenerateValidRuleData(ActionType.OP_MOVE, TestRuleDataType.ForAdd, 0, RuleState.ST_ENABLED, moveCopyActionData, ruleProperties, null); RopModifyRulesResponse modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(publicfolderHandler, ModifyRuleFlag.Modify_ReplaceAll, new RuleData[] { ruleForMove }); #endregion // Add the debug information. Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXORULE_R839: server returned value is {0}", modifyRulesResponse.ReturnValue); // Verify MS-OXORULE requirement: MS-OXORULE_R839. // If the returnValue is not 0x00000000, it means this OP_MOVE Type used in a public folder rule is failed, // so it is not used in a public folder rule. bool isVerifyR839 = modifyRulesResponse.ReturnValue != 0x00000000; Site.CaptureRequirementIfIsTrue( isVerifyR839, 839, @"[In ActionBlock Structure] The meaning of action type OP_MOVE: MUST NOT be used in a public folder rule (4)."); #region TestUser2 adds OP_COPY rule to the public folder. ruleProperties.Name = Common.GenerateResourceName(this.Site, Constants.RuleNameMoveTwo); RuleData ruleForCopy = AdapterHelper.GenerateValidRuleData(ActionType.OP_COPY, TestRuleDataType.ForAdd, 1, RuleState.ST_ENABLED, moveCopyActionData, ruleProperties, null); modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(publicfolderHandler, ModifyRuleFlag.Modify_ReplaceAll, new RuleData[] { ruleForCopy }); #endregion // Add the debug information Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXORULE_R840: server returned value is {0}", modifyRulesResponse.ReturnValue); // Verify MS-OXORULE requirement: MS-OXORULE_R840. // If the ReturnValue is not 0x00000000, it means this OP_COPY Type used in a public folder rule is failed, // so it is not used in a public folder rule. bool isVerifyR840 = modifyRulesResponse.ReturnValue != 0x00000000; Site.CaptureRequirementIfIsTrue( isVerifyR840, 840, @"[In ActionBlock Structure] The meaning of action type OP_COPY: MUST NOT be used in a public folder rule (4)."); #endregion }
public void MSOXORULE_S04_TC03_ServerExecuteRule_Action_OP_TAG_OnPublicFolder() { this.CheckMAPIHTTPTransportSupported(); #region TestUser1 logs on to the public folder. RopOpenFolderResponse openFolderResponse; RopLogonResponse logonResponse; bool ret = this.OxoruleAdapter.Connect(ConnectionType.PublicFolderServer, this.User1Name, this.User1ESSDN, this.User1Password); Site.Assert.IsTrue(ret, "connect to public folder server should be successful"); uint publicFolderLogonHandler = this.OxoruleAdapter.RopLogon(LogonType.PublicFolder, this.User1ESSDN, out logonResponse); // Assert the client to log on to the public folder successfully. Site.Assert.AreEqual <uint>(0, logonResponse.ReturnValue, "Logon the public folder should be successful."); // Folder index 1 is the Interpersonal Messages subtree, and this is defined in MS-OXCSTOR. uint publicfolderHandler = this.OxoruleAdapter.RopOpenFolder(publicFolderLogonHandler, logonResponse.FolderIds[1], out openFolderResponse); // Get the store object's entry ID. this.GetStoreObjectEntryID(StoreObjectType.PublicFolder, this.Server, this.User1ESSDN); RopCreateFolderResponse createFolderResponse; string newFolderName = Common.GenerateResourceName(this.Site, Constants.FolderDisplayName); uint newFolderHandle = this.OxoruleAdapter.RopCreateFolder(publicfolderHandler, newFolderName, Constants.FolderComment, out createFolderResponse); ulong newFolderID = createFolderResponse.FolderId; Site.Assert.AreEqual <uint>(0, createFolderResponse.ReturnValue, "Creating folder operation should succeed."); #endregion #region TestUser1 prepares value for ruleProperties variable. RuleProperties ruleProperties = AdapterHelper.GenerateRuleProperties(this.Site, Constants.RuleNameTag); #endregion #region TestUser1 adds an OP_TAG rule to the new created folder. TagActionData tagActionData = new TagActionData(); PropertyTag tagActionDataPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagImportance, PropertyType = (ushort)PropertyType.PtypInteger32 }; tagActionData.PropertyTag = tagActionDataPropertyTag; tagActionData.PropertyValue = BitConverter.GetBytes(1); RuleData ruleOpTag = AdapterHelper.GenerateValidRuleData(ActionType.OP_TAG, TestRuleDataType.ForAdd, 1, RuleState.ST_ENABLED, tagActionData, ruleProperties, null); RopModifyRulesResponse modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(newFolderHandle, ModifyRuleFlag.Modify_ReplaceAll, new RuleData[] { ruleOpTag }); Site.Assert.AreEqual <uint>(0, modifyRulesResponse.ReturnValue, "Adding OP_TAG rule should succeed."); #endregion #region TestUser1 creates a message. RopCreateMessageResponse ropCreateMessageResponse; uint messageHandle = this.OxoruleAdapter.RopCreateMessage(newFolderHandle, newFolderID, Convert.ToByte(false), out ropCreateMessageResponse); Site.Assert.AreEqual <uint>(0, ropCreateMessageResponse.ReturnValue, "Creating message should succeed."); #endregion #region TestUser1 saves the subject property of the message to trigger the rule. string subjectName = Common.GenerateResourceName(this.Site, ruleProperties.ConditionSubjectName + "Title"); TaggedPropertyValue subjectProperty = new TaggedPropertyValue(); PropertyTag pidTagSubjectPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagSubject, PropertyType = (ushort)PropertyType.PtypString }; subjectProperty.PropertyTag = pidTagSubjectPropertyTag; subjectProperty.Value = Encoding.Unicode.GetBytes(subjectName + "\0"); // Set properties for the created message to trigger the rule. RopSetPropertiesResponse ropSetPropertiesResponse = this.OxoruleAdapter.RopSetProperties(messageHandle, new TaggedPropertyValue[] { subjectProperty }); Site.Assert.AreEqual <uint>(0, ropSetPropertiesResponse.ReturnValue, "Setting property for the created message should succeed."); // Save changes of message. RopSaveChangesMessageResponse ropSaveChangesMessagResponse = this.OxoruleAdapter.RopSaveChangesMessage(messageHandle); Site.Assert.AreEqual <uint>(0, ropSaveChangesMessagResponse.ReturnValue, "Saving the created message should succeed."); // Wait for the message to be saved and the rule to take effect. Thread.Sleep(this.WaitForTheRuleToTakeEffect); #endregion #region TestUser1 gets the message and its properties to verify the rule evaluation. PropertyTag[] propertyTagList = new PropertyTag[2]; propertyTagList[0].PropertyId = (ushort)PropertyId.PidTagImportance; propertyTagList[0].PropertyType = (ushort)PropertyType.PtypInteger32; propertyTagList[1].PropertyId = (ushort)PropertyId.PidTagSubject; propertyTagList[1].PropertyType = (ushort)PropertyType.PtypString; uint contentTableHandle = 0; uint rowCount = 0; RopQueryRowsResponse getMailMessageContent = this.GetExpectedMessage(newFolderHandle, ref contentTableHandle, propertyTagList, ref rowCount, 1, subjectName); Site.Assert.AreEqual <uint>(1, rowCount, @"The message number in the specific folder should be 1."); Site.Assert.AreEqual <int>(1, BitConverter.ToInt32(getMailMessageContent.RowData.PropertyRows[(int)rowCount - 1].PropertyValues[0].Value, 0), "If the rule is executed, the PidTagImportance property of the message should be the value set by the rule."); RopDeleteFolderResponse deleteFolder = this.OxoruleAdapter.RopDeleteFolder(publicfolderHandler, newFolderID); Site.Assert.AreEqual <uint>(0, deleteFolder.ReturnValue, "Deleting folder should succeed."); #endregion }
/// <summary> /// Verify action type OP_COPY. /// </summary> /// <param name="mailSubject">The subject of the new mail.</param> /// <param name="getNewFolderMailMessageContent">The mail message content gotten from the new folder.</param> /// <param name="getInboxMailMessageContent">The mail message content gotten from the Inbox folder.</param> /// <param name="ruleProperties">The properties of the current rule.</param> private void VerifyActionTypeOP_COPY(string mailSubject, RopQueryRowsResponse getNewFolderMailMessageContent, RopQueryRowsResponse getInboxMailMessageContent, RuleProperties ruleProperties) { // Add the debug information Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXORULE_R250: the message count in newFolder is {0}, and in inboxFolder is {1}", getNewFolderMailMessageContent.RowCount, getInboxMailMessageContent.RowCount); // Verify MS-OXORULE requirement: MS-OXORULE_R250 bool isVerifyR250 = mailSubject.Contains(ruleProperties.ConditionSubjectName) && getNewFolderMailMessageContent.RowCount == 1; Site.CaptureRequirementIfIsTrue( isVerifyR250, 250, @"[In ActionBlock Structure] The meaning of action type OP_COPY: Copies the message to a folder."); }
/// <summary> /// Generate RuleData from ptf config base on different action Type. /// </summary> /// <param name="actionType">ActionType of each blocks, the sequence must be the same as the actionData array.</param> /// <param name="ruleSequence">Rule sequence in PidTagRuleSequence of the RuleData.</param> /// <param name="ruleState">Specifies value of PidTagRuleState of the RuleData.</param> /// <param name="actionData">The actionData array needed to construct the ActionBlock in RuleActions.</param> /// <param name="actionFlavor">The actionFlavor array of the rule ActionBlocks.</param> /// <param name="otherInfo"> /// An array of Other needed information of Actions. /// Index may be from 0-4 /// 0. Rule name /// 1. Rule provider /// 2. Rule user Flags /// 3. Rule provider data /// 4. Subject name of content restriction /// </param> /// <returns>A valid RuleData structure.</returns> public static RuleData GenerateValidRuleDataWithFlavor(ActionType[] actionType, int ruleSequence, RuleState ruleState, IActionData[] actionData, uint[] actionFlavor, RuleProperties otherInfo) { RuleData ruleData = new RuleData { RuleDataFlags = (byte)TestRuleDataType.ForAdd }; List<TaggedPropertyValue> propertyList = new List<TaggedPropertyValue>(); TaggedPropertyValue pidTagRuleSequence = new TaggedPropertyValue(); PropertyTag pidTagRuleSequencePropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleSequence, PropertyType = (ushort)PropertyType.PtypInteger32 }; pidTagRuleSequence.PropertyTag = pidTagRuleSequencePropertyTag; pidTagRuleSequence.Value = BitConverter.GetBytes(ruleSequence); propertyList.Add(pidTagRuleSequence); TaggedPropertyValue pidTagRuleLevel = new TaggedPropertyValue(); PropertyTag pidTagRuleLevelPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleLevel, PropertyType = (ushort)PropertyType.PtypInteger32 }; pidTagRuleLevel.PropertyTag = pidTagRuleLevelPropertyTag; pidTagRuleLevel.Value = BitConverter.GetBytes(Constants.RuleLevel); propertyList.Add(pidTagRuleLevel); TaggedPropertyValue pidTagRuleState = new TaggedPropertyValue(); PropertyTag pidTagRuleStatePropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleState, PropertyType = (ushort)PropertyType.PtypInteger32 }; pidTagRuleState.PropertyTag = pidTagRuleStatePropertyTag; pidTagRuleState.Value = BitConverter.GetBytes((uint)ruleState); propertyList.Add(pidTagRuleState); if (otherInfo.Name.Length > 0) { TaggedPropertyValue pidTagRuleName = new TaggedPropertyValue(); PropertyTag pidTagRuleNamePropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleName, PropertyType = (ushort)PropertyType.PtypString }; pidTagRuleName.PropertyTag = pidTagRuleNamePropertyTag; pidTagRuleName.Value = Encoding.Unicode.GetBytes((string)otherInfo.Name + "\0"); propertyList.Add(pidTagRuleName); } if (otherInfo.Provider.Length > 0) { TaggedPropertyValue pidTagRuleProvider = new TaggedPropertyValue(); PropertyTag pidTagRuleProviderPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleProvider, PropertyType = (ushort)PropertyType.PtypString }; pidTagRuleProvider.PropertyTag = pidTagRuleProviderPropertyTag; pidTagRuleProvider.Value = Encoding.Unicode.GetBytes((string)otherInfo.Provider + "\0"); propertyList.Add(pidTagRuleProvider); } if (otherInfo.UserFlag.Length > 0) { TaggedPropertyValue pidTagRuleUserFlags = new TaggedPropertyValue(); PropertyTag pidTagRuleUserFlagsPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleUserFlags, PropertyType = (ushort)PropertyType.PtypInteger32 }; pidTagRuleUserFlags.PropertyTag = pidTagRuleUserFlagsPropertyTag; pidTagRuleUserFlags.Value = BitConverter.GetBytes(int.Parse(otherInfo.UserFlag)); propertyList.Add(pidTagRuleUserFlags); } if (otherInfo.ProviderData.Length > 0) { TaggedPropertyValue pidTagRuleProviderData = new TaggedPropertyValue(); PropertyTag pidTagRuleProviderDataPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleProviderData, PropertyType = (ushort)PropertyType.PtypBinary }; pidTagRuleProviderData.PropertyTag = pidTagRuleProviderDataPropertyTag; pidTagRuleProviderData.Value = Common.GetBytesFromBinaryHexString(otherInfo.ProviderData); pidTagRuleProviderData.Value = Common.AddInt16LengthBeforeBinaryArray(pidTagRuleProviderData.Value); propertyList.Add(pidTagRuleProviderData); } if (otherInfo.ConditionSubjectName.Length > 0) { AddRuleCondition(propertyList, otherInfo.ConditionSubjectName); uint[] defaultActionFlags = new uint[actionData.Length]; for (int i = 0; i < actionData.Length; i++) { defaultActionFlags[i] = Constants.RuleActionFlags; } AddRuleAction(propertyList, actionType, actionData, actionFlavor, defaultActionFlags); } ruleData.PropertyValues = propertyList.ToArray(); ruleData.PropertyValueCount = (ushort)propertyList.Count; return ruleData; }
/// <summary> /// Generate RuleData from ptf config base on different action Type. /// </summary> /// <param name="actionType">ActionType in a rule.</param> /// <param name="ruleDataType">The type of the rule data.</param> /// <param name="ruleSequence">Rule sequence in PidTagRuleSequence of the RuleData.</param> /// <param name="ruleState">Specifies value of PidTagRuleState of the RuleData.</param> /// <param name="actionData">The actionData needed to construct the RuleData.</param> /// <param name="otherInfo"> /// An array of Other needed information of Actions. /// Index may be from 0-4 /// 0. Rule name /// 1. Rule provider /// 2. Rule user Flags /// 3. Rule provider data /// 4. Subject name of content restriction /// </param> /// <param name="ruleId">A 64-bit unsigned integer represents the rule.</param> /// <returns>A valid RuleData structure.</returns> public static RuleData GenerateValidRuleData(ActionType actionType, TestRuleDataType ruleDataType, int ruleSequence, RuleState ruleState, IActionData actionData, RuleProperties otherInfo, ulong? ruleId) { RuleData ruleData = new RuleData { RuleDataFlags = (byte)ruleDataType }; List<TaggedPropertyValue> propertyList = new List<TaggedPropertyValue>(); if (ruleDataType == TestRuleDataType.ForModify || ruleDataType == TestRuleDataType.ForRemove) { TaggedPropertyValue pidTagRuleId = new TaggedPropertyValue(); PropertyTag pidTagRuleIdPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleId, PropertyType = (ushort)PropertyType.PtypInteger64 }; pidTagRuleId.PropertyTag = pidTagRuleIdPropertyTag; pidTagRuleId.Value = BitConverter.GetBytes((ulong)ruleId); propertyList.Add(pidTagRuleId); } if (ruleDataType != TestRuleDataType.ForRemove) { TaggedPropertyValue pidTagRuleSequence = new TaggedPropertyValue(); PropertyTag pidTagRuleSequencePropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleSequence, PropertyType = (ushort)PropertyType.PtypInteger32 }; pidTagRuleSequence.PropertyTag = pidTagRuleSequencePropertyTag; pidTagRuleSequence.Value = BitConverter.GetBytes(ruleSequence); propertyList.Add(pidTagRuleSequence); TaggedPropertyValue pidTagRuleLevel = new TaggedPropertyValue(); PropertyTag pidTagRuleLevelPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleLevel, PropertyType = (ushort)PropertyType.PtypInteger32 }; pidTagRuleLevel.PropertyTag = pidTagRuleLevelPropertyTag; pidTagRuleLevel.Value = BitConverter.GetBytes(0); propertyList.Add(pidTagRuleLevel); TaggedPropertyValue pidTagRuleState = new TaggedPropertyValue(); PropertyTag pidTagRuleStatePropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleState, PropertyType = (ushort)PropertyType.PtypInteger32 }; pidTagRuleState.PropertyTag = pidTagRuleStatePropertyTag; pidTagRuleState.Value = BitConverter.GetBytes((uint)ruleState); propertyList.Add(pidTagRuleState); if (otherInfo.Name.Length > 0) { TaggedPropertyValue pidTagRuleName = new TaggedPropertyValue(); PropertyTag pidTagRuleNamePropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleName, PropertyType = (ushort)PropertyType.PtypString }; pidTagRuleName.PropertyTag = pidTagRuleNamePropertyTag; pidTagRuleName.Value = Encoding.Unicode.GetBytes((string)otherInfo.Name + "\0"); propertyList.Add(pidTagRuleName); } if (otherInfo.Provider.Length > 0) { TaggedPropertyValue pidTagRuleProvider = new TaggedPropertyValue(); PropertyTag pidTagRuleProviderPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleProvider, PropertyType = (ushort)PropertyType.PtypString }; pidTagRuleProvider.PropertyTag = pidTagRuleProviderPropertyTag; pidTagRuleProvider.Value = Encoding.Unicode.GetBytes((string)otherInfo.Provider + "\0"); propertyList.Add(pidTagRuleProvider); } if (otherInfo.UserFlag.Length > 0) { TaggedPropertyValue pidTagRuleUserFlags = new TaggedPropertyValue(); PropertyTag pidTagRuleUserFlagsPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleUserFlags, PropertyType = (ushort)PropertyType.PtypInteger32 }; pidTagRuleUserFlags.PropertyTag = pidTagRuleUserFlagsPropertyTag; pidTagRuleUserFlags.Value = BitConverter.GetBytes(int.Parse(otherInfo.UserFlag)); propertyList.Add(pidTagRuleUserFlags); } if (otherInfo.ProviderData.Length > 0) { TaggedPropertyValue pidTagRuleProviderData = new TaggedPropertyValue(); PropertyTag pidTagRuleProviderDataPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleProviderData, PropertyType = (ushort)PropertyType.PtypBinary }; pidTagRuleProviderData.PropertyTag = pidTagRuleProviderDataPropertyTag; pidTagRuleProviderData.Value = Common.GetBytesFromBinaryHexString(otherInfo.ProviderData); pidTagRuleProviderData.Value = Common.AddInt16LengthBeforeBinaryArray(pidTagRuleProviderData.Value); propertyList.Add(pidTagRuleProviderData); } if (otherInfo.ConditionSubjectName.Length > 0) { AddRuleCondition(propertyList, otherInfo.ConditionSubjectName); AddRuleAction(propertyList, actionType, actionData, Constants.CommonActionFlavor, Constants.RuleActionFlags); } } ruleData.PropertyValues = propertyList.ToArray(); ruleData.PropertyValueCount = (ushort)propertyList.Count; return ruleData; }
/// <summary> /// Generate rule properties value. /// </summary> /// <param name="site">An instance of interface ITestSite which provides logging, assertions, /// and adapters for test code onto its execution context.</param> /// <param name="name">Rule name.</param> /// <returns>Rule properties.</returns> public static RuleProperties GenerateRuleProperties(ITestSite site, string name) { RuleProperties ruleProperties = new RuleProperties(); switch (name) { case Constants.RuleNameCopy: case Constants.RuleNameDelete: case Constants.RuleNameMarkAsRead: case Constants.RuleNameMoveOne: case Constants.RuleNameMoveTwo: case Constants.RuleNameForward: case Constants.RuleNameDeferredAction: case Constants.RuleNameBounce: case Constants.RuleNameTag: case Constants.RuleNameDelegate: case Constants.RuleNameReply: case Constants.RuleNameForwardAT: case Constants.RuleNameForwardTM: case Constants.RuleNameOOFReply: ruleProperties.UserFlag = Constants.PidTagRuleUserFlags1; ruleProperties.Provider = Constants.PidTagRuleProvider; ruleProperties.ProviderData = Constants.PidTagRuleProviderData; ruleProperties.ConditionSubjectName = Constants.RuleConditionSubjectContainString + DateTime.Now.ToString("HHmmss"); break; case Constants.DAMPidTagRuleNameOne: case Constants.DAMPidTagRuleNameTwo: ruleProperties.Provider = Constants.DAMPidTagRuleProviderOne; ruleProperties.ConditionSubjectName = Constants.DAMPidTagRuleConditionSubjectContainString + DateTime.Now.ToString("HHmmss"); ruleProperties.UserFlag = Constants.DAMPidTagRuleUserFlags; ruleProperties.ProviderData = Constants.DAMPidTagRuleProviderData; break; case Constants.DEMRule: ruleProperties.ConditionSubjectName = Constants.DEMPidTagRuleConditionSubjectContainString + DateTime.Now.ToString("HHmmss"); ruleProperties.UserFlag = Constants.DEMPidTagRuleUserFlags; ruleProperties.ProviderData = Constants.DEMPidTagRuleProviderData; ruleProperties.Provider = Constants.DEMPidTagRuleProvider; break; default: break; } ruleProperties.Name = Common.GenerateResourceName(site, name); return ruleProperties; }
/// <summary> /// Clear all rules of the inbox folder. /// </summary> protected void ClearAllRules() { // Call RopGetRulesTable with valid TableFlags. RopGetRulesTableResponse ropGetRulesTableResponse; uint ruleTableHandle = this.OxoruleAdapter.RopGetRulesTable(this.InboxFolderHandle, TableFlags.Normal, out ropGetRulesTableResponse); if (ropGetRulesTableResponse.ReturnValue == 0) { // Get rule ID if rules exist. PropertyTag ruleIDTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleId, PropertyType = (ushort)PropertyType.PtypInteger64 }; RopQueryRowsResponse queryRowsResponse = this.OxoruleAdapter.QueryPropertiesInTable(ruleTableHandle, new PropertyTag[1] { ruleIDTag }); Site.Assert.AreEqual<uint>(0, queryRowsResponse.ReturnValue, "Retrieving rows from the rule table should succeed."); // Delete all rules if exist. if (queryRowsResponse.RowCount > 0) { RuleData[] ruleDatas = new RuleData[queryRowsResponse.RowCount]; for (int i = 0; i < queryRowsResponse.RowCount; i++) { ulong ruleId = BitConverter.ToUInt64(queryRowsResponse.RowData.PropertyRows[i].PropertyValues[0].Value, 0); RuleProperties ruleProperties = new RuleProperties(); ruleDatas[i] = AdapterHelper.GenerateValidRuleData(ActionType.OP_MARK_AS_READ, TestRuleDataType.ForRemove, 0, RuleState.ST_ENABLED, null, ruleProperties, ruleId); } RopModifyRulesResponse modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(this.InboxFolderHandle, ModifyRuleFlag.Modify_OnExisting, ruleDatas); Site.Assert.AreEqual<uint>(0, modifyRulesResponse.ReturnValue, "Deleting rule should be success"); // Wait the rule to be deleted Thread.Sleep(this.WaitForTheRuleToTakeEffect); } } }