crmMailingAB - Only display "Headers and Footers" if there are headers and footers
[civicrm-core.git] / tools / scripts / phpunit
index f3c5d6172461bff4eb680eae8a701f23592233e0..2e682bc0db51253824050b4d71b2a6a467c760d8 100755 (executable)
  * This script is an adapter for backwards compatibility.
  */
 
+$argFilters = [];
+
 if (PHP_SAPI !== 'cli') {
   die("phpunit can only be run from command line.");
 }
-if (version_compare(PHP_VERSION, '5.6', '>=')) {
+if (version_compare(PHP_VERSION, '7.0', '>=')) {
+  $phpunit = findCommand('phpunit6');
+  $argFilters[] = function ($argv) {
+    $pos = array_search('--tap', $argv);
+    if ($pos !== FALSE) {
+      array_splice($argv, $pos, 1, ['--printer', '\Civi\Test\TAP']);
+    }
+    return $argv;
+  };
+}
+elseif (version_compare(PHP_VERSION, '5.6', '>=')) {
   $phpunit = findCommand('phpunit5');
 }
 else {
@@ -38,7 +50,7 @@ array_shift($argv);
 // Convert class names to file names
 $CIVICRM_UF = 'UnitTests';
 foreach ($argv as $k => $v) {
-  if (preg_match('/^(CRM_|api_v3_|EnvTest|WebTest_|E2E_)/', $v)) {
+  if (preg_match('/^(CRM_|api_v3_|api_v4_|EnvTest|WebTest_|E2E_)/', $v)) {
     $argv[$k] = 'tests/phpunit/' . strtr($v, '_', '/') . '.php';
   }
   elseif (preg_match('/^Civi\\\\/', $v)) {
@@ -61,6 +73,10 @@ if (is_dir('packages/PHPUnit/')) {
   }
 }
 
+foreach ($argFilters as $filter) {
+  $argv = $filter($argv);
+}
+
 $cmd =
   findPhp() // In case this system has multiple copies of PHP, use the active/preferred one.
   // . ' -ddisplay_errors=1'
@@ -71,12 +87,20 @@ $cmd =
 passthru($cmd);
 
 function findPhp() {
-  if (defined('PHP_BINARY')) {
-    return PHP_BINARY; // php 5.4+
-  } elseif (defined('PHP_BINDIR') && file_exists(PHP_BINDIR . '/php')) {
-    return PHP_BINDIR . '/php'; // php 5.3
-  } else {
-    die("Failed to determine active PHP version.");
+  // The autodetect behavior here is a potential point of contention. These two cases are hard to reconcile:
+  // 1. `php` is actually a wrapper script which delegates to another PHP binary and
+  //    passes options (such as INI's and PECL extensions). Subprocesses should use the wrapper script.
+  //    Examples: bitnami, bknix
+  // 2. There are multiple PHP binaries (eg `php55`, `php70`). Subprocesses should use
+  //    the final executable (regardless of its name).
+  //    Example: using MAMP and adding 'ln -s /Application/MAMP/.../php7.1.2/bin/php ~/bin/php71`
+  // Since the test infra uses a wrapper script like (1), we use autodetect logic that works there.
+  // If you're in situation (2), then set an env-var or just skip on using `tools/scripts/phpunit`.
+  if (getenv('PHP')) {
+    return getenv('PHP');
+  }
+  else {
+    return 'php';
   }
 }