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(
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() {
public function execute() {
global $IP;
+ $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)
}
# --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() );
# The below code injects a parameter just like if the user called
# Probably fix bug 29226
$key = array_search( '--colors', $_SERVER['argv'] );
- if( $key === false ) {
+ if ( $key === false ) {
array_splice( $_SERVER['argv'], 1, 0, '--colors' );
}
}
# PHPUnit uses stream_resolve_include_path() internally
# See bug 32022
$key = array_search( '--include-path', $_SERVER['argv'] );
- if( $key === false ) {
+ if ( $key === false ) {
array_splice( $_SERVER['argv'], 1, 0,
__DIR__
. PATH_SEPARATOR
);
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;
+
+foreach ( array(
+ stream_resolve_include_path( 'phpunit.phar' ),
+ 'PHPUnit/Runner/Version.php',
+ 'PHPUnit/Autoload.php'
+) as $includePath ) {
+ @include_once $includePath;
+ if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
+ $ok = true;
+ break;
+ }
}
-if ( !class_exists( 'PHPUnit_TextUI_Command' ) ) {
- require_once 'PHPUnit/Autoload.php';
+if ( !$ok ) {
+ die( "Couldn't find a usable PHPUnit.\n" );
}
-// 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', '<' ) ) {
+ die( "PHPUnit 3.7.0 or later required; you have {$puVersion}.\n" );
}
-MediaWikiPHPUnitCommand::main();
+PHPUnit_TextUI_Command::main();