Required fixes before #1083982: Make file tests generic to allow them to be reused.

From: Damien Tournoud <damien@commerceguys.com>


---
 simpletest/tests/file.test |   15 +++++++++------
 1 files changed, 9 insertions(+), 6 deletions(-)

diff --git modules/simpletest/tests/file.test modules/simpletest/tests/file.test
index dc12b1b..430ba3e 100644
--- modules/simpletest/tests/file.test
+++ modules/simpletest/tests/file.test
@@ -196,10 +196,13 @@ class FileTestCase extends DrupalWebTestCase {
    * @return
    *   File object.
    */
-  function createFile($filepath = NULL, $contents = NULL, $scheme = 'public') {
+  function createFile($filepath = NULL, $contents = NULL, $scheme = NULL) {
     if (!isset($filepath)) {
       $filepath = $this->randomName();
     }
+    if (!isset($scheme)) {
+      $scheme = file_default_scheme();
+    }
     $filepath = $scheme . '://' . $filepath;
 
     if (!isset($contents)) {
@@ -427,7 +430,7 @@ class FileValidatorTest extends DrupalWebTestCase {
     // Maximum size.
     if (image_get_toolkit()) {
       // Copy the image so that the original doesn't get resized.
-      copy(drupal_realpath('misc/druplicon.png'), 'temporary://druplicon.png');
+      copy('misc/druplicon.png', 'temporary://druplicon.png');
       $this->image->uri = 'temporary://druplicon.png';
 
       $errors = file_validate_image_resolution($this->image, '10x5');
@@ -437,7 +440,7 @@ class FileValidatorTest extends DrupalWebTestCase {
       $this->assertTrue($info['width'] <= 10, t('Image scaled to correct width.'), 'File');
       $this->assertTrue($info['height'] <= 5, t('Image scaled to correct height.'), 'File');
 
-      drupal_unlink(drupal_realpath('temporary://druplicon.png'));
+      drupal_unlink('temporary://druplicon.png');
     }
     else {
       // TODO: should check that the error is returned if no toolkit is available.
@@ -531,13 +534,13 @@ class FileUnmanagedSaveDataTest extends FileTestCase {
     $filepath = file_unmanaged_save_data($contents);
     $this->assertTrue($filepath, t('Unnamed file saved correctly.'));
     $this->assertEqual(file_uri_scheme($filepath), file_default_scheme(), t("File was placed in Drupal's files directory."));
-    $this->assertEqual($contents, file_get_contents(drupal_realpath($filepath)), t('Contents of the file are correct.'));
+    $this->assertEqual($contents, file_get_contents($filepath), t('Contents of the file are correct.'));
 
     // Provide a filename.
     $filepath = file_unmanaged_save_data($contents, 'public://asdf.txt', FILE_EXISTS_REPLACE);
     $this->assertTrue($filepath, t('Unnamed file saved correctly.'));
     $this->assertEqual('asdf.txt', basename($filepath), t('File was named correctly.'));
-    $this->assertEqual($contents, file_get_contents(drupal_realpath($filepath)), t('Contents of the file are correct.'));
+    $this->assertEqual($contents, file_get_contents($filepath), t('Contents of the file are correct.'));
     $this->assertFilePermissions($filepath, variable_get('file_chmod_file', 0664));
   }
 }
@@ -879,7 +882,7 @@ class FileDirectoryTest extends FileTestCase {
    */
   function testFileCheckDirectoryHandling() {
     // A directory to operate on.
-    $directory = file_stream_wrapper_get_instance_by_scheme(file_default_scheme())->getDirectoryPath() . '/' . $this->randomName() . '/' . $this->randomName();
+    $directory = file_default_scheme() . '://' . $this->randomName() . '/' . $this->randomName();
     $this->assertFalse(is_dir($directory), t('Directory does not exist prior to testing.'));
 
     // Non-existent directory.
Tests for #1083982: properly support remote filesystems.

From: Damien Tournoud <damien@commerceguys.com>


---
 simpletest/tests/file.test        |  124 +++++++++++++++++++++++++++++++++++++
 simpletest/tests/file_test.module |   17 +++++
 2 files changed, 141 insertions(+), 0 deletions(-)

diff --git modules/simpletest/tests/file.test modules/simpletest/tests/file.test
index 430ba3e..9dbe546 100644
--- modules/simpletest/tests/file.test
+++ modules/simpletest/tests/file.test
@@ -546,6 +546,22 @@ class FileUnmanagedSaveDataTest extends FileTestCase {
 }
 
 /**
+ *  Tests the file_unmanaged_save_data() function on remote filesystems.
+ */
+class RemoteFileUnmanagedSaveDataTest extends FileUnmanagedSaveDataTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
+
+/**
  * Test the file_save_upload() function.
  */
 class FileSaveUploadTest extends FileHookTestCase {
@@ -866,6 +882,22 @@ class FileSaveUploadTest extends FileHookTestCase {
 }
 
 /**
+ * Test the file_save_upload() function on remote filesystems.
+ */
+class RemoteFileSaveUploadTest extends FileSaveUploadTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
+
+/**
  * Directory related tests.
  */
 class FileDirectoryTest extends FileTestCase {
@@ -989,6 +1021,22 @@ class FileDirectoryTest extends FileTestCase {
 }
 
 /**
+ * Directory related tests.
+ */
+class RemoteFileDirectoryTest extends FileDirectoryTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
+
+/**
  * Tests the file_scan_directory() function.
  */
 class FileScanDirectoryTest extends FileTestCase {
@@ -1117,6 +1165,21 @@ class FileScanDirectoryTest extends FileTestCase {
   }
 }
 
+/**
+ * Tests the file_scan_directory() function on remote filesystems.
+ */
+class RemoteFileScanDirectoryTest extends FileScanDirectoryTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
 
 /**
  * Deletion related tests.
@@ -1163,6 +1226,21 @@ class FileUnmanagedDeleteTest extends FileTestCase {
   }
 }
 
+/**
+ * Deletion related tests on remote filesystems.
+ */
+class RemoteFileUnmanagedDeleteTest extends FileUnmanagedDeleteTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
 
 /**
  * Deletion related tests.
@@ -1240,6 +1318,21 @@ class FileUnmanagedDeleteRecursiveTest extends FileTestCase {
   }
 }
 
+/**
+ * Deletion related tests on remote filesystems.
+ */
+class RemoteFileUnmanagedDeleteRecursiveTest extends FileUnmanagedDeleteRecursiveTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
 
 /**
  * Unmanaged move related tests.
@@ -1313,6 +1406,21 @@ class FileUnmanagedMoveTest extends FileTestCase {
   }
 }
 
+/**
+ * Unmanaged move related tests on remote filesystems.
+ */
+class RemoteFileUnmanagedMoveTest extends FileUnmanagedMoveTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
 
 /**
  * Unmanaged copy related tests.
@@ -1403,6 +1511,22 @@ class FileUnmanagedCopyTest extends FileTestCase {
 }
 
 /**
+ * Unmanaged copy related tests on remote filesystems.
+ */
+class RemoteFileUnmanagedCopyTest extends FileUnmanagedCopyTest {
+  public static function getInfo() {
+    $info = parent::getInfo();
+    $info['group'] = 'File API (remote)';
+    return $info;
+  }
+
+  function setUp() {
+    parent::setUp('file_test');
+    variable_set('file_default_scheme', 'dummy-remote');
+  }
+}
+
+/**
  * Deletion related tests.
  */
 class FileDeleteTest extends FileHookTestCase {
diff --git modules/simpletest/tests/file_test.module modules/simpletest/tests/file_test.module
index 2865a1f..b3c43e0 100644
--- modules/simpletest/tests/file_test.module
+++ modules/simpletest/tests/file_test.module
@@ -37,6 +37,11 @@ function file_test_stream_wrappers() {
       'class' => 'DrupalDummyStreamWrapper',
       'description' => t('Dummy wrapper for simpletest.'),
     ),
+    'dummy-remote' => array(
+      'name' => t('Dummy files (remote)'),
+      'class' => 'DrupalDummyRemoteStreamWrapper',
+      'description' => t('Dummy wrapper for simpletest (remote).'),
+    ),
   );
 }
 
@@ -442,3 +447,15 @@ class DrupalDummyStreamWrapper extends DrupalLocalStreamWrapper {
   }
 }
 
+/**
+ * Helper class for testing the stream wrapper registry.
+ *
+ * Dummy remote stream wrapper implementation (dummy-remote://).
+ *
+ * Basically just the public scheme but not returning a local file for realpath.
+ */
+class DrupalDummyRemoteStreamWrapper extends DrupalPublicStreamWrapper {
+  function realpath() {
+    return FALSE;
+  }
+}
