Unit tests: Whitelist global so LoggerFactory doesn't explode
authorKosta Harlan <kharlan@wikimedia.org>
Fri, 6 Sep 2019 09:43:39 +0000 (11:43 +0200)
committerKosta Harlan <kharlan@wikimedia.org>
Fri, 6 Sep 2019 09:43:39 +0000 (11:43 +0200)
Bug: T87781
Change-Id: I78ef16ac3b9efa7059905c44c234065aa68db680

tests/phpunit/MediaWikiUnitTestCase.php

index 3f876ae..76e8f7d 100644 (file)
@@ -37,6 +37,25 @@ abstract class MediaWikiUnitTestCase extends TestCase {
        private static $originalGlobals;
        private static $unitGlobals;
 
+       /**
+        * Whitelist of globals to allow in MediaWikiUnitTestCase.
+        *
+        * Please, keep this list to the bare minimum.
+        *
+        * @return string[]
+        */
+       private static function getGlobalsWhitelist() {
+               return [
+                       // The autoloader may change between bootstrap and the first test,
+                       // so (lazily) capture these here instead.
+                       'wgAutoloadClasses',
+                       'wgAutoloadLocalClasses',
+                       // Need for LoggerFactory. Default is NullSpi.
+                       'wgMWLoggerDefaultSpi',
+                       'wgAutoloadAttemptLowercase'
+               ];
+       }
+
        public static function setUpBeforeClass() {
                parent::setUpBeforeClass();
 
@@ -56,12 +75,10 @@ abstract class MediaWikiUnitTestCase extends TestCase {
                }
 
                self::$unitGlobals =& TestSetup::$bootstrapGlobals;
-               // The autoloader may change between bootstrap and the first test,
-               // so (lazily) capture these here instead.
-               self::$unitGlobals['wgAutoloadClasses'] =& $GLOBALS['wgAutoloadClasses'];
-               self::$unitGlobals['wgAutoloadLocalClasses'] =& $GLOBALS['wgAutoloadLocalClasses'];
-               // This value should always be true.
-               self::$unitGlobals['wgAutoloadAttemptLowercase'] = true;
+
+               foreach ( self::getGlobalsWhitelist() as $global ) {
+                       self::$unitGlobals[ $global ] =& $GLOBALS[ $global ];
+               }
 
                // Would be nice if we coud simply replace $GLOBALS as a whole,
                // but unsetting or re-assigning that breaks the reference of this magic