1
0
قرینه از https://github.com/matomo-org/matomo.git synced 2025-08-22 15:07:44 +00:00
Files
matomo/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIP.php
Stefan Giehl 2743e52dc6 Allow to distinguish between MySQL and MariaDB (also in installation) (#18371)
* Allow to distinguish between MySQL and MariaDB (also in installation)

* updates expected UI test files

* add tests

* run tests with MariaDb

* adjust some tests to work with MariaDb

* submodule update

* ensure static order for custom dimensions

* fix userid tests

* fix max execution time tests

* adjust action param

* Use database engine instead of schema in frontend

* skip test on Mariadb

* Apply suggestions from code review

* Update .github/workflows/matomo-tests.yml

* updates expected UI test files

* fix diagnostic check

* Recreate OmniFixture after fixture changes

* updates expected UI test files

* improve ui test

* Apply suggestions from code review

Co-authored-by: Marc Neudert <marc@innocraft.com>

* improve mariadb diagnostic

* submodule update

---------

Co-authored-by: Michal Kleiner <michal@innocraft.com>
Co-authored-by: Marc Neudert <marc@innocraft.com>
2024-05-17 16:09:59 +02:00

321 خطوط
12 KiB
PHP

<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Tests\Fixtures;
use Piwik\Cache;
use Piwik\Date;
use Piwik\Option;
use Piwik\Plugins\Goals\API;
use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
use Piwik\Plugins\UserCountry\LocationProvider;
use Piwik\Tests\Framework\Fixture;
use Exception;
use Piwik\Tests\Framework\Mock\LocationProvider as MockLocationProvider;
use Piwik\Tracker\Visit;
require_once PIWIK_INCLUDE_PATH . '/tests/PHPUnit/Framework/Mock/LocationProvider.php';
/**
* Adds one new website and tracks 35 visits from 18 visitors with geolocation using
* free GeoIP databases. The GeoIP databases are downloaded if they do not exist already.
*/
class ManyVisitsWithGeoIP extends Fixture
{
public const GEOIP_IMPL_TO_TEST = 'geoip2php';
public $idSite = 1;
public $dateTime = '2010-01-03 11:22:33';
public $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',
'2003:f6:93bf:26f:9ec7:a6ff:fe29:27df', // ipv6 in US (without region or city)
'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, Central Java (Bali)
);
public $userAgents = array(
'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36',
'Mozilla/5.0 (Linux; U; Android 2.3.7; fr-fr; HTC Desire Build/GRI40; MildWild CM-8.0 JG Stable) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',
'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; GTB6.3; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; OfficeLiveConnector.1.4; OfficeLivePatch.1.3)',
'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; MDDSJS; rv:11.0) like Gecko',
'Mozilla/5.0 (Linux; Android 4.1.1; SGPT13 Build/TJDS0170) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36',
'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; SM-N9006 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.0 Mobile Safari/537.36',
'Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.14) Gecko/2009090216 Ubuntu/9.04 (jaunty) Firefox/3.0.14'
);
protected $idGoal;
protected $idGoal2;
public function setUp(): void
{
// set option, so tracked data for the past won't get converted
Option::set(GeoIp2::SWITCH_TO_ISO_REGIONS_OPTION_NAME, 1);
$this->setUpWebsitesAndGoals();
$this->setMockLocationProvider();
$this->trackVisits(9, false);
$this->setLocationProvider('GeoIP2-City.mmdb');
$this->trackVisits(2, true, $useLocal = false);
$this->trackVisits(4, true, $useLocal = false, $doBulk = true);
$this->setLocationProvider('GeoIP2-Country.mmdb');
$this->trackVisits(2, true);
$this->trackOtherVisits();
$this->setLocationProvider('GeoIP2-City.mmdb');
}
public function tearDown(): void
{
$this->unsetLocationProvider();
}
private function setUpWebsitesAndGoals()
{
if (!self::siteCreated($this->idSite)) {
self::createWebsite($this->dateTime, 0, "Site " . $this->idSite);
}
if (!self::goalExists($this->idSite, $idGoal = 1)) {
$this->idGoal = API::getInstance()->addGoal($this->idSite, 'all', 'url', 'http', 'contains', false, 5);
}
if (!self::goalExists($this->idSite, $idGoal = 2)) {
$this->idGoal2 = API::getInstance()->addGoal($this->idSite, 'two', 'url', 'xxxxxxxxxxxxx', 'contains', false, 5, false, 'twodesc');
}
}
protected $calledCounter = 0;
private function trackVisits($visitorCount, $setIp = false, $useLocal = true, $doBulk = false)
{
$this->calledCounter++;
$dateTime = $this->dateTime;
$idSite = $this->idSite;
if ($useLocal) {
Cache::getTransientCache()->flushAll(); // make sure dimension cache is empty between local tracking runs
Visit::$dimensions = null;
}
// use local tracker so mock location provider can be used
$t = self::getTracker($idSite, $dateTime, $defaultInit = true, $useLocal);
if ($doBulk) {
$t->enableBulkTracking();
}
$t->setTokenAuth(self::getTokenAuth());
for ($i = 0; $i != $visitorCount; ++$i) {
$this->trackVisit($t, $this->calledCounter, $i, $doBulk, array('setIp' => $setIp));
}
if ($doBulk) {
self::checkBulkTrackingResponse($t->doBulkTrack());
}
}
/**
* Insert a new visit into the database.
* @param \MatomoTracker $t The tracker to record the visits on
* @param int $fixtureCounter Number of times this fixture has been run
* @param int $visitorCounter Visitor counter within this execution of the fixture
* @param boolean $doBulk Should this visit be left for bulk insert later, or processed now?
* @param array $params Other params as required to set up the visit
*/
protected function trackVisit(\MatomoTracker $t, $fixtureCounter, $visitorCounter, $doBulk, array $params)
{
$setIp = isset($params['setIp']) && $params['setIp'];
// NOTE: floor() is so some visits share the same visit ID
$t->setVisitorId(substr(md5(floor($visitorCounter / 2) + $fixtureCounter * 1000), 0, $t::LENGTH_VISITOR_ID));
$userAgent = null;
if ($setIp) {
$userAgent = current($this->userAgents);
$t->setIp(current($this->ips));
$t->setUserAgent($userAgent);
next($this->userAgents);
next($this->ips);
} else {
$t->setIp("1.2.4.$visitorCounter");
}
// first visit
$date = Date::factory($this->dateTime)->addDay($visitorCounter)->addPeriod($fixtureCounter, 'second');
$t->setForceVisitDateTime($date->getDatetime());
$t->setUrl("http://piwik.net/grue/lair");
$t->setCustomVariable(1, 'Cvar 1 name', 'Cvar1 value is ' . $visitorCounter, 'visit');
$t->setCustomVariable(5, 'Cvar 5 name', 'Cvar5 value is ' . $visitorCounter, 'visit');
$t->setCustomVariable(2, 'Cvar 2 PAGE name', 'Cvar2 PAGE value is ' . $visitorCounter, 'page');
$t->setCustomVariable(5, 'Cvar 5 PAGE name', 'Cvar5 PAGE value is ' . $visitorCounter, 'page');
$r = $t->doTrackPageView('It\'s <script> pitch black...');
if (!$doBulk) {
self::checkResponse($r);
}
// second visit
if ($userAgent) {
$t->setUserAgent($userAgent); // unset in doTrack...
}
$date = $date->addHour(1);
$t->setForceVisitDateTime($date->getDatetime());
$t->setUrl("http://piwik.net/space/quest/iv");
// Manually record some data
$r = $t->doTrackPageView("Space Quest XII");
if (!$doBulk) {
self::checkResponse($r);
}
if ($userAgent) {
$t->setUserAgent($userAgent); // unset in doTrack...
}
// Track site search (for AutoSuggestAPI test)
// Only for half visitors so they don't all have a "site search" as last action and some of them have a standard page view as last action
$date = $date->addHour(0.1);
$t->setForceVisitDateTime($date->getDatetime());
if (($visitorCounter % 2) == 0) {
$r = $t->doTrackSiteSearch('Bring on the party', 'CAT', $visitorCounter * 6);
}
if (!$doBulk) {
self::checkResponse($r);
}
$date = $date->addHour(0.2);
$t->setForceVisitDateTime($date->getDatetime());
$r = $t->doTrackGoal($this->idGoal2);
if (!$doBulk) {
self::checkResponse($r);
}
$date = $date->addHour(0.05);
$t->setForceVisitDateTime($date->getDatetime());
$t->doTrackAction('http://example.org/path/file' . $visitorCounter . '.zip', "download");
if (!$doBulk) {
self::checkResponse($r);
}
$date = $date->addHour(0.05);
$t->setForceVisitDateTime($date->getDatetime());
$r = $t->doTrackAction('http://example-outlink.org/' . $visitorCounter . '.html', "link");
if (!$doBulk) {
self::checkResponse($r);
}
$date = $date->addHour(0.05);
$t->setForceVisitDateTime($date->getDatetime());
$r = $t->doTrackEvent(
'Cat' . $visitorCounter,
'Action' . $visitorCounter,
'Name' . $visitorCounter,
345.678 + $visitorCounter
);
if (!$doBulk) {
self::checkResponse($r);
}
}
private function trackOtherVisits()
{
$dateTime = $this->dateTime;
$idSite = $this->idSite;
$t = self::getTracker($idSite, $dateTime, $defaultInit = true);
$t->setVisitorId('fed33392d3a48ab2');
$t->setTokenAuth(self::getTokenAuth());
$t->setForceVisitDateTime(Date::factory($dateTime)->addDay(20)->getDatetime());
$t->setIp('194.57.91.215');
$t->setUserId('userid.email@example.org');
$t->setCountry('us');
$t->setRegion('CA');
$t->setCity('not a city');
$t->setLatitude(1);
$t->setLongitude(2);
$t->setUrl("http://piwik.net/grue/lair");
$t->setUrlReferrer('http://google.com/?q=Wikileaks FTW');
$t->setUserAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.6) AppleWebKit/522+ (KHTML, like Gecko) Safari/419.3 (.NET CLR 3.5.30729)");
self::checkResponse($t->doTrackPageView('It\'s pitch black...'));
}
public function setLocationProvider($file)
{
GeoIp2::$dbNames['loc'] = array($file);
LocationProvider::$providers = null;
LocationProvider::setCurrentProvider(self::GEOIP_IMPL_TO_TEST);
if (LocationProvider::getCurrentProviderId() !== self::GEOIP_IMPL_TO_TEST) {
throw new Exception("Failed to set the current location provider to '" . self::GEOIP_IMPL_TO_TEST . "'.");
}
$possibleFiles = GeoIp2::$dbNames['loc'];
if (GeoIp2::getPathToGeoIpDatabase($possibleFiles) === false) {
throw new Exception("The GeoIP2 location provider cannot find the '$file' file! Tests will fail.");
}
}
private function setMockLocationProvider()
{
LocationProvider::$providers = array();
LocationProvider::$providers[] = new MockLocationProvider();
LocationProvider::setCurrentProvider('mock_provider');
MockLocationProvider::$locations = array(
self::makeLocation('Stratford-upon-Avon', 'WAR', 'gb', 123.456, 21.321), // template location
// same region, different city, same country
self::makeLocation('Nuneaton and Bedworth', 'WAR', 'gb', $isp = 'comcast.net'),
// same region, city & country (different lat/long)
self::makeLocation('Stratford-upon-Avon', 'WAR', 'gb', 124.456, 22.231, $isp = 'comcast.net'),
// same country, different region & city
self::makeLocation('London', 'LND', 'gb'),
// same country, different region, same city
self::makeLocation('Stratford-upon-Avon', 'KEN', 'gb', $lat = null, $long = null, $isp = 'awesomeisp.com'),
// different country, diff region, same city
self::makeLocation('Stratford-upon-Avon', 'SPE', 'ru'),
// different country, diff region (same as last), different city
self::makeLocation('Hluboká nad Vltavou', 'SPE', 'ru'),
// different country, diff region (same as last), same city
self::makeLocation('Stratford-upon-Avon', '18', 'mk'),
// unknown location
self::makeLocation(null, null, null),
);
}
public static function unsetLocationProvider()
{
try {
LocationProvider::setCurrentProvider('default');
} catch (Exception $e) {
// ignore error
}
}
}