Merge "RCFilters: Change tooltip messages for view buttons"
[lhc/web/wiklou.git] / tests / phpunit / MediaWikiTestCase.php
index bc9f97c..c2eebfa 100644 (file)
@@ -215,6 +215,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        protected static function resetGlobalServices( Config $bootstrapConfig = null ) {
                $oldServices = MediaWikiServices::getInstance();
                $oldConfigFactory = $oldServices->getConfigFactory();
+               $oldLoadBalancerFactory = $oldServices->getDBLoadBalancerFactory();
 
                $testConfig = self::makeTestConfig( $bootstrapConfig );
 
@@ -223,6 +224,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $serviceLocator = MediaWikiServices::getInstance();
                self::installTestServices(
                        $oldConfigFactory,
+                       $oldLoadBalancerFactory,
                        $serviceLocator
                );
                return $serviceLocator;
@@ -278,12 +280,14 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
        /**
         * @param ConfigFactory $oldConfigFactory
+        * @param LBFactory $oldLoadBalancerFactory
         * @param MediaWikiServices $newServices
         *
         * @throws MWException
         */
        private static function installTestServices(
                ConfigFactory $oldConfigFactory,
+               LBFactory $oldLoadBalancerFactory,
                MediaWikiServices $newServices
        ) {
                // Use bootstrap config for all configuration.
@@ -297,6 +301,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                                [ 'main' =>  $bootstrapConfig ]
                        )
                );
+               $newServices->resetServiceForTesting( 'DBLoadBalancerFactory' );
+               $newServices->redefineService(
+                       'DBLoadBalancerFactory',
+                       function ( MediaWikiServices $services ) use ( $oldLoadBalancerFactory ) {
+                               return $oldLoadBalancerFactory;
+                       }
+               );
        }
 
        /**
@@ -309,7 +320,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                ConfigFactory $oldFactory,
                array $configurations
        ) {
-               return function( MediaWikiServices $services ) use ( $oldFactory, $configurations ) {
+               return function ( MediaWikiServices $services ) use ( $oldFactory, $configurations ) {
                        $factory = new ConfigFactory();
 
                        // clone configurations from $oldFactory that are not overwritten by $configurations
@@ -737,6 +748,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                                        $GLOBALS[$globalKey] instanceof FauxRequest
                                ) {
                                        $this->mwGlobals[$globalKey] = clone $GLOBALS[$globalKey];
+                               } elseif ( $this->containsClosure( $GLOBALS[$globalKey] ) ) {
+                                       // Serializing Closure only gives a warning on HHVM while
+                                       // it throws an Exception on Zend.
+                                       // Workaround for https://github.com/facebook/hhvm/issues/6206
+                                       $this->mwGlobals[$globalKey] = $GLOBALS[$globalKey];
                                } else {
                                        try {
                                                $this->mwGlobals[$globalKey] = unserialize( serialize( $GLOBALS[$globalKey] ) );
@@ -748,6 +764,28 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
        }
 
+       /**
+        * @param mixed $var
+        * @param int $maxDepth
+        *
+        * @return bool
+        */
+       private function containsClosure( $var, $maxDepth = 15 ) {
+               if ( $var instanceof Closure ) {
+                       return true;
+               }
+               if ( !is_array( $var ) || $maxDepth === 0 ) {
+                       return false;
+               }
+
+               foreach ( $var as $value ) {
+                       if ( $this->containsClosure( $value, $maxDepth - 1 ) ) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
        /**
         * Merges the given values into a MW global array variable.
         * Useful for setting some entries in a configuration array, instead of
@@ -802,6 +840,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                $oldInstance = MediaWikiServices::getInstance();
                $oldConfigFactory = $oldInstance->getConfigFactory();
+               $oldLoadBalancerFactory = $oldInstance->getDBLoadBalancerFactory();
 
                $testConfig = self::makeTestConfig( null, $configOverrides );
                $newInstance = new MediaWikiServices( $testConfig );
@@ -820,6 +859,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                self::installTestServices(
                        $oldConfigFactory,
+                       $oldLoadBalancerFactory,
                        $newInstance
                );
                MediaWikiServices::forceGlobalInstance( $newInstance );