{
public function testCopyCreatesNewFile()
{
- $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
- $targetFilePath = $this->workspace.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');
$this->filesystem->copy($sourceFilePath, $targetFilePath);
$this->assertFileExists($targetFilePath);
- $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath));
+ $this->assertStringEqualsFile($targetFilePath, 'SOURCE FILE');
}
/**
*/
public function testCopyFails()
{
- $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
- $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file';
+ $sourceFilePath = $this->workspace.\DIRECTORY_SEPARATOR.'copy_source_file';
+ $targetFilePath = $this->workspace.\DIRECTORY_SEPARATOR.'copy_target_file';
$this->filesystem->copy($sourceFilePath, $targetFilePath);
}
public function testCopyUnreadableFileFails()
{
// skip test on Windows; PHP can't easily set file as unreadable on Windows
- if ('\\' === DIRECTORY_SEPARATOR) {
+ if ('\\' === \DIRECTORY_SEPARATOR) {
$this->markTestSkipped('This test cannot run on Windows.');
}
- $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
- $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file';
+ if (!getenv('USER') || 'root' === getenv('USER')) {
+ $this->markTestSkipped('This test will fail if run under superuser');
+ }
+
+ $sourceFilePath = $this->workspace.\DIRECTORY_SEPARATOR.'copy_source_file';
+ $targetFilePath = $this->workspace.\DIRECTORY_SEPARATOR.'copy_target_file';
file_put_contents($sourceFilePath, 'SOURCE FILE');
public function testCopyOverridesExistingFileIfModified()
{
- $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
- $targetFilePath = $this->workspace.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');
$this->filesystem->copy($sourceFilePath, $targetFilePath);
$this->assertFileExists($targetFilePath);
- $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath));
+ $this->assertStringEqualsFile($targetFilePath, 'SOURCE FILE');
}
public function testCopyDoesNotOverrideExistingFileByDefault()
{
- $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
- $targetFilePath = $this->workspace.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');
$this->filesystem->copy($sourceFilePath, $targetFilePath);
$this->assertFileExists($targetFilePath);
- $this->assertEquals('TARGET FILE', file_get_contents($targetFilePath));
+ $this->assertStringEqualsFile($targetFilePath, 'TARGET FILE');
}
public function testCopyOverridesExistingFileIfForced()
{
- $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
- $targetFilePath = $this->workspace.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');
$this->filesystem->copy($sourceFilePath, $targetFilePath, true);
$this->assertFileExists($targetFilePath);
- $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath));
+ $this->assertStringEqualsFile($targetFilePath, 'SOURCE FILE');
}
/**
public function testCopyWithOverrideWithReadOnlyTargetFails()
{
// skip test on Windows; PHP can't easily set file as unwritable on Windows
- if ('\\' === DIRECTORY_SEPARATOR) {
+ if ('\\' === \DIRECTORY_SEPARATOR) {
$this->markTestSkipped('This test cannot run on Windows.');
}
- $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
- $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file';
+ if (!getenv('USER') || 'root' === getenv('USER')) {
+ $this->markTestSkipped('This test will fail if run under superuser');
+ }
+
+ $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');
public function testCopyCreatesTargetDirectoryIfItDoesNotExist()
{
- $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
- $targetFileDirectory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
- $targetFilePath = $targetFileDirectory.DIRECTORY_SEPARATOR.'copy_target_file';
+ $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');
$this->assertTrue(is_dir($targetFileDirectory));
$this->assertFileExists($targetFilePath);
- $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath));
+ $this->assertStringEqualsFile($targetFilePath, 'SOURCE FILE');
}
/**
*/
public function testCopyForOriginUrlsAndExistingLocalFileDefaultsToCopy()
{
- $sourceFilePath = 'http://symfony.com/images/common/logo/logo_symfony_header.png';
- $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file';
+ if (!\in_array('https', stream_get_wrappers())) {
+ $this->markTestSkipped('"https" stream wrapper is not enabled.');
+ }
+ $sourceFilePath = 'https://symfony.com/images/common/logo/logo_symfony_header.png';
+ $targetFilePath = $this->workspace.\DIRECTORY_SEPARATOR.'copy_target_file';
file_put_contents($targetFilePath, 'TARGET FILE');
public function testMkdirCreatesDirectoriesRecursively()
{
$directory = $this->workspace
- .DIRECTORY_SEPARATOR.'directory'
- .DIRECTORY_SEPARATOR.'sub_directory';
+ .\DIRECTORY_SEPARATOR.'directory'
+ .\DIRECTORY_SEPARATOR.'sub_directory';
$this->filesystem->mkdir($directory);
public function testMkdirCreatesDirectoriesFromArray()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR;
$directories = array(
$basePath.'1', $basePath.'2', $basePath.'3',
);
public function testMkdirCreatesDirectoriesFromTraversableObject()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR;
$directories = new \ArrayObject(array(
$basePath.'1', $basePath.'2', $basePath.'3',
));
*/
public function testMkdirCreatesDirectoriesFails()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR;
$dir = $basePath.'2';
file_put_contents($dir, '');
public function testTouchCreatesEmptyFile()
{
- $file = $this->workspace.DIRECTORY_SEPARATOR.'1';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'1';
$this->filesystem->touch($file);
*/
public function testTouchFails()
{
- $file = $this->workspace.DIRECTORY_SEPARATOR.'1'.DIRECTORY_SEPARATOR.'2';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'1'.\DIRECTORY_SEPARATOR.'2';
$this->filesystem->touch($file);
}
public function testTouchCreatesEmptyFilesFromArray()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR;
$files = array(
$basePath.'1', $basePath.'2', $basePath.'3',
);
public function testTouchCreatesEmptyFilesFromTraversableObject()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR;
$files = new \ArrayObject(array(
$basePath.'1', $basePath.'2', $basePath.'3',
));
public function testRemoveCleansFilesAndDirectoriesIteratively()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR.'directory'.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR.'directory'.\DIRECTORY_SEPARATOR;
mkdir($basePath);
mkdir($basePath.'dir');
public function testRemoveCleansArrayOfFilesAndDirectories()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR;
mkdir($basePath.'dir');
touch($basePath.'file');
public function testRemoveCleansTraversableObjectOfFilesAndDirectories()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR;
mkdir($basePath.'dir');
touch($basePath.'file');
public function testRemoveIgnoresNonExistingFiles()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR;
mkdir($basePath.'dir');
{
$this->markAsSkippedIfSymlinkIsMissing();
- $basePath = $this->workspace.DIRECTORY_SEPARATOR.'directory'.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR.'directory'.\DIRECTORY_SEPARATOR;
mkdir($basePath);
mkdir($basePath.'dir');
// create symlink to nonexistent dir
rmdir($basePath.'dir');
- $this->assertFalse('\\' === DIRECTORY_SEPARATOR ? @readlink($basePath.'dir-link') : is_dir($basePath.'dir-link'));
+ $this->assertFalse('\\' === \DIRECTORY_SEPARATOR ? @readlink($basePath.'dir-link') : is_dir($basePath.'dir-link'));
$this->filesystem->remove($basePath);
public function testFilesExists()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR.'directory'.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR.'directory'.\DIRECTORY_SEPARATOR;
mkdir($basePath);
touch($basePath.'file1');
*/
public function testFilesExistsFails()
{
- if ('\\' !== DIRECTORY_SEPARATOR) {
- $this->markTestSkipped('Test covers edge case on Windows only.');
+ if ('\\' !== \DIRECTORY_SEPARATOR) {
+ $this->markTestSkipped('Long file names are an issue on Windows');
}
-
$basePath = $this->workspace.'\\directory\\';
+ $maxPathLength = PHP_MAXPATHLEN - 2;
$oldPath = getcwd();
mkdir($basePath);
chdir($basePath);
- $file = str_repeat('T', 259 - strlen($basePath));
+ $file = str_repeat('T', $maxPathLength - \strlen($basePath) + 1);
$path = $basePath.$file;
exec('TYPE NUL >>'.$file); // equivalent of touch, we can not use the php touch() here because it suffers from the same limitation
$this->longPathNamesWindows[] = $path; // save this so we can clean up later
public function testFilesExistsTraversableObjectOfFilesAndDirectories()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR;
mkdir($basePath.'dir');
touch($basePath.'file');
public function testFilesNotExistsTraversableObjectOfFilesAndDirectories()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR;
mkdir($basePath.'dir');
touch($basePath.'file');
public function testInvalidFileNotExists()
{
- $basePath = $this->workspace.DIRECTORY_SEPARATOR.'directory'.DIRECTORY_SEPARATOR;
+ $basePath = $this->workspace.\DIRECTORY_SEPARATOR.'directory'.\DIRECTORY_SEPARATOR;
$this->assertFalse($this->filesystem->exists($basePath.time()));
}
{
$this->markAsSkippedIfChmodIsMissing();
- $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
+ $dir = $this->workspace.\DIRECTORY_SEPARATOR.'dir';
mkdir($dir);
- $file = $dir.DIRECTORY_SEPARATOR.'file';
+ $file = $dir.\DIRECTORY_SEPARATOR.'file';
touch($file);
$this->filesystem->chmod($file, 0400);
{
$this->markAsSkippedIfChmodIsMissing();
- if (defined('HHVM_VERSION')) {
+ if (\defined('HHVM_VERSION')) {
$this->markTestSkipped('chmod() changes permissions even when passing invalid modes on HHVM');
}
- $dir = $this->workspace.DIRECTORY_SEPARATOR.'file';
+ $dir = $this->workspace.\DIRECTORY_SEPARATOR.'file';
touch($dir);
$permissions = fileperms($dir);
{
$this->markAsSkippedIfChmodIsMissing();
- $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
+ $dir = $this->workspace.\DIRECTORY_SEPARATOR.'dir';
mkdir($dir);
- $file = $dir.DIRECTORY_SEPARATOR.'file';
+ $file = $dir.\DIRECTORY_SEPARATOR.'file';
touch($file);
$this->filesystem->chmod($file, 0400, 0000, true);
{
$this->markAsSkippedIfChmodIsMissing();
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
touch($file);
$this->filesystem->chmod($file, 0770, 0022);
{
$this->markAsSkippedIfChmodIsMissing();
- $directory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
+ $directory = $this->workspace.\DIRECTORY_SEPARATOR.'directory';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
$files = array($directory, $file);
mkdir($directory);
{
$this->markAsSkippedIfChmodIsMissing();
- $directory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
+ $directory = $this->workspace.\DIRECTORY_SEPARATOR.'directory';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
$files = new \ArrayObject(array($directory, $file));
mkdir($directory);
{
$this->markAsSkippedIfChmodIsMissing();
- $directory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
- $subdirectory = $directory.DIRECTORY_SEPARATOR.'subdirectory';
+ $directory = $this->workspace.\DIRECTORY_SEPARATOR.'directory';
+ $subdirectory = $directory.\DIRECTORY_SEPARATOR.'subdirectory';
mkdir($directory);
mkdir($subdirectory);
{
$this->markAsSkippedIfPosixIsMissing();
- $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
+ $dir = $this->workspace.\DIRECTORY_SEPARATOR.'dir';
mkdir($dir);
$owner = $this->getFileOwner($dir);
{
$this->markAsSkippedIfPosixIsMissing();
- $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
+ $dir = $this->workspace.\DIRECTORY_SEPARATOR.'dir';
mkdir($dir);
- $file = $dir.DIRECTORY_SEPARATOR.'file';
+ $file = $dir.\DIRECTORY_SEPARATOR.'file';
touch($file);
$owner = $this->getFileOwner($dir);
{
$this->markAsSkippedIfSymlinkIsMissing();
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
- $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
touch($file);
$this->assertSame($owner, $this->getFileOwner($link));
}
+ public function testChownLink()
+ {
+ $this->markAsSkippedIfLinkIsMissing();
+
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
+
+ touch($file);
+
+ $this->filesystem->hardlink($file, $link);
+
+ $owner = $this->getFileOwner($link);
+ $this->filesystem->chown($link, $owner);
+
+ $this->assertSame($owner, $this->getFileOwner($link));
+ }
+
/**
* @expectedException \Symfony\Component\Filesystem\Exception\IOException
*/
{
$this->markAsSkippedIfSymlinkIsMissing();
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
- $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
touch($file);
$this->filesystem->chown($link, 'user'.time().mt_rand(1000, 9999));
}
+ /**
+ * @expectedException \Symfony\Component\Filesystem\Exception\IOException
+ */
+ public function testChownLinkFails()
+ {
+ $this->markAsSkippedIfLinkIsMissing();
+
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
+
+ touch($file);
+
+ $this->filesystem->hardlink($file, $link);
+
+ $this->filesystem->chown($link, 'user'.time().mt_rand(1000, 9999));
+ }
+
/**
* @expectedException \Symfony\Component\Filesystem\Exception\IOException
*/
{
$this->markAsSkippedIfPosixIsMissing();
- $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
+ $dir = $this->workspace.\DIRECTORY_SEPARATOR.'dir';
mkdir($dir);
$this->filesystem->chown($dir, 'user'.time().mt_rand(1000, 9999));
{
$this->markAsSkippedIfPosixIsMissing();
- $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
+ $dir = $this->workspace.\DIRECTORY_SEPARATOR.'dir';
mkdir($dir);
$group = $this->getFileGroup($dir);
{
$this->markAsSkippedIfPosixIsMissing();
- $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
+ $dir = $this->workspace.\DIRECTORY_SEPARATOR.'dir';
mkdir($dir);
- $file = $dir.DIRECTORY_SEPARATOR.'file';
+ $file = $dir.\DIRECTORY_SEPARATOR.'file';
touch($file);
$group = $this->getFileGroup($dir);
{
$this->markAsSkippedIfSymlinkIsMissing();
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
- $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
touch($file);
$this->assertSame($group, $this->getFileGroup($link));
}
+ public function testChgrpLink()
+ {
+ $this->markAsSkippedIfLinkIsMissing();
+
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
+
+ touch($file);
+
+ $this->filesystem->hardlink($file, $link);
+
+ $group = $this->getFileGroup($link);
+ $this->filesystem->chgrp($link, $group);
+
+ $this->assertSame($group, $this->getFileGroup($link));
+ }
+
/**
* @expectedException \Symfony\Component\Filesystem\Exception\IOException
*/
{
$this->markAsSkippedIfSymlinkIsMissing();
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
- $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
touch($file);
$this->filesystem->chgrp($link, 'user'.time().mt_rand(1000, 9999));
}
+ /**
+ * @expectedException \Symfony\Component\Filesystem\Exception\IOException
+ */
+ public function testChgrpLinkFails()
+ {
+ $this->markAsSkippedIfLinkIsMissing();
+
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
+
+ touch($file);
+
+ $this->filesystem->hardlink($file, $link);
+
+ $this->filesystem->chgrp($link, 'user'.time().mt_rand(1000, 9999));
+ }
+
/**
* @expectedException \Symfony\Component\Filesystem\Exception\IOException
*/
{
$this->markAsSkippedIfPosixIsMissing();
- $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
+ $dir = $this->workspace.\DIRECTORY_SEPARATOR.'dir';
mkdir($dir);
$this->filesystem->chgrp($dir, 'user'.time().mt_rand(1000, 9999));
public function testRename()
{
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
- $newPath = $this->workspace.DIRECTORY_SEPARATOR.'new_file';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $newPath = $this->workspace.\DIRECTORY_SEPARATOR.'new_file';
touch($file);
$this->filesystem->rename($file, $newPath);
*/
public function testRenameThrowsExceptionIfTargetAlreadyExists()
{
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
- $newPath = $this->workspace.DIRECTORY_SEPARATOR.'new_file';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $newPath = $this->workspace.\DIRECTORY_SEPARATOR.'new_file';
touch($file);
touch($newPath);
public function testRenameOverwritesTheTargetIfItAlreadyExists()
{
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
- $newPath = $this->workspace.DIRECTORY_SEPARATOR.'new_file';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $newPath = $this->workspace.\DIRECTORY_SEPARATOR.'new_file';
touch($file);
touch($newPath);
*/
public function testRenameThrowsExceptionOnError()
{
- $file = $this->workspace.DIRECTORY_SEPARATOR.uniqid('fs_test_', true);
- $newPath = $this->workspace.DIRECTORY_SEPARATOR.'new_file';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.uniqid('fs_test_', true);
+ $newPath = $this->workspace.\DIRECTORY_SEPARATOR.'new_file';
$this->filesystem->rename($file, $newPath);
}
public function testSymlink()
{
- if ('\\' === DIRECTORY_SEPARATOR) {
+ if ('\\' === \DIRECTORY_SEPARATOR) {
$this->markTestSkipped('Windows does not support creating "broken" symlinks');
}
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
- $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
// $file does not exists right now: creating "broken" links is a wanted feature
$this->filesystem->symlink($file, $link);
{
$this->markAsSkippedIfSymlinkIsMissing();
- $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
$this->filesystem->remove($link);
- $this->assertTrue(!is_link($link));
- $this->assertTrue(!is_file($link));
- $this->assertTrue(!is_dir($link));
+ $this->assertFalse(is_link($link));
+ $this->assertFalse(is_file($link));
+ $this->assertFalse(is_dir($link));
}
public function testSymlinkIsOverwrittenIfPointsToDifferentTarget()
{
$this->markAsSkippedIfSymlinkIsMissing();
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
- $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
touch($file);
symlink($this->workspace, $link);
{
$this->markAsSkippedIfSymlinkIsMissing();
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
- $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
touch($file);
symlink($file, $link);
{
$this->markAsSkippedIfSymlinkIsMissing();
- $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
- $link1 = $this->workspace.DIRECTORY_SEPARATOR.'dir'.DIRECTORY_SEPARATOR.'link';
- $link2 = $this->workspace.DIRECTORY_SEPARATOR.'dir'.DIRECTORY_SEPARATOR.'subdir'.DIRECTORY_SEPARATOR.'link';
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link1 = $this->workspace.\DIRECTORY_SEPARATOR.'dir'.\DIRECTORY_SEPARATOR.'link';
+ $link2 = $this->workspace.\DIRECTORY_SEPARATOR.'dir'.\DIRECTORY_SEPARATOR.'subdir'.\DIRECTORY_SEPARATOR.'link';
touch($file);
$this->assertEquals($file, readlink($link2));
}
+ public function testLink()
+ {
+ $this->markAsSkippedIfLinkIsMissing();
+
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
+
+ touch($file);
+ $this->filesystem->hardlink($file, $link);
+
+ $this->assertTrue(is_file($link));
+ $this->assertEquals(fileinode($file), fileinode($link));
+ }
+
+ /**
+ * @depends testLink
+ */
+ public function testRemoveLink()
+ {
+ $this->markAsSkippedIfLinkIsMissing();
+
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
+
+ $this->filesystem->remove($link);
+
+ $this->assertTrue(!is_file($link));
+ }
+
+ public function testLinkIsOverwrittenIfPointsToDifferentTarget()
+ {
+ $this->markAsSkippedIfLinkIsMissing();
+
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $file2 = $this->workspace.\DIRECTORY_SEPARATOR.'file2';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
+
+ touch($file);
+ touch($file2);
+ link($file2, $link);
+
+ $this->filesystem->hardlink($file, $link);
+
+ $this->assertTrue(is_file($link));
+ $this->assertEquals(fileinode($file), fileinode($link));
+ }
+
+ public function testLinkIsNotOverwrittenIfAlreadyCreated()
+ {
+ $this->markAsSkippedIfLinkIsMissing();
+
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
+
+ touch($file);
+ link($file, $link);
+
+ $this->filesystem->hardlink($file, $link);
+
+ $this->assertTrue(is_file($link));
+ $this->assertEquals(fileinode($file), fileinode($link));
+ }
+
+ public function testLinkWithSeveralTargets()
+ {
+ $this->markAsSkippedIfLinkIsMissing();
+
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link1 = $this->workspace.\DIRECTORY_SEPARATOR.'link';
+ $link2 = $this->workspace.\DIRECTORY_SEPARATOR.'link2';
+
+ touch($file);
+
+ $this->filesystem->hardlink($file, array($link1, $link2));
+
+ $this->assertTrue(is_file($link1));
+ $this->assertEquals(fileinode($file), fileinode($link1));
+ $this->assertTrue(is_file($link2));
+ $this->assertEquals(fileinode($file), fileinode($link2));
+ }
+
+ public function testLinkWithSameTarget()
+ {
+ $this->markAsSkippedIfLinkIsMissing();
+
+ $file = $this->workspace.\DIRECTORY_SEPARATOR.'file';
+ $link = $this->workspace.\DIRECTORY_SEPARATOR.'link';
+
+ touch($file);
+
+ // practically same as testLinkIsNotOverwrittenIfAlreadyCreated
+ $this->filesystem->hardlink($file, array($link, $link));
+
+ $this->assertTrue(is_file($link));
+ $this->assertEquals(fileinode($file), fileinode($link));
+ }
+
+ public function testReadRelativeLink()
+ {
+ $this->markAsSkippedIfSymlinkIsMissing();
+
+ if ('\\' === \DIRECTORY_SEPARATOR) {
+ $this->markTestSkipped('Relative symbolic links are not supported on Windows');
+ }
+
+ $file = $this->workspace.'/file';
+ $link1 = $this->workspace.'/dir/link';
+ $link2 = $this->workspace.'/dir/link2';
+ touch($file);
+
+ $this->filesystem->symlink('../file', $link1);
+ $this->filesystem->symlink('link', $link2);
+
+ $this->assertEquals($this->normalize('../file'), $this->filesystem->readlink($link1));
+ $this->assertEquals('link', $this->filesystem->readlink($link2));
+ $this->assertEquals($file, $this->filesystem->readlink($link1, true));
+ $this->assertEquals($file, $this->filesystem->readlink($link2, true));
+ $this->assertEquals($file, $this->filesystem->readlink($file, true));
+ }
+
+ public function testReadAbsoluteLink()
+ {
+ $this->markAsSkippedIfSymlinkIsMissing();
+
+ $file = $this->normalize($this->workspace.'/file');
+ $link1 = $this->normalize($this->workspace.'/dir/link');
+ $link2 = $this->normalize($this->workspace.'/dir/link2');
+ touch($file);
+
+ $this->filesystem->symlink($file, $link1);
+ $this->filesystem->symlink($link1, $link2);
+
+ $this->assertEquals($file, $this->filesystem->readlink($link1));
+ $this->assertEquals($link1, $this->filesystem->readlink($link2));
+ $this->assertEquals($file, $this->filesystem->readlink($link1, true));
+ $this->assertEquals($file, $this->filesystem->readlink($link2, true));
+ $this->assertEquals($file, $this->filesystem->readlink($file, true));
+ }
+
+ public function testReadBrokenLink()
+ {
+ $this->markAsSkippedIfSymlinkIsMissing();
+
+ if ('\\' === \DIRECTORY_SEPARATOR) {
+ $this->markTestSkipped('Windows does not support creating "broken" symlinks');
+ }
+
+ $file = $this->workspace.'/file';
+ $link = $this->workspace.'/link';
+
+ $this->filesystem->symlink($file, $link);
+
+ $this->assertEquals($file, $this->filesystem->readlink($link));
+ $this->assertNull($this->filesystem->readlink($link, true));
+
+ touch($file);
+ $this->assertEquals($file, $this->filesystem->readlink($link, true));
+ }
+
+ public function testReadLinkDefaultPathDoesNotExist()
+ {
+ $this->assertNull($this->filesystem->readlink($this->normalize($this->workspace.'/invalid')));
+ }
+
+ public function testReadLinkDefaultPathNotLink()
+ {
+ $file = $this->normalize($this->workspace.'/file');
+ touch($file);
+
+ $this->assertNull($this->filesystem->readlink($file));
+ }
+
+ public function testReadLinkCanonicalizePath()
+ {
+ $this->markAsSkippedIfSymlinkIsMissing();
+
+ $file = $this->normalize($this->workspace.'/file');
+ mkdir($this->normalize($this->workspace.'/dir'));
+ touch($file);
+
+ $this->assertEquals($file, $this->filesystem->readlink($this->normalize($this->workspace.'/dir/../file'), true));
+ }
+
+ public function testReadLinkCanonicalizedPathDoesNotExist()
+ {
+ $this->assertNull($this->filesystem->readlink($this->normalize($this->workspace.'invalid'), true));
+ }
+
/**
* @dataProvider providePathsForMakePathRelative
*/
$this->assertEquals($expectedPath, $path);
}
- /**
- * @return array
- */
public function providePathsForMakePathRelative()
{
$paths = array(
array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/src/Symfony/Component/', '../'),
array('/var/lib/symfony/src/Symfony', '/var/lib/symfony/src/Symfony/Component', '../'),
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('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/', 'src/Symfony/'),
array('/aa/bb', '/aa/bb', './'),
array('C:/../../aa/../bb/cc', 'C:/aa/dd/..', '../bb/cc/'),
);
- if ('\\' === DIRECTORY_SEPARATOR) {
+ if ('\\' === \DIRECTORY_SEPARATOR) {
$paths[] = array('c:\var\lib/symfony/src/Symfony/', 'c:/var/lib/symfony/', 'src/Symfony/');
}
return $paths;
}
+ /**
+ * @group legacy
+ * @dataProvider provideLegacyPathsForMakePathRelativeWithRelativePaths
+ * @expectedDeprecation Support for passing relative paths to Symfony\Component\Filesystem\Filesystem::makePathRelative() is deprecated since Symfony 3.4 and will be removed in 4.0.
+ */
+ public function testMakePathRelativeWithRelativePaths($endPath, $startPath, $expectedPath)
+ {
+ $path = $this->filesystem->makePathRelative($endPath, $startPath);
+
+ $this->assertEquals($expectedPath, $path);
+ }
+
+ public function provideLegacyPathsForMakePathRelativeWithRelativePaths()
+ {
+ return array(
+ array('usr/lib/symfony/', 'var/lib/symfony/src/Symfony/Component', '../../../../../../usr/lib/symfony/'),
+ array('aa/bb', 'aa/cc', '../bb/'),
+ array('aa/cc', 'bb/cc', '../../aa/cc/'),
+ array('aa/bb', 'aa/./cc', '../bb/'),
+ array('aa/./bb', 'aa/cc', '../bb/'),
+ array('aa/./bb', 'aa/./cc', '../bb/'),
+ array('../../', '../../', './'),
+ array('../aa/bb/', 'aa/bb/', '../../../aa/bb/'),
+ array('../../../', '../../', '../'),
+ array('', '', './'),
+ array('', 'aa/', '../'),
+ array('aa/', '', 'aa/'),
+ );
+ }
+
public function testMirrorCopiesFilesAndDirectoriesRecursively()
{
- $sourcePath = $this->workspace.DIRECTORY_SEPARATOR.'source'.DIRECTORY_SEPARATOR;
- $directory = $sourcePath.'directory'.DIRECTORY_SEPARATOR;
+ $sourcePath = $this->workspace.\DIRECTORY_SEPARATOR.'source'.\DIRECTORY_SEPARATOR;
+ $directory = $sourcePath.'directory'.\DIRECTORY_SEPARATOR;
$file1 = $directory.'file1';
$file2 = $sourcePath.'file2';
file_put_contents($file1, 'FILE1');
file_put_contents($file2, 'FILE2');
- $targetPath = $this->workspace.DIRECTORY_SEPARATOR.'target'.DIRECTORY_SEPARATOR;
+ $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($file1, $targetPath.'directory'.\DIRECTORY_SEPARATOR.'file1');
$this->assertFileEquals($file2, $targetPath.'file2');
$this->filesystem->remove($file1);
$this->filesystem->mirror($sourcePath, $targetPath, null, array('delete' => false));
- $this->assertTrue($this->filesystem->exists($targetPath.'directory'.DIRECTORY_SEPARATOR.'file1'));
+ $this->assertTrue($this->filesystem->exists($targetPath.'directory'.\DIRECTORY_SEPARATOR.'file1'));
$this->filesystem->mirror($sourcePath, $targetPath, null, array('delete' => true));
- $this->assertFalse($this->filesystem->exists($targetPath.'directory'.DIRECTORY_SEPARATOR.'file1'));
+ $this->assertFalse($this->filesystem->exists($targetPath.'directory'.\DIRECTORY_SEPARATOR.'file1'));
file_put_contents($file1, 'FILE1');
$this->filesystem->mirror($sourcePath, $targetPath, null, array('delete' => true));
- $this->assertTrue($this->filesystem->exists($targetPath.'directory'.DIRECTORY_SEPARATOR.'file1'));
+ $this->assertTrue($this->filesystem->exists($targetPath.'directory'.\DIRECTORY_SEPARATOR.'file1'));
$this->filesystem->remove($directory);
$this->filesystem->mirror($sourcePath, $targetPath, null, array('delete' => true));
$this->assertFalse($this->filesystem->exists($targetPath.'directory'));
- $this->assertFalse($this->filesystem->exists($targetPath.'directory'.DIRECTORY_SEPARATOR.'file1'));
+ $this->assertFalse($this->filesystem->exists($targetPath.'directory'.\DIRECTORY_SEPARATOR.'file1'));
}
public function testMirrorCreatesEmptyDirectory()
{
- $sourcePath = $this->workspace.DIRECTORY_SEPARATOR.'source'.DIRECTORY_SEPARATOR;
+ $sourcePath = $this->workspace.\DIRECTORY_SEPARATOR.'source'.\DIRECTORY_SEPARATOR;
mkdir($sourcePath);
- $targetPath = $this->workspace.DIRECTORY_SEPARATOR.'target'.DIRECTORY_SEPARATOR;
+ $targetPath = $this->workspace.\DIRECTORY_SEPARATOR.'target'.\DIRECTORY_SEPARATOR;
$this->filesystem->mirror($sourcePath, $targetPath);
{
$this->markAsSkippedIfSymlinkIsMissing();
- $sourcePath = $this->workspace.DIRECTORY_SEPARATOR.'source'.DIRECTORY_SEPARATOR;
+ $sourcePath = $this->workspace.\DIRECTORY_SEPARATOR.'source'.\DIRECTORY_SEPARATOR;
mkdir($sourcePath);
file_put_contents($sourcePath.'file1', 'FILE1');
symlink($sourcePath.'file1', $sourcePath.'link1');
- $targetPath = $this->workspace.DIRECTORY_SEPARATOR.'target'.DIRECTORY_SEPARATOR;
+ $targetPath = $this->workspace.\DIRECTORY_SEPARATOR.'target'.\DIRECTORY_SEPARATOR;
$this->filesystem->mirror($sourcePath, $targetPath);
$this->assertTrue(is_dir($targetPath));
$this->assertFileEquals($sourcePath.'file1', $targetPath.'link1');
- $this->assertTrue(is_link($targetPath.DIRECTORY_SEPARATOR.'link1'));
+ $this->assertTrue(is_link($targetPath.\DIRECTORY_SEPARATOR.'link1'));
}
public function testMirrorCopiesLinkedDirectoryContents()
{
$this->markAsSkippedIfSymlinkIsMissing(true);
- $sourcePath = $this->workspace.DIRECTORY_SEPARATOR.'source'.DIRECTORY_SEPARATOR;
+ $sourcePath = $this->workspace.\DIRECTORY_SEPARATOR.'source'.\DIRECTORY_SEPARATOR;
mkdir($sourcePath.'nested/', 0777, true);
file_put_contents($sourcePath.'/nested/file1.txt', 'FILE1');
// Note: We symlink directory, not file
symlink($sourcePath.'nested', $sourcePath.'link1');
- $targetPath = $this->workspace.DIRECTORY_SEPARATOR.'target'.DIRECTORY_SEPARATOR;
+ $targetPath = $this->workspace.\DIRECTORY_SEPARATOR.'target'.\DIRECTORY_SEPARATOR;
$this->filesystem->mirror($sourcePath, $targetPath);
$this->assertTrue(is_dir($targetPath));
$this->assertFileEquals($sourcePath.'/nested/file1.txt', $targetPath.'link1/file1.txt');
- $this->assertTrue(is_link($targetPath.DIRECTORY_SEPARATOR.'link1'));
+ $this->assertTrue(is_link($targetPath.\DIRECTORY_SEPARATOR.'link1'));
}
public function testMirrorCopiesRelativeLinkedContents()
{
$this->markAsSkippedIfSymlinkIsMissing(true);
- $sourcePath = $this->workspace.DIRECTORY_SEPARATOR.'source'.DIRECTORY_SEPARATOR;
+ $sourcePath = $this->workspace.\DIRECTORY_SEPARATOR.'source'.\DIRECTORY_SEPARATOR;
$oldPath = getcwd();
mkdir($sourcePath.'nested/', 0777, true);
chdir($oldPath);
- $targetPath = $this->workspace.DIRECTORY_SEPARATOR.'target'.DIRECTORY_SEPARATOR;
+ $targetPath = $this->workspace.\DIRECTORY_SEPARATOR.'target'.\DIRECTORY_SEPARATOR;
$this->filesystem->mirror($sourcePath, $targetPath);
$this->assertTrue(is_dir($targetPath));
$this->assertFileEquals($sourcePath.'/nested/file1.txt', $targetPath.'link1/file1.txt');
- $this->assertTrue(is_link($targetPath.DIRECTORY_SEPARATOR.'link1'));
- $this->assertEquals('\\' === DIRECTORY_SEPARATOR ? realpath($sourcePath.'\nested') : 'nested', readlink($targetPath.DIRECTORY_SEPARATOR.'link1'));
+ $this->assertTrue(is_link($targetPath.\DIRECTORY_SEPARATOR.'link1'));
+ $this->assertEquals('\\' === \DIRECTORY_SEPARATOR ? realpath($sourcePath.'\nested') : 'nested', readlink($targetPath.\DIRECTORY_SEPARATOR.'link1'));
+ }
+
+ public function testMirrorContentsWithSameNameAsSourceOrTargetWithoutDeleteOption()
+ {
+ $sourcePath = $this->workspace.\DIRECTORY_SEPARATOR.'source'.\DIRECTORY_SEPARATOR;
+
+ mkdir($sourcePath);
+ touch($sourcePath.'source');
+ touch($sourcePath.'target');
+
+ $targetPath = $this->workspace.\DIRECTORY_SEPARATOR.'target'.\DIRECTORY_SEPARATOR;
+
+ $oldPath = getcwd();
+ chdir($this->workspace);
+
+ $this->filesystem->mirror('source', $targetPath);
+
+ chdir($oldPath);
+
+ $this->assertTrue(is_dir($targetPath));
+ $this->assertFileExists($targetPath.'source');
+ $this->assertFileExists($targetPath.'target');
+ }
+
+ public function testMirrorContentsWithSameNameAsSourceOrTargetWithDeleteOption()
+ {
+ $sourcePath = $this->workspace.\DIRECTORY_SEPARATOR.'source'.\DIRECTORY_SEPARATOR;
+
+ mkdir($sourcePath);
+ touch($sourcePath.'source');
+
+ $targetPath = $this->workspace.\DIRECTORY_SEPARATOR.'target'.\DIRECTORY_SEPARATOR;
+
+ mkdir($targetPath);
+ touch($targetPath.'source');
+ touch($targetPath.'target');
+
+ $oldPath = getcwd();
+ chdir($this->workspace);
+
+ $this->filesystem->mirror('source', 'target', null, array('delete' => true));
+
+ chdir($oldPath);
+
+ $this->assertTrue(is_dir($targetPath));
+ $this->assertFileExists($targetPath.'source');
+ $this->assertFileNotExists($targetPath.'target');
}
/**
$this->assertEquals($expectedResult, $result);
}
- /**
- * @return array
- */
public function providePathsForIsAbsolutePath()
{
return array(
public function testTempnamOnUnwritableFallsBackToSysTmp()
{
$scheme = 'file://';
- $dirname = $scheme.$this->workspace.DIRECTORY_SEPARATOR.'does_not_exist';
+ $dirname = $scheme.$this->workspace.\DIRECTORY_SEPARATOR.'does_not_exist';
$filename = $this->filesystem->tempnam($dirname, 'bar');
$realTempDir = realpath(sys_get_temp_dir());
- $this->assertStringStartsWith(rtrim($scheme.$realTempDir, DIRECTORY_SEPARATOR), $filename);
+ $this->assertStringStartsWith(rtrim($scheme.$realTempDir, \DIRECTORY_SEPARATOR), $filename);
$this->assertFileExists($filename);
// Tear down
public function testDumpFile()
{
- $filename = $this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'baz.txt';
+ $filename = $this->workspace.\DIRECTORY_SEPARATOR.'foo'.\DIRECTORY_SEPARATOR.'baz.txt';
- $this->filesystem->dumpFile($filename, 'bar');
+ // skip mode check on Windows
+ if ('\\' !== \DIRECTORY_SEPARATOR) {
+ $oldMask = umask(0002);
+ }
+ $this->filesystem->dumpFile($filename, 'bar');
$this->assertFileExists($filename);
- $this->assertSame('bar', file_get_contents($filename));
+ $this->assertStringEqualsFile($filename, 'bar');
+
+ // skip mode check on Windows
+ if ('\\' !== \DIRECTORY_SEPARATOR) {
+ $this->assertFilePermissions(664, $filename);
+ umask($oldMask);
+ }
}
- /**
- * @group legacy
- */
- public function testDumpFileAndSetPermissions()
+ public function testDumpFileWithArray()
{
- $filename = $this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'baz.txt';
+ $filename = $this->workspace.\DIRECTORY_SEPARATOR.'foo'.\DIRECTORY_SEPARATOR.'baz.txt';
- $this->filesystem->dumpFile($filename, 'bar', 0753);
+ $this->filesystem->dumpFile($filename, array('bar'));
$this->assertFileExists($filename);
- $this->assertSame('bar', file_get_contents($filename));
-
- // skip mode check on Windows
- if ('\\' !== DIRECTORY_SEPARATOR) {
- $this->assertFilePermissions(753, $filename);
- }
+ $this->assertStringEqualsFile($filename, 'bar');
}
- public function testDumpFileWithNullMode()
+ public function testDumpFileWithResource()
{
- $filename = $this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'baz.txt';
+ $filename = $this->workspace.\DIRECTORY_SEPARATOR.'foo'.\DIRECTORY_SEPARATOR.'baz.txt';
- $this->filesystem->dumpFile($filename, 'bar', null);
+ $resource = fopen('php://memory', 'rw');
+ fwrite($resource, 'bar');
+ fseek($resource, 0);
- $this->assertFileExists($filename);
- $this->assertSame('bar', file_get_contents($filename));
+ $this->filesystem->dumpFile($filename, $resource);
- // skip mode check on Windows
- if ('\\' !== DIRECTORY_SEPARATOR) {
- $this->assertFilePermissions(600, $filename);
- }
+ fclose($resource);
+ $this->assertFileExists($filename);
+ $this->assertStringEqualsFile($filename, 'bar');
}
public function testDumpFileOverwritesAnExistingFile()
{
- $filename = $this->workspace.DIRECTORY_SEPARATOR.'foo.txt';
+ $filename = $this->workspace.\DIRECTORY_SEPARATOR.'foo.txt';
file_put_contents($filename, 'FOO BAR');
$this->filesystem->dumpFile($filename, 'bar');
$this->assertFileExists($filename);
- $this->assertSame('bar', file_get_contents($filename));
+ $this->assertStringEqualsFile($filename, 'bar');
}
public function testDumpFileWithFileScheme()
{
- if (defined('HHVM_VERSION')) {
+ if (\defined('HHVM_VERSION')) {
$this->markTestSkipped('HHVM does not handle the file:// scheme correctly');
}
$scheme = 'file://';
- $filename = $scheme.$this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'baz.txt';
+ $filename = $scheme.$this->workspace.\DIRECTORY_SEPARATOR.'foo'.\DIRECTORY_SEPARATOR.'baz.txt';
- $this->filesystem->dumpFile($filename, 'bar', null);
+ $this->filesystem->dumpFile($filename, 'bar');
$this->assertFileExists($filename);
- $this->assertSame('bar', file_get_contents($filename));
+ $this->assertStringEqualsFile($filename, 'bar');
}
public function testDumpFileWithZlibScheme()
{
$scheme = 'compress.zlib://';
- $filename = $this->workspace.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'baz.txt';
+ $filename = $this->workspace.\DIRECTORY_SEPARATOR.'foo'.\DIRECTORY_SEPARATOR.'baz.txt';
- $this->filesystem->dumpFile($filename, 'bar', null);
+ $this->filesystem->dumpFile($filename, 'bar');
// Zlib stat uses file:// wrapper so remove scheme
$this->assertFileExists(str_replace($scheme, '', $filename));
- $this->assertSame('bar', file_get_contents($filename));
+ $this->assertStringEqualsFile($filename, 'bar');
+ }
+
+ public function testAppendToFile()
+ {
+ $filename = $this->workspace.\DIRECTORY_SEPARATOR.'foo'.\DIRECTORY_SEPARATOR.'bar.txt';
+
+ // skip mode check on Windows
+ if ('\\' !== \DIRECTORY_SEPARATOR) {
+ $oldMask = umask(0002);
+ }
+
+ $this->filesystem->dumpFile($filename, 'foo');
+
+ $this->filesystem->appendToFile($filename, 'bar');
+
+ $this->assertFileExists($filename);
+ $this->assertStringEqualsFile($filename, 'foobar');
+
+ // skip mode check on Windows
+ if ('\\' !== \DIRECTORY_SEPARATOR) {
+ $this->assertFilePermissions(664, $filename);
+ umask($oldMask);
+ }
+ }
+
+ public function testAppendToFileWithScheme()
+ {
+ if (\defined('HHVM_VERSION')) {
+ $this->markTestSkipped('HHVM does not handle the file:// scheme correctly');
+ }
+
+ $scheme = 'file://';
+ $filename = $scheme.$this->workspace.\DIRECTORY_SEPARATOR.'foo'.\DIRECTORY_SEPARATOR.'baz.txt';
+ $this->filesystem->dumpFile($filename, 'foo');
+
+ $this->filesystem->appendToFile($filename, 'bar');
+
+ $this->assertFileExists($filename);
+ $this->assertStringEqualsFile($filename, 'foobar');
+ }
+
+ public function testAppendToFileWithZlibScheme()
+ {
+ $scheme = 'compress.zlib://';
+ $filename = $this->workspace.\DIRECTORY_SEPARATOR.'foo'.\DIRECTORY_SEPARATOR.'baz.txt';
+ $this->filesystem->dumpFile($filename, 'foo');
+
+ // Zlib stat uses file:// wrapper so remove it
+ $this->assertStringEqualsFile(str_replace($scheme, '', $filename), 'foo');
+
+ $this->filesystem->appendToFile($filename, 'bar');
+
+ $this->assertFileExists($filename);
+ $this->assertStringEqualsFile($filename, 'foobar');
+ }
+
+ public function testAppendToFileCreateTheFileIfNotExists()
+ {
+ $filename = $this->workspace.\DIRECTORY_SEPARATOR.'foo'.\DIRECTORY_SEPARATOR.'bar.txt';
+
+ // skip mode check on Windows
+ if ('\\' !== \DIRECTORY_SEPARATOR) {
+ $oldMask = umask(0002);
+ }
+
+ $this->filesystem->appendToFile($filename, 'bar');
+
+ // skip mode check on Windows
+ if ('\\' !== \DIRECTORY_SEPARATOR) {
+ $this->assertFilePermissions(664, $filename);
+ umask($oldMask);
+ }
+
+ $this->assertFileExists($filename);
+ $this->assertStringEqualsFile($filename, 'bar');
}
public function testDumpKeepsExistingPermissionsWhenOverwritingAnExistingFile()
{
$this->markAsSkippedIfChmodIsMissing();
- $filename = $this->workspace.DIRECTORY_SEPARATOR.'foo.txt';
+ $filename = $this->workspace.\DIRECTORY_SEPARATOR.'foo.txt';
file_put_contents($filename, 'FOO BAR');
chmod($filename, 0745);
{
$this->markAsSkippedIfChmodIsMissing();
- $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
- $targetFilePath = $this->workspace.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');
chmod($sourceFilePath, 0745);
$this->assertFilePermissions(767, $targetFilePath);
}
+
+ /**
+ * Normalize the given path (transform each blackslash into a real directory separator).
+ *
+ * @param string $path
+ *
+ * @return string
+ */
+ private function normalize($path)
+ {
+ return str_replace('/', \DIRECTORY_SEPARATOR, $path);
+ }
}