diff core/tests/bootstrap.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/tests/bootstrap.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,168 @@
+<?php
+
+/**
+ * @file
+ * Autoloader for Drupal PHPUnit testing.
+ *
+ * @see phpunit.xml.dist
+ */
+
+use Drupal\Component\Assertion\Handle;
+
+/**
+ * Finds all valid extension directories recursively within a given directory.
+ *
+ * @param string $scan_directory
+ *   The directory that should be recursively scanned.
+ * @return array
+ *   An associative array of extension directories found within the scanned
+ *   directory, keyed by extension name.
+ */
+function drupal_phpunit_find_extension_directories($scan_directory) {
+  $extensions = [];
+  $dirs = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($scan_directory, \RecursiveDirectoryIterator::FOLLOW_SYMLINKS));
+  foreach ($dirs as $dir) {
+    if (strpos($dir->getPathname(), '.info.yml') !== FALSE) {
+      // Cut off ".info.yml" from the filename for use as the extension name. We
+      // use getRealPath() so that we can scan extensions represented by
+      // directory aliases.
+      $extensions[substr($dir->getFilename(), 0, -9)] = $dir->getPathInfo()
+        ->getRealPath();
+    }
+  }
+  return $extensions;
+}
+
+/**
+ * Returns directories under which contributed extensions may exist.
+ *
+ * @param string $root
+ *   (optional) Path to the root of the Drupal installation.
+ *
+ * @return array
+ *   An array of directories under which contributed extensions may exist.
+ */
+function drupal_phpunit_contrib_extension_directory_roots($root = NULL) {
+  if ($root === NULL) {
+    $root = dirname(dirname(__DIR__));
+  }
+  $paths = [
+    $root . '/core/modules',
+    $root . '/core/profiles',
+    $root . '/modules',
+    $root . '/profiles',
+    $root . '/themes',
+  ];
+  $sites_path = $root . '/sites';
+  // Note this also checks sites/../modules and sites/../profiles.
+  foreach (scandir($sites_path) as $site) {
+    if ($site[0] === '.' || $site === 'simpletest') {
+      continue;
+    }
+    $path = "$sites_path/$site";
+    $paths[] = is_dir("$path/modules") ? realpath("$path/modules") : NULL;
+    $paths[] = is_dir("$path/profiles") ? realpath("$path/profiles") : NULL;
+    $paths[] = is_dir("$path/themes") ? realpath("$path/themes") : NULL;
+  }
+  return array_filter($paths);
+}
+
+/**
+ * Registers the namespace for each extension directory with the autoloader.
+ *
+ * @param array $dirs
+ *   An associative array of extension directories, keyed by extension name.
+ *
+ * @return array
+ *   An associative array of extension directories, keyed by their namespace.
+ */
+function drupal_phpunit_get_extension_namespaces($dirs) {
+  $suite_names = ['Unit', 'Kernel', 'Functional', 'FunctionalJavascript'];
+  $namespaces = [];
+  foreach ($dirs as $extension => $dir) {
+    if (is_dir($dir . '/src')) {
+      // Register the PSR-4 directory for module-provided classes.
+      $namespaces['Drupal\\' . $extension . '\\'][] = $dir . '/src';
+    }
+    $test_dir = $dir . '/tests/src';
+    if (is_dir($test_dir)) {
+      foreach ($suite_names as $suite_name) {
+        $suite_dir = $test_dir . '/' . $suite_name;
+        if (is_dir($suite_dir)) {
+          // Register the PSR-4 directory for PHPUnit-based suites.
+          $namespaces['Drupal\\Tests\\' . $extension . '\\' . $suite_name . '\\'][] = $suite_dir;
+        }
+      }
+      // Extensions can have a \Drupal\extension\Traits namespace for
+      // cross-suite trait code.
+      $trait_dir = $test_dir . '/Traits';
+      if (is_dir($trait_dir)) {
+        $namespaces['Drupal\\Tests\\' . $extension . '\\Traits\\'][] = $trait_dir;
+      }
+    }
+  }
+  return $namespaces;
+}
+
+// We define the COMPOSER_INSTALL constant, so that PHPUnit knows where to
+// autoload from. This is needed for tests run in isolation mode, because
+// phpunit.xml.dist is located in a non-default directory relative to the
+// PHPUnit executable.
+if (!defined('PHPUNIT_COMPOSER_INSTALL')) {
+  define('PHPUNIT_COMPOSER_INSTALL', __DIR__ . '/../../autoload.php');
+}
+
+/**
+ * Populate class loader with additional namespaces for tests.
+ *
+ * We run this in a function to avoid setting the class loader to a global
+ * that can change. This change can cause unpredictable false positives for
+ * phpunit's global state change watcher. The class loader can be retrieved from
+ * composer at any time by requiring autoload.php.
+ */
+function drupal_phpunit_populate_class_loader() {
+
+  /** @var \Composer\Autoload\ClassLoader $loader */
+  $loader = require __DIR__ . '/../../autoload.php';
+
+  // Start with classes in known locations.
+  $loader->add('Drupal\\Tests', __DIR__);
+  $loader->add('Drupal\\KernelTests', __DIR__);
+  $loader->add('Drupal\\FunctionalTests', __DIR__);
+  $loader->add('Drupal\\FunctionalJavascriptTests', __DIR__);
+
+  if (!isset($GLOBALS['namespaces'])) {
+    // Scan for arbitrary extension namespaces from core and contrib.
+    $extension_roots = drupal_phpunit_contrib_extension_directory_roots();
+
+    $dirs = array_map('drupal_phpunit_find_extension_directories', $extension_roots);
+    $dirs = array_reduce($dirs, 'array_merge', []);
+    $GLOBALS['namespaces'] = drupal_phpunit_get_extension_namespaces($dirs);
+  }
+  foreach ($GLOBALS['namespaces'] as $prefix => $paths) {
+    $loader->addPsr4($prefix, $paths);
+  }
+
+  return $loader;
+};
+
+// Do class loader population.
+drupal_phpunit_populate_class_loader();
+
+// Set sane locale settings, to ensure consistent string, dates, times and
+// numbers handling.
+// @see \Drupal\Core\DrupalKernel::bootEnvironment()
+setlocale(LC_ALL, 'C');
+
+// Set the default timezone. While this doesn't cause any tests to fail, PHP
+// complains if 'date.timezone' is not set in php.ini. The Australia/Sydney
+// timezone is chosen so all tests are run using an edge case scenario (UTC+10
+// and DST). This choice is made to prevent timezone related regressions and
+// reduce the fragility of the testing system in general.
+date_default_timezone_set('Australia/Sydney');
+
+// Runtime assertions. PHPUnit follows the php.ini assert.active setting for
+// runtime assertions. By default this setting is on. Here we make a call to
+// make PHP 5 and 7 handle assertion failures the same way, but this call does
+// not turn runtime assertions on if they weren't on already.
+Handle::register();