Skip to content
Extraits de code Groupes Projets
CliMultiTest.php 8,38 ko
Newer Older
  • Learn to ignore specific revisions
  •  * Piwik - free/libre analytics platform
    
     *
     * @link http://piwik.org
     * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
     */
    
    namespace Piwik\Tests\System;
    
    use Piwik\Archiver\Request;
    
    use Piwik\CliMulti;
    use Piwik\Version;
    
    use Piwik\Tests\Framework\TestCase\SystemTestCase;
    use Piwik\Tests\Framework\Fixture;
    
    class CliMultiTest extends SystemTestCase
    
    {
        /**
         * @var \Piwik\CliMulti
         */
        private $cliMulti;
    
        /**
         * @var string
         */
        private $authToken = '';
    
        /**
         * @var string[]
         */
        private $urls = array();
    
        /**
         * @var string[]
         */
        private $responses = array();
    
        public function setUp()
        {
            parent::setUp();
    
    
            $this->cliMulti  = new CliMulti();
    
            $this->authToken = Fixture::getTokenAuth();
    
                'getAnswerToLife' => $this->completeUrl('?module=API&method=ExampleAPI.getAnswerToLife&format=JSON'),
                'getPiwikVersion' => $this->completeUrl('?module=API&method=API.getPiwikVersion&format=JSON'),
    
            );
    
            $this->responses = array(
                'getAnswerToLife' => '{"value":42}',
                'getPiwikVersion' => '{"value":"' . Version::VERSION . '"}'
            );
    
        }
    
        public function test_request_shouldNotFailAndReturnNoResponse_IfNoUrlsAreGiven()
        {
            $response = $this->cliMulti->request(array());
    
            $this->assertEquals(array(), $response);
        }
    
        /**
    
    mattab's avatar
    mattab a validé
         * @expectedException PHPUnit_Framework_Error
    
         */
        public function test_request_shouldFail_IfUrlsIsNotAnArray()
        {
            $this->cliMulti->request('');
        }
    
        public function test_request_shouldReturnResultAsArray_IfOnlyOneUrlIsGiven()
        {
            $urls = $this->buildUrls('getAnswerToLife');
    
            $this->assertRequestReturnsValidResponses($urls, array('getAnswerToLife'));
        }
    
    
        public function test_request_shouldRunAsync()
    
            $this->skipWhenPhp53();
    
            $this->assertTrue($this->cliMulti->supportsAsync);
    
        }
    
        public function test_request_shouldRequestAllUrls_IfMultipleUrlsAreGiven()
        {
            $urls = $this->buildUrls('getPiwikVersion', 'getAnswerToLife');
    
            $this->assertRequestReturnsValidResponses($urls, array('getPiwikVersion', 'getAnswerToLife'));
        }
    
    
        public function test_request_shouldRequestAllUrls_IfMultipleUrlsAreGiven_WithConcurrentRequestLimit()
        {
            $urls = $this->buildUrls('getPiwikVersion', 'getAnswerToLife', 'getPiwikVersion');
    
            $this->cliMulti->setConcurrentProcessesLimit(1);
            $this->assertRequestReturnsValidResponses($urls, array('getPiwikVersion', 'getAnswerToLife', 'getPiwikVersion'));
        }
    
        public function test_request_shouldRequestAllUrls_IfMultipleUrlsAreGiven_WithHighConcurrentRequestLimit()
        {
            $urls = $this->buildUrls('getPiwikVersion', 'getAnswerToLife', 'getPiwikVersion');
    
            $this->cliMulti->setConcurrentProcessesLimit(10);
            $this->assertRequestReturnsValidResponses($urls, array('getPiwikVersion', 'getAnswerToLife', 'getPiwikVersion'));
        }
    
    
        public function test_request_shouldReturnSameAmountOfResponses_IfSameUrlAppearsMultipleTimes()
        {
    
            $urls = $this->buildUrls('getAnswerToLife', 'getAnswerToLife', 'getPiwikVersion');
    
            $this->assertRequestReturnsValidResponses($urls, array('getAnswerToLife', 'getAnswerToLife', 'getPiwikVersion'));
    
        }
    
        public function test_request_shouldCleanupAllTempFiles_OnceAllRequestsAreFinished()
        {
    
    mattab's avatar
    mattab a validé
            $filesBefore = $this->getFilesInTmpFolder();
    
    
            $this->cliMulti->request($this->buildUrls('getAnswerToLife', 'getAnswerToLife'));
    
    
    mattab's avatar
    mattab a validé
            $filesAfter = $this->getFilesInTmpFolder();
    
    mattab's avatar
    mattab a validé
            $this->assertSame($filesAfter, $filesBefore, "Diff is :" . implode(", ", array_diff($filesAfter, $filesBefore)));
            $this->assertGreaterThan(1, $filesAfter);
    
        public function test_request_shouldWorkInCaseItDoesNotRunFromCli()
        {
            $urls = $this->buildUrls('getAnswerToLife', 'getAnswerToLife');
    
            \Piwik\Common::$isCliMode = false;
            $this->assertRequestReturnsValidResponses($urls, array('getAnswerToLife', 'getAnswerToLife'));
        }
    
    
         * This is a known issue, we do not get a content in case Piwik ends with an exit or redirect, but we have to make
         * sure we detect the request has finished though
    
         */
        public function test_request_shouldDetectFinishOfRequest_IfNoParamsAreGiven()
        {
    
            $this->skipWhenPhp53();
    
            $response = $this->cliMulti->request(array($this->completeUrl('')));
    
            $this->assertStringStartsWith('Error in Piwik: Error: no website was found', $response[0]);
    
        }
    
        public function test_request_shouldBeAbleToRenderARegularPageInPiwik()
        {
    
            $this->skipWhenPhp53();
    
            Fixture::createWebsite('2014-01-01 00:00:00');
    
    
            $urls = array($this->completeUrl('/?module=Widgetize&idSite=1&period=day&date=today'));
    
            $response = $this->cliMulti->request($urls);
    
    
    mattab's avatar
    mattab a validé
            $message = "Response was: " . substr( implode("\n\n", $response), 0, 4000);
    
            $this->assertTrue(false !== strpos($response[0], '<meta name="generator" content="Piwik - free/libre analytics platform"/>'), $message);
    
    mattab's avatar
    mattab a validé
            $this->assertTrue(false !== strpos($response[0], 'Widgetize the full dashboard'). $message);
    
        public function test_shouldFallback_IfAsyncIsNotSupported()
        {
            $this->cliMulti->supportsAsync = false;
    
            $urls = $this->buildUrls('getPiwikVersion', 'getAnswerToLife', 'getPiwikVersion');
    
            $this->assertRequestReturnsValidResponses($urls, array('getPiwikVersion', 'getAnswerToLife', 'getPiwikVersion'));
        }
    
    
        public function test_cleanupNotRemovedFiles_shouldOnlyRemoveFiles_IfTheyAreOlderThanOneWeek()
        {
            $timeOneWeekAgo = strtotime('-1 week');
    
            // make sure -1 week returns a timestamp one week ago
            $this->assertGreaterThan(604797, time() - $timeOneWeekAgo);
            $this->assertLessThan(604803, time() - $timeOneWeekAgo);
    
    
            $tmpDir = CliMulti::getTmpPath() . '/';
    
            touch($tmpDir . 'now.pid');
            touch($tmpDir . 'now.output');
            touch($tmpDir . 'toberemoved.pid', $timeOneWeekAgo - 10);
            touch($tmpDir . 'toberemoved.output', $timeOneWeekAgo - 10);
            touch($tmpDir . 'toBeNotRemoved.pid', $timeOneWeekAgo + 10);
            touch($tmpDir . 'toBeNotRemoved.output', $timeOneWeekAgo + 10);
    
            CliMulti::cleanupNotRemovedFiles();
    
            $this->assertFileExists($tmpDir . 'now.pid');
            $this->assertFileExists($tmpDir . 'now.output');
            $this->assertFileExists($tmpDir . 'toBeNotRemoved.output');
            $this->assertFileExists($tmpDir . 'toBeNotRemoved.output');
    
            $this->assertFileNotExists($tmpDir . 'toberemoved.output');
            $this->assertFileNotExists($tmpDir . 'toberemoved.output');
        }
    
    
        public function test_shouldSupportRequestObjects()
        {
            $wasCalled = false;
            $request = new Request('url');
            $request->before(function () use (&$wasCalled) {
                $wasCalled = true;
            });
    
            $this->cliMulti->request(array($request));
    
            $this->assertTrue($wasCalled, 'The request "before" handler was not called');
        }
    
    
        private function assertRequestReturnsValidResponses($urls, $expectedResponseIds)
        {
            $actualResponse = $this->cliMulti->request($urls);
    
            $this->assertInternalType('array', $actualResponse);
            $this->assertCount(count($expectedResponseIds), $actualResponse);
    
            $expected = array();
            foreach ($expectedResponseIds as $expectedResponseId) {
                $expected[] = $this->responses[$expectedResponseId];
            }
    
            $this->assertEquals($expected, $actualResponse);
        }
    
        private function buildUrls()
        {
            $urls = array();
    
            foreach (func_get_args() as $urlId) {
                $urls[] = $this->urls[$urlId];
            }
    
            return $urls;
        }
    
    
            if (false === strpos($query, '?')) {
                $query .= '?';
    
    diosmosis's avatar
    diosmosis a validé
            return $query . 'testmode=1&token_auth=' . $this->authToken;
    
    mattab's avatar
    mattab a validé
        private function getFilesInTmpFolder()
    
        {
            $dir = PIWIK_INCLUDE_PATH . '/tmp';
    
    
    mattab's avatar
    mattab a validé
            $files = \_glob($dir . "/*", null);
            $subFiles = \_glob($dir . "/*/*", null);
    
    mattab's avatar
    mattab a validé
            $files = array_merge($files, $subFiles);
    
            return $files;