From 1c833e7d789c610fa2747b164a3e67cf5f3dbded Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Fri, 6 Apr 2012 17:48:01 +0100 Subject: [PATCH 01/15] [Filesystem] Added missing docblock comment. --- src/Symfony/Component/Filesystem/Filesystem.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Symfony/Component/Filesystem/Filesystem.php b/src/Symfony/Component/Filesystem/Filesystem.php index b7ddd5a382..d9a78a1cf8 100644 --- a/src/Symfony/Component/Filesystem/Filesystem.php +++ b/src/Symfony/Component/Filesystem/Filesystem.php @@ -264,6 +264,11 @@ class Filesystem return false; } + /** + * @param mixed $files + * + * @return \Traversable + */ private function toIterator($files) { if (!$files instanceof \Traversable) { From 6ac54866723d8ba5561d39e182207dbc79b1466f Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Fri, 6 Apr 2012 17:48:54 +0100 Subject: [PATCH 02/15] [Filesystem] Added unit tests for copy method. --- .../Filesystem/Tests/FilesystemTest.php | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 src/Symfony/Component/Filesystem/Tests/FilesystemTest.php diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php new file mode 100644 index 0000000000..dff5b9800b --- /dev/null +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Filesystem\Tests; + +use Symfony\Component\Filesystem\Filesystem; + +/** + * Test class for Filesystem. + */ +class FilesystemTest extends \PHPUnit_Framework_TestCase +{ + public function testCopyCreatesNewFile() + { + $sourceFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_source_file'; + $targetFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_target_file'; + + file_put_contents($sourceFilePath, 'SOURCE FILE'); + + $filesystem = new Filesystem(); + $filesystem->copy($sourceFilePath, $targetFilePath); + + $this->assertFileExists($targetFilePath); + $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath)); + + unlink($sourceFilePath); + unlink($targetFilePath); + } + + public function testCopyOverridesExistingFileIfModified() + { + $sourceFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_source_file'; + $targetFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_target_file'; + + file_put_contents($sourceFilePath, 'SOURCE FILE'); + file_put_contents($targetFilePath, 'TARGET FILE'); + touch($targetFilePath, time() - 1000); + + $filesystem = new Filesystem(); + $filesystem->copy($sourceFilePath, $targetFilePath); + + $this->assertFileExists($targetFilePath); + $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath)); + + unlink($sourceFilePath); + unlink($targetFilePath); + } + + public function testCopyDoesNotOverrideExistingFileByDefault() + { + $sourceFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_source_file'; + $targetFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_target_file'; + + file_put_contents($sourceFilePath, 'SOURCE FILE'); + file_put_contents($targetFilePath, 'TARGET FILE'); + $modificationTime = time() - 1000; + touch($sourceFilePath, $modificationTime); + touch($targetFilePath, $modificationTime); + + $filesystem = new Filesystem(); + $filesystem->copy($sourceFilePath, $targetFilePath); + + $this->assertFileExists($targetFilePath); + $this->assertEquals('TARGET FILE', file_get_contents($targetFilePath)); + + unlink($sourceFilePath); + unlink($targetFilePath); + } + + public function testCopyOverridesExistingFileIfForced() + { + $sourceFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_source_file'; + $targetFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_target_file'; + + file_put_contents($sourceFilePath, 'SOURCE FILE'); + file_put_contents($targetFilePath, 'TARGET FILE'); + $modificationTime = time() - 1000; + touch($sourceFilePath, $modificationTime); + touch($targetFilePath, $modificationTime); + + $filesystem = new Filesystem(); + $filesystem->copy($sourceFilePath, $targetFilePath, true); + + $this->assertFileExists($targetFilePath); + $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath)); + + unlink($sourceFilePath); + unlink($targetFilePath); + } + + public function testCopyCreatesTargetDirectoryIfItDoesNotExist() + { + $sourceFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_source_file'; + $targetFileDirectory = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $targetFilePath = $targetFileDirectory.DIRECTORY_SEPARATOR.'copy_target_file'; + + file_put_contents($sourceFilePath, 'SOURCE FILE'); + + $filesystem = new Filesystem(); + $filesystem->copy($sourceFilePath, $targetFilePath); + + $this->assertTrue(is_dir($targetFileDirectory)); + $this->assertFileExists($targetFilePath); + $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath)); + + unlink($sourceFilePath); + unlink($targetFilePath); + rmdir($targetFileDirectory); + } +} From 7e297dbead3ab383199986698bf24e13831a15ab Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Fri, 6 Apr 2012 18:28:05 +0100 Subject: [PATCH 03/15] [Filesystem] Added unit tests for mkdir method. --- .../Filesystem/Tests/FilesystemTest.php | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index dff5b9800b..5c1840c716 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -115,4 +115,82 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase unlink($targetFilePath); rmdir($targetFileDirectory); } + + public function testMkdirCreatesDirectoriesRecursively() + { + $directory = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $subDirectory = $directory.DIRECTORY_SEPARATOR.'sub_directory'; + + $filesystem = new Filesystem(); + $result = $filesystem->mkdir($subDirectory); + + $this->assertTrue($result); + $this->assertTrue(is_dir($subDirectory)); + + rmdir($subDirectory); + rmdir($directory); + } + + public function testMkdirCreatesDirectoriesFromArray() + { + $basePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $directories = array( + $basePath.'1', $basePath.'2', $basePath.'3' + ); + + $filesystem = new Filesystem(); + $result = $filesystem->mkdir($directories); + + $this->assertTrue($result); + $this->assertTrue(is_dir($basePath.'1')); + $this->assertTrue(is_dir($basePath.'2')); + $this->assertTrue(is_dir($basePath.'3')); + + rmdir($basePath.'1'); + rmdir($basePath.'2'); + rmdir($basePath.'3'); + } + + public function testMkdirCreatesDirectoriesFromTraversableObject() + { + $basePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $directories = new \ArrayObject(array( + $basePath.'1', $basePath.'2', $basePath.'3' + )); + + $filesystem = new Filesystem(); + $result = $filesystem->mkdir($directories); + + $this->assertTrue($result); + $this->assertTrue(is_dir($basePath.'1')); + $this->assertTrue(is_dir($basePath.'2')); + $this->assertTrue(is_dir($basePath.'3')); + + rmdir($basePath.'1'); + rmdir($basePath.'2'); + rmdir($basePath.'3'); + } + + public function testMkdirCreatesDirectoriesEvenIfItFailsToCreateOneOfThem() + { + $basePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $directories = array( + $basePath.'1', $basePath.'2', $basePath.'3' + ); + + // create a file to make that directory cannot be created + file_put_contents($basePath.'2', ''); + + $filesystem = new Filesystem(); + $result = $filesystem->mkdir($directories); + + $this->assertFalse($result); + $this->assertTrue(is_dir($basePath.'1')); + $this->assertFalse(is_dir($basePath.'2')); + $this->assertTrue(is_dir($basePath.'3')); + + rmdir($basePath.'1'); + unlink($basePath.'2'); + rmdir($basePath.'3'); + } } From a91e200db7cb5d7e9b0315c8bd7056440cec6de1 Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Fri, 6 Apr 2012 19:22:22 +0100 Subject: [PATCH 04/15] [Filesystem] Added unit tests for touch method. --- .../Filesystem/Tests/FilesystemTest.php | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index 5c1840c716..836a8bb00a 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -193,4 +193,59 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase unlink($basePath.'2'); rmdir($basePath.'3'); } + + public function testTouchCreatesEmptyFile() + { + $basePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $file = $basePath.'1'; + + $filesystem = new Filesystem(); + $filesystem->touch($file); + + $this->assertFileExists($basePath.'1'); + + unlink($basePath.'1'); + } + + public function testTouchCreatesEmptyFilesFromArray() + { + $basePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $files = array( + $basePath.'1', $basePath.'2', $basePath.'3' + ); + mkdir($basePath); + + $filesystem = new Filesystem(); + $filesystem->touch($files); + + $this->assertFileExists($basePath.'1'); + $this->assertFileExists($basePath.'2'); + $this->assertFileExists($basePath.'3'); + + unlink($basePath.'1'); + unlink($basePath.'2'); + unlink($basePath.'3'); + rmdir($basePath); + } + + public function testTouchCreatesEmptyFilesFromTraversableObject() + { + $basePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $files = new \ArrayObject(array( + $basePath.'1', $basePath.'2', $basePath.'3' + )); + mkdir($basePath); + + $filesystem = new Filesystem(); + $filesystem->touch($files); + + $this->assertFileExists($basePath.'1'); + $this->assertFileExists($basePath.'2'); + $this->assertFileExists($basePath.'3'); + + unlink($basePath.'1'); + unlink($basePath.'2'); + unlink($basePath.'3'); + rmdir($basePath); + } } From 8e861b746a4311898205b8aa43050eace97059ea Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Fri, 6 Apr 2012 19:59:25 +0100 Subject: [PATCH 05/15] [Filesystem] Introduced workspace directory to limit complexity of tests. --- .../Filesystem/Tests/FilesystemTest.php | 170 +++++++++--------- 1 file changed, 80 insertions(+), 90 deletions(-) diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index 836a8bb00a..065c50b55e 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -18,162 +18,175 @@ use Symfony\Component\Filesystem\Filesystem; */ class FilesystemTest extends \PHPUnit_Framework_TestCase { + /** + * @var string $workspace + */ + private $workspace = null; + + /** + * @var \Symfony\Component\Filesystem\Filesystem $filesystem + */ + private $filesystem = null; + + public function setUp() + { + $this->filesystem = new Filesystem(); + $this->workspace = sys_get_temp_dir().DIRECTORY_SEPARATOR.time().rand(0, 1000); + mkdir($this->workspace, 0777, true); + } + + public function tearDown() + { + $this->clean($this->workspace); + } + + /** + * @param string $file + */ + private function clean($file) + { + if (!file_exists($file)) { + return; + } + + if (is_dir($file) && !is_link($file)) { + $dir = new \FilesystemIterator($file); + foreach ($dir as $childFile) { + $this->clean($childFile); + } + + rmdir($file); + } else { + unlink($file); + } + } + public function testCopyCreatesNewFile() { - $sourceFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_source_file'; - $targetFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_target_file'; + $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file'; + $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file'; file_put_contents($sourceFilePath, 'SOURCE FILE'); - $filesystem = new Filesystem(); - $filesystem->copy($sourceFilePath, $targetFilePath); + $this->filesystem->copy($sourceFilePath, $targetFilePath); $this->assertFileExists($targetFilePath); $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath)); - - unlink($sourceFilePath); - unlink($targetFilePath); } public function testCopyOverridesExistingFileIfModified() { - $sourceFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_source_file'; - $targetFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_target_file'; + $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file'; + $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file'; file_put_contents($sourceFilePath, 'SOURCE FILE'); file_put_contents($targetFilePath, 'TARGET FILE'); touch($targetFilePath, time() - 1000); - $filesystem = new Filesystem(); - $filesystem->copy($sourceFilePath, $targetFilePath); + $this->filesystem->copy($sourceFilePath, $targetFilePath); $this->assertFileExists($targetFilePath); $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath)); - - unlink($sourceFilePath); - unlink($targetFilePath); } public function testCopyDoesNotOverrideExistingFileByDefault() { - $sourceFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_source_file'; - $targetFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_target_file'; + $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file'; + $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file'; file_put_contents($sourceFilePath, 'SOURCE FILE'); file_put_contents($targetFilePath, 'TARGET FILE'); + + // make sure both files have the same modification time $modificationTime = time() - 1000; touch($sourceFilePath, $modificationTime); touch($targetFilePath, $modificationTime); - $filesystem = new Filesystem(); - $filesystem->copy($sourceFilePath, $targetFilePath); + $this->filesystem->copy($sourceFilePath, $targetFilePath); $this->assertFileExists($targetFilePath); $this->assertEquals('TARGET FILE', file_get_contents($targetFilePath)); - - unlink($sourceFilePath); - unlink($targetFilePath); } public function testCopyOverridesExistingFileIfForced() { - $sourceFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_source_file'; - $targetFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_target_file'; + $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file'; + $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file'; file_put_contents($sourceFilePath, 'SOURCE FILE'); file_put_contents($targetFilePath, 'TARGET FILE'); + + // make sure both files have the same modification time $modificationTime = time() - 1000; touch($sourceFilePath, $modificationTime); touch($targetFilePath, $modificationTime); - $filesystem = new Filesystem(); - $filesystem->copy($sourceFilePath, $targetFilePath, true); + $this->filesystem->copy($sourceFilePath, $targetFilePath, true); $this->assertFileExists($targetFilePath); $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath)); - - unlink($sourceFilePath); - unlink($targetFilePath); } public function testCopyCreatesTargetDirectoryIfItDoesNotExist() { - $sourceFilePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'copy_source_file'; - $targetFileDirectory = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file'; + $targetFileDirectory = $this->workspace.DIRECTORY_SEPARATOR.'directory'; $targetFilePath = $targetFileDirectory.DIRECTORY_SEPARATOR.'copy_target_file'; file_put_contents($sourceFilePath, 'SOURCE FILE'); - $filesystem = new Filesystem(); - $filesystem->copy($sourceFilePath, $targetFilePath); + $this->filesystem->copy($sourceFilePath, $targetFilePath); $this->assertTrue(is_dir($targetFileDirectory)); $this->assertFileExists($targetFilePath); $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath)); - - unlink($sourceFilePath); - unlink($targetFilePath); - rmdir($targetFileDirectory); } public function testMkdirCreatesDirectoriesRecursively() { - $directory = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); - $subDirectory = $directory.DIRECTORY_SEPARATOR.'sub_directory'; + $directory = $this->workspace + .DIRECTORY_SEPARATOR.'directory' + .DIRECTORY_SEPARATOR.'sub_directory'; - $filesystem = new Filesystem(); - $result = $filesystem->mkdir($subDirectory); + $result = $this->filesystem->mkdir($directory); $this->assertTrue($result); - $this->assertTrue(is_dir($subDirectory)); - - rmdir($subDirectory); - rmdir($directory); + $this->assertTrue(is_dir($directory)); } public function testMkdirCreatesDirectoriesFromArray() { - $basePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $basePath = $this->workspace.DIRECTORY_SEPARATOR; $directories = array( $basePath.'1', $basePath.'2', $basePath.'3' ); - $filesystem = new Filesystem(); - $result = $filesystem->mkdir($directories); + $result = $this->filesystem->mkdir($directories); $this->assertTrue($result); $this->assertTrue(is_dir($basePath.'1')); $this->assertTrue(is_dir($basePath.'2')); $this->assertTrue(is_dir($basePath.'3')); - - rmdir($basePath.'1'); - rmdir($basePath.'2'); - rmdir($basePath.'3'); } public function testMkdirCreatesDirectoriesFromTraversableObject() { - $basePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $basePath = $this->workspace.DIRECTORY_SEPARATOR; $directories = new \ArrayObject(array( $basePath.'1', $basePath.'2', $basePath.'3' )); - $filesystem = new Filesystem(); - $result = $filesystem->mkdir($directories); + $result = $this->filesystem->mkdir($directories); $this->assertTrue($result); $this->assertTrue(is_dir($basePath.'1')); $this->assertTrue(is_dir($basePath.'2')); $this->assertTrue(is_dir($basePath.'3')); - - rmdir($basePath.'1'); - rmdir($basePath.'2'); - rmdir($basePath.'3'); } public function testMkdirCreatesDirectoriesEvenIfItFailsToCreateOneOfThem() { - $basePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $basePath = $this->workspace.DIRECTORY_SEPARATOR; $directories = array( $basePath.'1', $basePath.'2', $basePath.'3' ); @@ -181,71 +194,48 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase // create a file to make that directory cannot be created file_put_contents($basePath.'2', ''); - $filesystem = new Filesystem(); - $result = $filesystem->mkdir($directories); + $result = $this->filesystem->mkdir($directories); $this->assertFalse($result); $this->assertTrue(is_dir($basePath.'1')); $this->assertFalse(is_dir($basePath.'2')); $this->assertTrue(is_dir($basePath.'3')); - - rmdir($basePath.'1'); - unlink($basePath.'2'); - rmdir($basePath.'3'); } public function testTouchCreatesEmptyFile() { - $basePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); - $file = $basePath.'1'; + $file = $this->workspace.DIRECTORY_SEPARATOR.'1'; - $filesystem = new Filesystem(); - $filesystem->touch($file); + $this->filesystem->touch($file); - $this->assertFileExists($basePath.'1'); - - unlink($basePath.'1'); + $this->assertFileExists($file); } public function testTouchCreatesEmptyFilesFromArray() { - $basePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $basePath = $this->workspace.DIRECTORY_SEPARATOR; $files = array( $basePath.'1', $basePath.'2', $basePath.'3' ); - mkdir($basePath); - $filesystem = new Filesystem(); - $filesystem->touch($files); + $this->filesystem->touch($files); $this->assertFileExists($basePath.'1'); $this->assertFileExists($basePath.'2'); $this->assertFileExists($basePath.'3'); - - unlink($basePath.'1'); - unlink($basePath.'2'); - unlink($basePath.'3'); - rmdir($basePath); } public function testTouchCreatesEmptyFilesFromTraversableObject() { - $basePath = sys_get_temp_dir().DIRECTORY_SEPARATOR.time(); + $basePath = $this->workspace.DIRECTORY_SEPARATOR; $files = new \ArrayObject(array( $basePath.'1', $basePath.'2', $basePath.'3' )); - mkdir($basePath); - $filesystem = new Filesystem(); - $filesystem->touch($files); + $this->filesystem->touch($files); $this->assertFileExists($basePath.'1'); $this->assertFileExists($basePath.'2'); $this->assertFileExists($basePath.'3'); - - unlink($basePath.'1'); - unlink($basePath.'2'); - unlink($basePath.'3'); - rmdir($basePath); } } From bba008056042cdb247e5b1c0cb95d75eddcf7a73 Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Fri, 6 Apr 2012 20:38:21 +0100 Subject: [PATCH 06/15] [Filesystem] Added unit tests for remove method. --- .../Filesystem/Tests/FilesystemTest.php | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index 065c50b55e..548afa9f06 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -238,4 +238,71 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase $this->assertFileExists($basePath.'2'); $this->assertFileExists($basePath.'3'); } + + public function testRemoveCleansFilesLinksAndDirectoriesIteratively() + { + $basePath = $this->workspace.DIRECTORY_SEPARATOR.'directory'.DIRECTORY_SEPARATOR; + + mkdir($basePath); + mkdir($basePath.'dir'); + touch($basePath.'file'); + link($basePath.'file', $basePath.'link'); + + $this->filesystem->remove($basePath); + + $this->assertTrue(!is_dir($basePath)); + } + + public function testRemoveCleansArrayOfFilesLinksAndDirectories() + { + $basePath = $this->workspace.DIRECTORY_SEPARATOR; + + mkdir($basePath.'dir'); + touch($basePath.'file'); + link($basePath.'file', $basePath.'link'); + + $files = array( + $basePath.'dir', $basePath.'file', $basePath.'link' + ); + + $this->filesystem->remove($files); + + $this->assertTrue(!is_dir($basePath.'dir')); + $this->assertTrue(!is_file($basePath.'file')); + $this->assertTrue(!is_link($basePath.'link')); + } + + public function testRemoveCleansTraversableObjectOfFilesLinksAndDirectories() + { + $basePath = $this->workspace.DIRECTORY_SEPARATOR; + + mkdir($basePath.'dir'); + touch($basePath.'file'); + link($basePath.'file', $basePath.'link'); + + $files = new \ArrayObject(array( + $basePath.'dir', $basePath.'file', $basePath.'link' + )); + + $this->filesystem->remove($files); + + $this->assertTrue(!is_dir($basePath.'dir')); + $this->assertTrue(!is_file($basePath.'file')); + $this->assertTrue(!is_link($basePath.'link')); + } + + public function testRemoveIgnoresNonExistingFiles() + { + $basePath = $this->workspace.DIRECTORY_SEPARATOR; + + mkdir($basePath.'dir'); + + $files = array( + $basePath.'dir', $basePath.'file' + ); + + $this->filesystem->remove($files); + + $this->assertTrue(!is_dir($basePath.'dir')); + } } From 8071859915aeca7d65afbb44e5c081e8b4a45634 Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Fri, 6 Apr 2012 21:17:12 +0100 Subject: [PATCH 07/15] [Filesystem] Added unit tests for chmod method. --- .../Filesystem/Tests/FilesystemTest.php | 54 +++++++++++++++++-- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index 548afa9f06..31f753b9bd 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -45,10 +45,6 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase */ private function clean($file) { - if (!file_exists($file)) { - return; - } - if (is_dir($file) && !is_link($file)) { $dir = new \FilesystemIterator($file); foreach ($dir as $childFile) { @@ -305,4 +301,54 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase $this->assertTrue(!is_dir($basePath.'dir')); } + + public function testChmodChangesFileMode() + { + $file = $this->workspace.DIRECTORY_SEPARATOR.'file'; + touch($file); + + $this->filesystem->chmod($file, 0753); + + $this->assertEquals(753, $this->getFilePermisions($file)); + } + + public function testChmodChangesModeOfArrayOfFiles() + { + $directory = $this->workspace.DIRECTORY_SEPARATOR.'directory'; + $file = $this->workspace.DIRECTORY_SEPARATOR.'file'; + $files = array($directory, $file); + + mkdir($directory); + touch($file); + + $this->filesystem->chmod($files, 0753); + + $this->assertEquals(753, $this->getFilePermisions($file)); + $this->assertEquals(753, $this->getFilePermisions($directory)); + } + + public function testChmodChangesModeOfTraversableFileObject() + { + $directory = $this->workspace.DIRECTORY_SEPARATOR.'directory'; + $file = $this->workspace.DIRECTORY_SEPARATOR.'file'; + $files = new \ArrayObject(array($directory, $file)); + + mkdir($directory); + touch($file); + + $this->filesystem->chmod($files, 0753); + + $this->assertEquals(753, $this->getFilePermisions($file)); + $this->assertEquals(753, $this->getFilePermisions($directory)); + } + + /** + * Returns file permissions as three digits (i.e. 755) + * + * @return integer + */ + private function getFilePermisions($filePath) + { + return (int) substr(sprintf('%o', fileperms($filePath)), -3); + } } From a041feb4b386cc4de11b717cbd6be0c5b053a271 Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Fri, 6 Apr 2012 21:21:21 +0100 Subject: [PATCH 08/15] [Filesystem] Added unit tests for rename method. --- .../Filesystem/Tests/FilesystemTest.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index 31f753b9bd..a4cb26eeca 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -342,6 +342,32 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase $this->assertEquals(753, $this->getFilePermisions($directory)); } + public function testRename() + { + $file = $this->workspace.DIRECTORY_SEPARATOR.'file'; + $newPath = $this->workspace.DIRECTORY_SEPARATOR.'new_file'; + touch($file); + + $this->filesystem->rename($file, $newPath); + + $this->assertFileNotExists($file); + $this->assertFileExists($newPath); + } + + /** + * @expectedException \RuntimeException + */ + public function testRenameThrowsExceptionIfTargetAlreadyExists() + { + $file = $this->workspace.DIRECTORY_SEPARATOR.'file'; + $newPath = $this->workspace.DIRECTORY_SEPARATOR.'new_file'; + + touch($file); + touch($newPath); + + $this->filesystem->rename($file, $newPath); + } + /** * Returns file permissions as three digits (i.e. 755) * From 21860cbb5dbdbc20c4515f56c2631d99ff95ba26 Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Fri, 6 Apr 2012 22:25:57 +0100 Subject: [PATCH 09/15] [Filesystem] Added unit tests for symlink method. --- .../Filesystem/Tests/FilesystemTest.php | 69 ++++++++++++++++--- 1 file changed, 59 insertions(+), 10 deletions(-) diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index a4cb26eeca..05f429fe20 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -235,56 +235,51 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase $this->assertFileExists($basePath.'3'); } - public function testRemoveCleansFilesLinksAndDirectoriesIteratively() + public function testRemoveCleansFilesAndDirectoriesIteratively() { $basePath = $this->workspace.DIRECTORY_SEPARATOR.'directory'.DIRECTORY_SEPARATOR; mkdir($basePath); mkdir($basePath.'dir'); touch($basePath.'file'); - link($basePath.'file', $basePath.'link'); $this->filesystem->remove($basePath); $this->assertTrue(!is_dir($basePath)); } - public function testRemoveCleansArrayOfFilesLinksAndDirectories() + public function testRemoveCleansArrayOfFilesAndDirectories() { $basePath = $this->workspace.DIRECTORY_SEPARATOR; mkdir($basePath.'dir'); touch($basePath.'file'); - link($basePath.'file', $basePath.'link'); $files = array( - $basePath.'dir', $basePath.'file', $basePath.'link' + $basePath.'dir', $basePath.'file' ); $this->filesystem->remove($files); $this->assertTrue(!is_dir($basePath.'dir')); $this->assertTrue(!is_file($basePath.'file')); - $this->assertTrue(!is_link($basePath.'link')); } - public function testRemoveCleansTraversableObjectOfFilesLinksAndDirectories() + public function testRemoveCleansTraversableObjectOfFilesAndDirectories() { $basePath = $this->workspace.DIRECTORY_SEPARATOR; mkdir($basePath.'dir'); touch($basePath.'file'); - link($basePath.'file', $basePath.'link'); $files = new \ArrayObject(array( - $basePath.'dir', $basePath.'file', $basePath.'link' + $basePath.'dir', $basePath.'file' )); $this->filesystem->remove($files); $this->assertTrue(!is_dir($basePath.'dir')); $this->assertTrue(!is_file($basePath.'file')); - $this->assertTrue(!is_link($basePath.'link')); } public function testRemoveIgnoresNonExistingFiles() @@ -368,6 +363,53 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase $this->filesystem->rename($file, $newPath); } + public function testSymlink() + { + $this->markAsSkippeIfSymlinkIsMissing(); + + $file = $this->workspace.DIRECTORY_SEPARATOR.'file'; + $link = $this->workspace.DIRECTORY_SEPARATOR.'link'; + + touch($file); + + $this->filesystem->symlink($file, $link); + + $this->assertTrue(is_link($link)); + $this->assertEquals($file, readlink($link)); + } + + public function testSymlinkIsOverwrittenIfPointsToDifferentTarget() + { + $this->markAsSkippeIfSymlinkIsMissing(); + + $file = $this->workspace.DIRECTORY_SEPARATOR.'file'; + $link = $this->workspace.DIRECTORY_SEPARATOR.'link'; + + touch($file); + symlink($this->workspace, $link); + + $this->filesystem->symlink($file, $link); + + $this->assertTrue(is_link($link)); + $this->assertEquals($file, readlink($link)); + } + + public function testSymlinkIsNotOverwrittenIfAlreadyCreated() + { + $this->markAsSkippeIfSymlinkIsMissing(); + + $file = $this->workspace.DIRECTORY_SEPARATOR.'file'; + $link = $this->workspace.DIRECTORY_SEPARATOR.'link'; + + touch($file); + symlink($file, $link); + + $this->filesystem->symlink($file, $link); + + $this->assertTrue(is_link($link)); + $this->assertEquals($file, readlink($link)); + } + /** * Returns file permissions as three digits (i.e. 755) * @@ -377,4 +419,11 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase { return (int) substr(sprintf('%o', fileperms($filePath)), -3); } + + private function markAsSkippeIfSymlinkIsMissing() + { + if (!function_exists('symlink')) { + $this->markTestSkipped('symlink is not supported'); + } + } } From 2ee4b8861cea2e9fa713e769b2ec723988ffa63d Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Fri, 6 Apr 2012 23:05:31 +0100 Subject: [PATCH 10/15] [Filesystem] Added unit tests for makePathRelative method. --- .../Filesystem/Tests/FilesystemTest.php | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index 05f429fe20..367c83ea2e 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -410,6 +410,37 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase $this->assertEquals($file, readlink($link)); } + /** + * @dataProvider provideAbsolutePaths + */ + public function testMakePathRelative($endPath, $startPath, $expectedPath) + { + $path = $this->filesystem->makePathRelative($endPath, $startPath); + + $this->assertEquals($expectedPath, $path); + } + + /** + * @return array + */ + public function provideAbsolutePaths() + { + $paths = array( + array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/src/Symfony/Component', '../'), + array('var/lib/symfony/', 'var/lib/symfony/src/Symfony/Component', '../../../'), + array('/usr/lib/symfony/', '/var/lib/symfony/src/Symfony/Component', '../../../../../../usr/lib/symfony/') + ); + + // fix directory separator + foreach ($paths as $i => $pathItems) { + foreach ($pathItems as $k => $path) { + $paths[$i][$k] = str_replace('/', DIRECTORY_SEPARATOR, $path); + } + } + + return $paths; + } + /** * Returns file permissions as three digits (i.e. 755) * From 8c940699c1a1723222db3de2c2726a870e62013e Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Fri, 6 Apr 2012 23:16:46 +0100 Subject: [PATCH 11/15] [Filesystem] Added unit tests for isAbsolutePath method. --- .../Filesystem/Tests/FilesystemTest.php | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index 367c83ea2e..d420a6310c 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -411,7 +411,7 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase } /** - * @dataProvider provideAbsolutePaths + * @dataProvider providePathsForMakePathRelative */ public function testMakePathRelative($endPath, $startPath, $expectedPath) { @@ -423,7 +423,7 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase /** * @return array */ - public function provideAbsolutePaths() + public function providePathsForMakePathRelative() { $paths = array( array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/src/Symfony/Component', '../'), @@ -441,6 +441,30 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase return $paths; } + /** + * @dataProvider providePathsForIsAbsolutePath + */ + public function testIsAbsolutePath($path, $expectedResult) + { + $result = $this->filesystem->isAbsolutePath($path); + + $this->assertEquals($expectedResult, $result); + } + + /** + * @return array + */ + public function providePathsForIsAbsolutePath() + { + return array( + array('/var/lib', true), + array('c:\\\\var\\lib', true), + array('\\var\\lib', true), + array('var/lib', false), + array('../var/lib', false) + ); + } + /** * Returns file permissions as three digits (i.e. 755) * From 11a676d672374b149ae183c8b329b17518e60209 Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Fri, 6 Apr 2012 23:56:57 +0100 Subject: [PATCH 12/15] [Filesystem] Added unit tests for mirror method. --- .../Filesystem/Tests/FilesystemTest.php | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index d420a6310c..337fd30b81 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -441,6 +441,28 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase return $paths; } + public function testMirrorCopiesFilesAndDirectoriesRecursively() + { + $sourcePath = $this->workspace.DIRECTORY_SEPARATOR.'source'.DIRECTORY_SEPARATOR; + $directory = $sourcePath.'directory'.DIRECTORY_SEPARATOR; + $file1 = $directory.'file1'; + $file2 = $sourcePath.'file2'; + + mkdir($sourcePath); + mkdir($directory); + file_put_contents($file1, 'FILE1'); + file_put_contents($file2, 'FILE2'); + + $targetPath = $this->workspace.DIRECTORY_SEPARATOR.'target'.DIRECTORY_SEPARATOR; + + $this->filesystem->mirror($sourcePath, $targetPath); + + $this->assertTrue(is_dir($targetPath)); + $this->assertTrue(is_dir($targetPath.'directory')); + $this->assertFileEquals($file1, $targetPath.'directory'.DIRECTORY_SEPARATOR.'file1'); + $this->assertFileEquals($file2, $targetPath.'file2'); + } + /** * @dataProvider providePathsForIsAbsolutePath */ From d4243a28b61a39e37c97ed2d73f1a0e80a95de7f Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Sat, 7 Apr 2012 00:01:32 +0100 Subject: [PATCH 13/15] [Filesystem] Fixed a bug in remove being unable to remove symlinks to unexisting file or directory. --- src/Symfony/Component/Filesystem/Filesystem.php | 2 +- .../Filesystem/Tests/FilesystemTest.php | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Filesystem/Filesystem.php b/src/Symfony/Component/Filesystem/Filesystem.php index d9a78a1cf8..960bfb7098 100644 --- a/src/Symfony/Component/Filesystem/Filesystem.php +++ b/src/Symfony/Component/Filesystem/Filesystem.php @@ -88,7 +88,7 @@ class Filesystem $files = iterator_to_array($this->toIterator($files)); $files = array_reverse($files); foreach ($files as $file) { - if (!file_exists($file)) { + if (!file_exists($file) && !is_link($file)) { continue; } diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index 337fd30b81..41bede8a91 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -297,6 +297,22 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase $this->assertTrue(!is_dir($basePath.'dir')); } + public function testRemoveCleansInvalidLinks() + { + $this->markAsSkippeIfSymlinkIsMissing(); + + $basePath = $this->workspace.DIRECTORY_SEPARATOR.'directory'.DIRECTORY_SEPARATOR; + + mkdir($basePath); + mkdir($basePath.'dir'); + // create symlink to unexisting file + symlink($basePath.'file', $basePath.'link'); + + $this->filesystem->remove($basePath); + + $this->assertTrue(!is_dir($basePath)); + } + public function testChmodChangesFileMode() { $file = $this->workspace.DIRECTORY_SEPARATOR.'file'; From f5f5c21228f12a02fec7d8eed5bc69a30d55a805 Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Sat, 7 Apr 2012 00:05:37 +0100 Subject: [PATCH 14/15] [Filesystem] Fixed typos in the docblocks. --- src/Symfony/Component/Filesystem/Filesystem.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Filesystem/Filesystem.php b/src/Symfony/Component/Filesystem/Filesystem.php index 960bfb7098..62f83d8f66 100644 --- a/src/Symfony/Component/Filesystem/Filesystem.php +++ b/src/Symfony/Component/Filesystem/Filesystem.php @@ -69,7 +69,7 @@ class Filesystem /** * Creates empty files. * - * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to remove + * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to create */ public function touch($files) { @@ -105,7 +105,7 @@ class Filesystem /** * Change mode for an array of files or directories. * - * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to remove + * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to change mode * @param integer $mode The new mode * @param integer $umask The mode mask (octal) */ @@ -171,8 +171,8 @@ class Filesystem /** * Given an existing path, convert it to a path relative to a given starting path * - * @var string Absolute path of target - * @var string Absolute path where traversal begins + * @param string $endPath Absolute path of target + * @param string $startPath Absolute path where traversal begins * * @return string Path of target relative to starting path */ From 100e97ebe736e9e61bc062046c499ef094cbc441 Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Sat, 7 Apr 2012 08:23:20 +0100 Subject: [PATCH 15/15] [Filesystem] Fixed warnings in makePathRelative(). --- src/Symfony/Component/Filesystem/Filesystem.php | 2 +- src/Symfony/Component/Filesystem/Tests/FilesystemTest.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Filesystem/Filesystem.php b/src/Symfony/Component/Filesystem/Filesystem.php index 62f83d8f66..b99b65162e 100644 --- a/src/Symfony/Component/Filesystem/Filesystem.php +++ b/src/Symfony/Component/Filesystem/Filesystem.php @@ -180,7 +180,7 @@ class Filesystem { // Find for which character the the common path stops $offset = 0; - while ($startPath[$offset] === $endPath[$offset]) { + while (isset($startPath[$offset]) && isset($endPath[$offset]) && $startPath[$offset] === $endPath[$offset]) { $offset++; } diff --git a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php index 41bede8a91..b6c48fab6f 100644 --- a/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php +++ b/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php @@ -444,7 +444,8 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase $paths = array( array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/src/Symfony/Component', '../'), array('var/lib/symfony/', 'var/lib/symfony/src/Symfony/Component', '../../../'), - array('/usr/lib/symfony/', '/var/lib/symfony/src/Symfony/Component', '../../../../../../usr/lib/symfony/') + array('/usr/lib/symfony/', '/var/lib/symfony/src/Symfony/Component', '../../../../../../usr/lib/symfony/'), + array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/', '../src/Symfony/'), ); // fix directory separator