mirror of
https://github.com/vdm-io/tcpdf.git
synced 2025-03-30 16:22:22 +00:00
280 lines
8.4 KiB
PHP
280 lines
8.4 KiB
PHP
#!/usr/bin/env php
|
|
<?php
|
|
|
|
/**
|
|
* Test runner
|
|
*
|
|
* Usage: php launch.php --help
|
|
*
|
|
* @author Philippe Jausions
|
|
* @license http://www.gnu.org/copyleft/lesser.html GNU-LGPL v3 (see LICENSE.TXT)
|
|
*/
|
|
|
|
namespace Tecnickcom\TCPDF\Tests;
|
|
|
|
use LocateBinaries\LocateBinaries;
|
|
|
|
if (!file_exists(__DIR__ . '/vendor/autoload.php')) {
|
|
echo 'Run `composer install` in the tests/ directory first.' . PHP_EOL;
|
|
exit(-1);
|
|
}
|
|
|
|
require_once __DIR__ . '/vendor/autoload.php';
|
|
|
|
$options = getopt('o:vh', array(
|
|
'group:',
|
|
'output-dir:',
|
|
'stop-on-defect',
|
|
'verbose',
|
|
'help'
|
|
));
|
|
|
|
function printLaunchHelp()
|
|
{
|
|
echo 'Usage:' . PHP_EOL;
|
|
echo ' php launch.php [-chv] [-o <path>] [file...]' . PHP_EOL;
|
|
echo 'Description:' . PHP_EOL;
|
|
echo ' Launches the test suite for Tecnickcom\'s TCPDF.' . PHP_EOL;
|
|
echo 'Supported environment variables:' . PHP_EOL;
|
|
echo ' PHP_BINARY Path to php executable to use.' . PHP_EOL;
|
|
echo ' PDFINFO_BINARY Path to pdfinfo executable to use.' . PHP_EOL;
|
|
echo ' For more information on pdfinfo, visit https://www.xpdfreader.com/' . PHP_EOL;
|
|
echo 'Arguments:' . PHP_EOL;
|
|
echo ' file' . PHP_EOL;
|
|
echo ' Test file(s) to run. If not provided all the tests are considered for the run.' . PHP_EOL;
|
|
echo ' Usage example:' . PHP_EOL;
|
|
echo ' php launch.php example_001.php barcodes/example_1d_html.php' . PHP_EOL;
|
|
echo 'Options:' . PHP_EOL;
|
|
echo ' -c, --clean-up' . PHP_EOL;
|
|
echo ' Clean up generated files.' . PHP_EOL;
|
|
echo ' The default is to NOT clean up if the -o option is provided,' . PHP_EOL;
|
|
echo ' and to clean up if the -o option is NOT provided.' . PHP_EOL;
|
|
echo ' -o <path>, --output-dir=<path>' . PHP_EOL;
|
|
echo ' The folder in which files should be generated.' . PHP_EOL;
|
|
echo ' Default is to create a folder in the system\'s temporary folder.' . PHP_EOL;
|
|
echo ' --group=<name>' . PHP_EOL;
|
|
echo ' Filter the tests to run based on the @group annotation present in the file.' . PHP_EOL;
|
|
echo ' --stop-on-defect' . PHP_EOL;
|
|
echo ' Stop execution upon first not-passed test.' . PHP_EOL;
|
|
echo ' -v, --verbose' . PHP_EOL;
|
|
echo ' Outputs more information.' . PHP_EOL;
|
|
echo ' -h, --help' . PHP_EOL;
|
|
echo ' Prints this message.' . PHP_EOL;
|
|
}
|
|
|
|
if (false === $options
|
|
|| array_key_exists('h', $options)
|
|
|| array_key_exists('help', $options)) {
|
|
printLaunchHelp();
|
|
exit(false === $options ? -1 : 0);
|
|
}
|
|
|
|
if (!empty($options['o'])) {
|
|
$outputDir = $options['o'];
|
|
}
|
|
if (!empty($options['output-dir'])) {
|
|
$outputDir = $options['output-dir'];
|
|
}
|
|
|
|
if (array_key_exists('c', $options) || array_key_exists('clean-up', $options)) {
|
|
$preserveOutputFiles = false;
|
|
} elseif (isset($outputDir)) {
|
|
$preserveOutputFiles = true;
|
|
} else {
|
|
$preserveOutputFiles = false;
|
|
}
|
|
|
|
$stopOn = array();
|
|
if (array_key_exists('stop-on-defect', $options)) {
|
|
$stopOn[] = 'defect';
|
|
}
|
|
|
|
$verbose = array_key_exists('v', $options) || array_key_exists('verbose', $options);
|
|
|
|
$groups = array();
|
|
if (!empty($options['group'])) {
|
|
if (is_array($options['group'])) {
|
|
$groups = $options['group'];
|
|
} else {
|
|
$groups = explode(',', $options['group']);
|
|
}
|
|
}
|
|
|
|
$isBinaryLocatorAvailable = class_exists('\LocateBinaries\LocateBinaries');
|
|
|
|
$pdfinfo = getenv('PDFINFO_BINARY');
|
|
if (empty($pdfinfo)) {
|
|
$paths = ($isBinaryLocatorAvailable)
|
|
? LocateBinaries::locateInstalledBinaries('pdfinfo')
|
|
: array();
|
|
if (empty($paths)) {
|
|
echo 'pdfinfo could not be located.' . PHP_EOL;
|
|
echo 'Please set the PDFINFO_BINARY environment variable.' . PHP_EOL;
|
|
if (!$isBinaryLocatorAvailable) {
|
|
echo 'You could install rosell-dk/locate-binaries via composer to detect binaries.' . PHP_EOL;
|
|
}
|
|
exit(-1);
|
|
}
|
|
$pdfinfo = reset($paths);
|
|
}
|
|
$pdfTools = new PdfTools(array('pdfinfo' => $pdfinfo), $verbose);
|
|
echo 'pdfinfo: ' . $pdfinfo . PHP_EOL;
|
|
echo 'pdfinfo version: ' . $pdfTools->getPdfinfoVersionInfo() . PHP_EOL;
|
|
echo PHP_EOL;
|
|
|
|
// Allows you to use PHP_BINARY=/usr/bin/php5.3 php ./tests/launch.php
|
|
$phpBinary = getenv('PHP_BINARY');
|
|
if (empty($phpBinary)) {
|
|
// PHP_BINARY only exists since PHP 5.4
|
|
if (defined('PHP_BINARY')) {
|
|
$phpBinary = PHP_BINARY;
|
|
} else {
|
|
$paths = ($isBinaryLocatorAvailable)
|
|
? LocateBinaries::locateInstalledBinaries('php')
|
|
: array();
|
|
if (empty($paths)) {
|
|
echo 'php could not be located. Please set PHP_BINARY environment variable.' . PHP_EOL;
|
|
if (!$isBinaryLocatorAvailable) {
|
|
echo 'You could install rosell-dk/locate-binaries via composer to detect binaries.' . PHP_EOL;
|
|
}
|
|
exit(-1);
|
|
}
|
|
$phpBinary = reset($paths);
|
|
}
|
|
}
|
|
|
|
$isWindows = (stripos(PHP_OS, 'WIN') === 0);
|
|
|
|
$phpExecutor = new PhpExecutor($phpBinary, $verbose);
|
|
|
|
echo 'PHP: ' . ((string)$phpExecutor) . PHP_EOL;
|
|
echo 'PHP version: ' . $phpExecutor->getPhpVersionInfo() . PHP_EOL;
|
|
echo PHP_EOL;
|
|
|
|
/**
|
|
* Map of extension availability.
|
|
* Possible values:
|
|
* - true: built in PHP,
|
|
* - false: available,
|
|
* - null: not available (not detected).
|
|
*/
|
|
$phpExtensions = array(
|
|
'bcmath' => null,
|
|
'gd' => null,
|
|
'imagick' => null,
|
|
'json' => null,
|
|
'openssl' => null,
|
|
'xml' => null,
|
|
);
|
|
$phpExtensionDir = $phpExecutor->getPhpExtensionDir();
|
|
echo 'PHP extension folder: ' . $phpExtensionDir . PHP_EOL;
|
|
if (strpos($phpExtensionDir, ' ') !== false) {
|
|
echo "WARNING: Spaces in extension_dir might cause problems." . PHP_EOL;
|
|
if ($isWindows) {
|
|
echo " You should use `dir /x` to get the short name of the path," . PHP_EOL;
|
|
echo " then adjust the extension_dir option of your php.ini file." . PHP_EOL;
|
|
}
|
|
if (!in_array('defect', $stopOn, true)) {
|
|
$stopOn[] = 'defect';
|
|
echo " --stop-on-defect as been forced to avoid too many failing tests." . PHP_EOL;
|
|
}
|
|
}
|
|
echo 'Extensions:' . PHP_EOL;
|
|
foreach ($phpExtensions as $extension => $_) {
|
|
$status = $phpExecutor->getExtensionStatus($extension);
|
|
$phpExtensions[$extension] = $status;
|
|
echo " $extension: ";
|
|
if (true === $status) {
|
|
echo 'BUILT-IN';
|
|
} elseif (false === $status) {
|
|
echo 'AVAILABLE';
|
|
} else {
|
|
echo 'NO';
|
|
}
|
|
echo PHP_EOL;
|
|
}
|
|
|
|
if (null === $phpExtensions['gd'] && null === $phpExtensions['imagick']) {
|
|
echo 'gd or imagick extension required.' . PHP_EOL;
|
|
echo 'Exit code: 1' . PHP_EOL;
|
|
exit(1);
|
|
}
|
|
|
|
if (null === $phpExtensions['openssl']) {
|
|
echo 'openssl extension required.' . PHP_EOL;
|
|
echo 'Exit code: 1' . PHP_EOL;
|
|
exit(1);
|
|
}
|
|
echo PHP_EOL;
|
|
|
|
$rootDir = dirname(realpath(__DIR__)) . DIRECTORY_SEPARATOR;
|
|
echo "Root folder: $rootDir" . PHP_EOL;
|
|
|
|
$isGeneratedTempDir = false;
|
|
if (!isset($outputDir)) {
|
|
echo PHP_EOL;
|
|
echo "The --output-dir option was not used, a temporary folder will be necessary." . PHP_EOL;
|
|
try {
|
|
$outputDir = \Cs278\Mktemp\temporaryDir('TCPDF-tests.XXXXXXXXX') . DIRECTORY_SEPARATOR;
|
|
} catch (\Exception $e) {
|
|
echo $e->getMessage();
|
|
exit(-1);
|
|
}
|
|
$isGeneratedTempDir = true;
|
|
}
|
|
|
|
if (!is_dir(realpath($outputDir))) {
|
|
echo "Could not find output folder: $outputDir" . PHP_EOL;
|
|
exit(-1);
|
|
}
|
|
$outputDir = realpath($outputDir);
|
|
echo "Output folder: $outputDir" . PHP_EOL;
|
|
echo PHP_EOL;
|
|
|
|
$testsDir = $rootDir . 'tests' . DIRECTORY_SEPARATOR;
|
|
echo "Test folder: $testsDir" . PHP_EOL;
|
|
|
|
$testExecutor = new TestExecutor(
|
|
$phpExecutor,
|
|
array_keys($phpExtensions),
|
|
$pdfTools,
|
|
$outputDir,
|
|
$testsDir,
|
|
$verbose
|
|
);
|
|
|
|
// Files that should be excluded from the test suite
|
|
$ignored = array(
|
|
'example_006.php',
|
|
);
|
|
|
|
// Check if the script is run for specific test files
|
|
$requestedTests = array();
|
|
foreach (array_reverse($argv) as $value) {
|
|
// This is a crude way to work around how getopt() parses arguments to script
|
|
if (preg_match('~^(barcodes/)?example_\d[\d_a-z]+\.php$~', $value)) {
|
|
$requestedTests[] = $value;
|
|
}
|
|
}
|
|
|
|
$testRunner = new TestRunner($rootDir . 'examples');
|
|
$passed = $testRunner
|
|
->withTestExecutor($testExecutor)
|
|
->preserveOutputFiles($preserveOutputFiles)
|
|
->excludeTests($ignored)
|
|
->only($requestedTests)
|
|
->filterByGroup($groups)
|
|
->stopOn($stopOn)
|
|
->runTests($outputDir)
|
|
;
|
|
|
|
if (!$preserveOutputFiles && $isGeneratedTempDir) {
|
|
rmdir($outputDir);
|
|
}
|
|
|
|
// Final result
|
|
$testRunner->printSummary();
|
|
$exitCode = (!$passed) ? 1 : 0;
|
|
echo 'Exit code: ' . $exitCode . PHP_EOL;
|
|
exit($exitCode);
|