public function S3fsTest::testStreamWrapperCoverage in S3 File System 8.3
Same name and namespace in other branches
- 4.0.x tests/src/Functional/S3fsTest.php \Drupal\Tests\s3fs\Functional\S3fsTest::testStreamWrapperCoverage()
Coverage test for the stream wrapper.
File
- tests/
src/ Functional/ S3fsTest.php, line 31
Class
- S3fsTest
- S3 File System Tests.
Namespace
Drupal\Tests\s3fs\FunctionalCode
public function testStreamWrapperCoverage() {
$test_uri1 = "{$this->remoteTestsFolderUri}/test_file1.txt";
$test_uri2 = "{$this->remoteTestsFolderUri}/test_file2.txt";
$this
->assertTrue(\Drupal::service('stream_wrapper_manager')
->isValidScheme('s3'), '"s3" is a valid stream wrapper scheme.');
$this
->assertEqual(\Drupal::service('stream_wrapper_manager')
->getClass('s3'), 'Drupal\\s3fs\\StreamWrapper\\S3fsStream', 'URIs with scheme "s3" should be handled by S3fsStream.');
// The test.txt file contains enough data to force multiple calls
// to write_stream().
$file_contents = file_get_contents(__DIR__ . '/../../fixtures/test.txt');
$this
->assertTrue(\Drupal::service('file_system')
->mkdir($this->remoteTestsFolderUri), 'Exercised mkdir to create the testing directory (in the DB).');
$this
->assertTrue(is_dir($this->remoteTestsFolderUri), 'Make sure the folder we just created correctly reports that it is a folder.');
$this
->verbose("Exercising file upload functionality.");
$start_time = time();
$s3_file1 = file_save_data($file_contents, $test_uri1);
$end_time = time();
$total = $end_time - $start_time;
$this
->verbose("Upload time: {$total} seconds");
$this
->assertTrue(\Drupal::service('stream_wrapper_manager')
->isValidUri($s3_file1
->getFileUri()), "Uploaded the first test file, {$test_uri1}.");
$this
->verbose("Exercising file copy functionality.");
$s3_file2 = file_copy($s3_file1, $test_uri2);
$this
->assertNotIdentical($s3_file2, FALSE, "Copied the the first test file to {$test_uri2}.");
$this
->verbose('Exercising the dir_*() functions.');
$files = \Drupal::service('file_system')
->scanDirectory($this->remoteTestsFolderUri, '#.*#');
$this
->assertTrue(isset($files[$test_uri1]), 'The first test file is in the tests directory.');
$this
->assertTrue(isset($files[$test_uri2]), 'The second test file is in the tests directory.');
$this
->assertEqual(count($files), 2, "There are exactly two files in the tests directory.");
$this
->verbose('Exercising getExternalUrl().');
$url = file_create_url($test_uri1);
$this
->assertNotIdentical($url, FALSE, 'file_create_url() succeeded.');
$this
->verbose('Exercising unlink().');
$this
->assertIdentical(self::fileDelete($s3_file1), TRUE, "Deleted the first test file.");
$this
->assertIdentical(file_exists($test_uri1), FALSE, 'The wrapper reports that the first test file no longer exists.');
$this
->verbose('Exercising rename().');
$this
->assertTrue(rename($test_uri2, $test_uri1), "Renamed the second test file to the newly-vacated URI of {$test_uri1}.");
$s3_file2
->setFileUri($test_uri1);
$s3_file2
->save();
// Rename a 'directory' should fail.
$dir_move_test_src = $this->remoteTestsFolderUri . '/directoryToBeMoved';
$dir_move_test_dest = $this->remoteTestsFolderUri . '/destinationDirectory';
$this
->assertTrue(\Drupal::service('file_system')
->mkdir($dir_move_test_src), 'Created testing directory to attempt move.');
$this
->assertNotFalse(file_put_contents($dir_move_test_src . '/test.file', 'test'), "Created file in directory that will be moved.");
$this
->assertFalse(rename($dir_move_test_src, $dir_move_test_dest), 'Should not be able to move a directory.');
$this
->assertFalse(is_file($dir_move_test_dest . '/test.file'), 'Test file should not exist as directory moves are not supported.');
$this
->assertTrue(unlink($dir_move_test_src . '/test.file'), "Deleted the test move file.");
$this
->verbose('Exercising rmdir().');
$this
->assertFalse(\Drupal::service('file_system')
->rmdir($this->remoteTestsFolderUri), 'rmdir() did not delete the tests folder because it is not empty.');
$this
->assertTrue(\Drupal::service('file_system')
->rmdir($dir_move_test_src), "Delete the move test directory");
$this
->assertTrue(self::fileDelete($s3_file2), 'Deleted the last test file.');
$this
->assertTrue(\Drupal::service('file_system')
->rmdir($this->remoteTestsFolderUri), 'Deleted the tests folder.');
$this
->assertFalse(is_dir($this->remoteTestsFolderUri), 'The wrapper reports that the tests folder is gone.');
$this
->verbose('Testing max filename limits');
// 250 characters + 's3://' = 255 characters max limit.
$sourceMaxString = 'C9Xa0jcb8RqTvu5KKSjziAmiRHJJDsbIdZTSt345KkJJRAhkfJk8OddTyBgps5u6RAEwkQ6WKfnSd2jQKQAm5BmcYVSMMtkUcSJo5TsvCgS4s5UrVEXPKcLqsP4JQuEAMDbIrqCD0WXuTDAUCF38oQvyaXplxwSwgjBavS4XkeYCqUjMXBSWtUeDLbiLkzfMFUHa1QcHciy318id75KOuSvMC4x2z1177Ht90zR4PNvTDvE7smPNEOL8Y';
$uriMaxLength = 255;
// 245 Character long string to work with on future tests.
$baseLongDir = "{$this->remoteTestsFolderUri}/" . substr($sourceMaxString, 0, $uriMaxLength - strlen($this->remoteTestsFolderUri) - 11);
$this
->assertEquals($uriMaxLength - 10, strlen($baseLongDir));
// Max length mkdir().
// 256 characters long the last / is stripped making 255 limit safe.
$pathDirMaxLength = "{$baseLongDir}/dir/12345/";
$this
->assertTrue(\Drupal::service('file_system')
->mkdir($pathDirMaxLength), 'Creating max path length directory');
$this
->assertTrue(is_dir($pathDirMaxLength), 'Verify max path length directory exists');
// 257 characters long the last / is stripped making 256 exceeding limit.
$pathDirExceedMaxLength = "{$baseLongDir}/dir/123456/";
$this
->assertFalse(\Drupal::service('file_system')
->mkdir($pathDirExceedMaxLength), 'Creating directory that exceeds path length limit');
$this
->assertFalse(is_dir($pathDirExceedMaxLength), 'Verify directory that exceeds max path length doesnt exist');
// Max length stream_open().
$pathFileMaxLength = "{$baseLongDir}/78901.txt";
$pathFileExceedMaxLength = "{$baseLongDir}/789012.txt";
$this
->assertNotFalse(file_put_contents($pathFileMaxLength, $file_contents), 'Creating max path length filename');
$this
->assertTrue(is_file($pathFileMaxLength), 'Verify max path length file exists');
$this
->assertFalse(@file_put_contents($pathFileExceedMaxLength, $file_contents), 'Creating file exceeds max path length');
$this
->assertFalse(is_file($pathFileExceedMaxLength), 'File that exceeds max path length doesnt exist');
// Max length rename().
$pathFileRenameMaxLength = "{$baseLongDir}/78901.ace";
$this
->assertTrue(rename($pathFileMaxLength, $pathFileRenameMaxLength), 'Rename file to max path length');
$this
->assertFalse(rename($pathFileRenameMaxLength, $pathFileExceedMaxLength), 'Rename file to exceed max path length');
// Set config and flush static to test cache-control header.
$this
->config('s3fs.settings')
->set('cache_control_header', 'public, max-age=300')
->save();
drupal_static_reset('S3fsStream_constructed_settings');
// Verify header exists on new files.
$headerPutUri = 's3://' . $this
->randomMachineName();
file_put_contents($headerPutUri, $file_contents);
$url = file_create_url($headerPutUri);
$this
->drupalGet($url);
$this
->assertSession()
->responseHeaderEquals('cache-control', 'public, max-age=300');
// Make sure the header exists and age changes on copy().
$this
->config('s3fs.settings')
->set('cache_control_header', 'public, max-age=301')
->save();
drupal_static_reset('S3fsStream_constructed_settings');
$headerCopyUri = 's3://' . $this
->randomMachineName();
copy($headerPutUri, $headerCopyUri);
$url = file_create_url($headerCopyUri);
$this
->drupalGet($url);
$this
->assertSession()
->responseHeaderEquals('cache-control', 'public, max-age=301');
}