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

            UnityPackageManagerClient.ListInstalledPackages((result) => {
                // Unity 2017.x doesn't install any default packages.
                if (ExecutionEnvironment.VersionMajorMinor >= 2018.0)
                {
                    // Make sure a subset of the default packages installed in all a newly created
                    // Unity project are present in the returned list.
                    CheckPackageNamesInPackageInfos(
                        new List <string>()
                    {
                        "com.unity.modules.audio",
                        "com.unity.modules.physics"
                    },
                        result.Packages, testCaseResult, "Found 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 TestMigration(
            IntegrationTester.TestCase testCase,
            Action <IntegrationTester.TestCaseResult> testCaseComplete)
        {
#if EDM_WITH_MIGRATION_NOT_AVAILABLE_ON_UPM
            testCaseComplete(new IntegrationTester.TestCaseResult(testCase)
            {
                Skipped = true
            });
            return;
#endif
            var testCaseResult = new IntegrationTester.TestCaseResult(testCase);
            PackageMigrator.TryMigration((error) => {
                if (CompleteIfNotAvailable(error, testCaseResult, testCaseComplete))
                {
                    return;
                }
                if (!String.IsNullOrEmpty(error))
                {
                    testCaseResult.ErrorMessages.Add(String.Format(
                                                         "Migration failed with error {0}", error));
                }

                // Make sure only expected version handler packages are still installed.
                var expectedVersionHandlerPackages = new HashSet <string>()
                {
                    "Firebase Realtime Database"
                };
                var manifestsByPackageName = new HashSet <string>(
                    VersionHandlerImpl.ManifestReferences.
                    FindAndReadManifestsInAssetsFolderByPackageName().Keys);
                manifestsByPackageName.ExceptWith(expectedVersionHandlerPackages);
                if (manifestsByPackageName.Count > 0)
                {
                    testCaseResult.ErrorMessages.Add(String.Format(
                                                         "Unexpected version handler packages found in the project:\n{0}",
                                                         (new List <string>(manifestsByPackageName)).ToArray()));
                }

                // Make sure the expected UPM packages are installed.
                UnityPackageManagerClient.ListInstalledPackages((listResult) => {
                    var installedPackageNames = new HashSet <string>();
                    foreach (var pkg in listResult.Packages)
                    {
                        installedPackageNames.Add(pkg.Name);
                    }

                    // Make sure expected UPM packages are installed.
                    var expectedPackageNames = new List <string>()
                    {
                        "com.google.external-dependency-manager",
                        "com.google.firebase.auth"
                    };
                    if (installedPackageNames.IsSupersetOf(expectedPackageNames))
                    {
                        testCaseResult.ErrorMessages.Add(String.Format(
                                                             "Expected packages [{0}] not installed",
                                                             String.Join(", ", expectedPackageNames.ToArray())));
                    }

                    testCaseComplete(testCaseResult);
                });
            });
        }