public static void TestSearchAvailablePackagesAll(
            IntegrationTester.TestCase testCase,
            Action <IntegrationTester.TestCaseResult> testCaseComplete)
        {
            var testCaseResult = new IntegrationTester.TestCaseResult(testCase);

            UnityPackageManagerClient.SearchAvailablePackages(
                (result) => {
                // Make sure common optional Unity packages are returned in the search result.
                if (UpmSearchAllAvailable)
                {
                    CheckPackageNamesInPackageInfos(
                        new List <string>()
                    {
                        "com.unity.2d.animation",
                        "com.unity.entities"
                    },
                        result.Packages, testCaseResult,
                        "SearchAvailablePackages returned an unexpected set of packages");
                }

                var message = String.Format(
                    "Error: '{0}', PackageInfos:\n{1}\n", result.Error,
                    String.Join("\n", PackageInfoListToStringList(result.Packages).ToArray()));
                if (!String.IsNullOrEmpty(result.Error.ToString()))
                {
                    testCaseResult.ErrorMessages.Add(message);
                }
                else
                {
                    UnityEngine.Debug.Log(message);
                }
                testCaseComplete(testCaseResult);
            });
        }
        public static void TestSearchAvailablePackages(
            IntegrationTester.TestCase testCase,
            Action <IntegrationTester.TestCaseResult> testCaseComplete)
        {
            var testCaseResult = new IntegrationTester.TestCaseResult(testCase);
            var progressLines  = new List <string>();

            UnityPackageManagerClient.SearchAvailablePackages(
                new [] {
                "com.unity.ads",
                "[email protected]"
            },
                (result) => {
                var expectedPackageNameByQuery = UpmAvailable ?
                                                 new Dictionary <string, string>()
                {
                    { "com.unity.ads", "com.unity.ads" },
                    { "[email protected]", "com.unity.analytics" },
                } : new Dictionary <string, string>();

                // Make sure all expected queries were performed.
                var queriesPerformed = new HashSet <string>(result.Keys);
                if (!queriesPerformed.SetEquals(expectedPackageNameByQuery.Keys))
                {
                    testCaseResult.ErrorMessages.Add(
                        String.Format(
                            "Search returned a subset of queries [{0}] vs. expected [{1}]",
                            String.Join(", ", (new List <string>(queriesPerformed)).ToArray()),
                            String.Join(", ", (new List <string>(
                                                   expectedPackageNameByQuery.Keys)).ToArray())));
                }

                var packageResults = new List <string>();
                foreach (var kv in result)
                {
                    var searchQuery  = kv.Key;
                    var searchResult = kv.Value;
                    packageResults.Add(String.Format(
                                           "{0}, Error: '{1}':\n{2}\n", searchQuery, searchResult.Error,
                                           String.Join("\n",
                                                       PackageInfoListToStringList(searchResult.Packages).ToArray())));

                    if (!String.IsNullOrEmpty(searchResult.Error.ToString()))
                    {
                        testCaseResult.ErrorMessages.Add(
                            String.Format("Failed when searching for '{0}', Error '{1}'",
                                          searchQuery, searchResult.Error.ToString()));
                    }

                    // Make sure returned packages match the search pattern.
                    string expectedPackageName;
                    if (expectedPackageNameByQuery.TryGetValue(searchQuery,
                                                               out expectedPackageName))
                    {
                        CheckPackageNamesInPackageInfos(
                            new List <string>()
                        {
                            expectedPackageName
                        }, searchResult.Packages,
                            testCaseResult,
                            String.Format("Returned an unexpected list of for search query '{0}'",
                                          searchQuery));
                    }
                    else
                    {
                        testCaseResult.ErrorMessages.Add(
                            String.Format("Unexpected search result returned '{0}'", searchQuery));
                    }
                }

                // Make sure progress was reported.
                if (progressLines.Count == 0)
                {
                    testCaseResult.ErrorMessages.Add("No progress reported");
                }

                var message = String.Format(String.Join("\n", packageResults.ToArray()));
                if (testCaseResult.ErrorMessages.Count == 0)
                {
                    UnityEngine.Debug.Log(message);
                }
                else
                {
                    testCaseResult.ErrorMessages.Add(message);
                }
                testCaseComplete(testCaseResult);
            },
                progress: (value, item) => {
                progressLines.Add(String.Format("Progress: {0}: {1}", value, item));
            });
        }