diff --git a/package_manager/src/Validator/XdebugValidator.php b/package_manager/src/Validator/XdebugValidator.php index d9983474b10662caf0dea22b6d9d15aa8dbc1ee6..32017c25be317efc73ef9b43f9c7a067fc909f73 100644 --- a/package_manager/src/Validator/XdebugValidator.php +++ b/package_manager/src/Validator/XdebugValidator.php @@ -4,6 +4,7 @@ declare(strict_types = 1); namespace Drupal\package_manager\Validator; +use Drupal\Component\FileSystem\FileSystem as DrupalFilesystem; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\package_manager\Event\StatusCheckEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -40,6 +41,15 @@ class XdebugValidator implements EventSubscriberInterface { * Returns an array of warnings or null if Xdebug isn't detected. */ protected function checkForXdebug(): ?array { + // Xdebug is allowed to be enabled while running tests, for debugging + // purposes. It's just not allowed to be enabled while using Package Manager + // in a real environment. Except when specifically testing this validator. + // @see \Drupal\Tests\package_manager\Kernel\XdebugValidatorTest::testXdebugValidation() + // @see \Drupal\Tests\automatic_updates\Kernel\StatusCheck\XdebugValidatorTest::simulateXdebugEnabled() + if (self::insideTest() && !function_exists('xdebug_break_TESTED')) { + return NULL; + } + if (function_exists('xdebug_break')) { return [ $this->t('Xdebug is enabled, which may have a negative performance impact on Package Manager and any modules that use it.'), @@ -48,6 +58,21 @@ class XdebugValidator implements EventSubscriberInterface { return NULL; } + /** + * Whether this validator is running inside a test. + * + * @return bool + */ + private static function insideTest(): bool { + // @see \Drupal\Core\CoreServiceProvider::registerTest() + $in_functional_test = drupal_valid_test_ua(); + // @see \Drupal\Core\DependencyInjection\DependencySerializationTrait::__wakeup() + $in_kernel_test = isset($GLOBALS['__PHPUNIT_BOOTSTRAP']); + // @see \Drupal\BuildTests\Framework\BuildTestBase::setUp() + $in_build_test = str_contains(__FILE__, DrupalFilesystem::getOsTemporaryDirectory() . '/build_workspace_'); + return $in_functional_test || $in_kernel_test || $in_build_test; + } + /** * {@inheritdoc} */ diff --git a/package_manager/tests/src/Kernel/XdebugValidatorTest.php b/package_manager/tests/src/Kernel/XdebugValidatorTest.php index 7b13ca692dbd51a0ae240c5602e11ba82079003c..2c324819d867caba812faa0d9d8ad104cd37c2da 100644 --- a/package_manager/tests/src/Kernel/XdebugValidatorTest.php +++ b/package_manager/tests/src/Kernel/XdebugValidatorTest.php @@ -21,6 +21,9 @@ class XdebugValidatorTest extends PackageManagerKernelTestBase { if (!function_exists('xdebug_break')) { // @codingStandardsIgnoreLine eval('function xdebug_break() {}'); + // @see \Drupal\package_manager\Validator\XdebugValidator::checkForXdebug() + // @codingStandardsIgnoreLine + eval('function xdebug_break_TESTED() {}'); } $result = ValidationResult::createWarning([ diff --git a/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php b/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php index dbc10849046f93d64e3cf0952df6a6af018b9be5..f1869aa91c676fe3f2677d1a0b9fc352d5836a36 100644 --- a/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php +++ b/tests/src/Functional/AutomaticUpdatesFunctionalTestBase.php @@ -44,8 +44,6 @@ abstract class AutomaticUpdatesFunctionalTestBase extends BrowserTestBase { // package_manager_bypass is disabling those operations. // @todo https://www.drupal.org/project/automatic_updates/issues/3320755. 'package_manager.validator.composer_executable', - // Always allow tests to run with Xdebug on. - 'package_manager.validator.xdebug', ]; /** diff --git a/tests/src/Kernel/AutomaticUpdatesKernelTestBase.php b/tests/src/Kernel/AutomaticUpdatesKernelTestBase.php index 800ec5f403cebbf4dc9a8909d2637ccfd91e40da..44c25ce6d7e1e3c95d40d308aa4ea938b235e84d 100644 --- a/tests/src/Kernel/AutomaticUpdatesKernelTestBase.php +++ b/tests/src/Kernel/AutomaticUpdatesKernelTestBase.php @@ -50,8 +50,6 @@ abstract class AutomaticUpdatesKernelTestBase extends PackageManagerKernelTestBa if (in_array('package_manager.validator.symlink', $this->disableValidators, TRUE)) { $this->disableValidators[] = 'automatic_updates.validator.symlink'; } - // Always disable the Xdebug validator to allow test to run with Xdebug on. - $this->disableValidators[] = 'package_manager.validator.xdebug'; parent::setUp(); // Enable cron updates, which will eventually be the default. // @todo Remove in https://www.drupal.org/project/automatic_updates/issues/3284443 diff --git a/tests/src/Kernel/StatusCheck/XdebugValidatorTest.php b/tests/src/Kernel/StatusCheck/XdebugValidatorTest.php index 48652a8946be50491c6e980d68ec59b1420bf267..0a53dc20e78e833c7c3e0cfe82ab5993e20fc6ba 100644 --- a/tests/src/Kernel/StatusCheck/XdebugValidatorTest.php +++ b/tests/src/Kernel/StatusCheck/XdebugValidatorTest.php @@ -29,18 +29,6 @@ class XdebugValidatorTest extends AutomaticUpdatesKernelTestBase { */ protected static $modules = ['automatic_updates']; - /** - * {@inheritdoc} - */ - protected function setUp(): void { - parent::setUp(); - - // The parent class unconditionally disables the Xdebug validator we're - // testing, so undo that here. - $validator = $this->container->get('package_manager.validator.xdebug'); - $this->container->get('event_dispatcher')->addSubscriber($validator); - } - /** * Tests warnings and/or errors if Xdebug is enabled. */ @@ -121,6 +109,9 @@ class XdebugValidatorTest extends AutomaticUpdatesKernelTestBase { if (!function_exists('xdebug_break')) { // @codingStandardsIgnoreLine eval('function xdebug_break() {}'); + // @see \Drupal\package_manager\Validator\XdebugValidator::checkForXdebug() + // @codingStandardsIgnoreLine + eval('function xdebug_break_TESTED() {}'); } }