diff --git a/tests/util/AutoloadBuilderTest.php b/tests/util/AutoloadBuilderTest.php index f9feb7c..c31000a 100644 --- a/tests/util/AutoloadBuilderTest.php +++ b/tests/util/AutoloadBuilderTest.php @@ -75,7 +75,7 @@ class AutoloadBuilderTest extends PHPUnit_Framework_TestCase public function testBuild() { $this->setConstants(); - $builder = new AutoloadBuilder(self::$file, array(self::$path . '/' . self::$app . '/src', self::$path . '/' . self::$app . '/cache', self::$path . '/lib')); + $builder = new AutoloadBuilder(self::$file, array_keys(self::$inc_dirs)); $this->assertFileNotExists(self::$file); $builder->build(); @@ -92,18 +92,38 @@ class AutoloadBuilderTest extends PHPUnit_Framework_TestCase /** * @runInSeparateProcess */ - public function testAccessDenied() + public function testBuildWithExcluded() { $this->setConstants(); + $builder = new AutoloadBuilder(self::$file, array_keys(self::$inc_dirs), array(self::$path . '/lib/core/app/')); - $this->setExpectedException('PHPUnit_Framework_Error'); $this->assertFileNotExists(self::$file); + $builder->build(); - touch(self::$file); $this->assertFileExists(self::$file); - chmod(self::$file, 0400); + + $array = require self::$file; + $this->assertInternalType('array', $array); + $this->assertNotEmpty($array); + $this->assertArrayHasKey('AutoloadBuilder', $array); + $this->assertArrayNotHasKey('FrontController', $array); + $this->assertArrayNotHasKey('AjaxAction', $array); + } + + /** + * @runInSeparateProcess + */ + public function testAccessDenied() + { + $this->setConstants(); + + $this->assertFileNotExists(self::$file); + + $path = dirname(self::$file); + chmod($path, 0400); $builder = new AutoloadBuilder(self::$file, array(self::$path . '/' . self::$app . '/src', self::$path . '/' . self::$app . '/cache', self::$path . '/lib')); + $this->setExpectedException('PHPUnit_Framework_Error', 'Permission denied'); $builder->build(); chmod(self::$file, 0777); } diff --git a/util/AutoloadBuilder.php b/util/AutoloadBuilder.php index 5c969cd..1d1dad7 100644 --- a/util/AutoloadBuilder.php +++ b/util/AutoloadBuilder.php @@ -46,7 +46,7 @@ class AutoloadBuilder foreach ($iterator as $file) { - if($this->isExcluded($file->getRealPath())) { + if ($this->isExcluded($file->getRealPath())) { continue; } // skip non php files @@ -70,30 +70,37 @@ class AutoloadBuilder } } } + unset($file); // without this line trigger_error throws 'Serialization of 'SplFileInfo' is not allowed' exception under PHPUnit } $array_string .= ');'; $this->writeAutoload($array_string); - $this->isFileConsistent(); + if (!$this->isFileConsistent()) { + unlink($this->autoload); + trigger_error("Error while generating autoload file.", E_USER_ERROR); + } } protected function writeAutoload($string) { - file_put_contents($this->autoload, $string); + $pid = getmypid(); + $tmp = dirname($this->autoload) . '/' . md5(time() + $pid); + file_put_contents($tmp, $string); + rename($tmp, $this->autoload); } protected function isFileConsistent() { $autoload_array = include($this->autoload); - if(!is_array($autoload_array)) { - unlink($this->autoload); - trigger_error("Error while generating autoload file.", E_USER_ERROR); + if (!is_array($autoload_array)) { + return false; } + return true; } protected function isExcluded($file) { foreach ($this->exclude as $dir) { - if (stripos($file, PATH . $dir) === 0) { + if (stripos($file, $dir) === 0) { return true; } }