/integration-tests/performance-test-engine/vendor/symfony/symfony/src/Symfony/Component/Filesystem/Tests/FilesystemTest.php

https://github.com/societies/SOCIETIES-Platform · PHP · 881 lines · 596 code · 215 blank · 70 comment · 10 complexity · 93681552cb1dccd37cbddeb8e08c6a33 MD5 · raw file

  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\Filesystem\Tests;
  11. use Symfony\Component\Filesystem\Filesystem;
  12. /**
  13. * Test class for Filesystem.
  14. */
  15. class FilesystemTest extends \PHPUnit_Framework_TestCase
  16. {
  17. /**
  18. * @var string $workspace
  19. */
  20. private $workspace = null;
  21. /**
  22. * @var \Symfony\Component\Filesystem\Filesystem $filesystem
  23. */
  24. private $filesystem = null;
  25. public function setUp()
  26. {
  27. $this->filesystem = new Filesystem();
  28. $this->workspace = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.time().rand(0, 1000);
  29. mkdir($this->workspace, 0777, true);
  30. $this->workspace = realpath($this->workspace);
  31. }
  32. public function tearDown()
  33. {
  34. $this->clean($this->workspace);
  35. }
  36. /**
  37. * @param string $file
  38. */
  39. private function clean($file)
  40. {
  41. if (is_dir($file) && !is_link($file)) {
  42. $dir = new \FilesystemIterator($file);
  43. foreach ($dir as $childFile) {
  44. $this->clean($childFile);
  45. }
  46. rmdir($file);
  47. } else {
  48. unlink($file);
  49. }
  50. }
  51. public function testCopyCreatesNewFile()
  52. {
  53. $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
  54. $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file';
  55. file_put_contents($sourceFilePath, 'SOURCE FILE');
  56. $this->filesystem->copy($sourceFilePath, $targetFilePath);
  57. $this->assertFileExists($targetFilePath);
  58. $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath));
  59. }
  60. /**
  61. * @expectedException Symfony\Component\Filesystem\Exception\IOException
  62. */
  63. public function testCopyFails()
  64. {
  65. $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
  66. $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file';
  67. $this->filesystem->copy($sourceFilePath, $targetFilePath);
  68. }
  69. public function testCopyOverridesExistingFileIfModified()
  70. {
  71. $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
  72. $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file';
  73. file_put_contents($sourceFilePath, 'SOURCE FILE');
  74. file_put_contents($targetFilePath, 'TARGET FILE');
  75. touch($targetFilePath, time() - 1000);
  76. $this->filesystem->copy($sourceFilePath, $targetFilePath);
  77. $this->assertFileExists($targetFilePath);
  78. $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath));
  79. }
  80. public function testCopyDoesNotOverrideExistingFileByDefault()
  81. {
  82. $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
  83. $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file';
  84. file_put_contents($sourceFilePath, 'SOURCE FILE');
  85. file_put_contents($targetFilePath, 'TARGET FILE');
  86. // make sure both files have the same modification time
  87. $modificationTime = time() - 1000;
  88. touch($sourceFilePath, $modificationTime);
  89. touch($targetFilePath, $modificationTime);
  90. $this->filesystem->copy($sourceFilePath, $targetFilePath);
  91. $this->assertFileExists($targetFilePath);
  92. $this->assertEquals('TARGET FILE', file_get_contents($targetFilePath));
  93. }
  94. public function testCopyOverridesExistingFileIfForced()
  95. {
  96. $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
  97. $targetFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_target_file';
  98. file_put_contents($sourceFilePath, 'SOURCE FILE');
  99. file_put_contents($targetFilePath, 'TARGET FILE');
  100. // make sure both files have the same modification time
  101. $modificationTime = time() - 1000;
  102. touch($sourceFilePath, $modificationTime);
  103. touch($targetFilePath, $modificationTime);
  104. $this->filesystem->copy($sourceFilePath, $targetFilePath, true);
  105. $this->assertFileExists($targetFilePath);
  106. $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath));
  107. }
  108. public function testCopyCreatesTargetDirectoryIfItDoesNotExist()
  109. {
  110. $sourceFilePath = $this->workspace.DIRECTORY_SEPARATOR.'copy_source_file';
  111. $targetFileDirectory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
  112. $targetFilePath = $targetFileDirectory.DIRECTORY_SEPARATOR.'copy_target_file';
  113. file_put_contents($sourceFilePath, 'SOURCE FILE');
  114. $this->filesystem->copy($sourceFilePath, $targetFilePath);
  115. $this->assertTrue(is_dir($targetFileDirectory));
  116. $this->assertFileExists($targetFilePath);
  117. $this->assertEquals('SOURCE FILE', file_get_contents($targetFilePath));
  118. }
  119. public function testMkdirCreatesDirectoriesRecursively()
  120. {
  121. $directory = $this->workspace
  122. .DIRECTORY_SEPARATOR.'directory'
  123. .DIRECTORY_SEPARATOR.'sub_directory';
  124. $this->filesystem->mkdir($directory);
  125. $this->assertTrue(is_dir($directory));
  126. }
  127. public function testMkdirCreatesDirectoriesFromArray()
  128. {
  129. $basePath = $this->workspace.DIRECTORY_SEPARATOR;
  130. $directories = array(
  131. $basePath.'1', $basePath.'2', $basePath.'3'
  132. );
  133. $this->filesystem->mkdir($directories);
  134. $this->assertTrue(is_dir($basePath.'1'));
  135. $this->assertTrue(is_dir($basePath.'2'));
  136. $this->assertTrue(is_dir($basePath.'3'));
  137. }
  138. public function testMkdirCreatesDirectoriesFromTraversableObject()
  139. {
  140. $basePath = $this->workspace.DIRECTORY_SEPARATOR;
  141. $directories = new \ArrayObject(array(
  142. $basePath.'1', $basePath.'2', $basePath.'3'
  143. ));
  144. $this->filesystem->mkdir($directories);
  145. $this->assertTrue(is_dir($basePath.'1'));
  146. $this->assertTrue(is_dir($basePath.'2'));
  147. $this->assertTrue(is_dir($basePath.'3'));
  148. }
  149. /**
  150. * @expectedException Symfony\Component\Filesystem\Exception\IOException
  151. */
  152. public function testMkdirCreatesDirectoriesFails()
  153. {
  154. $basePath = $this->workspace.DIRECTORY_SEPARATOR;
  155. $dir = $basePath.'2';
  156. file_put_contents($dir, '');
  157. $this->filesystem->mkdir($dir);
  158. }
  159. public function testTouchCreatesEmptyFile()
  160. {
  161. $file = $this->workspace.DIRECTORY_SEPARATOR.'1';
  162. $this->filesystem->touch($file);
  163. $this->assertFileExists($file);
  164. }
  165. /**
  166. * @expectedException Symfony\Component\Filesystem\Exception\IOException
  167. */
  168. public function testTouchFails()
  169. {
  170. $file = $this->workspace.DIRECTORY_SEPARATOR.'1'.DIRECTORY_SEPARATOR.'2';
  171. $this->filesystem->touch($file);
  172. }
  173. public function testTouchCreatesEmptyFilesFromArray()
  174. {
  175. $basePath = $this->workspace.DIRECTORY_SEPARATOR;
  176. $files = array(
  177. $basePath.'1', $basePath.'2', $basePath.'3'
  178. );
  179. $this->filesystem->touch($files);
  180. $this->assertFileExists($basePath.'1');
  181. $this->assertFileExists($basePath.'2');
  182. $this->assertFileExists($basePath.'3');
  183. }
  184. public function testTouchCreatesEmptyFilesFromTraversableObject()
  185. {
  186. $basePath = $this->workspace.DIRECTORY_SEPARATOR;
  187. $files = new \ArrayObject(array(
  188. $basePath.'1', $basePath.'2', $basePath.'3'
  189. ));
  190. $this->filesystem->touch($files);
  191. $this->assertFileExists($basePath.'1');
  192. $this->assertFileExists($basePath.'2');
  193. $this->assertFileExists($basePath.'3');
  194. }
  195. public function testRemoveCleansFilesAndDirectoriesIteratively()
  196. {
  197. $basePath = $this->workspace.DIRECTORY_SEPARATOR.'directory'.DIRECTORY_SEPARATOR;
  198. mkdir($basePath);
  199. mkdir($basePath.'dir');
  200. touch($basePath.'file');
  201. $this->filesystem->remove($basePath);
  202. $this->assertTrue(!is_dir($basePath));
  203. }
  204. public function testRemoveCleansArrayOfFilesAndDirectories()
  205. {
  206. $basePath = $this->workspace.DIRECTORY_SEPARATOR;
  207. mkdir($basePath.'dir');
  208. touch($basePath.'file');
  209. $files = array(
  210. $basePath.'dir', $basePath.'file'
  211. );
  212. $this->filesystem->remove($files);
  213. $this->assertTrue(!is_dir($basePath.'dir'));
  214. $this->assertTrue(!is_file($basePath.'file'));
  215. }
  216. public function testRemoveCleansTraversableObjectOfFilesAndDirectories()
  217. {
  218. $basePath = $this->workspace.DIRECTORY_SEPARATOR;
  219. mkdir($basePath.'dir');
  220. touch($basePath.'file');
  221. $files = new \ArrayObject(array(
  222. $basePath.'dir', $basePath.'file'
  223. ));
  224. $this->filesystem->remove($files);
  225. $this->assertTrue(!is_dir($basePath.'dir'));
  226. $this->assertTrue(!is_file($basePath.'file'));
  227. }
  228. public function testRemoveIgnoresNonExistingFiles()
  229. {
  230. $basePath = $this->workspace.DIRECTORY_SEPARATOR;
  231. mkdir($basePath.'dir');
  232. $files = array(
  233. $basePath.'dir', $basePath.'file'
  234. );
  235. $this->filesystem->remove($files);
  236. $this->assertTrue(!is_dir($basePath.'dir'));
  237. }
  238. public function testRemoveCleansInvalidLinks()
  239. {
  240. $this->markAsSkippedIfSymlinkIsMissing();
  241. $basePath = $this->workspace.DIRECTORY_SEPARATOR.'directory'.DIRECTORY_SEPARATOR;
  242. mkdir($basePath);
  243. mkdir($basePath.'dir');
  244. // create symlink to unexisting file
  245. @symlink($basePath.'file', $basePath.'link');
  246. $this->filesystem->remove($basePath);
  247. $this->assertTrue(!is_dir($basePath));
  248. }
  249. public function testFilesExists()
  250. {
  251. $basePath = $this->workspace.DIRECTORY_SEPARATOR.'directory'.DIRECTORY_SEPARATOR;
  252. mkdir($basePath);
  253. touch($basePath.'file1');
  254. mkdir($basePath.'folder');
  255. $this->assertTrue($this->filesystem->exists($basePath.'file1'));
  256. $this->assertTrue($this->filesystem->exists($basePath.'folder'));
  257. }
  258. public function testFilesExistsTraversableObjectOfFilesAndDirectories()
  259. {
  260. $basePath = $this->workspace.DIRECTORY_SEPARATOR;
  261. mkdir($basePath.'dir');
  262. touch($basePath.'file');
  263. $files = new \ArrayObject(array(
  264. $basePath.'dir', $basePath.'file'
  265. ));
  266. $this->assertTrue($this->filesystem->exists($files));
  267. }
  268. public function testFilesNotExistsTraversableObjectOfFilesAndDirectories()
  269. {
  270. $basePath = $this->workspace.DIRECTORY_SEPARATOR;
  271. mkdir($basePath.'dir');
  272. touch($basePath.'file');
  273. touch($basePath.'file2');
  274. $files = new \ArrayObject(array(
  275. $basePath.'dir', $basePath.'file', $basePath.'file2'
  276. ));
  277. unlink($basePath.'file');
  278. $this->assertFalse($this->filesystem->exists($files));
  279. }
  280. public function testInvalidFileNotExists()
  281. {
  282. $basePath = $this->workspace.DIRECTORY_SEPARATOR.'directory'.DIRECTORY_SEPARATOR;
  283. $this->assertFalse($this->filesystem->exists($basePath.time()));
  284. }
  285. public function testChmodChangesFileMode()
  286. {
  287. $this->markAsSkippedIfChmodIsMissing();
  288. $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
  289. mkdir($dir);
  290. $file = $dir.DIRECTORY_SEPARATOR.'file';
  291. touch($file);
  292. $this->filesystem->chmod($file, 0400);
  293. $this->filesystem->chmod($dir, 0753);
  294. $this->assertEquals(753, $this->getFilePermissions($dir));
  295. $this->assertEquals(400, $this->getFilePermissions($file));
  296. }
  297. public function testChmodWrongMod()
  298. {
  299. $this->markAsSkippedIfChmodIsMissing();
  300. $dir = $this->workspace.DIRECTORY_SEPARATOR.'file';
  301. touch($dir);
  302. $this->filesystem->chmod($dir, 'Wrongmode');
  303. }
  304. public function testChmodRecursive()
  305. {
  306. $this->markAsSkippedIfChmodIsMissing();
  307. $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
  308. mkdir($dir);
  309. $file = $dir.DIRECTORY_SEPARATOR.'file';
  310. touch($file);
  311. $this->filesystem->chmod($file, 0400, 0000, true);
  312. $this->filesystem->chmod($dir, 0753, 0000, true);
  313. $this->assertEquals(753, $this->getFilePermissions($dir));
  314. $this->assertEquals(753, $this->getFilePermissions($file));
  315. }
  316. public function testChmodAppliesUmask()
  317. {
  318. $this->markAsSkippedIfChmodIsMissing();
  319. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  320. touch($file);
  321. $this->filesystem->chmod($file, 0770, 0022);
  322. $this->assertEquals(750, $this->getFilePermissions($file));
  323. }
  324. public function testChmodChangesModeOfArrayOfFiles()
  325. {
  326. $this->markAsSkippedIfChmodIsMissing();
  327. $directory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
  328. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  329. $files = array($directory, $file);
  330. mkdir($directory);
  331. touch($file);
  332. $this->filesystem->chmod($files, 0753);
  333. $this->assertEquals(753, $this->getFilePermissions($file));
  334. $this->assertEquals(753, $this->getFilePermissions($directory));
  335. }
  336. public function testChmodChangesModeOfTraversableFileObject()
  337. {
  338. $this->markAsSkippedIfChmodIsMissing();
  339. $directory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
  340. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  341. $files = new \ArrayObject(array($directory, $file));
  342. mkdir($directory);
  343. touch($file);
  344. $this->filesystem->chmod($files, 0753);
  345. $this->assertEquals(753, $this->getFilePermissions($file));
  346. $this->assertEquals(753, $this->getFilePermissions($directory));
  347. }
  348. public function testChown()
  349. {
  350. $this->markAsSkippedIfPosixIsMissing();
  351. $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
  352. mkdir($dir);
  353. $this->filesystem->chown($dir, $this->getFileOwner($dir));
  354. }
  355. public function testChownRecursive()
  356. {
  357. $this->markAsSkippedIfPosixIsMissing();
  358. $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
  359. mkdir($dir);
  360. $file = $dir.DIRECTORY_SEPARATOR.'file';
  361. touch($file);
  362. $this->filesystem->chown($dir, $this->getFileOwner($dir), true);
  363. }
  364. public function testChownSymlink()
  365. {
  366. $this->markAsSkippedIfSymlinkIsMissing();
  367. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  368. $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
  369. touch($file);
  370. $this->filesystem->symlink($file, $link);
  371. $this->filesystem->chown($link, $this->getFileOwner($link));
  372. }
  373. /**
  374. * @expectedException Symfony\Component\Filesystem\Exception\IOException
  375. */
  376. public function testChownSymlinkFails()
  377. {
  378. $this->markAsSkippedIfSymlinkIsMissing();
  379. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  380. $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
  381. touch($file);
  382. $this->filesystem->symlink($file, $link);
  383. $this->filesystem->chown($link, 'user' . time() . mt_rand(1000, 9999));
  384. }
  385. /**
  386. * @expectedException Symfony\Component\Filesystem\Exception\IOException
  387. */
  388. public function testChownFail()
  389. {
  390. $this->markAsSkippedIfPosixIsMissing();
  391. $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
  392. mkdir($dir);
  393. $this->filesystem->chown($dir, 'user' . time() . mt_rand(1000, 9999));
  394. }
  395. public function testChgrp()
  396. {
  397. $this->markAsSkippedIfPosixIsMissing();
  398. $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
  399. mkdir($dir);
  400. $this->filesystem->chgrp($dir, $this->getFileGroup($dir));
  401. }
  402. public function testChgrpRecursive()
  403. {
  404. $this->markAsSkippedIfPosixIsMissing();
  405. $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
  406. mkdir($dir);
  407. $file = $dir.DIRECTORY_SEPARATOR.'file';
  408. touch($file);
  409. $this->filesystem->chgrp($dir, $this->getFileGroup($dir), true);
  410. }
  411. public function testChgrpSymlink()
  412. {
  413. $this->markAsSkippedIfSymlinkIsMissing();
  414. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  415. $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
  416. touch($file);
  417. $this->filesystem->symlink($file, $link);
  418. $this->filesystem->chgrp($link, $this->getFileGroup($link));
  419. }
  420. /**
  421. * @expectedException Symfony\Component\Filesystem\Exception\IOException
  422. */
  423. public function testChgrpSymlinkFails()
  424. {
  425. $this->markAsSkippedIfSymlinkIsMissing();
  426. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  427. $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
  428. touch($file);
  429. $this->filesystem->symlink($file, $link);
  430. $this->filesystem->chgrp($link, 'user' . time() . mt_rand(1000, 9999));
  431. }
  432. /**
  433. * @expectedException Symfony\Component\Filesystem\Exception\IOException
  434. */
  435. public function testChgrpFail()
  436. {
  437. $this->markAsSkippedIfPosixIsMissing();
  438. $dir = $this->workspace.DIRECTORY_SEPARATOR.'dir';
  439. mkdir($dir);
  440. $this->filesystem->chgrp($dir, 'user' . time() . mt_rand(1000, 9999));
  441. }
  442. public function testRename()
  443. {
  444. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  445. $newPath = $this->workspace.DIRECTORY_SEPARATOR.'new_file';
  446. touch($file);
  447. $this->filesystem->rename($file, $newPath);
  448. $this->assertFileNotExists($file);
  449. $this->assertFileExists($newPath);
  450. }
  451. /**
  452. * @expectedException Symfony\Component\Filesystem\Exception\IOException
  453. */
  454. public function testRenameThrowsExceptionIfTargetAlreadyExists()
  455. {
  456. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  457. $newPath = $this->workspace.DIRECTORY_SEPARATOR.'new_file';
  458. touch($file);
  459. touch($newPath);
  460. $this->filesystem->rename($file, $newPath);
  461. }
  462. /**
  463. * @expectedException Symfony\Component\Filesystem\Exception\IOException
  464. */
  465. public function testRenameThrowsExceptionOnError()
  466. {
  467. $file = $this->workspace.DIRECTORY_SEPARATOR.uniqid();
  468. $newPath = $this->workspace.DIRECTORY_SEPARATOR.'new_file';
  469. $this->filesystem->rename($file, $newPath);
  470. }
  471. public function testSymlink()
  472. {
  473. $this->markAsSkippedIfSymlinkIsMissing();
  474. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  475. $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
  476. touch($file);
  477. $this->filesystem->symlink($file, $link);
  478. $this->assertTrue(is_link($link));
  479. $this->assertEquals($file, readlink($link));
  480. }
  481. /**
  482. * @depends testSymlink
  483. */
  484. public function testRemoveSymlink()
  485. {
  486. $this->markAsSkippedIfSymlinkIsMissing();
  487. $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
  488. $this->filesystem->remove($link);
  489. $this->assertTrue(!is_link($link));
  490. }
  491. public function testSymlinkIsOverwrittenIfPointsToDifferentTarget()
  492. {
  493. $this->markAsSkippedIfSymlinkIsMissing();
  494. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  495. $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
  496. touch($file);
  497. symlink($this->workspace, $link);
  498. $this->filesystem->symlink($file, $link);
  499. $this->assertTrue(is_link($link));
  500. $this->assertEquals($file, readlink($link));
  501. }
  502. public function testSymlinkIsNotOverwrittenIfAlreadyCreated()
  503. {
  504. $this->markAsSkippedIfSymlinkIsMissing();
  505. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  506. $link = $this->workspace.DIRECTORY_SEPARATOR.'link';
  507. touch($file);
  508. symlink($file, $link);
  509. $this->filesystem->symlink($file, $link);
  510. $this->assertTrue(is_link($link));
  511. $this->assertEquals($file, readlink($link));
  512. }
  513. public function testSymlinkCreatesTargetDirectoryIfItDoesNotExist()
  514. {
  515. $this->markAsSkippedIfSymlinkIsMissing();
  516. $file = $this->workspace.DIRECTORY_SEPARATOR.'file';
  517. $link1 = $this->workspace.DIRECTORY_SEPARATOR.'dir'.DIRECTORY_SEPARATOR.'link';
  518. $link2 = $this->workspace.DIRECTORY_SEPARATOR.'dir'.DIRECTORY_SEPARATOR.'subdir'.DIRECTORY_SEPARATOR.'link';
  519. touch($file);
  520. $this->filesystem->symlink($file, $link1);
  521. $this->filesystem->symlink($file, $link2);
  522. $this->assertTrue(is_link($link1));
  523. $this->assertEquals($file, readlink($link1));
  524. $this->assertTrue(is_link($link2));
  525. $this->assertEquals($file, readlink($link2));
  526. }
  527. /**
  528. * @dataProvider providePathsForMakePathRelative
  529. */
  530. public function testMakePathRelative($endPath, $startPath, $expectedPath)
  531. {
  532. $path = $this->filesystem->makePathRelative($endPath, $startPath);
  533. $this->assertEquals($expectedPath, $path);
  534. }
  535. /**
  536. * @return array
  537. */
  538. public function providePathsForMakePathRelative()
  539. {
  540. $paths = array(
  541. array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/src/Symfony/Component', '../'),
  542. array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/src/Symfony/Component/', '../'),
  543. array('/var/lib/symfony/src/Symfony', '/var/lib/symfony/src/Symfony/Component', '../'),
  544. array('/var/lib/symfony/src/Symfony', '/var/lib/symfony/src/Symfony/Component/', '../'),
  545. array('var/lib/symfony/', 'var/lib/symfony/src/Symfony/Component', '../../../'),
  546. array('/usr/lib/symfony/', '/var/lib/symfony/src/Symfony/Component', '../../../../../../usr/lib/symfony/'),
  547. array('/var/lib/symfony/src/Symfony/', '/var/lib/symfony/', 'src/Symfony/'),
  548. array('/aa/bb', '/aa/bb', './'),
  549. array('/aa/bb', '/aa/bb/', './'),
  550. array('/aa/bb/', '/aa/bb', './'),
  551. array('/aa/bb/', '/aa/bb/', './'),
  552. array('/aa/bb/cc', '/aa/bb/cc/dd', '../'),
  553. array('/aa/bb/cc', '/aa/bb/cc/dd/', '../'),
  554. array('/aa/bb/cc/', '/aa/bb/cc/dd', '../'),
  555. array('/aa/bb/cc/', '/aa/bb/cc/dd/', '../'),
  556. array('/aa/bb/cc', '/aa', 'bb/cc/'),
  557. array('/aa/bb/cc', '/aa/', 'bb/cc/'),
  558. array('/aa/bb/cc/', '/aa', 'bb/cc/'),
  559. array('/aa/bb/cc/', '/aa/', 'bb/cc/'),
  560. array('/a/aab/bb', '/a/aa', '../aab/bb/'),
  561. array('/a/aab/bb', '/a/aa/', '../aab/bb/'),
  562. array('/a/aab/bb/', '/a/aa', '../aab/bb/'),
  563. array('/a/aab/bb/', '/a/aa/', '../aab/bb/'),
  564. );
  565. if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
  566. $paths[] = array('c:\var\lib/symfony/src/Symfony/', 'c:/var/lib/symfony/', 'src/Symfony/');
  567. }
  568. return $paths;
  569. }
  570. public function testMirrorCopiesFilesAndDirectoriesRecursively()
  571. {
  572. $sourcePath = $this->workspace.DIRECTORY_SEPARATOR.'source'.DIRECTORY_SEPARATOR;
  573. $directory = $sourcePath.'directory'.DIRECTORY_SEPARATOR;
  574. $file1 = $directory.'file1';
  575. $file2 = $sourcePath.'file2';
  576. mkdir($sourcePath);
  577. mkdir($directory);
  578. file_put_contents($file1, 'FILE1');
  579. file_put_contents($file2, 'FILE2');
  580. $targetPath = $this->workspace.DIRECTORY_SEPARATOR.'target'.DIRECTORY_SEPARATOR;
  581. $this->filesystem->mirror($sourcePath, $targetPath);
  582. $this->assertTrue(is_dir($targetPath));
  583. $this->assertTrue(is_dir($targetPath.'directory'));
  584. $this->assertFileEquals($file1, $targetPath.'directory'.DIRECTORY_SEPARATOR.'file1');
  585. $this->assertFileEquals($file2, $targetPath.'file2');
  586. }
  587. public function testMirrorCopiesLinks()
  588. {
  589. $this->markAsSkippedIfSymlinkIsMissing();
  590. $sourcePath = $this->workspace.DIRECTORY_SEPARATOR.'source'.DIRECTORY_SEPARATOR;
  591. mkdir($sourcePath);
  592. file_put_contents($sourcePath.'file1', 'FILE1');
  593. symlink($sourcePath.'file1', $sourcePath.'link1');
  594. $targetPath = $this->workspace.DIRECTORY_SEPARATOR.'target'.DIRECTORY_SEPARATOR;
  595. $this->filesystem->mirror($sourcePath, $targetPath);
  596. $this->assertTrue(is_dir($targetPath));
  597. $this->assertFileEquals($sourcePath.'file1', $targetPath.DIRECTORY_SEPARATOR.'link1');
  598. $this->assertTrue(is_link($targetPath.DIRECTORY_SEPARATOR.'link1'));
  599. }
  600. /**
  601. * @dataProvider providePathsForIsAbsolutePath
  602. */
  603. public function testIsAbsolutePath($path, $expectedResult)
  604. {
  605. $result = $this->filesystem->isAbsolutePath($path);
  606. $this->assertEquals($expectedResult, $result);
  607. }
  608. /**
  609. * @return array
  610. */
  611. public function providePathsForIsAbsolutePath()
  612. {
  613. return array(
  614. array('/var/lib', true),
  615. array('c:\\\\var\\lib', true),
  616. array('\\var\\lib', true),
  617. array('var/lib', false),
  618. array('../var/lib', false),
  619. array('', false),
  620. array(null, false)
  621. );
  622. }
  623. /**
  624. * Returns file permissions as three digits (i.e. 755)
  625. *
  626. * @return integer
  627. */
  628. private function getFilePermissions($filePath)
  629. {
  630. return (int) substr(sprintf('%o', fileperms($filePath)), -3);
  631. }
  632. private function getFileOwner($filepath)
  633. {
  634. $this->markAsSkippedIfPosixIsMissing();
  635. $infos = stat($filepath);
  636. if ($datas = posix_getpwuid($infos['uid'])) {
  637. return $datas['name'];
  638. }
  639. }
  640. private function getFileGroup($filepath)
  641. {
  642. $this->markAsSkippedIfPosixIsMissing();
  643. $infos = stat($filepath);
  644. if ($datas = posix_getgrgid($infos['gid'])) {
  645. return $datas['name'];
  646. }
  647. }
  648. private function markAsSkippedIfSymlinkIsMissing()
  649. {
  650. if (!function_exists('symlink')) {
  651. $this->markTestSkipped('symlink is not supported');
  652. }
  653. }
  654. private function markAsSkippedIfChmodIsMissing()
  655. {
  656. if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
  657. $this->markTestSkipped('chmod is not supported on windows');
  658. }
  659. }
  660. private function markAsSkippedIfPosixIsMissing()
  661. {
  662. if (defined('PHP_WINDOWS_VERSION_MAJOR') || !function_exists('posix_isatty')) {
  663. $this->markTestSkipped('Posix is not supported');
  664. }
  665. }
  666. }