#667264: file tests fails randomly.

From: Damien Tournoud <damien@tournoud.net>


---
 simpletest/drupal_web_test_case.php |   34 +++++++++++++++++++++++++---------
 simpletest/simpletest.module        |    4 ++--
 2 files changed, 27 insertions(+), 11 deletions(-)

diff --git modules/simpletest/drupal_web_test_case.php modules/simpletest/drupal_web_test_case.php
index a27afc5..20626cd 100644
--- modules/simpletest/drupal_web_test_case.php
+++ modules/simpletest/drupal_web_test_case.php
@@ -691,6 +691,11 @@ class DrupalWebTestCase extends DrupalTestCase {
   protected $session_id = NULL;
 
   /**
+   * Whether the files were copied to the test files directory.
+   */
+  protected $copiedTestFiles = FALSE;
+
+  /**
    * Constructor for DrupalWebTestCase.
    */
   function __construct($test_id = NULL) {
@@ -839,13 +844,23 @@ class DrupalWebTestCase extends DrupalTestCase {
    *   List of files that match filter.
    */
   protected function drupalGetTestFiles($type, $size = NULL) {
-    $files = array();
+    if (empty($this->copiedTestFiles)) {
+      // Scan the test files and copy them to the test directory.
+      $original_path = $this->originalFileDirectory . '/simpletest';
+      $destination_path = file_directory_path('public');
+
+      $files = file_scan_directory($original_path, '/.*/');
+      foreach ($files as $file) {
+        file_unmanaged_copy($file->uri, $destination_path);
+      }
+
+      $this->copiedTestFiles = TRUE;
+    }
 
+    $files = array();
     // Make sure type is valid.
     if (in_array($type, array('binary', 'html', 'image', 'javascript', 'php', 'sql', 'text'))) {
-      // Use original file directory instead of one created during setUp().
-      $path = $this->originalFileDirectory . '/simpletest';
-      $files = file_scan_directory($path, '/' . $type . '\-.*/');
+      $files = file_scan_directory(file_directory_path('public'), '/' . $type . '\-.*/');
 
       // If size is set then remove any files that are not of that size.
       if ($size !== NULL) {
@@ -1080,7 +1095,7 @@ class DrupalWebTestCase extends DrupalTestCase {
     // Create test directory ahead of installation so fatal errors and debug
     // information can be logged during installation process.
     // Use temporary files directory with the same prefix as the database.
-    $public_files_directory  = $this->originalFileDirectory . '/simpletest/' . substr($db_prefix, 10);
+    $public_files_directory  = $this->originalFileDirectory . '/simpletest-runtime/' . substr($db_prefix, 10);
     $private_files_directory = $public_files_directory . '/private';
     $temp_files_directory    = $private_files_directory . '/temp';
 
@@ -1088,6 +1103,7 @@ class DrupalWebTestCase extends DrupalTestCase {
     file_prepare_directory($public_files_directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
     file_prepare_directory($private_files_directory, FILE_CREATE_DIRECTORY);
     file_prepare_directory($temp_files_directory, FILE_CREATE_DIRECTORY);
+    $this->copiedTestFiles = FALSE;
 
     // Log fatal errors.
     ini_set('log_errors', 1);
@@ -1210,7 +1226,7 @@ class DrupalWebTestCase extends DrupalTestCase {
 
     if (preg_match('/simpletest\d+/', $db_prefix)) {
       // Delete temporary files directory.
-      file_unmanaged_delete_recursive($this->originalFileDirectory . '/simpletest/' . substr($db_prefix, 10));
+      file_unmanaged_delete_recursive($this->originalFileDirectory . '/simpletest-runtime/' . substr($db_prefix, 10));
 
       // Remove all prefixed tables (all the tables in the schema).
       $schema = drupal_get_schema(NULL, TRUE);
@@ -2681,7 +2697,7 @@ class DrupalWebTestCase extends DrupalTestCase {
    */
   protected function verbose($message) {
     if ($id = simpletest_verbose($message)) {
-      $url = file_create_url($this->originalFileDirectory . '/simpletest/verbose/' . get_class($this) . '-' . $id . '.html');
+      $url = file_create_url($this->originalFileDirectory . '/simpletest-runtime/verbose/' . get_class($this) . '-' . $id . '.html');
       $this->error(l(t('Verbose message'), $url, array('attributes' => array('target' => '_blank'))), 'User notice');
     }
   }
@@ -2716,7 +2732,7 @@ function simpletest_verbose($message, $original_file_directory = NULL, $test_cla
 
   if ($message && $file_directory) {
     $message = '<hr />ID #' . $id . ' (<a href="' . $class . '-' . ($id - 1) . '.html">Previous</a> | <a href="' . $class . '-' . ($id + 1) . '.html">Next</a>)<hr />' . $message;
-    file_put_contents($file_directory . "/simpletest/verbose/$class-$id.html", $message, FILE_APPEND);
+    file_put_contents($file_directory . "/simpletest-runtime/verbose/$class-$id.html", $message, FILE_APPEND);
     return $id++;
   }
 
@@ -2724,7 +2740,7 @@ function simpletest_verbose($message, $original_file_directory = NULL, $test_cla
     $file_directory = $original_file_directory;
     $class = $test_class;
     $verbose = variable_get('simpletest_verbose', FALSE);
-    $directory = $file_directory . '/simpletest/verbose';
+    $directory = $file_directory . '/simpletest-runtime/verbose';
     $writable = file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
     if ($writable && !file_exists($directory . '/.htaccess')) {
       file_put_contents($directory . '/.htaccess', "<IfModule mod_expires.c>\nExpiresActive Off\n</IfModule>\n");
diff --git modules/simpletest/simpletest.module modules/simpletest/simpletest.module
index 222098a..7855f5e 100644
--- modules/simpletest/simpletest.module
+++ modules/simpletest/simpletest.module
@@ -143,7 +143,7 @@ function simpletest_run_tests($test_list, $reporter = 'drupal') {
     ->execute();
 
   // Clear out the previous verbose files.
-  file_unmanaged_delete_recursive(file_directory_path() . '/simpletest/verbose');
+  file_unmanaged_delete_recursive(file_directory_path() . '/simpletest-runtime/verbose');
 
   // Get the info for the first test being run.
   $first_test = array_shift($test_list);
@@ -280,7 +280,7 @@ function simpletest_last_test_get($test_id) {
  *   Found any entries in log.
  */
 function simpletest_log_read($test_id, $prefix, $test_class, $during_test = FALSE) {
-  $log = 'public://' . ($during_test ? '' : '/simpletest/' . substr($prefix, 10)) . '/error.log';
+  $log = 'public://' . ($during_test ? '' : '/simpletest-runtime/' . substr($prefix, 10)) . '/error.log';
   $found = FALSE;
   if (file_exists($log)) {
     foreach (file($log) as $line) {
