summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxjm2017-01-19 19:11:27 (GMT)
committerxjm2017-01-19 19:11:27 (GMT)
commit3af6a3e5382f58d57336f1b264341f1b9407b934 (patch)
treefc4333ae2bbccb2440e35d883e44afaeab3d181c
parent4b65a2bec0defd8fa703fa0d0c9200524622f3c0 (diff)
Issue #2754217 by alexpott, xjm, dawehner, martin107: Random Test Failure with "failed to open stream" for temporary://.htaccess
-rw-r--r--core/includes/install.core.inc16
-rw-r--r--core/lib/Drupal/Core/Test/FunctionalTestSetupTrait.php17
-rw-r--r--core/lib/Drupal/Core/Test/TestSetupTrait.php4
-rw-r--r--core/modules/simpletest/src/Tests/WebTestBaseInstallTest.php22
-rw-r--r--core/tests/Drupal/FunctionalTests/BrowserTestBaseTest.php8
5 files changed, 58 insertions, 9 deletions
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 1616f18..a016540 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -20,6 +20,7 @@ use Drupal\Core\Logger\LoggerChannelFactory;
use Drupal\Core\Site\Settings;
use Drupal\Core\StringTranslation\Translator\FileTranslation;
use Drupal\Core\StackMiddleware\ReverseProxyMiddleware;
+use Drupal\Core\StreamWrapper\PublicStream;
use Drupal\Core\Extension\ExtensionDiscovery;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Url;
@@ -1036,6 +1037,21 @@ function install_base_system(&$install_state) {
// Install system.module.
drupal_install_system($install_state);
+ // Prevent the installer from using the system temporary directory after the
+ // system module has been installed.
+ if (drupal_valid_test_ua()) {
+ // While the temporary directory could be preset/enforced in settings.php
+ // like the public files directory, some tests expect it to be configurable
+ // in the UI. If declared in settings.php, they would no longer be
+ // configurable. The temporary directory needs to match what is set in each
+ // test types ::prepareEnvironment() step.
+ $temporary_directory = dirname(PublicStream::basePath()) . '/temp';
+ file_prepare_directory($temporary_directory, FILE_MODIFY_PERMISSIONS | FILE_CREATE_DIRECTORY);
+ \Drupal::configFactory()->getEditable('system.file')
+ ->set('path.temporary', $temporary_directory)
+ ->save();
+ }
+
// Call file_ensure_htaccess() to ensure that all of Drupal's standard
// directories (e.g., the public files directory and config directory) have
// appropriate .htaccess files. These directories will have already been
diff --git a/core/lib/Drupal/Core/Test/FunctionalTestSetupTrait.php b/core/lib/Drupal/Core/Test/FunctionalTestSetupTrait.php
index dbbd962..25571b9 100644
--- a/core/lib/Drupal/Core/Test/FunctionalTestSetupTrait.php
+++ b/core/lib/Drupal/Core/Test/FunctionalTestSetupTrait.php
@@ -50,9 +50,15 @@ trait FunctionalTestSetupTrait {
$directory = DRUPAL_ROOT . '/' . $this->siteDirectory;
copy(DRUPAL_ROOT . '/sites/default/default.settings.php', $directory . '/settings.php');
- // All file system paths are created by System module during installation.
+ // The public file system path is created during installation. Additionally,
+ // during tests:
+ // - The temporary directory is set and created by install_base_system().
+ // - The private file directory is created post install by
+ // FunctionalTestSetupTrait::initConfig().
// @see system_requirements()
// @see TestBase::prepareEnvironment()
+ // @see install_base_system()
+ // @see \Drupal\Core\Test\FunctionalTestSetupTrait::initConfig()
$settings['settings']['file_public_path'] = (object) [
'value' => $this->publicFilesDirectory,
'required' => TRUE,
@@ -316,15 +322,8 @@ trait FunctionalTestSetupTrait {
protected function initConfig(ContainerInterface $container) {
$config = $container->get('config.factory');
- // Manually create and configure private and temporary files directories.
- // While these could be preset/enforced in settings.php like the public
- // files directory above, some tests expect them to be configurable in the
- // UI. If declared in settings.php, they would no longer be configurable.
+ // Manually create the private directory.
file_prepare_directory($this->privateFilesDirectory, FILE_CREATE_DIRECTORY);
- file_prepare_directory($this->tempFilesDirectory, FILE_CREATE_DIRECTORY);
- $config->getEditable('system.file')
- ->set('path.temporary', $this->tempFilesDirectory)
- ->save();
// Manually configure the test mail collector implementation to prevent
// tests from sending out emails and collect them in state instead.
diff --git a/core/lib/Drupal/Core/Test/TestSetupTrait.php b/core/lib/Drupal/Core/Test/TestSetupTrait.php
index 32e6fca..31849c8 100644
--- a/core/lib/Drupal/Core/Test/TestSetupTrait.php
+++ b/core/lib/Drupal/Core/Test/TestSetupTrait.php
@@ -92,8 +92,12 @@ trait TestSetupTrait {
/**
* The temporary file directory for the test environment.
*
+ * This value has to match the temporary directory created in
+ * install_base_system() for test installs.
+ *
* @see \Drupal\simpletest\TestBase::prepareEnvironment()
* @see \Drupal\Tests\BrowserTestBase::prepareEnvironment()
+ * @see install_base_system()
*
* @var string
*/
diff --git a/core/modules/simpletest/src/Tests/WebTestBaseInstallTest.php b/core/modules/simpletest/src/Tests/WebTestBaseInstallTest.php
new file mode 100644
index 0000000..857e3a3
--- /dev/null
+++ b/core/modules/simpletest/src/Tests/WebTestBaseInstallTest.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace Drupal\simpletest\Tests;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests the test-specifics customisations done in the installation.
+ *
+ * @group simpletest
+ */
+class WebTestBaseInstallTest extends WebTestBase {
+
+ /**
+ * Tests the Drupal install done in \Drupal\simpletest\WebTestBase::setUp().
+ */
+ public function testInstall() {
+ $htaccess_filename = $this->getTempFilesDirectory() . '/.htaccess';
+ $this->assertTrue(file_exists($htaccess_filename), "$htaccess_filename exists");
+ }
+
+}
diff --git a/core/tests/Drupal/FunctionalTests/BrowserTestBaseTest.php b/core/tests/Drupal/FunctionalTests/BrowserTestBaseTest.php
index 7241fe4..199d257 100644
--- a/core/tests/Drupal/FunctionalTests/BrowserTestBaseTest.php
+++ b/core/tests/Drupal/FunctionalTests/BrowserTestBaseTest.php
@@ -177,4 +177,12 @@ class BrowserTestBaseTest extends BrowserTestBase {
$this->assertGreaterThan($last_cron_time, $next_cron_time);
}
+ /**
+ * Tests the Drupal install done in \Drupal\Tests\BrowserTestBase::setUp().
+ */
+ public function testInstall() {
+ $htaccess_filename = $this->tempFilesDirectory . '/.htaccess';
+ $this->assertTrue(file_exists($htaccess_filename), "$htaccess_filename exists");
+ }
+
}