Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthieu Aubry <mattab@users.noreply.github.com>2016-09-26 03:03:59 +0300
committerGitHub <noreply@github.com>2016-09-26 03:03:59 +0300
commitcdc50dc38924f396dff8d50ef019c24f2a7b7bfd (patch)
treebf81c250be06b2c390029f668509f30cf622d89d /tests/PHPUnit/System/SimulateAutoIncrementIntegerOverflowTest.php
parent04d0c74e08bb4d9575f50f79dbb38c403b327570 (diff)
On very high traffic Piwik servers, prevent integer overflow by making auto_increment fields BIGINT UNSIGNED (#10548)
* Change Latitude and Longitude data types to DECIMAL instead of FLOAT * Add system test that forces an integer overflow, currently failing as expected * Make all overflow-able fields BIGINT UNSIGNED * Make overflow-able fields BIGINT UNSIGNED * These fields were not covered by the new SimulateAutoIncrementIntegerOverflow test * fix comment * Make it clear that id* fields are UNSIGNED when installing Piwik * BIGINT(10) for consistency * Update core fields to BIGINT * UI tests: New fields to be updated to bigint
Diffstat (limited to 'tests/PHPUnit/System/SimulateAutoIncrementIntegerOverflowTest.php')
-rw-r--r--tests/PHPUnit/System/SimulateAutoIncrementIntegerOverflowTest.php78
1 files changed, 78 insertions, 0 deletions
diff --git a/tests/PHPUnit/System/SimulateAutoIncrementIntegerOverflowTest.php b/tests/PHPUnit/System/SimulateAutoIncrementIntegerOverflowTest.php
new file mode 100644
index 0000000000..026c7719a1
--- /dev/null
+++ b/tests/PHPUnit/System/SimulateAutoIncrementIntegerOverflowTest.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * 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\Common;
+use Piwik\Db;
+use Piwik\Tests\Framework\TestCase\SystemTestCase;
+use Piwik\Tests\Fixtures\OneVisitorTwoVisits;
+
+/**
+ * Simulates the case where there are more than 4 billion visits and pages, and check that Piwik
+ * can handle this use case without hitting MySQL INT UNSIGNED overflow.
+ *
+ * This system test will compare against the OneVisitorTwoVisitsWithCookieSupportTest system test
+ * (OneVisitorTwoVisits_withCookieSupport* expected api responses) and expect the same API responses.
+ *
+ * @group SimulateAutoIncrementIntegerOverflowTest
+ * @group Core
+ */
+class SimulateAutoIncrementIntegerOverflowTest extends SystemTestCase
+{
+ /** OneVisitorTwoVisits */
+ public static $fixture = null; // initialized below class
+
+ /**
+ * @dataProvider getApiForTesting
+ */
+ public function testApi($api, $params)
+ {
+ $this->runApiTests($api, $params);
+ $this->checkAutoIncrementIdsAreMoreThanFourBillion();
+ }
+
+ private function checkAutoIncrementIdsAreMoreThanFourBillion()
+ {
+ $fieldsThatShouldNotOverflow = array(
+ 'log_visit' => 'idvisit',
+ 'log_action' => 'idaction',
+ 'log_link_visit_action' => 'idlink_va'
+ );
+ $this->assertGreaterThan(4294967294, self::$fixture->maxUnsignedIntegerValue);
+
+ foreach($fieldsThatShouldNotOverflow as $table => $autoIncrementField) {
+ $table = Common::prefixTable($table);
+ $value = Db::fetchOne("SELECT MAX($autoIncrementField) FROM $table ");
+ $this->assertGreaterThan(self::$fixture->maxUnsignedIntegerValue, $value, 'in ' . $table);
+ }
+ }
+
+ public function getApiForTesting()
+ {
+ $apiToCall = array(
+ 'VisitTime', 'VisitsSummary', 'VisitorInterest', 'VisitFrequency', 'DevicesDetection',
+ 'UserCountry',
+ 'Provider', 'Goals', 'CustomVariables', 'CoreAdminHome', 'DevicePlugins',
+ 'Actions', 'Referrers',
+ );
+
+ return array(
+ array($apiToCall, array(
+ 'idSite' => self::$fixture->idSite,
+ 'date' => self::$fixture->dateTime,
+ 'compareAgainst' => 'OneVisitorTwoVisits_withCookieSupport',
+ ))
+ );
+ }
+
+}
+
+SimulateAutoIncrementIntegerOverflowTest::$fixture = new OneVisitorTwoVisits();
+SimulateAutoIncrementIntegerOverflowTest::$fixture->useThirdPartyCookies = true;
+SimulateAutoIncrementIntegerOverflowTest::$fixture->useSiteSearch = true;
+SimulateAutoIncrementIntegerOverflowTest::$fixture->simulateIntegerOverflow = true; \ No newline at end of file