diff options
Diffstat (limited to 'maintenance/fuzz-tester.php')
-rw-r--r-- | maintenance/fuzz-tester.php | 397 |
1 files changed, 343 insertions, 54 deletions
diff --git a/maintenance/fuzz-tester.php b/maintenance/fuzz-tester.php index 0ee052b2..4e90d52b 100644 --- a/maintenance/fuzz-tester.php +++ b/maintenance/fuzz-tester.php @@ -1,7 +1,6 @@ <?php /** -* @package MediaWiki -* @subpackage Maintainance +* @addtogroup Maintenance * @author Nick Jenkins ( http://nickj.org/ ). * @copyright 2006 Nick Jenkins * @licence GNU General Public Licence 2.0 @@ -106,6 +105,9 @@ Wiki configuration for testing: //$wgUseTrackbacks = true; // enable trackbacks; However this breaks the viewPageTest, so currently disabled. $wgDBerrorLog = "/root/mediawiki-db-error-log.txt"; // log DB errors, replace with suitable path. $wgShowSQLErrors = true; // Show SQL errors (instead of saying the query was hidden). + $wgShowExceptionDetails = true; // want backtraces. + $wgEnableAPI = true; // enable API. + $wgEnableWriteAPI = true; // enable API. // Install & enable Parser Hook extensions to increase code coverage. E.g.: require_once("extensions/ParserFunctions/ParserFunctions.php"); @@ -124,6 +126,16 @@ Wiki configuration for testing: require_once("extensions/Renameuser/SpecialRenameuser.php"); require_once("extensions/LinkSearch/LinkSearch.php"); // --------- End --------- + + If you want to try E_STRICT error logging, add this to the above: + // --------- Start --------- + error_reporting (E_ALL | E_STRICT); + set_error_handler( 'error_handler' ); + function error_handler ($type, $message, $file=__FILE__, $line=__LINE__) { + if ($message == "var: Deprecated. Please use the public/private/protected modifiers") return; + print "<br />\n<b>Strict Standards:</b> Type: <b>$type</b>: $message in <b>$file</b> on line <b>$line</b><br />\n"; + } + // --------- End --------- Also add/change this in AdminSettings.php: // --------- Start --------- @@ -190,6 +202,7 @@ Options: Only applies to new tests, not --rerun-failed-tests --specific-test : Runs only the specified fuzz test. Only applies to new tests, not --rerun-failed-tests + --keep-passed-tests : Saves all test files, even those that pass. --help : Show this help message. Example: @@ -209,7 +222,7 @@ ENDS; $validOptions = array ("quiet", "base-url", "directory", "include-binary", "w3c-validate", "user", "password", "delete-passed-retests", "rerun-failed-tests", "max-errors", - "max-runtime", "specific-test", "help" ); + "max-runtime", "specific-test", "keep-passed-tests", "help" ); if (!empty($options)) { $unknownArgs = array_diff (array_keys($options), $validOptions); foreach ($unknownArgs as $invalidArg) { @@ -278,6 +291,10 @@ define("DB_ERROR_LOG_FILE", $wgDBerrorLog ); // Run in chatty mode (all output, default), or run in quiet mode (only prints out details of failed tests)? define("QUIET", isset($options["quiet"]) ); +// Keep all test files, even those that pass. Potentially useful to tracking input that causes something +// unusual to happen, if you don't know what "unusual" is until later. +define("KEEP_PASSED_TESTS", isset($options["keep-passed-tests"]) ); + // The maximum runtime, if specified. if (!empty($options["max-runtime"]) && intval($options["max-runtime"])>0) { define("MAX_RUNTIME", intval($options["max-runtime"]) ); @@ -371,6 +388,11 @@ class wikiFuzz { "sort" => array("order", "class"), "ref" => array("name"), "categorytree" => array("hideroot", "mode", "style"), + "chemform" => array("link", "wikilink", "query"), + "section" => array("begin", "new"), + + // older MW transclusion. + "transclude" => array("page"), ); // The types of the HTML that we will be testing were defined above @@ -581,7 +603,7 @@ class wikiFuzz { "}}", "{{MSGNW:", "}}", - "{{INT:", + "{{INT:", "}}", '{{SITENAME}}', "{{NS:", @@ -625,6 +647,10 @@ class wikiFuzz { "{{PAGESINNAMESPACE:}}", "{{#language:", "}}", + "{{#special:", + "}}", + "{{#special:emailuser", + "}}", // Some raw link for magic words. "{{NUMBEROFPAGES:R", @@ -641,6 +667,8 @@ class wikiFuzz { "}}", "{{padright:", "}}", + "{{DEFAULTSORT:", + "}}", // internal Math "extension": "<math>", @@ -680,7 +708,7 @@ class wikiFuzz { "<gallery>", "</gallery>", - // FixedImage: + // FixedImage extension. "<fundraising/>", // Timeline extension: currently untested. @@ -691,6 +719,14 @@ class wikiFuzz { // an external image to test the external image displaying code "http://debian.org/Pics/debian.png", + + // LabeledSectionTransclusion extension. + "{{#lstx:", + "}}", + "{{#lst:", + "}}", + "{{#lst:Main Page|", + "}}" ); /** @@ -730,6 +766,8 @@ class wikiFuzz { // "&#" . wikiFuzz::randnum(255) . ";" // Hex version: ? "&#x" . str_pad(dechex(wikiFuzz::randnum(255)), wikiFuzz::randnum(2, 7), "0", STR_PAD_LEFT) . ";" + // A truly binary version: + // ? chr(wikiFuzz::randnum(0,255)) : chr(wikiFuzz::randnum(126,32)); $length = wikiFuzz::randnum(8); @@ -833,6 +871,7 @@ class wikiFuzz { ** 1) Form parameters. ** 2) the URL we are going to test those parameters on. ** 3) Any cookies required for the test. + ** 4) Whether Tidy should validate the page. Defaults to true, but can be turned off. ** Declared abstract because it should be extended by a class ** that supplies these parameters. */ @@ -840,6 +879,7 @@ abstract class pageTest { protected $params; protected $pagePath; protected $cookie = ""; + protected $tidyValidate = true; public function getParams() { return $this->params; @@ -852,6 +892,10 @@ abstract class pageTest { public function getCookie() { return $this->cookie; } + + public function tidyValidate() { + return $this->tidyValidate; + } } @@ -892,7 +936,7 @@ class editPageTest extends pageTest { */ class listusersTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Listusers"; + $this->pagePath = "index.php?title=Special:Listusers"; $this->params = array ( "title" => wikiFuzz::makeFuzz(2), @@ -911,10 +955,10 @@ class listusersTest extends pageTest { */ class searchTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Search"; + $this->pagePath = "index.php?title=Special:Search"; $this->params = array ( - "action" => "index.php/Special:Search", + "action" => "index.php?title=Special:Search", "ns0" => wikiFuzz::makeFuzz(2), "ns1" => wikiFuzz::makeFuzz(2), "ns2" => wikiFuzz::makeFuzz(2), @@ -946,7 +990,7 @@ class searchTest extends pageTest { */ class recentchangesTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Recentchanges"; + $this->pagePath = "index.php?title=Special:Recentchanges"; $this->params = array ( "action" => wikiFuzz::makeFuzz(2), @@ -975,7 +1019,7 @@ class recentchangesTest extends pageTest { */ class prefixindexTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Prefixindex"; + $this->pagePath = "index.php?title=Special:Prefixindex"; $this->params = array ( "title" => "Special:Prefixindex", @@ -1001,10 +1045,10 @@ class prefixindexTest extends pageTest { */ class mimeSearchTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:MIMEsearch"; + $this->pagePath = "index.php?title=Special:MIMEsearch"; $this->params = array ( - "action" => "/wiki/index.php/Special:MIMEsearch", + "action" => "index.php?title=Special:MIMEsearch", "mime" => wikiFuzz::makeFuzz(3), 'limit' => wikiFuzz::chooseInput( array("0", "-1", "-------'------0", "+1", "81342321351235325", wikiFuzz::makeFuzz(2)) ), 'offset' => wikiFuzz::chooseInput( array("0", "-1", "-----'--------0", "+1", "81341231235365252234324", wikiFuzz::makeFuzz(2)) ) @@ -1018,7 +1062,7 @@ class mimeSearchTest extends pageTest { */ class specialLogTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Log"; + $this->pagePath = "index.php?title=Special:Log"; $this->params = array ( "type" => wikiFuzz::chooseInput( array("", wikiFuzz::makeFuzz(2)) ), @@ -1058,7 +1102,7 @@ class successfulUserLoginTest extends pageTest { class userLoginTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Userlogin"; + $this->pagePath = "index.php?title=Special:Userlogin"; $this->params = array ( 'wpRetype' => wikiFuzz::makeFuzz(2), @@ -1088,7 +1132,7 @@ class userLoginTest extends pageTest { */ class ipblocklistTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Ipblocklist"; + $this->pagePath = "index.php?title=Special:Ipblocklist"; $this->params = array ( 'wpUnblockAddress'=> wikiFuzz::makeFuzz(2), @@ -1121,7 +1165,7 @@ class ipblocklistTest extends pageTest { */ class newImagesTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Newimages"; + $this->pagePath = "index.php?title=Special:Newimages"; $this->params = array ( 'hidebots' => wikiFuzz::chooseInput( array(wikiFuzz::makeFuzz(2), "1", "", "-1") ), @@ -1142,7 +1186,7 @@ class newImagesTest extends pageTest { */ class imagelistTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Imagelist"; + $this->pagePath = "index.php?title=Special:Imagelist"; $this->params = array ( 'sort' => wikiFuzz::chooseInput( array("bysize", "byname" , "bydate", wikiFuzz::makeFuzz(2)) ), @@ -1159,7 +1203,7 @@ class imagelistTest extends pageTest { */ class specialExportTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Export"; + $this->pagePath = "index.php?title=Special:Export"; $this->params = array ( 'action' => wikiFuzz::chooseInput( array("submit", "", wikiFuzz::makeFuzz(2)) ), @@ -1175,6 +1219,9 @@ class specialExportTest extends pageTest { // Sometimes remove the history field. if (wikiFuzz::randnum(2) == 0) unset($this->params["history"]); + + // page does not produce HTML. + $this->tidyValidate = false; } } @@ -1184,7 +1231,7 @@ class specialExportTest extends pageTest { */ class specialBooksourcesTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Booksources"; + $this->pagePath = "index.php?title=Special:Booksources"; $this->params = array ( 'go' => wikiFuzz::makeFuzz(2), @@ -1236,10 +1283,10 @@ class pageHistoryTest extends pageTest { */ class contributionsTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Contributions/" . USER_ON_WIKI; + $this->pagePath = "index.php?title=Special:Contributions/" . USER_ON_WIKI; $this->params = array ( - 'target' => wikiFuzz::chooseInput( array(wikiFuzz::makeFuzz(2), "newbies") ), + 'target' => wikiFuzz::chooseInput( array(wikiFuzz::makeFuzz(2), "newbies", USER_ON_WIKI) ), 'namespace' => wikiFuzz::chooseInput( array(-1, 15, 1, wikiFuzz::makeFuzz(2)) ), 'offset' => wikiFuzz::chooseInput( array("0", "-1", "------'-------0", "+1", "982342131232131231241", wikiFuzz::makeFuzz(2)) ), 'bot' => wikiFuzz::chooseInput( array("", "-1", "0", "1", wikiFuzz::makeFuzz(2)) ), @@ -1254,7 +1301,7 @@ class contributionsTest extends pageTest { */ class viewPageTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Main_Page"; + $this->pagePath = "index.php?title=Main_Page"; $this->params = array ( "useskin" => wikiFuzz::chooseInput( array("chick", "cologneblue", "myskin", @@ -1298,8 +1345,8 @@ 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"]); + if ($this->params["feed"] == "atom") { unset($this->params["feed"]); } + else if ($this->params["feed"] == "rss") { unset($this->params["feed"]); } // Raw pages cannot really be validated if ($this->params["action"] == "raw") unset($this->params["action"]); @@ -1335,7 +1382,7 @@ class specialAllmessagesTest extends pageTest { */ class specialNewpages extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Newpages"; + $this->pagePath = "index.php?title=Special:Newpages"; $this->params = array ( "namespace" => wikiFuzz::chooseInput( range(-1, 15) ), @@ -1345,8 +1392,8 @@ 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"]); + if ($this->params["feed"] == "atom") { unset($this->params["feed"]); } + else if ($this->params["feed"] == "rss") { unset($this->params["feed"]); } } } @@ -1533,7 +1580,7 @@ class specialLockdb extends pageTest { */ class specialUserrights extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Userrights"; + $this->pagePath = "index.php?title=Special:Userrights"; $this->params = array ( 'wpEditToken' => wikiFuzz::chooseInput( array("20398702394", "", wikiFuzz::makeFuzz(2)) ), @@ -1580,7 +1627,7 @@ class pageProtectionForm extends pageTest { */ class specialBlockip extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Blockip"; + $this->pagePath = "index.php?title=Special:Blockip"; $this->params = array ( "action" => wikiFuzz::chooseInput( array("submit", "", wikiFuzz::makeFuzz(2)) ), @@ -1619,7 +1666,7 @@ class specialBlockip extends pageTest { */ class imagepageTest extends pageTest { function __construct() { - $this->pagePath = "index.php/Image:Small-email.png"; + $this->pagePath = "index.php?title=Image:Small-email.png"; $this->params = array ( "image" => wikiFuzz::chooseInput( array("Small-email.png", wikifuzz::makeFuzz(2)) ), @@ -1695,7 +1742,7 @@ class specialRevisionDelete extends pageTest { */ class specialImport extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Import"; + $this->pagePath = "index.php?title=Special:Import"; $this->params = array ( "action" => "submit", @@ -1722,7 +1769,6 @@ class specialImport extends pageTest { } - /** ** a test for thumb.php */ @@ -1762,6 +1808,9 @@ class trackbackTest extends pageTest { // sometimes we don't want to specify certain parameters. if (wikiFuzz::randnum(3) == 0) unset($this->params["title"]); if (wikiFuzz::randnum(3) == 0) unset($this->params["excerpt"]); + + // page does not produce HTML. + $this->tidyValidate = false; } } @@ -1810,7 +1859,7 @@ class specialCite extends pageTest { */ class specialFilepath extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Filepath"; + $this->pagePath = "index.php?title=Special:Filepath"; $this->params = array ( "file" => wikiFuzz::chooseInput( array("Small-email.png", "Small-email.png" . wikifuzz::makeFuzz(1), wikiFuzz::makeFuzz(2)) ), @@ -1824,7 +1873,7 @@ class specialFilepath extends pageTest { */ class specialMakebot extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Makebot"; + $this->pagePath = "index.php?title=Special:Makebot"; $this->params = array ( "username" => wikiFuzz::chooseInput( array("Nickj2", "192.168.0.2", wikifuzz::makeFuzz(1) ) ), @@ -1847,7 +1896,7 @@ class specialMakebot extends pageTest { */ class specialMakesysop extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Makesysop"; + $this->pagePath = "index.php?title=Special:Makesysop"; $this->params = array ( "wpMakesysopUser" => wikiFuzz::chooseInput( array("Nickj2", "192.168.0.2", wikifuzz::makeFuzz(1) ) ), @@ -1870,7 +1919,7 @@ class specialMakesysop extends pageTest { */ class specialRenameuser extends pageTest { function __construct() { - $this->pagePath = "index.php/Special:Renameuser"; + $this->pagePath = "index.php?title=Special:Renameuser"; $this->params = array ( "oldusername" => wikiFuzz::chooseInput( array("Nickj2", "192.168.0.2", wikifuzz::makeFuzz(1) ) ), @@ -1910,7 +1959,7 @@ class specialCategoryTree extends pageTest { "from" => wikifuzz::makeFuzz(2), "until" => wikifuzz::makeFuzz(2), "showas" => wikifuzz::makeFuzz(2), - "mode" => wikiFuzz::chooseInput( array("pages", "categories", "all", wikifuzz::makeFuzz(2)) ), + "mode" => wikiFuzz::chooseInput( array("pages", "categories", "all", wikifuzz::makeFuzz(2)) ), ); // sometimes we do want to specify certain parameters. @@ -1919,6 +1968,239 @@ class specialCategoryTree extends pageTest { } +/** + ** a test for "Special:Chemicalsources" (extension Special page). + */ +class specialChemicalsourcesTest extends pageTest { + function __construct() { + $this->pagePath = "index.php?title=Special:Chemicalsources"; + + // choose an input format to use. + $format = wikiFuzz::chooseInput( + array( 'go', + 'CAS', + 'EINECS', + 'CHEBI', + 'PubChem', + 'SMILES', + 'InChI', + 'ATCCode', + 'KEGG', + 'RTECS', + 'ECNumber', + 'DrugBank', + 'Formula', + 'Name' + ) + ); + + // values for different formats usually start with either letters or numbers. + switch ($format) { + case 'Name' : $value = "A"; break; + case 'InChI' : + case 'SMILES' : + case 'Formula': $value = "C"; break; + default : $value = "0"; break; + } + + // and then we append the fuzz input. + $this->params = array ($format => $value . wikifuzz::makeFuzz(2) ); + } +} + + +/** + ** A test for api.php (programmatic interface to MediaWiki in XML/JSON/RSS/etc formats). + ** Quite involved to test because there are lots of options/parameters, and because + ** for a lot of the functionality if all the parameters don't make sense then it just + ** returns the help screen - so currently a lot of the tests aren't actually doing much + ** because something wasn't right in the query. + ** + ** @todo: Incomplete / unfinished; Runs too fast (suggests not much testing going on). + */ +class api extends pageTest { + + // API login mode. + private static function loginMode() { + $arr = array ( "lgname" => wikifuzz::makeFuzz(2), + "lgpassword" => wikifuzz::makeFuzz(2), + ); + // sometimes we want to specify the extra "lgdomain" parameter. + if (wikiFuzz::randnum(3) == 0) { + $arr["lgdomain"] = wikiFuzz::chooseInput( array("1", 0, "", wikiFuzz::makeFuzz(2)) ); + } + + return $arr; + } + + // API OpenSearch mode. + private static function opensearchMode() { + return array ("search" => wikifuzz::makeFuzz(2)); + } + + // API watchlist feed mode. + private static function feedwatchlistMode() { + // 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? + // Suspect this will stuff up the tests more, but need to check. + $params = array ( + // FIXME: More titles. + "titles" => wikiFuzz::chooseInput( array("Main Page")), + // FIXME: More pageids. + "pageids" => 1, + "prop" => wikiFuzz::chooseInput( array("info", "revisions", "watchlist")), + "list" => wikiFuzz::chooseInput( array("allpages", "logevents", "watchlist", "usercontribs", "recentchanges", "backlinks", "embeddedin", "imagelinks") ), + "meta" => wikiFuzz::chooseInput( array("siteinfo")), + "generator" => wikiFuzz::chooseInput( array("allpages", "logevents", "watchlist", "info", "revisions") ), + "siprop" => wikiFuzz::chooseInput( array("general", "namespaces", "general|namespaces") ), + ); + + // Add extra parameters based on what list choice we got. + switch ($params["list"]) { + case "usercontribs" : self::addListParams ($params, "uc", array("limit", "start", "end", "user", "dir") ); break; + case "allpages" : self::addListParams ($params, "ap", array("from", "prefix", "namespace", "filterredir", "limit") ); break; + case "watchlist" : self::addListParams ($params, "wl", array("allrev", "start", "end", "namespace", "dir", "limit", "prop") ); break; + case "logevents" : self::addListParams ($params, "le", array("limit", "type", "start", "end", "user", "dir") ); break; + case "recentchanges": self::addListParams ($params, "rc", array("limit", "prop", "show", "namespace", "start", "end", "dir") ); break; + case "backlinks" : self::addListParams ($params, "bl", array("continue", "namespace", "redirect", "limit") ); break; + case "embeddedin" : self::addListParams ($params, "ei", array("continue", "namespace", "redirect", "limit") ); break; + case "imagelinks" : self::addListParams ($params, "il", array("continue", "namespace", "redirect", "limit") ); break; + } + + if ($params["prop"] == "revisions") { + self::addListParams ($params, "rv", array("prop", "limit", "startid", "endid", "end", "dir") ); + } + + // Sometimes we want redirects, sometimes we don't. + if (wikiFuzz::randnum(3) == 0) { + $params["redirects"] = wikiFuzz::chooseInput( array("1", 0, "", wikiFuzz::makeFuzz(2)) ); + } + + return $params; + } + + // Adds all the elements to the array, using the specified prefix. + private static function addListParams(&$array, $prefix, $elements) { + foreach ($elements as $element) { + $array[$prefix . $element] = self::getParamDetails($element); + } + } + + // For a given element name, returns the data for that element. + private static function getParamDetails($element) { + switch ($element) { + case 'startid' : + case 'endid' : + case 'start' : + case 'end' : + case 'limit' : return wikiFuzz::chooseInput( array("0", "-1", "---'----------0", "+1", "8134", "320742734234235", "20060230121212", wikiFuzz::randnum(9000, -100), wikiFuzz::makeFuzz(2)) ); + case 'dir' : return wikiFuzz::chooseInput( array("newer", "older", wikifuzz::makeFuzz(2) ) ); + case 'user' : return wikiFuzz::chooseInput( array(USER_ON_WIKI, wikifuzz::makeFuzz(2) ) ); + case 'namespace' : return wikiFuzz::chooseInput( array(-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 200000, wikifuzz::makeFuzz(2)) ); + case 'filterredir': return wikiFuzz::chooseInput( array("all", "redirects", "nonredirectsallpages", wikifuzz::makeFuzz(2)) ); + case 'allrev' : return wikiFuzz::chooseInput( array("1", 0, "", wikiFuzz::makeFuzz(2)) ); + case 'prop' : return wikiFuzz::chooseInput( array("user", "comment", "timestamp", "patrol", "flags", "user|user|comment|flags", wikifuzz::makeFuzz(2) ) ); + case 'type' : return wikiFuzz::chooseInput( array("block", "protect", "rights", "delete", "upload", "move", "import", "renameuser", "newusers", "makebot", wikifuzz::makeFuzz(2) ) ); + case 'hide' : return wikiFuzz::chooseInput( array("minor", "bots", "anons", "liu", "liu|bots|", wikifuzz::makeFuzz(2) ) ); + case 'show' : return wikiFuzz::chooseInput( array('minor', '!minor', 'bot', '!bot', 'anon', '!anon', wikifuzz::makeFuzz(2) ) ); + default : return wikifuzz::makeFuzz(2); + } + } + + // Entry point. + function __construct() { + $this->pagePath = "api.php"; + + $modes = array ("help", + "login", + "opensearch", + "feedwatchlist", + "query"); + $action = wikiFuzz::chooseInput( array_merge ($modes, array(wikifuzz::makeFuzz(2))) ); + + switch ($action) { + case "login" : $this->params = self::loginMode(); + break; + case "opensearch" : $this->params = self::opensearchMode(); + break; + case "feedwatchlist" : $this->params = self::feedwatchlistMode(); + break; + case "query" : $this->params = self::queryMode(); + break; + case "help" : + default : // Do something random - "Crazy Ivan" mode. + $random_mode = wikiFuzz::chooseInput( $modes ) . "Mode"; + // There is no "helpMode". + if ($random_mode == "helpMode") $random_mode = "queryMode"; + $this->params = self::$random_mode(); + break; + } + + // Save the selected action. + $this->params["action"] = $action; + + // Set the cookie: + // 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 + $this->params["format"] = wikiFuzz::chooseInput( array("json", "jsonfm", "php", "phpfm", + "wddx", "wddxfm", "xml", "xmlfm", + "yaml", "yamlfm", "raw", "rawfm", + wikifuzz::makeFuzz(2) ) ); + + // Page does not produce HTML (sometimes). + $this->tidyValidate = false; + } +} + + +/** + ** a page test for the GeSHi extension. + */ +class GeSHi_Test extends pageTest { + + private function getGeSHiContent() { + 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)) ) + . ">" + . wikiFuzz::makeFuzz(2) + . "</source>"; + } + + private function getLang() { + return wikiFuzz::chooseInput( array( "actionscript", "ada", "apache", "applescript", "asm", "asp", "autoit", "bash", "blitzbasic", "bnf", "c", "c_mac", "caddcl", "cadlisp", "cfdg", "cfm", "cpp", "cpp-qt", + "csharp", "css", "d", "delphi", "diff", "div", "dos", "eiffel", "fortran", "freebasic", "gml", "groovy", "html4strict", "idl", "ini", "inno", "io", "java", "java5", + "javascript", "latex", "lisp", "lua", "matlab", "mirc", "mpasm", "mysql", "nsis", "objc", "ocaml", "ocaml-brief", "oobas", "oracle8", "pascal", "perl", "php", + "php-brief", "plsql", "python", "qbasic", "rails", "reg", "robots", "ruby", "sas", "scheme", "sdlbasic", "smalltalk", "smarty", "sql", "tcl", "text", "thinbasic", + "tsql", "vb", "vbnet", "vhdl", "visualfoxpro", "winbatch", "xml", "xpp", "z80", wikifuzz::makeFuzz(1) ) ); + } + + function __construct() { + $this->pagePath = "index.php?title=WIKIFUZZ"; + + $this->params = array ( + "action" => "submit", + "wpMinoredit" => "test", + "wpPreview" => "test", + "wpSection" => "test", + "wpEdittime" => "test", + "wpSummary" => "test", + "wpScrolltop" => "test", + "wpStarttime" => "test", + "wpAutoSummary" => "test", + "wpTextbox1" => $this->getGeSHiContent() // the main wiki text, contains fake GeSHi content. + ); + } +} + /** ** selects a page test to run. @@ -1979,6 +2261,8 @@ function selectPageTest($count) { case 42: return new specialRenameuser(); case 43: return new specialLinksearch(); case 44: return new specialCategoryTree(); + case 45: return new api(); + case 45: return new specialChemicalsourcesTest(); default: return new editPageTest(); } } @@ -2001,7 +2285,7 @@ function saveFile($data, $name) { */ function getAsURL(pageTest $test) { $used_question_mark = (strpos($test->getPagePath(), "?") !== false); - $retval = "http://get-to-post.nickj.org/?http://" . WIKI_BASE_URL . $test->getPagePath(); + $retval = "http://get-to-post.nickj.org/?" . WIKI_BASE_URL . $test->getPagePath(); foreach ($test->getParams() as $param => $value) { if (!$used_question_mark) { $retval .= "?"; @@ -2253,10 +2537,12 @@ function runWikiTest(pageTest $test, &$testname, $can_overwrite = false) { saveFile($wiki_preview, $html_file); // if there were PHP errors in the output, then that's interesting too. - if ( strpos($wiki_preview, "<b>Warning</b>: " ) !== false - || strpos($wiki_preview, "<b>Fatal error</b>: ") !== false - || strpos($wiki_preview, "<b>Notice</b>: " ) !== false - || strpos($wiki_preview, "<b>Error</b>: " ) !== false ) { + if ( strpos($wiki_preview, "<b>Warning</b>: " ) !== false + || strpos($wiki_preview, "<b>Fatal error</b>: " ) !== false + || strpos($wiki_preview, "<b>Notice</b>: " ) !== false + || strpos($wiki_preview, "<b>Error</b>: " ) !== false + || strpos($wiki_preview, "<b>Strict Standards:</b>") !== false + ) { $error = substr($wiki_preview, strpos($wiki_preview, "</b>:") + 7, 50); // Avoid probable PHP bug with bad session ids; http://bugs.php.net/bug.php?id=38224 if ($error != "Unknown: The session id contains illegal character") { @@ -2266,32 +2552,32 @@ function runWikiTest(pageTest $test, &$testname, $can_overwrite = false) { } // if there was a MediaWiki Backtrace message in the output, then that's also interesting. - if (strpos($wiki_preview, "Backtrace:") !== false) { + if( strpos($wiki_preview, "Backtrace:") !== false ) { print "\nInternal MediaWiki error in HTML output: $html_file"; return false; } // if there was a Parser error comment in the output, then that's potentially interesting. - if (strpos($wiki_preview, "!-- ERR") !== false) { + if( strpos($wiki_preview, "!-- ERR") !== false ) { print "\nParser Error comment in HTML output: $html_file"; return false; } // if a database error was logged, then that's definitely interesting. - if (dbErrorLogged()) { + if( dbErrorLogged() ) { print "\nDatabase Error logged for: $filename"; return false; } // validate result $valid = true; - if (VALIDATE_ON_WEB) { + if( VALIDATE_ON_WEB ) { list ($valid, $validator_output) = validateHTML($wiki_preview); if (!$valid) print "\nW3C web validation failed - view details with: html2text " . DIRECTORY . "/" . $testname . ".validator_output.html"; } - // Get tidy to check the page, unless it is a test which produces XML. - if (!$test instanceof trackbackTest && !$test instanceof specialExportTest) { + // Get tidy to check the page, unless we already know it produces non-XHTML output. + if( $test->tidyValidate() ) { $valid = tidyCheckFile( $testname . HTML_FILE ) && $valid; } @@ -2397,14 +2683,13 @@ else if (RERUN_OLD_TESTS) { rerunPreviousTests(); } -// seed the random number generator -mt_srand(crc32(microtime())); - // main loop. $start_time = date("U"); $num_errors = 0; -if (!QUIET) print "Beginning main loop. Results are stored in the " . DIRECTORY . " directory.\n"; -if (!QUIET) print "Press CTRL+C to stop testing.\n"; +if (!QUIET) { + print "Beginning main loop. Results are stored in the " . DIRECTORY . " directory.\n"; + print "Press CTRL+C to stop testing.\n"; +} for ($count=0; true; $count++) { if (!QUIET) { @@ -2434,7 +2719,7 @@ for ($count=0; true; $count++) { $valid = runWikiTest($test, $testname, false); // save the failed test - if (!$valid) { + if ( ! $valid ) { if (QUIET) { print "\nTest: " . get_class($test) . " ; Testname: $testname\n------"; } else { @@ -2442,6 +2727,10 @@ for ($count=0; true; $count++) { } saveTest($test, $testname); $num_errors += 1; + } else if ( 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); } // stop if we have reached max number of errors. |