public void MSOXCFOLD_S03_TC02_DynamicSearchVerification()
{
this.CheckWhetherSupportTransport();
this.Adapter.DoConnect(ConnectionType.PrivateMailboxServer);
this.GenericFolderInitialization();
#region Step 1. The client calls RopCreateFolder to create the general folder [MSOXCFOLDSubfolder1] under the root folder.
RopCreateFolderRequest createFolderRequest = new RopCreateFolderRequest();
createFolderRequest.RopId = (byte)RopId.RopCreateFolder;
createFolderRequest.LogonId = Constants.CommonLogonId;
createFolderRequest.InputHandleIndex = Constants.CommonInputHandleIndex;
createFolderRequest.OutputHandleIndex = Constants.CommonOutputHandleIndex;
createFolderRequest.FolderType = 0x01;
createFolderRequest.UseUnicodeStrings = 0x0;
createFolderRequest.OpenExisting = 0x00;
createFolderRequest.Reserved = 0x0;
createFolderRequest.DisplayName = Encoding.ASCII.GetBytes(Constants.Subfolder1);
createFolderRequest.Comment = Encoding.ASCII.GetBytes(Constants.Subfolder1);
RopCreateFolderResponse createFolderResponse = this.Adapter.CreateFolder(createFolderRequest, this.RootFolderHandle, ref this.responseHandles);
Site.Assert.AreEqual<uint>(Constants.SuccessCode, createFolderResponse.ReturnValue, "RopCreateFolder ROP operation performs successfully!");
uint subfolderHandle1 = this.responseHandles[0][createFolderResponse.OutputHandleIndex];
ulong subfolderId1 = createFolderResponse.FolderId;
#endregion
#region Step 2. The client creates a non-FAI message under the general folder [MSOXCFOLDSubfolder1].
uint messageNonFAIHandle1 = 0;
ulong messageNonFAIId1 = 0;
this.CreateSaveMessage(subfolderHandle1, subfolderId1, ref messageNonFAIId1, ref messageNonFAIHandle1);
#endregion
#region Step 3. The client calls RopCreateFolder to create the search folder [MSOXCFOLDSearchFolder1] under the root folder.
createFolderRequest.FolderType = 0x02;
createFolderRequest.DisplayName = Encoding.ASCII.GetBytes(Constants.SearchFolder);
createFolderRequest.Comment = Encoding.ASCII.GetBytes(Constants.SearchFolder);
createFolderResponse = this.Adapter.CreateFolder(createFolderRequest, this.RootFolderHandle, ref this.responseHandles);
Site.Assert.AreEqual<uint>(Constants.SuccessCode, createFolderResponse.ReturnValue, "RopCreateFolder ROP operation performs successfully!");
uint searchFolderHandle = this.responseHandles[0][createFolderResponse.OutputHandleIndex];
#endregion
#region Step 4. The client calls RopSetSearchCriteria to establish search criteria for [MSOXCFOLDSearchFolder1].
RopSetSearchCriteriaRequest setSearchCriteriaRequest = new RopSetSearchCriteriaRequest
{
RopId = (byte)RopId.RopSetSearchCriteria,
LogonId = Constants.CommonLogonId,
InputHandleIndex = Constants.CommonInputHandleIndex
};
PropertyTag propertyTag = new PropertyTag
{
PropertyId = (ushort)MessagePropertyId.PidTagMessageClass,
PropertyType = (ushort)PropertyType.PtypString
};
ExistRestriction existRestriction = new ExistRestriction
{
PropTag = propertyTag
};
setSearchCriteriaRequest.RestrictionDataSize = (ushort)existRestriction.Size();
setSearchCriteriaRequest.RestrictionData = existRestriction.Serialize();
setSearchCriteriaRequest.FolderIds = new ulong[] { subfolderId1 };
setSearchCriteriaRequest.FolderIdCount = (ushort)setSearchCriteriaRequest.FolderIds.Length;
setSearchCriteriaRequest.SearchFlags = (uint)SetSearchFlags.NonContentIndexedSearch | (uint)SetSearchFlags.RestartSearch;
RopSetSearchCriteriaResponse setSearchCriteriaResponse = this.Adapter.SetSearchCriteria(setSearchCriteriaRequest, searchFolderHandle, ref this.responseHandles);
Site.Assert.AreEqual<uint>(Constants.SuccessCode, setSearchCriteriaResponse.ReturnValue, "RopSearchCriteria ROP operation performs successfully!");
// Add the debug information
Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCFOLD_R783");
// Verify MS-OXCFOLD requirement: MS-OXCFOLD_R783
Site.CaptureRequirementIfAreEqual<uint>(
Constants.SuccessCode,
setSearchCriteriaResponse.ReturnValue,
783,
@"[In RopSetSearchCriteria ROP Request Buffer] SearchFlags (4 bytes): NON_CONTENT_INDEXED_SEARCH (0x00020000) means that the search does not use a content-indexed search.");
#endregion
#region Step 5. The client calls RopGetSearchCriteria to obtain the search criteria and the status of the search folder [MSOXCFOLDSearchFolder1].
RopGetSearchCriteriaRequest getSearchCriteriaRequest = new RopGetSearchCriteriaRequest
{
RopId = (byte)RopId.RopGetSearchCriteria,
LogonId = Constants.CommonLogonId,
InputHandleIndex = Constants.CommonInputHandleIndex,
UseUnicode = 0x00,
IncludeRestriction = 0x01,
IncludeFolders = 0x01
};
RopGetSearchCriteriaResponse getSearchCriteriaResponse = this.Adapter.GetSearchCriteria(getSearchCriteriaRequest, searchFolderHandle, ref this.responseHandles);
Site.Assert.AreEqual<uint>(Constants.SuccessCode, getSearchCriteriaResponse.ReturnValue, "RopGetSearchCriteria ROP operation performs successfully!");
// Add the debug information
Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCFOLD_R785");
// Verify MS-OXCFOLD requirement: MS-OXCFOLD_R785
Site.CaptureRequirementIfAreEqual<uint>(
(uint)GetSearchFlags.Running,
getSearchCriteriaResponse.SearchFlags & (uint)GetSearchFlags.Running,
785,
@"[In RopGetSearchCriteria ROP Response Buffer] SearchFlags (4 bytes): SEARCH_RUNNING (0x00000001) means that the search is running, which means that the initial population of the search folder still being compiled.");
#endregion
#region Step 6. The client calls RopGetContentsTable to retrieve the contents table for the search folder [MSOXCFOLDSearchFolder1].
RopGetContentsTableRequest getContentsTableRequest = new RopGetContentsTableRequest();
RopGetContentsTableResponse getContentsTableResponse;
getContentsTableRequest.RopId = (byte)RopId.RopGetContentsTable;
getContentsTableRequest.LogonId = Constants.CommonLogonId;
getContentsTableRequest.InputHandleIndex = Constants.CommonInputHandleIndex;
getContentsTableRequest.OutputHandleIndex = Constants.CommonOutputHandleIndex;
getContentsTableRequest.TableFlags = (byte)FolderTableFlags.None;
int count = 0;
do
{
getContentsTableResponse = this.Adapter.GetContentsTable(getContentsTableRequest, searchFolderHandle, ref this.responseHandles);
Site.Assert.AreEqual<uint>(Constants.SuccessCode, getContentsTableResponse.ReturnValue, "RopGetContentsTable ROP operation performs successfully!");
if (getContentsTableResponse.RowCount != 1)
{
Thread.Sleep(this.WaitTime);
}
else
{
break;
}
count++;
}
while (count < this.RetryCount);
#region Verify the requirements: MS-OXCFOLD_R552, MS-OXCFOLD_R526.
Site.Assert.AreEqual<uint>((uint)GetSearchFlags.Running, getSearchCriteriaResponse.SearchFlags & (uint)GetSearchFlags.Running, "The RopSearchCriteria ROP operation has not been complete.");
// Add the debug information
Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCFOLD_R526");
// If the client has received the success code from the server after sending a RopSetSearchCriteria request.
// If the client has received a 'SEARCH_RUNNING' SearchFlags in the RopGetSearchCriteria response after sending a RopGetSearchCriteria response later.
// If the client has got the messages which according to the search criteria and search scope that are specified in the RopSetSearchCriteria ROP request in the RopGetContentsTable response after sending a RopGetContentsTable request later.
// Satisfy the above conditions, then this requirement can be verified directly.
Site.CaptureRequirement(
526,
@"[In Processing a RopSetSearchCriteria ROP Request] The server can return the RopSetSearchCriteria ROP response before the search folder is fully updated.");
// Add the debug information
Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCFOLD_R552");
// Verify MS-OXCFOLD requirement: MS-OXCFOLD_R552
// There should have 1 message macthed the search criteria, so the RowCount should be 1.
Site.CaptureRequirementIfAreEqual<uint>(
1,
getContentsTableResponse.RowCount,
552,
@"[In Processing a RopSetSearchCriteria ROP Request] A dynamic search causes the search folder to be initially populated with all messages that match the search criteria at the point in time when the search is started or restarted.");
#endregion
#endregion
#region Step 7. The client calls RopSetSearchCriteria without setting the SearchFlags to establish search criteria for [MSOXCFOLDSearchFolder1].
setSearchCriteriaRequest.SearchFlags = (uint)SetSearchFlags.None;
setSearchCriteriaResponse = this.Adapter.SetSearchCriteria(setSearchCriteriaRequest, searchFolderHandle, ref this.responseHandles);
Site.Assert.AreEqual<uint>(Constants.SuccessCode, setSearchCriteriaResponse.ReturnValue, "RopSearchCriteria ROP operation performs successfully!");
#endregion
#region Step 8. The client calls RopGetSearchCriteria to obtain the search criteria and the status of the search folder [MSOXCFOLDSearchFolder1].
getSearchCriteriaResponse = this.Adapter.GetSearchCriteria(getSearchCriteriaRequest, searchFolderHandle, ref this.responseHandles);
Site.Assert.AreEqual<uint>(Constants.SuccessCode, getSearchCriteriaResponse.ReturnValue, "RopGetSearchCriteria ROP operation performs successfully!");
#endregion
#region Step 9. The client calls RopGetContentsTable to retrieve the contents table for the search folder [MSOXCFOLDSearchFolder1].
count = 0;
do
{
getContentsTableResponse = this.Adapter.GetContentsTable(getContentsTableRequest, searchFolderHandle, ref this.responseHandles);
Site.Assert.AreEqual<uint>(Constants.SuccessCode, getContentsTableResponse.ReturnValue, "RopGetContentsTable ROP operation performs successfully!");
if (getContentsTableResponse.RowCount != 1)
{
Thread.Sleep(this.WaitTime);
}
else
{
break;
}
count++;
}
while (count < this.RetryCount);
#endregion
#region Step 10. The client creates a non-FAI message under the general folder [MSOXCFOLDSubfolder1].
uint messageNonFAIHandle3 = 0;
ulong messageNonFAIId3 = 0;
this.CreateSaveMessage(subfolderHandle1, subfolderId1, ref messageNonFAIId3, ref messageNonFAIHandle3);
#endregion
#region Step 11. The client calls RopGetContentsTable to retrieve the contents table for the search folder [MSOXCFOLDSearchFolder1].
count = 0;
do
{
getContentsTableResponse = this.Adapter.GetContentsTable(getContentsTableRequest, searchFolderHandle, ref this.responseHandles);
Site.Assert.AreEqual<uint>(Constants.SuccessCode, getContentsTableResponse.ReturnValue, "RopGetContentsTable ROP operation performs successfully!");
if (getContentsTableResponse.RowCount != 2)
{
Thread.Sleep(this.WaitTime);
}
else
{
break;
}
count++;
}
while (count < this.RetryCount);
#region Verify the requirements: MS-OXCFOLD_R1095, MS-OXCFOLD_R1210, MS-OXCFOLD_R1096, and MS-OXCFOLD_R1097.
// Add the debug information
Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCFOLD_R1096");
// Verify MS-OXCFOLD requirement: MS-OXCFOLD_R1096
// There should have 2 messages found so the RowCount should be 2.
Site.CaptureRequirementIfAreEqual<uint>(
2,
getContentsTableResponse.RowCount,
1096,
@"[In Processing a RopSetSearchCriteria ROP Request] For dynamic search folders, the contents of the search folder MUST continue to be updated as messages start to match or cease to match the search criteria. ");
// Add the debug information
Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCFOLD_R1210");
// Verify MS-OXCFOLD requirement: MS-OXCFOLD_R1210
Site.CaptureRequirementIfAreEqual<uint>(
2,
getContentsTableResponse.RowCount,
1210,
@"[In RopSetSearchCriteria ROP Request Buffer] SearchFlags (4 bytes): STATIC_SEARCH (0x00040000) means that the search is dynamic, if not set.");
// Add the debug information
Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCFOLD_R1095");
// Verify MS-OXCFOLD requirement: MS-OXCFOLD_R1095
// There should have 2 messages found so the RowCount should be 2.
Site.CaptureRequirementIfAreEqual<uint>(
2,
getContentsTableResponse.RowCount,
1095,
@"[In Processing a RopSetSearchCriteria ROP Request] For dynamic search folders, the contents of the search folder MUST continue to be updated as messages move around the mailbox. ");
// Add the debug information
Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCFOLD_R1097");
// Verify MS-OXCFOLD requirement: MS-OXCFOLD_R1097
Site.CaptureRequirementIfAreEqual<uint>(
2,
getContentsTableResponse.RowCount,
1097,
@"[In Processing a RopSetSearchCriteria ROP Request] The server continues to update the search folder with messages that enter or exit the search criteria.");
#endregion
#endregion
}