295 lines
		
	
	
	
		
			9.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			295 lines
		
	
	
	
		
			9.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace FFMpeg\Tests;
 | |
| 
 | |
| use FFMpeg\FFProbe;
 | |
| use Symfony\Component\Process\ExecutableFinder;
 | |
| use Alchemy\BinaryDriver\ConfigurationInterface;
 | |
| use Alchemy\BinaryDriver\Configuration;
 | |
| 
 | |
| class FFProbeTest extends TestCase
 | |
| {
 | |
|     public function testGetSetParser()
 | |
|     {
 | |
|         $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock());
 | |
|         $parser = $this->getFFProbeParserMock();
 | |
| 
 | |
|         $ffprobe->setParser($parser);
 | |
|         $this->assertSame($parser, $ffprobe->getParser());
 | |
|     }
 | |
| 
 | |
|     public function testGetSetFFProbeDriver()
 | |
|     {
 | |
|         $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock());
 | |
|         $driver = $this->getFFProbeDriverMock();
 | |
| 
 | |
|         $ffprobe->setFFProbeDriver($driver);
 | |
|         $this->assertSame($driver, $ffprobe->getFFProbeDriver());
 | |
|     }
 | |
| 
 | |
|     public function testGetSetFFProbeMapper()
 | |
|     {
 | |
|         $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock());
 | |
|         $mapper = $this->getFFProbeMapperMock();
 | |
| 
 | |
|         $ffprobe->setMapper($mapper);
 | |
|         $this->assertSame($mapper, $ffprobe->getMapper());
 | |
|     }
 | |
| 
 | |
|     public function testGetSetOptionsTester()
 | |
|     {
 | |
|         $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock());
 | |
|         $tester = $this->getFFProbeOptionsTesterMock();
 | |
| 
 | |
|         $ffprobe->setOptionsTester($tester);
 | |
|         $this->assertSame($tester, $ffprobe->getOptionsTester());
 | |
|     }
 | |
| 
 | |
|     public function testGetSetCache()
 | |
|     {
 | |
|         $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock());
 | |
|         $cache = $this->getCacheMock();
 | |
| 
 | |
|         $ffprobe->setCache($cache);
 | |
|         $this->assertSame($cache, $ffprobe->getCache());
 | |
|     }
 | |
| 
 | |
|     public function provideDataWhitoutCache()
 | |
