diff --git a/src/Composer/Json/JsonFile.php b/src/Composer/Json/JsonFile.php index 8950545d2..2b13d18d3 100644 --- a/src/Composer/Json/JsonFile.php +++ b/src/Composer/Json/JsonFile.php @@ -34,6 +34,11 @@ class JsonFile $this->path = $path; } + public function getPath() + { + return $this->path; + } + /** * Checks whether json file exists. * diff --git a/src/Composer/Repository/FilesystemRepository.php b/src/Composer/Repository/FilesystemRepository.php index 508cb0538..525f71921 100644 --- a/src/Composer/Repository/FilesystemRepository.php +++ b/src/Composer/Repository/FilesystemRepository.php @@ -43,13 +43,14 @@ class FilesystemRepository extends ArrayRepository implements WritableRepository { parent::initialize(); - $packages = null; - if ($this->file->exists()) { - $packages = $this->file->read(); + if (!$this->file->exists()) { + return; } + $packages = $this->file->read(); + if (!is_array($packages)) { - throw new \UnexpectedValueException('Could not parse package list from the '.$this->file.' repository'); + throw new \UnexpectedValueException('Could not parse package list from the '.$this->file->getPath().' repository'); } $loader = new ArrayLoader($this->repositoryManager); diff --git a/tests/Composer/Test/Repository/FilesystemRepositoryTest.php b/tests/Composer/Test/Repository/FilesystemRepositoryTest.php index 8cdd58831..3ef988422 100644 --- a/tests/Composer/Test/Repository/FilesystemRepositoryTest.php +++ b/tests/Composer/Test/Repository/FilesystemRepositoryTest.php @@ -43,6 +43,43 @@ class FilesystemRepositoryTest extends \PHPUnit_Framework_TestCase $this->assertSame('vendor', $packages[0]->getType()); } + /** + * @expectedException \UnexpectedValueException + */ + public function testCorruptedRepositoryFile() + { + $json = $this->createJsonFileMock(); + + $repository = new FilesystemRepository($json); + $repository->setRepositoryManager($this->getMock('Composer\Repository\RepositoryManager')); + + $json + ->expects($this->once()) + ->method('read') + ->will($this->returnValue('foo')); + $json + ->expects($this->once()) + ->method('exists') + ->will($this->returnValue(true)); + + $repository->getPackages(); + } + + public function testUnexistentRepositoryFile() + { + $json = $this->createJsonFileMock(); + + $repository = new FilesystemRepository($json); + $repository->setRepositoryManager($this->getMock('Composer\Repository\RepositoryManager')); + + $json + ->expects($this->once()) + ->method('exists') + ->will($this->returnValue(false)); + + $this->assertEquals(array(), $repository->getPackages()); + } + public function testRepositoryWrite() { $json = $this->createJsonFileMock();