Skip to content
Extraits de code Groupes Projets
ManyVisitorsOneWebsiteTest.php 8,45 ko
Newer Older
<?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';

/**
 * Tests w/ 14 visitors w/ 2 visits each.
 * Uses geoip location provider to test city/region reports.
 * 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.)
 */
class Test_Piwik_Integration_ManyVisitorsOneWebsiteTest extends IntegrationTestCase
{
	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',
		'2001:db8:85a3:0:0:8a2e:370:7334', // ipv6 (geoip lookup not supported)
		'113.62.1.1', // in Lhasa, Tibet
		'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)
	);
diosmosis's avatar
diosmosis a validé
	
	private static $ipsIndex = 0;

	public static function setUpBeforeClass()
	{
		parent::setUpBeforeClass();
		try {
			self::setUpWebsitesAndGoals();
			self::downloadGeoIpDbs();
			
			self::setMockLocationProvider();
mattab's avatar
mattab a validé
			self::trackVisits(9, false);
			self::setLocationProvider('GeoIPCity.dat');
			self::trackVisits(2, true, $useLocal = false);
			self::trackVisits(4, true, $useLocal = false, $doBulk = true);
			
			self::setLocationProvider('GeoIP.dat');
			self::trackVisits(2, true);
		} 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()
	{
mattpiwik's avatar
mattpiwik a validé
		// Note: we must set  'UserCountry.getLocationFromIP' since it's "excluded" by default in setApiNotToCall
		$apiToCall = array('UserCountry');

mattpiwik's avatar
mattpiwik a validé
			array( $apiToCall,
							array(  'idSite'		=> self::$idSite,
									'date'		=> self::$dateTime,
									'periods'	=> array('month'))),
mattpiwik's avatar
mattpiwik a validé

			array($apiToCall, array('idSite'		=> self::$idSite,
									'date'		=> self::$dateTime,
									'periods'	=> array('month'),
									'testSuffix' => '_segment_region',
									'segment'    => 'region==P3;country==gb')),
mattpiwik's avatar
mattpiwik 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')),
mattpiwik's avatar
mattpiwik 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')),
mattpiwik's avatar
mattpiwik a validé

			array('UserCountry.getCountry', array('idSite'		=> self::$idSite,
												  'date'		=> self::$dateTime,
												  'periods'		=> array('month'),
												  'testSuffix'	=> '_segment_continent',
mattpiwik's avatar
mattpiwik a validé

			array(array('UserCountry.getLocationFromIP', 'Live.getLastVisitsDetails'), array(
														'idSite'		=> self::$idSite,
														 'date'		=> self::$dateTime,
														 'periods'		=> array('month'),
														 'otherRequestParameters' => array('ip' => '194.57.91.215')
													 	)),
		);
	}
	
	public static function setUpWebsitesAndGoals()
	{
		self::createWebsite(self::$dateTime, 0, "Site 1");
        Piwik_Goals_API::getInstance()->addGoal(self::$idSite, 'all', 'url', 'http', 'contains', false, 5);
	protected static function trackVisits( $visitorCount, $setIp = false, $useLocal = true, $doBulk = false )
	{
		$dateTime = self::$dateTime;
		$idSite   = self::$idSite;
		
		// use local tracker so mock location provider can be used
		$t = self::getTracker($idSite, $dateTime, $defaultInit = true, $useLocal);
		if ($doBulk)
		{
			$t->enableBulkTracking();
mattpiwik's avatar
mattpiwik a validé
			$t->setTokenAuth(self::getTokenAuth());
		for ($i = 0; $i != $visitorCount; ++$i)
		{
			$t->setNewVisitorId();
			if ($setIp)
			{
diosmosis's avatar
diosmosis a validé
				$t->setIp(self::$ips[self::$ipsIndex]);
				++self::$ipsIndex;
			}
			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");
			$r = $t->doTrackPageView('It\'s pitch black...');
			if (!$doBulk)
			{
				self::checkResponse($r);
			}
			
			// second visit
			$date = $date->addHour(1);
			$t->setForceVisitDateTime($date->getDatetime());
			$t->setUrl("http://piwik.net/space/quest/iv");
			$r = $t->doTrackPageView("Space Quest XII");
			if (!$doBulk)
			{
				self::checkResponse($r);
			}
		}
		if ($doBulk)
		{
			self::checkResponse($t->doBulkTrack());
	protected static function trackOtherVisits()
	{
		$dateTime = self::$dateTime;
		$idSite   = self::$idSite;
		
		$t = self::getTracker($idSite, $dateTime, $defaultInit = true);
mattpiwik's avatar
mattpiwik a validé
		$t->setTokenAuth(self::getTokenAuth());
		$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...'));
	}
	
	public static function setLocationProvider( $file )
	{
		Piwik_UserCountry_LocationProvider_GeoIp::$dbNames['loc'] = array($file);
		Piwik_UserCountry_LocationProvider_GeoIp::$geoIPDatabaseDir = 'tests/lib/geoip-files';
		Piwik_UserCountry_LocationProvider::$providers = null;
		Piwik_UserCountry_LocationProvider::setCurrentProvider(self::GEOIP_IMPL_TO_TEST);
diosmosis's avatar
diosmosis a validé
		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.");
		}
	}
	
	public static function setMockLocationProvider()
	{
		Piwik_UserCountry_LocationProvider::$providers = null;
		Piwik_UserCountry_LocationProvider::setCurrentProvider('mock_provider');
diosmosis's avatar
diosmosis a validé
		MockLocationProvider::$locations = array(
			self::makeLocation('Stratford-upon-Avon', 'P3', 'gb', 123.456, 21.321), // template location
			
			// 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),
			
			// 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'),
			
			// unknown location
			self::makeLocation(null, null, null),
diosmosis's avatar
diosmosis a validé
		);
	}
	
	public static function unsetLocationProvider()
	{
		Piwik_UserCountry_LocationProvider::setCurrentProvider('default');
	}
	
	public static function makeLocation( $city, $region, $country, $lat = null, $long = null )
	{
		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);