Author: Derick Rethans Date: 2006-10-04 14:42:42 +0200 (Wed, 04 Oct 2006) New Revision: 3634
Log: - Infrastructure for running tests in the "stable" tree. - Infrastructure for testing releases in the "stable" tree. - This patch also updates the test runner to support single named options for logging and xml files, and removes the superfluous options for specifying database settings. Modified: scripts/check-differences.sh scripts/release1.sh scripts/setup-env.sh trunk/Base/src/base.php trunk/UnitTest/src/runtests.php trunk/UnitTest/src/test/printer.php trunk/UnitTest/src/test/runner.php Modified: scripts/check-differences.sh =================================================================== --- scripts/check-differences.sh 2006-10-04 12:37:28 UTC (rev 3633) +++ scripts/check-differences.sh 2006-10-04 12:42:42 UTC (rev 3634) @@ -8,4 +8,4 @@ comp=`echo $1 | cut -d / -f 2` version=`echo $1 | cut -d / -f 3` -diff -N -I @version -x .svn -ru8p releases/$comp/$version trunk/$comp | less +diff -N -I @version -x .svn -ru6p releases/$comp/$version trunk/$comp | less Modified: scripts/release1.sh =================================================================== --- scripts/release1.sh 2006-10-04 12:37:28 UTC (rev 3633) +++ scripts/release1.sh 2006-10-04 12:42:42 UTC (rev 3634) @@ -7,18 +7,33 @@ component=$1 echo -cd trunk +# figure out if we need to release from a branch or not +parts=`echo $component | cut -d / -s -f 2`; +if test "$parts" == ""; then + branch='trunk'; + prefix='../..'; + unittestcmd='UnitTest/src/runtests.php'; + logfilename=$component +else + branch='stable'; + prefix='../../..'; + unittestcmd='../trunk/UnitTest/src/runtests.php -r stable'; + logfilename=`echo $component | tr / -`; +fi + +cd $branch + echo "* Checking line endings" cd $component -status=`../../scripts/check-end-of-file-marker.sh` +status=`$prefix/scripts/check-end-of-file-marker.sh` if test "$status" != ""; then echo echo "Aborted: Line ending problems in:" echo $status exit fi -cd .. +cd - >/dev/null echo "* Checking for local modifications" status=`svn st $component` @@ -38,8 +53,8 @@ fi echo "* Running tests" -php UnitTest/src/runtests.php -D "mysql://root:[EMAIL PROTECTED]/ezc" $component |tee /tmp/test-$component.log -testresult=`cat /tmp/test-$component.log | grep FAILURES`; +php $unittestcmd -D "mysql://root:[EMAIL PROTECTED]/ezc" $component |tee /tmp/test-$logfilename.log +testresult=`cat /tmp/test-$logfilename.log | grep FAILURES`; if test "$testresult" == "FAILURES!"; then echo echo "Aborted: TESTS FAILED"; Modified: scripts/setup-env.sh =================================================================== --- scripts/setup-env.sh 2006-10-04 12:37:28 UTC (rev 3633) +++ scripts/setup-env.sh 2006-10-04 12:42:42 UTC (rev 3634) @@ -2,6 +2,7 @@ cd trunk +echo "Creating autoload environment for 'trunk':"; if test -d autoload; then echo "Autoload directory exists." else @@ -9,13 +10,13 @@ mkdir autoload fi -for i in `find . -name \*_autoload.php | grep -v tutorial_autoload.php`; do - p=`echo $i | cut -d / -f 2`; - r=`echo $i | cut -d / -f 3`; +for i in */src/*autoload.php; do + p=`echo $i | cut -d / -f 1`; + r=`echo $i | cut -d / -f 2`; + b=`echo $i | cut -d / -f 3`; if test ! $p == "autoload"; then if test ! $r == "releases"; then - b=`echo $i | cut -d / -f 4` if test -L autoload/$b; then echo "Symlink for $b to $i exists." else @@ -25,3 +26,33 @@ fi fi done + +cd - + +echo "Setting up environment for 'stable'" + +if ! test -L stable/autoload/base_autoload.php; then + ln -s ../../trunk/Base/src/base_autoload.php stable/autoload/base_autoload.php +fi + +if ! test -L stable/autoload/test_autoload.php; then + ln -s ../../trunk/UnitTest/src/test_autoload.php stable/autoload/test_autoload.php +fi + +for i in Base UnitTest; do + if ! test -L stable/$i; then + ln -s ../trunk/$i stable/$i + fi +done + +echo "- Creating autoload files:" + +for i in `cat stable/branch-info`; do + componentName=`echo $i | cut -d / -f 1`; + componentVersion=`echo $i | cut -d / -f 2`; + echo ' - ' $componentName + for j in stable/$i/src/*_autoload.php; do + targetFile='stable/autoload/'`echo $j | cut -d / -f 5`; + cat $j | sed "s/$componentName\//$componentName\/$componentVersion\//g" > $targetFile + done +done Modified: trunk/Base/src/base.php =================================================================== --- trunk/Base/src/base.php 2006-10-04 12:37:28 UTC (rev 3633) +++ trunk/Base/src/base.php 2006-10-04 12:42:42 UTC (rev 3634) @@ -28,9 +28,15 @@ /** * Indirectly it determines the path where the autoloads are stored. */ - const libraryMode = "devel"; + private static $libraryMode = "devel"; /** + * Contains the current working directory, which is used when the + * $libraryMode is set to "custom". + */ + private static $currentWorkingDirectory = null; + + /** * @var string The full path to the autoload directory. */ protected static $packageDir; @@ -140,7 +146,7 @@ trigger_error( "Couldn't find autoload directory '$path'", E_USER_ERROR ); } /* FIXME: this should go away - only for development */ - if ( self::libraryMode == 'devel' ) + if ( self::$libraryMode == 'devel' || self::$libraryMode == 'custom' ) { $dirs = self::getRepositoryDirectories(); $message = "Could not find a '{$className}' class to file mapping. Searched for " . implode( ' and ', $fileNames ) . " in: "; @@ -155,6 +161,12 @@ return false; } + public static function setWorkingDirectory( $directory ) + { + self::$libraryMode = 'custom'; + self::$currentWorkingDirectory = $directory; + } + /** * Returns the path to the autoload directory. The path depends on * the installation of the ezComponents. The SVN version has different @@ -167,8 +179,11 @@ // Get the path to the components. $baseDir = dirname( __FILE__ ); - switch ( ezcBase::libraryMode ) + switch ( ezcBase::$libraryMode ) { + case "custom": + ezcBase::$packageDir = self::$currentWorkingDirectory . '/'; + break; case "devel": case "tarball": ezcBase::$packageDir = $baseDir. "/../../"; @@ -249,17 +264,31 @@ protected static function loadFile( $file ) { $originalFile = $file; - list( $first, $second ) = explode( '/', $file, 2 ); - switch ( ezcBase::libraryMode ) + switch ( ezcBase::$libraryMode ) { case "devel": case "tarball": - // Add the "src/" after the package name. + list( $first, $second ) = explode( '/', $file, 2 ); $file = $first . "/src/" . $second; break; + case "custom": + list( $first, $second ) = explode( '/', $file, 2 ); + // Add the "src/" after the package name. + if ( $first == 'Base' || $first == 'UnitTest' ) + { + list( $first, $second ) = explode( '/', $file, 2 ); + $file = $first . "/src/" . $second; + } + else + { + list( $first, $second, $third ) = explode( '/', $file, 3 ); + $file = $first . '/' . $second . "/src/" . $third; + } + break; + case "pear": - $file = $first . '/'. $second; + /* do nothing, it's already correct */ break; } @@ -346,7 +375,7 @@ { $autoloadDirs = array(); ezcBase::setPackageDir(); - $repositoryDir = realpath( dirname( __FILE__ ) . '/../../' ); + $repositoryDir = self::$currentWorkingDirectory ? self::$currentWorkingDirectory : ( realpath( dirname( __FILE__ ) . '/../../' ) ); $autoloadDirs[$repositoryDir] = array( 'ezc', $repositoryDir . "/autoload" ); foreach ( ezcBase::$repositoryDirs as $extraDirKey => $extraDirArray ) Modified: trunk/UnitTest/src/runtests.php =================================================================== --- trunk/UnitTest/src/runtests.php 2006-10-04 12:37:28 UTC (rev 3633) +++ trunk/UnitTest/src/runtests.php 2006-10-04 12:42:42 UTC (rev 3634) @@ -1,6 +1,7 @@ <?php // All errors must be reported error_reporting( E_ALL | E_STRICT ); +ini_set( 'include_path', getcwd(). ':' . dirname( __FILE__ ) . '/../..:' . ini_get( 'include_path' ) ); require_once("Base/src/base.php"); function __autoload( $className ) Modified: trunk/UnitTest/src/test/printer.php =================================================================== --- trunk/UnitTest/src/test/printer.php 2006-10-04 12:37:28 UTC (rev 3633) +++ trunk/UnitTest/src/test/printer.php 2006-10-04 12:42:42 UTC (rev 3634) @@ -5,6 +5,11 @@ class ezcTestPrinter extends PHPUnit_TextUI_ResultPrinter { + public function __construct( $verbose = false ) + { + parent::__construct( null, $verbose ); + } + /** * Overrides ResultPrinter::nextColumn method to get rid of to automatic * newline inserts. Modified: trunk/UnitTest/src/test/runner.php =================================================================== --- trunk/UnitTest/src/test/runner.php 2006-10-04 12:37:28 UTC (rev 3633) +++ trunk/UnitTest/src/test/runner.php 2006-10-04 12:42:42 UTC (rev 3634) @@ -6,13 +6,6 @@ { const SUITE_FILENAME = "tests/suite.php"; - public function __construct() - { - // Call this method only once? - $printer = new ezcTestPrinter(); - $this->setPrinter( $printer ); - } - /** * For now, until the Console Tools is finished, we use the following * parameters: @@ -46,7 +39,8 @@ $consoleInput->registerOption( $help ); $help = new ezcConsoleOption( 'r', 'release', ezcConsoleInput::TYPE_STRING ); - $help->shorthelp = "The release from the svn. e.g: trunk, 1.0, 1.0rc1, etc. Default release is trunk."; + $help->shorthelp = "The release from the svn. Use either 'trunk' or 'stable'."; + $help->default = 'trunk'; $consoleInput->registerOption( $help ); // DSN option @@ -56,61 +50,18 @@ $dsn->longhelp .= "mysql://[EMAIL PROTECTED]@localhost/unittests"; $consoleInput->registerOption( $dsn ); - // host - $host = new ezcConsoleOption( 'h', 'host', ezcConsoleInput::TYPE_STRING ); - $host->shorthelp = "Hostname of the database"; - $consoleInput->registerOption( $host ); - - // type - $type = new ezcConsoleOption( 't', 'type', ezcConsoleInput::TYPE_STRING ); - $type->shorthelp = "Type of the database: (mysql, postsql, oracle, etc)."; - $consoleInput->registerOption( $type ); - - // user - $user = new ezcConsoleOption( 'u', 'user', ezcConsoleInput::TYPE_STRING ); - $user->shorthelp = "User to connect with the database."; - $consoleInput->registerOption( $user ); - - // password - $password = new ezcConsoleOption( 'p', 'password', ezcConsoleInput::TYPE_STRING ); - $password->shorthelp = "Password that belongs to the user that connect with the database."; - $consoleInput->registerOption( $password ); - - // database - $database = new ezcConsoleOption( 'd', 'database', ezcConsoleInput::TYPE_STRING ); - $database->shorthelp = "Database name."; - $consoleInput->registerOption( $database ); - - // Add relations, one for all. - $type->addDependency( new ezcConsoleOptionRule( $host ) ); - $user->addDependency( new ezcConsoleOptionRule( $host ) ); - $database->addDependency( new ezcConsoleOptionRule( $host ) ); - - // Add relations, all for one. - $host->addDependency( new ezcConsoleOptionRule( $type ) ); - $host->addDependency( new ezcConsoleOptionRule( $user ) ); - $host->addDependency( new ezcConsoleOptionRule( $database ) ); - - // And the password belongs to the user. - $password->addDependency( new ezcConsoleOptionRule( $user ) ); - - // Exclude DSN from the host parameters. - $host->addExclusion( new ezcConsoleOptionRule( $dsn ) ); - // coverage report dir $report = new ezcConsoleOption( 'c', 'report-dir', ezcConsoleInput::TYPE_STRING ); $report->shorthelp = "Directory to store test reports and code coverage reports in."; - $report->default = ""; $consoleInput->registerOption( $report ); // xml logfile - $xml = new ezcConsoleOption( '', 'log-xml', ezcConsoleInput::TYPE_STRING ); + $xml = new ezcConsoleOption( 'x', 'log-xml', ezcConsoleInput::TYPE_STRING ); $xml->shorthelp = "Log test execution in XML format to file."; - $xml->default = ""; $consoleInput->registerOption( $xml ); // Verbose option - $verbose = new ezcConsoleOption( '', 'verbose', ezcConsoleInput::TYPE_NONE ); + $verbose = new ezcConsoleOption( 'v', 'verbose', ezcConsoleInput::TYPE_NONE ); $verbose->shorthelp = "Output more verbose information."; $consoleInput->registerOption( $verbose ); } @@ -129,19 +80,17 @@ protected static function displayHelp( $consoleInput ) { - echo ("runtests [OPTION...] [PACKAGE | FILE] [PACKAGE | FILE] ... \n\n" ); - $options = $consoleInput->getOptions(); - - foreach ( $options as $option ) - { - echo "-{$option->short}, --{$option->long}\t {$option->shorthelp}\n"; - } - - echo "\n"; + echo $consoleInput->getHelpText( 'eZ components test runner' ); } public function runFromArguments() { + /* The following hack is needed so that we can also test the console tools in the stable branch */ + if ( in_array( 'stable', $_SERVER['argv'] ) ) + { + ezcBase::setWorkingDirectory( getcwd() ); + } + $consoleInput = new ezcConsoleInput(); self::registerConsoleArguments( $consoleInput ); self::processConsoleArguments( $consoleInput ); @@ -152,18 +101,13 @@ exit(); } - if ( $consoleInput->getOption( 'dsn' )->value || $consoleInput->getOption( 'host' )->value ) + if ( $consoleInput->getOption( 'dsn' )->value ) { $dsn = $consoleInput->getOption( 'dsn' )->value; - $type = $consoleInput->getOption( 'type' )->value; - $user = $consoleInput->getOption( 'user' )->value; - $password = $consoleInput->getOption( 'password' )->value; - $host = $consoleInput->getOption( 'host' )->value; - $database = $consoleInput->getOption( 'database' )->value; try { - $this->initializeDatabase( $dsn, $type, $user, $password, $host, $database ); + $this->initializeDatabase( $dsn ); } catch ( Exception $e ) { @@ -178,7 +122,6 @@ // Set the release. Default is trunk. $release = $consoleInput->getOption( 'release' )->value; - $release = ( $release == false || $release == "trunk" ? "trunk" : "releases/$release" ); $allSuites = $this->prepareTests( $consoleInput->getArguments(), $release ); $logfile = $consoleInput->getOption( 'log-xml' )->value; @@ -194,11 +137,18 @@ $params['reportDirectory'] = $reportDir; } - if ( $consoleInput->getOption( "help" )->value ) + if ( $consoleInput->getOption( "verbose" )->value ) { $params['verbose'] = true; } + else + { + $params['verbose'] = false; + } + $printer = new ezcTestPrinter( $params['verbose'] ); + $this->setPrinter( $printer ); + $this->doRun( $allSuites, $params ); } @@ -209,19 +159,20 @@ protected function prepareTests( $packages, $release ) { - $directory = dirname( __FILE__ ) . "/../../.."; - + $directory = getcwd(); + $allSuites = new ezcTestSuite(); $allSuites->setName( "eZ components" ); if ( sizeof( $packages ) == 0 ) { - $packages = $this->getPackages( $directory ); + $packages = $this->getPackages( $release, $directory ); } foreach ( $packages as $package ) { - if ( strpos( $package, "/" ) !== false ) + $slashCount = substr_count( $package, '/' ); + if ( ( $release == 'trunk' && $slashCount !== 0 ) || ( $release == 'stable' && $slashCount > 1 ) ) { if ( file_exists( $package ) ) { @@ -277,46 +228,37 @@ } /** + * @param string $release Release branch (stable or trunk) * @param string $dir Absolute or relative path to directory to look in. * * @return array Package names. */ - protected function getPackages( $dir ) + protected function getPackages( $release, $dir ) { $packages = array(); if ( is_dir( $dir ) ) { - if ( $dh = opendir( $dir ) ) + $entries = glob( $release == 'trunk' ? "$dir/*" : "$dir/*/*" ); + foreach ( $entries as $entry ) { - while ( ( $entry = readdir( $dh ) ) !== false ) + if ( $this->isPackageDir( $entry ) ) { - if ( $this->isPackage( $dir, $entry ) ) - { - $packages[] = $entry; - } + $packages[] = str_replace( $dir . '/', '', $entry ); } - closedir( $dh ); } - } + } return $packages; } - protected function isPackage( $dir, $entry ) + protected function isPackageDir( $dir ) { - // Prepend directory if needed. - $fullPath = $dir == "" ? $entry : $dir ."/". $entry; - // Check if it is a package. - if ( !is_dir( $fullPath ) ) + if ( !is_dir( $dir ) || !file_exists( $dir . '/tests/suite.php' ) ) { return false; } - if ( $entry[0] == "." ) - { - return false; // .svn, ., .. - } return true; } @@ -368,6 +310,10 @@ { require_once( $suitePath ); + if ( $release == 'stable' ) + { + $package = substr( $package, 0, strpos( $package, '/' ) ); + } $className = "ezc". $package . "Suite"; $s = call_user_func( array( $className, 'suite' ) ); @@ -378,25 +324,13 @@ return null; } - protected function initializeDatabase( $dsn, $type, $user, $password, $host, $database ) + protected function initializeDatabase( $dsn ) { $ts = ezcTestSettings::getInstance(); + $settings = ezcDbFactory::parseDSN( $dsn ); - if ( $dsn ) - { - $settings = ezcDbFactory::parseDSN( $dsn ); - - // Store the settings - $ts->db->dsn = $dsn; - } - else - { - $settings = array( "type" => $type, - "user" => $user, - "password" => $password, - "host" => $host, - "database" => $database ); - } + // Store the settings + $ts->db->dsn = $dsn; try { @@ -408,20 +342,8 @@ { die( $e->getMessage() ); } - - // TODO Check if the database exists, and whether it is empty. - } - protected function printError( $errorString ) - { - print( $errorString . "\n\n" ); - - print( "The DSN should look like: <Driver>://<User>[:Password]@<Host>/<Database> \n" ); - print( "For example: mysql://root:[EMAIL PROTECTED]/unittests\n\n" ); - exit(); - } - public static function addFileToFilter( $filename, $group = 'DEFAULT' ) { PHPUnit_Util_Filter::addFileToFilter( $filename, $group ); -- svn-components mailing list svn-components@lists.ez.no http://lists.ez.no/mailman/listinfo/svn-components