public void MSOXCMAPIHTTP_S02_TC13_SeekEntriesRequestType()
{
this.CheckMapiHttpIsSupported();
#region Call Bind request type to established a session context with the address book server.
this.Bind();
#endregion
#region Call QueryRows request type with propTags set to null.
STAT stat = new STAT();
stat.InitiateStat();
LargePropertyTagArray columns = new LargePropertyTagArray();
QueryRowsRequestBody queryRowsRequestBody = this.BuildQueryRowsRequestBody(true, stat, 0, null, ConstValues.QueryRowsRequestedRowNumber, false, columns);
QueryRowsResponseBody queryRowsResponseBody = this.Adapter.QueryRows(queryRowsRequestBody);
Site.Assert.AreEqual<uint>((uint)0, queryRowsResponseBody.ErrorCode, "QueryRows operation should succeed and 0 is expected to be returned. The return value is {0}.", queryRowsResponseBody.ErrorCode);
uint[] outMids = new uint[queryRowsResponseBody.RowCount.Value];
for (int i = 0; i < queryRowsResponseBody.RowCount; i++)
{
outMids[i] = BitConverter.ToUInt32(queryRowsResponseBody.RowData[i].ValueArray[0].Value, 0);
}
stat = queryRowsResponseBody.State.Value;
#endregion
#region Call UpdateStat request type to update the STAT block that represents the position in a table to reflect positioning changes requested by the client.
stat.Delta = 1;
byte[] auxIn = new byte[] { };
UpdateStatRequestBody updateStatRequestBody = this.BuildUpdateStatRequestBody(true, stat, true);
UpdateStatResponseBody updateStatResponseBody = this.Adapter.UpdateStat(updateStatRequestBody);
Site.Assert.AreEqual<uint>(0, updateStatResponseBody.ErrorCode, "UpdateStat should succeed and 0 is expected to be returned. The returned value is {0}.", updateStatResponseBody.ErrorCode);
#endregion
#region Call SeekEntries request type which contains fields State, Trage and Columns.
PropertyTag pidTagDisplayNameTag = new PropertyTag((ushort)PropertyID.PidTagDisplayName, (ushort)PropertyTypeValues.PtypString);
string displayName = Common.GetConfigurationPropertyValue("GeneralUserName", this.Site) + "\0";
PropertyValue_r target = new PropertyValue_r()
{
PropTag = pidTagDisplayNameTag,
Reserved = 0,
Value = System.Text.Encoding.Unicode.GetBytes(displayName)
};
columns = new LargePropertyTagArray()
{
PropertyTagCount = 1,
PropertyTags = new PropertyTag[1]
{
target.PropTag
}
};
SeekEntriesRequestBody seekEntriesRequestBody = this.BuildSeekEntriesRequestBody(true, updateStatResponseBody.State.Value, true, target, true, (uint)outMids.Length, outMids, true, columns);
SeekEntriesResponseBody seekEntriesResponseBody = this.Adapter.SeekEntries(seekEntriesRequestBody);
Site.Assert.AreEqual<uint>(0, seekEntriesResponseBody.ErrorCode, "SeekEntries should succeed and 0 is expected to be returned. The returned value is {0}.", seekEntriesResponseBody.ErrorCode);
#endregion
#region Call QueryRows request type using a new list of minimal entry ids as input parameter according to the parameters of SeekEntries request type response.
uint[] newTable = new uint[outMids.Length - (int)seekEntriesResponseBody.State.Value.NumPos];
Array.Copy(outMids, (int)seekEntriesResponseBody.State.Value.NumPos, newTable, 0, newTable.Length);
queryRowsRequestBody = this.BuildQueryRowsRequestBody(true, stat, (uint)newTable.Length, newTable, ConstValues.QueryRowsRequestedRowNumber, true, columns);
queryRowsRequestBody.Flags = (uint)RetrievePropertyFlags.fEphID;
queryRowsResponseBody = this.Adapter.QueryRows(queryRowsRequestBody);
Site.Assert.AreEqual<uint>((uint)0, queryRowsResponseBody.StatusCode, "QueryRows operation should succeed and 0 is expected to be returned. The return value is {0}.", queryRowsResponseBody.StatusCode);
if (seekEntriesResponseBody.HasColumnsAndRows == false)
{
seekEntriesResponseBody = this.Adapter.SeekEntries(seekEntriesRequestBody);
Site.Assert.AreEqual<uint>(0, seekEntriesResponseBody.ErrorCode, "SeekEntries should succeed and 0 is expected to be returned. The returned value is {0}.", seekEntriesResponseBody.ErrorCode);
}
// Add the debug information
this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCMAPIHTTP_R1013");
// If the RowData is not Null, then client retrieves information about rows in an Explicit Table by the SeekEntries request type.
// So R1013 will be verified.
this.Site.CaptureRequirementIfIsTrue(
seekEntriesResponseBody.ErrorCode == 0x00000000 && seekEntriesResponseBody.RowData != null,
1013,
@"[In SeekEntries Request Type] Optionally, the SeekEntries request type can also be used to retrieve information about rows in an Explicit Table.");
bool isTheValueGreaterThanOrEqualTo = false;
for (int i = 0; i < seekEntriesResponseBody.RowData.Length; i++)
{
// Check whether the returned property value is greater than or equal to the input property PidTagDisplayName.
string dispalyNameReturnedFromServer = System.Text.Encoding.UTF8.GetString(seekEntriesResponseBody.RowData[i].ValueArray[0].Value);
// Value Condition greater than zero indicates the returned property value follows the input PidTagDisplayName property value.
int result = dispalyNameReturnedFromServer.CompareTo(displayName);
if (result < 0)
{
this.Site.Log.Add(LogEntryKind.Debug, "The display name returned from server is {0}, the expected display name is {1}", dispalyNameReturnedFromServer.Replace("\0", string.Empty), displayName.Replace("\0", string.Empty));
isTheValueGreaterThanOrEqualTo = false;
break;
}
else
{
isTheValueGreaterThanOrEqualTo = true;
}
}
// Add the debug information
this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCMAPIHTTP_R1012");
this.Site.CaptureRequirementIfIsTrue(
isTheValueGreaterThanOrEqualTo,
1012,
@"[In SeekEntries Request Type] The SeekEntries request type is used by the client to search for and set the logical position in a specific table to the first entry greater than or equal to a specified value.");
bool isLargePropertyTagArrayEqual = AdapterHelper.AreTwoLargePropertyTagArrayEqual(seekEntriesRequestBody.Columns, seekEntriesResponseBody.Columns.Value);
// Add the debug information
this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCMAPIHTTP_R1047");
this.Site.CaptureRequirementIfIsTrue(
isLargePropertyTagArrayEqual,
1047,
@"[In SeekEntries Request Type Success Response Body] Columns (optional) (variable): A LargePropTagArray structure (section 2.2.1.3) that specifies the columns used for the rows returned.");
// Add the debug information
this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCMAPIHTTP_R1053");
// Verify MS-OXCMAPIHTTP requirement: MS-OXCMAPIHTTP_R1053
this.Site.CaptureRequirementIfIsInstanceOfType(
seekEntriesResponseBody.RowData,
typeof(AddressBookPropertyRow[]),
1053,
@"[In SeekEntries Request Type Success Response Body] RowData (optional) (variable): An array of AddressBookPropertyRow structures (section 2.2.1.2), each of which specifies the row data for the entries queried.");
#endregion
#region Call SeekEntries request type without State field.
seekEntriesRequestBody = this.BuildSeekEntriesRequestBody(false, stat, true, target, false, 0, null, true, columns);
seekEntriesResponseBody = this.Adapter.SeekEntries(seekEntriesRequestBody);
Site.Assert.AreEqual<uint>(0, seekEntriesResponseBody.StatusCode, "SeekEntries should succeed and 0 is expected to be returned. The returned value is {0}.", seekEntriesResponseBody.StatusCode);
#endregion
#region Call the Unbind request type to destroy the session context.
this.Unbind();
#endregion
}