Newer
Older
benakamoorthi
a validé
<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
require_once PIWIK_INCLUDE_PATH . '/tests/PHPUnit/MockLocationProvider.php';
/**
mattab
a validé
* Tests w/ 14 visitors w/ 2 visits each.
* Uses geoip location provider to test city/region reports.
benakamoorthi
a validé
*
benakamoorthi
a validé
* TODO Test ServerBased GeoIP implementation somehow. (Use X-FORWARDED-FOR?)
* TODO Test PECL implementation somehow. (The PECL module must point to the test dir, not the real one.)
benakamoorthi
a validé
*/
class Test_Piwik_Integration_ManyVisitorsOneWebsiteTest extends IntegrationTestCase
{
benakamoorthi
a validé
const GEOIP_IMPL_TO_TEST = 'geoip_php';
benakamoorthi
a validé
protected static $idSite = 1;
protected static $dateTime = '2010-01-03 11:22:33';
public static $ips = array(
'194.57.91.215', // in Besançon, FR (unicode city name)
'::ffff:137.82.130.49', // in British Columbia (mapped ipv4)
'137.82.130.0', // anonymization tests
'137.82.0.0',
mattab
a validé
'2001:db8:85a3:0:0:8a2e:370:7334', // ipv6 (geoip lookup not supported)
'113.62.1.1', // in Lhasa, Tibet
benakamoorthi
a validé
'151.100.101.92', // in Rome, Italy (using country DB, so only Italy will show)
'103.29.196.229', // in Indonesia (Bali), (only Indonesia will show up)
);
benakamoorthi
a validé
public static function setUpBeforeClass()
{
parent::setUpBeforeClass();
try {
self::setUpWebsitesAndGoals();
self::downloadGeoIpDbs();
self::setMockLocationProvider();
benakamoorthi
a validé
benakamoorthi
a validé
self::setLocationProvider('GeoIPCity.dat');
self::trackVisits(2, true, $useLocal = false);
mattab
a validé
self::trackVisits(4, true, $useLocal = false, $doBulk = true);
benakamoorthi
a validé
self::setLocationProvider('GeoIP.dat');
self::trackVisits(2, true);
benakamoorthi
a validé
self::trackOtherVisits();
benakamoorthi
a validé
self::setLocationProvider('GeoIPCity.dat');
benakamoorthi
a validé
} catch(Exception $e) {
// Skip whole test suite if an error occurs while setup
throw new PHPUnit_Framework_SkippedTestSuiteError($e->getMessage());
}
}
public static function tearDownAfterClass()
{
self::unsetLocationProvider();
parent::tearDownAfterClass();
}
/**
* @dataProvider getApiForTesting
* @group Integration
* @group TwoVisitors_TwoWebsites_DifferentDays_ArchivingDisabled
*/
public function testApi($api, $params)
{
$this->runApiTests($api, $params);
}
public function getApiForTesting()
{
// Note: we must set 'UserCountry.getLocationFromIP' since it's "excluded" by default in setApiNotToCall
$apiToCall = array('UserCountry');
benakamoorthi
a validé
return array(
benakamoorthi
a validé
'date' => self::$dateTime,
'periods' => array('month'))),
benakamoorthi
a validé
array($apiToCall, array('idSite' => self::$idSite,
'date' => self::$dateTime,
'periods' => array('month'),
'testSuffix' => '_segment_region',
'segment' => 'region==P3;country==gb')),
benakamoorthi
a validé
array($apiToCall, array('idSite' => self::$idSite,
'date' => self::$dateTime,
'periods' => array('month'),
'testSuffix' => '_segment_city',
'segment' => 'city==Stratford-upon-Avon;region==P3;country==gb')),
benakamoorthi
a validé
array($apiToCall, array('idSite' => self::$idSite,
'date' => self::$dateTime,
'periods' => array('month'),
'testSuffix' => '_segment_lat_long',
'segment' => 'lat>45;lat<49.3;long>-125;long<-122')),
array('UserCountry.getCountry', array('idSite' => self::$idSite,
'date' => self::$dateTime,
'periods' => array('month'),
'testSuffix' => '_segment_continent',
benakamoorthi
a validé
'segment' => 'continent==eur')),
array(array('UserCountry.getLocationFromIP', 'Live.getLastVisitsDetails'), array(
'idSite' => self::$idSite,
benakamoorthi
a validé
'date' => self::$dateTime,
'periods' => array('month'),
'otherRequestParameters' => array('ip' => '194.57.91.215')
)),
benakamoorthi
a validé
);
}
public static function setUpWebsitesAndGoals()
{
self::createWebsite(self::$dateTime, 0, "Site 1");
benakamoorthi
a validé
Piwik_Goals_API::getInstance()->addGoal(self::$idSite, 'all', 'url', 'http', 'contains', false, 5);
benakamoorthi
a validé
}
benakamoorthi
a validé
protected static function trackVisits( $visitorCount, $setIp = false, $useLocal = true, $doBulk = false )
benakamoorthi
a validé
{
$dateTime = self::$dateTime;
$idSite = self::$idSite;
// use local tracker so mock location provider can be used
benakamoorthi
a validé
$t = self::getTracker($idSite, $dateTime, $defaultInit = true, $useLocal);
if ($doBulk)
{
$t->enableBulkTracking();
benakamoorthi
a validé
}
benakamoorthi
a validé
for ($i = 0; $i != $visitorCount; ++$i)
{
$t->setNewVisitorId();
if ($setIp)
{
$t->setIp(self::$ips[self::$ipsIndex]);
++self::$ipsIndex;
benakamoorthi
a validé
}
else
{
$t->setIp("1.2.4.$i");
}
// first visit
$date = Piwik_Date::factory($dateTime)->addDay($i);
$t->setForceVisitDateTime($date->getDatetime());
$t->setUrl("http://piwik.net/grue/lair");
benakamoorthi
a validé
$r = $t->doTrackPageView('It\'s pitch black...');
if (!$doBulk)
{
self::checkResponse($r);
}
benakamoorthi
a validé
// second visit
$date = $date->addHour(1);
$t->setForceVisitDateTime($date->getDatetime());
$t->setUrl("http://piwik.net/space/quest/iv");
benakamoorthi
a validé
$r = $t->doTrackPageView("Space Quest XII");
if (!$doBulk)
{
self::checkResponse($r);
}
}
if ($doBulk)
{
self::checkResponse($t->doBulkTrack());
benakamoorthi
a validé
}
}
benakamoorthi
a validé
protected static function trackOtherVisits()
{
$dateTime = self::$dateTime;
$idSite = self::$idSite;
$t = self::getTracker($idSite, $dateTime, $defaultInit = true);
benakamoorthi
a validé
$t->setForceVisitDateTime(Piwik_Date::factory($dateTime)->addDay(20)->getDatetime());
$t->setIp('194.57.91.215');
$t->setCountry('us');
$t->setRegion('CA');
$t->setCity('not a city');
$t->setLatitude(1);
$t->setLongitude(2);
$t->setUrl("http://piwik.net/grue/lair");
self::checkResponse($t->doTrackPageView('It\'s pitch black...'));
}
benakamoorthi
a validé
public static function setLocationProvider( $file )
{
Piwik_UserCountry_LocationProvider_GeoIp::$dbNames['loc'] = array($file);
benakamoorthi
a validé
Piwik_UserCountry_LocationProvider_GeoIp::$geoIPDatabaseDir = 'tests/lib/geoip-files';
benakamoorthi
a validé
Piwik_UserCountry_LocationProvider::$providers = null;
benakamoorthi
a validé
Piwik_UserCountry_LocationProvider::setCurrentProvider(self::GEOIP_IMPL_TO_TEST);
if (Piwik_UserCountry_LocationProvider::getCurrentProviderId() !== self::GEOIP_IMPL_TO_TEST)
{
throw new Exception("Failed to set the current location provider to '".self::GEOIP_IMPL_TO_TEST."'.");
}
$possibleFiles = Piwik_UserCountry_LocationProvider_GeoIp::$dbNames['loc'];
if (Piwik_UserCountry_LocationProvider_GeoIp::getPathToGeoIpDatabase($possibleFiles) === false)
{
throw new Exception("The GeoIP location provider cannot find the '$file' file! Tests will fail.");
}
benakamoorthi
a validé
}
public static function setMockLocationProvider()
{
Piwik_UserCountry_LocationProvider::$providers = null;
Piwik_UserCountry_LocationProvider::setCurrentProvider('mock_provider');
self::makeLocation('Stratford-upon-Avon', 'P3', 'gb', 123.456, 21.321), // template location
benakamoorthi
a validé
// same region, different city, same country
self::makeLocation('Nuneaton and Bedworth', 'P3', 'gb'),
// same region, city & country (different lat/long)
self::makeLocation('Stratford-upon-Avon', 'P3', 'gb', 124.456, 22.231),
benakamoorthi
a validé
// same country, different region & city
self::makeLocation('London', 'H9', 'gb'),
// same country, different region, same city
self::makeLocation('Stratford-upon-Avon', 'G5', 'gb'),
// different country, diff region, same city
self::makeLocation('Stratford-upon-Avon', '66', 'ru'),
// different country, diff region (same as last), different city
self::makeLocation('Hluboká nad Vltavou', '66', 'ru'),
// different country, diff region (same as last), same city
self::makeLocation('Stratford-upon-Avon', '66', 'mk'),
benakamoorthi
a validé
// unknown location
self::makeLocation(null, null, null),
benakamoorthi
a validé
}
public static function unsetLocationProvider()
{
Piwik_UserCountry_LocationProvider::setCurrentProvider('default');
}
public static function makeLocation( $city, $region, $country, $lat = null, $long = null )
benakamoorthi
a validé
{
return array(Piwik_UserCountry_LocationProvider::CITY_NAME_KEY => $city,
Piwik_UserCountry_LocationProvider::REGION_CODE_KEY => $region,
Piwik_UserCountry_LocationProvider::COUNTRY_CODE_KEY => $country,
Piwik_UserCountry_LocationProvider::LATITUDE_KEY => $lat,
Piwik_UserCountry_LocationProvider::LONGITUDE_KEY => $long);