Merge "Remove unused argument"
[lhc/web/wiklou.git] / tests / phpunit / phpunit.php
index c7491d3..587d6d0 100755 (executable)
@@ -15,6 +15,18 @@ require_once dirname( dirname( __DIR__ ) ) . "/maintenance/Maintenance.php";
 
 class PHPUnitMaintClass extends Maintenance {
 
+       public static $additionalOptions = array(
+               'regex' => false,
+               'file' => false,
+               'use-filebackend' => false,
+               'use-bagostuff' => false,
+               'use-jobqueue' => false,
+               'keep-uploads' => false,
+               'use-normal-tables' => false,
+               'reuse-db' => false,
+               'wiki' => false,
+       );
+
        public function __construct() {
                parent::__construct();
                $this->addOption(
@@ -24,12 +36,26 @@ class PHPUnitMaintClass extends Maintenance {
                        false, # not required
                        true # need arg
                );
+               $this->addOption(
+                       'debug-tests',
+                       'Log testing activity to the PHPUnitCommand log channel.',
+                       false, # not required
+                       false # no arg needed
+               );
+               $this->addOption( 'regex', 'Only run parser tests that match the given regex.', false, true );
+               $this->addOption( 'file', 'File describing parser tests.', false, true );
+               $this->addOption( 'use-filebackend', 'Use filebackend', false, true );
+               $this->addOption( 'use-bagostuff', 'Use bagostuff', false, true );
+               $this->addOption( 'use-jobqueue', 'Use jobqueue', false, true );
+               $this->addOption( 'keep-uploads', 'Re-use the same upload directory for each test, don\'t delete it.', false, false );
+               $this->addOption( 'use-normal-tables', 'Use normal DB tables.', false, false );
+               $this->addOption( 'reuse-db', 'Init DB only if tables are missing and keep after finish.', false, false );
        }
 
        public function finalSetup() {
                parent::finalSetup();
 
-               global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
+               global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType, $wgMainWANCache;
                global $wgLanguageConverterCacheType, $wgUseDatabaseMessages;
                global $wgLocaltimezone, $wgLocalisationCacheConf;
                global $wgDevelopmentWarnings;
@@ -41,6 +67,7 @@ class PHPUnitMaintClass extends Maintenance {
                $wgDevelopmentWarnings = true;
 
                $wgMainCacheType = CACHE_NONE;
+               $wgMainWANCache = CACHE_NONE;
                $wgMessageCacheType = CACHE_NONE;
                $wgParserCacheType = CACHE_NONE;
                $wgLanguageConverterCacheType = CACHE_NONE;
@@ -67,6 +94,14 @@ class PHPUnitMaintClass extends Maintenance {
        public function execute() {
                global $IP;
 
+               // Deregister handler from MWExceptionHandler::installHandle so that PHPUnit's own handler
+               // stays in tact.
+               // Has to in execute() instead of finalSetup(), because finalSetup() runs before
+               // doMaintenance.php includes Setup.php, which calls MWExceptionHandler::installHandle().
+               restore_error_handler();
+
+               $this->forceFormatServerArgv();
+
                # Make sure we have --configuration or PHPUnit might complain
                if ( !in_array( '--configuration', $_SERVER['argv'] ) ) {
                        //Hack to eliminate the need to use the Makefile (which sucks ATM)
@@ -75,17 +110,12 @@ class PHPUnitMaintClass extends Maintenance {
                }
 
                # --with-phpunitdir let us override the default PHPUnit version
+               # Can use with either or phpunit.phar in the directory or the
+               # full PHPUnit code base.
                if ( $this->hasOption( 'with-phpunitdir' ) ) {
                        $phpunitDir = $this->getOption( 'with-phpunitdir' );
-                       # Sanity checks
-                       if ( !is_dir( $phpunitDir ) ) {
-                               $this->error( "--with-phpunitdir should be set to an existing directory", 1 );
-                       }
-                       if ( !is_readable( $phpunitDir . "/PHPUnit/Runner/Version.php" ) ) {
-                               $this->error( "No usable PHPUnit installation in $phpunitDir.\nAborting.\n", 1 );
-                       }
 
-                       # Now prepends provided PHPUnit directory
+                       # prepends provided PHPUnit directory or phar
                        $this->output( "Will attempt loading PHPUnit from `$phpunitDir`\n" );
                        set_include_path( $phpunitDir . PATH_SEPARATOR . get_include_path() );
 
@@ -123,38 +153,98 @@ class PHPUnitMaintClass extends Maintenance {
                        );
                        array_splice( $_SERVER['argv'], 1, 0, '--include-path' );
                }
+
+               $key = array_search( '--debug-tests', $_SERVER['argv'] );
+               if ( $key !== false && array_search( '--printer', $_SERVER['argv'] ) === false ) {
+                       unset( $_SERVER['argv'][$key] );
+                       array_splice( $_SERVER['argv'], 1, 0, 'MediaWikiPHPUnitTestListener' );
+                       array_splice( $_SERVER['argv'], 1, 0, '--printer' );
+               }
+
+               foreach ( self::$additionalOptions as $option => $default ) {
+                       $key = array_search( '--' . $option, $_SERVER['argv'] );
+                       if ( $key !== false ) {
+                               unset( $_SERVER['argv'][$key] );
+                               if ( $this->mParams[$option]['withArg'] ) {
+                                       self::$additionalOptions[$option] = $_SERVER['argv'][$key + 1];
+                                       unset( $_SERVER['argv'][$key + 1] );
+                               } else {
+                                       self::$additionalOptions[$option] = true;
+                               }
+                       }
+               }
+
        }
 
        public function getDbType() {
                return Maintenance::DB_ADMIN;
        }
+
+       /**
+        * Force the format of elements in $_SERVER['argv']
+        *  - Split args such as "wiki=enwiki" into two separate arg elements "wiki" and "enwiki"
+        */
+       private function forceFormatServerArgv() {
+               $argv = array();
+               foreach ( $_SERVER['argv'] as $key => $arg ) {
+                       if ( $key === 0 ) {
+                               $argv[0] = $arg;
+                       } elseif ( strstr( $arg, '=' ) ) {
+                               foreach ( explode( '=', $arg, 2 ) as $argPart ) {
+                                       $argv[] = $argPart;
+                               }
+                       } else {
+                               $argv[] = $arg;
+                       }
+               }
+               $_SERVER['argv'] = $argv;
+       }
+
 }
 
 $maintClass = 'PHPUnitMaintClass';
 require RUN_MAINTENANCE_IF_MAIN;
 
-if ( !class_exists( 'PHPUnit_Runner_Version' ) ) {
-       require_once 'PHPUnit/Runner/Version.php';
+// Prevent segfault when we have lots of unit tests (bug 62623)
+if ( version_compare( PHP_VERSION, '5.4.0', '<' ) ) {
+       register_shutdown_function( function () {
+               gc_collect_cycles();
+               gc_disable();
+       } );
 }
 
-if ( PHPUnit_Runner_Version::id() !== '@package_version@'
-       && version_compare( PHPUnit_Runner_Version::id(), '3.7.0', '<' )
-) {
-       die( 'PHPUnit 3.7.0 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
+
+$ok = false;
+
+if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
+       echo "PHPUnit already present\n";
+       $ok = true;
+} else {
+       foreach ( array(
+                               stream_resolve_include_path( 'phpunit.phar' ),
+                               'PHPUnit/Runner/Version.php',
+                               'PHPUnit/Autoload.php'
+                       ) as $includePath ) {
+               // @codingStandardsIgnoreStart
+               @include_once $includePath;
+               // @codingStandardsIgnoreEnd
+               if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
+                       $ok = true;
+                       echo "Using PHPUnit from $includePath\n";
+                       break;
+               }
+       }
 }
 
-if ( !class_exists( 'PHPUnit_TextUI_Command' ) ) {
-       require_once 'PHPUnit/Autoload.php';
+if ( !$ok ) {
+       echo "Couldn't find a usable PHPUnit.\n";
+       exit( 1 );
 }
 
-// Prevent segfault when we have lots of unit tests (bug 62623)
-if ( version_compare( PHP_VERSION, '5.4.0', '<' )
-       && version_compare( PHP_VERSION, '5.3.0', '>=' )
-) {
-       register_shutdown_function( function () {
-               gc_collect_cycles();
-               gc_disable();
-       } );
+$puVersion = PHPUnit_Runner_Version::id();
+if ( $puVersion !== '@package_version@' && version_compare( $puVersion, '3.7.0', '<' ) ) {
+       echo "PHPUnit 3.7.0 or later required; you have {$puVersion}.\n";
+       exit( 1 );
 }
 
-MediaWikiPHPUnitCommand::main();
+PHPUnit_TextUI_Command::main();