Skip to content
Extraits de code Groupes Projets
OneVisitorOneWebsiteSeveralDaysDateRangeArchivingTestsTest.php 9,09 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
     */
    
    mattab's avatar
    mattab a validé
    use Piwik\Piwik;
    
    use Piwik\Tests\Framework\TestCase\SystemTestCase;
    
    use Piwik\Tests\Fixtures\VisitsOverSeveralDays;
    
    
    /**
     * Tests some API using range periods & makes sure the correct amount of blob/numeric
     * archives are created.
    
     *
     * @group OneVisitorOneWebsiteSeveralDaysDateRangeArchivingTest
    
    class OneVisitorOneWebsiteSeveralDaysDateRangeArchivingTest extends SystemTestCase
    
        public static $fixture = null; // initialized below test definition
    
        {
            return 'oneVisitor_oneWebsite_severalDays_DateRange';
        }
    
    
        public function testApi($api, $params)
    
            $apiToCall = array('Actions.getPageUrls',
    
    sgiehl's avatar
    sgiehl a validé
                               'Resolution.getResolution',
    
                               'VisitFrequency.get',
                               'VisitTime.getVisitInformationPerServerTime');
    
            // 2 segments: ALL and another way of expressing ALL but triggering the Segment code path
    
            // 2 segments: ALL and another way of expressing ALL but triggering the Segment code path
            $segments = array(
                false,
    
    mattab's avatar
    mattab a validé
                'countryCode!=aa',
    
                'pageUrl!=ThisIsNotKnownPageUrl',
            );
    
            // Running twice just as health check that second call also works
            $result = array();
            for ($i = 0; $i <= 1; $i++) {
                foreach ($segments as $segment) {
    
                    $result[] = array($apiToCall, array('idSite'  => $idSite, 'date' => '2010-12-15,2011-01-15',
    
                                                        'periods' => array('range'),
                                                        'segment' => $segment,
                                                        'otherRequestParameters' => array(
                                                            'flat'                   => '0',
                                                            'expanded'               => '0'
                                                        ),
                    ));
    
            // Testing Date range in January only
            // Because of flat=1, this test will archive all sub-tables
            $result[] = array('Actions.getPageUrls', array('idSite'  => $idSite, 'date' => '2011-01-01,2011-02-01',
    
                                                           'periods' => array('range'),
                                                           'otherRequestParameters' => array(
                                                               'flat'                   => '1',
                                                               'expanded'               => '0'
                                                           ),
                                                           'testSuffix' => '_periodIsRange_flattened_')
            );
            // testing the same with expanded=1 should not create new archive records
            $result[] = array('Actions.getPageUrls', array('idSite'  => $idSite, 'date' => '2011-01-01,2011-02-01',
                                                           'periods' => array('range'),
                                                           'otherRequestParameters' => array(
                                                               'flat'                   => '0',
                                                               'expanded'               => '1'
                                                           ),
                                                           'testSuffix' => '_periodIsRange_expanded_')
    
         *  Check that requesting period "Range" means only processing
         *  the requested Plugin blob (Actions in this case), not all Plugins blobs
    
        public function test_checkArchiveRecords_whenPeriodIsRange()
    
            // we expect 5 blobs for Actions plugins, because flat=1 or expanded=1 was not set
            // so we only archived the parent table
            $expectedActionsBlobs = 5;
    
            // When flat=1, Actions plugin will process 5 + 3 extra blobs (URL = 'http://example.org/sub1/sub2/sub3/news')
    
            $expectedActionsBlobsWhenFlattened = $expectedActionsBlobs + 1;
    
    mattab's avatar
    mattab a validé
                // TODO Implement fix, then remove the +3 below
    
                'archive_blob_2010_12'    => ( ($expectedActionsBlobs+1) /*Actions*/
    
    sgiehl's avatar
    sgiehl a validé
                                                + 2 /* Resolution */
    
                /**
                 *  In Each "Period=range" Archive, we expect following non zero numeric entries:
    
                 *                 5 metrics + 1 flag  // VisitsSummary
                 *               + 2 metrics + 1 flag // Actions
    
    sgiehl's avatar
    sgiehl a validé
                 *               + 1 flag // Resolution
    
                 *               = 11
                 *
                 *   because we call VisitFrequency.get, this creates an archive for the visitorType==returning segment.
                 *          -> There are two archives for each segment (one for "countryCode!=aa"
                 *                      and VisitFrequency creates one for "countryCode!=aa;visitorType==returning")
                 *
    
                 * So each period=range will have = 11 records + (5 metrics + 1 flag // VisitsSummary)
    
                 *                                = 17
                 *
                 * Total expected records = count unique archives * records per archive
                 *                        = 3 * 17
                 *                        = 51
                 */
                'archive_numeric_2010_12' => 17 * 3,
    
                /**
                 * In the January date range,
                 * we archive only Actions plugins.
                 * It is flattened so all 3 sub-tables should be archived.
                 */
                'archive_blob_2011_01'    => $expectedActionsBlobsWhenFlattened,
    
                /**
                 *   5 metrics + 1 flag // VisitsSummary
                 * + 2 metrics + 1 flag // Actions
                 */
                'archive_numeric_2011_01' => (6 + 3),
    
                // nothing in Feb
                'archive_blob_2011_02'    => 0,
                'archive_numeric_2011_02' => 0,
    
            );
            foreach ($tests as $table => $expectedRows) {
    
                $sql = "SELECT count(*) FROM " . Common::prefixTable($table) . " WHERE period = " . Piwik::$idPeriods['range'];
    
    mattpiwik's avatar
    mattpiwik a validé
    
    
                if($expectedRows != $countBlobs) {
    
                    $this->printDebugWhenTestFails($table);
    
                $this->assertEquals($expectedRows, $countBlobs, "$table expected $expectedRows, got $countBlobs");
    
        /**
         *  Check that requesting period "Range" means only processing
         *  the requested Plugin blob (Actions in this case), not all Plugins blobs
         *
         * @depends      testApi
         */
        public function test_checkArchiveRecords_shouldMergeSubtablesIntoOneRow()
        {
            $tests = array(
                'archive_blob_2010_12' => 3,
    
                /**
                 * In the January date range,
                 * we archive only Actions plugins.
                 * It is flattened so all 3 sub-tables should be archived.
                 */
                'archive_blob_2011_01'    => 3,
            );
            $chunk = new Chunk();
    
    Thomas Steur's avatar
    Thomas Steur a validé
            $chunkName = $chunk->getRecordNameForTableId('Actions_actions_url', 0);
    
    
            foreach ($tests as $table => $expectedNumSubtables) {
    
    Thomas Steur's avatar
    Thomas Steur a validé
                $sql = "SELECT value FROM " . Common::prefixTable($table) . " WHERE period = " . Piwik::$idPeriods['range'] . " and `name` ='$chunkName'";
    
                $blob = Db::get()->fetchOne($sql);
                $blob = gzuncompress($blob);
                $blob = unserialize($blob);
                $countSubtables = count($blob);
    
    
    Thomas Steur's avatar
    Thomas Steur a validé
                $this->assertEquals($expectedNumSubtables, $countSubtables, "Actions_actions_url_chunk_0_99 in $table expected to contain $expectedNumSubtables subtables, got $countSubtables");
    
        /**
         * @param $table
         */
        protected function printDebugWhenTestFails($table)
        {
            $data = Db::get()->fetchAll("SELECT * FROM " . Common::prefixTable($table) . " WHERE period = " . Piwik::$idPeriods['range'] . " ORDER BY idarchive ASC");
            var_export($data);
    
            $idArchives = array();
            foreach ($data as $row) {
                $idArchives[] = $row['idarchive'];
            }
            $idArchives = array_unique($idArchives);
            foreach ($idArchives as $idArchive) {
                $numericTable = str_replace("blob", "numeric", Common::prefixTable($table));
                var_export(Db::get()->fetchAll("SELECT idarchive, name FROM " . $numericTable . " WHERE idarchive = ? AND name LIKE 'done%' LIMIT 1 ", $idArchive));
            }
        }
    
    
    Stefan Giehl's avatar
    Stefan Giehl a validé
    OneVisitorOneWebsiteSeveralDaysDateRangeArchivingTest::$fixture = new VisitsOverSeveralDays();