diff options
Diffstat (limited to 'maintenance/fuzz-tester.php')
-rw-r--r-- | maintenance/fuzz-tester.php | 115 |
1 files changed, 67 insertions, 48 deletions
diff --git a/maintenance/fuzz-tester.php b/maintenance/fuzz-tester.php index a78522cd..18af4de4 100644 --- a/maintenance/fuzz-tester.php +++ b/maintenance/fuzz-tester.php @@ -1,10 +1,28 @@ <?php /** -* @file -* @ingroup Maintenance -* @author Nick Jenkins ( http://nickj.org/ ). -* @copyright 2006 Nick Jenkins -* @licence GNU General Public Licence 2.0 + * Performs fuzz-style testing of MediaWiki's parser and forms. + * + * Copyright © 2006 Nick Jenkins + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @ingroup Maintenance + * @author Nick Jenkins ( http://nickj.org/ ). + Started: 18 May 2006. @@ -798,6 +816,13 @@ class wikiFuzz { } } + /** + * Returns the matched character slash-escaped as in a C string + * Helper for makeTitleSafe callback + */ + static private function stringEscape( $matches ) { + return sprintf( "\\x%02x", ord( $matches[1] ) ); + } /** ** Strips out the stuff that Mediawiki balks at in a page's title. @@ -806,13 +831,7 @@ class wikiFuzz { static public function makeTitleSafe( $str ) { $legalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF"; return preg_replace_callback( - "/([^$legalTitleChars])/", - create_function( - // single quotes are essential here, - // or alternative escape all $ as \$ - '$matches', - 'return sprintf( "\\x%02x", ord( $matches[1] ) );' - ), + "/([^$legalTitleChars])/", 'wikiFuzz::stringEscape', $str ); } @@ -1027,18 +1046,18 @@ class prefixindexTest extends pageTest { $this->params = array ( "title" => "Special:Prefixindex", - "namespace" => wikiFuzz::randnum( -10, 101 ), + "namespace" => wikiFuzz::randnum( 101, -10 ), "Go" => wikiFuzz::makeFuzz( 2 ) ); // sometimes we want 'prefix', sometimes we want 'from', and sometimes we want nothing. if ( wikiFuzz::randnum( 3 ) == 0 ) { $this->params["prefix"] = wikiFuzz::chooseInput( array( "-1", "-----'--------0", "+++--+1", - wikiFuzz::randnum( -10, 8134 ), wikiFuzz::makeFuzz( 2 ) ) ); + wikiFuzz::randnum( 8134, -10 ), wikiFuzz::makeFuzz( 2 ) ) ); } if ( wikiFuzz::randnum( 3 ) == 0 ) { $this->params["from"] = wikiFuzz::chooseInput( array( "-1", "-----'--------0", "+++--+1", - wikiFuzz::randnum( -10, 8134 ), wikiFuzz::makeFuzz( 2 ) ) ); + wikiFuzz::randnum( 8134, -10 ), wikiFuzz::makeFuzz( 2 ) ) ); } } } @@ -1350,7 +1369,7 @@ class viewPageTest extends pageTest { // Tidy does not know how to valid atom or rss, so exclude from testing for the time being. if ( $this->params["feed"] == "atom" ) { unset( $this->params["feed"] ); } - else if ( $this->params["feed"] == "rss" ) { unset( $this->params["feed"] ); } + elseif ( $this->params["feed"] == "rss" ) { unset( $this->params["feed"] ); } // Raw pages cannot really be validated if ( $this->params["action"] == "raw" ) unset( $this->params["action"] ); @@ -1384,7 +1403,7 @@ class specialAllmessagesTest extends pageTest { /** ** a page test for "Special:Newpages". */ -class specialNewpages extends pageTest { +class specialNewpagesPageTest extends pageTest { function __construct() { $this->pagePath = "index.php?title=Special:Newpages"; @@ -1397,7 +1416,7 @@ class specialNewpages extends pageTest { // Tidy does not know how to valid atom or rss, so exclude from testing for the time being. if ( $this->params["feed"] == "atom" ) { unset( $this->params["feed"] ); } - else if ( $this->params["feed"] == "rss" ) { unset( $this->params["feed"] ); } + elseif ( $this->params["feed"] == "rss" ) { unset( $this->params["feed"] ); } } } @@ -1470,7 +1489,7 @@ class specialBlockmeTest extends pageTest { // sometimes we specify "ip", and sometimes we don't. if ( wikiFuzz::randnum( 1 ) == 0 ) { - $this->params["ip"] = wikiFuzz::chooseInput( array( "10.12.41.213", wikiFuzz::randnum( -10, 8134 ), wikiFuzz::makeFuzz( 2 ) ) ); + $this->params["ip"] = wikiFuzz::chooseInput( array( "10.12.41.213", wikiFuzz::randnum( 8134, -10 ), wikiFuzz::makeFuzz( 2 ) ) ); } } } @@ -1512,7 +1531,7 @@ class specialMovePage extends pageTest { /** ** a page test for "Special:Undelete" */ -class specialUndelete extends pageTest { +class specialUndeletePageTest extends pageTest { function __construct() { $this->pagePath = "index.php?title=Special:Undelete"; @@ -1539,7 +1558,7 @@ class specialUndelete extends pageTest { /** ** a page test for "Special:Unlockdb" */ -class specialUnlockdb extends pageTest { +class specialUnlockdbPageTest extends pageTest { function __construct() { $this->pagePath = "index.php?title=Special:Unlockdb"; @@ -1560,7 +1579,7 @@ class specialUnlockdb extends pageTest { /** ** a page test for "Special:Lockdb" */ -class specialLockdb extends pageTest { +class specialLockdbPageTest extends pageTest { function __construct() { $this->pagePath = "index.php?title=Special:Lockdb"; @@ -1713,7 +1732,7 @@ class pageDeletion extends pageTest { /** ** a test for Revision Deletion. */ -class specialRevisionDelete extends pageTest { +class specialRevisionDeletePageTest extends pageTest { function __construct() { $this->pagePath = "index.php?title=Special:Revisiondelete"; @@ -1744,7 +1763,7 @@ class specialRevisionDelete extends pageTest { /** ** a test for Special:Import. */ -class specialImport extends pageTest { +class specialImportPageTest extends pageTest { function __construct() { $this->pagePath = "index.php?title=Special:Import"; @@ -1842,7 +1861,7 @@ class profileInfo extends pageTest { /** ** a test for Special:Cite (extension Special page). */ -class specialCite extends pageTest { +class specialCitePageTest extends pageTest { function __construct() { $this->pagePath = "index.php?title=Special:Cite"; @@ -1861,7 +1880,7 @@ class specialCite extends pageTest { /** ** a test for Special:Filepath (extension Special page). */ -class specialFilepath extends pageTest { +class specialFilepathPageTest extends pageTest { function __construct() { $this->pagePath = "index.php?title=Special:Filepath"; @@ -1921,7 +1940,7 @@ class specialMakesysop extends pageTest { /** ** a test for Special:Renameuser (extension Special page). */ -class specialRenameuser extends pageTest { +class specialRenameuserPageTest extends pageTest { function __construct() { $this->pagePath = "index.php?title=Special:Renameuser"; @@ -2044,18 +2063,18 @@ class api extends pageTest { // API watchlist feed mode. private static function feedwatchlistMode() { - // FIXME: add "wikiFuzz::makeFuzz(2)" as possible value below? + // @todo FIXME: Add "wikiFuzz::makeFuzz(2)" as possible value below? return array ( "feedformat" => wikiFuzz::chooseInput( array( "rss", "atom" ) ) ); } // API query mode. private static function queryMode() { - // FIXME: add "wikiFuzz::makeFuzz(2)" as possible params for the elements below? + // @todo FIXME: Add "wikiFuzz::makeFuzz(2)" as possible params for the elements below? // Suspect this will stuff up the tests more, but need to check. $params = array ( - // FIXME: More titles. + // @todo FIXME: More titles. "titles" => wikiFuzz::chooseInput( array( "Main Page" ) ), - // FIXME: More pageids. + // @todo FIXME: More pageids. "pageids" => 1, "prop" => wikiFuzz::chooseInput( array( "info", "revisions", "watchlist" ) ), "list" => wikiFuzz::chooseInput( array( "allpages", "logevents", "watchlist", "usercontribs", "recentchanges", "backlinks", "embeddedin", "imagelinks" ) ), @@ -2149,7 +2168,7 @@ class api extends pageTest { $this->params["action"] = $action; // Set the cookie: - // FIXME: need to get this cookie dynamically set, rather than hard-coded. + // @todo FIXME: Need to get this cookie dynamically set, rather than hard-coded. $this->cookie = "wikidbUserID=10001; wikidbUserName=Test; wikidb_session=178df0fe68c75834643af65dec9ec98a; wikidbToken=1adc6753d62c44aec950c024d7ae0540"; // Output format @@ -2173,7 +2192,7 @@ class GeSHi_Test extends pageTest { return "<source lang=\"" . $this->getLang() . "\" " . ( wikiFuzz::randnum( 2 ) == 0 ? "line " : "" ) . ( wikiFuzz::randnum( 2 ) == 0 ? "strict " : "" ) - . "start=" . wikiFuzz::chooseInput( array( wikiFuzz::randnum( -6000, 6000 ), wikiFuzz::makeFuzz( 2 ) ) ) + . "start=" . wikiFuzz::chooseInput( array( wikiFuzz::randnum( 6000, -6000 ), wikiFuzz::makeFuzz( 2 ) ) ) . ">" . wikiFuzz::makeFuzz( 2 ) . "</source>"; @@ -2238,31 +2257,31 @@ function selectPageTest( $count ) { case 15: return new contributionsTest(); case 16: return new viewPageTest(); case 17: return new specialAllmessagesTest(); - case 18: return new specialNewpages(); + case 18: return new specialNewpagesPageTest(); case 19: return new searchTest(); case 20: return new redirectTest(); case 21: return new confirmEmail(); case 22: return new watchlistTest(); case 23: return new specialBlockmeTest(); - case 24: return new specialUndelete(); + case 24: return new specialUndeletePageTest(); case 25: return new specialMovePage(); - case 26: return new specialUnlockdb(); - case 27: return new specialLockdb(); + case 26: return new specialUnlockdbPageTest(); + case 27: return new specialLockdbPageTest(); case 28: return new specialUserrights(); case 29: return new pageProtectionForm(); case 30: return new specialBlockip(); case 31: return new imagepageTest(); case 32: return new pageDeletion(); - case 33: return new specialRevisionDelete(); - case 34: return new specialImport(); + case 33: return new specialRevisionDeletePageTest(); + case 34: return new specialImportPageTest(); case 35: return new thumbTest(); case 36: return new trackbackTest(); case 37: return new profileInfo(); - case 38: return new specialCite(); - case 39: return new specialFilepath(); + case 38: return new specialCitePageTest(); + case 39: return new specialFilepathPageTest(); case 40: return new specialMakebot(); case 41: return new specialMakesysop(); - case 42: return new specialRenameuser(); + case 42: return new specialRenameuserPageTest(); case 43: return new specialLinksearch(); case 44: return new specialCategoryTree(); case 45: return new api(); @@ -2333,7 +2352,7 @@ function saveTestAsPHP( pageTest $test, $filename ) { . "\$result=curl_exec(\$ch);\n" . "curl_close (\$ch);\n" . "print \$result;\n" - . "?>\n"; + . "\n"; saveFile( $str, $filename ); } @@ -2453,7 +2472,7 @@ function validateHTML( $text ) { curl_close ( $ch ); - $valid = ( strpos( $result, "Failed validation" ) === false ? true : false ); + $valid = ( strpos( $result, "Failed validation" ) === false ); return array( $valid, $result ); } @@ -2490,8 +2509,8 @@ function dbErrorLogged() { // first time running this function if ( !isset( $filesize ) ) { // create log if it does not exist - if ( !file_exists( DB_ERROR_LOG_FILE ) ) { - saveFile( "", DB_ERROR_LOG_FILE ); + if ( DB_ERROR_LOG_FILE && !file_exists( DB_ERROR_LOG_FILE ) ) { + saveFile( '', DB_ERROR_LOG_FILE ); } $filesize = filesize( DB_ERROR_LOG_FILE ); return false; @@ -2683,7 +2702,7 @@ if ( !is_dir( DIRECTORY ) ) { mkdir ( DIRECTORY, 0700 ); } // otherwise, we first retest the things that we have found in previous runs -else if ( RERUN_OLD_TESTS ) { +elseif ( RERUN_OLD_TESTS ) { rerunPreviousTests(); } @@ -2731,7 +2750,7 @@ for ( $count = 0; true; $count++ ) { } saveTest( $test, $testname ); $num_errors += 1; - } else if ( KEEP_PASSED_TESTS ) { + } elseif ( KEEP_PASSED_TESTS ) { // print current time, with microseconds (matches "strace" format), and the test name. print " " . date( "H:i:s." ) . substr( current( explode( " ", microtime() ) ), 2 ) . " " . $testname; saveTest( $test, $testname ); |