diff options
author | Stig Bakken <ssb@php.net> | 2000-08-27 19:46:06 +0000 |
---|---|---|
committer | Stig Bakken <ssb@php.net> | 2000-08-27 19:46:06 +0000 |
commit | 315f4f5658cf22a17ba06fa2ca2f3d890355873f (patch) | |
tree | 3dd1134c1d1c3821b48fab806884123f09b2d21f /run-tests.php | |
parent | 7eeda99a055df5a510d3d20526e9adcb42fecdb0 (diff) | |
download | php-git-315f4f5658cf22a17ba06fa2ca2f3d890355873f.tar.gz |
@PHP 3 regression testing framework re-born (Stig)
Took the old PHP 3 regression testing framework and rewrote it in PHP.
Should work on both Windows and UNIX, however I have not tested it on
Windows. See tests/README for how to write tests. Added the PHP 3
tests and converted most of them.
Diffstat (limited to 'run-tests.php')
-rwxr-xr-x | run-tests.php | 427 |
1 files changed, 427 insertions, 0 deletions
diff --git a/run-tests.php b/run-tests.php new file mode 100755 index 0000000000..b80c4b72b3 --- /dev/null +++ b/run-tests.php @@ -0,0 +1,427 @@ +<?php + +define('TEST_PASSED', 0); +define('TEST_FAILED', -1); +define('TEST_SKIPPED', -2); +define('TEST_INTERNAL_ERROR', -3); + +initialize(); +$opts = parse_options(&$argc, &$argv); +if ($opts['help']) { + usage(); + exit; +} +do_testing($argc, &$argv); + +exit; + +/*****************************************************************************/ + +function usage() { + writeln("Usage: run-tests.php [-d] [-h] [dir|file...]"); +} + +/* + * Please use write() and writeln() for all screen output. + * This makes it easier to convert to HTML output later. + */ + +function write($str) { + global $term_bold, $term_norm; + $str = str_replace("%b", $term_bold, $str); + $str = str_replace("%B", $term_norm, $str); + print $str; +} + +function writeln($str) { + write("$str\n"); +} + +function initialize() { + global $term, $windows_p, $php, $skip, $testdirs, $tmpfile, + $skipped, $failed, $passed, $total, $term_bold, $term_norm, + $tests_in_dir; + + // XXX Should support HTML output as well. + $term = getenv("TERM"); + if (preg_match('/^(xterm|vt220)/', $term)) { + $term_bold = sprintf("%c%c%c%c", 27, 91, 49, 109); + $term_norm = sprintf("%c%c%c", 27, 91, 109); + } elseif (preg_match('/^vt100/', $term)) { + $term_bold = sprintf("%c%c%c%c", 27, 91, 49, 109); + $term_norm = sprintf("%c%c%c", 27, 91, 109); + } else { + $term_bold = $term_norm = ""; + } + + $windows_p = (substr(php_uname(), 0, 7) == "Windows"); + if ($windows_p) { + $php = "./php.exe"; + } else { + $php = "./php"; + } + + if (!is_executable($php)) { + writeln("PHP CGI binary ($php) not executable."); + writeln("Please compile PHP as a CGI executable and try again."); + exit; + } + + $skip = array( + "CVS" => 1 + ); + $testdirs = array(); + $tmpfile = array(); + $tests_in_dir = array(); + + register_shutdown_function("delete_tmpfiles"); + + $skipped = $failed = $passed = $total = 0; +} + +function &parse_options(&$argc, &$argv) { + $options = array(); + while ($argc > 0 && ($opt = substr($argv[0], 0, 2)) == "--") { + $opt = array_shift($argv); + $argc--; + if ($arg == "--") { + return $options; + } + if (preg_match('/^--([^=]+)=(.*)$/', $opt, $matches)) { + $opt = $matches[1]; + $arg = $matches[2]; + } else { + $arg = true; + } + $options[$opt] = $arg; + } + return $options; +} + +function do_testing($argc, $argv) { + global $term, $windows_p, $php, $skip, $testdirs, $tmpfile, $opts, + $skipped, $failed, $passed, $total, $term_bold, $term_norm; + + if ($argc > 0) { + if (is_dir($argv[0])) { + $dir = $argv[0]; + } else { + for ($i = 0; $i < $argc; $i++) { + switch (run_test($argv[$i])) { + case TEST_SKIPPED: + case TEST_INTERNAL_ERROR: + $skipped++; + break; + case TEST_FAILED: + $failed++; + break; + case TEST_PASSED: + $passed++; + break; + } + $total++; + } + } + } else { + $dir = "."; + } + + if ($dir) { + find_testdirs($dir); + for ($i = 0; $i < sizeof($testdirs); $i++) { + run_tests_in_dir($testdirs[$i]); + } + } + + if ($total == 0) { + writeln("No tests were run."); + return; + } + + $total_d = (double)$total; + $passed_p = 100 * ($passed / $total_d); + $failed_p = 100 * ($failed / $total_d); + $skipped_p = 100 * ($skipped / $total_d); + $passed_pstr = sprintf($passed_p < 10.0 ? "%1.1f" : "%3.0f", $passed_p); + $failed_pstr = sprintf($failed_p < 10.0 ? "%1.1f" : "%3.0f", $failed_p); + $skipped_pstr = sprintf($skipped_p < 10.0 ? "%1.1f" : "%3.0f", $skipped_p); + + writeln("TEST RESULT SUMMARY"); + writeln("============================="); + writeln(sprintf("Number of tests: %4d", $total)); + writeln(sprintf("Tests skipped: %4d (%s%%)", $skipped, $skipped_pstr)); + writeln(sprintf("Tests failed: %4d (%s%%)", $failed, $failed_pstr)); + writeln(sprintf("Tests passed: %4d (%s%%)", $passed, $passed_pstr)); +} + +function find_testdirs($dir = '.', $first_pass = true) { + global $testdirs, $skip; + + if ($first_pass && is_dir($dir)) { + $testdirs[] = $dir; + } + $dp = @opendir($dir); + if (!$dp) { + print "Warning: could not open directory $dir\n"; + return false; + } + while ($ent = readdir($dp)) { + $path = "$dir/$ent"; + if ($skip[$ent] || substr($ent, 0, 1) == "." || !is_dir($path)) { + continue; + } + if (strstr("/$path/", "/tests/")) { + $testdirs[] = $path; + } + find_testdirs($path, false); + } + closedir($dp); +} + +function run_tests_in_dir($dir = '.') { + global $skip, $skipped, $failed, $passed, $total, $opts, $tests_in_dir; + $dp = opendir($dir); + if (!$dp) { + print "Warning: could not run tests in $dir\n"; + return false; + } + $testfiles = array(); + while ($ent = readdir($dp)) { + if ($skip[$ent] || substr($ent, 0, 1) == "." || substr($ent, -5) != ".phpt") { + continue; + } + $testfiles[] = "$dir/$ent"; + $tests_in_dir[$dir]++; + } + closedir($dp); + if ($tests_in_dir[$dir] == 0) { + return true; + } + $oskipped = $skipped; + writeln("%bRunning tests in $dir%B"); + writeln("=================".str_repeat("=", strlen($dir))); + sort($testfiles); + for ($i = 0; $i < sizeof($testfiles); $i++) { + switch (run_test($testfiles[$i])) { + case TEST_SKIPPED: + case TEST_INTERNAL_ERROR: + $skipped++; + break; + case TEST_FAILED: + $failed++; + break; + case TEST_PASSED: + $passed++; + break; + } + $total++; + } + if ($oskipped + $tests_in_dir[$dir] == $skipped) { + writeln("(all skipped)"); + } + writeln(""); + return true; +} + +function skip_headers($fp) { + while (!feof($fp)) { + if (trim(fgets($fp, 1024)) == "") { + break; + } + } +} + +function delete_tmpfiles() { + global $tmpfile; + reset($tmpfile); + while (list($k, $v) = each($tmpfile)) { + if (file_exists($v)) { + //print "unlink($v): "; var_dump(unlink($v)); + unlink($v); + } + } +} + +/** + * Compares two files, ignoring blank lines. + * + * @param $file1 string name of first file to compare + * @param $file2 string name of second file to compare + * + * @return bool whether the files were "equal" + */ +function compare_results($file1, $file2) { + if (!($fp1 = @fopen($file1, "r")) || !($fp2 = @fopen($file2, "r"))) { + return false; + } + while (!(feof($fp1) || feof($fp2))) { + if (!feof($fp1) && trim($line1 = fgets($fp1, 10240)) != "") { + $data1 .= $line1; + } + if (!feof($fp2) && trim($line2 = fgets($fp2, 10240)) != "") { + $data2 .= $line2; + } + } + fclose($fp1); + fclose($fp2); + if (trim($data1) != trim($data2)) { + //print "data1=";var_dump($data1); + //print "data2=";var_dump($data2); + return false; + } + return true; +} + +function run_test($file) { + global $php, $tmpfile, $term_bold, $term_norm; + + $variables = array("TEST", "POST", "GET", "FILE", "EXPECT", "SKIPIF", + "OUTPUT"); + $fp = @fopen($file, "r"); + if (!$fp) { + return TEST_INTERNAL_ERROR; + } + $tmpdir = dirname($file); + $tmpfix = "phpt."; + $tmpfile["FILE"] = tempnam($tmpdir, $tmpfix); + $tmpfile["SKIPIF"] = tempnam($tmpdir, $tmpfix); + $tmpfile["POST"] = tempnam($tmpdir, $tmpfix); + $tmpfile["EXPECT"] = tempnam($tmpdir, $tmpfix); + $tmpfile["OUTPUT"] = tempnam($tmpdir, $tmpfix); + + while ($line = fgets($fp, 4096)) { + if (preg_match('/^--([A-Z]+)--$/', $line, $matches)) { + $var = $matches[1]; + if ($tmpfile[$var]) { + $fps[$var] = @fopen($tmpfile[$var], "w"); + } else { + $$var = ''; + } + } else { + if ($var) { + if ($var == "POST") { + $line = trim($line); + } + if ($fps[$var]) { + fwrite($fps[$var], $line); + } else { + $$var .= $line; + } + } + } + } + reset($fps); + while (list($k, $v) = each($fps)) { + if (is_resource($v)) { + fclose($v); + } + } + putenv("PHP_TEST=1"); + putenv("REDIRECT_STATUS=1"); + putenv("CONTENT_LENGTH="); + putenv("QUERY_STRING=$GET"); + if (isset($fps["SKIPIF"])) { + $tmpfile["SKIPIF_OUTPUT"] = tempnam($tmpdir, $tmpfix); + putenv("REQUEST_METHOD=GET"); + putenv("CONTENT_TYPE="); + putenv("PATH_TRANSLATED=$tmpfile[SKIPIF]"); + putenv("SCRIPT_FILENAME=$tmpfile[SKIPIF]"); + $skipifcmd = "$php -q -f $tmpfile[SKIPIF] > $tmpfile[SKIPIF_OUTPUT]"; + system($skipifcmd, $ret); + $sp = @fopen($tmpfile["SKIPIF_OUTPUT"], "r"); + if ($sp) { + skip_headers($sp); + $skip = trim(fgets($sp, 1024)); + fclose($sp); + if ($skip == "skip") { + delete_tmpfiles(); + return TEST_SKIPPED; + } + } + } + putenv("PATH_TRANSLATED=$tmpfile[FILE]"); + putenv("SCRIPT_FILENAME=$tmpfile[FILE]"); + if (isset($fps["POST"])) { + putenv("REQUEST_METHOD=POST"); + putenv("CONTENT_TYPE=application/x-www-form-urlencoded"); + putenv("CONTENT_LENGTH=".filesize($tmpfile["POST"])); + } else { + putenv("REQUEST_METHOD=GET"); + putenv("CONTENT_TYPE="); + putenv("CONTENT_LENGTH="); + } + putenv("a="); + putenv("b="); + putenv("c="); + putenv("d="); + $cmd = "$php -f $tmpfile[FILE] < $tmpfile[POST]"; + $ofp = @fopen($tmpfile["OUTPUT"], "w"); + if (!$ofp) { + writeln("Error: could not write to output file"); + delete_tmpfiles(); + return TEST_INTERNAL_ERROR; + } + $cp = popen($cmd, "r"); + if (!$cp) { + writeln("Error: could not execute: $cmd"); + delete_tmpfiles(); + return TEST_INTERNAL_ERROR; + } + skip_headers($cp); + while ($data = fread($cp, 2048)) { + fwrite($ofp, $data); + } + fclose($ofp); + pclose($cp); + $desc = trim($TEST); + $outfile = preg_replace('/\.phpt$/', '.out', $file); + $expectfile = preg_replace('/\.phpt$/', '.exp', $file); + $phpfile = preg_replace('/\.phpt$/', '.php', $file); + if (compare_results($tmpfile["OUTPUT"], $tmpfile["EXPECT"])) { + $status = TEST_PASSED; + $text = "passed"; + $pre = $post = ""; + if (file_exists($outfile)) { + unlink($outfile); + } + if (file_exists($expectfile)) { + unlink($expectfile); + } + if (file_exists($phpfile)) { + unlink($phpfile); + } + } else { + //system("env"); + $status = TEST_FAILED; + $text = "failed"; + $pre = $term_bold; + $post = $term_norm; + $desc .= " (".basename($file).")"; + if (file_exists($outfile)) { + unlink($outfile); + } + copy($tmpfile["OUTPUT"], $outfile); + copy($tmpfile["EXPECT"], $expectfile); + copy($tmpfile["FILE"], $phpfile); + } + writeln(sprintf("%s%-68s ... %s%s", $pre, substr($desc, 0, 68), + $text, $post)); +// if ($status == TEST_FAILED) { +// for ($i = 0; $i < sizeof($variables); $i++) { +// $var = $variables[$i]; +// print "$var:\n"; +// if ($tmpfile[$var]) { +// if (file_exists($tmpfile[$var])) { +// system("cat ".$tmpfile[$var]); +// } +// } else { +// print $$var; +// } +// } +// print "--\n\n"; +// } + delete_tmpfiles(); + return $status; +} + +?> |