public void MSOXNSPI_S05_TC12_ModLinkAttFailedWithInvalidParameter()
{
this.CheckProductSupported();
this.CheckMAPIHTTPTransportSupported();
#region Call NspiBind to initiate a session between the client and the server.
uint flags = 0;
STAT stat = new STAT();
stat.InitiateStat();
FlatUID_r guid = new FlatUID_r
{
Ab = new byte[16]
};
FlatUID_r? serverGuid = guid;
this.Result = this.ProtocolAdatper.NspiBind(flags, stat, ref serverGuid);
Site.Assert.AreEqual<ErrorCodeValue>(ErrorCodeValue.Success, this.Result, "NspiBind should return Success!");
#endregion
#region Call NspiGetMatches to get an Explicit Table.
uint reserved1 = 0;
uint reserver2 = 0;
PropertyTagArray_r? proReserved = null;
uint requested = Constants.GetMatchesRequestedRowNumber;
// Create Restriction_r structure to use the display name of specific user as the filter parameter of NspiGetMatches method.
Restriction_r propertyRestriction = new Restriction_r
{
Rt = 0x04,
Res = new RestrictionUnion_r
{
ResProperty = new Propertyrestriction_r
{
Relop = 0x04
}
}
};
PropertyValue_r target = new PropertyValue_r
{
PropTag = (uint)AulProp.PidTagDisplayName,
Reserved = 0
};
string userName = Common.GetConfigurationPropertyValue("User2Name", this.Site);
if (this.Transport == "ncacn_http" || this.Transport == "ncacn_ip_tcp")
{
target.Value.LpszA = System.Text.Encoding.UTF8.GetBytes(userName);
}
else
{
target.Value.LpszA = System.Text.Encoding.UTF8.GetBytes(userName + "\0");
}
propertyRestriction.Res.ResProperty.Prop = new PropertyValue_r[] { target };
propertyRestriction.Res.ResProperty.PropTag = (uint)AulProp.PidTagDisplayName;
Restriction_r? filter = propertyRestriction;
PropertyName_r? propNameOfGetMatches = null;
PropertyTagArray_r propTags = new PropertyTagArray_r
{
CValues = 3,
AulPropTag = new uint[3]
{
(uint)AulProp.PidTagEntryId,
(uint)AulProp.PidTagDisplayName,
unchecked((uint)AulProp.PidTagAddressBookPublicDelegates),
}
};
PropertyTagArray_r? propTagsOfGetMatches = propTags;
// Output parameters.
PropertyTagArray_r? outMIds;
PropertyRowSet_r? rowsOfGetMatches;
this.Result = this.ProtocolAdatper.NspiGetMatches(reserved1, ref stat, proReserved, reserver2, filter, propNameOfGetMatches, requested, out outMIds, propTagsOfGetMatches, out rowsOfGetMatches);
Site.Assert.AreEqual<ErrorCodeValue>(ErrorCodeValue.Success, this.Result, "NspiGetMatches should return Success!");
#endregion
#region Call NspiModLinkAtt with an invalid input parameter dwMId, so that the server cannot locate the object specified by the invalid dwMId.
uint flagsOfModLinkAtt = 0; // A value which does not contain fDelete flag (0x1).
BinaryArray_r entryId = new BinaryArray_r
{
CValues = 1,
Lpbin = new Binary_r[1]
};
// Get user name.
for (int i = 0; i < rowsOfGetMatches.Value.CRows; i++)
{
string name = System.Text.Encoding.Default.GetString(rowsOfGetMatches.Value.ARow[i].LpProps[1].Value.LpszA);
// Server will ignore cases when comparing string according to section 2.2.6 in Open Specification MS-OXNSPI.
if (name.ToLower(System.Globalization.CultureInfo.CurrentCulture).Equals(userName.ToLower(System.Globalization.CultureInfo.CurrentCulture)))
{
entryId.Lpbin[0] = rowsOfGetMatches.Value.ARow[i].LpProps[0].Value.Bin;
break;
}
}
// Modify PidTagAddressBookMember.
uint propTagOfModLinkAtt = (uint)AulProp.PidTagAddressBookMember;
// Set MID to an invalid value.
uint midOfModLinkAtt = uint.Parse(Constants.UnrecognizedMID);
this.Result = this.ProtocolAdatper.NspiModLinkAtt(flagsOfModLinkAtt, propTagOfModLinkAtt, midOfModLinkAtt, entryId);
#region Capture code
// Add the debug information
Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXNSPI_R1328");
// Verify MS-OXNSPI requirement: MS-OXNSPI_R1328
Site.CaptureRequirementIfAreEqual<ErrorCodeValue>(
ErrorCodeValue.InvalidParameter,
this.Result,
1328,
@"[In NspiModLinkAtt] [Server Processing Rules: Upon receiving message NspiModLinkAtt, the server MUST process the data from the message subject to the following constraints:] [Constraint 4] If the server is unable to locate the object specified by the input parameter dwMId, the server MUST return the value ""InvalidParameter"" (0x80070057).");
#endregion
#endregion
#region Call NspiGetMatches again to see if any property is modified.
PropertyRowSet_r? rowsOfGetMatches1;
this.Result = this.ProtocolAdatper.NspiGetMatches(reserved1, ref stat, proReserved, reserver2, filter, propNameOfGetMatches, requested, out outMIds, propTagsOfGetMatches, out rowsOfGetMatches1);
Site.Assert.AreEqual<ErrorCodeValue>(ErrorCodeValue.Success, this.Result, "NspiGetMatches should return Success!");
#region Capture code
if (Common.IsRequirementEnabled(2003010, this.Site))
{
// Add the debug information
Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXNSPI_R2003010");
// Verify MS-OXNSPI requirement: MS-OXNSPI_R2003010
Site.CaptureRequirementIfIsTrue(
AdapterHelper.AreTwoPropertyRowSetEqual(rowsOfGetMatches, rowsOfGetMatches1),
2003010,
@"[In Appendix A: Product Behavior] Implementation does not modify any properties of any objects in the address book. (Microsoft Exchange Server 2010 Service Pack 3 (SP3) follows this behavior).");
}
#endregion
#endregion
#region Call NspiUnbind to destroy the session between the client and the server.
uint returnValue = this.ProtocolAdatper.NspiUnbind(0);
Site.Assert.AreEqual<uint>(1, returnValue, "NspiUnbind method should return 1 (Success).");
#endregion
}