PageRenderTime 39ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/framework/utils/CFileHelperTest.php

https://gitlab.com/RECITEC/yii
PHP | 196 lines | 161 code | 32 blank | 3 comment | 10 complexity | 20bc60d90a975411e1077afa3ca5479d MD5 | raw file
  1. <?php
  2. class CFileHelperTest extends CTestCase
  3. {
  4. private $testDir;
  5. private $testMode=0770;
  6. private $rootDir1="test1";
  7. private $rootDir2="test2";
  8. private $subDir='sub';
  9. private $file1='testfile';
  10. private $file2='.htaccess';
  11. private $file3='..svn';
  12. private $file4='non-existent-file';
  13. protected function setUp()
  14. {
  15. $this->testDir=Yii::getPathOfAlias('application.runtime.CFileHelper');
  16. if(!is_dir($this->testDir) && !(@mkdir($this->testDir)))
  17. $this->markTestIncomplete('Unit tests runtime directory should have writable permissions!');
  18. // create temporary testing data files
  19. $filesData=array(
  20. 'mimeTypes1.php'=>"<?php return array('txa'=>'application/json','txb'=>'another/mime');",
  21. 'mimeTypes2.php'=>"<?php return array('txt'=>'text/plain','txb'=>'another/mime2');",
  22. );
  23. foreach($filesData as $fileName=>$fileData)
  24. if(!(@file_put_contents($this->testDir.$fileName,$fileData)))
  25. $this->markTestIncomplete('Unit tests runtime directory should have writable permissions!');
  26. }
  27. protected function tearDown()
  28. {
  29. if (is_dir($this->testDir))
  30. $this->rrmdir($this->testDir);
  31. }
  32. public function testGetMimeTypeByExtension()
  33. {
  34. // run everything ten times in one test action to be sure that caching inside
  35. // CFileHelper::getMimeTypeByExtension() is working the right way
  36. for($i=0;$i<10;$i++)
  37. {
  38. $this->assertNull(CFileHelper::getMimeTypeByExtension('test.txa'));
  39. $this->assertNull(CFileHelper::getMimeTypeByExtension('test.txb'));
  40. $this->assertEquals('text/plain',CFileHelper::getMimeTypeByExtension('test.txt'));
  41. $this->assertEquals('application/json',CFileHelper::getMimeTypeByExtension('test.txa',$this->testDir.'mimeTypes1.php'));
  42. $this->assertEquals('another/mime',CFileHelper::getMimeTypeByExtension('test.txb',$this->testDir.'mimeTypes1.php'));
  43. $this->assertNull(CFileHelper::getMimeTypeByExtension('test.txt',$this->testDir.'mimeTypes1.php'));
  44. $this->assertNull(CFileHelper::getMimeTypeByExtension('test.txa',$this->testDir.'mimeTypes2.php'));
  45. $this->assertEquals('another/mime2',CFileHelper::getMimeTypeByExtension('test.txb',$this->testDir.'mimeTypes2.php'));
  46. $this->assertEquals('text/plain',CFileHelper::getMimeTypeByExtension('test.txt',$this->testDir.'mimeTypes2.php'));
  47. }
  48. }
  49. public function testCopyDirectory_subDir_modeShoudBe0775()
  50. {
  51. if (substr(PHP_OS,0,3)=='WIN')
  52. $this->markTestSkipped("Can't reliably test it on Windows because fileperms() always return 0777.");
  53. $this->createTestStruct($this->testDir);
  54. $src=$this->testDir.DIRECTORY_SEPARATOR.$this->rootDir1;
  55. $dst=$this->testDir.DIRECTORY_SEPARATOR.$this->rootDir2;
  56. CFileHelper::copyDirectory($src,$dst,array('newDirMode'=>$this->testMode));
  57. $subDir2Mode=$this->getMode($dst.DIRECTORY_SEPARATOR.$this->subDir);
  58. $expectedMode=sprintf('%o',$this->testMode);
  59. $this->assertEquals($expectedMode,$subDir2Mode,"Subdir mode is not {$expectedMode}");
  60. }
  61. public function testCopyDirectory_subDir_modeShoudBe0777()
  62. {
  63. if (substr(PHP_OS,0,3)=='WIN')
  64. $this->markTestSkipped("Can't reliably test it on Windows because fileperms() always return 0777.");
  65. $this->createTestStruct($this->testDir);
  66. $src=$this->testDir.DIRECTORY_SEPARATOR.$this->rootDir1;
  67. $dst=$this->testDir.DIRECTORY_SEPARATOR.$this->rootDir2;
  68. CFileHelper::copyDirectory($src,$dst);
  69. $subDir2Mode=$this->getMode($dst.DIRECTORY_SEPARATOR.$this->subDir);
  70. $expectedMode=sprintf('%o',0777);
  71. $this->assertEquals($expectedMode,$subDir2Mode,"Subdir mode is not {$expectedMode}");
  72. }
  73. public function testRemoveDirectory()
  74. {
  75. $this->createTestStruct($this->testDir);
  76. $ds=DIRECTORY_SEPARATOR;
  77. $bd=$this->testDir.$ds;
  78. $this->assertTrue(is_dir($bd.$this->rootDir1));
  79. $this->assertTrue(is_dir($bd.$this->rootDir1.$ds.$this->subDir));
  80. $this->assertFalse(is_dir($bd.$this->rootDir2));
  81. $this->assertTrue(is_file($bd.$this->rootDir1.$ds.$this->subDir.$ds.$this->file1));
  82. $this->assertTrue(is_file($bd.$this->rootDir1.$ds.$this->subDir.$ds.$this->file2));
  83. $this->assertTrue(is_file($bd.$this->rootDir1.$ds.$this->subDir.$ds.$this->file3));
  84. $this->assertFalse(is_file($bd.$this->rootDir1.$ds.$this->subDir.$ds.$this->file4));
  85. CFileHelper::removeDirectory($bd.$this->rootDir2);
  86. $this->assertTrue(is_dir($bd.$this->rootDir1));
  87. $this->assertTrue(is_dir($bd.$this->rootDir1.$ds.$this->subDir));
  88. $this->assertFalse(is_dir($bd.$this->rootDir2));
  89. $this->assertTrue(is_file($bd.$this->rootDir1.$ds.$this->subDir.$ds.$this->file1));
  90. $this->assertTrue(is_file($bd.$this->rootDir1.$ds.$this->subDir.$ds.$this->file2));
  91. $this->assertTrue(is_file($bd.$this->rootDir1.$ds.$this->subDir.$ds.$this->file3));
  92. $this->assertFalse(is_file($bd.$this->rootDir1.$ds.$this->subDir.$ds.$this->file4));
  93. CFileHelper::removeDirectory($bd);
  94. $this->assertFalse(is_dir($bd.$this->rootDir1));
  95. $this->assertFalse(is_dir($bd.$this->rootDir1.$ds.$this->subDir));
  96. $this->assertFalse(is_dir($bd.$this->rootDir2));
  97. $this->assertFalse(is_file($bd.$this->rootDir1.$ds.$this->subDir.$ds.$this->file1));
  98. $this->assertFalse(is_file($bd.$this->rootDir1.$ds.$this->subDir.$ds.$this->file2));
  99. $this->assertFalse(is_file($bd.$this->rootDir1.$ds.$this->subDir.$ds.$this->file3));
  100. $this->assertFalse(is_file($bd.$this->rootDir1.$ds.$this->subDir.$ds.$this->file4));
  101. }
  102. public function testFindFiles_absolutePaths()
  103. {
  104. $this->createTestStruct($this->testDir);
  105. $bd=$this->testDir.DIRECTORY_SEPARATOR.$this->rootDir1.DIRECTORY_SEPARATOR;
  106. $files=CFileHelper::findFiles($this->testDir);
  107. $this->assertEquals($bd.'sub'.DIRECTORY_SEPARATOR.'..svn',$files[0]);
  108. $this->assertEquals($bd.'sub'.DIRECTORY_SEPARATOR.'.htaccess',$files[1]);
  109. $this->assertEquals($bd.'sub'.DIRECTORY_SEPARATOR.'testfile',$files[2]);
  110. }
  111. public function testFindFiles_relativePaths()
  112. {
  113. $this->createTestStruct($this->testDir);
  114. $bd=$this->rootDir1.DIRECTORY_SEPARATOR;
  115. $files=CFileHelper::findFiles($this->testDir,array('absolutePaths'=>0));
  116. $this->assertEquals($bd.'sub'.DIRECTORY_SEPARATOR.'..svn',$files[0]);
  117. $this->assertEquals($bd.'sub'.DIRECTORY_SEPARATOR.'.htaccess',$files[1]);
  118. $this->assertEquals($bd.'sub'.DIRECTORY_SEPARATOR.'testfile',$files[2]);
  119. }
  120. public function testCreateDirectory()
  121. {
  122. $path = $this->testDir . DIRECTORY_SEPARATOR . 'test' . DIRECTORY_SEPARATOR . 'path';
  123. $this->assertTrue(CFileHelper::createDirectory($path,null,true));
  124. $this->assertTrue(is_dir($path));
  125. }
  126. private function createTestStruct($testDir)
  127. {
  128. $rootDir=$testDir.DIRECTORY_SEPARATOR.$this->rootDir1;
  129. mkdir($rootDir);
  130. $subDir=$testDir.DIRECTORY_SEPARATOR.$this->rootDir1.DIRECTORY_SEPARATOR.$this->subDir;
  131. mkdir($subDir);
  132. $file1=$testDir.DIRECTORY_SEPARATOR.$this->rootDir1.DIRECTORY_SEPARATOR.$this->subDir.DIRECTORY_SEPARATOR.$this->file1;
  133. file_put_contents($file1,'12321312');
  134. $file2=$testDir.DIRECTORY_SEPARATOR.$this->rootDir1.DIRECTORY_SEPARATOR.$this->subDir.DIRECTORY_SEPARATOR.$this->file2;
  135. file_put_contents($file2,'.htaccess');
  136. $file3=$testDir.DIRECTORY_SEPARATOR.$this->rootDir1.DIRECTORY_SEPARATOR.$this->subDir.DIRECTORY_SEPARATOR.$this->file3;
  137. file_put_contents($file3,'..svn');
  138. }
  139. private function getMode($file)
  140. {
  141. return substr(sprintf('%o',fileperms($file)),-4);
  142. }
  143. private function rrmdir($dir)
  144. {
  145. if($handle=opendir($dir))
  146. {
  147. while(false!==($entry=readdir($handle)))
  148. {
  149. if($entry!="." && $entry!="..")
  150. {
  151. if(is_dir($dir."/".$entry)===true)
  152. $this->rrmdir($dir."/".$entry);
  153. else
  154. unlink($dir."/".$entry);
  155. }
  156. }
  157. closedir($handle);
  158. rmdir($dir);
  159. }
  160. }
  161. }