diff --git a/src/applications/base/PhabricatorApplication.php b/src/applications/base/PhabricatorApplication.php index f8e1ff8408..6dbcb37662 100644 --- a/src/applications/base/PhabricatorApplication.php +++ b/src/applications/base/PhabricatorApplication.php @@ -255,47 +255,40 @@ abstract class PhabricatorApplication { } public static function getAllApplications() { - $classes = id(new PhutilSymbolLoader()) - ->setAncestorClass(__CLASS__) - ->setConcreteOnly(true) - ->selectAndLoadSymbols(); - - $apps = array(); - - foreach ($classes as $class) { - $app = newv($class['name'], array()); - $apps[] = $app; - } - - // Reorder the applications into "application order". Notably, this ensures - // their event handlers register in application order. - $apps = msort($apps, 'getApplicationOrder'); - $apps = mgroup($apps, 'getApplicationGroup'); - $apps = array_select_keys($apps, self::getApplicationGroups()) + $apps; - $apps = array_mergev($apps); - - return $apps; - } - - public static function getAllInstalledApplications() { static $applications; - if (empty($applications)) { - $all_applications = self::getAllApplications(); - $apps = array(); - foreach ($all_applications as $app) { - if (!$app->isInstalled()) { - continue; - } + if ($applications === null) { + $apps = id(new PhutilSymbolLoader()) + ->setAncestorClass(__CLASS__) + ->loadObjects(); - $apps[] = $app; - } + // Reorder the applications into "application order". Notably, this + // ensures their event handlers register in application order. + $apps = msort($apps, 'getApplicationOrder'); + $apps = mgroup($apps, 'getApplicationGroup'); + $apps = array_select_keys($apps, self::getApplicationGroups()) + $apps; + $apps = array_mergev($apps); $applications = $apps; } + return $applications; } + public static function getAllInstalledApplications() { + $all_applications = self::getAllApplications(); + $apps = array(); + foreach ($all_applications as $app) { + if (!$app->isInstalled()) { + continue; + } + + $apps[] = $app; + } + + return $apps; + } + } diff --git a/src/infrastructure/__tests__/PhabricatorInfrastructureTestCase.php b/src/infrastructure/__tests__/PhabricatorInfrastructureTestCase.php index 60c4695798..70ba05bb4b 100644 --- a/src/infrastructure/__tests__/PhabricatorInfrastructureTestCase.php +++ b/src/infrastructure/__tests__/PhabricatorInfrastructureTestCase.php @@ -5,14 +5,23 @@ final class PhabricatorInfrastructureTestCase /** * This is more of an acceptance test case instead of a unittest. It verifies - * that all symbols can be loaded correctly. It can catch problem like missing - * methods in descendants of abstract base classes. + * that all symbols can be loaded correctly. It can catch problems like + * missing methods in descendants of abstract base classes. */ public function testEverythingImplemented() { - // Note that we don't have a try catch block around the following because, - // when it fails, it will cause a HPHP or PHP fatal which won't be caught - // by try catch. - $every_class = id(new PhutilSymbolLoader())->selectAndLoadSymbols(); + id(new PhutilSymbolLoader())->selectAndLoadSymbols(); } + + public function testApplicationsInstalled() { + $all = PhabricatorApplication::getAllApplications(); + $installed = PhabricatorApplication::getAllInstalledApplications(); + + $this->assertEqual( + count($all), + count($installed), + 'In test cases, all applications should default to installed.'); + } + + } diff --git a/src/infrastructure/testing/PhabricatorTestCase.php b/src/infrastructure/testing/PhabricatorTestCase.php index 12f18567bc..c2c6d72f08 100644 --- a/src/infrastructure/testing/PhabricatorTestCase.php +++ b/src/infrastructure/testing/PhabricatorTestCase.php @@ -87,6 +87,15 @@ abstract class PhabricatorTestCase extends ArcanistPhutilTestCase { } $this->env = PhabricatorEnv::beginScopedEnv(); + + // NOTE: While running unit tests, we act as though all applications are + // installed, regardless of the install's configuration. Tests which need + // to uninstall applications are responsible for adjusting state themselves + // (such tests are exceedingly rare). + + $this->env->overrideEnvConfig( + 'phabricator.uninstalled-applications', + array()); } protected function didRunTests() {