123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- <?php
- /*
- * This file is part of Composer.
- *
- * (c) Nils Adermann <naderman@naderman.de>
- * Jordi Boggiano <j.boggiano@seld.be>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Composer\Test\Downloader;
- use Composer\Downloader\FileDownloader;
- use Composer\Test\TestCase;
- use Composer\Util\Filesystem;
- use Composer\Util\Http\Response;
- use Composer\Util\Loop;
- class FileDownloaderTest extends TestCase
- {
- private $httpDownloader;
- private $config;
- protected function getDownloader($io = null, $config = null, $eventDispatcher = null, $cache = null, $httpDownloader = null, $filesystem = null)
- {
- $io = $io ?: $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
- $this->config = $config ?: $this->getMockBuilder('Composer\Config')->getMock();
- $httpDownloader = $httpDownloader ?: $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock();
- $httpDownloader
- ->expects($this->any())
- ->method('addCopy')
- ->will($this->returnValue(\React\Promise\resolve(new Response(array('url' => 'http://example.org/'), 200, array(), 'file~'))));
- $this->httpDownloader = $httpDownloader;
- return new FileDownloader($io, $this->config, $httpDownloader, $eventDispatcher, $cache, $filesystem);
- }
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testDownloadForPackageWithoutDistReference()
- {
- $packageMock = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
- $packageMock->expects($this->once())
- ->method('getDistUrl')
- ->will($this->returnValue(null))
- ;
- $downloader = $this->getDownloader();
- $downloader->download($packageMock, '/path');
- }
- public function testDownloadToExistingFile()
- {
- $packageMock = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
- $packageMock->expects($this->any())
- ->method('getDistUrl')
- ->will($this->returnValue('url'))
- ;
- $packageMock->expects($this->any())
- ->method('getDistUrls')
- ->will($this->returnValue(array('url')))
- ;
- $path = tempnam($this->getUniqueTmpDirectory(), 'c');
- $downloader = $this->getDownloader();
- try {
- $downloader->download($packageMock, $path);
- $this->fail();
- } catch (\Exception $e) {
- if (is_dir($path)) {
- $fs = new Filesystem();
- $fs->removeDirectory($path);
- } elseif (is_file($path)) {
- unlink($path);
- }
- $this->assertInstanceOf('RuntimeException', $e);
- $this->assertContains('exists and is not a directory', $e->getMessage());
- }
- }
- public function testGetFileName()
- {
- $packageMock = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
- $packageMock->expects($this->once())
- ->method('getDistUrl')
- ->will($this->returnValue('http://example.com/script.js'))
- ;
- $downloader = $this->getDownloader();
- $method = new \ReflectionMethod($downloader, 'getFileName');
- $method->setAccessible(true);
- $this->config->expects($this->once())
- ->method('get')
- ->with('vendor-dir')
- ->will($this->returnValue('/vendor'));
- $this->assertRegExp('#/vendor/composer/tmp-[a-z0-9]+\.js#', $method->invoke($downloader, $packageMock, '/path'));
- }
- public function testDownloadButFileIsUnsaved()
- {
- $packageMock = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
- $packageMock->expects($this->any())
- ->method('getDistUrl')
- ->will($this->returnValue($distUrl = 'http://example.com/script.js'))
- ;
- $packageMock->expects($this->once())
- ->method('getDistUrls')
- ->will($this->returnValue(array($distUrl)))
- ;
- $packageMock->expects($this->atLeastOnce())
- ->method('getTransportOptions')
- ->will($this->returnValue(array()))
- ;
- $path = $this->getUniqueTmpDirectory();
- $ioMock = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
- $ioMock->expects($this->any())
- ->method('write')
- ->will($this->returnCallback(function ($messages, $newline = true) use ($path) {
- if (is_file($path.'/script.js')) {
- unlink($path.'/script.js');
- }
- return $messages;
- }))
- ;
- $downloader = $this->getDownloader($ioMock);
- $this->config->expects($this->once())
- ->method('get')
- ->with('vendor-dir')
- ->will($this->returnValue($path.'/vendor'));
- try {
- $promise = $downloader->download($packageMock, $path);
- $loop = new Loop($this->httpDownloader);
- $loop->wait(array($promise));
- $this->fail('Download was expected to throw');
- } catch (\Exception $e) {
- if (is_dir($path)) {
- $fs = new Filesystem();
- $fs->removeDirectory($path);
- } elseif (is_file($path)) {
- unlink($path);
- }
- $this->assertInstanceOf('UnexpectedValueException', $e, $e->getMessage());
- $this->assertContains('could not be saved to', $e->getMessage());
- }
- }
- public function testCacheGarbageCollectionIsCalled()
- {
- $expectedTtl = '99999999';
- $configMock = $this->getMockBuilder('Composer\Config')->getMock();
- $configMock
- ->expects($this->at(0))
- ->method('get')
- ->with('cache-files-ttl')
- ->will($this->returnValue($expectedTtl));
- $configMock
- ->expects($this->at(1))
- ->method('get')
- ->with('cache-files-maxsize')
- ->will($this->returnValue('500M'));
- $cacheMock = $this->getMockBuilder('Composer\Cache')
- ->disableOriginalConstructor()
- ->getMock();
- $cacheMock
- ->expects($this->any())
- ->method('gcIsNecessary')
- ->will($this->returnValue(true));
- $cacheMock
- ->expects($this->once())
- ->method('gc')
- ->with($expectedTtl, $this->anything());
- $downloader = $this->getDownloader(null, $configMock, null, $cacheMock, null, null);
- }
- public function testDownloadFileWithInvalidChecksum()
- {
- $packageMock = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
- $packageMock->expects($this->any())
- ->method('getDistUrl')
- ->will($this->returnValue($distUrl = 'http://example.com/script.js'))
- ;
- $packageMock->expects($this->atLeastOnce())
- ->method('getTransportOptions')
- ->will($this->returnValue(array()))
- ;
- $packageMock->expects($this->any())
- ->method('getDistSha1Checksum')
- ->will($this->returnValue('invalid'))
- ;
- $packageMock->expects($this->once())
- ->method('getDistUrls')
- ->will($this->returnValue(array($distUrl)))
- ;
- $filesystem = $this->getMockBuilder('Composer\Util\Filesystem')->getMock();
- $path = $this->getUniqueTmpDirectory();
- $downloader = $this->getDownloader(null, null, null, null, null, $filesystem);
- // make sure the file expected to be downloaded is on disk already
- $this->config->expects($this->any())
- ->method('get')
- ->with('vendor-dir')
- ->will($this->returnValue($path.'/vendor'));
- $method = new \ReflectionMethod($downloader, 'getFileName');
- $method->setAccessible(true);
- $dlFile = $method->invoke($downloader, $packageMock, $path);
- mkdir(dirname($dlFile), 0777, true);
- touch($dlFile);
- try {
- $promise = $downloader->download($packageMock, $path);
- $loop = new Loop($this->httpDownloader);
- $loop->wait(array($promise));
- $this->fail('Download was expected to throw');
- } catch (\Exception $e) {
- if (is_dir($path)) {
- $fs = new Filesystem();
- $fs->removeDirectory($path);
- } elseif (is_file($path)) {
- unlink($path);
- }
- $this->assertInstanceOf('UnexpectedValueException', $e, $e->getMessage());
- $this->assertContains('checksum verification', $e->getMessage());
- }
- }
- public function testDowngradeShowsAppropriateMessage()
- {
- $oldPackage = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
- $oldPackage->expects($this->once())
- ->method('getFullPrettyVersion')
- ->will($this->returnValue('1.2.0'));
- $oldPackage->expects($this->once())
- ->method('getVersion')
- ->will($this->returnValue('1.2.0.0'));
- $newPackage = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock();
- $newPackage->expects($this->any())
- ->method('getFullPrettyVersion')
- ->will($this->returnValue('1.0.0'));
- $newPackage->expects($this->once())
- ->method('getVersion')
- ->will($this->returnValue('1.0.0.0'));
- $newPackage->expects($this->any())
- ->method('getDistUrl')
- ->will($this->returnValue($distUrl = 'http://example.com/script.js'));
- $newPackage->expects($this->once())
- ->method('getDistUrls')
- ->will($this->returnValue(array($distUrl)));
- $ioMock = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
- $ioMock->expects($this->at(0))
- ->method('writeError')
- ->with($this->stringContains('Downloading'));
- $ioMock->expects($this->at(1))
- ->method('writeError')
- ->with($this->stringContains('Downgrading'));
- $path = $this->getUniqueTmpDirectory();
- $filesystem = $this->getMockBuilder('Composer\Util\Filesystem')->getMock();
- $filesystem->expects($this->once())
- ->method('removeDirectory')
- ->will($this->returnValue(true));
- $downloader = $this->getDownloader($ioMock, null, null, null, null, $filesystem);
- // make sure the file expected to be downloaded is on disk already
- $this->config->expects($this->any())
- ->method('get')
- ->with('vendor-dir')
- ->will($this->returnValue($path.'/vendor'));
- $method = new \ReflectionMethod($downloader, 'getFileName');
- $method->setAccessible(true);
- $dlFile = $method->invoke($downloader, $newPackage, $path);
- mkdir(dirname($dlFile), 0777, true);
- touch($dlFile);
- $promise = $downloader->download($newPackage, $path, $oldPackage);
- $loop = new Loop($this->httpDownloader);
- $loop->wait(array($promise));
- $downloader->update($oldPackage, $newPackage, $path);
- }
- }
|