/// <summary>
        /// A method used to generate a valid SPProviderSearchArguments of IClaimProviderWebService_Search_InputMessage.
        /// </summary>
        /// <returns>A return value represents the valid SPProviderSearchArguments. Return "null" if there is no valid search argument.</returns>
        public SPProviderSearchArguments GenerateProviderSearchArgumentsInput_Valid()
        {
            // Call the helper method to get all claims providers.
            SPProviderHierarchyTree[] allProviders = TestSuiteBase.GetAllProviders();

            SPProviderSearchArguments providerSearchArgumentsInput = null;

            foreach (SPProviderHierarchyTree provider in allProviders)
            {
                // Find the first provider tree with at least a child.
                if (provider.Children.Length != 0)
                {
                    providerSearchArgumentsInput = new SPProviderSearchArguments();

                    // Set the search condition by the first child of this tree.
                    providerSearchArgumentsInput.HierarchyNodeID = provider.Children[0].HierarchyNodeID;
                    providerSearchArgumentsInput.ProviderName    = provider.Children[0].ProviderName;
                    providerSearchArgumentsInput.MaxCount        = Convert.ToInt32(Common.GetConfigurationPropertyValue("MaxCount", this.Site));
                    TestSuiteBase.SearchPattern = provider.Children[0].Nm;

                    break;
                }
            }

            return(providerSearchArgumentsInput);
        }
        public void MSCPSWS_S05_TC02_Search_nullSearchPattern()
        {
            // Set principal type for Search.
            SPPrincipalType principalType = SPPrincipalType.SharePointGroup;

            // Set ArrayOfSPProviderSearchArguments for Search.
            List <SPProviderSearchArguments> arrayOfSPProviderSearchArguments = new List <SPProviderSearchArguments>();

            Site.Assume.IsNotNull(this.GenerateProviderSearchArgumentsInput_Valid(), "There should be a valid provider search arguments!");
            SPProviderSearchArguments providerSearchArguments = this.GenerateProviderSearchArgumentsInput_Valid();

            arrayOfSPProviderSearchArguments.Add(providerSearchArguments);

            bool caughtException = false;

            try
            {
                // Call the Search operation with searchPattern as null.
                CPSWSAdapter.Search(arrayOfSPProviderSearchArguments.ToArray(), principalType, null);
            }
            catch (System.ServiceModel.FaultException faultException)
            {
                caughtException = true;

                // Verify Requirement 652, if the server returns an ArgumentNullException<"searchPattern"> message.
                Site.CaptureRequirementIfIsTrue(this.VerifyArgumentNullException(faultException, "searchPattern"), 652, @"[In Search] If this [searchPattern] is NULL, the protocol server MUST return an ArgumentNullException<""searchPattern""> message.");
            }
            finally
            {
                this.Site.Assert.IsTrue(caughtException, "If searchPattern is NULL, the protocol server should return an ArgumentNullException<searchPattern> message.");
            }
        }
        /// <summary>
        /// A method used to generate a valid SPProviderSearchArguments of IClaimProviderWebService_Search_InputMessage.
        /// </summary>
        /// <returns>A return value represents the valid SPProviderSearchArguments. Return "null" if there is no valid search argument.</returns>
        public SPProviderSearchArguments GenerateProviderSearchArgumentsInput_Valid()
        {
            // Call the helper method to get all claims providers.
            SPProviderHierarchyTree[] allProviders = TestSuiteBase.GetAllProviders();

            SPProviderSearchArguments providerSearchArgumentsInput = null;

            foreach (SPProviderHierarchyTree provider in allProviders)
            {
                // Find the first provider tree with at least a child.
                if (provider.Children.Length != 0)
                {
                    providerSearchArgumentsInput = new SPProviderSearchArguments();

                    // Set the search condition by the first child of this tree.
                    providerSearchArgumentsInput.HierarchyNodeID = provider.Children[0].HierarchyNodeID;
                    providerSearchArgumentsInput.ProviderName = provider.Children[0].ProviderName;
                    providerSearchArgumentsInput.MaxCount = Convert.ToInt32(Common.GetConfigurationPropertyValue("MaxCount", this.Site)); 
                    TestSuiteBase.SearchPattern = provider.Children[0].Nm;

                    break;
                }
            }

            return providerSearchArgumentsInput;
        }
        public void MSCPSWS_S05_TC01_Search()
        {
            // Set principal type for search.
            SPPrincipalType principalType = SPPrincipalType.SecurityGroup;

            // Generate ArrayOfSPProviderSearchArguments.
            List <SPProviderSearchArguments> arrayOfSPProviderSearchArguments = new List <SPProviderSearchArguments>();

            Site.Assume.IsNotNull(this.GenerateProviderSearchArgumentsInput_Valid(), "There should be a valid provider search arguments!");
            SPProviderSearchArguments providerSearchArguments = this.GenerateProviderSearchArgumentsInput_Valid();

            arrayOfSPProviderSearchArguments.Add(providerSearchArguments);

            Site.Assume.IsNotNull(TestSuiteBase.SearchPattern, "The search pattern should not be null!");

            // Call Search operation.
            SPProviderHierarchyTree[] responseOfSearchResult = CPSWSAdapter.Search(arrayOfSPProviderSearchArguments.ToArray(), principalType, TestSuiteBase.SearchPattern);

            Site.Assert.IsNotNull(responseOfSearchResult, "The search result MUST be not null.");
            Site.Assert.IsTrue(responseOfSearchResult.Length >= 1, "The search result MUST contain at least one claims provider.");

            // Get the input provider names list.
            ArrayOfString providerNames = new ArrayOfString();

            providerNames.AddRange(arrayOfSPProviderSearchArguments.Select(root => root.ProviderName));

            // Requirement capture condition.
            bool searchSuccess = false;

            foreach (SPProviderHierarchyTree providerTree in responseOfSearchResult)
            {
                if (providerTree.ProviderName.StartsWith(Common.GetConfigurationPropertyValue("HierarchyProviderPrefix", this.Site)))
                {
                    if (providerNames.Contains(providerTree.ProviderName))
                    {
                        searchSuccess = true;
                    }
                    else
                    {
                        // Jump over the Hierarchy Provider tree that the server sees fit to return together with the result Claims provider trees.
                        continue;
                    }
                }
                else if (providerNames.Contains(providerTree.ProviderName))
                {
                    searchSuccess = true;
                }
                else
                {
                    Site.Assert.Fail("The provider names in the search result should be contained in the provider names in the input message!");
                }
            }

            // Capture requirement 378 by matching the input provider name with the result claims provider name,
            // The search input claims provider already satisfy the condition 1 and 3 in requirement 378 in test environment configuration.
            Site.CaptureRequirementIfIsTrue(
                searchSuccess,
                378,
                @"[In Search] The protocol server MUST search across all claims providers that meet all the following criteria:
                The claims providers are associated with the Web application (1) specified in the input message.
                The claims providers are listed in the provider search arguments in the input message.
                The claims providers support search.");

            // Capture requirement 398 by matching searchPattern with the result claims provider's Nm attribute.
            Site.CaptureRequirementIfIsTrue(searchSuccess, 398, @"[In Search] searchPattern: The protocol server MUST search for the string in each claims provider.");

            // Capture requirement 404 by matching searchPattern with the result claims provider's Nm attribute.
            Site.CaptureRequirementIfIsTrue(searchSuccess, 404, @"[In SearchResponse] The protocol server MUST return one claims provider hierarchy tree for each claims provider that contains entities that match the search string.");
        }
        /// <summary>
        /// A method used to perform a search for entities on a list of claims providers.
        /// </summary>
        /// <param name="providerSearchArguments">A parameter represents the search arguments.</param>
        /// <param name="principalType">A parameter represents which type of picker entities to be included in the output claims provider hierarchy tree.</param>
        /// <param name="searchPattern">A parameter represents the search string.</param>
        /// <returns>A return value represents a list of claims provider hierarchy trees.</returns>
        public SPProviderHierarchyTree[] Search(SPProviderSearchArguments[] providerSearchArguments, SPPrincipalType principalType, string searchPattern)
        {
            SPProviderHierarchyTree[] responseOfSearch = new SPProviderHierarchyTree[0];
            try
            {
                responseOfSearch = this.cpswsClient.Search(providerSearchArguments, principalType, searchPattern);
                this.CaptureTransportRelatedRequirements();
            }
            catch (FaultException faultEX)
            {
                this.Site.Log.Add(
                                LogEntryKind.Debug,
                                @"There is an exception generated when calling [Search] method:\r\n{0}",
                                faultEX.Message);
                this.CaptureTransportRelatedRequirements();
                this.ValidateAndCaptureSOAPFaultRequirement(faultEX);
                throw;
            }

            this.VerifySearch(responseOfSearch);

            return responseOfSearch;
        }