|     {
 | |
|         $stream = $this->getStreamMock();
 | |
|         $format = $this->getFormatMock();
 | |
| 
 | |
|         return array(
 | |
|             array($stream, 'streams', array('-show_streams', '-print_format'), FFProbe::TYPE_STREAMS, array(__FILE__, '-show_streams', '-print_format', 'json'), false),
 | |
|             array($format, 'format', array('-show_format', '-print_format'), FFProbe::TYPE_FORMAT, array(__FILE__, '-show_format', '-print_format', 'json'), false),
 | |
|             array($stream, 'streams', array('-show_streams'), FFProbe::TYPE_STREAMS, array(__FILE__, '-show_streams'), true),
 | |
|             array($format, 'format', array('-show_format'), FFProbe::TYPE_FORMAT, array(__FILE__, '-show_format'), true),
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @dataProvider provideDataWhitoutCache
 | |
|      */
 | |
|     public function testProbeWithoutCache($output, $method, $commands, $type, $caughtCommands, $isRaw)
 | |
|     {
 | |
|         $pathfile = __FILE__;
 | |
|         $data = array('key' => 'value');
 | |
|         $rawData = 'raw data';
 | |
| 
 | |
|         $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock());
 | |
| 
 | |
|         $mapper = $this->getFFProbeMapperMock();
 | |
|         $mapper->expects($this->once())
 | |
|             ->method('map')
 | |
|             ->with($type, $data)
 | |
|             ->will($this->returnValue($output));
 | |
| 
 | |
|         $parser = $this->getFFProbeParserMock();
 | |
| 
 | |
|         if ($isRaw) {
 | |
|             $parser->expects($this->once())
 | |
|                 ->method('parse')
 | |
|                 ->with($type, $rawData)
 | |
|                 ->will($this->returnValue($data));
 | |
|         } else {
 | |
|             $parser->expects($this->never())
 | |
|                 ->method('parse');
 | |
|         }
 | |
| 
 | |
|         $tester = $this->getFFProbeOptionsTesterMockWithOptions($commands);
 | |
| 
 | |
|         $cache = $this->getCacheMock();
 | |
|         $cache->expects($this->once())
 | |
|             ->method('contains')
 | |
|             ->will($this->returnValue(false));
 | |
|         $cache->expects($this->never())
 | |
|             ->method('fetch');
 | |
|         $cache->expects($this->once())
 | |
|             ->method('save')
 | |
|             ->with($this->anything(), $output);
 | |
| 
 | |
|         $driver = $this->getFFProbeDriverMock();
 | |
|         $driver->expects($this->once())
 | |
|             ->method('command')
 | |
|             ->with($caughtCommands)
 | |
|             ->will($this->returnValue($isRaw ? $rawData : json_encode($data)));
 | |
| 
 | |
|         $ffprobe->setOptionsTester($tester)
 | |
|             ->setCache($cache)
 | |
|             ->setMapper($mapper)
 | |
|             ->setFFProbeDriver($driver)
 | |
|             ->setParser($parser);
 | |
| 
 | |
|         $this->assertEquals($output, call_user_func(array($ffprobe, $method), $pathfile));
 | |
|     }
 | |
| 
 | |
|     public function provideDataForInvalidJson()
 | |
|     {
 | |
|         $stream = $this->getStreamMock();
 | |
|         $format = $this->getFormatMock();
 | |
| 
 | |
|         return array(
 | |
|             array($stream, 'streams', array('-show_streams', '-print_format'), FFProbe::TYPE_STREAMS, array(__FILE__, '-show_streams', '-print_format', 'json')),
 | |
|             array($format, 'format', array('-show_format', '-print_format'), FFProbe::TYPE_FORMAT, array(__FILE__, '-show_format', '-print_format', 'json')),
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @dataProvider provideDataForInvalidJson
 | |
|      */
 | |
|     public function testProbeWithWrongJson($output, $method, $commands, $type, $caughtCommands)
 | |
|     {
 | |
|         $pathfile = __FILE__;
 | |
|         $data = array('key' => 'value');
 | |
| 
 | |
|         $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock());
 | |
| 
 | |
|         $mapper = $this->getFFProbeMapperMock();
 | |
|         $mapper->expects($this->once())
 | |
|             ->method('map')
 | |
|             ->with($this->isType('string'), 'good data parsed')
 | |
|             ->will($this->returnValue($output));
 | |
| 
 | |
|         $parser = $this->getFFProbeParserMock();
 | |
|         $parser->expects($this->once())
 | |
|             ->method('parse')
 | |
|             ->with($this->isType('string', json_encode($data) . 'lala'))
 | |
|             ->will($this->returnValue('good data parsed'));
 | |
| 
 | |
|         $tester = $this->getFFProbeOptionsTesterMockWithOptions($commands);
 | |
| 
 | |
|         $cache = $this->getCacheMock();
 | |
|         $cache->expects($this->exactly(2))
 | |
|             ->method('contains')
 | |
|             ->will($this->returnValue(false));
 | |
|         $cache->expects($this->never())
 | |
|             ->method('fetch');
 | |
| 
 | |
|         $driver = $this->getFFProbeDriverMock();
 | |
|         $driver->expects($this->exactly(2))
 | |
|             ->method('command')
 | |
|             ->will($this->returnValue(json_encode($data) . 'lala'));
 | |
| 
 | |
|         $ffprobe->setOptionsTester($tester)
 | |
|             ->setCache($cache)
 | |
|             ->setMapper($mapper)
 | |
|             ->setFFProbeDriver($driver)
 | |
|             ->setParser($parser);
 | |
| 
 | |
|         $this->assertEquals($output, call_user_func(array($ffprobe, $method), $pathfile));
 | |
|     }
 | |
| 
 | |
|     public function provideProbingDataWithCache()
 | |
|     {
 | |
|         $stream = $this->getStreamMock();
 | |
|         $format = $this->getFormatMock();
 | |
| 
 | |
|         return array(
 | |
|             array($stream, 'streams'),
 | |
|             array($format, 'format'),
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @dataProvider provideProbingDataWithCache
 | |
|      */
 | |
|     public function testProbeWithCache($output, $method)
 | |
|     {
 | |
|         $pathfile = __FILE__;
 | |
| 
 | |
|         $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock());
 | |
| 
 | |
|         $mapper = $this->getFFProbeMapperMock();
 | |
|         $mapper->expects($this->never())
 | |
|             ->method('map');
 | |
| 
 | |
|         $tester = $this->getFFProbeOptionsTesterMock();
 | |
| 
 | |
|         $cache = $this->getCacheMock();
 | |
|         $cache->expects($this->once())
 | |
|             ->method('contains')
 | |
|             ->will($this->returnValue(true));
 | |
|         $cache->expects($this->once())
 | |
|             ->method('fetch')
 | |
|             ->will($this->returnValue($output));
 | |
|         $cache->expects($this->never())
 | |
|             ->method('save');
 | |
| 
 | |
|         $driver = $this->getFFProbeDriverMock();
 | |
|         $driver->expects($this->never())
 | |
|             ->method('command');
 | |
| 
 | |
|         $ffprobe->setOptionsTester($tester)
 | |
|             ->setCache($cache)
 | |
|             ->setMapper($mapper)
 | |
|             ->setFFProbeDriver($driver);
 | |
| 
 | |
|         $this->assertEquals($output, call_user_func(array($ffprobe, $method), $pathfile));
 | |
|     }
 | |
| 
 | |
|     public function provideProbeMethod()
 | |
|     {
 | |
|         return array(
 | |
|             array('streams'),
 | |
|             array('format'),
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @expectedException FFMpeg\Exception\RuntimeException
 | |
|      * @dataProvider provideProbeMethod
 | |
|      */
 | |
|     public function testProbeWithoutShowStreamsAvailable($method)
 | |
|     {
 | |
|         $pathfile = __FILE__;
 | |
| 
 | |
|         $ffprobe = new FFProbe($this->getFFProbeDriverMock(), $this->getCacheMock());
 | |
|         $ffprobe->setOptionsTester($this->getFFProbeOptionsTesterMock());
 | |
|         call_user_func(array($ffprobe, $method), $pathfile);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @dataProvider provideCreateOptions
 | |
|      */
 | |
|     public function testCreate($logger, $conf, $cache)
 | |
|     {
 | |
|         $finder = new ExecutableFinder();
 | |
| 
 | |
|         $found = false;
 | |
|         foreach (array('avprobe', 'ffprobe') as $name) {
 | |
|             if (null !== $finder->find($name)) {
 | |
|                 $found = true;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if (!$found) {
 | |
|             $this->markTestSkipped("Unable to find avprobe or ffprobe on system");
 | |
|         }
 | |
| 
 | |
|         $ffprobe = FFProbe::create();
 | |
|         $this->assertInstanceOf('FFMpeg\FFprobe', $ffprobe);
 | |
| 
 | |
|         $ffprobe = FFProbe::create($conf, $logger, $cache);
 | |
|         $this->assertInstanceOf('FFMpeg\FFprobe', $ffprobe);
 | |
| 
 | |
|         if (null !== $cache) {
 | |
|             $this->assertSame($cache, $ffprobe->getCache());
 | |
|         }
 | |
|         if (null !== $logger) {
 | |
|             $this->assertSame($logger, $ffprobe->getFFProbeDriver()->getProcessRunner()->getLogger());
 | |
|         }
 | |
|         if ($conf instanceof ConfigurationInterface) {
 | |
|             $this->assertSame($conf, $ffprobe->getFFProbeDriver()->getConfiguration());
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function provideCreateOptions()
 | |
|     {
 | |
|         return array(
 | |
|             array(null, array('key' => 'value'), null),
 | |
|             array($this->getLoggerMock(), array('key' => 'value'), null),
 | |
|             array(null, new Configuration(), null),
 | |
|             array(null, array('key' => 'value'), $this->getCacheMock()),
 | |
|         );
 | |
|     }
 | |
| }
 |