<?php if (!defined('HTMLPurifierTest')) { echo "Invalid entry point\n"; exit; } // setup our own autoload, checking for HTMLPurifier library if spl_autoload_register // is not allowed function __autoload($class) { if (!function_exists('spl_autoload_register')) { if (HTMLPurifier_Bootstrap::autoload($class)) return true; if (HTMLPurifierExtras::autoload($class)) return true; } require str_replace('_', '/', $class) . '.php'; return true; } if (function_exists('spl_autoload_register')) { spl_autoload_register('__autoload'); } // default settings (protect against register_globals) $GLOBALS['HTMLPurifierTest'] = array(); $GLOBALS['HTMLPurifierTest']['PEAR'] = false; // do PEAR tests $GLOBALS['HTMLPurifierTest']['PHPT'] = true; // do PHPT tests $GLOBALS['HTMLPurifierTest']['PH5P'] = class_exists('DOMDocument'); // default library settings $simpletest_location = 'simpletest/'; // reasonable guess $csstidy_location = false; $versions_to_test = array(); $php = 'php'; $phpv = 'phpv'; // load configuration if (file_exists('../conf/test-settings.php')) include '../conf/test-settings.php'; elseif (file_exists('../test-settings.php')) include '../test-settings.php'; else { throw new Exception('Please create a test-settings.php file by copying test-settings.sample.php and configuring accordingly'); } // load SimpleTest require_once $simpletest_location . 'unit_tester.php'; require_once $simpletest_location . 'reporter.php'; require_once $simpletest_location . 'mock_objects.php'; require_once $simpletest_location . 'xml.php'; require_once $simpletest_location . 'remote.php'; // load CSS Tidy if ($csstidy_location !== false) { $old = error_reporting(E_ALL); require $csstidy_location . 'class.csstidy.php'; error_reporting($old); } // load PEAR to include path if ( is_string($GLOBALS['HTMLPurifierTest']['PEAR']) ) { // if PEAR is true, there's no need to add it to the path set_include_path($GLOBALS['HTMLPurifierTest']['PEAR'] . PATH_SEPARATOR . get_include_path()); } // after external libraries are loaded, turn on compile time errors error_reporting(E_ALL | E_STRICT); // initialize extra HTML Purifier libraries require '../extras/HTMLPurifierExtras.auto.php'; // load SimpleTest addon functions require 'generate_mock_once.func.php'; require 'path2class.func.php'; /** * Arguments parser, is cli and web agnostic. * @warning * There are some quirks about the argument format: * - Short boolean flags cannot be chained together * - Only strings, integers and booleans are accepted * @param $AC * Arguments array to populate. This takes a simple format of 'argument' * => default value. Depending on the type of the default value, * arguments will be typecast accordingly. For example, if * 'flag' => false is passed, all arguments for that will be cast to * boolean. Do *not* pass null, as it will not be recognized. * @param $aliases * */ function htmlpurifier_parse_args(&$AC, $aliases) { if (empty($_GET) && !empty($_SERVER['argv'])) { array_shift($_SERVER['argv']); $o = false; $bool = false; $val_is_bool = false; foreach ($_SERVER['argv'] as $opt) { if ($o !== false) { $v = $opt; } else { if ($opt === '') continue; if (strlen($opt) > 2 && strncmp($opt, '--', 2) === 0) { $o = substr($opt, 2); } elseif ($opt[0] == '-') { $o = substr($opt, 1); } else { $lopt = strtolower($opt); if ($bool !== false && ($opt === '0' || $lopt === 'off' || $lopt === 'no')) { $o = $bool; $v = false; $val_is_bool = true; } elseif (isset($aliases[''])) { $o = $aliases['']; } } $bool = false; if (!isset($AC[$o]) || !is_bool($AC[$o])) { if (strpos($o, '=') === false) { continue; } list($o, $v) = explode('=', $o); } elseif (!$val_is_bool) { $v = true; $bool = $o; } $val_is_bool = false; } if ($o === false) continue; htmlpurifier_args($AC, $aliases, $o, $v); $o = false; } } else { foreach ($_GET as $o => $v) { if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { $v = stripslashes($v); } htmlpurifier_args($AC, $aliases, $o, $v); } } } /** * Actually performs assignment to $AC, see htmlpurifier_parse_args() * @param $AC Arguments array to write to * @param $aliases Aliases for options * @param $o Argument name * @param $v Argument value */ function htmlpurifier_args(&$AC, $aliases, $o, $v) { if (isset($aliases[$o])) $o = $aliases[$o]; if (!isset($AC[$o])) return; if (is_string($AC[$o])) $AC[$o] = $v; if (is_bool($AC[$o])) $AC[$o] = ($v === '') ? true :(bool) $v; if (is_int($AC[$o])) $AC[$o] = (int) $v; } /** * Adds a test-class; we use file extension to determine which class to use. */ function htmlpurifier_add_test($test, $test_file, $only_phpt = false) { switch (strrchr($test_file, ".")) { case '.phpt': return $test->add(new PHPT_Controller_SimpleTest($test_file)); case '.php': require_once $test_file; return $test->add(path2class($test_file)); case '.vtest': return $test->add(new HTMLPurifier_ConfigSchema_ValidatorTestCase($test_file)); case '.htmlt': return $test->add(new HTMLPurifier_HTMLT($test_file)); default: trigger_error("$test_file is an invalid file for testing", E_USER_ERROR); } } /** * Debugging function that prints tokens in a user-friendly manner. */ function printTokens($tokens, $index = null) { $string = '<pre>'; $generator = new HTMLPurifier_Generator(HTMLPurifier_Config::createDefault(), new HTMLPurifier_Context); foreach ($tokens as $i => $token) { if ($index === $i) $string .= '[<strong>'; $string .= "<sup>$i</sup>"; $string .= $generator->escape($generator->generateFromToken($token)); if ($index === $i) $string .= '</strong>]'; } $string .= '</pre>'; echo $string; } /** * Convenient "insta-fail" test-case to add if any outside things fail */ class FailedTest extends UnitTestCase { protected $msg, $details; public function __construct($msg, $details = null) { $this->msg = $msg; $this->details = $details; } public function test() { $this->fail($this->msg); if ($this->details) $this->reporter->paintFormattedMessage($this->details); } } /** * Flushes all caches, and fatally errors out if there's a problem. */ function htmlpurifier_flush($php, $reporter) { exec($php . ' ../maintenance/flush.php ' . $php . ' 2>&1', $out, $status); if ($status) { $test = new FailedTest( 'maintenance/flush.php returned non-zero exit status', wordwrap(implode("\n", $out), 80) ); $test->run($reporter); exit(1); } } /** * Dumps error queue, useful if there has been a fatal error. */ function htmlpurifier_dump_error_queue() { $context = SimpleTest::getContext(); $queue = $context->get('SimpleErrorQueue'); while (($error = $queue->extract()) !== false) { var_dump($error); } } register_shutdown_function('htmlpurifier_dump_error_queue'); // vim: et sw=4 sts=4