public void MSOXCROPS_S06_TC04_TestRopsQuery()
        {
            this.CheckTransportIsSupported();

            this.cropsAdapter.RpcConnect(
                Common.GetConfigurationPropertyValue("SutComputerName", this.Site),
                ConnectionType.PrivateMailboxServer,
                Common.GetConfigurationPropertyValue("UserEssdn", this.Site),
                Common.GetConfigurationPropertyValue("Domain", this.Site),
                Common.GetConfigurationPropertyValue("AdminUserName", this.Site),
                Common.GetConfigurationPropertyValue("PassWord", this.Site));

            // Step 1: Send the RopQueryNamedProperties request and verify the success response.
            #region RopQueryNamedProperties success response

            // Log on to the private mailbox.
            RopLogonResponse logonResponse = Logon(LogonType.Mailbox, this.userDN, out inputObjHandle);

            // Call GetCreatedMessageHandle to create message and get the created message handle.
            uint messageHandle = GetCreatedMessageHandle(logonResponse.FolderIds[4], inputObjHandle);

            RopQueryNamedPropertiesRequest queryNamedPropertiesRequest = new RopQueryNamedPropertiesRequest();
            RopQueryNamedPropertiesResponse queryNamedPropertiesResponse;

            queryNamedPropertiesRequest.RopId = (byte)RopId.RopQueryNamedProperties;

            queryNamedPropertiesRequest.LogonId = TestSuiteBase.LogonId;
            queryNamedPropertiesRequest.InputHandleIndex = TestSuiteBase.InputHandleIndex0;
            queryNamedPropertiesRequest.QueryFlags = (byte)QueryFlags.NoStrings;
            queryNamedPropertiesRequest.HasGuid = Convert.ToByte(TestSuiteBase.Zero);
            queryNamedPropertiesRequest.PropertyGuid = null;

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Step 1: Begin to send the RopQueryNamedProperties request.");

            // Send the RopQueryNamedProperties request and verify the success response.
            this.responseSOHs = cropsAdapter.ProcessSingleRop(
                queryNamedPropertiesRequest,
                messageHandle,
                ref this.response,
                ref this.rawData,
                RopResponseType.SuccessResponse);
            queryNamedPropertiesResponse = (RopQueryNamedPropertiesResponse)response;

            Site.Assert.AreEqual<uint>(
                TestSuiteBase.SuccessReturnValue,
                queryNamedPropertiesResponse.ReturnValue,
                "if ROP succeeds, ReturnValue of its response will be 0 (success)");

            #endregion

            // Step 2: Send the RopQueryNamedProperties request and verify the failure response.
            #region RopQueryNamedProperties failure response

            queryNamedPropertiesRequest.InputHandleIndex = TestSuiteBase.InputHandleIndex1;

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Step 2: Begin to send the RopQueryNamedProperties request.");

            // Send the RopQueryNamedProperties request and verify the failure response.
            this.responseSOHs = cropsAdapter.ProcessSingleRop(
                queryNamedPropertiesRequest,
                messageHandle,
                ref this.response,
                ref this.rawData,
                RopResponseType.FailureResponse);
            queryNamedPropertiesResponse = (RopQueryNamedPropertiesResponse)response;

            Site.Assert.AreNotEqual<uint>(
                TestSuiteBase.SuccessReturnValue,
                queryNamedPropertiesResponse.ReturnValue,
                "if ROP failure, ReturnValue of its response will not be 0 (success)");
            Site.Assert.AreNotEqual<uint>(
                MS_OXCROPSAdapter.ReturnValueForRopQueryNamedProperties,
                queryNamedPropertiesResponse.ReturnValue,
                "if ROP failure, ReturnValue of its response will not be 0x00040380 (success)");

            #endregion

            // Step 3: Send the RopGetPropertyIdsFromNames request and verify the success response.
            #region RopGetPropertyIdsFromNames success response

            RopGetPropertyIdsFromNamesRequest getPropertyIdsFromNamesRequest;
            RopGetPropertyIdsFromNamesResponse getPropertyIdsFromNamesResponse;

            getPropertyIdsFromNamesRequest.RopId = (byte)RopId.RopGetPropertyIdsFromNames;
            getPropertyIdsFromNamesRequest.LogonId = TestSuiteBase.LogonId;
            getPropertyIdsFromNamesRequest.InputHandleIndex = TestSuiteBase.InputHandleIndex0;
            getPropertyIdsFromNamesRequest.Flags = (byte)GetPropertyIdsFromNamesFlags.Create;

            // Call CreatePropertyNameArray method to create propertyName array.
            PropertyName[] propertyNameArray = this.CreatePropertyNameArray(3);

            getPropertyIdsFromNamesRequest.PropertyNameCount = (ushort)propertyNameArray.Length;
            getPropertyIdsFromNamesRequest.PropertyNames = propertyNameArray;

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Step 3: Begin to send the RopQueryNamedProperties request.");

            // Send the RopGetPropertyIdsFromNames request and verify the success response.
            this.responseSOHs = cropsAdapter.ProcessSingleRop(
                getPropertyIdsFromNamesRequest,
                this.inputObjHandle,
                ref this.response,
                ref this.rawData,
                RopResponseType.SuccessResponse);
            getPropertyIdsFromNamesResponse = (RopGetPropertyIdsFromNamesResponse)response;

            Site.Assert.AreEqual<uint>(
                TestSuiteBase.SuccessReturnValue,
                getPropertyIdsFromNamesResponse.ReturnValue,
                "If RopGetPropertyIdsFromNames succeeds, its response contains ReturnValue 0 (success)");

            #endregion

            // Step 4: Send the RopGetPropertyIdsFromNames request and verify the failure response.
            #region RopGetPropertyIdsFromNames failure response

            getPropertyIdsFromNamesRequest.InputHandleIndex = TestSuiteBase.InputHandleIndex1;

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Step 4: Begin to send the RopGetPropertyIdsFromNames request.");

            this.responseSOHs = cropsAdapter.ProcessSingleRop(
                getPropertyIdsFromNamesRequest,
                this.inputObjHandle,
                ref this.response,
                ref this.rawData,
                RopResponseType.FailureResponse);

            #endregion

            // Step 5: Send the RopGetNamesFromPropertyIds request and verify the success response.
            #region RopGetNamesFromPropertyIds success response

            RopGetNamesFromPropertyIdsRequest getNamesFromPropertyIdsRequest;
            RopGetNamesFromPropertyIdsResponse getNamesFromPropertyIdsResponse;

            getNamesFromPropertyIdsRequest.RopId = (byte)RopId.RopGetNamesFromPropertyIds;
            getNamesFromPropertyIdsRequest.LogonId = TestSuiteBase.LogonId;
            getNamesFromPropertyIdsRequest.InputHandleIndex = TestSuiteBase.InputHandleIndex0;
            getNamesFromPropertyIdsRequest.PropertyIdCount = getPropertyIdsFromNamesResponse.PropertyIdCount;
            getNamesFromPropertyIdsRequest.PropertyIds = getPropertyIdsFromNamesResponse.PropertyIds;

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Step 5: Begin to send the RopGetNamesFromPropertyIds request.");

            // Send the RopGetNamesFromPropertyIds request and verify the success response.
            this.responseSOHs = cropsAdapter.ProcessSingleRop(
                getNamesFromPropertyIdsRequest,
                this.inputObjHandle,
                ref this.response,
                ref this.rawData,
                RopResponseType.SuccessResponse);
            getNamesFromPropertyIdsResponse = (RopGetNamesFromPropertyIdsResponse)response;

            #endregion

            // Step 6: Send the RopGetNamesFromPropertyIds request and verify the failure response.
            #region RopGetNamesFromPropertyIds failure response

            // Refer to MS-OXCROPS endnote<14>: For some ROPs, Exchange 2003 and Exchange 2007 use different methods to resolve the
            // server object and, therefore, do not fail the ROP if the index is invalid.
            if (Common.IsRequirementEnabled(4713, this.Site))
            {
                getNamesFromPropertyIdsRequest.InputHandleIndex = TestSuiteBase.InputHandleIndex1;
                PropertyId propertyId = new PropertyId
                {
                    ID = TestSuiteBase.PropertyId
                };
                getNamesFromPropertyIdsRequest.PropertyIdCount = TestSuiteBase.PropertyIdCount;
                getNamesFromPropertyIdsRequest.PropertyIds = new PropertyId[1] { propertyId };

                // Add the debug information
                Site.Log.Add(LogEntryKind.Debug, "Step 6: Begin to send the RopGetNamesFromPropertyIds request.");

                // Send the RopGetNamesFromPropertyIds request and verify the failure response.
                this.responseSOHs = cropsAdapter.ProcessSingleRop(
                    getNamesFromPropertyIdsRequest,
                    this.inputObjHandle,
                    ref this.response,
                    ref this.rawData,
                    RopResponseType.FailureResponse);
                getNamesFromPropertyIdsResponse = (RopGetNamesFromPropertyIdsResponse)response;

                Site.Assert.AreEqual<uint>(
                    TestSuiteBase.SuccessReturnValue,
                    getNamesFromPropertyIdsResponse.ReturnValue,
                    "<14> Section 3.2.5.1: For some ROPs, Exchange 2003 and Exchange 2007 use different methods to resolve the Server object and, therefore, do not fail the ROP if the index is invalid.");
            }
            else
            {
                // Verify the response on server other than Exchange 2007.
                getNamesFromPropertyIdsRequest.InputHandleIndex = TestSuiteBase.InputHandleIndex1;
                PropertyId propertyId = new PropertyId
                {
                    ID = TestSuiteBase.PropertyId
                };
                getNamesFromPropertyIdsRequest.PropertyIdCount = TestSuiteBase.PropertyIdCount;
                getNamesFromPropertyIdsRequest.PropertyIds = new PropertyId[1] { propertyId };

                // Add the debug information
                Site.Log.Add(LogEntryKind.Debug, "Step 6: Begin to send the RopGetNamesFromPropertyIds request.");

                // Send the RopGetNamesFromPropertyIds request and verify the failure response.
                this.responseSOHs = cropsAdapter.ProcessSingleRop(
                    getNamesFromPropertyIdsRequest,
                    this.inputObjHandle,
                    ref this.response,
                    ref this.rawData,
                    RopResponseType.FailureResponse);
                getNamesFromPropertyIdsResponse = (RopGetNamesFromPropertyIdsResponse)response;

                Site.Assert.AreNotEqual<uint>(
                    TestSuiteBase.SuccessReturnValue,
                    getNamesFromPropertyIdsResponse.ReturnValue,
                    "For this response, this field SHOULD be set to a value other than 0x00000000.");
            }

            #endregion
        }