Security update for Core, with self-updated composer
[yaffs-website] / web / core / lib / Drupal / Core / Test / TestSetupTrait.php
1 <?php
2
3 namespace Drupal\Core\Test;
4
5 use Drupal\Core\Database\Database;
6
7 /**
8  * Provides a trait for shared test setup functionality.
9  */
10 trait TestSetupTrait {
11
12   /**
13    * An array of config object names that are excluded from schema checking.
14    *
15    * @var string[]
16    */
17   protected static $configSchemaCheckerExclusions = [
18     // Following are used to test lack of or partial schema. Where partial
19     // schema is provided, that is explicitly tested in specific tests.
20     'config_schema_test.noschema',
21     'config_schema_test.someschema',
22     'config_schema_test.schema_data_types',
23     'config_schema_test.no_schema_data_types',
24     // Used to test application of schema to filtering of configuration.
25     'config_test.dynamic.system',
26   ];
27
28   /**
29    * The dependency injection container used in the test.
30    *
31    * @var \Symfony\Component\DependencyInjection\ContainerInterface
32    */
33   protected $container;
34
35   /**
36    * The site directory of this test run.
37    *
38    * @var string
39    */
40   protected $siteDirectory = NULL;
41
42   /**
43    * The public file directory for the test environment.
44    *
45    * @see \Drupal\simpletest\TestBase::prepareEnvironment()
46    * @see \Drupal\Tests\BrowserTestBase::prepareEnvironment()
47    *
48    * @var string
49    */
50   protected $publicFilesDirectory;
51
52   /**
53    * The site directory of the original parent site.
54    *
55    * @var string
56    */
57   protected $originalSite;
58
59   /**
60    * The private file directory for the test environment.
61    *
62    * @see \Drupal\simpletest\TestBase::prepareEnvironment()
63    * @see \Drupal\Tests\BrowserTestBase::prepareEnvironment()
64    *
65    * @var string
66    */
67   protected $privateFilesDirectory;
68
69   /**
70    * The original installation profile.
71    *
72    * @var string
73    */
74   protected $originalProfile;
75
76   /**
77    * Set to TRUE to strict check all configuration saved.
78    *
79    * @see \Drupal\Core\Config\Testing\ConfigSchemaChecker
80    *
81    * @var bool
82    */
83   protected $strictConfigSchema = TRUE;
84
85   /**
86    * The DrupalKernel instance used in the test.
87    *
88    * @var \Drupal\Core\DrupalKernel
89    */
90   protected $kernel;
91
92   /**
93    * The temporary file directory for the test environment.
94    *
95    * This value has to match the temporary directory created in
96    * install_base_system() for test installs.
97    *
98    * @see \Drupal\simpletest\TestBase::prepareEnvironment()
99    * @see \Drupal\Tests\BrowserTestBase::prepareEnvironment()
100    * @see install_base_system()
101    *
102    * @var string
103    */
104   protected $tempFilesDirectory;
105
106   /**
107    * The test run ID.
108    *
109    * @var string
110    */
111   protected $testId;
112
113   /**
114    * Returns the database connection to the site running Simpletest.
115    *
116    * @return \Drupal\Core\Database\Connection
117    *   The database connection to use for inserting assertions.
118    */
119   public static function getDatabaseConnection() {
120     return TestDatabase::getConnection();
121   }
122
123   /**
124    * Generates a database prefix for running tests.
125    *
126    * The database prefix is used by prepareEnvironment() to setup a public files
127    * directory for the test to be run, which also contains the PHP error log,
128    * which is written to in case of a fatal error. Since that directory is based
129    * on the database prefix, all tests (even unit tests) need to have one, in
130    * order to access and read the error log.
131    *
132    * The generated database table prefix is used for the Drupal installation
133    * being performed for the test. It is also used as user agent HTTP header
134    * value by the cURL-based browser of WebTestBase, which is sent to the Drupal
135    * installation of the test. During early Drupal bootstrap, the user agent
136    * HTTP header is parsed, and if it matches, all database queries use the
137    * database table prefix that has been generated here.
138    *
139    * @see \Drupal\Tests\BrowserTestBase::prepareEnvironment()
140    * @see \Drupal\simpletest\WebTestBase::curlInitialize()
141    * @see \Drupal\simpletest\TestBase::prepareEnvironment()
142    * @see drupal_valid_test_ua()
143    */
144   protected function prepareDatabasePrefix() {
145     $test_db = new TestDatabase();
146     $this->siteDirectory = $test_db->getTestSitePath();
147     $this->databasePrefix = $test_db->getDatabasePrefix();
148   }
149
150   /**
151    * Changes the database connection to the prefixed one.
152    */
153   protected function changeDatabasePrefix() {
154     if (empty($this->databasePrefix)) {
155       $this->prepareDatabasePrefix();
156     }
157
158     // If the test is run with argument dburl then use it.
159     $db_url = getenv('SIMPLETEST_DB');
160     if (!empty($db_url)) {
161       $database = Database::convertDbUrlToConnectionInfo($db_url, isset($this->root) ? $this->root : DRUPAL_ROOT);
162       Database::addConnectionInfo('default', 'default', $database);
163     }
164
165     // Clone the current connection and replace the current prefix.
166     $connection_info = Database::getConnectionInfo('default');
167     if (is_null($connection_info)) {
168       throw new \InvalidArgumentException('There is no database connection so no tests can be run. You must provide a SIMPLETEST_DB environment variable to run PHPUnit based functional tests outside of run-tests.sh.');
169     }
170     else {
171       Database::renameConnection('default', 'simpletest_original_default');
172       foreach ($connection_info as $target => $value) {
173         // Replace the full table prefix definition to ensure that no table
174         // prefixes of the test runner leak into the test.
175         $connection_info[$target]['prefix'] = [
176           'default' => $value['prefix']['default'] . $this->databasePrefix,
177         ];
178       }
179       Database::addConnectionInfo('default', 'default', $connection_info['default']);
180     }
181   }
182
183   /**
184    * Gets the config schema exclusions for this test.
185    *
186    * @return string[]
187    *   An array of config object names that are excluded from schema checking.
188    */
189   protected function getConfigSchemaExclusions() {
190     $class = get_class($this);
191     $exceptions = [];
192     while ($class) {
193       if (property_exists($class, 'configSchemaCheckerExclusions')) {
194         $exceptions = array_merge($exceptions, $class::$configSchemaCheckerExclusions);
195       }
196       $class = get_parent_class($class);
197     }
198     // Filter out any duplicates.
199     return array_unique($exceptions);
200   }
201
202 }